summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--README.md4
-rw-r--r--backend/checksum/properties/checksum.properties.json3
-rw-r--r--backend/dev/properties/dev.properties.json3
-rw-r--r--backend/php/properties/php.properties.json3
-rw-r--r--backend/python/properties/python.properties.json3
-rw-r--r--frontend/beta/html/index_template.html16
-rw-r--r--frontend/delta/css/web.css1353
-rw-r--r--frontend/delta/fonts/clipperz-icons.json1
-rw-r--r--frontend/delta/html/index_template.html130
-rw-r--r--frontend/delta/js/Clipperz/Async.js707
-rw-r--r--frontend/delta/js/Clipperz/Base.js514
-rw-r--r--frontend/delta/js/Clipperz/ByteArray.js1459
-rw-r--r--frontend/delta/js/Clipperz/CSVProcessor.js344
-rw-r--r--frontend/delta/js/Clipperz/Crypto/AES.js859
-rw-r--r--frontend/delta/js/Clipperz/Crypto/AES_2.js843
-rw-r--r--frontend/delta/js/Clipperz/Crypto/Base.js1847
-rw-r--r--frontend/delta/js/Clipperz/Crypto/BigInt.js1754
-rw-r--r--frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js1644
-rw-r--r--frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js500
-rw-r--r--frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js519
-rw-r--r--frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js62
-rw-r--r--frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js379
-rw-r--r--frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js229
-rw-r--r--frontend/delta/js/Clipperz/Crypto/PRNG.js841
-rw-r--r--frontend/delta/js/Clipperz/Crypto/RSA.js146
-rw-r--r--frontend/delta/js/Clipperz/Crypto/SHA.js296
-rw-r--r--frontend/delta/js/Clipperz/Crypto/SRP.js316
-rw-r--r--frontend/delta/js/Clipperz/DOM.js134
-rw-r--r--frontend/delta/js/Clipperz/Date.js297
-rw-r--r--frontend/delta/js/Clipperz/KeePassExportProcessor.js191
-rw-r--r--frontend/delta/js/Clipperz/KeyValueObjectStore.js166
-rw-r--r--frontend/delta/js/Clipperz/Logging.js32
-rw-r--r--frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js191
-rw-r--r--frontend/delta/js/Clipperz/PM/Connection.js636
-rw-r--r--frontend/delta/js/Clipperz/PM/Crypto.js546
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js1086
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js120
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js101
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js192
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js542
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js350
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js186
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js328
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/Record.js891
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js182
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js117
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js48
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js685
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js53
-rw-r--r--frontend/delta/js/Clipperz/PM/DataModel/User.js827
-rw-r--r--frontend/delta/js/Clipperz/PM/Date.js196
-rw-r--r--frontend/delta/js/Clipperz/PM/PIN.js132
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy.js186
-rwxr-xr-xfrontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js86
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js793
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js420
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js643
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js72
-rw-r--r--frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js161
-rw-r--r--frontend/delta/js/Clipperz/PM/Strings.js285
-rw-r--r--frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js384
-rw-r--r--frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js385
-rw-r--r--frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js1336
-rw-r--r--frontend/delta/js/Clipperz/PM/Toll.js189
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js142
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/CardList.js161
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js46
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js150
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js122
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js33
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js240
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js256
-rw-r--r--frontend/delta/js/Clipperz/PM/UI/MainController.js491
-rw-r--r--frontend/delta/js/Clipperz/Set.js162
-rw-r--r--frontend/delta/js/Clipperz/Signal.js66
-rw-r--r--frontend/delta/js/Clipperz/Style.js89
-rw-r--r--frontend/delta/js/Clipperz/Visual.js363
-rw-r--r--frontend/delta/js/Clipperz/YUI/DomHelper.js471
-rw-r--r--frontend/delta/js/Clipperz/YUI/DomQuery.js709
-rw-r--r--frontend/delta/js/Clipperz/YUI/Utils.js93
-rw-r--r--frontend/delta/js/Cubiq/add2home.js365
-rw-r--r--frontend/delta/js/MochiKit/Async.js733
-rw-r--r--frontend/delta/js/MochiKit/Base.js1523
-rw-r--r--frontend/delta/js/MochiKit/Color.js846
-rw-r--r--frontend/delta/js/MochiKit/DOM.js1202
-rw-r--r--frontend/delta/js/MochiKit/DateTime.js199
-rw-r--r--frontend/delta/js/MochiKit/DragAndDrop.js789
-rw-r--r--frontend/delta/js/MochiKit/Format.js332
-rw-r--r--frontend/delta/js/MochiKit/Iter.js811
-rw-r--r--frontend/delta/js/MochiKit/Logging.js285
-rw-r--r--frontend/delta/js/MochiKit/LoggingPane.js353
-rw-r--r--frontend/delta/js/MochiKit/MochiKit.js156
-rw-r--r--frontend/delta/js/MochiKit/MockDOM.js135
-rw-r--r--frontend/delta/js/MochiKit/Position.js241
-rw-r--r--frontend/delta/js/MochiKit/Selector.js416
-rw-r--r--frontend/delta/js/MochiKit/Signal.js924
-rw-r--r--frontend/delta/js/MochiKit/Sortable.js592
-rw-r--r--frontend/delta/js/MochiKit/Style.js584
-rw-r--r--frontend/delta/js/MochiKit/Test.js167
-rw-r--r--frontend/delta/js/MochiKit/Text.js569
-rw-r--r--frontend/delta/js/MochiKit/Visual.js1999
-rw-r--r--frontend/delta/js/React/react-0.4.1.js11491
-rw-r--r--frontend/delta/js/main.js62
-rw-r--r--frontend/delta/less/web.less9
-rw-r--r--frontend/delta/less/web/480.less11
-rw-r--r--frontend/delta/less/web/768.less3
-rw-r--r--frontend/delta/less/web/992.less2
-rw-r--r--frontend/delta/less/web/add2home.less160
-rw-r--r--frontend/delta/less/web/behavior.less111
-rw-r--r--frontend/delta/less/web/fonts.less81
-rw-r--r--frontend/delta/less/web/mixin.less87
-rw-r--r--frontend/delta/less/web/overlay.less157
-rw-r--r--frontend/delta/less/web/style.less730
-rw-r--r--frontend/delta/properties/creditsAndCopyrights.txt569
-rw-r--r--frontend/delta/properties/delta.properties.json136
-rw-r--r--frontend/delta/properties/manifest.webapp17
-rw-r--r--frontend/delta/tests/tests/Components/CardDetail/User.data.js972
-rw-r--r--frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js51
-rw-r--r--frontend/delta/tests/tests/Components/CardDetail/index.html169
-rw-r--r--frontend/gamma/html/index_template.html4
-rw-r--r--frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js2
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js2
-rw-r--r--frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js2
-rwxr-xr-xscripts/builder/backendBuilder.py7
-rw-r--r--[-rwxr-xr-x]scripts/builder/backends/phpBuilder.py0
-rw-r--r--scripts/builder/frontendBuilder.py73
-rw-r--r--scripts/builder/frontends/betaBuilder.py3
-rw-r--r--scripts/builder/frontends/deltaBuilder.py16
-rw-r--r--scripts/builder/frontends/gammaBuilder.py3
-rw-r--r--scripts/builder/frontends/gamma_mobileBuilder.py3
-rwxr-xr-xscripts/proxy/main.py19
131 files changed, 59632 insertions, 79 deletions
diff --git a/README.md b/README.md
index 414527f..e44df48 100644
--- a/README.md
+++ b/README.md
@@ -80,41 +80,39 @@ When executed, this script will start listening on localhost:8888.
80 80
81All 'backend' requests (whose path starts with either `/json` or `/dump`) will be forwarded to the actual backend, that is configured as a `ReverseProxyResource` (in the current code: `proxy.ReverseProxyResource('localhost', 8084, '/java-backend')`). 81All 'backend' requests (whose path starts with either `/json` or `/dump`) will be forwarded to the actual backend, that is configured as a `ReverseProxyResource` (in the current code: `proxy.ReverseProxyResource('localhost', 8084, '/java-backend')`).
82All other requests (html files, Javascript code, CSS stylesheets and other resources) will be handled by reading the resource from the filesystem; the proxy is aware of the layout of the project, so it will be able to locate the right resource in the right place. 82All other requests (html files, Javascript code, CSS stylesheets and other resources) will be handled by reading the resource from the filesystem; the proxy is aware of the layout of the project, so it will be able to locate the right resource in the right place.
83 83
84The only file that needs to be `build`, and not read directly from the file system, is the `index.html` file. 84The only file that needs to be `build`, and not read directly from the file system, is the `index.html` file.
85 85
86In order to build this file, the following command should be executed: 86In order to build this file, the following command should be executed:
87 87
88 ./scripts/build --frontends beta gamma gamma.mobile --backends dev 88 ./scripts/build --frontends beta gamma gamma.mobile --backends dev
89 89
90 90
91Once the index.html files have been built (one for each frontend) and a backend is running and has been correctly configured in the proxy script, it is possible to access the different versions of the application at the following URLs: 91Once the index.html files have been built (one for each frontend) and a backend is running and has been correctly configured in the proxy script, it is possible to access the different versions of the application at the following URLs:
92 92
93- `http://localhost:8888/beta/index.html` 93- `http://localhost:8888/beta/index.html`
94- `http://localhost:8888/gamma/index.html` 94- `http://localhost:8888/gamma/index.html`
95- `http://localhost:8888/gamma/index.mobile.html` 95- `http://localhost:8888/gamma/index.mobile.html`
96 96
97 97
98## Installing 98## Installing
99 99
100### PHP + MySQL backend 100### PHP + MySQL backend
101 101
102* **PHP** 102* **PHP**
103 Once the project has been successfully build, the application needs to be moved in a location where the web server can run it. Everything that is needed is located into `target/php`. 103 Once the project has been successfully build, the application needs to be moved in a location where the web server can run it. Everything that is needed is located into `target/php`.
104 104
105* **MySQL** 105* **MySQL**
106 The application needs a simple MySQL database; to configure all the credentials to access the previously allocated DB, edit the file found in `php/configuration.php`. You need to edit the file actually used by the web server; this will usually be the one moved into the right place in the previous step. 106 The application needs a simple MySQL database; to configure all the credentials to access the previously allocated DB, edit the file found in `php/configuration.php`. You need to edit the file actually used by the web server; this will usually be the one moved into the right place in the previous step.
107 Once the application is in place, and the DB credentials have been configured, you should initialize the DB itself; in order to do so, just point your browser at the following url: `http://<host>/<path>/php/setup/index.php`. 107 Once the application is in place, and the DB credentials have been configured, you should initialize the DB itself; in order to do so, just point your browser at the following url: `http://<host>/<path>/php/setup/index.php`.
108 Here you will find the standard [POG][pog] setup page: it should be enough to click the "POG me up!" button at the bottom of the page, and then the "Process" button on the next page. 108 Here you will find the standard [POG][pog] setup page: it should be enough to click the "POG me up!" button at the bottom of the page, and then the "Process" button on the next page.
109 The POG interface will allow also a very basic access to the DB data that may be useful to check that the application is actually writing something on the DB (even if you will not be able to make much sense out of the data you will see, as they are all encrypted!) 109 The POG interface will allow also a very basic access to the DB data that may be useful to check that the application is actually writing something on the DB (even if you will not be able to make much sense out of the data you will see, as they are all encrypted!)
110 More information about building the PHP backend may be found in the `doc/install.php.txt` file. 110 More information about building the PHP backend may be found in the `doc/install.php.txt` file.
111 111
112 But if you have setup a $configuration['setup_password'] in target/php/configuration.php then a page with a textfield and a "Submit" link will appear.
113 Just input your $configuration['setup_password'] value and click on "Submit" so [POG][pog] setup page will appear.
114 112
115## Disclaimer 113## Disclaimer
116 114
117This application has not been fully tested, so there may be still problems due to the new build script or to the new repository structure. So, for the moment, **use it at your own risk!** 115This application has not been fully tested, so there may be still problems due to the new build script or to the new repository structure. So, for the moment, **use it at your own risk!**
118 116
119 117
120[pog]: http://www.phpobjectgenerator.com/ 118[pog]: http://www.phpobjectgenerator.com/ \ No newline at end of file
diff --git a/backend/checksum/properties/checksum.properties.json b/backend/checksum/properties/checksum.properties.json
index 1c2dae5..9a70ce7 100644
--- a/backend/checksum/properties/checksum.properties.json
+++ b/backend/checksum/properties/checksum.properties.json
@@ -1,4 +1,5 @@
1{ 1{
2 "request.path": "json", 2 "request.path": "../json",
3 "dump.path": "/../dump",
3 "should.pay.toll": "true" 4 "should.pay.toll": "true"
4} \ No newline at end of file 5} \ No newline at end of file
diff --git a/backend/dev/properties/dev.properties.json b/backend/dev/properties/dev.properties.json
index 1c2dae5..9a70ce7 100644
--- a/backend/dev/properties/dev.properties.json
+++ b/backend/dev/properties/dev.properties.json
@@ -1,4 +1,5 @@
1{ 1{
2 "request.path": "json", 2 "request.path": "../json",
3 "dump.path": "/../dump",
3 "should.pay.toll": "true" 4 "should.pay.toll": "true"
4} \ No newline at end of file 5} \ No newline at end of file
diff --git a/backend/php/properties/php.properties.json b/backend/php/properties/php.properties.json
index 09196c9..8c2ff05 100644
--- a/backend/php/properties/php.properties.json
+++ b/backend/php/properties/php.properties.json
@@ -1,4 +1,5 @@
1{ 1{
2 "request.path": "index.php", 2 "request.path": "../index.php",
3 "dump.path": "/../dump.php",
3 "should.pay.toll": "false" 4 "should.pay.toll": "false"
4} 5}
diff --git a/backend/python/properties/python.properties.json b/backend/python/properties/python.properties.json
index 322f174..b98364e 100644
--- a/backend/python/properties/python.properties.json
+++ b/backend/python/properties/python.properties.json
@@ -1,4 +1,5 @@
1{ 1{
2 "request.path": "clipperz.py", 2 "request.path": "../clipperz.py",
3 "dump.path": "/../clipperz.py",
3 "should.pay.toll": "false" 4 "should.pay.toll": "false"
4} 5}
diff --git a/frontend/beta/html/index_template.html b/frontend/beta/html/index_template.html
index c3fd727..25f6a87 100644
--- a/frontend/beta/html/index_template.html
+++ b/frontend/beta/html/index_template.html
@@ -1,100 +1,110 @@
1<html> 1<html>
2<head> 2<head>
3 <title>@page.title@</title> 3 <title>@page.title@</title>
4 <META http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4 <META http-equiv="Content-Type" content="text/html; charset=utf-8" />
5<!-- 5<!--
6@copyright@ 6@copyright@
7--> 7-->
8 8
9@css@ 9@css@
10 10
11 <link rel="shortcut icon" href="./clipperz.ico" /> 11 <link rel="shortcut icon" href="./clipperz.ico" />
12 12
13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
15<script> 15<script>
16 Clipperz_IEisBroken = false; 16 Clipperz_IEisBroken = false;
17 Clipperz_normalizedNewLine = '\n'; 17 Clipperz_normalizedNewLine = '\n';
18 Clipperz_dumpUrl = "/../dump/"; 18 Clipperz_dumpUrl = "@dump.path@";
19</script> 19</script>
20 20
21<!--[if IE]><script> 21<!--[if IE]><script>
22Clipperz_IEisBroken = true; 22Clipperz_IEisBroken = true;
23Clipperz_normalizedNewLine = '\x0d\x0a'; 23Clipperz_normalizedNewLine = '\x0d\x0a';
24</script><![endif]--> 24</script><![endif]-->
25 25
26@js_LINKED@ 26@js_LINKED@
27 27
28</head> 28</head>
29<body> 29<body>
30<div id="mainDiv"> 30<div id="mainDiv">
31 <div id="header"> 31 <div id="header">
32 <div id="miscLinks"> 32 <div id="miscLinks">
33 <a id="donateHeaderIconLink" href="http://www.clipperz.com/donations" target="_blank"><img id='donateHeaderIcon' src=""></a> 33 <a id="donateHeaderIconLink" href="http://www.clipperz.com/donations" target="_blank"><img id='donateHeaderIcon' src=""></a>
34 <ul> 34 <ul>
35 <li><a href="http://www.clipperz.com/donations" id='donateHeaderLink' class='highlightedHeader' target="_blank">donate</a></li> 35 <li><a href="http://www.clipperz.com/donations" id='donateHeaderLink' class='highlightedHeader' target="_blank">donate</a></li>
36 <!-- li><a href="http://www.clipperz.com/credits" id='creditsHeaderLink' target="_blank">credits</a></li --> 36 <!-- li><a href="http://www.clipperz.com/credits" id='creditsHeaderLink' target="_blank">credits</a></li -->
37 <li><a href="http://www.clipperz.com/contact" id='feedbackHeaderLink' target="_blank">feedback</a></li> 37 <li><a href="http://www.clipperz.com/contact" id='feedbackHeaderLink' target="_blank">feedback</a></li>
38 <li><a href="http://www.clipperz.com/support/user_guide" target="_blank" id='helpHeaderLink'>help</a></li> 38 <li><a href="http://www.clipperz.com/support/user_guide" target="_blank" id='helpHeaderLink'>help</a></li>
39 <li><a href="http://www.clipperz.com/forum" target="_blank" id='forumHeaderLink'>forum</a></li> 39 <li><a href="http://www.clipperz.com/forum" target="_blank" id='forumHeaderLink'>forum</a></li>
40 </ul> 40 </ul>
41 </div> 41 </div>
42 <div id="logoFrame"> 42 <div id="logoFrame">
43 <a href="http://www.clipperz.com" target="_blank"><img id="logo" src="" /></a> 43 <a href="http://www.clipperz.com" target="_blank"><img id="logo" src="" /></a>
44 <h5 class="clipperzPayoff">keep it to yourself</h5> 44 <h5 class="clipperzPayoff">keep it to yourself</h5>
45 </div> 45 </div>
46 <div id="mainTabs"> 46 <div id="mainTabs">
47 <ul id="exitLinks"> 47 <ul id="exitLinks">
48 <li id="logoutLI"><!--<a href="#">logout</a>--></li> 48 <li id="logoutLI"><!--<a href="#">logout</a>--></li>
49 <li id="lockLI"><!--<a href="#">lock</a>--></li> 49 <li id="lockLI"><!--<a href="#">lock</a>--></li>
50 </ul> 50 </ul>
51 <div id="menus"> 51 <div id="menus">
52 <table cellpadding="0" cellspacing="0" border="0"> 52 <table cellpadding="0" cellspacing="0" border="0">
53 <tbody> 53 <tbody>
54 <tr id="menusTR"> 54 <tr id="menusTR">
55<!-- 55<!--
56 <td class="selected"><div><a href="#">records</a></div></td> 56 <td class="selected"><div><a href="#">records</a></div></td>
57 <td><div><a href="./Account.html">account</a></div></td> 57 <td><div><a href="./Account.html">account</a></div></td>
58 <td><div><a href="#">data</a></div></td> 58 <td><div><a href="#">data</a></div></td>
59 <td><div><a href="#">bookmarklet</a></div></td> 59 <td><div><a href="#">bookmarklet</a></div></td>
60--> 60-->
61 </tr> 61 </tr>
62 </tbody> 62 </tbody>
63 </table> 63 </table>
64 </div> 64 </div>
65 </div> 65 </div>
66 </div> 66 </div>
67 67
68 <div id="main"> 68 <div id="main">
69 <h3 class="loading">loading ...</h3> 69 <h3 class="loading">loading ...</h3>
70<!-- script>
71 _clipperz_pm_test_user = 'joe'
72 _clipperz_pm_test_passphrase = 'clipperz'
73</script -->
70 74
71@js_EMBEDDED@ 75@js_EMBEDDED@
72 76
73<script> 77<script>
74 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); 78 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
75 /*offline_data_placeholder*/ 79 /*offline_data_placeholder*/
80
81 /* * /
82 MochiKit.DOM.addLoadEvent(function () {
83 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
84 });
85 / * */
76</script> 86</script>
77 87
78 <div id="javaScriptAlert"> 88 <div id="javaScriptAlert">
79 <h1>Attention!</h1> 89 <h1>Attention!</h1>
80 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> 90 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
81 <h3>Javascript is required to access Clipperz.</h3> 91 <h3>Javascript is required to access Clipperz.</h3>
82 <h5>Please enable scripting or upgrade your browser.</h5> 92 <h5>Please enable scripting or upgrade your browser.</h5>
83 </div> 93 </div>
84 </div> 94 </div>
85 <div id="footer"> 95 <div id="footer">
86 Copyright &copy; 2008-2013 Clipperz Srl - 96 Copyright &copy; 2008-2013 Clipperz Srl -
87 <a href="http://www.clipperz.com/terms_of_service" target="black">Terms of service</a> - 97 <a href="https://www.clipperz.com/terms_service/" target="black">Terms of service</a> -
88 <a href="http://www.clipperz.com/privacy_policy" target="black">Privacy policy</a> 98 <a href="https://www.clipperz.com/privacy_policy/" target="black">Privacy policy</a>
89 &nbsp;-&nbsp; 99 &nbsp;-&nbsp;
90 Application version: <a href="https://github.com/clipperz/password-manager/tree/@application.version@" target="github">@application.version@</a> 100 Application version: <a href="https://github.com/clipperz/password-manager/tree/@application.version@" target="github">@application.version@</a>
91 </div> 101 </div>
92 102
93 <div id="recordDetailEditModeHeaderMask"></div> 103 <div id="recordDetailEditModeHeaderMask"></div>
94 <div id="recordDetailEditModeVerticalMask"></div> 104 <div id="recordDetailEditModeVerticalMask"></div>
95</div> 105</div>
96 106
97<div id="applicationVersionType" class="@application.version.type@" /> 107<div id="applicationVersionType" class="@application.version.type@" />
98 108
99</body> 109</body>
100</html> 110</html>
diff --git a/frontend/delta/css/web.css b/frontend/delta/css/web.css
new file mode 100644
index 0000000..eb2f102
--- a/dev/null
+++ b/frontend/delta/css/web.css
@@ -0,0 +1,1353 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24@font-face {
25 font-family: 'Source Code Pro';
26 font-style: normal;
27 font-weight: 200;
28 src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAASvIAAAAOkNGRiC57zEmAABJNAAAxfVEU0lHN9HpJQABLAQAACBYR0RFRi8sL9AAARa0AAAA1EdQT1MeKxk7AAEivAAACQxHU1VC3Z7yFQABF4gAAAsyT1MvMnIMzrUAAAFQAAAAYGNtYXDp1MYJAAA/BAAAChBoZWFk++6HegAAAOwAAAA2aGhlYQaHAN8AAAEkAAAAJGhtdHjIHsvPAAEPLAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZYg91ZIAAAGwAAA9VHBvc3T/uAAzAABJFAAAACAAAQAAAAEEWtZRnFVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6v5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/q/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWADIAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwMJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGgBFAAEAAAAAAAIABwBfAAEAAAAAAAMAKQBmAAEAAAAAAAQAGgBFAAEAAAAAAAUAOQCPAAEAAAAAAAYAGADIAAEAAAAAAAcAYADgAAEAAAAAAAgAGgFAAAEAAAAAAAkADAFaAAEAAAAAAAsAGQFmAAEAAAAAAA0R2QF/AAEAAAAAAA4AJBNYAAEAAAAAABAADxN8AAEAAAAAABEAChOLAAEAAAAAAQAAFhOVAAEAAAAAAQEACxOrAAEAAAAAAQIACxO2AAEAAAAAAQMAFRPBAAMAAQQJAAAAihPWAAMAAQQJAAEANBRgAAMAAQQJAAIADhSUAAMAAQQJAAMAUhSiAAMAAQQJAAQANBRgAAMAAQQJAAUAchT0AAMAAQQJAAYAMBVmAAMAAQQJAAcAwBWWAAMAAQQJAAgANBZWAAMAAQQJAAkAGBaKAAMAAQQJAAsAMhaiAAMAAQQJAA0jthbUAAMAAQQJAA4ASDqKAAMAAQQJABAAHjrSAAMAAQQJABEAFDrwAAMAAQQJAQAALDsEAAMAAQQJAQEAFjswAAMAAQQJAQIAFjtGAAMAAQQJAQMAKjtcQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEV4dHJhTGlnaHRSZWd1bGFyMS4wMTc7QURCRTtTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQ7QURPQkVWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9FeHRyYUxpZ2h0VHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AIABFAHgAdAByAGEATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0ADsAQQBEAE8AQgBFAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAxADcAOwBQAFMAIAAxAC4AMAAwADAAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADkAMAAwAFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0AFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABQAGEAdQBsACAARAAuACAASAB1AG4AdABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgACgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AKQAsACAAdwBpAHQAaAAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACAAJwBTAG8AdQByAGMAZQAnAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AIABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgANAAoADQAKAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4ADQAKAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGMAbwBwAGkAZQBkACAAYgBlAGwAbwB3ACwAIABhAG4AZAAgAGkAcwAgAGEAbABzAG8AIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAANAAoADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoAUwBJAEwAIABPAFAARQBOACAARgBPAE4AVAAgAEwASQBDAEUATgBTAEUAIABWAGUAcgBzAGkAbwBuACAAMQAuADEAIAAtACAAMgA2ACAARgBlAGIAcgB1AGEAcgB5ACAAMgAwADAANwANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgANAAoAUABSAEUAQQBNAEIATABFAA0ACgBUAGgAZQAgAGcAbwBhAGwAcwAgAG8AZgAgAHQAaABlACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACAAKABPAEYATAApACAAYQByAGUAIAB0AG8AIABzAHQAaQBtAHUAbABhAHQAZQAgAHcAbwByAGwAZAB3AGkAZABlACAAZABlAHYAZQBsAG8AcABtAGUAbgB0ACAAbwBmACAAYwBvAGwAbABhAGIAbwByAGEAdABpAHYAZQAgAGYAbwBuAHQAIABwAHIAbwBqAGUAYwB0AHMALAAgAHQAbwAgAHMAdQBwAHAAbwByAHQAIAB0AGgAZQAgAGYAbwBuAHQAIABjAHIAZQBhAHQAaQBvAG4AIABlAGYAZgBvAHIAdABzACAAbwBmACAAYQBjAGEAZABlAG0AaQBjACAAYQBuAGQAIABsAGkAbgBnAHUAaQBzAHQAaQBjACAAYwBvAG0AbQB1AG4AaQB0AGkAZQBzACwAIABhAG4AZAAgAHQAbwAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgByAGUAZQAgAGEAbgBkACAAbwBwAGUAbgAgAGYAcgBhAG0AZQB3AG8AcgBrACAAaQBuACAAdwBoAGkAYwBoACAAZgBvAG4AdABzACAAbQBhAHkAIABiAGUAIABzAGgAYQByAGUAZAAgAGEAbgBkACAAaQBtAHAAcgBvAHYAZQBkACAAaQBuACAAcABhAHIAdABuAGUAcgBzAGgAaQBwACAAdwBpAHQAaAAgAG8AdABoAGUAcgBzAC4ADQAKAA0ACgBUAGgAZQAgAE8ARgBMACAAYQBsAGwAbwB3AHMAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAZAAgAGYAbwBuAHQAcwAgAHQAbwAgAGIAZQAgAHUAcwBlAGQALAAgAHMAdAB1AGQAaQBlAGQALAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGYAcgBlAGUAbAB5ACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABlAHkAIABhAHIAZQAgAG4AbwB0ACAAcwBvAGwAZAAgAGIAeQAgAHQAaABlAG0AcwBlAGwAdgBlAHMALgAgAFQAaABlACAAZgBvAG4AdABzACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAsACAAYwBhAG4AIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIABlAG0AYgBlAGQAZABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAYQBuAHkAIAByAGUAcwBlAHIAdgBlAGQAIABuAGEAbQBlAHMAIABhAHIAZQAgAG4AbwB0ACAAdQBzAGUAZAAgAGIAeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALgAgAFQAaABlACAAZgBvAG4AdABzACAAYQBuAGQAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALAAgAGgAbwB3AGUAdgBlAHIALAAgAGMAYQBuAG4AbwB0ACAAYgBlACAAcgBlAGwAZQBhAHMAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIAB0AHkAcABlACAAbwBmACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAGYAbwBuAHQAcwAgAG8AcgAgAHQAaABlAGkAcgAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAuAA0ACgANAAoARABFAEYASQBOAEkAVABJAE8ATgBTAA0ACgAiAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABzAGUAdAAgAG8AZgAgAGYAaQBsAGUAcwAgAHIAZQBsAGUAYQBzAGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQBuAGQAIABjAGwAZQBhAHIAbAB5ACAAbQBhAHIAawBlAGQAIABhAHMAIABzAHUAYwBoAC4AIABUAGgAaQBzACAAbQBhAHkAIABpAG4AYwBsAHUAZABlACAAcwBvAHUAcgBjAGUAIABmAGkAbABlAHMALAAgAGIAdQBpAGwAZAAgAHMAYwByAGkAcAB0AHMAIABhAG4AZAAgAGQAbwBjAHUAbQBlAG4AdABhAHQAaQBvAG4ALgANAAoADQAKACIAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABuAGEAbQBlAHMAIABzAHAAZQBjAGkAZgBpAGUAZAAgAGEAcwAgAHMAdQBjAGgAIABhAGYAdABlAHIAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAcwB0AGEAdABlAG0AZQBuAHQAKABzACkALgANAAoADQAKACIATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAGMAbwBsAGwAZQBjAHQAaQBvAG4AIABvAGYAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGEAcwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAuAA0ACgANAAoAIgBNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAG0AYQBkAGUAIABiAHkAIABhAGQAZABpAG4AZwAgAHQAbwAsACAAZABlAGwAZQB0AGkAbgBnACwAIABvAHIAIABzAHUAYgBzAHQAaQB0AHUAdABpAG4AZwAgAC0ALQAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUAIAAtAC0AIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAG8AZgAgAHQAaABlACAATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAsACAAYgB5ACAAYwBoAGEAbgBnAGkAbgBnACAAZgBvAHIAbQBhAHQAcwAgAG8AcgAgAGIAeQAgAHAAbwByAHQAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIAB0AG8AIABhACAAbgBlAHcAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQALgANAAoADQAKACIAQQB1AHQAaABvAHIAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcwBpAGcAbgBlAHIALAAgAGUAbgBnAGkAbgBlAGUAcgAsACAAcAByAG8AZwByAGEAbQBtAGUAcgAsACAAdABlAGMAaABuAGkAYwBhAGwAIAB3AHIAaQB0AGUAcgAgAG8AcgAgAG8AdABoAGUAcgAgAHAAZQByAHMAbwBuACAAdwBoAG8AIABjAG8AbgB0AHIAaQBiAHUAdABlAGQAIAB0AG8AIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFAARQBSAE0ASQBTAFMASQBPAE4AIAAmACAAQwBPAE4ARABJAFQASQBPAE4AUwANAAoAUABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGgAZQByAGUAYgB5ACAAZwByAGEAbgB0AGUAZAAsACAAZgByAGUAZQAgAG8AZgAgAGMAaABhAHIAZwBlACwAIAB0AG8AIABhAG4AeQAgAHAAZQByAHMAbwBuACAAbwBiAHQAYQBpAG4AaQBuAGcAIABhACAAYwBvAHAAeQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAdABvACAAdQBzAGUALAAgAHMAdAB1AGQAeQAsACAAYwBvAHAAeQAsACAAbQBlAHIAZwBlACwAIABlAG0AYgBlAGQALAAgAG0AbwBkAGkAZgB5ACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAYQBuAGQAIABzAGUAbABsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAYwBvAG4AZABpAHQAaQBvAG4AcwA6AA0ACgANAAoAMQApACAATgBlAGkAdABoAGUAcgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG4AbwByACAAYQBuAHkAIABvAGYAIABpAHQAcwAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABjAG8AbQBwAG8AbgBlAG4AdABzACwAIABpAG4AIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMALAAgAG0AYQB5ACAAYgBlACAAcwBvAGwAZAAgAGIAeQAgAGkAdABzAGUAbABmAC4ADQAKAA0ACgAyACkAIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUALAAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABlAGEAYwBoACAAYwBvAHAAeQAgAGMAbwBuAHQAYQBpAG4AcwAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAHAAeQByAGkAZwBoAHQAIABuAG8AdABpAGMAZQAgAGEAbgBkACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlAHMAZQAgAGMAYQBuACAAYgBlACAAaQBuAGMAbAB1AGQAZQBkACAAZQBpAHQAaABlAHIAIABhAHMAIABzAHQAYQBuAGQALQBhAGwAbwBuAGUAIAB0AGUAeAB0ACAAZgBpAGwAZQBzACwAIABoAHUAbQBhAG4ALQByAGUAYQBkAGEAYgBsAGUAIABoAGUAYQBkAGUAcgBzACAAbwByACAAaQBuACAAdABoAGUAIABhAHAAcAByAG8AcAByAGkAYQB0AGUAIABtAGEAYwBoAGkAbgBlAC0AcgBlAGEAZABhAGIAbABlACAAbQBlAHQAYQBkAGEAdABhACAAZgBpAGUAbABkAHMAIAB3AGkAdABoAGkAbgAgAHQAZQB4AHQAIABvAHIAIABiAGkAbgBhAHIAeQAgAGYAaQBsAGUAcwAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAbwBzAGUAIABmAGkAZQBsAGQAcwAgAGMAYQBuACAAYgBlACAAZQBhAHMAaQBsAHkAIAB2AGkAZQB3AGUAZAAgAGIAeQAgAHQAaABlACAAdQBzAGUAcgAuAA0ACgANAAoAMwApACAATgBvACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAdQBzAGUAIAB0AGgAZQAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACgAcwApACAAdQBuAGwAZQBzAHMAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGcAcgBhAG4AdABlAGQAIABiAHkAIAB0AGgAZQAgAGMAbwByAHIAZQBzAHAAbwBuAGQAaQBuAGcAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByAC4AIABUAGgAaQBzACAAcgBlAHMAdAByAGkAYwB0AGkAbwBuACAAbwBuAGwAeQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAHAAcgBpAG0AYQByAHkAIABmAG8AbgB0ACAAbgBhAG0AZQAgAGEAcwAgAHAAcgBlAHMAZQBuAHQAZQBkACAAdABvACAAdABoAGUAIAB1AHMAZQByAHMALgANAAoADQAKADQAKQAgAFQAaABlACAAbgBhAG0AZQAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAG8AcgAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIAB0AG8AIABwAHIAbwBtAG8AdABlACwAIABlAG4AZABvAHIAcwBlACAAbwByACAAYQBkAHYAZQByAHQAaQBzAGUAIABhAG4AeQAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4ALAAgAGUAeABjAGUAcAB0ACAAdABvACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlACAAdABoAGUAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAGEAbgBkACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AcgAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAuAA0ACgANAAoANQApACAAVABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABtAG8AZABpAGYAaQBlAGQAIABvAHIAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACwAIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACwAIABtAHUAcwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZQBuAHQAaQByAGUAbAB5ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALAAgAGEAbgBkACAAbQB1AHMAdAAgAG4AbwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAVABFAFIATQBJAE4AQQBUAEkATwBOAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGIAZQBjAG8AbQBlAHMAIABuAHUAbABsACAAYQBuAGQAIAB2AG8AaQBkACAAaQBmACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAIABhAHIAZQAgAG4AbwB0ACAAbQBlAHQALgANAAoADQAKAEQASQBTAEMATABBAEkATQBFAFIADQAKAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAEkAUwAgAFAAUgBPAFYASQBEAEUARAAgACIAQQBTACAASQBTACIALAAgAFcASQBUAEgATwBVAFQAIABXAEEAUgBSAEEATgBUAFkAIABPAEYAIABBAE4AWQAgAEsASQBOAEQALAAgAEUAWABQAFIARQBTAFMAIABPAFIAIABJAE0AUABMAEkARQBEACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEIAVQBUACAATgBPAFQAIABMAEkATQBJAFQARQBEACAAVABPACAAQQBOAFkAIABXAEEAUgBSAEEATgBUAEkARQBTACAATwBGACAATQBFAFIAQwBIAEEATgBUAEEAQgBJAEwASQBUAFkALAAgAEYASQBUAE4ARQBTAFMAIABGAE8AUgAgAEEAIABQAEEAUgBUAEkAQwBVAEwAQQBSACAAUABVAFIAUABPAFMARQAgAEEATgBEACAATgBPAE4ASQBOAEYAUgBJAE4ARwBFAE0ARQBOAFQAIABPAEYAIABDAE8AUABZAFIASQBHAEgAVAAsACAAUABBAFQARQBOAFQALAAgAFQAUgBBAEQARQBNAEEAUgBLACwAIABPAFIAIABPAFQASABFAFIAIABSAEkARwBIAFQALgAgAEkATgAgAE4ATwAgAEUAVgBFAE4AVAAgAFMASABBAEwATAAgAFQASABFACAAQwBPAFAAWQBSAEkARwBIAFQAIABIAE8ATABEAEUAUgAgAEIARQAgAEwASQBBAEIATABFACAARgBPAFIAIABBAE4AWQAgAEMATABBAEkATQAsACAARABBAE0AQQBHAEUAUwAgAE8AUgAgAE8AVABIAEUAUgAgAEwASQBBAEIASQBMAEkAVABZACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEEATgBZACAARwBFAE4ARQBSAEEATAAsACAAUwBQAEUAQwBJAEEATAAsACAASQBOAEQASQBSAEUAQwBUACwAIABJAE4AQwBJAEQARQBOAFQAQQBMACwAIABPAFIAIABDAE8ATgBTAEUAUQBVAEUATgBUAEkAQQBMACAARABBAE0AQQBHAEUAUwAsACAAVwBIAEUAVABIAEUAUgAgAEkATgAgAEEATgAgAEEAQwBUAEkATwBOACAATwBGACAAQwBPAE4AVABSAEEAQwBUACwAIABUAE8AUgBUACAATwBSACAATwBUAEgARQBSAFcASQBTAEUALAAgAEEAUgBJAFMASQBOAEcAIABGAFIATwBNACwAIABPAFUAVAAgAE8ARgAgAFQASABFACAAVQBTAEUAIABPAFIAIABJAE4AQQBCAEkATABJAFQAWQAgAFQATwAgAFUAUwBFACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAATwBSACAARgBSAE8ATQAgAE8AVABIAEUAUgAgAEQARQBBAEwASQBOAEcAUwAgAEkATgAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAuAA0ACgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAC8AbABlAGcAYQBsAC4AaAB0AG0AbABTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBFAHgAdAByAGEATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARlTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQAAQEBLvr2APr3Afr4DAD6+QL6+gP6+wSMDAF1/CT5Vvp8BRwvFQ8cMY8Rxx0AALOjEgLhAgABAAgADgAVABwAIwAqADEAOAA/AEYATQBUAFsAYgBpAHAAdwB9AIgAjgCYAJ4ApQCsALIAuAC/AMUAzwDWAN0A5ADrAPIA+QEAAQcBDgEZAR8BKQEwATYBPQFIAVMBWgFhAWUBawFyAXkBgwGKAZEBmAGfAaoBsQG3Ab0BxAHIAc8B1gHdAeQB6gHwAfcB/gIFAgwCEwIaAicCLgI1AjwCQwJKAlECWAJfAmQCawJyAnkCgAKHAo4ClAKaAqECqAKvArYCvALHAs4C1QLcAuMC6gLwAvcC/gMFAwwDEgMZAx8DJAMxAzgDPwNGA00DVANbA2IDaQNuA3UDfAODA4oDkQOXA50DqAOxA7cDwgPJA9AD1wPeA+QD7gP1A/wEAwQJBBAEFwQeBCUELAQzBDoEQQRIBE8EVgRdBGQEawRyBHgEgwSJBJMEmQSgBKcErQSzBLoEwATKBNEE2ATfBOYE7QT0BPsFAgUJBRQFGgUkBSsFMQU4BUMFTgVVBVwFYAVmBW0FdAV7BYIFiQWQBZkFpAWrBbcFvQXDBccFzgXVBdwF4wXqBfAF9gX9BgQGCwYSBh0GJAYrBjgGPwZGBk0GVAZbBmIGaQZwBnUGfAaDBooGkQaYBp8GpQasBrIGuQbABscGzQbYBt8G5gbtBvQG+gcBBwgHDwcWBx0HIwcqBzAHNQdCB0kHUAdXB14HZQdsB3MHegd/B4YHjQeUB5sHogeoB64HuQfCB8gH0wfaB+EH6AfvB/UH/wgGCA0IFAgbCCIIKQgwCDcIPghFCEwIUwhaCGEIaAhrCHMIewiICJAImwikCKwIswi8CMUIzgjXCOAI6QjyCPsJBAkNCRYJHwkoCTEJNAlBCUkJVQleCWYJbwl8CYUJjQmVCZ8JqAmxCbkJwwnNCdYJ3QnkCesJ8gn5CgMKCwoUChwKJQotCjUKPwpIClEKWQpjCm0KdgqECpMKngqoCrEKuQrBCssK1ArdCuUK7wr5CwILEAsfCyoLNAs9C0ULTQtXC2ALaQtxC3sLhQuOC5wLqwu2C8ALyQvRC9kL4wvsC/UL/QwHDBEMGgwoDDcMQgxMDFkMXwxlDGsMcQx3DH0MgwyJDI8MlQybDKEMpwytDLMMuQy/DMUMywzRDNcM3QzjDOkM7wz1DQANCw0XDR0NIw0nDS4NMg05DT8NQw1KDVENWA1fDWYNbQ13DX4Nhw2TDZsNpg2oDbANtw3CDcoN0Q3YDd8N6A3vDfYN/w4GDg0OFA4dDiQOKw4yDjkOQA5HDk4OVQ5cDmMOag5xDngOfw6GDo0OlA6bDqIOqQ6wDrcOvg7FDswO0w7aDuEO6A7zDvoPBQ8MDxcPHg8pDzAPOw9CD00PVA9fD2YPcQ94D4MPig+VD5wPpw+uD7kPwA/LD9IP2Q/gD+cP7g/1D/wQBxAOEBkQIBAnEDIQQRBMEFsQZhB1EIAQjxCaEKkQtBDDEM4Q3RDoEPcRAhERERwRKxE2EUURUBFfEWoReRGCEYsRkhGZEaMRrxG2Eb0RxBHLEdIR2RHgEecR7hH1EfwSAxIKEhESGBIfEiYSLRI0EjsSQhJJElASVxJeEmUSbBJzEnoSgRKIEo8SlhKdEqQSqxKyErkSwBLHEs4S1RLcEuMS6hLxEvgS/xMGEw0TFBMbEyITKRMwEzcTPhNFE0wTUxNaE2ETaBNvE3YTfROEE4sTkhOZE6ATpxOuE7UTvBPDE8oT0RPYE98T5hPtE/QT+xQCFAkUEBQXFB4UJRQsFDMUOhRBFEgUTxRWFF0UZBRrFHIUeRSAFIcUjhSVFJwUoxSqFLEUuBS/FMYUzRTUFNsU4hTpFPAU9xT+FQUVDBUTFRoVIRUoFS8VNhU9FUQVSxVSFVkVYBVnFW4VdRV8FYMVihWRFZgVnxWmFa0VtBW7FcIVyRXQFdcV3hXlFewV8xX6FgEWCBYPFhYWHRYiFoIWxxbhFvAW+kFtYWNyb25BYnJldmV1bmkwMUNEdW5pMUVBMHVuaTFFQTJ1bmkxRUE0dW5pMUVBNnVuaTFFQTh1bmkxRUFBdW5pMUVBQ3VuaTFFQUV1bmkxRUIwdW5pMUVCMnVuaTFFQjR1bmkxRUI2QW9nb25la3VuaTAyNDNDYWN1dGVDY2lyY3VtZmxleENjYXJvbkNkb3RhY2NlbnREY2Fyb251bmkxRTBDdW5pMUUwRURjcm9hdEVjYXJvbkVtYWNyb25FYnJldmVFZG90YWNjZW50dW5pMUVCOHVuaTFFQkF1bmkxRUJDdW5pMUVCRXVuaTFFQzB1bmkxRUMydW5pMUVDNHVuaTFFQzZFb2dvbmVrR2NpcmN1bWZsZXhHYnJldmVHZG90YWNjZW50dW5pMDEyMkdjYXJvbnVuaTFFMjB1bmkwMDQ3MDMwM0hjaXJjdW1mbGV4dW5pMUUyNHVuaTFFMkFIYmFySXRpbGRlSW1hY3JvbnVuaTAxMkNJZG90YWNjZW50dW5pMDFDRnVuaTFFQzh1bmkxRUNBSW9nb25la0pjaXJjdW1mbGV4dW5pMDEzNkxhY3V0ZUxjYXJvbnVuaTAxM0JMZG90dW5pMUUzNnVuaTFFMzh1bmkxRTNBdW5pMUU0Mk5hY3V0ZU5jYXJvbnVuaTAxNDV1bmkxRTQ0dW5pMUU0NnVuaTFFNDhPbWFjcm9udW5pMDE0RU9odW5nYXJ1bWxhdXR1bmkwMUQxdW5pMUVDQ3VuaTFFQ0V1bmkxRUQwdW5pMUVEMnVuaTFFRDR1bmkxRUQ2dW5pMUVEOE9ob3JudW5pMUVEQXVuaTFFREN1bmkxRURFdW5pMUVFMHVuaTFFRTJ1bmkwMUVBUmFjdXRlUmNhcm9udW5pMDE1NnVuaTFFNUF1bmkxRTVDdW5pMUU1RVNhY3V0ZVNjaXJjdW1mbGV4dW5pMDE1RXVuaTAyMTh1bmkxRTYwdW5pMUU2MnVuaTFFOUVUY2Fyb251bmkwMTYydW5pMDIxQXVuaTFFNkN1bmkxRTZFVXRpbGRlVW1hY3JvblVicmV2ZVVyaW5nVWh1bmdhcnVtbGF1dHVuaTAxRDN1bmkwMUQ1dW5pMDFEN3VuaTAxRDl1bmkwMURCdW5pMUVFNHVuaTFFRTZVb2dvbmVrVWhvcm51bmkxRUU4dW5pMUVFQXVuaTFFRUN1bmkxRUVFdW5pMUVGMFdncmF2ZVdhY3V0ZVdjaXJjdW1mbGV4V2RpZXJlc2lzWWdyYXZlWWNpcmN1bWZsZXh1bmkxRThFdW5pMUVGNHVuaTFFRjZ1bmkxRUY4WmFjdXRlWmRvdGFjY2VudHVuaTFFOTJ1bmkwMThGYW1hY3JvbmFicmV2ZXVuaTAxQ0V1bmkxRUExdW5pMUVBM3VuaTFFQTV1bmkxRUE3dW5pMUVBOXVuaTFFQUJ1bmkxRUFEdW5pMUVBRnVuaTFFQjF1bmkxRUIzdW5pMUVCNXVuaTFFQjdhb2dvbmVrdW5pMDE4MGNhY3V0ZWNjaXJjdW1mbGV4Y2Nhcm9uY2RvdGFjY2VudGRjYXJvbnVuaTFFMER1bmkxRTBGZGNyb2F0ZWNhcm9uZW1hY3JvbmVicmV2ZWVkb3RhY2NlbnR1bmkxRUI5dW5pMUVCQnVuaTFFQkR1bmkxRUJGdW5pMUVDMXVuaTFFQzN1bmkxRUM1dW5pMUVDN2VvZ29uZWtnY2lyY3VtZmxleGdicmV2ZWdkb3RhY2NlbnR1bmkwMTIzZ2Nhcm9udW5pMUUyMXVuaTAwNjcwMzAzaGNpcmN1bWZsZXh1bmkxRTI1dW5pMUUyQmhiYXJpdGlsZGVpbWFjcm9udW5pMDEyRHVuaTAxRDB1bmkxRUM5dW5pMUVDQmlvZ29uZWtpb2dvbmVrLmRqY2lyY3VtZmxleHVuaTAxMzdrZ3JlZW5sYW5kaWNsYWN1dGVsY2Fyb25sZG90dW5pMDEzQ3VuaTFFMzd1bmkxRTM5dW5pMUUzQnVuaTFFNDNuYWN1dGVuY2Fyb251bmkwMTQ2dW5pMUU0NXVuaTFFNDd1bmkxRTQ5bmFwb3N0cm9waGVvbWFjcm9udW5pMDE0Rm9odW5nYXJ1bWxhdXR1bmkwMUQydW5pMUVDRHVuaTFFQ0Z1bmkxRUQxdW5pMUVEM3VuaTFFRDV1bmkxRUQ3dW5pMUVEOW9ob3JudW5pMUVEQnVuaTFFRER1bmkxRURGdW5pMUVFMXVuaTFFRTN1bmkwMUVCcmFjdXRldW5pMDE1N3JjYXJvbnVuaTFFNUJ1bmkxRTVEdW5pMUU1RnNhY3V0ZXNjaXJjdW1mbGV4dW5pMDE1RnVuaTAyMTl1bmkxRTYxdW5pMUU2M3RjYXJvbnVuaTAxNjN1bmkwMjFCdW5pMUU2RHVuaTFFNkZ1bmkxRTk3dXRpbGRldW1hY3JvbnVicmV2ZXVyaW5ndWh1bmdhcnVtbGF1dHVuaTAxRDR1bmkwMUQ2dW5pMDFEOHVuaTAxREF1bmkwMURDdW5pMUVFNXVuaTFFRTd1b2dvbmVrdWhvcm51bmkxRUU5dW5pMUVFQnVuaTFFRUR1bmkxRUVGdW5pMUVGMXdncmF2ZXdhY3V0ZXdjaXJjdW1mbGV4d2RpZXJlc2lzeWdyYXZleWNpcmN1bWZsZXh1bmkxRThGdW5pMUVGNXVuaTFFRjd1bmkxRUY5emFjdXRlemRvdGFjY2VudHVuaTFFOTN1bmkwMjM3dW5pMDI1MHVuaTAyNTF1bmkwMjUydW5pMDI1OXVuaTAyNjF1bmkwMjY1dW5pMDI2RnVuaTAyNzl1bmkwMjg3dW5pMDI4Q3VuaTAyOER1bmkwMjhFdW5pMDI5RWEuYWFncmF2ZS5hYWFjdXRlLmFhY2lyY3VtZmxleC5hYXRpbGRlLmFhZGllcmVzaXMuYWFtYWNyb24uYWFicmV2ZS5hYXJpbmcuYXVuaTAxQ0UuYXVuaTFFQTEuYXVuaTFFQTMuYXVuaTFFQTUuYXVuaTFFQTcuYXVuaTFFQTkuYXVuaTFFQUIuYXVuaTFFQUQuYXVuaTFFQUYuYXVuaTFFQjEuYXVuaTFFQjMuYXVuaTFFQjUuYXVuaTFFQjcuYWFvZ29uZWsuYWcuYWdjaXJjdW1mbGV4LmFnYnJldmUuYWdkb3RhY2NlbnQuYXVuaTAxMjMuYWdjYXJvbi5hdW5pMUUyMS5hdW5pMDA2NzAzMDMuYXplcm8ub251bW9uZS5vbnVtdHdvLm9udW10aHJlZS5vbnVtZm91ci5vbnVtZml2ZS5vbnVtc2l4Lm9udW1zZXZlbi5vbnVtZWlnaHQub251bW5pbmUub251bXVuaTAwQUR1bmkyMDE1dW5pMjExN3VuaTIxMjBhdC5jYXNlYXN0ZXJpc2suYWh5cGhlbi5hdW5pMDBBRC5hZG9sbGFyLmF6ZXJvLnN1cHNvbmUuc3Vwc3R3by5zdXBzdGhyZWUuc3Vwc2ZvdXIuc3Vwc2ZpdmUuc3Vwc3NpeC5zdXBzc2V2ZW4uc3Vwc2VpZ2h0LnN1cHNuaW5lLnN1cHNwYXJlbmxlZnQuc3Vwc3BhcmVucmlnaHQuc3Vwc3BlcmlvZC5zdXBzY29tbWEuc3Vwc3plcm8uc3Vic29uZS5zdWJzdHdvLnN1YnN0aHJlZS5zdWJzZm91ci5zdWJzZml2ZS5zdWJzc2l4LnN1YnNzZXZlbi5zdWJzZWlnaHQuc3Vic25pbmUuc3Vic3BhcmVubGVmdC5zdWJzcGFyZW5yaWdodC5zdWJzcGVyaW9kLnN1YnNjb21tYS5zdWJzemVyby5kbm9tb25lLmRub210d28uZG5vbXRocmVlLmRub21mb3VyLmRub21maXZlLmRub21zaXguZG5vbXNldmVuLmRub21laWdodC5kbm9tbmluZS5kbm9tcGFyZW5sZWZ0LmRub21wYXJlbnJpZ2h0LmRub21wZXJpb2QuZG5vbWNvbW1hLmRub216ZXJvLm51bXJvbmUubnVtcnR3by5udW1ydGhyZWUubnVtcmZvdXIubnVtcmZpdmUubnVtcnNpeC5udW1yc2V2ZW4ubnVtcmVpZ2h0Lm51bXJuaW5lLm51bXJwYXJlbmxlZnQubnVtcnBhcmVucmlnaHQubnVtcnBlcmlvZC5udW1yY29tbWEubnVtcm9yZGZlbWluaW5lLmFhLnN1cHNiLnN1cHNjLnN1cHNkLnN1cHNlLnN1cHNmLnN1cHNnLnN1cHNoLnN1cHNpLnN1cHNqLnN1cHNrLnN1cHNsLnN1cHNtLnN1cHNuLnN1cHNvLnN1cHNwLnN1cHNxLnN1cHNyLnN1cHNzLnN1cHN0LnN1cHN1LnN1cHN2LnN1cHN3LnN1cHN4LnN1cHN5LnN1cHN6LnN1cHNlZ3JhdmUuc3Vwc2VhY3V0ZS5zdXBzdW5pMDI1OS5zdXBzYS5zdXBhZy5zdXBhRXVyb3VuaTAxOTJsaXJhdW5pMjBBNnBlc2V0YWRvbmd1bmkyMEIxdW5pMjBCMnVuaTIwQjV1bmkyMEI5dW5pMjBCQXVuaTIyMTVzbGFzaC5mcmFjdW5pMjIxOWxlc3NlcXVhbGdyZWF0ZXJlcXVhbG5vdGVxdWFsYXBwcm94ZXF1YWxwaWluZmluaXR5dW5pMDBCNXBhcnRpYWxkaWZmaW50ZWdyYWxyYWRpY2FsdW5pMjIwNnVuaTIxMjZzdW1tYXRpb25wcm9kdWN0dW5pMjExM2VzdGltYXRlZHVuaTIxOTBhcnJvd3VwdW5pMjE5MmFycm93ZG93bnVuaTI1QTB1bmkyNUM2dW5pMjVDOXVuaTI3NTJ0cmlhZ3VwdW5pMjVCM3VuaTI1QjZ1bmkyNUI3dHJpYWdkbnVuaTI1QkR1bmkyNUMwdW5pMjVDMXVuaTI2MTB1bmkyNjExdW5pMjcxM3VuaTI2NkFsb3plbmdldW5pMjAzMnVuaTIwMzN1bmkwMkJCdW5pMDJCQ3VuaTAyQkV1bmkwMkJGdW5pMDJDOHVuaTAyQzl1bmkwMkNBdW5pMDJDQnVuaTAyQ0N1bmkwMzAwdW5pMDMwMC5jYXB1bmkwMzAxdW5pMDMwMS5jYXB1bmkwMzAydW5pMDMwMi5jYXB1bmkwMzAzdW5pMDMwMy5jYXB1bmkwMzA0dW5pMDMwNC5jYXB1bmkwMzA2dW5pMDMwNi5jYXB1bmkwMzA3dW5pMDMwNy5jYXB1bmkwMzA4dW5pMDMwOC5jYXB1bmkwMzA5dW5pMDMwOS5jYXB1bmkwMzBBdW5pMDMwQS5jYXB1bmkwMzBCdW5pMDMwQi5jYXB1bmkwMzBDdW5pMDMwQy5jYXB1bmkwMzBGdW5pMDMwRi5jYXB1bmkwMzEydW5pMDMxM3VuaTAzMUJ1bmkwMzIzdW5pMDMyNHVuaTAzMjZ1bmkwMzI3dW5pMDMyNy5jYXB1bmkwMzI4dW5pMDMyOC5jYXB1bmkwMzJFdW5pMDMzMXVuaTAzMDgwMzA0dW5pMDMwODAzMDQuY2FwdW5pMDMwODAzMDF1bmkwMzA4MDMwMS5jYXB1bmkwMzA4MDMwQ3VuaTAzMDgwMzBDLmNhcHVuaTAzMDgwMzAwdW5pMDMwODAzMDAuY2FwdW5pMDMwMjAzMDF1bmkwMzAyMDMwMS5jYXB1bmkwMzAyMDMwMHVuaTAzMDIwMzAwLmNhcHVuaTAzMDIwMzA5dW5pMDMwMjAzMDkuY2FwdW5pMDMwMjAzMDN1bmkwMzAyMDMwMy5jYXB1bmkwMzA2MDMwMXVuaTAzMDYwMzAxLmNhcHVuaTAzMDYwMzAwdW5pMDMwNjAzMDAuY2FwdW5pMDMwNjAzMDl1bmkwMzA2MDMwOS5jYXB1bmkwMzA2MDMwM3VuaTAzMDYwMzAzLmNhcHVuaTAzMDIwMzA2dW5pMDMwMjAzMDYuY2FwdW5pMDMwQy5hdW5pMDMyNi5hdW5pMDBBMHVuaTIwMDdzcGFjZS5mcmFjbmJzcGFjZS5mcmFjdW5pMjUwMHVuaTI1MDF1bmkyNTAydW5pMjUwM3VuaTI1MDR1bmkyNTA1dW5pMjUwNnVuaTI1MDd1bmkyNTA4dW5pMjUwOXVuaTI1MEF1bmkyNTBCdW5pMjUwQ3VuaTI1MER1bmkyNTBFdW5pMjUwRnVuaTI1MTB1bmkyNTExdW5pMjUxMnVuaTI1MTN1bmkyNTE0dW5pMjUxNXVuaTI1MTZ1bmkyNTE3dW5pMjUxOHVuaTI1MTl1bmkyNTFBdW5pMjUxQnVuaTI1MUN1bmkyNTFEdW5pMjUxRXVuaTI1MUZ1bmkyNTIwdW5pMjUyMXVuaTI1MjJ1bmkyNTIzdW5pMjUyNHVuaTI1MjV1bmkyNTI2dW5pMjUyN3VuaTI1Mjh1bmkyNTI5dW5pMjUyQXVuaTI1MkJ1bmkyNTJDdW5pMjUyRHVuaTI1MkV1bmkyNTJGdW5pMjUzMHVuaTI1MzF1bmkyNTMydW5pMjUzM3VuaTI1MzR1bmkyNTM1dW5pMjUzNnVuaTI1Mzd1bmkyNTM4dW5pMjUzOXVuaTI1M0F1bmkyNTNCdW5pMjUzQ3VuaTI1M0R1bmkyNTNFdW5pMjUzRnVuaTI1NDB1bmkyNTQxdW5pMjU0MnVuaTI1NDN1bmkyNTQ0dW5pMjU0NXVuaTI1NDZ1bmkyNTQ3dW5pMjU0OHVuaTI1NDl1bmkyNTRBdW5pMjU0QnVuaTI1NEN1bmkyNTREdW5pMjU0RXVuaTI1NEZ1bmkyNTUwdW5pMjU1MXVuaTI1NTJ1bmkyNTUzdW5pMjU1NHVuaTI1NTV1bmkyNTU2dW5pMjU1N3VuaTI1NTh1bmkyNTU5dW5pMjU1QXVuaTI1NUJ1bmkyNTVDdW5pMjU1RHVuaTI1NUV1bmkyNTVGdW5pMjU2MHVuaTI1NjF1bmkyNTYydW5pMjU2M3VuaTI1NjR1bmkyNTY1dW5pMjU2NnVuaTI1Njd1bmkyNTY4dW5pMjU2OXVuaTI1NkF1bmkyNTZCdW5pMjU2Q3VuaTI1NkR1bmkyNTZFdW5pMjU2RnVuaTI1NzB1bmkyNTcxdW5pMjU3MnVuaTI1NzN1bmkyNTc0dW5pMjU3NXVuaTI1NzZ1bmkyNTc3dW5pMjU3OHVuaTI1Nzl1bmkyNTdBdW5pMjU3QnVuaTI1N0N1bmkyNTdEdW5pMjU3RXVuaTI1N0Z1bmkyNTgwdW5pMjU4MXVuaTI1ODJ1bmkyNTgzdW5pMjU4NHVuaTI1ODV1bmkyNTg2dW5pMjU4N3VuaTI1ODh1bmkyNTg5dW5pMjU4QXVuaTI1OEJ1bmkyNThDdW5pMjU4RHVuaTI1OEV1bmkyNThGdW5pMjU5MHVuaTI1OTF1bmkyNTkydW5pMjU5M3VuaTI1OTR1bmkyNTk1dW5pMjU5NnVuaTI1OTd1bmkyNTk4dW5pMjU5OXVuaTI1OUF1bmkyNTlCdW5pMjU5Q3VuaTI1OUR1bmkyNTlFdW5pMjU5RnVuaTAyNTh1bmkwMjU0MS4wMDBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5Db3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIElu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+wUGCxX3Ban7BQYLyv//yYAAuQt3AfcwqQup96SnCxX3wKn7ovkjbQYL97AB/wEVgAC4Awv7LKL4H6P4H6IBC/fA+UFt/SP7ogYL+Vylx+kB91KlAwt7CvexCwf7IHw1+xD7UhoLpRLRqwu5+My5C6n3KqkLAAAAAlgAVAAAADIAdwBKAGQAhACcAD0AXABwAGIAegCcAF8AYAA4AHwAPAB8AFAAMgBcAEEADwBTADgASABgAG4AWgBGAFAAeABYAG4AZABCAIIAYQBQAG4ARgBuAEYAqgBXAFQAWgBCAAwAVgBAAEgAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAAACoASgBKAEoASgBKAGQAZABkABwAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAD0APQA9AD0APQA9AD0AXABcAFwAEABwAHAAcABwAHAAcABwAHAAcABwAHAAcABiAHoAmgCcAJwAnACcAEwAnABFAF8AYABgAGAAYABgAGAAYAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgALAA4ADgAOAA4ADgAOAA4AHwAfAB8AHwAfAB8AFAAUABQAFAAUABQAFAAWgAyADIAMgAyADIAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAA8ADwAPAA8AOAA4ADgAOAA4ADgAOAA4AEgASABIAEgAHAB8AEIAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAARACAAWgBaAFoAWgBaAEYARgBGAEYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFgAWABYAFgAWABYAFgAIABuAG4AIABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAEIAggCCAGEAYQBDAGEAYQBhAGEAYQBQAG4AbgBuAG4AbgBuAG7//gBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYACgBGAEYARgBGAEYARgBGAKoAgACqAJ4AngBWAFcAVwBXAFcAVwBXAFcAbgBUAFQAVABUAFQAVABaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoADAAMAAwADABAAEAAQABAAEAAQABAAEAASABIAEgASABGAG4AQgBwAEYAbgBEAEYAUABGAFoAOgBIADoAQgAMAEAAJABYAF0ARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgA5AFQAcABTAEYAKwBAAFoATABKAE4AVABwAFMARgArAEAAXABMAEoATgD4ANAA+ADQADoA+AD4AHYAigEMAKgA5gDmAIIAggDmAIIA1wDjAHMAfwBiAGIAUAAUAFAAFAD4AKQAPADmAHYA9gBeAIQAXgB4AR4AeAEeAGUAngCeAGoAXAAoACgAeAACACIAQABAAGQAeQCOAI4AZgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAqADaALoAsgC0ALIAugC7ALYAtAD+AOABDAECAKgA2gC6ALIAtACyALwAuwC2ALQA/gDgAQwBAgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAsgCQAJYAsgC6AL0AkACqANIAogC+ALQAkgDUAM8AjwC+AJYAugCQAQsArwCvAKoAqwBRALwAlACOAKoAqgCgAJAAkAC+AEwAZgBSAEYARAB+ADQAbgBUAD4APAB8ADwAYgBuAHsASAAmACYAJgAcAD4AJgAmACYAJgAmACYAJgAmACYAYgBiAHQAYgDyAGIAfAByAGIAYgBiAIQAYgBgAGAAYgA8AAQAWgBaANkAVgA2ACoATgBKAJYAGgAUACIAHAAiANkAswCIALYAMQAxAFMAUwAxADEALQAt/+r/6gACAGEAcgEWANYA5gDmAP8A4wDcAPgAwADAAQ0AvgD2ANoBDQC2ALQAvgC4AN4A4AEEAPAA+gDcAMIA+AEMAMAAvgC2ALAAvgC+ALgAvAEEAQoAtADAAPoA+gDeAN4A4ADWAMAAvgCMAIwBBAEEASQBBADAAOYA5gDeAPoA/AC4ALwAvAC+AMAAwADAAL4AwADAAMoAxADKAMQAygDEALYAtgC4AL4AuAC+ALgAvgC2ALYAwgC+AQ4A9AAAAAAAAAAA//H/8QEdAQ4AIQAhAR0BDgASABIBHQEOAR0BHQEOAQ7/8f/x//H/8QEdAR0BDgEO//H/8f/x//EBHQEdAQ4BDgEOAQ4BDgEO//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//EASwBLAR0BDv/xAP8BHQD/AP//8f/x//EBHQD/AP//8f/x//EBHQD/AP//8f/x//H/8f/x//H/8f/x//H/8f/x//EBHf/x//EBHf/x//H/8f/xAR0BHQEd//EBDgEdAQ7/8QEO//EBDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAAAAAAAAAINAAABLAAAAAAAAAAAAAABLAAAAAAAAQAAAAwAAAAAAL4AAgAdAAIANQABAEsATAABAGcAZwABAG4AbgACAH4AfgABAKEAowABAKkAqQABAM0AzgABAOYA5gABAPwA/AABAQQBBAACARgBGAABARwBHAACAR8BHwACAS4BLgACAS8BMAABATUBNQACAVUBVwABAV0BXQABAWwBbAACAYIBgwABAZoBqgABAa0BrQABAcMBxAABAcgByAACAs0CzQABAtcC1wABAt0DHAADAx4DHgADAAIAAwLdAvgAAQMDAxwAAQMeAx4AAQABAAAACgBsAhoAAkRGTFQADmxhdG4AOAAEAAAAAP//ABAAAAACAAQABgAIAAoADAAOABAAEgAUABYAGAAaABwAHgAEAAAAAP//ABAAAQADAAUABwAJAAsADQAPABEAEwAVABcAGQAbAB0AHwAgYWFsdADCYWFsdADKY2FzZQDSY2FzZQDYY2NtcADeY2NtcADsZG5vbQD6ZG5vbQEAZnJhYwEGZnJhYwEQbnVtcgEabnVtcgEgb251bQEmb251bQEsb3JkbgEyb3JkbgE4c2FsdAE+c2FsdAFKc2luZgFWc2luZgFcc3MwMQFic3MwMQFoc3MwMgFuc3MwMgF0c3MwMwF6c3MwMwGAc3MwNAGGc3MwNAGMc3VicwGSc3VicwGYc3VwcwGec3VwcwGmAAAAAgAAAAEAAAACAAAAAQAAAAEAEAAAAAEAEAAAAAUAAwAEAAUABgAHAAAABQADAAQABQAGAAcAAAABAAkAAAABAAkAAAADAAgACgALAAAAAwAIAAoACwAAAAEACAAAAAEACAAAAAEADwAAAAEADwAAAAEADAAAAAEADAAAAAQAEQASABMAFAAA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) format('truetype');
29}
30@font-face {
31 font-family: 'Source Code Pro';
32 font-style: normal;
33 font-weight: 300;
34 src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATmEAAAAOkNGRiCTrBH5AABI+AAA0/1EU0lHvkvMtAABOcAAACBYR0RFRi8sL9AAASSAAAAA1EdQT1NNQOJiAAEwiAAACPpHU1VC3Z7yFQABJVQAAAsyT1MvMnJwz7UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk++2HegAAAOwAAAA2aGhlYQaGAN8AAAEkAAAAJGhtdHjAa8POAAEc+AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZdEIqPsAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWjTEiMVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/p/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAEsAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwQJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIExpZ2h0UmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1MaWdodDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9MaWdodFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBMAGkAZwBoAHQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEwAaQBnAGgAdABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8ATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBMaWdodFNvdXJjZSBDb2RlIFBy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9z/3YXWfBQuxAda39/S3A/esCxVjp3Spqaeisx4L+TrrChWpBq8LXV+IHwufUI0eCwAAAAJYAE4AAAAtAHMASABgAH8AlgA7AFkAawBdAHMAlgBbAFwANgB2ADkAdQBMADAAWQA7AA4ASwAzAEYAXABpAFcAQwBNAHMAVABpAGEAPwB7AF0ASwBpAEMAaQBDAKMAUwBQAFcAPgALAFAAPABIAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AAAAmAEgASABIAEgASABgAGAAYAAZAH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwA7ADsAOwA7ADsAOwA7AFkAWQBZAA4AawBrAGsAawBrAGsAawBrAGsAawBrAGsAXQBzAJYAlgCWAJYAlgBJAJYAQQBbAFwAXABcAFwAXABcAFwANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ACkANgA2ADYANgA2ADYANgB1AHUAdQB1AHUAdQBMAEwATABMAEwATABMAFcAMAAwADAAMAAwAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQAOAA4ADgAOADMAMwAzADMAMwAzADMAMwBGAEYARgBGABkAdgBBAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAEQAdAFcAVwBXAFcAVwBAAEMAQwBDAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBUAFQAVABUAFQAVABUABoAaQBpAB0AYQBhAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQA/AHsAewBdAF0APABdAF0AXQBdAF0ASwBpAGkAaQBpAGkAaQBp//kAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAAoAQwBDAEMAQwBDAEMAQwCjAH0AowCYAJgAUwBTAFMAUwBTAFMAUwBTAGgAUABQAFAAUABQAFAAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAAsACwALAAsAPAA8ADwAPAA8ADwAPAA8AEgASABIAEgAQwBpAD8AawBDAGkAQgBEAE0AQwBWADcARgA5AD4ACwA8ACEATgBTAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMANQBRAGwATwBDACoAPgBWAEoASABLAFEAbABPAEMAKgA+AFgASgBIAEsA8ADNAPAAzQAzAPIA8gB0AIYBBgCeAOAA4wB4AHsA4wB7ANIA3wBqAHcAXwBfAFAAFABQABQA8AChADwA4AB3APAAXwCBAF8AcgEYAHIBGABgAJYAlgBmAFcAJQAlAHYAAAAdADwAPABgAHQAjACMAGEApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AKYA1wC3ALAAsgCwALcAugC0ALIA+QDdAQgA/gCmANcAtgCwALIAsAC5ALoAtACyAPkA3QEIAP4ApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AK8AjgCUAK8AtgC7AI4ApwDPAJ4AugCzAJAAzgDMAIwAugCUALYAjgEFAKsArACnAKUAUQC0AJIAjwCnAKcAngCOAI4AugBHAGEAUQBBAEEAegAzAGoAUgA6ADcAeAA3AF4AagB3AEQAIwAjACMAGwA6ACMAIwAmACMAIwAjACMAIwAjAF8AXwBwAF8A6wBfAHsAcABfAF8AXwB+AF8AWwBbAF8ANgACAFcAVgDQAFAAMQAmAEwARACNABoAEwAiABwAIgDVAK4AgwCyAC4ALgBQAFAALgAuACoAKv/p/+kAAABcAG4BEADJAOAA4wD8AOEA0wD0ALkAuQEHALsA8wDRAQcAsACsALsAtADaANoA/QDrAPYA0wC7APQBBwC5ALcAsACqALsAugC0ALkA/QEEAKwAuQD2APYA2gDaANoA0AC5ALcAgwCDAQEBAgEkAP0AuQDiAOIA2wD2APcAtQC5ALkAugC6ALoAugC3ALoAugDFAL0AxQC9AMUAvQCzALIAtQC7ALUAuwC1ALsAswCyAL0AuwEMAPAAAAAAAAAAAP/q/+oBFgEBACEAIQEWAQEAEgASARYBAQEWARYBAQEB/+r/6v/q/+oBFgEWAQEBAf/q/+r/6v/qARYBFgEBAQEBAQEBAQEBAf/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q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AaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSAMYA2ADeAOQA6gDGAPAA9gD8AMYBAgDGAQgBDgECARQBGgDqAOoAxgEgAMYBCAEmASwBMgE4AT4BRAFKAVABVgFWAVwBYgFoAW4AwAF0AXoBgAGGAYwBkgGYAMAAwAGeAW4AxgGkANgAxgDqAaoA6gDGAOoAxgEIASYBPgGwAbAAwAG2AMAAwAGSAZIBLAGwAbwBngHCAcgBzgGGAdQB2gHgAeYB7AGYAMAB8gH4AZ4BngH+AgQCCgABASwB9gABASwCqQABAScCqQABAVcCqQABAVACqQABAVoCqQABAUwCqQABASsCqQABAUACqQABAUcCqQABALsCqQABATICqQABATwCqQABASsCtAABATkCqQABASoCqQABAS0CqQABAT0B9gABAIMC2gABAVgB9gABAcYC2gABATwB9gABAagC5AABATUB9gABAJcC2gABAV0CpgABALkC2gABASMC2gABATkB9QABAT8B9gABATYB9gABASkB9gABAVcB9gABASoB9gABAQYCeQABASYB9gABAS0B9gABAS8B9gABAdsCtgABAaECqQABAV0B9gABAUEB9gABATgB9gABAToB9gABARkB9gABAR8B9gABATEB9gABASQB9gABASMB9QABAZIB9gABAOMB9gABAS4B9gABARMB9gABATIB9gABASwCxQABASwCvAABBFgEYAABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVoAAAABAT4AAAABAVcAAAABATsAAAABAXkAAAABBCgENgABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmACYAKQAyACYAJgAmADOANQA2gCYAMIA4ADmAOwAmADyAMIA+AD+AQQBCgCqARABFgEcASIBKAEuAPIBNACYAToBQAFGAUwBUgFYAV4AmACYAWQBCgDCAJgBCgEcAJgBWACeAWoA5gDaAVgBcAF2AXwAwgGCAYgBjgFeAJgBZAGUAOYBmgABASz/6gABATL/6gABAVr/6gABASL/6gABAVP/6gABALf/6gABAVD/6gABASv/6gABAWP/6gABAJD/6gABAUD/6gABATb/6gABAS7/6gABATD/6gABASr/6gABATj/6gABASn/6gABAVf/6gABATH/6gABATz/6gABATP/GgABAT7/6gABAV3/6gABAOr/GwABAVb/6gABAXj/6gABAT3/6gABAIP/JgABAcP/JgABAMf/6gABATf/6gABAYL/6gABAUL/6gABAS3/6gABAQr/DgABAUT/6gABATP/6gABAR7/6gABAc3/JgABASX/6gABAGn/6gABAWv/6gABAPv/6gABAc//JgABAsACxgABAAwAEgABAAAADgADAA4AFAAaAAEBLAHgAAEBoQKJAAEB8QKdAAEBnAHgAAECngKmAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAMgA4AD4ARAA+AEoAUABWAAEBLAAAAAEB8AAAAAEBrAAAAAEBEwAAAAEBKwAAAAEBlgAAAAEBfQAAAAEBWwAAAAEBjQAAAAEBHgAAAAEBnwAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAMAFAAaABoAAQEsAfYAAQEsAqkAAQEsAtkAAQEsAqgAAgABAoYCiAAAAAIAAQLdAx4AAAACAAMC3QL4AAADAwMcABwDHgMeADYAAgATAAIANQAAAEsATAA0AGcAZwA2AH4AfgA3AKEAowA4AKkAqQA7AM0AzgA8AOYA5gA+APwA/AA/ARgBGABAAS8BMABBAVUBVwBDAV0BXQBGAYIBgwBHAZoBqgBJAa0BrQBaAcMBxABbAs0CzQBdAtcC1wBeAAEAAgL9Av4AAQAGAAQAFAAVAB4ALgAvAAEABQL6AvsC/AMBAwIAAgAMAAIAEQAAABMANQAQAKMAowAzAM4AzgA0AOYA5gA1ATABMAA2AVcBVwA3AYMBgwA4AZoBmgA5AZwBqgA6Aa0BrQBJAcQBxABKAAEAAQL5AAEAAwAQABYAKgABAAIC/wMAAAEADAACAAYACgAQABYAIAAkACoBMAGgAaEBrQABAAMC4QLpAusAAAABAAAACAAAAAQADgACaWRlb3JvbW4AAkRGTFQADmxhdG4ADgAGAAAAAAABAAIACAAMAAH/VgABAAAAAAAAAAEAAQABAAAAAQAAIEQAAAAUAAAAAAAAIDwwgiA4BgkqhkiG9w0BBwKggiApMIIgJQIBATELMAkGBSsOAwIaBQAwYQYKKwYBBAGCNwIBBKBTMFEwLAYKKwYBBAGCNwIBHKIegBwAPAA8ADwATwBiAHMAbwBsAGUAdABlAD4APgA+MCEwCQYFKw4DAhoFAAQULAH/pi1B8ejRuE1AJuXL7iSpKRugghsPMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1kMIID7jCCA1egAwIBAgIQfpPr+3zGTlnqS5p31Ab8OzANBgkqhkiG9w0BAQUFADCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNMTIxMjIxMDAwMDAwWhcNMjAxMjMwMjM1OTU5WjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALGss0lUS5ccEgrYJXmRIlcqb9y4JsRDc2vCvy5QWvsUwnaOQwElQ7Sh4kX06Ld7w3TMIte0lAAC903tv7S3RCRrzV9FO9FEzkMScxeCi2m0K8uZHqxyGyZNcR+xMd37UWECU6aq9UksBXhFpS+JzueZ5/6M4lc/PcaS3Er4ezPkeQr78HWIQZz/xQNRmarXbJ+TaYdlKYOFwmAUxMjJOxTawIHwHw103pIiq8r3+3R8J+b3Sht/p8OeLa6K6qbmqicWfWH3mHERvOJQoUvlXfrlDqcsn6plINPYlujIfKVOSET/GeJEB5IL12iEgF1qeGRFzWBGflTBE3zFefHJwXECAwEAAaOB+jCB9zAdBgNVHQ4EFgQUX5r1blzMzHSa1N197z/b7EyALt0wMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMBIGA1UdEwEB/wQIMAYBAf8CAQAwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVRpbWVzdGFtcGluZ0NBLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTEwDQYJKoZIhvcNAQEFBQADgYEAAwmbj3nvf1kwqu9otfrjCR27T4IGXTdfplKfFo3qHJIJRG71betYfDDo+WmNI3MLEm9Hqa45EfgqsZuwGsOO61mWAK3ODE2y0DGmCFwqevzieh1XTKhlGOl5QGIllm7HxzdqgyEIjkHq3dlXPx13SYcqFgZepjhqIhKjURmDfrYwggSQMIID+aADAgECAhAbCTt4YJbaN7ukUZRGyJZ4MA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMDgwMDAwMDBaFw0yMTExMDcyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK8kCAgpejWeYAyq50s7Ttx8vDxFHLsr4P4pAvlXCKNkhRUn9fGtyDGJXSLoKqqmQrOP+LlVt7G3S7P+j34HV+zvQ9tmYhVhz2ANpNje+ODDYgg9VBPrScpZVIUm5SuPG5/r9aGRwjNJ2ENjalJL0o/ocFFN0Ylpe8dw9rPcEnTbe11LVtOWvxV3obD0oiXyrxySZxjl9AYE75C55ADk3Tq1Gf8CuvQ87uCL6zeL7PTXrPL28D2v3XWRMxkdHEDLdCQZIZPZFP6sKlLHj9UESeSNY0eIPGmDy/5HvSt+T8WVrg6d1NFDwGdz4xQIfuU/n3O4MwrPXT80h5aK7lPoJRUCAwEAAaOCAVswggFXMA8GA1UdEwEB/wQFMAMBAf8wMQYDVR0fBCowKDAmoCSgIoYgaHR0cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwDgYDVR0PAQH/BAQDAgEGMD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vY3BzMB0GA1UdDgQWBBR/02Wnwt3su/AwCfNDOfoCrzMxMzBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTANBgkqhkiG9w0BAQUFAAOBgQCjzX0e98d1jUjnVjRMAJB1qVGlVsFtvP71UyLpmKKsmn5wHrOOO0XjhpUx2m1M+zRQgJbNJPJA3wQ/4mXONCJhFepmcGTS8W7zyhhZakFGfoLeGbBwMVZpDQzmHZ1xWNzM3mL14XoQAth63Dv6V73J6Y9GITmfUWVMjjq+KEFwHTCCBKMwggOLoAMCAQICEA7P9DjI/r81bgTYapgbGlAwDQYJKoZIhvcNAQEFBQAwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIwHhcNMTIxMDE4MDAwMDAwWhcNMjAxMjI5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgU2lnbmVyIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCiYws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNVDxXOBD8r/amWltm+YXkLW8lMhnbl4ENLIpXuwitDwZ/YaLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7NS+HdY9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu9mY9R6xwcueS51/NELnEg2SUGb0lgOHo0iKl0LoCeqF3k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0d9sOWzKLVoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKyJK4ux3DFvk6DJgj7C72pT5kI4RAocqrNAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEFBQcBAQRnMGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA3BggrBgEFBQcwAoYraHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNzLWNhLWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vdHMtY3JsLndzLnN5bWFudGVjLmNvbS90c3MtY2EtZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBUaW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoUHtVM2lJjFz9eNrwN5jAfBgNVHSMEGDAWgBRfmvVuXMzMdJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOCAQEAeDu0kSoATPCPYjA3eKOEJwdvGLLeJdyg1JQDqoZOJZ+aQAMc3c7jecshaAbatjK0bb/0LCZjM+RJZG0N5sNnDvcFpDVsfIkWxumy37Lp3SDGcQ/NlXTctlzevTcfQ3jmeLXNKAQgo6rxS8SIKZEOgNER/N1cdm5PXg5FRkFuDbDqOJqxOtoJcRD8HHm0gHusafT9nLYMFivxf1sJPZtb4hbKE4FtAC44DagpjyzhsvRaqQGvFZwsL0kb2yK7w/54lFHDhrGCiF3wPbRRoXkzKy57udwgCRNx62oZW8/opTBXLIlJP7nPf8m/PiJoY1OavWl0rMUdPH+S4MO8HNgEdTCCBZAwggR4oAMCAQICEHQlU60H5K/RFQSvmE1J7WgwDQYJKoZIhvcNAQEFBQAwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0EwHhcNMTIwOTE4MDAwMDAwWhcNMTMwOTE4MjM1OTU5WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExETAPBgNVBAcTCFNhbiBKb3NlMSMwIQYDVQQKFBpBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZDESMBAGA1UECxQJVHlwZSBGb250MT4wPAYDVQQLEzVEaWdpdGFsIElEIENsYXNzIDMgLSBNaWNyb3NvZnQgU29mdHdhcmUgVmFsaWRhdGlvbiB2MjEjMCEGA1UEAxQaQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3whFTXSiiYdME1HG+PDk+WsAeHLrt4pTDxziDwestaw9KuIon/xcVBcre6kuhd5JkDk/28tP2Br6ZlbNjGsayreGmC3Dn1jVSwiGKljIsDWKK1h/Xk+cScfUM0a5xYFV0UtCu4lWVD+APXOk3pghLXJH/1JK6FeRijGpz3VCrqFaeSl5yvxPN6cDTkpuMuWsKuSdPuFGbXhZpHdPuZ9Uo9+QMj+t82FrIeGv1duoyQ99yP5pyaY0AVNIJ+57a6cLgqUPUknRKt8QBj+MwS62xQFhXYNaPg/OL68C91UNPZRE/chUXXq3a/3EFsimenA14iOftS5ySpM2hGv2PCJ6tAgMBAAGjggF7MIIBdzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDBABgNVHR8EOTA3MDWgM6Axhi9odHRwOi8vY3NjMy0yMDEwLWNybC52ZXJpc2lnbi5jb20vQ1NDMy0yMDEwLmNybDBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMwEwYDVR0lBAwwCgYIKwYBBQUHAwMwcQYIKwYBBQUHAQEEZTBjMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC52ZXJpc2lnbi5jb20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9jc2MzLTIwMTAtYWlhLnZlcmlzaWduLmNvbS9DU0MzLTIwMTAuY2VyMB8GA1UdIwQYMBaAFM+Zqep7JvRLyY6P1/AFJu/j0qedMBEGCWCGSAGG+EIBAQQEAwIEEDAWBgorBgEEAYI3AgEbBAgwBgEBAAEB/zANBgkqhkiG9w0BAQUFAAOCAQEAqmhhva/dUgLEjkGlfW+Inr7+ucu3a+3COGUbYjFE25utOTO/hZT/bAD5upSUoJtb508fLQNZ4OOi3WPWvOUrdAF7LaQAdDbbXpKZm/h7F7m/3ThM5iyE+k4q2hCZ1fSNlYEz7WQPm0hEIjRfB2Nx22jM0VH/ON/a6A6zweolrwizDJ3KMJPKDH7dO4DYI6IK1RYl3Aza290yA7WbH/rRUvnZmioQPoyxlxtBLqkfAS9vSQncbLcrzn/YL9zMffZpHt+UHcnFdqXi9zQrdtP0Lj4U4upqQfLf7X8OL9zurvYFbApAQPFPIYqDg6S2jgdnFXPUBmDcxNoZi0soNbbB4TCCBgowggTyoAMCAQICEFIA5aolVvwahu2WydRLM8cwDQYJKoZIhvcNAQEFBQAwgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1MB4XDTEwMDIwODAwMDAwMFoXDTIwMDIwNzIzNTk1OVowgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD1I0tepdeKuzLp1Ff37+THJn6tGZj+qJ19lPY2axDXdYEwfwRof8srdR7NHQiM32mUpzejnHuA4Jnh7jdNX847FO6G1ND1JzW8JQs4p4xjnRejCKWrsPvNamKCTNUh2hvZ8eOEO4oqT4VbkAFPyad2EH8nA3y+rn59wd35BbwbSJxp58CkPDxBAD7fluXF5JRx1lUBxwAmSkA8taEmqQynbYCOkCV7z78/HOsvlvrlh3fGtVayejtUMFMb32I0/x7R9FqTKIXlTBdOflv9pJOZf9/N76R17+8V9kfn+Bly2C40Gqa0p0x+vbtPDD1X8TDWpjaO1oB21xkupc1+NC2JAgMBAAGjggH+MIIB+jASBgNVHRMBAf8ECDAGAQH/AgEAMHAGA1UdIARpMGcwZQYLYIZIAYb4RQEHFwMwVjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL2NwczAqBggrBgEFBQcCAjAeGhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMA4GA1UdDwEB/wQEAwIBBjBtBggrBgEFBQcBDARhMF+hXaBbMFkwVzBVFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBSP5dMahqyNjmvDz4Bq1EgYLHsZLjAlFiNodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvLmdpZjA0BgNVHR8ELTArMCmgJ6AlhiNodHRwOi8vY3JsLnZlcmlzaWduLmNvbS9wY2EzLWc1LmNybDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLnZlcmlzaWduLmNvbTAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwMwKAYDVR0RBCEwH6QdMBsxGTAXBgNVBAMTEFZlcmlTaWduTVBLSS0yLTgwHQYDVR0OBBYEFM+Zqep7JvRLyY6P1/AFJu/j0qedMB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQBWIuY0pMRhy0i5Aa1WqGQP2YyRxLvMDOWteqAif99HOEotbNF/cRp87HCpsfBP5A8MU/oVXv50mEkkhYEmHJEUR7BMY4y7oTTUxkXoDYUmcwPQqYxkbdxxkuZFBWAVWVE5/FgUa/7UpO15awgMQXLnNyIGCb4j6T9Emh7pYZ3MsZBc/D3SjaxCPWU21LQ9QCiPmxDPIybMSyDLkB9djEw0yjzY5TfWb6UgvTTrJtmuDefFmvehtCGRM2+G6Fi7JXx0Dlj+dRtjP84xfJuPG5aexVN2hFucrZH6rO2Tul3IIVPCglNjrxINUIcRGz1UUpaKLJw9khoImgUux5OlSJHTMYIEmzCCBJcCAQEwgckwgbQxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE7MDkGA1UECxMyVGVybXMgb2YgdXNlIGF0IGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMTAxLjAsBgNVBAMTJVZlcmlTaWduIENsYXNzIDMgQ29kZSBTaWduaW5nIDIwMTAgQ0ECEHQlU60H5K/RFQSvmE1J7WgwCQYFKw4DAhoFAKCBmDAUBgkrBgEEAYI3KAExBwMFAAMAAAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIgYKKwYBBAGCNwIBDDEUMBKhEIAOd3d3LmFkb2JlLmNvbSAwIwYJKoZIhvcNAQkEMRYEFI+KikYPbz6yKdH5Dqq3vRg8Bc7sMA0GCSqGSIb3DQEBAQUABIIBAE2BsVPkxLF++J1gFh5e1UkcJkg0YYCXh2morMftByQtss9mNVxedUZYcQ77uXYxXVotCabSce+FU3w3R4u0JoqqntDHf+SL9DLkmOdwsKmBhLNK3CuaIS3IMnenxidi3uZpp56tyrFjY4plySW1m56MMvvpmzGHAFXe5bKljmgs5WcM/02w/LGoUVAW5DGZL5fawHO0Fr22yWaUfIwSPtjEBFbrv5u5v5mxeaE0uDfmt/ROHwip7C+jMA78ZHsDxSh3nqCqxZ/HjHGyU5R2LFbv00lYfTXvlxkUSVSuA3rva+6eXTHgB6rOmMvub40KWMpwXqtEeQkO3Jae9DoRtA+hggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTExMTkyNTQ2WjAjBgkqhkiG9w0BCQQxFgQUSnHNkTrBPzu9Xb1MDMg5GXemcbAwDQYJKoZIhvcNAQEBBQAEggEAnwPowz9qoXM88NGSTkPlrcZe+i/aJGkO1ggL7vtWIpjBT+u+ASqCQuXelIGptbN5IAXyHDNsZl6nuxMZBpaPCGUx/XiJvEu/+hMsYHw1CFUm8Ik1Zt2ZZe8/t+2DGE8O0EuvknFuMY5oKfHEq3H4iZeOAPiBuY8cv7uE3d5WBZwisM1kwsa18DmmzmRpXXqHc4fqNSjtoH51QXvqx/7yskCJKtJsB8YbSBNS+ox5xHaibOckshakTgOR2Ag9AJbxRrbhibagwjYyzkAg9P9c/yM1WDaEMbc65tjEpyc10MR7LKEZcsXz1uylJvo/iAoHsDkWarDi//JjSJ4XoC5+Mg==) format('truetype');
35}
36@font-face {
37 font-family: 'Source Code Pro';
38 font-style: normal;
39 font-weight: 400;
40 src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT80AAAAOkNGRiD9qd9kAABIiAAA2ktEU0lHYnpAEAABP3AAACBYR0RFRi8sL9AAASpcAAAA1EdQT1MK+gbMAAE2ZAAACNBHU1VC3Z7yFQABKzAAAAsyT1MvMnLU0PUAAAFQAAAAYGNtYXDp1MYJAAA+WAAAChBoZWFk+92HfAAAAOwAAAA2aGhlYQZ2AN8AAAEkAAAAJGhtdHisN66qAAEi1AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZQWUCakAAAGwAAA8pnBvc3T/uAAzAABIaAAAACAAAQAAAAEEWlvC/ZlfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/2f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/Z/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAGQAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAQAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABwBUAAEAAAAAAAMAJgBbAAEAAAAAAAQADwBFAAEAAAAAAAUAOQCBAAEAAAAAAAYAFQC6AAEAAAAAAAcAYADPAAEAAAAAAAgAGgEvAAEAAAAAAAkADAFJAAEAAAAAAAsAGQFVAAEAAAAAAA0R2QFuAAEAAAAAAA4AJBNHAAEAAAAAAQAAFhNrAAEAAAAAAQEACxOBAAEAAAAAAQIACxOMAAEAAAAAAQMAFROXAAMAAQQJAAAAihOsAAMAAQQJAAEAHhQ2AAMAAQQJAAIADhRUAAMAAQQJAAMATBRiAAMAAQQJAAQAHhQ2AAMAAQQJAAUAchSuAAMAAQQJAAYAKhUgAAMAAQQJAAcAwBVKAAMAAQQJAAgANBYKAAMAAQQJAAkAGBY+AAMAAQQJAAsAMhZWAAMAAQQJAA0jthaIAAMAAQQJAA4ASDo+AAMAAQQJAQAALDqGAAMAAQQJAQEAFjqyAAMAAQQJAQIAFjrIAAMAAQQJAQMAKjreQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1SZWd1bGFyO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1SZWd1bGFyU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWRQYXVsIEQuIEh1bnRodHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgKGh0dHA6Ly93d3cuYWRvYmUuY29tLyksIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lICdTb3VyY2UnLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy4NCg0KVGhpcyBGb250IFNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UsIFZlcnNpb24gMS4xLg0KDQpUaGlzIGxpY2Vuc2UgaXMgY29waWVkIGJlbG93LCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgd2l0aCBhIEZBUSBhdDogaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClNJTCBPUEVOIEZPTlQgTElDRU5TRSBWZXJzaW9uIDEuMSAtIDI2IEZlYnJ1YXJ5IDIwMDcNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBSRUFNQkxFDQpUaGUgZ29hbHMgb2YgdGhlIE9wZW4gRm9udCBMaWNlbnNlIChPRkwpIGFyZSB0byBzdGltdWxhdGUgd29ybGR3aWRlIGRldmVsb3BtZW50IG9mIGNvbGxhYm9yYXRpdmUgZm9udCBwcm9qZWN0cywgdG8gc3VwcG9ydCB0aGUgZm9udCBjcmVhdGlvbiBlZmZvcnRzIG9mIGFjYWRlbWljIGFuZCBsaW5ndWlzdGljIGNvbW11bml0aWVzLCBhbmQgdG8gcHJvdmlkZSBhIGZyZWUgYW5kIG9wZW4gZnJhbWV3b3JrIGluIHdoaWNoIGZvbnRzIG1heSBiZSBzaGFyZWQgYW5kIGltcHJvdmVkIGluIHBhcnRuZXJzaGlwIHdpdGggb3RoZXJzLg0KDQpUaGUgT0ZMIGFsbG93cyB0aGUgbGljZW5zZWQgZm9udHMgdG8gYmUgdXNlZCwgc3R1ZGllZCwgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgZnJlZWx5IGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHNvbGQgYnkgdGhlbXNlbHZlcy4gVGhlIGZvbnRzLCBpbmNsdWRpbmcgYW55IGRlcml2YXRpdmUgd29ya3MsIGNhbiBiZSBidW5kbGVkLCBlbWJlZGRlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSBwcm92aWRlZCB0aGF0IGFueSByZXNlcnZlZCBuYW1lcyBhcmUgbm90IHVzZWQgYnkgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlIGZvbnRzIGFuZCBkZXJpdmF0aXZlcywgaG93ZXZlciwgY2Fubm90IGJlIHJlbGVhc2VkIHVuZGVyIGFueSBvdGhlciB0eXBlIG9mIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgZm9udHMgb3IgdGhlaXIgZGVyaXZhdGl2ZXMuDQoNCkRFRklOSVRJT05TDQoiRm9udCBTb2Z0d2FyZSIgcmVmZXJzIHRvIHRoZSBzZXQgb2YgZmlsZXMgcmVsZWFzZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykgdW5kZXIgdGhpcyBsaWNlbnNlIGFuZCBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLiBUaGlzIG1heSBpbmNsdWRlIHNvdXJjZSBmaWxlcywgYnVpbGQgc2NyaXB0cyBhbmQgZG9jdW1lbnRhdGlvbi4NCg0KIlJlc2VydmVkIEZvbnQgTmFtZSIgcmVmZXJzIHRvIGFueSBuYW1lcyBzcGVjaWZpZWQgYXMgc3VjaCBhZnRlciB0aGUgY29weXJpZ2h0IHN0YXRlbWVudChzKS4NCg0KIk9yaWdpbmFsIFZlcnNpb24iIHJlZmVycyB0byB0aGUgY29sbGVjdGlvbiBvZiBGb250IFNvZnR3YXJlIGNvbXBvbmVudHMgYXMgZGlzdHJpYnV0ZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykuDQoNCiJNb2RpZmllZCBWZXJzaW9uIiByZWZlcnMgdG8gYW55IGRlcml2YXRpdmUgbWFkZSBieSBhZGRpbmcgdG8sIGRlbGV0aW5nLCBvciBzdWJzdGl0dXRpbmcgLS0gaW4gcGFydCBvciBpbiB3aG9sZSAtLSBhbnkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlIE9yaWdpbmFsIFZlcnNpb24sIGJ5IGNoYW5naW5nIGZvcm1hdHMgb3IgYnkgcG9ydGluZyB0aGUgRm9udCBTb2Z0d2FyZSB0byBhIG5ldyBlbnZpcm9ubWVudC4NCg0KIkF1dGhvciIgcmVmZXJzIHRvIGFueSBkZXNpZ25lciwgZW5naW5lZXIsIHByb2dyYW1tZXIsIHRlY2huaWNhbCB3cml0ZXIgb3Igb3RoZXIgcGVyc29uIHdobyBjb250cmlidXRlZCB0byB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KUEVSTUlTU0lPTiAmIENPTkRJVElPTlMNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIEZvbnQgU29mdHdhcmUsIHRvIHVzZSwgc3R1ZHksIGNvcHksIG1lcmdlLCBlbWJlZCwgbW9kaWZ5LCByZWRpc3RyaWJ1dGUsIGFuZCBzZWxsIG1vZGlmaWVkIGFuZCB1bm1vZGlmaWVkIGNvcGllcyBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNCjEpIE5laXRoZXIgdGhlIEZvbnQgU29mdHdhcmUgbm9yIGFueSBvZiBpdHMgaW5kaXZpZHVhbCBjb21wb25lbnRzLCBpbiBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucywgbWF5IGJlIHNvbGQgYnkgaXRzZWxmLg0KDQoyKSBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucyBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgYmUgYnVuZGxlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSwgcHJvdmlkZWQgdGhhdCBlYWNoIGNvcHkgY29udGFpbnMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbGljZW5zZS4gVGhlc2UgY2FuIGJlIGluY2x1ZGVkIGVpdGhlciBhcyBzdGFuZC1hbG9uZSB0ZXh0IGZpbGVzLCBodW1hbi1yZWFkYWJsZSBoZWFkZXJzIG9yIGluIHRoZSBhcHByb3ByaWF0ZSBtYWNoaW5lLXJlYWRhYmxlIG1ldGFkYXRhIGZpZWxkcyB3aXRoaW4gdGV4dCBvciBiaW5hcnkgZmlsZXMgYXMgbG9uZyBhcyB0aG9zZSBmaWVsZHMgY2FuIGJlIGVhc2lseSB2aWV3ZWQgYnkgdGhlIHVzZXIuDQoNCjMpIE5vIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZvbnQgU29mdHdhcmUgbWF5IHVzZSB0aGUgUmVzZXJ2ZWQgRm9udCBOYW1lKHMpIHVubGVzcyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBDb3B5cmlnaHQgSG9sZGVyLiBUaGlzIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgcHJpbWFyeSBmb250IG5hbWUgYXMgcHJlc2VudGVkIHRvIHRoZSB1c2Vycy4NCg0KNCkgVGhlIG5hbWUocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgb3IgdGhlIEF1dGhvcihzKSBvZiB0aGUgRm9udCBTb2Z0d2FyZSBzaGFsbCBub3QgYmUgdXNlZCB0byBwcm9tb3RlLCBlbmRvcnNlIG9yIGFkdmVydGlzZSBhbnkgTW9kaWZpZWQgVmVyc2lvbiwgZXhjZXB0IHRvIGFja25vd2xlZGdlIHRoZSBjb250cmlidXRpb24ocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgYW5kIHRoZSBBdXRob3Iocykgb3Igd2l0aCB0aGVpciBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24uDQoNCjUpIFRoZSBGb250IFNvZnR3YXJlLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLCBpbiBwYXJ0IG9yIGluIHdob2xlLCBtdXN0IGJlIGRpc3RyaWJ1dGVkIGVudGlyZWx5IHVuZGVyIHRoaXMgbGljZW5zZSwgYW5kIG11c3Qgbm90IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGFueSBvdGhlciBsaWNlbnNlLiBUaGUgcmVxdWlyZW1lbnQgZm9yIGZvbnRzIHRvIHJlbWFpbiB1bmRlciB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gYW55IGRvY3VtZW50IGNyZWF0ZWQgdXNpbmcgdGhlIEZvbnQgU29mdHdhcmUuDQoNClRFUk1JTkFUSU9ODQpUaGlzIGxpY2Vuc2UgYmVjb21lcyBudWxsIGFuZCB2b2lkIGlmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4NCg0KRElTQ0xBSU1FUg0KVEhFIEZPTlQgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBDT1BZUklHSFQsIFBBVEVOVCwgVFJBREVNQVJLLCBPUiBPVEhFUiBSSUdIVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBGT05UIFNPRlRXQVJFIE9SIEZST00gT1RIRVIgREVBTElOR1MgSU4gVEhFIEZPTlQgU09GVFdBUkUuaHR0cDovL3d3dy5hZG9iZS5jb20vdHlwZS9sZWdhbC5odG1sVHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUgBlAGcAdQBsAGEAcgAxAC4AMAAxADcAOwBBAEQAQgBFADsAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAAAAwAAAAMAAAIUAAEAAAAAABwAAwABAAACFAAGAfgAAAAJAPcAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUBzQHOAc8B0AHRAdIB0wHUAdUB1gHjAeQCmgKZApsB6AITAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwIBAgcCAgKfAf4CywAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUCAwIGAgQCoQAAADoAPQBOAFgAjACVAMEA6ADnAOkA6wDqAO4A/wEJAQgBCgEMASUBJAEmASgBPwFGAUUBRwFJAUgBcwFyAXQBdgIKAnQCegJ3AgwB/QINAWsCEAIOAhECzALVAqAATAChAqUCngKcAp0CeAKmAqcCrAKtAqQCqAJSAlQAAAD9AVUB6QHnAqMCqQJ7AqICqgH0AfUB5QMfADYAOQCUAKIBVgH4AfkB7gHvAewB7QKXAsQBkADbAoYCeQHyAfMBqwGsAgsB/AHwAfECigA4AFkANwBbAFcAdAB1AHcAcwCSAJMAAACRAL4AvwC9ATACzQLUAtYC1wLaAtgC2wLZAtwCzgAEB/wAAAEWAQAABwAWAC8AOQBAAFoAYAB6AH4AvwDEANEA1gDfAOQA8QD2ATEBSQFlAX4BgAGPAZIBoQGwAdwB5wHrAhsCNwJDAlICVAJZAmECZQJvAnkChwKOAp4CsAKzArgCvAK/AswC3QLjAwQDDAMPAxMDGwMkAygDLgMxA8AdQx1JHU0dUB1SHVgdWx2cHaAdux4PHiEeJR4rHjseSR5jHm8ehR6PHpMelx6eHvkgByAVIBogHiAiICYgMCAzIDogRCBxIHkgfyCJII4glCChIKQgpyCsILIgtSC6IRMhFyEgISIhJiEuIVQhXiGTIgIiBiIPIhIiFSIaIh4iKyJIImAiZSWfJaAlsyW3Jb0lwSXGJcomESZqJxMnUvsC//8AAAAgADAAOgBBAFsAYQB7AKAAwADFANIA1wDgAOUA8gD3ATQBTAFoAYABjwGSAaABrwHNAeYB6gIYAjcCQwJQAlQCWAJhAmUCbwJ5AocCjAKeArACsgK3ArsCvgLGAtgC4QMAAwYDDwMSAxsDIwMmAy4DMQPAHUMdRx1NHU8dUh1WHVsdnB2gHbseDB4gHiQeKh42HkIeWh5sHoAejh6SHpcenh6gIAcgEiAYIBwgICAmIDAgMiA5IEQgcCB0IH0ggCCNIJQgoSCkIKYgqyCxILUguSETIRchICEiISYhLiFTIVshkCICIgYiDyIRIhUiGSIeIisiSCJgImQlACWgJbIltiW8JcAlxiXJJhAmaicTJ1L7Af//AAABnQAA/8EAAP+7AAAAAP92AAD/vwAAAAcAAABTAAAAAAAA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dQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvATACAAEARgB9AK4A0QD4AUABkQGkAbwB6AH3AjgCQwJfAnYCegKZAsAC5gLqAvMDFQMtA2YDlQOiA+kD7wP+BAcEDgQSBCUEOARLBIAEiASdBKgEqwSwBMEE3AThBQUFFQUvBUQFSQVXBWsFcwWCBYYFigXQBdcF2wXlBfsGFAYlBmMG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AF8AXwBfAF8AUQBiAIYAhgCGAIYAhgBCAIYANQBRAFMAUwBTAFMAUwBTAFMAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAtACEAMAAwADAAMAAwADAAMABkAGQAZABkAGQAZABDAEMAQwBDAEMAQwBDAE8AKgAqACoAKgAqAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAKAAoACgAKACYAJgAmACYAJgAmACYAJgBBAEEAQQBBABAAZQA+AFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAEQAUAFAAUABQAFAAUAAyADwAPAA8AEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBIAEgASABIAEgASABIAAoAXQBdABQAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgA3AGoAagBRAFEAKgBRAFEAUQBRAFEAPABdAF0AXQBdAF0AXQBd/+oAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAsAPAA8ADwAPAA8ADwAPACSAHMAkgCGAIYATABIAEgASABIAEgASABIAFgARQBFAEUARQBFAEUATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAAgACAAIAAgAMQAxADEAMQAxADEAMQAxAEcARwBHAEcAPABdADcAXgA8AF0APQA/AEUAPABNAC4APwA2ADMACAAxABoANAA5ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAKgBHAGIARQA5ACcAOABNAEYARABDAEcAYgBFADkAJwA4AE4ARgBEAEMA2wDFANsAxQAgAOMA4wBtAHsA9QCCANEA2QBfAGcA2QBnAMUA0wBSAGAAVQBVAFAAFABQABQA2wCXADwA0AB6AOIAYwB4AGMAYwEHAGMBBwBUAH8AfwBbAEgAHgAeAHD/+wAPADEAMQBXAGgAhgCGAFUAoQDQAK0ArACsAKwArwC3AK8ArQDsANUA/gD0AKEA0ACtAKwArACsAK8AtwCvAK0A7ADVAP4A9AChANAArQCsAKwArACw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AbYBvADAAcIByAGAAc4B1AFoAMABdAHaAT4BPgE+AeAB5gABASwB/AABASwCpgABASMCpgABAVsCpgABASsCpgABAUsCpgABAVMCpgABAUECpgABAL4CpgABATICpgABATsCpgABAS0CrgABATECpgABATcCpgABAS0CpgABAToB/AABAIoC2gABAVcB/AABAcEC2gABATsB/AABAaQC5AABATMB/AABAJcC2gABAVwCtgABALIC2gABARwC2gABATwB/AABAT4B/AABAS0B/AABAVYB/AABAS8B/AABAQcCgwABAScB/AABATAB/AABAUAB/AABAcMCtgABAZgCpgABAT0CpgABAVwB/AABAT8B/AABATgB/AABARoB/AABASAB/AABATIB/AABASUB/AABAZEB/AABAOsB/AABARcB/AABASwCzwABASwCwgABBFIEWgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATkAAAABAVYAAAABAToAAAABAXgAAAABBCIEMAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAMIAmADsAPIAmAD4AOwAmAD+AQQBCgEQARYBHAEiASgAvAEuATQBOgCYAUABRgFMAOYBUgFYAMgAmACYAV4BZADCAJgBWAEiAJgBWAEEAWoAngEEAWoAngFwAXYBfAF8AYIBiADIAJgBXgGOAJ4BlAABASz/6gABATT/6gABAVv/6gABASL/6gABAUz/6gABALz/6gABAU//6gABASv/6gABAS3/6gABAVL/6gABAVr/6gABAJX/6gABAUD/6gABATb/6gABAS//6gABASf/6gABATf/6gABAVb/6gABATL/6gABATv/6gABASP/6gABASn/GgABATr/6gABAVz/6gABAOz/GQABAXP/6gABATX/6gABATn/6gABAIj/JgABAcH/JgABAMj/6gABAXv/6gABAUH/6gABAQr/DgABAT3/6gABAUP/6gABASD/6gABAcv/JgABASr/6gABAHb/6gABAW3/6gABAP7/6gABAcz/JgABAsACxgABAAwAEgABAAAADgADAA4AFAAaAAEBLAHmAAEBpAKGAAEB9wKaAAEBnQHm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) format('truetype');
41}
42@font-face {
43 font-family: 'Source Code Pro';
44 font-style: normal;
45 font-weight: 500;
46 src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT1oAAAAOkNGRiDLPo+VAABJBAAA2CNEU0lHEXcESwABPaQAACBYR0RFRjJdMx0AASiwAAAA4EdQT1MzPM2kAAE0xAAACKJHU1VC3Z7yFQABKZAAAAsyT1MvMnM40LUAAAFQAAAAYGNtYXDp1MYJAAA+1AAAChBoZWFk+9WHfAAAAOwAAAA2aGhlYQZuAN8AAAEkAAAAJGhtdHijJaU6AAEhKAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZe4mG4MAAAGwAAA9JHBvc3T/uAAzAABI5AAAACAAAQAAAAEEWkwQeqtfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/0f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/R/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAH0AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFgBFAAEAAAAAAAIABwBbAAEAAAAAAAMAJQBiAAEAAAAAAAQAFgBFAAEAAAAAAAUAOQCHAAEAAAAAAAYAFADAAAEAAAAAAAcAYADUAAEAAAAAAAgAGgE0AAEAAAAAAAkADAFOAAEAAAAAAAsAGQFaAAEAAAAAAA0R2QFzAAEAAAAAAA4AJBNMAAEAAAAAABAADxNwAAEAAAAAABEABhN/AAEAAAAAAQAAFhOFAAEAAAAAAQEACxObAAEAAAAAAQIACxOmAAEAAAAAAQMAFROxAAMAAQQJAAAAihPGAAMAAQQJAAEALBRQAAMAAQQJAAIADhR8AAMAAQQJAAMAShSKAAMAAQQJAAQALBRQAAMAAQQJAAUAchTUAAMAAQQJAAYAKBVGAAMAAQQJAAcAwBVuAAMAAQQJAAgANBYuAAMAAQQJAAkAGBZiAAMAAQQJAAsAMhZ6AAMAAQQJAA0jthasAAMAAQQJAA4ASDpiAAMAAQQJABAAHjqqAAMAAQQJABEADDrIAAMAAQQJAQAALDrUAAMAAQQJAQEAFjsAAAMAAQQJAQIAFjsWAAMAAQQJAQMAKjssQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIE1lZGl1bVJlZ3VsYXIxLjAxNztBREJFO1NvdXJjZUNvZGVQcm8tTWVkaXVtO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1NZWRpdW1Tb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9NZWRpdW1UeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBNAGUAZABpAHUAbQA7AEEARABPAEIARQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMQA3ADsAUABTACAAMQAuADAAMAAwADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4ANwAwADsAbQBhAGsAZQBvAHQAZgAuAGwAaQBiADIALgA1AC4ANQA5ADAAMABTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0ATQBlAGQAaQB1AG0AUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvAE0AZQBkAGkAdQBtAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARVTb3VyY2VDb2RlUHJvLU1lZGl1bQABAQEu+vYA+vcB+vgMAPr5Avr5A/gXBIwMAVz8JPlW+nwFHDGmDxw0IBHHHQAAxCsSAt8CAAEACAAOABUAHAAjACoAMQA4AD8ARgBNAFQAWwBiAGkAcAB3AH0AiACOAJgAngClAKwAsgC4AL8AxQDPANYA3QDkAOsA8gD5AQABBwEOARkBHwEpATABNgE9AUgBUwFaAWEBZQFrAXIBeQGDAYoBkQGYAZ8BqgGxAbcBvQHEAcgBzwHWAd0B5AHqAfAB9wH+AgUCDAITAhoCJwIuAjUCPAJDAkoCUQJYAl8CZAJrAnICeQKAAocCjgKUApoCoQKoAq8CtgK8AscCzgLVAtwC4wLqAvAC9wL+AwUDDAMSAxkDHwMkAzEDOAM/A0YDTQNUA1sDYgNpA24DdQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvASICAAEARwB5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CxVktchs3Bv3H/cWC6qlYLobuKuyxpAfCxXWBjH3LQUhBg73kRX4Hun3Fx0V9wXp+wUGC7RYG15sZlAL9xUK92R3C/trufcNvgELfQr3jgv3iBX7NguFHpRdBQuPH1AGCxPc9wQmBxPs+wQLN54fjwcT+NqmwQsVIAb3BvsFBdsGCwHW9yr3KvcqA9YL/CQcBXhJCgv3ZvsD7vsd+wgmC3AdwgoL9yH3HAoL92P8xOj5IfvABgsVWK9qt7evrL4eC2ppWl2qbLiTk40LGZAGiWaJXIpnCAv5IfUdb7YfDgACWAA3AAAAGgBiAD8AUABuAIAAMwBLAFoASwBaAH8ATQBPAC0AXgAuAFwAPwAnAEsAIwAJAC0AIQA/AEwAWABMADgAQQBiAEMAWABXADQAYgBMADYAWAA4AFgAOACKAEMAQABJAC4ABwA5AC0ARwAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAa//4AFwA/AD8APwA/AD8AUABQAFAADABuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AMwAzADMAMwAzADMAMwBLAEsASwAIAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAEsAWgB/AH8AfwB/AH8APwB/ADAATQBPAE8ATwBPAE8ATwBPAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AKQAdAC0ALQAtAC0ALQAtAC0AXABcAFwAXABcAFwAPwA/AD8APwA/AD8APwBLACcAJwAnACcAJwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsACQAJAAkACQAhACEAIQAhACEAIQAhACEAPwA/AD8APwAMAF4APQBMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMABEAEABMAEwATABMAEwAKwA4ADgAOABBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQwBDAEMAQwBDAEMAQwACAFgAWAAQAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcANABiAGIATABMACIATABMAEwATABMADYAWABYAFgAWABYAFgAWP/kADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAALADgAOAA4ADgAOAA4ADgAigBvAIoAfwB/AEkAQwBDAEMAQwBDAEMAQwBRAEAAQABAAEAAQABAAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQAHAAcABwAHAC0ALQAtAC0ALQAtAC0ALQBHAEcARwBHADgAWAA0AFkAOABYADoAPABBADgASQAqADwANQAuAAcALAAXACgALQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ACUAQwBeAEAANQAmADUASQBEAEIAPwBDAF4AQAA1ACYANQBKAEQAQgA/ANIAwQDSAMEAFwDcANwAagB2AO0AdgDLANUAUwBeANUAXgC/AM4ASABXAFEAUQBQABQAUAAUANIAkwA8AMkAewDbAGQAdABkAF0BAABdAQAATwB1AHUAVgBCABsAGwBt//kACQAtAC0AUwBjAIMAgwBQAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACeAM0AqQCqAKkAqgCrALUArACqAOcA0QD6APAAngDNAKkAqgCpAKoArAC1AKwAqgDnANEA+gDwAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACkAIcAjACkAKcAsgCHAJ0AwgCRAKoArgCKALUAwAB+AKoAjACnAIcA7ACeAKAAmwCMAFIAlgCJAJMAnQCdAJkAhwCHAKoANABQAEsALwA2AG0AMQBcAEsAKgAlAGkAJgBQAFwAZwAzABkAGQAZABoALAAZABkAJgAZABkAGQAZABkAGQBRAFEAYQBRAM8AUQB3AGgAUQBRAFEAaQBRAEYARgBRACH/+gBJAEgAsAA3AB8AGQBDAC0AagAaABAAIAAeACAAxACZAHIAoQAiACIARABEACIAIgAdAB3/5v/m//cARwBdAPkAmQDLANUA8gDYAK4A5wCgAKAA8gCtAOUArQDyAJcAjACtAKYAygDDAOIA2ADlAK4AoQDnAPMAoACcAJcAlQCtAKwApgCtAOIA7ACMAJwA6ADoAMoAygDDALgAoACcAGIAYgDzAPoBIwDiAJwA0wDTAM4A5QDkAKoArAChAKEAoQChAKEAnAChAKEAsgCkALIApACyAKQApQCkAKoArgCqAK4AqgCuAKUAogCqAKQBBADjAAAAAAAAAAD/0f/RAP0AzwAhACEA/QDPABIAEgD9AM8A/QD9AM8Az//R/9H/0f/RAP0A/QDPAM//0f/R/9H/0QD9AP0AzwDPAM8AzwDPAM//0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QBLAEsA/QDP/9EAoAD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QD9/9H/0QD9/9H/0f/R/9EA/QD9AP3/0QDPAP0Az//RAM//0QDPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAAAAAAAAAAg0AAAEsAAAAAAAAAAAAAAEsAAAAAAABAAAADAAAAAAAygACAB8AAgA1AAEASwBMAAEAZwBnAAEAbgBuAAIAfgB+AAEAoQCjAAEAqQCpAAEAzQDOAAEA5gDmAAEA/AD8AAEBBAEEAAIBGAEYAAEBHAEcAAIBHwEfAAIBLgEuAAIBLwEwAAEBNQE1AAIBVQFXAAEBXQFdAAEBbAFsAAIBggGDAAEBmgGbAAEBnQGdAAEBoQGiAAEBrQGtAAEBwwHEAAEByAHIAAICzQLNAAEC1wLXAAEC3QMcAAMDHgMeAAMAAgADAt0C+AABAwMDHAABAx4DHgABAAEAAAAKAGwCGgACREZMVAAObGF0bgA4AAQAAAAA//8AEAAAAAIABAAGAAgACgAMAA4AEAASABQAFgAYABoAHAAeAAQAAAAA//8AEAABAAMABQAHAAkACwANAA8AEQATABUAFwAZABsAHQAfACBhYWx0AMJhYWx0AMpjYXNlANJjYXNlANhjY21wAN5jY21wAOxkbm9tAPpkbm9tAQBmcmFjAQZmcmFjARBudW1yARpudW1yASBvbnVtASZvbnVtASxvcmRuATJvcmRuAThzYWx0AT5zYWx0AUpzaW5mAVZzaW5mAVxzczAxAWJzczAxAWhzczAyAW5zczAyAXRzczAzAXpzczAzAYBzczA0AYZzczA0AYxzdWJzAZJzdWJzAZhzdXBzAZ5zdXBzAaYAAAACAAAAAQAAAAIAAAABAAAAAQAQAAAAAQAQAAAABQADAAQABQAGAAcAAAAFAAMABAAFAAYABwAAAAEACQAAAAEACQAAAAMACAAKAAsAAAADAAgACgALAAAAAQAIAAAAAQAIAAAAAQAPAAAAAQAPAAAAAQAMAAAAAQAMAAAABAARABIAEwAUAAAABAARABIAEwAUAAAAAQAOAAAAAQAOBAQAAQARA/4AAQARBAgAAQASBAIAAQASBDgAAQATBDIAAQATBEgAAQAUBEIAAQAUAAAAAQAOAAAAAQAOAAAAAgAMAA0AAAACAAwADQAXADAAOABAAEgAUABaAGIAagByAHoAggCKAJYAngCmAK4AtgC+AMYAzgDWAN4A5gABAAAAAQP6AAMAAAABBLAAAgAAAAEArgAGAAAAAQDMAAYAAAACANYA6gAEAAAAAQDyAAQAAAABAWQABgAAAAECKgABAAAAAQI0AAEAAAABAk4AAQAAAAECaAAGAAAAAwJmAngCigABAAAAAQKSAAEAAAABAsoAAQAAAAEC5AABAAAAAQL+AAEAAAABAvwAAQAAAAEC/gABAAAAAQMGAAEAAAABAzoAAQAAAAEDTgAEAAAAAQTcAAEAAAABBOYAAQU+AAQADgAUABoAIAACAAYC4QACABAC4QACACAC4QACACoC4QADAAAAAQUYAAEFJAABAAAAAgADAAAAAgUYBR4AAQUkAAEAAAAVAAMAAAABBRYAAQUQAAEAAAAWAAEFCgADAAwANgBYAAUADAASABgAHgAkAw0AAgLdAwsAAgLfAxEAAgLjAxsAAgLnAw8AAgLtAAQACgAQABYAHAMVAAIC3QMTAAIC3wMZAAIC4wMXAAIC7QAEAAoAEAAWABwDCQACAt0DBQACAt8DAwACAuUDBwACAvMAAQSaABAAJgAwADoARABOAFgAYgBsAHYAgACSAJwApgCwALoAxAABAAQASwACAv8AAQAEAGcAAgL/AAEABABuAAIC4wABAAQAfgACAv8AAQAEAKkAAgL/AAEABADNAAIC/wABAAQA/AACAv8AAQAEAQQAAgLzAAEABAEYAAIC/wACAAYADAEfAAIC4wEcAAIC/QABAAQBLgACAv8AAQAEATUAAgLzAAEABAFdAAIC/wABAAQBbAACAvMAAQAEAYIAAgL/AAEABAHIAAIC/QADAAED8AABBBIAAAABAAAAFgACBDwADgJEAkUCRgJHAkgCSQJKAksCTAJNAlACUQJOAk8AAgQaAA4CNgI3AjgCOQI6AjsCPAI9Aj4CPwJCAkMCQAJBAAEEDgCDAAMAAQQOAAEEGAAAAAEAAAAWAAMAAQQOAAEEHgAAAAEAAAAWAAMAAgQgBBYAAQQMAAAAAQAAABYAAgQUAB0CVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAAIDegAOAhoCGwIcAh0CHgIfAiACIQIiAiMCJgInAiQCJQACA1gADgIoAikCKgIrAiwCLQIuAi8CMAIxAjQCNQIyAjMAAQOmAAoAAQOqAAEAAAEAAAID3gADAhcCGAIWAAABAQACA9gAGQGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMCUwJyAAABAgACA7gACQHEAcUBxgHHAcgByQHKAcsCcwAAAQMAAQOy/6MAAgOyAFwCVgJXAlgCWQJaAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJvAnABxQHGAccByAHJAcoBywJxAhcCGAIWAhQCUwJyAnMCGQLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAAEDsAAQACYALAAyAD4ASgBWAGIAbgB6AIYAkgCeAKoAtAC+AMgAAgJVAa0AAgJbAcQABQJEAjYCGgIoAdcABQJFAjcCGwIpAdgABQJGAjgCHAIqAdkABQJHAjkCHQIrAdoABQJIAjoCHgIsAdsABQJJAjsCHwItAdwABQJKAjwCIAIuAd0ABQJLAj0CIQIvAd4ABQJMAj4CIgIwAd8ABQJNAj8CIwIxAeAABAJQAkICJgI0AAQCUQJDAicCNQAEAk4CQAIkAjIABAJPAkECJQIzAAEAhAABAAgAAQAEAS8AAgL/AAIC7gAtAyEBLwI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMC3gLgAuIC5ALmAugC6gLsAu4C8ALyAvQC9gL+AwADBAMGAwgDCgMMAw4DEAMSAxQDFgMYAxoDHAMiAAEABABZ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) format('truetype');
47}
48@font-face {
49 font-family: 'Source Code Pro';
50 font-style: normal;
51 font-weight: 600;
52 src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT8cAAAAOkNGRiC2ZBOfAABJHAAA2XlEU0lHBLtt/AABP1gAACBYR0RFRi8sL9AAASogAAAA1EdQT1MlURFbAAE2KAAACPRHU1VC3Z7yFQABKvQAAAsyT1MvMnOc0bUAAAFQAAAAYGNtYXDp1MYJAAA+7AAAChBoZWFk+82HfgAAAOwAAAA2aGhlYQZmAOAAAAEkAAAAJGhtdHialJxBAAEimAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZXGkOKIAAAGwAAA9PHBvc3T/uAAzAABI/AAAACAAAQAAAAEEWrrz6QNfDzz1AAMD6AAAAADNFZ/2AAAAAM0Vn/b/yv5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/K/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAJYAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwYJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGABFAAEAAAAAAAIABwBdAAEAAAAAAAMAJwBkAAEAAAAAAAQAGABFAAEAAAAAAAUAOQCLAAEAAAAAAAYAFgDEAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAABAADxN2AAEAAAAAABEACBOFAAEAAAAAAQAAFhONAAEAAAAAAQEACxOjAAEAAAAAAQIACxOuAAEAAAAAAQMAFRO5AAMAAQQJAAAAihPOAAMAAQQJAAEAMBRYAAMAAQQJAAIADhSIAAMAAQQJAAMAThSWAAMAAQQJAAQAMBRYAAMAAQQJAAUAchTkAAMAAQQJAAYALBVWAAMAAQQJAAcAwBWCAAMAAQQJAAgANBZCAAMAAQQJAAkAGBZ2AAMAAQQJAAsAMhaOAAMAAQQJAA0jthbAAAMAAQQJAA4ASDp2AAMAAQQJABAAHjq+AAMAAQQJABEAEDrcAAMAAQQJAQAALDrsAAMAAQQJAQEAFjsYAAMAAQQJAQIAFjsuAAMAAQQJAQMAKjtEQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIFNlbWlib2xkUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1TZW1pYm9sZDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tU2VtaWJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9TZW1pYm9sZFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAUwBlAG0AaQBiAG8AbABkAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBTAGUAbQBpAGIAbwBsAGQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFMAZQBtAGkAYgBvAGwAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUwBlAG0AaQBiAG8AbABkAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARdTb3VyY2VDb2RlUHJvLVNlbWlib2xkAAEBAS769gD69wH6+AwA+vkC+voD+BoEjAwBVfwk+VX6fAUcMZ4PHDQYEckdAADFDxIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3xbuQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2Vy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ACsAKwArACsAKwArACsAKwAmABoAKwArACsAKwArACsAKwBUAFQAVABUAFQAVAA6ADoAOgA6ADoAOgA6AEcAJAAkACQAJAAkAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASAAHAAcABwAHABsAGwAbABsAGwAbABsAGwA9AD0APQA9AAkAVwA8AEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcAEAANAEkASQBJAEkASQAlADUANQA1AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+//sAUgBSAA0AVABUAFQAVABUAFQAVABUAFQAVABUAFQAVAAxAFoAWgBHAEcAGwBHAEcARwBHAEcAMABSAFIAUgBSAFIAUgBS/94ANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1AAsANQA1ADUANQA1ADUANQCCAGwAggB4AHgARgA+AD4APgA+AD4APgA+AEoAOwA7ADsAOwA7ADsARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAAYABgAGAAYAKAAoACgAKAAoACgAKAAoAEcARwBHAEcANQBSADEAUwA1AFIAOAA6AD4ANQBEACcAOgA0ACkABgAnABQAHQAiADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUAIABAAFoAPAAyACUAMwBEAEIAQAA8AEAAWgA8ADIAJQAzAEUAQgBAADwAyQC9AMkAvQAPANUA1QBoAHEA5gBqAMQA0gBIAFYA0gBWALoAyQA+AE0ATgBOAFAAFABQABQAyQCQADwAwgB8ANUAZgBxAGYAVgD5AFYA+QBKAGwAbABRADwAGAAYAGr/9wADACgAKABOAF4AgQCBAEoAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAJwAygCmAKgApgCoAKgAtACqAKgA4QDOAPUA6wCcAMoApACoAKYAqACpALQAqgCoAOEAzgD1AOsAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAKEAhQCJAKEAowCvAIUAmgC+AI0ApQCsAIgArgC9AHsApQCJAKMAhQDlAJkAnQCXAIUAUwCNAIYAlQCaAJoAlwCFAIUApQAvAEoASQAqADMAaAAwAFcASQAlACAAZAAgAEsAVwBiAC4AFgAWABYAFwAnABYAFgAlABYAFgAWABYAFgAWAE4ATgBdAE4AxwBOAHYAZgBOAE4ATgBiAE4AQABAAE4AGv/3AEYARACmADAAGQAUAEAAJgBfABoADwAgAB4AIAC/AJMAbACcAB4AHgBAAEAAHgAeABkAGf/l/+X/9QBBAFgA8wCLAMQA0gDvANYApADiAJgAmADsAKoA4gCjAOwAkACDAKoAoQDFALwA2gDSAOAApACZAOIA7QCYAJQAkACOAKoApwChAKoA2gDlAIMAlADjAOMAxQDFALwAsQCYAJQAWABYAPAA+AEjANoAlADOAM4AywDgAN4ApwCpAJoAmgCaAJoAmgCUAJoAmgCsAJwArACcAKwAnACiAJwApwCrAKcAqwCnAKsAogCdAKQAnAEBAN4AAAAAAAAAAP/K/8oA9gDAACEAIQD2AMAAEgASAPYAwAD2APYAwADA/8r/yv/K/8oA9gD2AMAAwP/K/8r/yv/KAPYA9gDAAMAAwADAAMAAwP/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAEsASwD2AMD/ygCKAPYAigCK/8r/yv/KAPYAigCK/8r/yv/KAPYAigCK/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAPb/yv/KAPb/yv/K/8r/ygD2APYA9v/KAMAA9gDA/8oAwP/KAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAA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ASoCpAABAUYCpAABAU0CpAABAUsCpAABASsCpAABAUECpAABATwCpAABAMECpAABATICpAABAToCpAABAS8CqQABATACpAABATUCpAABATsCpAABATcCAQABAJEC2gABAVYCAQABAb0C2gABAToCAQABAaAC5QABATICAQABAJcC2gABAVoCxQABAKwC2gABARUC2gABAT8CAgABATwCAQABAT4CAQABATACAQABAVQCAQABATQCAQABAQgCigABAScCAQABAS4CAQABAS0CAQABAUICAQABAa8CtgABAS8CpAABAZECpAABAT4CpAABATkCAQABAVoCAQABAT0CAQABATgCAQABATYCAQABARwCAQABASICAQABASUCAQABASoCAgABAZACAQABAPICAQABARoCAQABASwC1gABASwCxwABBEYETgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATQAAAABAVUAAAABATgAAAABAXYAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAAngCYAJgAwgDmAOwAmADyAPgA5gD+AQQBCgDsARAA8gEWARwAzgEiAPgAngCYASgBLgE0AQQBOgDgAMgBQACYAUYBTACYAJgBUgEWAJgA4AFYAV4BZADIAVIAngCqAWoBcADIAXYBfADIAUABggGIAWQBjgABASz/6gABATb/6gABAVv/6gABASL/6gABAUb/6gABAMD/6gABAU//6gABASv/6gABAS7/6gABAUr/6gABAVP/6gABAJn/6gABAUD/6gABAS//6gABAST/6gABATf/6gABATL/6gABAVX/6gABATT/6gABATr/6gABASL/GwABAVr/6gABAO7/FwABAW7/6gABAIv/JgABAb//JgABAMr/6gABAXb/6gABAS3/6gABAQv/DwABAT3/6gABAUX/6gABATP/6gABAUP/6gABATj/6gABAcn/JgABASn/6gABAIH/6gABAW//6gABAQn/DwABAQD/6gABAcr/JgABAroCwAABAAwAEgABAAAADgADAA4AFAAaAAEBLAHrAAEBpgKEAAEB/AKYAAEBnQHrAAECmAKgAAEADAAWAAIAAAAk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) format('truetype');
53}
54@font-face {
55 font-family: 'Source Code Pro';
56 font-style: normal;
57 font-weight: 700;
58 src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAUlwAAAAOkNGRiAHSupxAABIqAAA5CBEU0lHE/UMPwABSawAACBYR0RFRi8sL9AAATRQAAAA1EdQT1MlBRrrAAFAWAAACRhHU1VC3Z7yFQABNSQAAAsyT1MvMnQA0tUAAAFQAAAAYGNtYXDp1MYJAAA+eAAAChBoZWFk+7+HegAAAOwAAAA2aGhlYQZXAOAAAAEkAAAAJGhtdHiJeIp6AAEsyAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZU1Di90AAAGwAAA8x3Bvc3T/uAAzAABIiAAAACAAAQAAAAEEWmW2IDdfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/u/5wAsED6AABAAMAAgAAAAAAAAABAAAD2P7vAAACWP+7/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAK8AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwcJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAIAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABABUAAEAAAAAAAMAIwBYAAEAAAAAAAQAFAB7AAEAAAAAAAUAOQCPAAEAAAAAAAYAEgDIAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAAQAAFhN2AAEAAAAAAQEACxOMAAEAAAAAAQIACxOXAAEAAAAAAQMAFROiAAMAAQQJAAAAihO3AAMAAQQJAAEAHhRBAAMAAQQJAAIACBRfAAMAAQQJAAMARhRnAAMAAQQJAAQAKBStAAMAAQQJAAUAchTVAAMAAQQJAAYAJBVHAAMAAQQJAAcAwBVrAAMAAQQJAAgANBYrAAMAAQQJAAkAGBZfAAMAAQQJAAsAMhZ3AAMAAQQJAA0jthapAAMAAQQJAA4ASDpfAAMAAQQJAQAALDqnAAMAAQQJAQEAFjrTAAMAAQQJAQIAFjrpAAMAAQQJAQMAKjr/Q29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvQm9sZDEuMDE3O0FEQkU7U291cmNlQ29kZVByby1Cb2xkO0FET0JFU291cmNlIENvZGUgUHJvIEJvbGRWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxUeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBCAG8AbABkADEALgAwADEANwA7AEEARABCAEUAOwBTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0AQgBvAGwAZAA7AEEARABPAEIARQBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbwBsAGQAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAADAAAAAwAAAhQAAQAAAAAAHAADAAEAAAIUAAYB+AAAAAkA9wABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHNAc4BzwHQAdEB0gHTAdQB1QHWAeMB5AKaApkCmwHoAhMAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbAgECBwICAp8B/gLLABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQIDAgYCBAKhAAAAOgA9AE4AWACMAJUAwQDoAOcA6QDrAOoA7gD/AQkBCAEKAQwBJQEkASYBKAE/AUYBRQFHAUkBSAFzAXIBdAF2AgoCdAJ6AncCDAH9Ag0BawIQAg4CEQLMAtUCoABMAKECpQKeApwCnQJ4AqYCpwKsAq0CpAKoAlICVAAAAP0BVQHpAecCowKpAnsCogKqAfQB9QHlAx8ANgA5AJQAogFWAfgB+QHuAe8B7AHtApcCxAGQANsChgJ5AfIB8wGrAawCCwH8AfAB8QKKADgAWQA3AFsAVwB0AHUAdwBzAJIAkwAAAJEAvgC/AL0BMALNAtQC1gLXAtoC2ALbAtkC3ALOAAQH/AAAARYBAAAHABYALwA5AEAAWgBgAHoAfgC/AMQA0QDWAN8A5ADxAPYBMQFJAWUBfgGAAY8BkgGhAbAB3AHnAesCGwI3AkMCUgJUAlkCYQJlAm8CeQKHAo4CngKwArMCuAK8Ar8CzALdAuMDBAMMAw8DEwMbAyQDKAMuAzEDwB1DHUkdTR1QHVIdWB1bHZwdoB27Hg8eIR4lHiseOx5JHmMebx6FHo8ekx6XHp4e+SAHIBUgGiAeICIgJiAwIDMgOiBEIHEgeSB/IIkgjiCUIKEgpCCnIKwgsiC1ILohEyEXISAhIiEmIS4hVCFeIZMiAiIGIg8iEiIVIhoiHiIrIkgiYCJlJZ8loCWzJbclvSXBJcYlyiYRJmonEydS+wL//wAAACAAMAA6AEEAWwBhAHsAoADAAMUA0gDXAOAA5QDyAPcBNAFMAWgBgAGPAZIBoAGvAc0B5gHqAhgCNwJDAlACVAJYAmECZQJvAnkChwKMAp4CsAKyArcCuwK+AsYC2ALhAwADBgMPAxIDGwMjAyYDLgMxA8AdQx1HHU0dTx1SHVYdWx2cHaAdux4MHiAeJB4qHjYeQh5aHmwegB6OHpIelx6eHqAgByASIBggHCAgICYgMCAyIDkgRCBwIHQgfSCAII0glCChIKQgpiCrILEgtSC5IRMhFyEgISIhJiEuIVMhWyGQIgIiBiIPIhEiFSIZIh4iKyJIImAiZCUAJaAlsiW2JbwlwCXGJckmECZqJxMnUvsB//8AAAGdAAD/wQAA/7sAAAAA/3YAAP+/AAAABwAAAFMAAAAAAAAAAP9+/1cA6QAAAAAAAAAAAAAAAP9k/gr/TP9L/0j/Qf8+/zX/LP8f/xv/DP+sAAAAAAAMAAsABwAAAAAAAAAA/+b/5f/e/9cAAP/T/9H+5OUSAADlDgAA5REAAOUP5LvkuuSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLa4hkAAOMZAAAAAAAAAADhv+Ja4pPhueJCAADhqgAA4ajhpeHd4dvh2eHYAADh0OHO4cvhm+D44PLg7+GF4YHhO+E14SDgpeCk4J4AAOByAADgh+B94FrgQOA43iPdFN0G3QTdANz+3O8AANyw3Fnbr9tlBqoAAQEWAAABMgAAATwAAAFEAUoAAAGGAAABnAAAAaoAAAHAAjQCXgKQAAAAAAAAArYCuAK6AtgC2gLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyALKAAAAAAAAAsYC0ALUAtwAAAAAAAAAAALgAAAAAAAAAAAC3AAAAt4AAALeAAAAAAAAAAAC2gLgAuIC5ALmAvAC/gMQAxYDIAMiAAAAAAMgAAAD0APWA9oD3gAAAAAAAAAAAAAD2AAAA9gAAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAADtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUB4wHkApoCmQKbAegCEwIBAgcCAgKfAf4CywIDAgYCBAKhAx8B5wJ6AncCdQJ4AggCDALVAg4CUgH0AqMB9wIQAtYCdAKeAhwCHQLMAqYCDQH8AtsCGwJUAfUCiwKMAo0B6QA9AEwATgBXAFgAWQBbAHMAdAB1AHcA5ACMApYAoQC9AL4AvwDBANkA5QFrAO4A/QD/AQgBCQEKAQwBJAElASYBKAGZAT8ClwFVAXIBcwF0AXYBjgGaAZAAOwDsADwA7QBLAPwATwEAAFABAQBSAQMAUQECAFMBBABWAQcAXAENAF0BDgBeAQ8AZwEYAFoBCwBoARkAaQEaAGoBGwBrARwAbwEgAHIBIwB2AScAeAEpAHkBKgB+AS4AegEwAH8BMQCAATIBMwCBATQAgwE3AIIBNQCEATYAiAE7AIoBPQCNAUAAiwE+AUQAlgFKAJcBSwCYAUwAogFWAKoBXgCsAV8AqwFgALABZACxAWUAswFnALIBZgC5AW0AuAFsAMABdQDCAXcAwwF4AMQBeQDFAXoAzQGCANYBiwDaAY8A2wDgAZUA4gGXAOEBlgCjAVcAzgGDAD4A7wB7ASsAmQFNAMYBewDHAXwAyAF9AMkBfgDKAX8AbAEdAKkBXQC0AWgAugFuAl4CZgJrAm0C1wLaAtgC3ALUAtkCYAJnAmwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC/AL9Av8CVgJYAlkCXwJhAmQCaAJpAFQBBQBVAQYAbQEeAHABIQBxASIAhQE4AIYBOQCHAToAiQE8AI4BQQCPAUIAkAFDAK0BYQCuAWIArwFjALUBaQC2AWoAuwFvALwBcADUAYkA1QGKANcBjADcAZEA4wGYAD8A8ABAAPEAQQDyAEIA8wBDAPQARAD1AEUA9gBGAPcARwD4AEgA+QBJAPoASgD7AF8BEABgAREAYQESAGIBEwBjARQAZAEVAGUBFgBmARcAfAEsAH0BLQCaAU4AmwFPAJwBUACdAVEAngFSAJ8BUwCgAVQApAFYAKUBWQCmAVoApwFbAKgBXADLAYAAzAGBAM8BhADQAYUA0QGGANIBhwDTAYgA2AGNAN0BkgDeAZMA3wGUAfoB+AH5AfsB7AHtAfAB7gHvAfECCgILAf0CGgJdAiQCJQJiAoACeQKsApUCmAKpArYCxAADAAAAAAAA/7UAMgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQETU291cmNlQ29kZVByby1Cb2xkAAEBAS769gD69wH6+AwA+vkC+voD+BQEjAwBRvwk+VX6fAUcMkMPHDS9EcsdAADOrhIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW2xbqQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCb2xkU291cmNlIENvZGUgUHJvAS4CAAEASACAAKYAxwEKAVsBpAG+AfMCSwJlAm4CcgKMApYCswLXAuQC8AM/A0cDZAOLA64DswPNA9cEDQQZBCkELQQ6BIIEmQThBOwFdAWB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AEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAABAAEAAQABAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAACAEkAOgA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ABAABgBDAEMAQwBDAEMAGQAvAC8ALwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANAA0ADQANAA0ADQANP/uAEgASAAGAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AKgBMAEwAPgA+AAwAPgA+AD4APgA+ACQASABIAEgASABIAEgASP/SAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAMAC8ALwAvAC8ALwAvAC8AdABkAHQAaQBpAEEANQA1ADUANQA1ADUANQA9ADEAMQAxADEAMQAxAD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgAEAAQABAAEAB8AHwAfAB8AHwAfAB8AHwBGAEYARgBGAC8ASAAqAEgALwBIADQANgA3AC8APAAgADQAMgAfAAQAHQAPAAcACwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvABcAOABSADMAKgAjAC4APAA+AD0ANQA4AFIAMwAqACMALgA9AD4APQA1ALgAtgC4ALb//wDIAMgAYgBnANcAUgC4AMoAMwBFAMoARQCvAMAAKgA7AEYARgBQABQAUAAUALgAiAA8ALUAfgDJAGkAagBpAEoA6wBKAOsAQABZAFkARwAwABMAEwBl//P/9wAfAB8ARgBUAHwAfABAAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCYAMQAngClAKEApQChALEApgCkANYAxwDtAOMAmADEAJwApQChAKUAogCxAKYApADWAMcA7QDjAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCaAIAAhQCaAJoAqgCAAJQAtwCFAJwAqQCFAKAAtgBzAJwAhQCaAIAA1gCRAJYAkAB2AFMAfACBAJcAlACUAJQAgACAAJwAJABAAEMAHwAtAGAALgBPAEMAGwAVAFsAFgBDAE8AWAAkABEAEQAR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) format('truetype');
59}
60@font-face {
61 font-family: 'Source Code Pro';
62 font-style: normal;
63 font-weight: 900;
64 src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATq8AAAAOkNGRiDcZxQDAABI+AAA1VlEU0lHIymbLAABOvgAACBYR0RFRi8sL9AAASXcAAAA1EdQT1NOSdIWAAEx5AAACNZHU1VC3Z7yFQABJrAAAAsyT1MvMnTI07UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk+7OHeAAAAOwAAAA2aGhlYQZMAOAAAAEkAAAAJGhtdHh8E3yCAAEeVAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZbSud8oAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWpUd6D1fDzz1AAMD6AAAAADNFZ/zAAAAAM0Vn/P/sP5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP+w/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAOEAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwgJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEJsYWNrUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1CbGFjaztBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tQmxhY2tTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9CbGFja1R5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAQgBsAGEAYwBrAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBCAGwAYQBjAGsAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbABhAGMAawBTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AQgBsAGEAYwBrAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCbGFja1NvdXJjZSBDb2RlIFBybwEPAgABADEANABbAIwAsQDKAOYBDgFOAYQBnQIZAk0CrQL/AxEDJgMtA0oDZAOBA5QDzwPcA+AEEQQtBEsEUQRzBJkEvATHBMwE1gTiBPgE/AUWBR4FOQVJBW0FegV/BYcFkgXOBdcF6gX5Bf0GBQYIBhIGGQZzBpkGogbYB0EHRgdPB2sHggeHB6kHvAgcCDwIcgh2CMIIxgjKCOMI9gj9CQYJFAkXCR8JOglBCVoJYgl8CZcJoAnkCe0KBQoRClEKcQp/Co4KlQqdCrYK4QsUCx4LIgs0C14LbwuLC5MLnAujC68LtAu7C8wL9gwNDDMMSQxZDF0MYQxwDHcMlQypDK0MsAy3DLsMzQzfDPAM9wz9DQwNGA0fDSMNLw0zDTkNPg1ZDWkNdg2ADYoNjw2XDZ4Now2+DcsN4w37DgoOEA4VDhoOMw4+DkUOUA5bDmEOaQ5vDoAOhw6PDpgOrQ63DsYOyw7YDuUO7w75DwMPCg8RDxYPGw8uD0EPRg9ND2EPdQ+HD48PlA+aD6APqA+uD7MPxA/ND9IP1w/bD+IP5w/yEAEQBhAWEB4QKBAwEDcQPRBDEEcQVhBlEHQQgxCIEI0QkRCWEKQQqhC4EMYQzBDRENoQ4xDrEPQQ+hD/EQQRCREWESMRKhEyETwRQRFGEU0RUhFXEWMRaBF0EXkRgRGNEZkRnRGnEawRtBG6EcARxRHKEc4R2RHjEe4R+RH/Egj3bveQFeOxq7WjoYV5nx77TAdveHaDbxtabq3lH/tEiRX7Nt8n9xC3v6OtrR6PBgsV3gqXVwX3IPeqBvc4L9H7Ijc9c2E/Hsf7BAWnx7WZtRvDrXtnkR9QHQu1944Vyh33GPcS6/c69zr7Euv7GPsY+xIr+zoe90QW16O7xcWjWz8/c1tRUXO71x4LxfeQFfs21SX3Pvc+0fH3Nh74Ivs6/DYHU3hjVFR6s8Mevh0HC/c4mRWtqaf3Do8eSwd3cGx5YxtneZiiHwvdj8+r0xrBYbH7Ho8edzcFxYef9xUdeYZ1iB4LFeEGs5WYl6ClqVe9G8u9uvcBmR81BmOBfn92cWy/WhtLWVz7AX0fDvc75NPp5S2wNqIfS5xUlqUan6CTv7u6d3G5HtfxBaxWQbAtG/smLUspOehh3XMfzHjFfnEad3WBUFFToa1RHgv3S1UVmZOVnJceh5yfibIbvQa9p4dxb1p5SEhdmasf+x9vFTHwafcQ90/3C9X3AOc/sfsYHgvhFvhW9yT7qvcI93j3JPt48feg9yT8TAYL9yo59zcT9hApHRP0oDYGU3WToZmPkZeUH4ajoImdG/cL57v3Cp+En4SXH+X3EPteBhPtIJNybY9tG/sIIlH7EFGpXbFzH4cHE/SgaHNyZ2kaYaFxp3kehwcT9hBZc3FsYhoT7SD3g/fqFWpwobu5pqGsrKd1XVtvdWofC8cW9zj3UAbbe+mD1R6PBsD7JfcB+7cF90L5Hvs4+1AGO5spk0UehwZW9yb7Afe2BftCBgsTzoBEHRPWgPhq+xoHE86AfVkFhwa1Z1+fWRv7BCcn+yz7IN8j9xC1vpunqh+HWQVohWtuSRtlVZWjXR/3PPdCFV1psNIfE+aA1rWusaWhhXmfHvswBxPOgG13dYNxGwsVl5OYlZEepYSbf3waf3+BeXp+lJseE9hBChPk+yj7DBVYxGLc3cO2vLxxnmidHo8HE9irmaCbrBrEUq9CRFBnUmKhf6l3HocHE+Rue2x5YRoOv6+xvb1nsVdXZ2VZWa9lvx8LFVtRBYcGW8X3Bx3r+xAF9zwG6goOFbvFBTIKC2uDfYF7b2W1VRtVWV8lfx/hBquTmZWbp7FhwRsLzRb4aPck+yj3/vco9yT8aPsk9yj7/vsoBgsV8rzX4/cHCmGGeW1mG2Z5qbWGHy0GM428P/IbCxX3DAa7v9cKV9gdK/cKBfsoBgvJ944V+zr3Div3Ms3coL7JHkf3AAV2aWJ2WhtFWLvX17+71qurgnKwH9n1BbNhRqU9G/sv+x4r+zofCznFQ/PJxqevvB6PBgt/PB0LFWi/uom0G9vFvsgfE+jHYa9JHhPwf3mJiYMfE7CNoQX3F+/7cwYT8H77NwUT6HsKDrl/lX19GnFpf12HHpdJBfGP46vTGrVzoWmXHguloWfBG7e1reOVH0MGcYV/gXtxda9VG19haTOBHw73ICBLCgv3KPhsFZKAlHp3GmJyf2qEHppqZ5JmG/sY+xIr+zrKHR8LFeHNz/LyScs1NUlLJCTNR+Ef5QR5eZzLy52YnZ2dfktLeXp5Hws3/DYGU3hjVFR6s8Mevh38Igf7NtUl9z73PtHx9zYe9+UHC/cYKHb3cvG/9xwLAUwdAwt29x73GfeP9xQLFftCBjP7QgX3EAYL9xR3FVP7CAVlx919vxv3R+ba9x8fC39OCgtYChO8T/vWBiMKE3x4CvhUBhN6xZ21s81NHUsd92o9ah0L9wJezDhPX2BIT7RkxZGRjIyRHodOZWFCbQgL1fgCFfdS/AL3QPiI+/4GC1EdTvfhFZW4mcmc2ZnNGY8Gm0qcPJlNlV4YvPgPFZMK90oGDrVNBfMGO/cYBfscBgv3cPc0Cxqve6t7nR4O5be52ZMfLwZZCg5cCt33QhK190L3KPdAE49EHROXigoTj2VVlaNdHxPn9zz3QhVdabDS1rWusaWhhXmfH/swB213dYNxGwv7eH8zUfsEGgsVS11hT0+5Y8vLubPHx121Sx8LWAoT+D8dE/TVmcO02U0df1cdC3/3HveM9x4LQx0O9yT3CPck8fckC/cm+wWuHQv7VPxWFZeTmJWRHqWEm398Gn9/gXl6fpSbHhNDAEEKE4SA+yj7DBVYxGLc3cO2vLxxnmidHo8HE0MAq5mgm6waxFKvQkRQZ1JioX+pdx6HBxOEgG57bHlhGg4V07u1y8tbtUNDW2FLS7th0x/JBHZ6naWlnJ2goJx5cXF6eXYfDvcW2/cE0/cWCxXFBs+veVNTZ21HH1EG+AL79hX7IfeQBcqttcjoGvc2+wy7+yAe+4b9HvdA927JBvcE+24FDn/3FPc49wz3APceAcH3MfdL9zAD98z3CBVpXp/leh+yrK2arBu3rXdTSGJ2Yh/3evhWFbVfQrEsG/sh+xv7Avt6+3r3GzP3E/cR9wHb9xz3HDPH+wBiUHRhYB/3FZLHt88bs7V1daMfDvdwVQoL+Kj4iBX7QAYLwBb4hfck+7EG9674JgXz/Gf7JPeTB/uu/CYFCxX3Aga3wwWPBrdTBfcCBj33BgX7MAYLf0AdyQsV+wCzP889HufBBVfLbdPTGtOp07/LHi/BBUc9Yz/7ABoOrfckBZdvdpNdG0BDZzlbH4cGC/eY3fc46AH3KfcG1vcLA/cp9/YVVrRay66sm6KmHo4Gk2wF7PdLBvcCUbk0V1Z7b1setT4Fnq6olKIbp56CdY4f+xp+VGRGGvcGlRWcnZvEkx5hB3+Ae4J5G3iAk5kfDhXjo7vF3RrPb7FZY2tvZWGsc68ejIyLjBtkb3dVeh4O90ATroC1944VE86AmgoTroBwChPWgPdEjRXjsau1o6GFeZ8e+0wHb3h2g28bWm6t5R8TrQALaQobC/eY46gK94v4PxXEo56hmZ+HgJce+woHeYB8h3obb3agxR/7DokVIMNJ3qium6GhHo4Gk20F7PffLwaBagWIBqhybZdsG0FHSvsBHw5NUR0LFUoKCxXlt7nZkx8/Bm2De3dhG2F7n6mDHz91HQsVUXO719eju8XFo1s/P3NbUR8LQAr7hPc0CxX3tPcA+7QGC+sW+FX3JPup+I77QAYLRwoOrfdE90j3RAv7ArhK3se3ts7HYrJRhYWKioUej8ixtdSpCAtMHQFACgMLFfMG7fcuBfsaBvcE+y4V8wbt9y4F+xoGDgY9k7dd5RsLxRb3QPeW9yD7lvdA+R77QPuG+yD3hvtABgv3MR3p90IS8/dAE6y0ChPMgQoTrGMdE5zWHQsSwfc49yz3QAvFFvcc9y0G2H33RYPXHo8GvvtVrfsJBdUGrfcJwfdVBY4Ggz99+0U+Gvst9x75Hvs9B1f7aHk3BYgGed9U92gF+z0GCxX7tPsA97QGDuXBy53vEv8AxYAA/wDlgAAg9wwTqPc2C/cAJ/cAt/cAJ/cAC/fcB6WUlJeXG5iSgnYf++T3FvfcB6WUlpeYG5iPgnYf++T3NvfwB+9hy0VTZmVhfR6/gGunYhtQbWlkeh+HBgsVq8cFbZOBlZsaoa2TuY8ef80FJYcza0MaV6tx7YMeDtj3StoS9zZ8HRPk96IL9zL3APcS92r0cd5dxB8Lwh079yAVC8X3QPcm9zoL95/3Zftl+EES90L3BxNg9/33Ix0ToHIdDvto92oB92L3BgP3YvsKFU29a8nlHR6zCnd3laOnmaOtpx8vBnN7XV9PGg4H+yZ4KWD7Aho+wEjVwq+jr6MejwaXWwXlBvt09xwVsaSb2JcePQd9enp/cRtwfJqiHw4Bi/js9wYK+OwLFl0KCxX3Kx1N+xAF91AW9wYG9ysdDhUT9bOnqbGxb6ljHxP5Y29tZWWnbbMf9yIdHxP6Y29tZR8T+WWnbbMeC/cQ984rBml2doJVhQhC3AcO+XwV9yQG3/cGBfsGBmNTBYcGY8MF+wYGv9gKC/cKCvuE9zQL9wYdJHb5OncLAfdq90ADC/jg9xEK9zD44G4dDvmAQx0LAUAKA/cgC+Wz0rrlAfc09wDL9wQD96ALA8QW90H3NgbJ4/cK+44F91EG+2P4FvdT95wF+1EG+zT7hgWH94b7QQYLFdNL90b3LAX3QAf7RvcsQ0v3FPtCBQsV07uzyclbs0NDW2NNTbtj0x/JBHZ6m6OjnJugoJx7c3N6e3YfDsGrQ98bzcm39wC5HyW7BVl5cm1wGwvl9zLlAfco9wjT9wgD98ALi6kdC/jSXgrvEvdD96T7cfcVE6D3dgs9jblJ6xsLFeu5zdmNHxP8LQZth3x1bBtsfKGphx8tBhP6mx0OyRXLubPHx121S0tdYU9PuWPLHwsGmx0LrwoO95r5RKoKC1UKOwvv9xTtEvc896H7FPcKE6D3PAtRsV3JybG5xcRluk1NZVxSHgv4FPlQFT33EPcuCvcO+xAFC8f3NPchHQu1yQWPBgv7NP0A+zT3FQr9APsgBg4V9zAd+yD4YPs0Bgv3JPf+9yQL+8AGDpsKqfcGCqkGbb0FC/mMvAr7XPp8AQt2+Ih3C/cKXNExRVRdSEPFYskejo2LjhuMVGBbMm4IDvhB+2X3ZRL3y/cHE6D3gwv5SvccqfcQEvcUvR0Li/ce9yT3Htt3C3b3/vcqd59/dwuvFb0KC/hs9wz8bAYL+LD3cPfUC+8K9xoLGvcSLN37HCdLa0VGHuYvBamtsKm6G8OvcFILUx3p90J3Cmv3GBN8C/lQFev3EPcHHVtRBYcGW8X3Bx3r+xAFC/dMB6WjoJWmG7ykaTkrZ2thdHORnXYfDhX3BAa/91qo9zYF+0AGC/cc0/ccC/g2+0ALwfciFQu59xoFjwZ/+wwFO+v30PsIB201eUcFhwYLf/co8fcg9xz3KAtACgFACgML9yIB93r3IAP3egv4oAH3qPcKA/geC/s0/QCqHev3DAX7EAYO+8D3Lx0LUwrH/CQV9zQcBXj7NAb31AvbHfcm90QL+zr3Eiv3GAtsCtH3EPcJCgv3VPcSAdv4TAPb91QV+Ez3EvxMBg73NPhg9yD3NKodE6A79yAVtgoGE2D3Hh0L98BpHQsVvQf8zvpKBW0G+OwLBXd9X2NPGk29a8keC3b3bvcc9zT3HAsV+xNTTzX7BBoL9xgB98LZA/eIC/tw+QD71At+9QX7IQYL98B/FQsF9wwGCxVLuVzLy7m6y8tduEtLXV5LHg4Vy126S0tdXEtLuV7Ly7m4yx4OEsv3QAsT6EkdE/ALmZyWlJ8bp5R8Zx/7UPcL918H3Qv7JjlCbVdKHuEjBa23r525G72pCxX4yI0G+6z4qgWHBvus/KoFDvUKEvdS90AL9yjyCgvJCjH3GAv71Pyw6x33oskV+xAGC627maGnC/0A9zQLjQb4qvesBY8H/Kr3rAWJBg4V9wX31PsFBgv3QnYKCwX3FgYL+3AGDmMKvfcbHQtACkEdCxWpBvve+LoFWQcLFfdA0wfLr3VRUWtpRx8OO/dwFQv40hUz90IF+0IG9x77QgUL9zT7cPkA4woV67nDz40fPQYL9zT3UPs0Bgt/G3d3laML+VD3EAEL+2jvYHYL/OwGDvcaAfft9zcDvxb4fPckC5nBBY8GX7K4dbgb9wHzC2B6oaOFHz0GR425U+sbC/EBo/cIy/cQ8fcOA/i8C/tQ9xoLBfsWBgv7NAYO4h0T+Av7EgdZbVp5P30IIfcVC/ckHfhgC/c8Afd990AD+Cn3HhUL9zAS9wr3ME/3QE/3MAv3Jh33IAuuHcoKC3b3lvcq94Z3C3b4Avcm90x3CwH3LwoD98ALFfcF9zT7BQYL99gV8wYLgXsaewv7WPcAC10d93ALgcv4pOkBbMv4jOkDCwGs9xrN9xrN9xoDrAtjCsmpHRIL9yb7BfcPHQv3cBX4YPc09wAK9xMKEgv5AEwdC/dw/QD31Av3EL4KC/c09zQL92QWs6epsbFvqWML+UzTHQv3IPxg9zT5APvABgv3MgqvC/wkHAV4QR0LB/cr1QXnB/srQQULV8HYZfcBG/ca9wwL+QDFHfsy+x74ZvceBw7n9yAdC/cp95gV9wsLEvdq90AL9yD7C3YL+LD7NAv3wPc0C6CzHQtht9Rl6hv3IfcbC/cFClHFUfcMEgv5zBX7vPsA97wGC/cc+wT3vPsE9xwL9173Eh0LIfiC9yT7qAcOAQABAAAiGQBCGQCuAACrAQCwAACtAAGHAQCvAAGJDQCKAAGXAACxAAGYBwC1AACyAQGgAAC0AAGhFgC5AAC2AQG4AAC4AAG5DwCMAAHJAgC6AAHMAwC+AAC7AQC/AAC9AAHQCgCNAQHbDgDAAAHqCQDEAADBAQH0AADDAAH1FgDFAAIMAADGAAINBADHAAISAQCaAACdAAIUAADLAADIAQDNAADKAAIVAQDMAAIXDQCQAAIlAADOAAImBwDSAADPAQIuAADRAAIvFgDWAADTAQJGAADVAAJHBgCRAAJOCQCSAAJYAgDXAAJbBADbAADYAQDcAADaAAJgCgCTAQJrDgDdAAJ6AwCVAAJ+BQDhAADeAQKEAADgAAKFFgDiAAKcAADjAAKdBADkAAKiAQCnAACiAAKkAwRhAARgAAKoCQBtAQKyHgAHAAARCQLRCQAPAAANAAAbAQB5AAACAABgAAAgAAB7AABoAAADAABBAAAIAABpAAB3AAB1AQBrAQBqAAB4AAAOAALbAABvAACJAAE6AALcAAByAAB0AABAAAAJAQA8AAA+AABcAABeAAAQAABdAAA9AACgAAALAABwAQBmAABzAACqAALdAAClAACZAALeAAAhAALfAAAEAALgOwCLAAMcAACPAAMdHgChAABnAAAFAABiAABkAAM8AABhAAM9AAEsAAM+CABjAANHAQAGAAB6AACeAACbAACjAAFEAQFAAwAMAACmAACoAACfAANJAAAeAAAdAAAfAANKAQCcAAA/AANMAABfAANNAACXAANOJgB8AgCIAAN1BAB/AACDAACAAQCEAACGAACCAACFAACHAAN65QPDAgABAE4ATwBdAMQAzQDdAOgBDQEbASsBMgE8AUUBUAFiAXABeQGdAgcCEgIgAikCMgJqAnMCwQLIAtIC6AMjAy0DYQNtA60ELwQ/BFIEbgR7BIsEqATBBMoFEgVyBYoFogWuBcYF+QYCBk8GZQZ0BoYGmQazBtEG6wcCByAHVQdpB3sHjwf6CDIIbwjACOUJFAlECXYJsAnZCiUKfQr0C0sLXQtvC4ALlAusC8UL3wvhC/MMBwwaDC0MSQxgDHMMiwyjDLkM1Qz7DRkNPg1aDXoNsQ3IDd8N+g4eDjQOTw5vDocOow69DxMPIg8yD0IPWw9tD4YPlg+wD78P2A/uEDwQTxBkEHgQnhC4ENIQ6hEJESIRVxFzEYoRoBG/EdsR9RIQEigSOBJKElsSdRKSEqwSvBLMEtwS9BMPEzMTTxNxE5ITtRQfFHQUpRSuFLcU+hUVFVYVxhXYFekWIRY+FmwWgRaYFq8WxRc8F1gXcheMF/gYCRg6GFMYbBh+GI4YoBixGMsZARkQGSEZOxlLGVwZshndGf8aWhp2GpAa3Rr2GwEbDBs6G1UbfxuPG6EbshvGG9Qb5BvzHAQcHRw1HE0cZhx5HIscnhy0HLYc3h04HVMdbx2LHaYd2x4DHi4efR6YHr4e5x8hH1sfkh+8H+8gGSBDIHgg0iELIXgiHSKVIuci+CMJIxojMiOQI6AjsiQrJD0kTiRhJHMk3yT6JXkljSWgJgYmGCZDJm4m5ycAJxwnnyetKDwoUShmKHIoiSiWKK0oySjjKUMpVSloKXopiym/KdUp7Sn/KhkqNyp0KqQqryrGKt4rDSsmK04rbCuGK58ryyvlLDEsZyyILKgsxyzrLQ8tNS1XLcwt2y3rLfsuCi4rLkMuWy5qLnkujS6mLsou7i8VLzAvSy+2MEIwbjCBMJYw1TEQMUYxujHCMecx7jIUMk0ybjKOMq4yzjNDM2szkDO0NCk0RDSmNME02jT1NRg1MjVMNWk1hTWyNdA2EjZaNnY2kjbKNug2+DcMNys3UTe3N+I37zf8ODo4djilOLU4xjjXOO45DjkuOU45dDmYOcQ55zoGOh06NDpSOm866TtDO1M7wTvWPDg8fDzMPSQ9Jj1qPck+Dj5QPoU+7j9MP4U/30BFQFpAeUCYQLdA1UEHQTJBW0GHQaZB0EH8QjlCdkKwQtxDDkNBQ3RDqEP3RCxEqESqRLNEzkTnRQBFB0UiRWRF/0ZTRmVGiEbYRwxHUUdTR4RHhkfnSDdISUhqSL5I70k5STtJa0ltSdNJ3En8Sg1KREpiSopKskr/S0tLXEt1S3dLhEugS6lLtku+S81L3EvwTANMBUwHTAlMC0wNTA9MGUw4TExMikzFTORNAU1jTcRN3k3sTgZOHk5VTnFOq09BT21Puk/+UG9QrFEtUWNRlVHoUh9SIVIjUqdSsFK5UtFS3lLmUu5S9lL/UwdTD1MXUx9TJ1MvUzhTQFNYU2VTbFN0U3tTg1OKU5FTmFOfU6dTr1O2U71T4VPsU/NT+VP/VAZUDFQTVBpUIVQnVC5UN1RAVFhUZVRtVHVUfVSGVI5UllSeVKZUrlS2VLhUulS8VL5U81U2VV9VaVWiVlxWgVawVvpXMVdkV8hX9Ff2WCdYUFiNWOZZIlljWZVaBFpUWqZa2FryWwxbXVtfW8xcBFx3XOZdPF2WXhBeal7iX4pf4GBgYLVhM2HWYl1iwmMiY3pjh2OUY6FjzmQHZHJksWUgZVRlzWX4ZiZmkGbTZvlm+2cvZ3Fne2eUZ79n6mghaFpoi2i/aQJpI2lcaXZp1GpfasdrMGuTa9RsCGxxbKJsw20sbbBt224HbjNuXm51bpBu5m8Sbx5vOG9Eb19veG+jb79v6nAKcGRwn3DscS5xP3FUcVZxY3GNcbdxuXG7ccxx3HHxcfNx9XH3cgxyHHIycjRyRXJPcl9yaHJqcmxybnJ7cn1yh3KYcqZytnLQctJy4nLzcwFzCnMaczBzOnNMc1pzZHNuc35zi3Obc6hzznPxdB90TXR5dIJ0jHSadJx0nnSgdLx043TtdQZ1JnU8dVZ1aXV5dYV1oHW0ddd163YEdiB2RnZddnt2lnasdsd23nb4dxh3RXdld5Z3yHfdd+x37Xfud+938Hf7eA54HHgpeFF4eXimeMd45nkBeSN5RHlSeWF5bnl6eYd5k3meeah5tnnFedR543ntefV5/XoFehR6JHo+ell6ZnqEeqB6rHq5esV61Xrleu97CHsfeyh7NntMe197cHt7e417mXuje6t7vXvOe9l733vwe/98C3wZfDV8VnxofHx8jnyZfLZ82nzxfRF9L31HfVd9cX19fZl9tX3Sfe5+An4OfhN+L35GflN+bn6GfqR+vn7UfuB+7H8Cfwt/KX88f01/Z3+Ef55/tH/Rf+9//4AUgDKAToBmgIWApYDHgOiBBoESgUOBToFfgWyBd4GCgZKBn4Gqgb+B0oHpgfqCDYIYgiOCLoI5gkSCT4JagmWCdIKDgpKCn4Kugr2CyYLUguSDGIO4g8uD3IPtg/iECoQbhDWER4RchHGEiYSci/P4WPMBo/cE99z3BAOjFvi8+Sj8vAb3BPx8FffkB937PAX3OBbd9zwF++QH+3hHFaXDr+sFjwavK6VTBUn31BVj63mv2B15Z2MrBQ4OoEIdAYv47AP3g/ejIQqL9xj3IvcM9xD3GBLX90D3Cvc8+yD3PBP01xb3fgb3IPcExfca4V27L50fjwcT+NefrcvDGvcU+wCt+xwe+2oG90D7lBX3ELEHw6N7Y2Nzb1MfZfuaFfciBxP0vQbPp3dbW29xRx8ORR0BvvdENAoOi/cfCgHF90D3LPdEA1QKDotWHQHh90ADKh0OoHb3gvck9xD3JAHt90AD7Rb3QPeC93r3JPt69xD3ofck/E0GDsEdAbP3RfdK9y0DJgoOoPcQHQHF90D3IPdAA3YdDpgdjh0zHQ5/9yj4BvckjgoOrAoBxPdBkx0Oi/YKAev3QANvHQ6gdvh39zsBxfcc92b3HgN5HQ6sCgHH9zj3LPc4AywdDkUdAXEdAyAKDqB292L3HPdA9xwByvdA90D3PAPKFvdA92LrCvuQBvdA+8jvHftM9xz4xvcoAar3RPdG90QD97z4lhXDrEf7CvsKakFTU2rV9wr3CqzPwx/3nPy4FYR9d4R3G2Ralrd0H/G2y/cF9zka92kg9w37MvsyIPsM+2r7RNP7CPcFZx77AbbpQPcZG7mvlZmhHw73NArTCvd6+JZbHUUdAc/3Qvce90QDJQoOoPcsCo4deQoObAoBgh0DJB0Oi/c0+x/NChKP+OQTcPdYFvdkBvdU+R4F+0QGSfuwBROwekZ+SHlFCIcGedF/znnQR/ewGPtKBg6kCgGN+OktCg6sCgGP+OQDjxb3TAbD9wibrZqtmrMZjwacY5ppnWnH+wgY91QG+1D32vdF99gF+0wGXSF+bXxnfGEZhwZ4tXyvfKlX9Rj7VAb3RfvQBQ6sCo4dKQoOmB0BwPiFA18dDn9AHXgdE3y/HRO8Nx0TfCIdE7wlHQ5/9y4drHb4CPcg90x3yR0TPssW9xoGE173Ax3t90H3LT3v+w1eXXlrZx+P0wX3NvtABxOe90D8tBW7HVQdAcn3RAM2HQ5/ogr3JvdAE161944VE56aChNecAoTrvdEjRXjsau1o6GFeZ8e+0wHb3h2g28bWm6t5R8Of1odAfge9zADIgoO9ysK9xoB9173QAP44Pk+FZdjVZlPG/s4Ry37BB+JB/sUhQX7FPcU/AL3QPgC9zL3GvsyjQfAp57Br6+DgaceDmUKdAr3IPcqOfc3E/RAKR0T8YA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT6oCTcm2PbRv7CCJR+xBRqV2xcx+HBxPxgGhzcmdpGmGhcad5HocHE/RAWXNxbGIaE+qA94P36hVqcKG7uaahrKyndV1bb3VqHw6g9xEdAcv3QPce90ADUAoOtx3J914S9373cPtS90DcHZUKDvcGHfg49xrJ914S9373cPtS90AT6GsKE/CVCg6grh33bHcBy/dAkgoOf/UKAfdS90ADwfjGFTMKDqCdCqv3JwoUDhOepRb3NgYTzn0dE65/yAX7FQYOoJ0K2x33HvdAE7jLFvdABhPYNQoTuMYKDlQdAaUKAyMdDvsvdvc49y4d+BT3IH93yR0Trvd6sRVrrLJ5thv3AfPt90AfE7b3Lj7v+w1YWHNpZR6HBhOuf7kF+yD9OPdA9x4GE9b3UgS7Hfsvdvc49yD3iFEKbQoTzrX3jhX7Nt0n9xO0up+pqx6ERAX7I/dABxPW+Tj7GgcTzn1ZBYcGt2RjnVUbIiOmCvdEjRUT5uOxq7WjoYV5nx77TAdveHaDbxsTzlpureUfDvcxHRLz90ATqLQKE8iBChOoYx0TmNYdDn/WCgHY9z/3E/c/A7nLFWHL6WnhGygdDn/UCgH3NvdAAzAKDn/3Gx33GPdAE3heHRO4+9YHIwoTeKkKDov3EvgKdwGj+LwD92AW91oG90L4iAX7OAZK+258WX9XfVUZhwZ9wX+/fL1K924Y+0AGDrIdAY346CsKDqCuHQGm+LUDphb3Rwaw0ZiomqiYpxmPBpxvn22cb7lFGPdMBvs794T3MveYBftHBmpFgG99bYBvGYcGfKd3qX2nYtEY+0wG9zH7hAUOjR0So/i+E7DsWxUTcG37FgUTsCQKDov3Gvd89xoB0fhvA18KDqBCHb33EAGL+OwDpB2C/EEhCqBCHb33EAGL+OwDsAr7BfxBIQqgQh299xABi/jsA/e++YoVMgr3FgaA/EEhCqBCHb33JgGL+OwD+B754hUyHcG9t/GXH/uF/NMhCqBCHbfiCvgo+UoVXQpXCvtkhx1XCrb8OyEKoEIdzfcAAfcs97wD+FT3NB37ZfxRIQqgQh299xABi/jsA/fy+cwVWQrlt7nZkx/7X/y9IQqgQh25ydvBCvnaFaCce3Nzent2dnqbo6Ocm6Af+yIE07uzyclbs0NDW2NNTbtj0x9O/D0hCqBCHb33EAGL+OwD+BS6HaL8QSEK+5z3Xt5CHQH3UvdwA/fATUodoEIdsc3B3wH3tvcOA6AdgPx3IQqgQh299x4Ki/j/E+z4//oSFfsWBhP0R/sQBesG+295FY8Gu1fYHSv3CgX7KAYr+wrYHYD8QRWVuJnJnNmZzRmPBptKnDyZTZVeGPsz+A8V+1j9HgX3RAar9x4F90YGq/seBfdKBvtY+R4FDqBCHb33HgqL+OwT7PjD+ZYVR/cQ9wcd8fsQBRP0+zl5FY8Gu1fYHSv3CgX7KAYr+wrYHYD8QSEKoEIdvfcKRb/BzxL4YvcAE/b4UvmAFWAKE+57f4Z7iB4T9vscWxWPBrtX2B0r9woF+ygGK/sK2B2A/EEhCqBCHb33Cq/3DgH3JNP3PNMD+BT6ZBVxhX+Be3Ftr1UbX2FpM4Ef0wa9CqWpZ8Ebt7Wt45Uf+zL7dBWPBrtX2B0r9woF+ygGK/sK2B2A/EEhCvuc917eQh299xASi/js/C73cBN89775ihUyCvcWBhP6vf2OSh3QCq+ZAYv47AP4S/o6FfsSBk/7EAXfBqiZFW2De3dhG2F7n6mDHz/ICvtf/L0hCtAKr5kBi/jsA/fv+b4VT3wK+xIG8fsQBfKZFW2De3dhG2F7n6mDHz/ICvtf/L0hCtAKrZvlzwH3rPcAA/ec+bwVYAp7f4Z7iB73BmcVbYN7d2EbYXufqYMfP8gK+1/8vSEK0Arb9w4B9zLD9zrVA/gQ+mQV7grmCvu8+ywVPZO3XeUb5be52ZMfPwZtg3t3YRthe5+pgx+Q/L0hCvuc917eQh299xASi/js/C73cBN89/L5zBVZCuW3udmTHxP6+yL+Ckod+3j3AvcfQh0B+BL3EAP3g/ejFZW4msmb2ZnNGY8Gm0qbPJpNlV4Y93X8CxWEgn2EfBt3e5ehs6+3xR/7WPkeBZMKuwZreldbSpAKDov3JH/3GYj3JO/3JPsU9xQS98n3KxNM94b3nRWh3pe/m8eZyRmO+5UGE7T3K/sNFfcK9vckIO/3FPck/CYH+1L9HgX3RAYTVK73GAXxBhO0+xj3s/ckBw6L9w6/2D7bve/3EPcOEtf3QPcM9zj7Gvc4E733jPcOFb/n2y+9vQfPq3FNT2ppSB9Z+CoVE76xBsOle2NfcHNUH2UGE733RGcVE97XnqvCvxr3DCGv+xwe+2r8IAZBhQVB1ftC934HE733IPcEyPch512+L54fDvt0zfdBdvic9ygBvvdE5vcOA/h191AVbW9pdWEbM03P9w73CsnR27epe3GpH+n1BbddR7M3G/tE+yL7EPtu+1P3APsA9x5wH2hFBTodl6jQksqqvMQZDkUdsfcQAb73RDQK+HP4jEgKDkUdsfcQAb73RDQK95P4EDEdDkUdsfcQAb73RDQK9/f4jDAdRR2t90ABvvdErPdUNAr3xfgMTQqL9x8KvfcQAcX3QPcs90QDVAr3BvlCMB1jCsn3HwrbCln3cHn3RBN0VAoT6MX8JiEd9xYd4/cfCtsKN/e0V/cgClQKE+j3Xvt2eh1nCotWHb33EAHh90ADKh33SL1+CotWHb33EAHh90ADKh34KvdCSAoOi1YdvfcQAeH3QAMqHfdKvTEdDotWHb33EAHh90ADKh33rvdCMB2LVh239zAS4fdA+w73ML/3MBPoKh0T9vcUtzYKi1YdzfcAEuH3QDP3vBP4Kh0T9N/Nnx2LVh299xAB4fdAAyod93y9FU4di1YdufdAEuH3QGf3VBPoKh0T9Pd8uU0KYwrJVh0S4fdAV/dwE3gqHRP093r+JiEdi1Yd9zLfAeH3QL33DgMqHfdWsaoKDotWHb33JgHh90ADKh33vL0Vwb238ZcfNQYyHQ6LVh299x4K4fdAE/QqHff19wwV6wYT7PH3EPcHHRP0+/v7VjUdDotWHb33Hgrh90AT9CodE+z4O/eI7QoT9PxBRTUdDotWHb33Cq/PAeH3QPdy9wADKh34Du0VYAp7f4Z7iB77xCc1HQ6LVh299wqv9w4B4fdA9yTTAyodyb01HYG0HYMKYwrJVh299xAS4fdAV/dwE3wqHfdKvTEdE/r3Rv5YIR37ePcC9wpWHQHh90DL9xAD4Rb30AZqd1xcTIsKtLG2uR+R9yT7qvcI93j3JPt48feg9yT8TAYOwR2x9xABs/dF90r3LQMmCveE+BAxHQ7BHbH3EAGz90X3SvctAyYK97b4EBVOHcEdrfdAErP3RZz3VHD3LRPqJgoT/Pe2+AxNCvt+zfcw9yjx9yD3HPcoErP3ReL3DnD3LRN6JgoT/PeU+/woCsEdsfcQAbP3RfdK9y0DJgr36PiMMB3BHcH3ABKz90Vo97w89y0T+iYKE/T3Ivggnx3BHbH3JgGz90X3SvctAyYK9/b4EBXBvbfxlx81BjIdDqD3EB3R9xABxfdA9yD3QAN2HfdTvTEdDvuc917e9xAd2wpi93Bk90ATenYdE/T3hf4mIR37aPck5PcQHdsK9wvpQvdAE/p2HfeF/fKcHaB295b3KtfXP9s79zrbCvcg90ATzvgG+CwV+yDX9yAGE9b3etsVUQYTzuH7QAcT1jX7IAcTzuH7QAcT5jQHUYYFE85Bxfx490D3lvcg+5b3QPh4xQcO9xAK9xCOHTMd90r4wH4K9xAK9xCOHTMd+Cz5PEgKDvcQCvcQjh0zHfdM+MAxHQ73EAr3Jo4dMx33vvjAFcG9t/GXHzUGMh0OmB239w0dE8gzHRP09xb4ujYKmB3N9wAS9yz3vPt+90AT6DMdE/Dh+NCfHfcQCvcQjh0zHfd++MAVTh2YHbn3QBL3YPdU+0r3QBPIMx0T8Pd++LxNCvcQCvcQjh0zHfew+TwwHZgd9zLf9y0dK/cOE9AzHfdY+LQVE+gmHQ73Gh33Lwr7WPdAE2gzHRPw9378LCEd+3j3AvcKqR0S90z3EC33QBNozRYT8PdXBm95Wl1JkApl4QWFg32Dfht4d5Wjq5+txZ0f9yj3JAYTaPso9/73KPck/Gj7JPco+/77KAYOf/co+Ab3JL33EI4K9xD4hjEdDvcdCvkedwHE90HF9w6THfdz/UYoCov2CtH3EAHr90ADbx33p/dCSAoOi/ck+AD3Ivsi93YS6/dA9wbzE9hvHff9+yIVE7iyChPYkft2BQ77fs33PPYKEuv3QKf3DhPwbx0T+PdU/UYoCov3JPcE9173VHcB6/dA3/dwA28d+AL8HiEdYwrJ9goS6/dAV/dwE/BvHRPo93r+JiEdYwrJ9grh9wAS6/dAV/dwE/hvHVzNrwoT9Pep/tQhHfcWHeP2ChLr90A197QT8G8dE+j4Cv12eh2L9goB6/dAA/eg9yQV9xMH91v3AwX3GAf7W/sDBfeL+0D73wdEYgX7GAfStAX7T/hV9yQHDrUK+Hf3OxLF9xyH93CF9x4T9HkdE+j3hv4mIR2sCtH3EAHH9zj3LPc4Aywd+Dj3QkgKDqwK0fcQAcf3OPcs9zgDLB33vPdCMB2sCtH3JgHH9zj3LPc4Aywd98q9FcG9t/GXHzUGMh0O9x0K+R53Esf3OLn3Dnv3OBP0LB0T+Pde/UYoCqwKzfdAEsf3OH33VHH3OBP0LB0T6PeKuU0KtQr5HncSx/c4afdwafc4E/QsHRPo94T+JiEd9xYd9wHNCgHH9zj3LPc4Aywd+BT9dnodRR2x9xABcR0DIApX+Mh+CkUdsfcQAXEdAyAK90L5REgKDkUdsfcQAXEdAyAKWfjIMR0ORR2x9yYBcR0DIArL+MgVwb238ZcfNQYyHQ5FHav3MBKt90Qv9zC/9zAv90QT8iAKE+wj+MI2CkUdwfcAEq33RFH3vFH3IAogChPo+yj42J8dRR2x9xABcR0DIAr4yAROHUUdsfcQAXEdAyAKafjIiB1FHbH3EAFxHQMgCr35RDAdYwq9TgoSrfdEd/dwd/cgCiAKE+j8JNkKRR33Jt8SrfdE2/cOdfcgCiAKZfi8FRP4Jh0O9zIKW/cQyQoT7CAK9w35DhXrBhPc8fcQ9wcdE+z7+/tWNR0O9zIKW/cQyQoT7CAKE9z3U/mK7QoT7PxBRTUdDvclHc/JCiP3ABPsIAr3Jvj4FRP6YAp7f4Z7iB77xCc1HQ73JR33DhKt90T3QtNJ90QT+iAK+z74yDUdgbQdGxP8gwpjCr1OCrH3EBKt90R393B390QTeiAKWfjIMR0T9PdI/lghHUUdAXEdA/ga9/QVg4uDgxr7CmlBU3p7kpl+HmH3EhWKmYqamxr3Cq3Pw6CdgnmZHvd/9ysVMcVWPgWnYlqaVBv7MvsA+wz7ajCfP61TH0su5VG90wVysrl+vhv3MvcA9xL3auB60WzBHw6L9x77HlYd+x73HhKZ90Tt9ywTdpn33BX7evcLKfcrHvfM9yT7MPcI9wL3JPsC8fcm9yT7uAb7MPsQL/t6HxOu90QW9y6wqboemfwKfQZcZq/3Lh8ORR3iHRPw98D3HBVTadX3CvcKrc/Dw61H+wr7CmlBUx8T6DsKE/CAHRPozZy7s9NNHccKsApX/Mg8CscKpB2//Mg8CkUdpc3B3xKt90Tb9w5190Qx9xgT/KAdE9q9/P4VU2nV9wr3Cq3Pw8OtR/sK+wppQVMfE9k7ChPagB0T2c2cu7PTTR1FHbH3JvcJHfge+eIVMh3Bvbfxlx/7SP1aPApjCr1OChKt90R393B390Qx9xgT6M8dE/T3WgRTadX3CvcKrc/Dw61H+wr7CmlBUx8T8jsKE/SAHRPyzZy7s9NNHft49wL3FXb4oPcoEq33RIP3EMv3RBPs+CQjFYWCfoP1HaibsL2hH/O50e/3Rhr3afsA9w37Mh4T9Psy+wD7DPtq+0DV+yT3MnUfE+xvc2dhVZAKE/T7HvfaFVNp1fcK9wqtz8PDrUf7CvsKaUFTHw73NAq99xDTCvhwoAr7EPtOWx33NAq99xDTCvgWuh2X+05bHft+zfdR0h3bCsf3Dnf3PBP693r4lkIKE/yfJxWpg5WBexp1aYNdhx6XSQXxj+Or0xq/a6Upkx4O+5z3Xt7SHdsKd/dwZfc8E/r3eviWQgoT9OVpHQ77nPde3tIdzfcA2wo/97z7hPdwZfc8E/oA+Fb3NB0T/ID7cPteQgoT+QDlaR0O9xYd9wHSHdMK93r4lkIKVftYbh0ORR2x9xABz/dC9x73RAMlCvfm+QVICg5FHbH3EAHP90L3HvdEAyUK9wb4iTEdDkUdsfcQAc/3Qvce90QDJQr3avkFMB37dM33Pnb4n/coEs/3Qqf3Dn/3IAr37PgpFUqjZpWqGqilmru/sHtsuh7h9wAFxkw5pz4b+ygnMPsDLclQ1m8f3GkFyHWsgWwabnZ6UFhRpbBaHin7CgUT+MZY1W3SgmlIGDodmKoFE/T3G53V5O0a5VnDNKseDvt+zfcwTgoSz/dCsfcOdfcgCiUKE/j3FvuDKApFHa33QBLP90Jr91R19yAKJQoT6Pc4+IVNCmMKvU4KEs/3QmH3cGP3IAolChPo9zz8YyEdf/ce+xK7ZHb4rPceEsb3RPcs90cTXMYW90T4PAbMmq66qZ9zcZMeUfsGligFE5y4eq1taxppgnWEhn2Rn3geE1gzIwUTPG6lu2zXG/cLv9/3AO9PuWarH8L3AgX3CHk22fsMG/tESSr7Cx8OoPcsCr33EI4deQr3HPfSMB37dM33R/csCvctHfsI9w4T8PgWFviO90/3JPy2+yT3T/yOsQdlPwUT6DodE/CbswUO9x0K+I73JPctHfsI9w4T8HkKE+i7/LYoCrUK+I73JBL3Lwr7WPdAE+h5ChPw4f2WIR33Fh33AfcsCo4deQr3evzmeh1sCtH3EAGCHQMkHfdSvX4KbArR9xABgh0DJB34NPdCSAoObArR9xABgh0DJB33VL0xHQ5sCtH3JgGCHQMkHffGvRXBvbfxlx81BjIdDmwKy/cw2wr7BPcwv/cwIfc6E/IkHfcetxUT6l0KHxPyVwr3ZIcdHxP0XWtpXx8T8l+rabkeDmwK4fcAAYIdAyQd6c2fHWwK0fcQAYIdAyQd94a9FU4dbArNydvJ2wpZ3dfdX/c6E/kkHRP294a5lR1sCtH3EAGCHQMkHfdkvYgdbArR9xABgh0DJB33uPdCMB1sCsv3HLnZ2wol9zUdK/c6E/iAJB0T8gDp93YV97zZ+7wGE/iAt/uYFRP0gLOnqbGxb6ljHxP4gGNvbWVlp22zH/ciHR8T+QBjb21lHxP4gGWnbbMeDmwKy/ccqfcQ2wolvR0r9zoT2SQd9zL3ZhX3HAb3DHwK+0YGE/kp+7aJHQ5sCsv3HKn3ENsKJb0dK/c6E9kkHRP59x63iR0T2VX3tjAdbArL9xyp9xDbCiW9HSv3OhPZJB33jPfiFftGBvcM+xAF9xwGE/mf+zoVs6epsbFvqWMfE/pjb21lHxP5Zadtsx77ZBYT9bOnqbGxb6ljHxP5Y29tZWWnbbMfDmMKvfco+JZ32wpj93Bp9zoT9CQdE+j3hv4mIR1sCvdG39sKx/cOZ/c6E/QkHfdgsRUT+CYdDvt49wL3FXb5KHfbCm/3EL33OhP0xfeQFfsuzyv3IH8eE+x9fllgS4sKpZeo27If4LSy3fcLGvgi+zr8NgdTeGNUHhP0VHqzwx++HQcObArgChPo+KD5ilgKE/A/HRPo1ZnDtNlNHcsdsAoT9PdAxVIdyx2kHRP096jFUh1sCsXNwd/bCsf3Dmf3Oon3GBP695r5RBUT/SYd96aPWAoT+j8dE/nVmcO02U0dbArR9yb3CQr4HvniFTIdwb238ZcfE/S3M1IdYwq99yj4lnfbCmP3cGn3Oon3GBPqzx33dPnIWAoT9D8dE/LVmcO02U0dpArR9xABjfjpLQr3ir1+CqQK0fcQAY346S0K+Gz3QkgKDqQK0fcQAY346S0K94y9MR0OpArL9zAB9wr3ML/3MC0K91a3NgqsCtH3EI4dKQqt+Hl+CqwK0fcQjh0pCveY+PVICg6sCtH3EI4dKQqv+HkxHQ6sCsv3DR0T6CkKE/R5+HM2CqwKzfdAEvdg91T7SvdAE+gpChPw4fh1TQq1CvkedxL3Lwr7WPdAE+gpChPw4fxzIR2sCvdG3/ctHSv3DhPwKQq7+G0VE+gmHQ6sCtH3Jo4dKQr3Kvh5FcG9t/GXHzUGMh0O9xAK9xABwPiFA18d+Ef5ZEgKDvcQCvcQAcD4hQNfHffL+WQwHZgdufdAAfdu91QDXx33mfjkTQr3Gh3A+IX78vdwE3BfHRPo95X8BCEdZwqgdvcE9xz3QPcc6XcByfdA90D3PAPJFvdA9wTrCjvp+0AG90D8Ju8df/cm9w73EPcc9yYBw/dE9zT3QAP4GveUFTqAbGJlG2Ftsd+FH2f3bBWho6ihthvFrF4wlB/74AaJd4l3eRr7avP7DPcq9yrz9xD3avdqI/cO+yY1T21hXR4OYR33QngdE36/HRO+Nx0TfiIdE74lHb/4Nl4KYR33QngdE36/HRO+Nx0TfiIdE74lHfea+ORVHWEd90J4HRN+vx0TvjcdE34iHRO+JR01+DYsCg5hHfcweB0Tfr8dE743HRN+Ih0TviUdLfg2Jx1/QB2/90QSwfc4+wbkCvse90ATfIC/HRO8gDcdE3yAIh0TvIAlHRN7AHH4LBUvHfd4Fi8dDn9AHdf3ABLB9zhT97Q790ATfb8dE703HRN9Ih0TvSUdE3pT+ERuHQ5hHecSwfc4Sen3DOkx90ATfIC/HRO8gDcdE3yAIh0TvIAlHRN7AOP4Nj8Kf0AdscnjyRLB9zhr3dfdU/dAE75Avx03HRN9QJdXBfcg96oG9zgv0fsiNz1zYT8ex/sEBafHtZm1G8Ote2eRHxO+QFAdJR0TfYDj+B5ZHWEd90J4HRN+vx0TvjcdE34iHRO+JR2b+DYvCmMKvUAdEsH3OHv3cFf3QBO9vx0T3TcdE70iHRPdJR0Tuun8OCEdf0Ad9zrfEsH3ONn3Dlv3QBN9vx0TvTcdE30iHRO9JR29+CYVE34mHQ5hHfcFClHFUfcMeB0TeMC/HRO4wDcdE3jAIh0TuMAlHU/4NhXzBhN0wKYdE3jASx0TcsD0ChNxwMYdYR33BQpRxVH3DHgdE3jAvx0TuMA3HRN4wCIdE7jAJR1P+DYV8wYTdMCmHRN4wEsdE3HA5B0TcsDaCmEd9wUKi3e/0XgdQfcCE3nAvx0TucA3HRN5wCIdE7nAJR1P+DYV8wYTdcCmHRN5oEcdE3OgoQphHfcGr/cOeB37MNMTfwC/HRO/ADcdE38AIh0TvwAlHUf4NmcdE36AOx1jCr1AHcn3QhLB9zh793BX90ATvoC/HRPegDcdE76AIh0T3oAlHTX4NiwKE70A2f6IIR1hHd21n3gdE3+/HRO/Nx0TfyIdE78lHbH4shXfBuX3DAX7DAaH+4g3Cg5hHd21n3gdE3+/HRO/Nx0TfyIdE78lHd/5KhX7DAbl+wwF3wZZ+xA3Cg5hHd26murREsH3OM33AnP3QBN/QL8dE79ANx0Tf0AiHRO/QCUd4/g2Nwpl9xUVE3+ASgqhCmEd2T33EKX3DhLB9zhL0/ck90D7MNMTdUC/HRO1QDcdE3VAIh0TtUAlHeP4NvMdE3lAc4V6dWAbE3VAYHqho4UfPQYTtUBHjblT6xsTdqD7LPcqFdMGvQo7HWMKvUAdyecSwfc4Self93BT6TH3QBO+IL8dE94gNx0TviAiHRPeICUdE71A4/g2NB0TvICR/dohHfcAHfc49xgkdqR293Lxv/ccEsH3OPcO9wY390ATT0C/HRNngDcdE5eAmVPRHRNPQOUdHxOPgLMKd3eVox8TT0Cnn63Pmx73qgf3OC/R+yI3PXNhPx7H+wQFp8e1mbUbw617Z5EfUB0TZ0AlHQ5/9xrX89X3HPsW9xYSm/ct97P3GxPcm/ciFTm6Q+i3sZ+/vx5frblv0xuxw5ursx9R9wIFeXF2hXT3MwqOl4+lqRr3GlT3BCRUandfaB6zc2mjUxtUVndnTx8T7Mf7BAWgr7GWoxunmHtokB8T3PsmbEVbIxr38vc0FcWSoaGhG6mUZ18f+7P7JhWonaS2lx6NeI13j3KSeRl/f3yDfRt1fpiiHw5/9y4drHb39Pcgxf8ATIAA//+zgADbO/cmyR0TM4D3gPfQFaWjoJWmG7ykbEAfE5OAMmduYXRzkZ12Hvf+BK/3PgcTNYDb+z4HEzOAzftABxM5gEgHS4YFEzOAQcv8uvcaBxNTgPcDHen3O/cnPev7DV5deWtnHw77dM33P3b4EvceAcn3RNP3DgP4F4IVwpPHoLyzR/cAGHZpYnZaG0VYu9fXv7vWq6uCcrAf2fUFs2FGpT0b+y/7Hiv7Ovsn6jD3F3cfaUcFOh0Obgr3QgHJ90QDNh34WPiGVR1uCvdCAcn3RAM2HfP32CwKDm4K90IByfdEAzYd92L32C8KVB29914SyfdEg/dwE/A2HRPo96r3zCEdf/cgIHb4CPcgi3fD9yj7KPd2Epr3RPcm90Cr8xNbgJr3jhUTm4CaChNbgHAKE6uA90SNFeOxq7WjoYV5nx77TAdveHaDbxtabq3lH/g997wVE1eAsgoTW4CR+3YFDmMKvaIKefdwU2Yd5/yYIR33Fh3XogpX97QxZh33gPvoeh1/9yAgdvf09yDF2zv3Jv//cYAA/wCOgABtChOz+AD3OBVveHaDbxtabqre3LGouKChhHqfH/eA98IVSwYTa837QAcTc0n7KAcTqzv3KGcHkUMFqWxqn1QbIiMt+zL7MN0r9xO4vKOtrh+PBhNnl10F9yD4uwbLkAUOjAr3QgH4HvcwAyIK+wr3nF4KjAr3QgH4HvcwAyIK5/hKVR2MCvdCAfge9zADIgr7lPecLAoOjAr3QgH4HvcwAyIK+y73nC8Kf1odv/dEEvcB5Ar7C/cwE+y9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPq99EGjZeQqaka9xo79wD7Mh4T7Psa+xSmCvdCxxUT+r+XsJ+2G8Wfa2Mf+1n3khUvHRP893gWLx0Of1od1/cAEvc897RN9zAT9CIKE/j7dveqbh0OjArnEvcy6fcM6UP3MBP8vfeOFfs69w4r9zLJ2Z+xxx5T8QV3X2eBYxtOVJ3Jfx8T+vfRBo2XkKmpGvcaO/cA+zIeE/z7GvsUpgr3QscVE/q/l7CfthvFn2tjHzn3nBUT/PK81+P3BwphhnltZhtmeam1hh8tBhP6M428P/IbDn9aHb33XvcPChPkIgoT+Dn3kCEdYwq9Wh33DwoTdCIKE/g5/NIhHX9aHfc63xL3wvcObfcwE+i9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPk99EGjZeQqaka9xo79wD7Mh4T6Psa+xSmCvdCxxUT5L+XsJ+2G8Wfa2Mf+wz3jBUT+CYdDowK9zAB+B73MAMiCvuc95wnHX/3Ftv3BNP3FvcjCvge9zAT8SIK+3r3nBXzBhPpph0T8UsdE+X0ChPjxh1/9xbb9wTT9xb3Iwr4HvcwE/EiCvt695wV8wYT6aYdE/FLHRPj5B0T5doKjAr3BQqLd7/REvge9zA/9wIT8IC9944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/HxPxAPfRBo2XkKmpGvcaO/cA+zIeE/CA+xr7FKYK90LHFRPxAL+XsJ+2G8Wfa2Mf+3r3nBXzBhPogKYdE/KARx0T5IChCowK9x0d+BzTRfcwE/oiCvuC95xnHRP8Ox1jCr1aHcn3QvcPChN6Igr7lPecLAoT/NP+iCEd9wAd9zhaHRL3zPcEbfcwE3z4bvcoFXdfZ4FjG05Uncl/HxN699EGjZeQqaka9xo79wD7Mvsa+xQp+zgeE7z7OvcOK/cylpGLjZ4ecnVuZVsaTbtryR4TfOUdHxO8adcFhYJ/hX8bdHmWorGdpePHH/vG95wVE3q/l7CfthvFn2tjHw5lCsn3QicK+y73ziwKDmUKyed0ClTp8Pcq+xfpXvc3E/YIKR0T9KA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT7SCTcm2PbRv7CCJR+xBRqV2xcx+HBxP0kGhzcmdpGmGhcad5HocHE/YIWXNxbGIaE+0g94P36hVqcKG7uaahrKyndV1bb3VqHxP0UJ/3zj8KZQq99150CoD3cEYrHRP0QJ/3wiEdZQr3Ns10CpL3DpYrHRP0YMX3sn4dZQrJ90InClf3zi8KZQrX9wB0Cl73tCQrHRP0QPsQ99xuHQ5lCsn3MCcK+zb3zicdoPcRHdX3EAHL90D3HvdAA1AKsMExHQ77nPde3vcRHdsdYvdwYvdAE/pQChP094X+VCEd+2j3JOT3ER3bHfcL6UD3QBP6UAr3hf4gnB2gdvfu9ybF/wBMgAD//7OAANs79ybbHfce90ATzveA+JYVr/c+BxPW2/s+BxPOzftABxPmSAdLhgUTzkHL/LqtCqOloZmrG7eZc1Mf+573QPe0B/cQW9v7AkFVaWtqHg73Kwr3QgH3nPdAA0kd937VXgr3Kwr3QgH3nPdAA0kd+FD3jFUd9ysK90IB95z3QANJHevVLAoO9ysK9zAB95z3QANJHePVJx23Hcv3RBL3IvdEVfdASfdE3B33MMsVLx0T6Pd4FhPkv6+xvb1nsVcfE+hXZ2VZWa9lvx8Otx3j9wAS91z3tPt090DcHfcS424dDvcrCucS91Lpd/dAa+kT6EkdE/T3otU/CvcrCvdCAfec90ADSR33WtUvCrcd90bfEvec90Al9w4T8Ekd93zFFRPoJh0OtQr4AvcayfdeEvd+93D7UvdAE/RJHRP4lQr9ztkK9wAd91l2+AL3Gsn3XhL3fvdw+2L3Bin3QBN595wWE7q9BnN6YWFQGk29a8keE3nlHR8Tua4KE3zb91ghHfcAHfdZdvgC9xoS94z3Bin3QBN095wWE7i9BnN6YWFQGk29a8keE3TlHR8TtK4KDrcdAfec90ADSR0O9wYd+Dj3GtX3QgH3nPdAA2sK69UsCg73HQr4iHf3bHcBy/dAwfcOkgr3bv10KAqgrh0By/dA9y0K9wwGxsX3AftGBfdOBvtZ97j3TfdkBftOBvss+0IFh/dC+0AGDn/1Csf3EAH3UvdAA8H4xhUzCvgQ90xICg5/9x74Ovd2+2j3GhL3UvdAwfMTuMH4xhUzChPY+En7KBWyCpH7dgUOf/ce9xT3XvX3GgH3HPdAzfdwA/jGBDMK+Hj8TiEd+37N9zDgHWn3DhPwwfjGFTMKE+j3nv10KApjCr3gHfsG93AT8MH4xhUzChPo98T+VCEdYwq99Qrv9wAS9w73tPtw90D7BvdwE/TB+MYVMwoT+M/vbh0T8veAHPtwIR33Fh3X4B37KPe0E/DB+MYVMwoT6PhU/aR6HX/1CgH3UvdAA/iR9yAVgW51h3YbaGObxR/3Hwf3I9gF9xwH+yM+Bfdx+8j7Gvcc+z8H+wFOBfscB/cByAVaB/sWzzP3GcyvlZvBHg77nPde3p0Kq3cSpfc2j/dw+0L3Fr33NhPNgKUW9zYGE+WAfR0T1YB/yAX7FQYTygD3qP2QIR2gnQrp90LbHfce90ATvMsW90AGE9w1ChO8xgr4PPeMVR2gnQrp90LbHfce90ATvMsW90AGE9w1ChO8xgr3RtUvCqCdCun3MNsd9x73QBO8yxb3QAYT3DUKE7zGCs/VJx37fs33UZ0K2x2x9w5190AT2ssW90AGE+o1ChPcxgr3XvywKAqgnQrd917bHWv3cFn3QBO6yxb3QAYT2jUKE7rGChO0947JIR37nPde3p0K2x1h93Bj90AT2ssW90AGE+o1ChPaxgoT1PeE/ZAhHfcWHfcBnQrbHfce90AT3MsW90AGE+w1ChPcxgr4FPzgeh23HX73ZftYd6t392B3Esf3B7z3QOn3QBOPgH/3n40K9wJezDhPX2BIHhOjgE+0ZMWRkYyMkR6HTmVhQm0IE4+A+EPfFROXgH/HBfsg/Ij3QAYTx4D33Aejn5eZoxunlXNTH/uyrQoTj4D3EGHbKktgaWVnHg5uCvdCAaUKAyMduffYXgpuCvdCAaUKAyMd95T4hlUdbgr3QgGlCgMjHS/32CwKDm4K9zABpQoDIx0n99gnHVQdv/dEdgr7DOQK+wz3RBPyIx0T7Gv3zhUvHfd4Fi8dDlQd1/cAdgpN97RN9yAKIx0T6E335m4dDm4K53YKQ+n3DOlD90QT8iMdE+zd99g/Cm4K9y4BpQoDIx1V99h0HW4K90IBpQoDIx2V99gvCt8Kdgpv93Bv9yAKIx0T6N38liEdVB33Ot92CtP3Dm33IAojHbf3yBUT+CYdDn/3HveM9x73IwqlChPjIx1J9xQdE9OmHRPjSx0Ty/QKE8fGHX/3HveM9x73IwqlChPjIx1J9xQdE9OmHRPjSx0Tx+QdE8vaCm4K9wUKi3e/0RKlCiv3AhPnACMdSfcUHRPXAKYdE+aARx0TzoChCm4K9x0dtfdE9zbTRfdEE/ojHUH32GcdE/w7Hd8Kyekdb/dwb/dEE3ojHS/32CwKE/TT/oghHX/3GPeY9xgBpQoD+BD3shWMgIx/fho/c1VReXyQlX8eaNwVipWKl5ca16PBxZ2ZhoKXHvdY9wYVTbtgVwWjYl2XWxv7GPsSK/s6Q6NQsV8fX1bJW7W+BXO0un67G/cY9xLr9zrUc8Zktx8Of/ca+xr3HtPz0/ce+xb3FhKX9y7g9wfl9xoTd/c6944V15i7rKWYWz8/fltxan671x77Lhb7Ot8r8cWtobWoHmKouXS6G7LDm6uzHxO3UfcCBXlxd4Vz9zMKj6GNm6ka9xpS9wQlYF9xW3Aet3RmqVQbE3ckNCv7Oh/39r8VE2/FkaGhoxupk2dfHw5UHRKlCi33GBPw98D3EmwdE+g9HRPw9xj3Euv3OtlvyWC4HxPoypy5s9FNHW4K90ISpQot9xgT+JcKZ/xUPgpuCvdCEqUKLfcYE/j4GPEdr/xUPgpUHbnNwd92CtP3Dm33RC33GBP695r4whUT/CYdE/q9/IZsHRP5PR0T+vcY9xLr9zrZb8lguB8T+cqcubPRTR1uCvcwEqUKLfcYE/j4IPluFWOBfn92cWy/WhtLWVz7AX0f4QazlZiXoKWpV70by7269wGZH/tK/PA+Ct8Kdgpw93Bu90Qt9xgT6PfBaR0T9Ir3UGwdE/I9HRP09xj3Euv3OtlvyWC4HxPyypy5s9FNHfcAHfdQdvgT9x52Cn/3Bsn3RBO292L7ChVNvWvJHhN65R0fE7Zp1wWFgn6F9R2lmqq8oh/zudHT9xYa9zr7Eev7GR4TevsZ+xEr+zr7KfEu9wl6HxO2c3ZsZVkaE3qX+AQV16O7xcWjWz8/c1tRUXO71x4Odx34LPeMVR37fs33UbMdEvP3QCX3DhPUtAoT5IEKE9RjHRPM1h0T0sn8sCgKdx33NtUvCvuc917esx0S6fdw+2b3QBPStAoT4oEKE9JjHRPK1h0T1O/9kCEd+5z3Xt6zHfcA9wAS6fdw+2b3QDn3tBPVALQKE+UAgQoT1QBjHRPNANYdE9SA5eNuHRPWAJX+VCEd9xYd9wGzHRLz90AT1LQKE+SBChPUYx0TzNYd94j84Hodf9YKyfdCAdj3P/cT9z8DucsVYcvpaeEbKB34BPjWVR1/1grJ90IB2Pc/9xP3PwO5yxVhy+lp4RsoHZ/4KCwKDn/WCsn3QgHY9z/3E/c/A7nLFWHL6WnhGygd9w74KC8K+3TN9yj3ECR2+CD3EhLY9z+r9w5w9z8TvPiu+E4VrFZBsC0b+yYtSykfE9o56GHdcx7MeMV+cRp3dYFQUVOhrVEePyEFE7zDZtpt14RqSRg6HZirBRO69xCczMzbGuUtsDaiHkucVJalGp+gk7+7undxuR4O+37N9zDWChLY9z+n9w509z8T6LnLFWHL6WnhGxP0KB0T6Pcm+2YoCn/WCr33XhLY9z9h93BY9z8T9LnLFWHL6WnhGygdE+j3VvgcIR1jCr3WChLY9z9X93Bi9z8T9LnLFWHL6WnhGygdE+j3TPxGIR1/9xL7BqH4vPcaEr33QMP3MvsB9zNF9zITdL0W90D4cgbDnbO6o5t0bh4TeEFabz8aE7L7FPcef08ad36BfXVykpxvHhN0U/sIBROydbmwf8Eb9wzG1+kfE3j3IPsemcEaE3S3vafpGuNO4/se+zdBKfsQHg5/1Aq73QH3NvdAvvMDMAr3vvdKFbIKkft2BQ77dM33J/cZ+wR2pXb4CPcaEvc290CT9w4TrPg2gBXAjreXsJUIE8xtfAqCcG2EaRtLaqHSH/cr91r3Gvta9xb7Igd1+xb7FIUF+xT3DPsuBxOc+wa3OPcHdh4TrmhFBTodDvt+zfcw1AoS9zb3QIv3DhPwMAoT6Pc4/CooCmMKvdQKEvc290A793AT8DAKE+j3Xv0KIR33Fh3X1AoS9zb3QPsG97QT8DAKE+j37vxaeh1/1Ar3YvdEEsv3RD33QGH3RBPoMAoT9IH36BUvHfd4Fi8dDlMd6fdCdwoTfF4dE7z71gcjChN8qQr7pJkdUx3p90J3ChN8Xh0TvPvWByMKE3ypCk2QHQ5THen3QncKE3xeHRO8+9YHIwoTfKkK/C740iwKDlMd6fcwdwoTfF4dE7z71gcjChN8qQr8NvjSJx1THd/3RMoK+xrkCvse90ATeV4dE7n71gcjChN1qQr78vjIFS8dE3r3eBYvHQ5THfcA9wB3ChN8Xh0TvPvWByMKE3ypCvwQ+OBuHQ5THennygo16fcM6TH3QBN5Xh0TufvWByMKE3WpCvuA+NIVE3byvNfj9wcKYYZ5bWYbZnmptYYfLQYTdTONvD/yGw5THdHJ48nKClfd191TRgoTeoCpCvuA+LoVE3sA07u1y8tbtUNDW2FLHxN6gEu7YdMeE3sAyQR2ep2lpZydoKCceXFxenl2Hw5THen3LncKE3xeHRO8+9YHIwoTfKkK/Aj40nQdUx3p90J3ChN8Xh0TvPvWByMKE3ypCvvI+NIvClMd3/ccxdnKCiP3NQr7APdAE3xAXh0TvED71gcjChN6QKkK++j4yBUqChN8gPdkFioKE3kA9w4KQwoTeoCpCvvK+XwV9wAG9wz3Br4K+wbYChN9AMsKQwoTeoCpCvvIix0TfQDLCkMKE3yAqQr7ivcEChN7AKn7SG8K7B1393BH90ATul4dE9r71gcjChO6qQoTtPtq+5whHVMd91rfygrF9w5b90ATel4dE7r71gcjChN6qQr7pvjCFRN8Jh0O9wAd9zj3JvsRdqh2pPcPHfH3Bjf3QBNHQF4dE2NA+9YHZ3F3g24bXn+jwx/3svtA+8gH+xC5O/cEHhNTgNG9qbu1H48GE4uAmUXRHRNHQOUdHxOHgLMKd3eWoh8TR0Cnn63Pmx4Of/cbHfcY90Br9xgTdPh4+PRYChO4T/vWBiMKE3h4CvhUBhN0xZ21s81NHbkd+GiQHRN69y6tRh25HfgS8R0Tevd2rUYdUx3ZzcHfygrD9w5d90Br9xgTfQD3lPjCFRN+gCYd94R7WAoTvQBP+9YGIwoTfQB4CvhUBhN8gMWdtbPNTR1THen3MHcKa/cYE3z4GvluFWOBfn92cWy/WhtLWVz7AX0f4QazlZiXoKWpV70by7269wGZHxN6k/sORh3sHW33cFH3QGv3GBO198hpHfdE+TJYChPaT/vWBiMKE7p4CvhUBhO5xZ21s81NHbId6fdCAY346CsK95vVXgqyHen3QgGN+OgrCvht94xVHbId6fdCAY346CsK9xHVLAoOsh3f90QB7uQKKwr3TcsVLx33eBYvHQ6NHen3QhKj+L4TuOxbFRN4bfsWBRO4JAoTePdD+QJeCo0d6fdCEqP4vhO47FsVE3ht+xYFE7gkChN4+BX5sFUdjR3p90ISo/i+E7jsWxUTeG37FgUTuCQKE3iw+QIsCg6NHd/3RBL15AoTvOxbFRN8bfsWBRO8JAoTfOz4+BUvHfd4Fi8dDo0d3fdeEqP4vvwQ93ATuOxbFRN4bfsWBRO4JAoTdPdn+PYhHfuS9177HPcaJHb5OncSo/jb+3D3cBNY7FsVEzht+xYFE1gkChOU+CT7YiEdjR33Wt8S97v3DhO47FsVE3ht+xYFE7gkCvc++PIVE3gmHQ6NHen3MBKj+L4TuOxbFRN4bfsWBRO4JAoTeKj5Aicdi/ca93z3GtX3QgHR+G8DXwr4QPkkVR2L9xr3fPca1fdCAdH4bwNfCvdK+HYvCov3Gvd89xrJ914S0fhv+9/3cBPQXwoT6PeS+GohHWMKyfca93z3GhLR+G/75fdwE3BfChPo94z7+CEdf/ce92L3EgG19zD3Wvc0A/fA9xIVU12t0da0psWxqn9sqB+MgouBgRotYWNVHvdy+KgVX9b7HUZeqlqlWaIZQSOqfaZ8pHwZ+wZSt0H3KdazZ6hjnVoZqm5hl2Ib+wL7ADn7Jvso9wYt9x73Ouv3DPc29yhS9TfbHw77L3b3OPcuHfgU9yD3THfJHRO+94BlFYfXBW+pr3W7G/X17fdA9y497/sMXV15a2cfj9IF9zf7QP3890AHE9733AT3TAelo6GVpRu9o2k5K2VrY3VxkZ13Hw73Bh34OPcaAfec90ADawoOf/ccv/Hx9xh/d9sd9yz3OBPc+Lz3+hUT7N1R0yNNUG9nWh6HBhPcf78F+yD7qgb7OOdF9yLf2aO11x5P9wQFb09hfWEbU2mbr4Uf93iX48X3BBoT7Ps4fRVpbW/7DoceywefpqqdsxuvnX50Hw44HW0KE6YgHRNWPQoTTjgKE6ZWCg5/9y4drHb4CPcgf3fJHROW+BL3jBUzZWthc3WRnXce90wHp56gk6cbvKhpMR/3RJcV9yw97/sMVVdzaWkehwYTLn+5Bfsg/Ij3GgYTTpnBBY8GX7G5dbcbE5b3AvPt90IfDlQdAff+90QD+K73jhX3OvsS6/suOT9xY18e2SEFpLSulK4b0LtbPz9UWz9eZqCgbB9F+wAFWMbXdtAb9zL3FOv3Oh8Of1odAb33MAP4uveOFfc4+w7t+xX7OTf7APsabZBtjX8e99EGS3lae04bY2eVn18fUyUFZcfZd8kb9zL3Duv3Oh/77McVs6Srxbasd1eWHg5/9xbT9wTb9xYBvfcwA733ehX7Gtn7APc29xz3EO/3Nvc2+wDv+zRMPnllTx7DIQWftLaXsxvEsnlNmx/70QaJf4ZtbRr3MGMV9z4GVYFmeWAbUXWtsR8OTwr7L3b3OPcm+AJ3AcH3QPce90AD+Kz4iBX7QPvcBnNxdX1rG199o8Mf97L7QPvIB/sQuzv3AtXBrausHoIzBfsi90AHDn/3JvsFdviI9ycKE3z42PiIFfs2BhO8+9wHcYKCf38bfoSUoB/35PsW+9wHcYKAf34bfoeUoB/35Ps2+/AHJ7VL0cOwsbWZHleWq2+0G8aprbKcH48GE3yXTgX3FQYOf5939yr7Ca4dEvfY90ATmPiE+IgV+0D7jAYTWDdmTm1SG2d2kJRtHxOYafskBX+noIO5G9bTr927H48GEziYIQX3IQYOi9QKAfee90AD+Er3tBX3Gk/l+zhHVX1/Xx6p+xAFlKapkq0by6x1RB/7K/ta+xr3WvsW9yIHofcWBfcU9xr7DAYOoHb4CvcSAaP4vAP4IPiIFftaBvtC/IgF9zgGzPdumr2Xv5nBGY8GmVWXV5pZzPtuGPdABg6gdtv3Hvck9x4BjfjoA/ii+IgV+1YGe/sag0KIYohpGYcGhsKGuoW5e/caGPtaBkn8iAX3MAae92aRvYu9kb8ZjwaSV5JZlFmh+xYY9wgGn/cWlbuRv5C/GY4GkVeMWZFZnvtmGPc8Bg6gdvjS9xqBdxKh+L4T0PiM+MwVE7Cp9xYFE9CRdHKPbBv7FVJK+xtWH/tW/JAF9zYGx/dUmr2bvpe+GY8GmVWZWZxb0ftUGPc+Bvtm+HaZsQWpmKSjvhuWlomHmB8O+y9291muHQH4APdAA/is+IgV+0D7DAZQUfsB90YF+04G91n7uPtN+2QF904G9yz3QgWP+/L3QAYO7wr/AIKAAP//fYAA9xrJ92L7Vvcai3fKCvdE90ATy8P4hxVJhgUTq7kKE6ep9xIFE6v3FgoTs/i49zMVx1u2SEhbYE9Pu2DOzru2xx77XP0tFfdA+Ij7QAYOf/ce+wl2rHb4Av8AgoAA//99gAD3GtX3GnoKEsf3QPcy90ATNMDH+IcVSYYFEyzAuQoTKcCp9xIFE4zA9xYK+Lj8DhWJg4eLhRt/e5WtHxNKwPii+0D8nAf7BLE/9wixp5GTnR4OOB1tChOmIB0TVj0KE044ChOmVgoOOB3d90JtChOnIB0TVz0KE084ChOnVgoTT/eC99heCjgd3fdCbQoTpyAdE1c9ChNPOAoTp1YKE0/4VPiGVR04Hd33Qm0KE6cgHRNXPQoTTzgKE6dWChNP7/fYLAoOOB3d9zBtChOnIB0TVz0KE084ChOnVgoTT+f32CcdOB3T90R2CiPkCvsu90ATpkAgHRNWQD0KE05AOAoTpkBWChNNgPc0984VLx33eBYvHQ44Hev3AHYKXfe0K/dAE6aAIB0TVoA9ChNOgDgKE6aAVgoTTQD3Fvfmbh0OOB3d53YKU+n3APdA+zTpE6aAIB0TVoA9ChNOgDgKE6aAVgoTTUCfCg44HcXJ48l2CnXd191D90ATpyAgHRNXID0KE08gOAoTpyBWChNOwPem98BZHTgd3fdCbQoTpyAdE1c9ChNPOAoTp1YKE0/3XvfYLwpjCr08HXYKgfdwS/dAE9KAIB0TqoA9ChOmgDgKE9KAVgoTpQD3qPyWIR04HfdO33YK4/cOS/dAE6aAIB0TVoA9ChNOgDgKE6aAVgr3gPfIFRNPACYdDjgd3fczHbX3RPcm90ATpGAgHRNUYD0KE0xgOAoTpGBWChNMYPcS9xQdE0pgph0TTGBLHRNJYPQKE0jgxh04Hd33Mx2190T3JvdAE6RgIB0TVGA9ChNMYDgKE6RgVgoTTGD3EvcUHRNKYKYdE0xgSx0TSODkHRNJYNoKOB3d9wUKi3e/0W0KUfcCE6TgIB0TVOA9ChNM4DgKE6TgVgoTTOD3EvcUHRNK4KYdE0zQRx0TSdChCjgd3fcGr/cObQr7INMTp4AgHRNXgD0KE0+AOAoTp4BWChNPQPcK99hpCjsdYwq9PB3d6R2B93BL90ATU0AgHRMrQD0KEydAOAoTU0BWChMnQO/32CwKE6aA1f6IIR04Hd3dtZ9tChOngCAdE1eAPQoTT4A4ChOngFYKE0+A93T4VBXfBuX3DAX7DAaH+4g3Cg44Hd3dtZ9tChOngCAdE1eAPQoTT4A4ChOngFYKE0+A96L4zBX7DAbl+wwF3wZZ+xA3Cg44Hd3duprq0XYK1/cCY/dAE6egIB0TV6A9ChNPoDgKE6egVgoTT8D3pvfYNwpl9xVqHaEKOB3d2T33EKX3DnYKVdP3FPdA+yDTE6KgIB0TUqA9ChNKoDgKE6KgVgoTSqD3pvfY8x0TTKBzhXp1YBsTSqD3BB0TS1D7LPcqFdMGvQo7HWMKvTwd3ed2ClPpW/dwS/dA+zTpE9MgIB0TqyA9ChOnIDgKE9MgVgoTppCfChOmQI392iEd9wAd9zj3IPsDdqRLCnYK9wj3Bjf3QBNkoPdu95AV47GrtaOhhXmfHvtMB294doNvG1pureUf+0SJFfs23yf3EB4TYcC3v6OtrR+PBhORwJlZ0R0TSaDlHR8TicCzCnZ4lqIfE0qgp5+tz5se+Ij7GgcTSaA4ChNkoFYKDk8KTx37NPg4LAoOXArd5xK190JP6fcG90D7OuktHRPNQJn4OD8KXArR914StfdCe/dwU/dALR0TzQCZ+CwhHVwK90rNErX3Qo33DqP3QC0dE82Av/gcfh1PHVH4OC8KXArr9wAStfdCWfe0MfdALR0TzQD7FvhGbh0OXArd9zAStfdC9yj3QBPPRB0T14oKZVWVo10f9zz3QhVdabDSHxPn1rWusaWhhXmfHvswBxPPbXd1g3Eb+zz4OCcdf/cW+ET3BBKb9zYh9yHM9xYT6PdG904VnZCclJoeqmauZ7BrCIN9fIZ9G11vp7MfE9iu98AVtZmhnKSUfW9pdnJtdB6CoIafnhr3c/sEFYFXe153ZWenaapvqwjFucW93RrpS8cjI0s5LWSaXKZaHhPoVmReWDYaKdEx9yTTx6GwvB65brl4uoCz9x4YcpBvl22dss2m0p7XCA5/9xj3DPc09wbOCvcH9233bSb3Afsp+ykm+wH7bftt8PsH9ykf+KIEwLhn+zL7Ml5hVlZetfcy9zK4r8AfE/z7pgS5rau7u2mrXV1pa1tbrWu5Hw6L9x733PcMHfiE9wod+9z3Kh2L9yT4BPcCHfsUBmxbh4doH/Pj9fcE8bgdNfsQIfs9+x4fDn/3Hvcc9wz3FvcDChPkr9kV9yQKzfcMHxPw21G9PaEejwcT6NaptLnIGvcHKcveHXdlHxPwX2Fv+wYe+wwHE+T3Ia5vW2Nfd01bVaOvYR8OoHb3IvcW93L3MQr3pBXN9wCisab3GwpDB/d9FkL3/vtoBvuJ/AgF+wz3vfsi9zT3ItQHDn/3Hvc49wrd9yQB7/cs9wT3QAO12RX3KB3d9yL3GiTJ+wdyeImDcR+T5wX3kPck/CQGe/va9ygKb1VTYXFJWVylrWIfDlwdoHb4fvckAfdI90AD90gW90AGmPeLnvcC9zL3Pwj1/Hf7JPfAB/sU+zdl+xN++1wIDkwKf/ce9wD3DPc49xQBu/cw90v3MQP3rvf2FV9pn8POtKC0rbh3MZwfZGppfGob+3b7shX3Mh33Avd693r7G+P7E/sR+wE7+xz7HONP9wC0xqK1th/7FYRPX0cbY2GhoXMfDn/3GOn3NOHOCvcC91j3WCbx+yn7KSYl+1j7WPD7AvcpH/hsBMC4a/sa+xpeY1ZWXrP3GvcauKvAHxP8+4oEua2surpprF1daWpcXK1quR8Oi/ce96b3DB34TvcKHfum9yodi/ck9873Ah0pBmxbh4doH+3T3dvruB1E+wsq+0L7AB8OL/cecHb3WvcM9yL3AwoTcq+JFROy9yQK0fcSHxN44FG7PaIejwcTdNartLvMGvcHKc/eHXNlHxN4WWFt+wYe+wwHE7L3Ia5wVlxfdE1bVaOvYR8O2fcW93z3MQr3ZBXP9wqisaT3Gwo5B/d9FkL4CPtoBvuJ/BIF+wz3vfsy9zT3MtQHDi/3HnB293j3Cuf3JBLv9yz3BPdAE3y1iRUTvPcoHeH3KPchJMj7B3J4i4FxH5PxBfeQ9yT8JAZ7++T3KApwTkxhbklZXKWtYh8OXB34SPckAfdI90AD90g7FfdABpf3lp/3DPcy90QI9fx3+yT3wAf7Ffs8ZvsgfvtkCA5MCi/3HmZ29zz3DPdQ9xQSu/cw90r3MhN89673qBVfaajK1rSgtLC7cyGZH2FpaHtpG/t2+7QVE7z3Mh33B/eP93r7G+P7E/sR+wE5+yL7I+NG9wCzxaK0tx/7GX9SYkobY2GhoXMfDn/CCvcKFX8KDvtu+Fz7dvd2EvfI9xoToPdu+24V9ym11ur3FxoTYK8df/eYvcIK+EAVfwr7ygR/Cg6X93bH95gS9z73mPsO9xoTYPfA974V2b/F09JXxj09V1BEQ79R2R85/JgVE5D3KbXW6vcXGq8df/dkAX73XJj3XJj3XAN+5xWjHfdpFqMd92kWox0Of/dw+1t29yEK94j3nBUTUPcEBqP3lpH3KAX7QAaR+ygFE6Bt/DvZHfe493CLd/chCvf494AVE1D7BAZz+5aF+ygF90AGhfcoBROgqfg72h1/93D7W3b4wPceEvdE93BT9zgTaPdk95wV9yoGgfcC9zCX9xYa9wgrvfsIO0ZlU1oe6TUFo6iknbEbqal9Z0v7LGef+xYfE7Br+znZHftK9x735Pdwi3cS6/c4U/dwE7D4HPeAFfsqBpX7Avswf/sWGvsI61n3CNvQscO8Hi3hBXNucnllG21tma/L9yyvd/cWHxPIq/c52h33sPgkAfdj904D94z3sKMKDvew+CQBzvdO6fdOA/cA97CjCvfS+4ajCg6DHfefsB33n40KE2BIHQ73n/dlAa33B/c59wcD93H3Ix1yHfeB5NMdch0O+Hv3DQr3n3EK+32wHft9jQoTYEgdDn73DQr7fXEKmfhwAfc6944D9+yZlgoOmfhwAfdM944D90zZlB0OmfhwAaX4pgP3YJmWCvhe+yyWCg6Z+HABt/imA7fZlB33LPtClB0OlAqUCswdzArMHcwK93bCCvf4FX8KDuv34AH3FvfoA/fA6xXt09Pp6UPTKSlDQy0t00PtHw77QvcSAcf4dAPHWxX7Evh09xIHDvtI+igB9z73IgP4DftIFerVBfsF9wlc9wX3Lhr3Lrr3BfcF9wkeLNUF+xP7Cjv7LvtOGvtO2/su9xP7Ch4O+0j6KAH3tPciA/dz+0gV9xP3Ctv3LvdOGvdOO/cu+xP3Ch4sQQX3BfsJuvsF+y4a+y5c+wX7BfsJHg77LOX5POUB91P3FgP3U/ssFffD5ftB+Tz3QeX7wwYO+yzl+TzlAfer9xcD9k0VMffD+fD7wzH3QP08Bw73MArv9zhj9yQT6Pd0hRX7AsRn9xYe3uVmBj96lb8fvo+6xRrbbKdClx6PB9SXqqfbxYe6vhq/nJXXHrDlOAb7FlJn+wIfRZVtTRoT8GltZyOJHicHE+jzialnaU2BbUUaDvcwCvd99yRj9zgT8PZNFTHeB/cWxK/3Ah/RgKnJGq2pr/SNHhPo7wcT8CKNba+tyZap0Rr3AlKv+xYeODGwBtacgVcfWIhcURo7qm/Ufx6HB0J/bG87UY5cWBpXeoFAHg77NPn6Acv4bAP4rPlaFfsiBvve/foF9yIGDvcYCvuOFfcs+nz7LAYO+zT5+gHL+GwD+B77NBX3Igb73vn6BfsiBg73GAr31BX3LPhC+ywG/LoE/Fb3LPhWBw7e+HsB943xA/dO3hX3Bvcc9wb7HNS9Lvct9yrOcd37NGR990IFMwZ9+0L7NLJxOfcqSC77LQUO+DH3EgH3gfcSA/d8OxX3HAaB+Ib3PIG4CpUFDuj3EPda9xAB94H3EgPV4xX3PJWB+0YF9xwGgfdG9zyBBfccB/s8fZX1gfX3PH24CpmBIZUh+zyZBQ4v9xJ8dvjM9xISy/ckLfcuwfcuN/ckE3L3ZPfgFZ6Tm5yYHtdn3ndVGneDe3p+HkGxNp/AGvew97gVrGFJrjkbE2r7CURLKWmVcJx1HxO0W2xuWV37UveWi0sad31/Z2llm61rHhNyKTUFE7RNud1v1Rv3Hc7T6amDpH6fHxNqwK2nuMP3SPugm8MaoZqTqKqzdnCqHg75HncBsfetvvdAA/gGOxX3QPlu+0AGWBZiBvsU+wRV+0D7L/cEOPcTH7UGDoPPz+33Vu3RzwGZ0733DfeV0wOZ99qCCr2JFfsM1T/ztLCbo6seVdkFf3l/g3UbZXSxx7+ht7ibl4N9mB/K0QWmb2miVRsvNz/7Ch8Og8/3NuH3AOXdzwGZ09/3DMf3CLvTA/c+9yAV9wzdmQbh17jy8UOtMR/7Ggb3DPtaFfcAkweunH1nY3x5Zh/7sJ2CCg73yMH3Ara7ur/BAezHxcu3z73HA/e/98gV9wTl4fcK9wox4fsE+wQxNfsK+wrlNfcEH8EEN1HF5+fFxd/fxVEvL1FRNx83wRXLw6MGp1MFzQZj1QWjl5WfoRq3aaFbHi0GyywVu50Hm5WBfn+DfnkfDvg+67H3CCfvEsP3AvHr9yDrE7z3oPf8FevbBvcZChPcwB0TvHnPbeEF+wgG+2j70BX3Avds0+/7kifTBg738N2H67H3CEXdEontre+x6/cg6xOf7/fwFdu9wMK9daNjnR9jnQV0lYKOlhqTkZOboaF9faEeE6+90QUTn6FtY51fGz1fWlRWp3Krex+0dwWggZWHfxqBg4d9cXWbn3UeU0cFabOte7cb9zyXFevbBhNv9xkKwB15z23hBfsIBg77KPH3GvcC9/D3BR34JBX3H0f3Afsx+zf7IPsI+6r7qfct+xHcCuX3Yvdw79fe3rVPSR97hR1v8dX3AvfC9wUd+EwV9w5I7/sq+zj7Jyn7jvt/9y0g3ArT9zj3VPcAxd7XtGFbH4WFHaB290j3AOv3AAH3Lu3n7QP3BhbtBqH3SAXnBnX7SAXtBqH3SAXr9wA3BpfrBef3AD33Jgov9yYKMfsA1wZ/KwU3+wDTBvcC9wAVl+sF5wZ/KwUO9534UwH3jfED91z3nRXv9wzv+wzUvTz3HfcWwnHd+yBwffcqBTMGffsq+yCmcTn3FlQ8+x0FDsAKwAr4dPceAdP3OPce9zgD9+f3gRWggZmAfRp5e4FsiR5T94oVdpR9lJcanpqWqo0e7ngVnYScgZ9/3+0YbKpmpF6apfcdGCeXcvsYBYmIi4kb+yEzRyMl5V/cbx98NmyVbJpnnxlB+wizasFzvn4Zb/sq73+n9yoF9zGO29rtGu4ytzmoHg74QJcd+EA+HQ75GcQK+EwVih34TKId+EwV96HvBhPQRAoToG1IU0FfHg74QIkK+GUuChPocgoO+ISnCvjPWgr4QHsd+GU5HfhAkQr4mjkK+SKaHfhMFWgK+EB/HfimLh34QJId+SA6Cvfuwwr49GId9+7EHfj0Ygr4RMMd+IqFCvhO1B33xGUd+0qXHftKPh0OrsQK+z4Vih37PqId+z4V96HvBhPQRAoToG1IU0FfHg77SokK+yUuChPocgoO+wanCmRaCvtKex37JTkd+0qRCi85CreaHfs+FWgK+0p/HTsuHftKkh21Ogr7nMMKiWId+5zEHYliCvtGwx37AIUK+zzUHfvGZR1/lx1/Ph0O92HEChaKHYvv9xTtEvc696H7FPcKE6D3Ohb3oe8GE9BEChOgbUhTQV8eDn+JCqQuChPocgoOw6cK9xdaCn97HaQ5HX+RCtk5Cvdqmh0WaAp/fx3lLh1/kh33aDoKLcMK9zxiHS3EHfc8YgqDwx3JhQqN1B37HGUd98iXHffIPh0O+KHECvfUFYod99SiHffUFfeh7wYT0EQKE6BtSFNBXx4O98iJCvftLgoT6HIKDvgMpwr4V1oK98h7HfftOR33yJEK+CI5Cviqmh331BVoCvfIfx34Li4d98iSHfioOgr3OsMK+EBiHfc6xB34QGIK95DDHffWhQr3mtQd9xBlHWQdaB19CmQd95jj9xcK9yf3mBXoBpWvBY0GbqWpfKkb1NDM9wbwV846bmx/dnQfjboF9fsLB/cL+/kVuwr3kOn3MuoB9zr3DgP3Ovg9FfsB2kvxsbqXqK8eXNUFgXp4gHMbYWyqu7yoqbuZmYh/mx/B1AWhc2aaXxsmMEv7Ah8O95DrqAr3Efg9FSDCSeCorJuhoh6OBpNtBez4X/sLIQaPXAWed3WZmAr3kOS+0rrkSQoO+Ifnt+cB9433CwP4kvlZFZNwZ5ViG/sDXVBBH4gHQ4cFM9P7g/cL94Pz5yOOB6eemK2jpIWFnR4O9xHTueSr0dPgRdkS9xPrN/cDIejl81D3BRP0QPdz93YVk5CRlZIeiZeYiaUbqwarnol7emuAYGBsk6AfK3cVUNB13fcS3LvUyFekMh4T8YBTBmZ9kJmUjY6TkR+Im5iJlxvcyaral4eYh5IfxeD7GwaQenaOdxsT8oA9RGU4ZZ9spXsfiQcT8YBze3pzdRpvmnqefx6IBxP0QGl7endwGhPqgPc193gVdnqYqqicmaCgnX1ubHl+dh8O+IfvAfcp9wvg9wsD9ywd92wG3R1swUBbaHR3dh6RxAX1+wsHDviH57L3HRL3ofcr+xr3CxOQ9zv4hxX3C/uD9wv33/uCBhPg9wsKbG5jYqpwtx8O9x3n96LnsvcdEveU9yz7GvcLE8j3L/iHFfcL+2YGX357ZHx6jZdxHmk4BX6nqoG0G/cUrtbcH/e++4IHE/D3CwprbmNiq3C3Hw73mPff+9/4XxL3KfcLE2D3LB3aBq+vBROg0fsHBfcVBvsX91X3EPceBfsVBiv7AwWI94P7CwYO95Dp963nAfeE9wsD90X5BxXK+3kGNbJP7bKgkJOrHnjmBYV7fod/G213lbEf99n7SgcO95j35yfnEvcB9wSo56f3BROw9wH3mBX3BAYTcPdrBxNQm5GQk5Ibk46Gfx/7cuf3awcTeJuQkZOTG5KNhn8f+3L3Bfd6B81vtlxlcnFwgh6thHWecBtkd3Ryfx+JBoKzBTIGDveY998v7xL3KfcL4PcLE7D3LB0GE3D3bAfdHWvBQVppdHNxHogGg7IFKgYOfQr3kOv3Fwr3mvexFXahpH+oG9TQzPcG8FjOOmlpe3VyH4gGg6kFKvxS9wvlBvcTBLsK95DrqAr3Efg9FSDCSeCmqpieoB6GXQUu9wv4Ui4HgmkFiAapcXGXmAr3mPffLPIS91/3CxOg91/3mBX3CwYTYPc2B8KhsZ6rG6OZiIWfH6LtBZN5fZFsG15ec1VuH4gGgtEFKQYO95Dh90LiAfc09wvN9woD9x/3wBVvtMl3whv3AMW7ysZQpFaaH2SWapKbGpeWj6epqIF6qB7A0AWhaFyiThssTmBKVMZvvnsfs3+ug3saf3+FaWdpl6FmHg73kOf3L+cB92f3DAP3Z/glFTK0T/cDt66Uk6Yed+AFhXt4h3cbYnWYuR/r9w/n+w/gKAd8NkOHBTPNBw73kO8v998S9x/3C973DBNw+GH44xX7DAYTsPtoB3R7f4d4G2+Dmq4f91H7C/tgBzqqVda5rZ+qpx6NBpRgBewGDveY4QH2+AoD93j3mBX3HQb3CPffBfsFBmH7IYFpg2mBZxmJBoGvg62BrWH3IRj7CwYO95jp4eoS93K//wAagAD/ADaAABPg9xb3mBX3HAaT3pC8jaWNoRmNBhPwjmePbI9tlDgY9x4GtfffBfsABoD7HIdqi2qHaBmIBoeuh6yFrH3bGBPgPAZ/O4Rsh2iIaBmJBoeui6yHrH/3HBj7CAYO95j33wH3AvgGA/cC95gV9xAGo7eTnpWelJ4ZjQaWeJl4lnipXxj3Ewb7BPcy9vdBBfsRBndeg3mCd4R4GYgGgZ5+n4KdcLgY+xMG9PszBQ73HeYB9xH38QP3RPd8FXczBYeamIiiG9+vs+avH/cD99cF+wYGbPsPg2uFbIRsGYkGg6yFqYGqZfcPGPsLBvcS+9KIfQV5hH5+bBuFgo6MhR8O95jn9yfnEvct99P7wPe7E+D3LfeYFffT5/svBhPQ9yr3RAXK+7sv9xcHE+D7KvtEBQ73kOS+0rrks/cISQo690QV4QZQ9wgF+wwGDveQ5L7SuuSz9whJCsz3uBX7DQZQ+wgF4QYO95DkudK/5AH3JfD3APcFA/cl+DAVM7tD9eLczfb2Rc4jY1t/cWQeskMFmKWjk6MbsKWAYpUf+14GiYOIenYa8HIV9wAGZ4RzgXAbZX+gpB8OaB33H+a06fce6wH3EfcN6PcLA/dM95AVZD8FcbPDgK0b9wjOueIf99MsB4JsBYkGp3NtlmwbR0FIJy/DRt6nqJWdoB+IbAV2iXh6YBtyZ5KabR/3BPcFFW91ori8o6CimZ+HgJcfKAd4f32GehsO+Bbb9yDbAfcp4/cU4wP3wfgWFeHNy+HhScs1NUlLNTXNS+Ef2wRlcae1taWnsbGlb2FhcW9lHw73J+73PO0B1fcs9yj3LAP3BMMV5uYFqn6shayrrZGqDCTmMODgOtsFoKmYr7YatX+vdqge29s24DExBWyYaZJqammEbAwkMeU2Nto7BXduf2dhGmCXZ6BtHjs7Bfdb91EVv6urtbWra1dXa2thYWurvx4O+wL56vuc95wS3fc4jPcEkPc4E5D4nPimFWG2WKpHlggTUPcV+wT7FwcTaCR5TU00+1D3rpdHGnd4gWZRV5+zRx5B+wgFE5C/XtdwyoMI+yb3BPcrBxNo9wSgxNDe90r7rofDGqCdlq++sHtrux4Oi/ck9w7z9x73HhL3F/c3+wj3KRPo9633KBWsrZimshqRi5GKkR73HPMGE/D7NAaGnYicnBq6CniRdZN2Hz6FBSkHE+j3AQaMhouFhhpFV1lMcx73Nx2L93I7273b96539y0dE3ii+Q4V9y77rgX7Ezv3OFn7ODv3OAYTuPsi90AHE3j3Ivc42/s4vfc42/sTB/cu964F+0AGWvsKemB5X3pgGYcGebV7t3m3WvcKGA5/9xjj37ff6fcYAef3QAP4hPc8FW1va3lhG1VkqcV2H/dU3/tjBoqTi5SUkYuRkRr3jN/7fwbInbCswxuzqXt1qR/p5wW/V0elRxv7JPsCOvsmZx9LhgU9wAeKg4uDg4SLg4QaV4cFPcoH+yau9wFB9x0b29Grx8MfDl/5UAHl9zrB5wP3yvdbFWifeLG8GrycsbCfHvcs+1sVen53f3SGCPeJB5mImYSbftn1GG6oYKBZkAjkLy0H+xR0LzD7Ihr7KOEv9xp4HjDn5ge2krqesawIDiv3GveS9xD3AvcceXcSuPiT/Dz3/hPY+MD5GBUT6JV1WJNxGxPk+ydUUvsrch+HZQV5Bj+FBfsK2gd++wp6+wp8e1uJGXqMeY16kHb7Exibg7GFuooI9yy07/cKmh+g9z4F9wv3ECMGkb8FsZShn7gboZyFh5kfDpV2pXb4nPcYhnekdxLT90DbwRNm9/r4lhWPjouOG5STioqSH138GX+OgI+BkRlcxBV9q4O1vhrgn8exqR73QvvZFXVzc3tthbf4BhiThpOGk4Xp5xhtqWigZ5iY9wQYVQZ/JwWMgoGMgomJi4kbl+0FVQYTVn8kBfsrcyr7CftQGvsz0CbyYR59+wwFwQaX85aJl4qWihkTjn8nBcEGl+7TkMqqvsIZDov3JM3ft9/h9x4B9xf3NwP3rfcoFaChmJ6SoAj3IN/7IAaImoeahpkI9yzf+zwGugqHi4iMhx9LhgU94weRfJB9j3wIcAY/hQU98wd7WmBnWXgI9zcdi/cP9wPLt8v09w8B4/cO90j3DgP4Jve+FWIGfbcFvQak+28VhwZn9wMFpgb7YssVhrcFsgaZXwVC92kVjwatIgVxBvgaSxXLR/d4+w77eEsHh5c992wF+zD7eAZHhQVRz18HR4UFUc/7fvcO937JB5F52ftsBfcw937Py0e3Bg6gdvdf9cTzxfUB2fc2A/eE98kVxPcGB2d+bHZeG/dvBLiqeGSYH/sGxQb35lEVTQb3DXQmtvsKG/tY+zkGSoYFKcz8Avc291+tB/cI8773BKEfyQYOi9+t9wT3JPcGq9839xIS3/ck9xb3IBPu7Rb4Rt/8Rgb3mPdEFXV2eoNvG2VxocK4rqGso56FfZ4fE/b3IPeOFRPutfsgBxP2YfsuBxPuN/cugwePTwWjbnGXXBs2MEn7BvsOz0fzt7Sbp6gfjQaVaQX3CPgcBhP20pEF2QcOoHb3X/Wky7P/ADyAAP//w4AAy6X1Etn3NvcO92wTpveE+CIVE6+z9w0HjIOLg4MahYuGioYeE+b7DTIVE6ak6QcT5nt7c4JuG/dvBBOuqqKDeZwfKwYTpqUHE6/35nEVRQYTp+xpLq4gG/tYBhO2+xkHS4YFUctiB0uGBVHL++L3NgcT5vdfrQcTr/PqtOWtH9LLUgaQi5GQGpOLk4qTHsUGDvsC94D7BHb3hfcg9yD3eiJ3oncSx/dAw/cEgfcsE7KA9973fhXHIwaIgn6Kfxs/W8v3FPcQtdPXs6l7cakfE2aA6ecFE2cAYrRZplaVCBNzAPH7BAcTawAiB/sbbi77B/tLGvtQ7CD3F3MeE6cAJPcEBxNnAPIHE2aAv5W9pLOtCPfM+2gHDpd2oc0KoHcS0/dA1+cTXPfU9xgVWqVwyuwa7KXMvaMe9zD75BV4d3Z8c4QI+BEHn4SdgJ1+6ecYYbVWpFSTCBOs5C8xB/sndCb7CftSGvtY8yD3JHkeJucHE1zxB8eVwam3uwgOoHb3Svccv9+39xw33xLc+E4T7Pif+Q4V/E4GE/T7HNIHyrWAapwf+wIGOIUFPfdTB2l6YnlNG0T7HN4G9yv7SgX3Uwb7Sfdpy6i4vpjYGdffPQYT7IKyc6xoowj3JgYOlHb5GncB9fdA9xn3JQP3qvcoFfcg9ycdu/cnHfcG+0D7Wgc9ZQUvB9mxBVsHPWUFLwfZsQX7bAf3toP3NPP3TxqUiaCGnh77IWsFjn6Lg4gaUVJaP4IeDqX46gGX+NQD7aUxCg6l+OoBl/jUA+2lMQoOpfjqAZf41APtpTEKDn/l9zLleeX3MuUSovcI0/cIVfcI0/cIE733Q/fIPh0//AgxChPD+zj8vD4dDn/R9wrR9yLR9wrREqPr0+ul69PrE/33MPgYcwr4FsMV/Fr7WKFZ+G73HgX8QPw2cwoTw/e2RXMKDov3F0DW9wfP92fSCvc89wATrvcCCvwY+5oV4Tf3NPdaUcEF+xn3ixXc+2H3EPfOKwYTtml2doJVhQj31fxnFaTBqcgFjgaFIQWCB/c0Flf3S/syBhNu+wH7WwVQ9zMHE65T9wAHE27DvwcOi+/3FO33W9IKn/eh+xT3ChPY4R0T6Gl2doJVhQgT2ELcB1n8hzEKE9z7vPywFfeh7wYT2kQKE9xtSFNBXx4Oi/cXQNb3B8+F5b7JuOUS9xf3QPsA9wz3EvcAE56A9wIK+/9wLgoTnYByCkX7yxXhN/c091pRwQX3UfsnFROugKTBqcgFjgaFIQWCB/c0Flf3S/syBhNegPsB+1sFUPczBxOegFP3AAcTXoDDvwcOf+W+ybjl91vSCvcC90D7APcME+7hHRP2aXZ2glWFCBPuQtwHWfyHMQr7wPyXLgoT7XIKDn/lvsm45YXv9xTtEvdL9wqCntL3QPsA9wwTmwC199QV96HvBhOdAEQKE5sAbUhTQV8ew/v5MQr7wPyXFWi/u4mzG9XLt8Wve6VamR8T6wC0mZefrxrAU7BIUVp6dGseukMFlZ+gl6Ebn5eDf3V2iGwfTQcT2oByCg5/2PdK2vdb0gqbfB0T2ADhHRMoAGl2doJVhQgTGABC3AdZ/IcxChOEgFgdf9j3Stp55b7JuOUS9xj3QPsA9wxvfB0TvCCx9+0uChMyALiegXh9e4N5cmpFCn/Y90raeeXBy53vEv8ASYAA/wDlgAAg9wxvfB0TqiCx9+0VaL+6ibQb28W+yB8TEgDHYa9JHhMUAH95iYmDHxMMAI2hBfcX7/tzBhMUAH77NwUTMgC7awWUnJePnRudm4N3eXuDeHJrRQp/2PdK2vdk7xK+96T7cfcVxHwdE+yA8ffUFfcVBhMwAJD0mcrU3gjK+6QnBxMoAPcdBhPsgFY+b1eGNgiH+7oxClgd96L3DAH3gvcQA/eC5RX3EPdI90L3DPtC90j7EPtI+0L7DPdCBg6UCvX4UgHY+FID9zb1Ffce9x73Hvse4OD7Hvce9x73Hjbg+x77Hvse9x42Nvce+x77HvseBQ7L90Ct9wyt90AB92T3TAP3wPg8Fb+zr729Y69XV2NnWVmzZ78fL/umFVmzZ7+/s6+9vWOvV1djZ1ke+yT3DBW1HQ73dsIK9/gVfwoO9yr3DPcM9wwBy/hsA8v4GhW1Hfv8BLUdDqP4/AH3BvcgA/cG96YV+Bz7jgX3Lgf7kPcsBY8H95D3LAX3Lgf8HPuOBQ6j+PwB9+73IAP4evgaFfwc944F+y4H95D7LAWHB/uQ+ywF+y4H+Bz3jgUOi/cMEsv3QvtC+GwToMsWtR0TwPdABPhs+x4F9yAH+zKv+yCpBY8H9yCp9zKvBfcgB/xs+x4FDov3DBLL+Gz7QvdCE8DLFrUdE6D4bPfMFfxs9x4F+yAH9zJn9yBtBYcH+yBt+zJnBfsgB/hs9x4FDov3DPc+9wwB94L3EAP3gvc+FfcQ9wz3QvcM+0L3NPsQ+zT7QvsM90IG+0L7thW1HQ73ovgk+y73LhLX+FQToNf3ohX3IAax9wIFE2C39xwFjwa3+xyx+wIF9yAG+zD4JAX7HAYO9yr3DPcM9wwBy/hsA9mpFfUG0fcMBfeu9wz7bAbN9wwF9yr3DDcG0fcMBSEGRfsMBfuu+wz3bAZJ+wwF+yr7DN8GDvd+9wxb9wwStfiYE2D3JPd2Fb2dpamlGxOglh0TYNEKDvcG9wxb9wy79wxb9wwStfiYE5j3JPfuFb2dpamlGxOolh0TWNEK8fu0Fb2dpamlGxOolh0TaNEKDvei9wwB+DD3EAPL96IV9/D7SPcQ98D8bAYOf/ce94T3GgHv9zXk9zYD9/L3RBX7BLM/9xCwqJOTnR539xIFiYKFiYQbb3uVrZmL85HZH9n3GvyYBj+FBfsU6wclg/sYefsYHvdAgQWT9xSS9xz3BBroBkGHLXUaDvcC9zL7FvcQ8/cy+wD3EBJ69xD4FvcQE1z3FvceFcW1pr6qH48GE5w1wb130hvt2tz3K/cGP98wSVtzRVwfhwYTrMBtYaRPGyVHP/saHxNcL8s33h4TnPdh92wVtqapnqobtadvWWZzamNgcavBch8TbPtILxVteaimpZehqaOkfGCcH2l8dn9zGw5/9x77GPcgygr3GPc2E3DD+1wV90IGg9OJzInSCH+ZoYmdG7exqb+hH48GE7BToLZr0RuwqJGTnR939xIFiYOHi4UbdXuVrdGR9yqR9wIf+0IGE3D7wgdgdnR2aRtpd5vLH/ey+0AHDn/3Hvc69xb3BPceAcD3MfdE9zYD96b3EhVqbKC90rKjs6uqfWSgHzF3YXRmGzb4ABWoqqmasRvXoUcwH4iLh4gar2xfoF8b+w4vK/sf+w7mPvcD9z/3Dvcs93r3QT/3Ffs5Qk9vW1EfDvsy9xT5SvcUEvdm9y77CvcuE9D3KHEVe/sQBYiXo4akG/dBrfcB9yUfE+D3QGf3CvcwGuWXq72Zl4qIlR6bfAqOf3OQchv7QWn7AfslHxPQ+0Cv+wr7MBovf21ZfX+MjoEeDkH3OPs4+hISofjeE2D3aPhaFftSP6c916kFE6D3KvwoBfcIBvds+hIF+wQG+yr9FIVthW2HbRmHBoWpg6mDqQgOi/ck+A73FAGR+OADkRb44PMG+1L4tgX7ZAb7Uvy2BfdMsxXB91K991AFjwa/+1DD+1IFDov3HvgM9ygSkfeU+4T3RPcg95T7VPdEE9SRFhPk95T3EAYT1FnLfc3jGvGv0c3Nr0UlHhPYM31JWUse+xD3lPceJY8HE9Sxs7vb7Rr3SPsC9w77PPs8+wL7DvtIKbs7sWMehwcT5CUGDvsM9yT4ZvckAcL4jgPCdxUn+I73JPu6jwf3MPd4+yr3egWP9573JPxuJwf3TPuqBQ74ePcqAZn3QPd490ADmfsMFfdA+PD3ePzw90D5hvzQBg5/9yL4ZvcQAfc19zzT9xwD9934fRXcn6WhnZd4a0t0W1pcHvc6+2gVd3Nrc2UbY2uiwx+hB/cs9sPc9xEa9wBIzyL7CjU7+0Ee+14HbHhpd2Z1yiMYm5WblJqUCC6m31zoG9bHs7W8Hw5/n/fInffGnwGl9xb3tvcUA/c4zxWHkYeRkxr3dAeNjY2NHvgyBo2Lj40a9077D/cq+yv7K/sP+yr7TvtO9w/7Kvcr5dm/28EeZQZHXUlfRRtVWaGxaR+H954ViYmNjx/3cAeSj5SPkR6vrb2hwRu9vXdprR+RhY+Dgxr7dAeHiYmHHg73TPccAZf4wAOX944V96z7oNvn+xb3AgX32vcc+9oG9xb3Ajvn+6z7oAUOcfjAAfd89xwD9774phX7oPus5zv3AvcWBfva9xz32gf3AvsW59v7oPesBQ73TPccAav4wAP44PeSFfus96A7L/cW+wIF+9r7HPfaBvsW+wLbL/es96AFDnH4wAH3fPccA/fCcRX3oPesL9v7AvsWBffa+xz72gf7AvcWLzv3oPusBQ73GveUAfdC95AD90L3GhX3kPeU+5AGDuP38AH3EvfwA/fA4xX3QvdC+0L3QvtC+0IFDr3fwvcmwt8B5eO/9yC/4wP3wPdRFbOpq7S0batjY21rYmKpa7Mf+x8E9wzl5PcP9w8x5PsM+wwxMvsP+w/lMvcMH98ERVfB1dW/wdHRv1VBQVdVRR8O6cH3UN8B9x/B90zfA/dV9ygV91D3TPtQB/uCVRX3mgbH0QX3lPuQB0VPBQ6Z+KwBnfjIA52Z3x2Z9wIBnfjIA/dj9xAV6PdQ6ftQBfwM+wLfHYv4yAG/+KwDvxbnHYv4yAG/9wID9zb3UBX3Twf3UC4F+777rhXnHZn4rAGd+MgD976ZFY8G96z4qgWN/MiJBw74TPcCAZ34yAP4HvhMFS37UC73UAX7UfcAFfes/KoFjwb3rPiqBY38yAcOi/jIAZf4rAOX96wV+Kr7rAWN+MiJBvyq+6wFDov4yAH4SvcCA/eO964V91DoBftPB/cC+AwViQb8qvusBYcH+Kr7rAWNBg73GB2swRX4pPiM/KQH/MxLFfjkBtHbBfjy/NoHO0UFDvcYHfitwRX8jPik+CEGUSRZ+wpm+xEIhwZw03DRX9P7AEUYyi6zQLAl9zKdGLb3M8X3FMryCMv3whVlYmRbZ1QI/EsGO0UF/Pz45AfR2wX42AekqaOlpKMIDnf5WgF3+R4D976JFd33vPcQ91D3EvcKI+UY+xT7GPsE+2hD+4QIhwZq3GbdV9z7AEUY1CW3N7b7BggObfd4Afeo5/PrA7fHFUvHccP3FtnV9x4e9+sHzXWxUFEaZ4dxgW0ewXUFp6+nx8Ua3WnFK8seWa2Bk3+hCDH8kAaRg3ORcRssPE0/Hw6B9yT4HPckAdH4YAP3fIEV9xwG9zb36Ps29+gF+xwG+zb76AX3ePtYFVn3CGXbsdu99wgFjwa9+wixO2U7WfsIBQ732Pf8Afdv91UD92/32LwdDvfY9/wB5PhZA+T32Lwd94P7/LwdDoMd95+wHfefjQoTYEgdDviSyfcUyQH3zd0D93n4khX3B4e+wdca11jB+weHHk0HzZ1xZWV5cUkfDviSyfcUyQH3Yd0D+Af5jhX7B49YVT8aP75V9wePHskHSXmlsbGdpc0fDogKhwr40vdCAfcS9/AD9xL40iwKDvjS90IB9xL38AP3ePjSLwr4BvgQjh33jPgGFfMGrfgQBftABg6PHYcKiAr7ovgQjh339PcCFSMGafwQBfdABg740vcwAfcK+AAD9wr40icd+Mj3RAHt5AoD9074yBUvHfd4Fi8dDo8d+NLnAfcm6fcM6QP3wPjSPwr4usnjwQr4ulkd+NL3LgH3OPgSA/c4+NJ0HfjG9zYd+MYhHWQKhB2ICvYd9xL3lgP3jPlQfgqHCvYd92z3lgOwCg740vdCAfcS9/AD9xL40iwKDvYd9wz3/AP3jvlQMR0O+NL3MAH3CvgAA/cK+NInHflQ9yYB9wz3/AP4APlQFcG9t/GXHzUGMh0Ojx35YPcAAfcs97wD9yz5YJ8d+NLnAfcm6fcM6QP3wPjSPwr2Hfcy97AD98D5UBVOHfjG9zYd+MYhHflM90AB92D3VAP3wPlMTQr4yPdEAe3kCgP3TvjIFS8d93gWLx0O+UriCvdY+Uo2CvjCzcHfAfe29w4D95r4wqoKDvlEzcHfAfe29w4DoB0O+LrJ48EK+LpZHflMydvBCvlMlR340vcuAfc4+BID9zj40nQd9h33LPgeA/ee+VCIHfjS90IB9xL38AP3ePjSLwr2HfcM9/wD9/L5zDAd+NL3LgHB+BID+AT5bBX7Ggbt+y4F8wb7jPcuFfsaBu37LgXzBg72HcH4HgP4VPlQFU33IB3n+xAF+xz3EBX7JAbn+xAF9wYGDvi09woB93bMA/fg+ZIVQ3FpWlAaUqNsu6ulo7GtcaFsiImLiogekKWinLCXCA75GPcKAffFzAP3nPiwFdOlrbzGGsRzqltrcXNlaaV1qo6Ni4yOHoZxdHpmfwgO+Dz3dAH38vcYA/fC+DwV7I/es+kar3ure50e+whZBZKAlHp3GmFxgGmEHg77nPc2HfucIR37cuIK91j7cjYK+37NAfei9w4D95pjKApkCmQKhB37ePd6Afde9xAD96qNFXJ6WFlKiwqnn6mtpx8O+2j3JAH3MOnv6QP3wPtoFeu5zdn3Bwpth3x1bBtsfKGphx8tnh0O+1j3EQr4UDN6HfjI9xzF2RL3FPc1ChPo91j4yEcKE9D3Dgr5SvccudkS9xT3NR0TUPcs+gAV97zZ+7wGE+i3+5hwHasK93b5fBX3AAb3DPcGvgr7Bvu6cB2xHRNw92z58BX3HAb3DHwK+0YGE/Ap+7ZwHasK93iLHfciHWNvbWVlp22zHw6xHRf3WPlKRwoTcFX3tjAdqwr3tvcECqn7SG8KsR0TcPfG+mwV+0YG9wz7EAX3HAYT8J/7Om8K+NL3GFH3DBL3LPhYtwr0ChNgxh35UPceCvcW+H0ToPg5+ZYV6wYTYPH3EPcHHROg+/v7VjUdDvjS9xhR9wwS9yz4NLcKE2DkHdoK+VD3Hgr3FvhBE2D4f/oS7QoToPxBRTUdDvjS9xir0QH4YvcCA/cs+NIV8wa1yQWPBkcdoQr5UPcKRb/BzxL4YvcAE7D4UvmAFWAKE3B7f4Z7iB4TsPvEJzUdDvjS9x0d9yT3zD/TE+D3JPjSZx0T0Dsd+VD3Cq/3DhL3FvfoNdMT4PcW+VA1HYG0HRsT0IMK+NLdtZ/pCveO+U4V3wbl9wwF+wwGh/uINwoO9yIK95H5vhXfBvF8CvsSBn77fmsdDvjS3bWf6Qr3vPnGFfsMBuX7DAXfBln7EDcKDvciCvez+joV+xIG8fsQBd8GXPsCax0O+NLduprq0QH3qvcCA/fA+NI3CmX3FWodoQr5UNWtm+XPAfes9wAD95z5vBVgCnt/hnuIHrv7NGsdDvjS2dP3DhL3KNND98RD0xPQ98D40vMdc4V6dWAb9wQdE+j7LPcqFdMGvQo7HflQ1dv3DgH3MsP3OtUD98D5UGsd+zT3LhXmCkEG7goO+NL3EwoB9yT3zAP3JPjSYB3ZrxXktsHPjR89BnOGfHdnG2d8n6OGHz0GR422VeQbDvlQ9wqv1QH3FvfoA/cW+VA1HdWvFeW3t9mTHz8GbYN7eWEbYXudqYMfPwY9k7df5RsO+Lj3dgH3kPMD99v4uBWyCpH7dgUO+TbNAfdk9w4D9+b4tn4dDg4ODkwdATv5jAPwHawdQAoBO/mMAzv3IBX5jPfU/YwGDvwkHAV4ZgocBXj7NAYO/CQcBXiEChwFePc3Ckwd9xkd93AV9xr3NPsaBvdc+zQV9xr3NPsaBvdc+zQV9xr3NPsaBg5ACvcZHfcgFfca99T7Ggb3XPvUFfca99T7Ggb3XPvUFfca99T7GgYO+yX3cvcD93L3A/dy9xIK+yUV9zT3cvs0BvcDBPc093L7NAb3AwT3NPdy9wgd+yX3cvcD93L3A/dykR37JRX3Kgr3AwT3Kgr3AwT3KgoOTB3wCvdw9xMd9yr7NPcTHfcq+zT3Ex33Kvs09xMdDkAK8Ar3IOgd9yr71Ogd9yr71Ogd9yr71OgdDvs991DJ91DJ91DJ91D3Egr7PRX0HckE9B3JBPQdyQT0HQ77PfdQyfdQyfdQyfdQkR37PRXzCskE8wrJBPMKyQTzCg73cPc0Zgr5APcwHfcACvcg99RmCviw98D31PcACvdw9zSECvceHfywBg73IPfUhAq2HfywBg5dHfAd98DmHfmg9wAKgAr3wPcUCvnw9wAKagr3Hx35oPywBg6BHbYK+fD8sAYO9xcd93AV+GD3NOgKBg7tHfdw9yAV+GD31McdBg5zHfcg93AV+LD3NNUdBg7CHfcg9yAV+LD31NUKBg5dHfAd+GD5oMUdgAr4YPnwxQpqCviw+aDjCoEd+LD58OMd93D3NGYK+QD3MB3oCgYO9yD31GYK+LD3wPfUxx0GDo8KE8D3IPdwFROg2+Yd+QD3MB0GE8DVHQYOjwoTwPcg/CQV99T3Hh0GE6DoCv0ABhPAOwYO93D3NIQK9x4d1R0GDkAKWwoTwPcg9yAVE6Db9xQK+LD3wPfUBhPA1QoGDkAKWwoTwPcg/CQV99S2HQYToMcd/LAGE8A7Bg73IPfUhAq2HdUKBg5dHfAd98DmHRwFeMUdgAr3wPcUChwFeMUKhgr3wOYd+QAGE8Db+aDjCoYKE8D3Hx35oAYToDv3KR1qCvcfHRwFeOMKQApbChOgO/cgFffA9xQK+LAGE8Db+fDjHUAKWwoToDv3IBUTwLYK+fAGE6A79ykKgR22ChwFeOMdXR3wHffA5h35APfAvApdHTv3IBX3wPcUCvkA9zAd+8Db9wAKXR3wHffA5h34sPfA99T8YDuqHYAK98D3FAr4sPfA99T9jAYOagr3Hx35APdwvApzHTv3IBW2CvceHftw2/ywBg5qCvcfHbYd/LA76x2BHbYKth39jAYOXR3wHfmM8QpdHTv3IBX4YNv3MB37wPkAxQpdHfAd98A7+GD31PvA+LDFHYAK+Yz31PvA9ykKagr5jPIdcx079yAV+LDbTB37cPkA4x1qCvdwO/iw99T7cPiw4wqBHfmM99T7cPiw4x1dHfAd98DmHfkA98DxCm0dEkwdE6D3JQoTYPkA9zAd6AoHE6D8sPvABw5tHRJMHRNg8B33wOYdBhOg+LD3wPfUxx0HE2D9APvABw6ACvfA9xQK+LD3wPfU+8D3KQqGCvfA5h35APcwHQYTwPtw+QDjCoYKE8D3Hx33Hh0GE6D7wPcpHWoK9x8d+QD3cPIdjB0TkPclChNQ+LDb20wdBxNg1R0GE6D8sPtwBw6MHRNQ8B33cDvb9xQKBhOQ+LD3wPfUBxOg1QoGE2D9APtwBw6MHc4dBxNQ+3DbO/cvHQYTkPyw+8AHDowdE1DwHRNg9x8dBhOgth0HE5DHHQYTUPywOzv7cAcOQApbChOgO/cgFffA9xQK+LD3wPfUBhPA+3D4sOMdQApbChOgO/cgFRPAtgq2HQYToPvA9ykK9woKzh3VHQcToPyw+3AHDvcKChNg8B33Hx0GE6C2HdUKBxNg/QD7cAcOgR22CrYd+3D4sOMdTB33Ngr3cBX3Kvc0+yoG98D7NBX3Kvc0+yoGDkAK9zYK9yAV9yr31PsqBvfA+9QV9yr31PsqBg5A9473jveO9xIKQBX3NPeO+zQG944E9zT3jvcIHUD3jveO946RHUAV99T3jvvUBveOBPfU9473NwqlHQE7+YwDO/gQFfmM5Qr8dASsHfwkHAV4yB0c+ojnCp4K9wAK93BSCsf8JBX3NPkA9zTmHfkA9yD3NPxgBvcIHewK/CQV9zT5oPhg9zT9AAb31P5AFc0ddQr3wPxg9zT6QPcACvdwUgr4EPwkFfc0+aD9APs09yDmHfkA9zQGDmEKO/gQFfhg/aD3NPpA/QAG/HQE9yQdDsf3NPc09zT3EgrHFfhg9zT7wPc09zAd+8D4YPcIHfdwUgrH93AV+QD3NPsg9xUK/QD7NPkA9wgd7ArHFfkA9zT8YPmg+zQG99T9AKgdDnUK+GD6QPs0/GCqHfdwUgrwHfkA+aCnHWEKO8cV+QD6QPs0/aD8YAb3NASxCg6eCvvA+GD3CB33cFIK+BD8JBX3NPkA9yD3NPsg9xUKBvvUHPqI5wrH9zT3NPc0yB39AKgdHPqIBM0ddQr3wPxg9zQcBXj7NPxgqh33cFIK8B33IOYdHAV4+zT9APsgBvhg/aDnCmEK+BD8JBX3NBwFePs0Bvxg/kAV9yQd9zQEsQoOx/c09zShHccV98D8YPc0+GD3wOUK9zQErB33cFIK8B33IOYd+QD3NOYd+QD3ILwKYQo7xxX3Cx39ABX3NPhg9yD3NPvABvxg9zQVrB3H9zT3NKEd+BAV+Yz3NPvA+GD7NPxg+8AG/HQErB33cFIK8B35jPc0+yD5AKcdYQo7+BAVsQr4YPs0qB38YP5AFawddQr3wPxg9zT4YPcwHfvA9zT3MB37wPhg+zT8YKod93BSCvAd9yDmHfkA9zTmHfkA9yD3NPsg+QCnHWEKO/gQFbEK/HQE9wsd9zSoHRz6iATNHfdw9zRmCvgkBvcO7e33Dh7b9zQ7Bvtm+z77PvtmHw5dHfgQFvdm+z73PvtmHjv7NNsG9w7tKfsOH/wk9zQHDl0d+BD6fBX7NPwkBvsOKSn7Dh47+zTbBvdm9z73PvdmHw73Fx347BX7Zvc++z73Zh7b9zQ7BvsOKe33Dh/4JPs0Bw77rBwEiAE7+YwDO/sMFfs09zQH+Oz6fAX3NPs0Bw7dCvjs/nwF9yEdBg7dCveQ/Dj7kPw4Bfs09zQH93D4Avdw/AIF9yEdBvuQ+Dj3kPg4Bfc0+zQH+3D8AwUOTB0BO/hgAzv3HB33cPmg9xIK93AV9zT5oPcIHUwdAfdw+GAD93D3HB38JPmgZgr5oPcIHUAKATv4YAM79xwK93D5oJEd93AV99T5oPc3CkAKAfdw+GAD93D3HAr8JPmghAr5oPc3CkwdATv5jAPwHffAO/hg99T8YDuqHfcOHfwkFffU+aA79xUK/QA7Bg5MHQE7+YwDO/cgFfhg2/cwHfvA2/cACvcOHfdwFdvmHfkA2/mg9zcK98D4iAGL+OwD98AE+Oz4iPcBHftc9xGGHfcR9wEd+1z3joYd9473AR37XPgLhh34C/cBHftc+IiGHfiI9wEd+1z5BYYd+QX3AR37XPmChh35gvcBHftc+f+GHfn/9wEd+1z6fIYd+nz3AR2bCvih9wYK+KH6fPyhBg6bCvhW9wYK+Fb6fPxWBg6bCvgL9wYK+Av6fPwLBg6bCvfA9wYK98D6fKodmwr3dfcGCvd1+nz7dQYOmwr3KvcGCvcq+nz7KgYOmwrW9wYK1vp8QAYO+1z6fPcMCvp8qh2rHffAWe4d+Oz8iNAdzwoOqx33KlkVqQb7SPfABVkH98D7ju4d+Fb8iBWpBvx0+bQFWQf47P2C0B33AQrPCvfA9xoKDqsd1lkVqQYi90MFWQf3KvsRFakG+0j3wAVZB/d1+44VqQb7k/g9BVkH98D8C+4d+Av8iBWpBvwp+TcFWQf4Vv0FFakG/HT5tAVZB/ih/YIVqQb8v/oxBVkH+Oz9/9Ad/f8VvQf8g/nNBW0G+KH3AQr9BRW9B/vt+NMFbQb4C88K98D8CxW9B/tX99kFbQb3dfcaCvcq+xEVvQde1gVtBg75N/cRAYv47AP5NwT47PcR9wEdrR34odYD+KH7XBXW+nxABg77XPiIAYv3wPcGCvfA+IiqHftc+Ij3DAr4iKod98D4iAGL98AD98AE98D4iKodmwr3wPcGCvjs+Ij7wPiIqh33CAr5tAT8iPfA+IgHE6D8iAT8iPfA+IgHDpsK98D3Bgr3wPiI98D4iPcBHa0d98D3wAP3wAT3wPyI98D6fPcBHffA+IgB98D3wAP3wPfAFffA+IiqHfcICvtcBPfA+Ij7wAYToPfAFvfA+IiqHa0d98D3wPcGCvjs+nz7wPyIqh1/l/iIl8+XtZePl62XBvtQlwd/l/h6l9eXv5eRl7eXCPttlwkeoGJfDAmLDAv3Ggr3QAv3GgwM90AMDfjsFMsTAQ8CAAEAPQBxALkA2gEdAW8BswIzAlMCgQKTAuwC/wNVA4sDogPbA/gECQQvBG4EjwSbBLQEwAUFBUkFcgWZBaQFwgXFBcoF4wYZBisGTAayBsIGywbXByEHOAc+B8oH3QfkCEkIdAh5CH4IgwivCLQIugjECNEI4QkGCQoJFQkeCSoJRgldCWUJhwmMCaQJtAm9ChIKMAo2CjsKZgptCnQKeAp/CpkKoQqwCtYK4wr2CvsLAgsICxsLIAs4CzwLeguFC5cLngurC+kMBwwPDCIMKQw2DEQMVwyFDJEMlgygDM0M0gzeDO8NFw0uDT4NQw1ZDV4Ngw2HDZYNmg2fDacNvQ3EDckN0A3gDfIN/Q4FDgoOFw4kDigOLA46Dj4ORA5hDmoObw56DoQOjg6WDpsOog6nDsIO3A72Dw4PEQ8XDxwPKA8/D0oPVQ9gD2sPcQ94D4EPig+OD5MPlw+sD7EPxQ/SD9gP5Q/vD/kQABAHEA4QExAZEBwQIxAoEDwQUBBiEGwQcxB4EIQQihCQEJYQqRCyELgQvxDDENUQ2RDkEPUQ+hEKERERGxEjESoRMRE3ETsRShFZEWgRdxF8EYERhhGUEZkRnxGtEbsRyRHVEd4R4hHnEewR8hH3EfwSCRIWEiMSMBI9EkoSVBJbEmISaRJuEnkShRKKEpYSoRKtErkSxRLJEtES1RLbEuES5hLrEvYTARMHExITFhMhEywTMNcd9zL3APcS92r3afsA9w37Mvsy+wD7DPtq+2r3APsS9zIf9ygEU2nV9wr3Cq3Pw8OtR/sK+wppQVMfCxWVuJnJnNmZzRmPBptKnDyZTZVeGMr7oxX3Sgb7WPkeBftkBvtY/R4F90QGq/ceBfdGBg69944V+zr3Div3MsnZn7HHHlPxBXdfZ4FjG05Uncl/H/fRBo2XkKmpGvcaO/cA+zL7GvsUKfs4HvdCxxW/l7CfthvFn2tjHwtncXeDbhtef6PDH/ey+0D7yAf7ELk79wTRvam7tR6PBguFoqWHqhv3F8bI9xvAH/dQ+IAF+zYGT/tUfFl7WH9YGYcGfcF9vXq7RfdUGPs+Bvdm/HaDdQVtfnB3VhuAf42Pfh8Lt9wVTNTpbeAb9zzn7fcC5VnDNKsfQKoFSqNmlaoaqKWau7+we2y6HuH3AAXGTDmnPhv7KCcw+wMtyVDWbx/caQXIdayBbBpudnpQWFGlsFoeC7P31BX7cvce+wL3O97as7O4HvfK+377INwxB4OBeYd7Gy5ez/cO9wrF0dK6pXtxph/p9QW3YEyzMxv7Pfsd+w77cB8LdAr3IPcqOfc3E/YgKR0T9MA2BlN1k6GZj5GXlB+Go6CJnRv3C+e79wqfhJ+Elx/l9xD7XgYT7UCTcm2PbRv7CCJR+xBRqV2xcx+HBxP0wGhzcmdpGmGhcad5HocHE/YgWXNxbGIaE+1A94P36hVqcKG7uaahrKyndV1bb3VqHwsVa08FqYOVgXsadWmDXYcel0kF8Y/jq9Mav2ulKZMeDvdqFvdA92sG92L4R/cuClX7InlZeF15VxmHBnm/ebl6vVX3Ihj7TAb3YvxHBQuzp6mxsW+pY2NvbWVlp22zHwsD1Rb3Vgab9xqT1I60jq0ZjwaQVJBckV2b+xoY91oGzfiIBfswBnj7ZoVZi1mFVxmHBoS/hL2CvXX3Fhj7CAZ3+xaBW4VXhlcZiAaFv4q9hb1492YY+zwGCxX3EAa76dcKLQX3EAYl90K+CgsD3hb3Qgam90aStZC5jrIZjgaMZJJdkmGo+0YY90YG1vkeBfs4BoP71gVVi1NRGocGgsV9xILAavcyGCcGZ/sygVR9UoNTGYcGw4vDwxqD99YF+0QGCxVov7uJsxvVy7fFr3ulWpkftJmXn68awFOwSFFaenRrHrpDBZWfoJehG5+Xg391dohsH00HCxX3JAbx90IF+xAGWy0FhwZb6QX7EAYO9zb3aBX7Gscx9zjPwZmXtx5tfAqCcG2EaRtLaqHSH/cr91r3Gvta9xb7Igd1+xb7FIUF+xT3DAcLFfc091pRwftQ+zwF+H74lhX7NPtaxVX3UPc8BQuPBrtR6h0rfAr7PAYr+xAFC/cc+/gG+xbPM/cZzK+Vm8EeZvcSBYFudYd2G2hjm8Uf+IT7yAcLA7731BX7cvcm+wL3PtvUq8vCHi3zBW1vaXVhGzNNz/cO9wrJ0du3qXtxqR/p9QW3XUezNxv7RPsi+xD7bh8L99wHo6Whmasbt5lzUx/7sq0K9xBb2/sDQlVpZWMehwYLFV0KVwr3ZIcdVwoOFeu5zdmNH0EGZ4V2cWAbYHalr4UfQZ4dC31ZBYcGt2VfnVsbCxV/epGnhB+TlZeQlxucl4R7e4GDeh/3GvdgFaZsZJxeG/sGVTY7J8FC8NXCvsvKYqlRbHOCe3kfro+aqbobop2DfZwfDhWblZOcl5yFb5Ieg4F/hn8ben+Smx8g+0gVcKqyergb9wbB4NvvVdQmQVRYS0y0bcWqo5SbnR9oh3xtXBt0eZOZeh8O9zT47hWSgJR6dxpkdX9thB6fZ2GVXRv7MvsA+wz7avtq9wD7EvcyHwsVU2nV9wr3Cq3Pw8OtR/sK+wppQVMfE/Q7ChP4gB0T9M2cu7PTTR2XXQX3IPiI+xoGC2wdE/Q9HRP49xj3Euv3OtlvyWC4HxP0ypy5s9FNHTQdDvcg99QLs/cCFXWTgZKZGpaVkpaYlYJ9g4eBg4UeCxXFBs+veVNTZ21HH1EG+xwEyQb3BPtuBfdUBvsh95AFyq21yOga9zb7DLv7IB77hv0e90AGC1Md3/cct/cGygojvR37AEYKCz8Gq6qttbYaz1W1OVNgcWNjHtFLBaCbnZaaG6SYfXYfC5eWdh+a/B8xChOBIPtU/FYVl5OYlZEepYSbf3waf3+BeXp+lJseE0DAQQoTgSD7KPsMFVjEYtzdw7a8vHGeaJ0ejwcTQMCrmaCbrBrEUq9CRFBnUmKhf6l3HocHE4EgbntseWEaDvdAE3yAXh0TvID71gcjCgsVKgr3ZBYqCgsV+0gGPfsQBfccBgsB9yP3BvcC8AP3I/g9FfsC2kzysr+YpbIeZNAFfnB0hXMbZGqWs38f92EGjZOOnZ8a41nUIjU3SCAe9waxFa6So5enG7KXdXIfC9GTw5/RGrlnq/sOjx57RQW+h5iBexoLdvgIUQoLf/cK+Dr3ChLF9yj7Evcq9yb3IPsY9zQT5Pdi90oVq5yrpaEe3mu/eV0aW2d5XVdfpb0eE9j3GvdYFUijYKG1GrernbG7p3Ffb39xc3EeE+T7rvtsFSPnRfco9zLj1/HfWL1JrB6PBxPYu6i0ucUa9wA2z/sT+xcuR/sESbFdwGUehwcT5EtrWl9BGg4Vw7Ovvb1jr1NTY2dZWbNnwx8O9yj4DvcoC1wKErX3Qvco90ATzkQdE9b4avsaBxPOfVkFhwa1Z1+fWRv7BCcn+yz7IN8j9xC1vpunqh+HWQVohWtuSRtlVZWjXR/3PPdCFV1psNIfE+bWta6xpaGFeZ8e+zAHE85td3WDcRsOyxb3QPfcBqOloZmrG7eZc1Mf+7KtCvcQW9v7AkFVaWtqHpTjBfc2+0AHC/cgegoL9zRTCgsBpR0DC8UW91UG90T3F+33evd6+xfn+04f+0sG90D8lBX4Co0H3s5r+yz7LEhlOB8L9zRBHQv7AiWmCgtda2lfX6tpuR8LFZKAlHp3GlVdhWkeC3OFfXttG219m6OFHy91HQsVpMGpyAWOBoUhBYIH9zQWV/dL+zIG+wH7WwVQ9zNT9wDDvwcOEm0dC/cGHdH3HvduUQoLuautt7drrV0LFfcQBjP3QgX7QgYO0Rb4b/ca+4MG93z3pgXn/Ev7GvdeB/t7+6YFC9KPwKPJGrdpr/sOjx57RwW+h5iBexoLx/c09zRSCgsV9wBj10fZHi9VBb9LqUNDGkNtQ1dLHudVBc/Zs9f3ABoO+5z3Xgv7dM33CrcB96L3DgP3aj8VOh2dtwUpBg77YvXX9xa/8fcI9xAl9wYL9xIK/CQV9zQLi/ce9zDYPtv3Hvce2x33LPdEE7zLFvdWBvdC9xjt93r3evsY5/tMH/tMBhPc+6gHR4UFQc8H90D7MBUTvPcw6dst9x6NB93Pa/ssHxPc+yxHZTkeDvcVBhPAkPSZytTeCMr7pCcHE6D3HQZWPm9XhjYIDmAdibQdC3Md8B0L1fgCFfdS+9oGR3dxTnFuj51hHlr7DgV3t7x9zBv3Ub/3BPcOH/ha+/4HC3/3KPiWdwt2Cvcm90ALVB3JCxUqCvtkmQqXXQX3IPlM+0D7NgaRQwWpbGqfVBsiI6YKC5wK99cynAoOuJ6BeH17g3lyapeWdh8LFdXFwNraUbpBQVFcPDzFVtUf0QR5eZm7u52TnZ2dhFpbeX15HwsSt/cf+w33Nfst9xoLx/c09zShHfgQFffA+zT7wPs0CxK190QLygr3GPdAC5dJBfcgC/dqFvdA+I73T/ck/Lb7JPdPBgt/d6t3C7trBZScl4+dG52bg3d5e4N4cmuXlnYfC/cQBQv3kOn3MuoB9xX3Du33DgP3Ffg9FfsB3Uvk5N3L9wH3AjnLMjI5S/sCHvcOFryXqbCxlm1aW4BsZWZ/qrseDhX3HAY99xD3LgoOQ79R2dm/xdPSV8Y9PVdQRB4L7R079yAVC9+wyKnEG6+ghoKpHwsV+2T3GvsS9yz3LPca9xL3ZPdk+xr3Dvss+yz7GvsO+2Qe0xb3NOHx9xT3FOEl+zT7NDUh+xT7FDX19zQeC6WpZ8Ebt7Wt45UfQwZxhX+Be3Ftr1UbX2FpM4EfDpEd/CQV99QLFWOpbbOzqamzs22rY2Nta2MeDo8KE6DwHQv40vdCAfdo95oDlwoO+NL3QgH3EveaA/ecmR3lvsm45RL3lPdA+wD3DBPw9zYL+Gr7GgcTz31ZBYcGtWdfn1kb+wQnJ/ss+yDfI/cQtb6bp6ofh1kFaIVrbkkbC5AKZeEFhYJ+g/UdC39aHckLFfcTw8fh9wQaCwH39fdAA77qFTrI43HTG/dPzfcA9xYf+Dz8N/sk94v7ngc5bHVTY2KjtWYeC/dw4QoLGk3BZ8+xu5uhpx4L5brSs+UB9zD3BMv3AAP3xQv3LQr3DgbFy/cC+04F904G+1n3uPdN92QF+04G+yz7RgWH+Ar7QAYL+2QG+1j9HgX3RAar9x4F90YGq/seBQv3ovcMAcv4bAPL96IVtR0O96KdHQsV08v7FPdC9xT3QkPL+0b7LAX7QAcL+G6QHQtnG0VFSvsBH/cOjRXEop6jmpyHgJge+woHeX9+h3kbbXigxR8OFioKDvs23Sf3E7i8o62uHo8GC60diwuNCkgdC3b4Avcmf3cLx/c09zT3NGYK+GD3MB37wPc09zAdC/em99g0HQv5zEgKC3uBhnuIHg73ICB2+Aj3IIt392B3dgoLFfMGsfeGkfcyBftUBpH7MgULi/c09yX3Sfc4dwu190T3OPdECyn7OB8L1vcHzwH30PcAA/ecC/cv6wH3EfcO5/cLAwt4CgYLFSYdC/jI9xy39wYB9xS9HQMLoM0KC/dA98gHC2nXBYWAgIWAG3V4lqKnm63Fmx/4iPv++xr3UgcLFfe89wD7vAYL+G6gCgv3wPcVCvxg+yAGC6f3LI3VBfsABgtp1wWFg32FfxsL8xb3QPeMBgtjCt52C/dw/LD31AsToL8KCwX3HAf7PIGV90YF+xwGlftG+zyVBfscB/c8C/sUzfwC90D4At/3GjeXB7qfmqubnYeFmx4Lya+jwaqkf3GkHufnBcNZUKc6G/scJzn7GAv3CwebmpiRnRupm3ZWTXR4cXx8jpZ+Hw7lCg6lkZeVmwsF+yQGC/cs+NIV8wamHUsdC/dU9xIB9wz3/AP3DPdUFff89xL7/AYOyQH3SN3X3QP3wAv3mAH3PveYA/c+C/igAfdi9woD92IL9wEB96T3EAP3pAv7NPywqh1/xwX7IAYLRR2x9xD3CR0LdR3lt7nZkx8LEnEdCxLD90AL92SZCvdU9xIBn/jEA5/3VBX4xPcS/MQGDnb5HncL9xgSvfcsnfc0nfcsE/TXHfcp8Av8iBW9B/ui+FYFbQYLoEIdvdULVWvTNxtJTV/7AF0fC9RC9wES9yj3EAsBxfdA9zb3PAML9xr3iPcaC/tw+LD71Av3Evek9xILBY8Guwv7uhUqCgsE3grr+wwF6QYOEsX3QAv3NdTAoavFHlvfBXVla31QGyUkC/usHASIATv5jAPb+gQV+zT7NAYLy7mzx8ddtUtLXWFPT7ljyx8OYwq99x73jPceCxKCHYn3GAv3NFsKC/cwAfcK9zC/9zADC/vU/QDrHfdEv/dEC/c0/YwGC9UGo5Cal5ulrme4G7e3reOVHwsV9zQcBXj3CB37wPcVCgsB9zD3tAML63wKC9sG9xz3END3M/c4+wy/+yAfC2EKxwsV+xYG8fsQBesGC3GFfYF7cWevXxtfX2kzgR8LoHb4AgsBnfcFsPcFsPcFsPcFA50L9zT7wPcpHffUFfcQ984rBgv31PdQ+9QGC/dKURXpBgv3HvhI9xoL9yT4jncL/GAGDv2CFb0H/Dj5UAVtBvhWC/jg+LAVNd/7NPtaxVUFC/caEvdQ92hT90D7LPdAC/nuFfskBvcM+wYF9wAGC/cYRdELA/tcBAuNHy0GC/tc+nwSi/fAi/fAE8AL4AoT+AttHRJACgv3RbIVt6umtLNrqF9fCwH3wPfAA/fA+1wV98AL92UB9z/3B/c59wcD7gv7jPdWFfe02fu0Bg4S9173cG/3MAuYHb0L9wDpCgtBHfdwC/cGr/cOC/yw9zQL+QD7NAuTdWWVXRv7KFksIB8L9y/rAfcn9wvn9w4DC/uO+nwB93T3LAP3dAt/9wwFjwa5+xoFywYL+44VvQf7DPdcBW0GC7GgsRmPBolgh0tgGgv3IBX4YPfU9wAK+37N91F2C/cKW/cQEgv3HvgK9x4L90QT9AsS9y8K+1X3OhNgC/lQ1a+ZAfcy97ADC8n3Mx0LU73dafcAG/cd9w8LO/cgFffA9xQKBgsGnfcyBSsGd/syBQt3EqX3Nr33Fr33NgvVWwWjtZ2RsRvDtwv4sMUK99T3cvvUBgu3HdULdviO9yQLA8sW90ALBftIBgv3UvdwC/ss5fe27/e25RIL9yAB9973NAP3VwtFHbH3CgsbZ22fw30f92wGC6DSHQv3HPsA97T7APccCwHW9yr3KvcqA9YL+9QGDgAAAAJYABgAAAAAAEwAMwA6AFYAYgAoADoAQgAzADkAYAA6ADwAIgA/AB8AOgAsABsAOgAEAAIABAAIADUANgBAAD4AKgAyAEoALABAAEoAJQBAADYAGgBAACoAQAAqAGgALgAqADgAGAACABsAGABGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//AACADMAMwAzADMAMwA6ADoAOv/8AFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgAoACgAKAAoACgAKAAoADoAOgA6AAAAQgBCAEIAQgBCAEIAQgBCAEIAQgBCAEIAMwA5AGAAYABgAGAAYAAxAGAAGQA6ADwAPAA8ADwAPAA8ADwAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAiACIAIgAYAA4AIgAiACIAIgAiACIAIgA6ADoAOgA6ADoAOgAsACwALAAsACwALAAsADsAGwAbABsAGwAbADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgA6ADoAOgACAAIAAgACAAgACAAIAAgACAAIAAgACAA1ADUANQA1//wAPgA4ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYAEAAAAD4APgA+AD4APgAPACoAKgAqADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAsACwALAAsACwALAAs/+MAQABAAAAASgBKAEoASgBKAEoASgBKAEoASgBKAEoASgAlAEAAQAA2ADYAAAA2ADYANgA2ADYAGgBAAEAAQABAAEAAQABA/8cAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAAwAKgAqACoAKgAqACoAKgBoAF4AaABeAF4APAAuAC4ALgAuAC4ALgAuADIAKgAqACoAKgAqACoAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAIAAgACAAIAGAAYABgAGAAYABgAGAAYAEYARgBGAEYAKgBAACUAQAAqAEAAMAAyADIAKgA2ABoAMAAwABgAAgAWAAr/9v/6ACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAEAAyAEsALAAkACEAKgA2ADsAOgAwADIASwAsACQAIQAqADYAOwA6ADAAqgCxAKoAqv/zAL4AvgBeAGAAzABAAK4AwgAiADYAwgA2AKYAuAAaACwAQABAAFAAFABQABQAqgCCADwAqgCAAL8AawBkAGsAQADgAEAA4AA4AEoASgBAACYADgAOAGH/8P/uABgAGABAAEwAeAB4ADgAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJQAvwCYAKIAnQCiAJwArwCiAKAAzgDCAOYA3ACUAL8AlgCiAJ0AogCcAK8AogCgAM4AwgDmANwAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJUAfQCBAJUAkwCmAH0AjwCxAH8AlQCnAIIAlQCxAG0AlQCBAJMAfQDLAIsAkQCLAGsAVABuAH0AmQCPAI8AkQB9AH0AlQAbADgAPwAXACgAWgAtAEgAPwAUAA0AVAAOADwASABRABwADAAMAAwADQAYAAwADAAMAAwADAAMAAwADAAMAEAAQABNAEAAqgBAAHIAXgBAAEAAQABMAEAAKgAqAEAABP/vADgANQCEABYABgAGADcADgA7ABoADAAeACAAHgCuAH4AWgCLABIAEgA0ADQAEgASAAwADP/h/+H/7AAsAEYA2wBZAK4AwgDlAM0AfgDUAH4AfgDWAJwA1AB+ANYAdgBiAJwAkgC0AKQAvgC+AM4AfgB+ANQA2AB+AHgAdgB4AJwAmACSAJ4AvgDMAGIAdgDUANQAtAC0AKQAmAB+AHgANgA2AOIA8AEiAL4AdgC+AL4AvgDOAMoAnACcAIAAgACAAIAAgAB4AIAAgACYAIIAmACCAJgAggCQAIIAnACeAJwAngCcAJ4AlACMAJAAggD5ANAAAAAAAAAAAP+w/7AA3ACMACEAIQDcAIwAEgASANwAjADcANwAjACM/7D/sP+w/7AA3ADcAIwAjP+w/7D/sP+wANwA3ACMAIwAjACMAIwAjP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wAEsASwDcAIz/sAA8ANwAPAA8/7D/sP+wANwAPAA8/7D/sP+wANwAPAA8/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wANz/sP+wANz/sP+w/7D/sADcANwA3P+wAIwA3ACM/7AAjP+wAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAAABYAAQUKAAMADAA2AFgABQAMABIAGAAeACQDDQACAt0DCwACAt8DEQACAuMDGwACAucDDwACAu0ABAAKABAAFgAcAxUAAgLdAxMAAgLfAxkAAgLjAxcAAgLtAAQACgAQABYAHAMJAAIC3QMFAAIC3wMDAAIC5QMHAAIC8wABBJoAEAAmADAAOgBEAE4AWABiAGwAdgCAAJIAnACmALAAugDEAAEABABLAAIC/wABAAQAZwACAv8AAQAEAG4AAgLj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AxkDGwMfAAAAAQAAAAoAOACSAAJERkxUAA5sYXRuAB4ABAAAAAD//wADAAAAAgAEAAQAAAAA//8AAwABAAMABQAGbWFyawAmbWFyawA2bWttawBGbWttawBMc2l6ZQBSc2l6ZQBWAAAABgAAAAEAAgADAAQABQAAAAYAAAABAAIAAwAEAAUAAAABAAYAAAABAAYAUgAAAE4AAAAHABAAGgAiACoAMgA6AEIAAQAAAAIARABOAAQAAAABAEwABAAAAAEDMgAEAAAAAQNsAAQAAAABBSAABAAAAAEFSgAGAQAAAQWoAGQAAAAAAAAAAAABBqAABf7U/agAAQagAAT9qAABBqIGuAABAAwA6gA3AAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSANgA3gDkAOoA8ADGAOQA9gD8AMYBAgDGAQgBAgEOAQIAxgDGAMYAxgDGAMYBFAEaASABJgEsATIBOAE+AUQBSgFKAVABVgFcAWIAwAFoAW4BdAF6AYABhgGMAZIAwAGYAWgAxgGeAN4AxgECAaQAxgDGAMYAxgGqARoBsAG2AbYAwAFiAMAAwAGGAYYBIAG2ATIBegG8AcIByAHOAdQB2gHgAeYB7AGMAZIBGgHyAXoBegHUAfgB/gABASwCCgABASwCoAABARsCoAABAWQCoAABASgCoAABAT4CoAABAUICoAABAUoCoAABASsCoAABATQCoAABAMUCoAABATICoAABATgCoAABAS4CoAABAToCoAABATICCgABAJwC2gABAVQCCgABAbYC2gABATgCCgABAZoC5QABAS8CCgABAJcC2gABAVgC3QABAKIC2gABAQoC2gABAUQCDAABAToCCgABAUQCCgABATUCCgABAVICCgABATwCCgABAQoCmAABASgCCgABAS4CCgABAS0CCgABATQCCgABAYsCtgABAYQCoAABAUACoAABATcCCgABAVgCCgABAT4CCgABAR4CCgABASQCCgABATECCgABATYCCgABASYCCgABATACDAABAY4CCgABAP4CCgABASACCgABASwC5AABASwC0AABBEAESAABAAwAFgACAAAAGAAAABgABgAUAA4ADgAaACAAJgABASwAAAABAVwAAAABAVQAAAABATYAAAABAXQAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAJgA7ADyAPgAmADmAP4BBAEKAOYA/gEQARYBHAEiASgA4AEuAPIAyACYATQBOgFAAUYBTADOAPIBUgCYAVgAzgCYAJgBXgEiAJgAzgEEAWQAzgDsAWoA/gFwAXYBfADmAYIBiADyAVIBjgGUAM4BdgABASz/6gABATr/6gABAVz/6gABASL/6gABATz/6gABAMj/6gABAU7/6gABASv/6gABATD/6gABAT7/6gABAUb/6gABAKH/6gABAUD/6gABATb/6gABASj/6gABAS7/6gABASD/6gABATj/6gABATP/6gABAVT/6gABASb/6gABART/GwABATH/6gABAVj/6gABAPH/EwABAWb/6gABAJH/JgABAbv/JgABAMz/6gABATL/6gABAWz/6gABAS3/6gABAQv/DwABAUz/6gABAUL/6gABAUf/6gABASX/6gABAcb/JgABASf/6gABAJT/6gABAXL/6gABAQn/DwABAQT/6gABArQCugABAAwAEgABAAAADgADAA4AFAAaAAEBLAH0AAEBqgKAAAECBAKUAAEBngH0AAECkgKaAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAGgAyADgAPgA4ADIARABKAAEBLAAAAAEB7AAAAAEBogAAAAEBGgAAAAEBlAAAAAEBjAAAAAEBYgAAAAEBJQAAAAEBqAAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAA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) format('truetype');
65}
66@font-face {
67 font-family: 'clipperz-icons';
68 font-style: normal;
69 font-weight: normal;
70 src: url(data:application/x-font-ttf;charset=utf-8;base64,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X25fZQdzX2Ffdl9lB3RfYV9nX3MHZF9vX25fZQdiX2FfY19rB2VfZF9pX3QHZV94X2lfdAV0X2FfZwVhX2RfZANnX28AAAAB//8AAgABAAAADgAAACQAAAAAAAIAAwADAAMAAQAEAB4AAgAfADYAAQAEAAAAAgAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQHWAA0AIABiAIoAnAC2ANoBAAEsAXABiAGcAaYByAAEAAoAHAAqADgABQAIACAALwAhACYAIAAkAB8ADgAGACIAKwAkACUAJgASAAYAIgAmACIAKwAiABgABAAgACEAIgADAAgAFAAeABQABQA0ACQAJQAmABoABAAfACUAKwAbAAQANgAlACsAAQAEABAABgAkACUAJgAiAB8AAgAGABIAEwAFACYAIgAsACsAHQADAB8AHwACAAYAFgAMAAcAIAAkAB8AJQAhAC0ADQAGACAAJwAoACIAHwACAAYAGAAIAAgAJgAlADAAMAAiACwAMQAPAAYAJAAhACcAIgAmAAIABgAaAAQACQAhACoAKwAkACwALAAiAB8ABgAIACEAJgAgACcAKAAiAB8ABAAKABwALAA6AAcACAAiACsAKwAlACEALQAqAAkABwArACQALAAsACIAHwARAAYAIgAkACwAJwAuABYABAAkADIAIgACAAYAEAAXAAQAJAAtACoAHAADACQALQABAAQACwAHACIAIwAsACIAKgAuAAEABAAeAAIAIAACAAYAFgAKAAcAJAAzADQAIgAhACsAFQAFAC4AIAAhACIAAQAEABkABAAkACcAKAABAA0AHwAiACMAJAAmACcAKQAqACsALAAtADAANQABAAAACgAcAB4AAWxhdG4ACAAEAAAAAP//AAAAAAAAAAAAAQAAAADJiW8xAAAAAM5FKjwAAAAAzkUqPA==) format('truetype');
71}
72/*
73@font-face {
74 font-family: 'blokkregular';
75 font-style: normal;
76 font-weight: normal;
77 src: url(data:application/x-font-ttf;charset=utf-8;base64,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AUMAAwABBAkACQASAW0AAwABBAkACgBMAX8AAwABBAkACwAuAcsAAwABBAkADABgAfkAAwABBAkADQBQAlkAAwABBAkADgBcAqkAAwABBAkAEwBSAwUAAwABBAkAyAAWA1cAAwABBAkAyQAwA21GaXZlIGJpZyBxdWFja2luZyB6ZXBoeXJzIGpvbHQgbXkgd2F4IGJlZABDAG8AcAB5AHIAaQBnAGgAdAAgAGIAYQBrAGsAZQBtAG8AZQBuACAAMgAwADEAMwBCAEwATwBLAEsAUgBlAGcAdQBsAGEAcgBGAG8AbgB0AFMAdAByAHUAYwB0ACAAQgBMAE8ASwBLAEIATABPAEsASwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAEIATABPAEsASwBGAG8AbgB0AFMAdAByAHUAYwB0ACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAARgBTAEkAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsACAARwBtAGIASABoAHQAdABwADoALwAvAGYAbwBuAHQAcwB0AHIAdQBjAHQALgBjAG8AbQBiAGEAawBrAGUAbQBvAGUAbiAaAMQA+gBCAEwATwBLAEsgGgDEAPkAIAB3AGEAcwAgAGIAdQBpAGwAdAAgAHcAaQB0AGgAIABGAG8AbgB0AFMAdAByAHUAYwB0AAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGYAbwBuAHQAcwBoAG8AcAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABzAHQAcgB1AGMAdAAuAGMAbwBtAC8AZgBvAG4AdABzAHQAcgB1AGMAdABpAG8AbgBzAC8AcwBoAG8AdwAvADcANwAwADgAMgAzAEMAcgBlAGEAdABpAHYAZQAgAEMAbwBtAG0AbwBuAHMAIABBAHQAdAByAGkAYgB1AHQAaQBvAG4AIABTAGgAYQByAGUAIABBAGwAaQBrAGUAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwBGAGkAdgBlACAAYgBpAGcAIABxAHUAYQBjAGsAaQBuAGcAIAB6AGUAcABoAHkAcgBzACAAagBvAGwAdAAgAG0AeQAgAHcAYQB4ACAAYgBlAGQAVwBlAGIAZgBvAG4AdAAgADEALgAwAFQAaAB1ACAARgBlAGIAIAAgADcAIAAwADkAOgAyADUAOgAwADEAIAAyADAAMQAzAAACAAAAAAAAAMsAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAECAQMAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMAsgCzALYAtwC0ALUBFAEVARYGZ2x5cGgxBmdseXBoMgd1bmkwMEEwB3VuaTAwQUQHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMTAHdW5pMjAxMQpmaWd1cmVkYXNoB3VuaTIwMkYHdW5pMjA1Rgd1bmlFMDAwAAAAuAH/hbABjQBLsAhQWLEBAY5ZsUYGK1ghsBBZS7AUUlghsIBZHbAGK1xYAbABIEWwAytEsAIgRboAAX//AAIrsQNGditEWbAUKwAAAAABURO5PQAA) format('truetype');
78}
79*/
80@font-face {
81 font-family: 'clipperz-password';
82 font-style: normal;
83 font-weight: normal;
84 src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAAUAQAABABARkZUTTxbhZ4AAAFMAAAAHEdERUZ4y3GsAAABaAAAALBHUE9TdHih6gAAAhgAABDIR1NVQvRHDNUAABLgAAAH4EpTVEZvvGuiAAAawAAAAB5PUy8yCqYwVwAAGuAAAABWY21hcC8lBdsAABs4AAAJJGN2dCCWKtJ2AAAkXAAABjBmcGdtzHlZmgAAKowAAAZuZ2FzcAAAABAAADD8AAAACGdseWY4mI0aAAAxBAABH6hoZWFkARPBRQABUKwAAAA2aGhlYQoCDAcAAVDkAAAAJGhtdHiPX8+HAAFRCAAAFZRsb2NhZEcbggABZpwAAA06bWF4cAsSAD0AAXPYAAAAIG5hbWWLaZLWAAFz+AAADu5wb3N03UK/AgABgugAAEKjcHJlcFL+xOkAAcWMAAAK/3dlYmYLJVEVAAHQjAAAAAYAAAABAAAAAMw9os8AAAAAouMnKgAAAADNOrukAAEAAAAOAAAAqAAAAAAAAgAZAAECYQABAmICZQACAmYCgwABAoQCiwADAowEMQABBDIEMgADBDME1wABBNgE3AADBN0E3gABBN8E3wACBOAE4AABBOEE6AACBOkFMgABBTMFOgACBTsFggABBYMFhAADBYUFhwABBYgFiQADBYoFiwABBYwFjQADBY4FkAABBZEFlgADBZcFlwABBZgFmQADBZoGmwABAAQAAAACAAAAAQAAAAoAZAByAAVERkxUACBhcmFiACxjeXJsADZncmVrAEJsYXRuAE4ABAAAAAD//wABAAAABAAAAAD//wAAAAQAAAAA//8AAQAAAAQAAAAA//8AAQAAAAQAAAAA//8AAQAAAAFrZXJuAAgAAAABAAAAAQAEAAIAAAABAAgAAQ90AAQAAABpANwBBgEMATIBQAFeAXABggHMAgICOAJ2AoACjgKYAo4CogLIAs4DIAMqA1gDegOUA6oD6AQCBBgEMgQ8BMIFMAU+AyAFaAW+BdAGGgYgBlYGjAW+BrYG3AbqBb4HFAW+Bb4FvgdCB1gHXgdkB6oH5Ag6CKwIxgjQCPoJHAkyCUAJZgmUCfYKNAqyC0wLbguMC5YLoAuqC+QMEgxEDFYMlAzWDQANCg0wDUINcA2aDaQNsg3UDfYOCA4yDnQOkg64DsoO2A7iDwQPIg8sD0oPUA9eAAoAJf+PADj/2wA9/9sBcP+PAXn/jwF8/48Bg/+PAYv/2wGM/9sBkv/bAAEAFf9oAAkABP+PADj/aAA6/2gAO/+0AD3/aABa/9sAW//bAF3/2wOW/2gAAwAQ/x0AEv8dACX/jwAHAAT/tAA4/2gAOv9oADv/aAA9/2gAXf+0A5b/jwAEAAT/2wAQ/vgAEv74ACX/aAAEADj/2wA6/9sAO//bAD3/2wASAAT/2wAQ/x0AEf+PABL/HQAe/x0AH/8dACX/aAAz/9sARf8dAEf/HQBJ/x0ATf+0AFP/HQBW/7QAV/8dAFn/tABb/48AXf+PAA0AEP9EABH/jwAS/0QAHv+0AB//tAAl/2gARf9oAEn/jwBN/9sAU/+PAFb/tABZ/7QAXf+0AA0AEP+PABH/2wAS/48AHv/bAB//2wAl/7QARf+0AEn/2wBNAAAAU//bAFb/2wBZ/9sAXf/uAA8ABP/bABD++AAR/0QAEv74AB7/jwAf/3sAJf9oAEX/aABJ/0QATf+0AFP/RABU/2gAVf9EAFn/jwBa/48AAgBK/9sDlgAlAAMAEP+PABL/jwOWAEwAAgAQ/2gAEv9oAAIAEP+PABL/jwAJAYD/1QGH/9UBi/9oAYz/aAGN/8UBkv9oAZr/2wGk/9sBrv/bAAEBjP++ABQBeACqAXn/aAF8/2gBgP+NAYP/aAGH/40Bjf+NAZD/ngGV/2gBlv+0AZj/RgGe/2gBoP+0AaH/aAGj/2gBpv9GAar/RgGt/0YBsQBiAbP/RgACAYz/0QGS/9EACwAE/48BgP/VAYf/1QGL/2gBjP9oAY3/xQGS/2gBmv/bAaT/2wGu/9sDlv9oAAgAEP8fABL/HwF4AKQBef9EAXz/RAGD/0QBoP+oAbEAWAAGAAT/jwGA/9UBh//VAYv/iQGM/2gBkv9oAAUBef/bAXz/2wGD/9sBjP++AZL/vgAPAYD/wQGH/8EBjf+PAZP/5wGY/+cBm//nAZ3/5wGf/+cBpf/nAab/5wGq/+cBrf/nAbD/5wGz/+cBtf/nAAYABP+PAYD/1QGH/9UBi/9oAYz/aAGS/2gABQF5/9sBfP/VAYP/2wGM/74Bkv++AAYABP/bABD++gAS/voBef9oAXz/aAGD/2gAAgGn/54Bq/+eACEABP/bABD/HwAS/x8AHv8fAB//HwF4ALwBef9oAXz/aAGA/9sBg/9oAYf/2wGN/9sBkP/bAZP/HwGU/x8Bl/9OAZj/HwGa/04BnP8fAZ7/agGg/7QBo/9qAaT/jwGm/x8Bqv8fAaz/UAGt/x8Brv+PAa//agGxALwBsv9OAbP/HwG0/04AGwAE/9sAEP76ABH/RgAS/voAHv+PAB//jwF4ALwBef9oAXz/aAGA/40Bg/9oAYf/jQGN/40BkP+eAZX/aAGW/7QBmP9GAZr/ngGe/2gBoP+0AaH/aAGj/2gBpv9GAar/RgGt/0YBsQB5AbP/RgADAXn/xQGM/74Bkv++AAoBk/+yAZj/sgGb/7IBn//ZAab/sgGq/7IBrf+yAbD/sgGz/7IBtf+yABUABP/bAXgAqgF5/2gBfP9oAYD/jQGD/2gBh/+NAY3/jQGQ/54Blf9oAZb/tAGY/0YBnv9oAaD/tAGh/2gBo/9oAab/RgGq/0YBrf9GAbEAYgGz/0YABAGi/9kBp//jAav/4wGu/8kAEgGT/3cBlf/bAZj/dwGa/6oBm/+0AZ7/2wGf/54BoP/bAaH/2wGk/6oBpv93Aaf/qgGq/3cBq/+qAa3/dwGw/3cBs/93AbX/dwABAaL/2QANAZP/5wGY/+cBm//nAZ3/5wGf/+cBpf/nAab/5wGp/+cBqv/nAa3/5wGw/+cBs//nAbX/5wANAZP/4QGY/+EBm//hAaX/4QGm/+EBqf/RAar/4QGs/88Brf/bAbD/4QGz/+EBtP/PAbX/4QAKAZP/yQGY/8kBm//JAZ3/yQGl/8kBpv/JAan/yQGq/8kBrf/JAbP/yQAJAZP/4wGY/+MBnf/jAab/4wGp/+MBqv/jAa3/4wGw/+MBtf/jAAMBov/ZAaf/4wGr/+MACgGT/+MBmP/jAZv/4wGd/+MBpv/jAan/4wGq/+MBrf/jAbD/4wG1/+MACwGT/8kBmP/JAZv/yQGd/8kBpv/JAan/yQGq/8kBrf/JAbD/yQGz/8kBtf/JAAUAEP8GABL/BgBu/3cAfv93A5L/0wABA5b/YAABA5b/dwARAckARAHM/+kB0AAtAdP/0wHU/+kB1v/TAdf/YAHY/6YB2f+8Adz/YAHi/9MB5QAXAff/0wH4/+kB+QAXAgIALQOW/40ADgHF/9MBzP/pAdP/6QHW/+kB1/+kAdj/0QHZ/+kB2v/TAdz/pAHf/7wB4v/pAeT/6QHw/+kB+P/TABUBxf+8Acn/0wHL/9MBzP+8AdD/6QHT/7wB1v+8Adf/dwHY/7wB2f+8Adr/pgHc/6QB3/+NAeT/vAHp/+kB8f/pAff/vAH4/+kB+v/pAfz/vAIE/+kAHAAQ/wYAEv8GAG7/dwB+/3cBxf93Acn/dwHM/9MB0P+NAdH/0QHT/40B1v+kAeT/vAHl/40B5/+NAen/dwHq/3cB7f+NAfD/jQHx/40B8v+NAfP/dwH1/40B+P93AgD/jQIB/40CA/+NAgT/dwOS/9MABgHYABcB2f/TAdz/ugHsAEQB8wAXAfgALQACAcz/0wH2/+kACgHM/+kB0//TAdb/6QHXABcB2AAtAd8ALQHlABcB6v/nAfP/6QH4/+kACAHQ/+kB0//pAdb/6QHX/9MB2P/pAdn/6QHc/9MB5P/pAAUBzP/pAdP/6QHW/+kB2AAXAdn/ugADAdn/6QHmABcB+AAXAAkB2f/pAdz/6QHlABcB6gAXAfMAFwH2ABcB+AAXAfz/6QICABcACwHF/9MByf/TAcv/0wHQ/+kB2P/TAdr/pAHc/9MB5P/TAen/0wHw/+kB+v/pABgAEP59ABL+fQAe/9MAH//TAH7/jQHF/3cByf93Acv/6QHM/9MB0P+NAdH/6QHT/9MB1v/pAdf/pAHY/9MB2f/pAdr/pAHk/9MB5f+8Aen/YAHq/6YB8/+mAgL/0wIE/7wADwHF/9MByf/TAcz/6QHQ/7wB0f/pAdP/0wHX/7wB2P+8Adr/jQHc/7wB3/+6AeL/6QHlABcB6wAtAfz/6QAfABD/HQAS/x0Abv+mAH7/pgHF/7wByf+8AcsAFwHM/+kB0P/TAdP/pAHZ/7wB5P/TAeX/pAHn/6YB6v+NAe3/pgHv/6YB8P+kAfH/pgHz/2AB9P+mAfX/jQH2/40B+P+NAfr/pgH+/6YCAP+mAgH/pgID/6YCBP+NA5L/0wAmABD+8AAS/vAAHv/TAB//0wBu/6YAfv+kAcX/dwHJ/6QBzP/TAdD/vAHT/7wB2f+8AeL/0wHk/9MB5v/TAef/jQHo/6QB6f9gAer/dwHr/7wB7P+NAe3/pAHu/7wB7/+kAfD/dwHx/6QB8v+kAfP/dwH0/6QB9f+kAfb/dwH6/6QB+/+kAf3/pAH+/6QCA/+kAgT/dwOS/+kACAHF/9MByf+8AdD/vAHX/40B2P+kAdz/0wHk/7oB8P+8AAcBzP/TAdP/vAHW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AscC5QAnAucC6gBGAuwC7ABKAvgC+ABLAvoC+gBMAxoDHABNBLQEtABQBMcExwBRBNYE1gBSBSsFKwBTAAIArgBUBOgE7ATwBPME9gT5BPwFAwUGBQkFDAUPBRIFFQUYBRsFHgUhBSQFJwUqBTIF+QX7BJsElQSMBg8GEgSPBJgEkgYVBhgEpwSkBhsEqgStBioGLQYwBjMGNgY3BjoF+wY9BkAEngZDBKEFGwSeBkgGSwZOBMwGUQS6BlQEwAZXBL0GWgZdBmAGYwZmBmkEmgZsBI8GcATGBnYE1QZ7Bn4GgQS3BS0FMgUtAAIAEgJlAmUAAAJnAmcAAQJpAm0AAgJyAnkABwJ7AoAADwKDAoMAFQKcAp0AFgKmArQAGALHAuUAJwLnAuoARgLsAuwASgL4AvgASwL6AvoATAMaAxwATQS0BLQAUATHBMcAUQTWBNYAUgUrBSsAUwACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+BJwGQQSfBkQGRQZGBkkGTAaIBk8EuAZSBL4GVQS7BlgGWwZeBmEGZAZnBMEEwgZqBm0GbgTDAuwC7QLuBnEE0QTOBM0EzwTSBnIE0AZzBnQGdwTTBngEyATJBnkGfAZ/BLUFLATXBOIFLAU0BTYFOAU6AAIADgJiAnkAAAJ7AoMAGAKcAp0AIQKfAv0AIwMaAxwAggS0BLQAhQTHBMcAhgTWBNYAhwThBOEAiAUrBSsAiQUzBTMAigU1BTUAiwU3BTcAjAU5BTkAjQACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+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A+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAjkAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwKAAAAFAAAAAoAAAAUAAAABqgAAAUAAAADVAAAA1QAAAKAAAAEAAAAARwAAA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAQAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAUAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXBB8AAAPkAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAAABYAFgAWABYAFgAsAEIAWABuAIQAmgCwAMYA3ADyAQgBHgE0AUoBYAF2AYwBogG4Ac4B5AH6AhACJgI8AlICaAJ+ApQCqgLAAtYC7AMCAxgDLgNEA1oDcAOGA5wDsgPIA94D9AQKBCAENgRMBGIEeASOBKQEugTQBOYE/AUSBSgFPgVUBWoFgAWWBawFwgXYBe4GBAYaBjAGRgZcBnIGiAaeBrQGygbgBvYHDAciBzgHTgdkB3oHkAemB7wH0gfoB/4IFAgqCCoIQAhWCGwIggiYCK4IxAjaCPAJBgkcCTIJSAleCXQJigmgCbYJzAniCfgKDgokCjoKUApmCnwKkgqoCr4K1ArqCwALFgssC0ILWAtuC4QLmguwC8YL3AvyDAgMHgw0DEoMYAx2DIwMogy4DM4M5Az6DRANJg08DVINaA1+DZQNqg3ADdYN7A4CDhgOLg5EDloOcA6GDpwOsg7IDt4O9A8KDyAPNg9MD2IPeA+OD6QPug/QD+YP/BASECgQPhBUEGoQgBCWEKwQwhDYEO4RBBEaETARRhFcEXIRiBGeEbQRyhHgEfYSDBIiEjgSThJkEnoSkBKmErwS0hLoEv4TFBMqE0ATVhNsE4ITmBOuE8QT2hPwFAYUHBQyFEgUXhR0FIoUoBS2FMwU4hT4FQ4VJBU6FVAVZhV8FZIVqBW+FdQV6hYAFhYWLBZCFlgWbhaEFpoWsBbGFtwW8hcIFx4XNBdKF2AXdheMF6IXuBfOF+QX+hgQGCYYPBhSGGgYfhiUGKoYwBjWGOwZAhkYGS4ZRBlaGXAZhhmcGbIZyBneGfQaChogGjYaTBpiGngajhqkGroa0BrmGvwbEhsoGz4bVBtqG4AblhusG8Ib2BvuHAQcGhwwHEYcXBxyHIgcnhy0HMoc4Bz2HQwdIh04HU4dZB16HZAdph28HdId6B3+HhQeKh5AHlYebB6CHpgerh7EHtoe8B8GHxwfMh9IH14fdB+KH6Afth/MH+If+CAOICQgOiBQIGYgfCCSIKggviDUIOohACEWISwhQiFYIW4hhCGaIbAhxiHcIfIiCCIeIjQiSiJgInYijCKiIrgiziLkIvojECMmIzwjUiNoI34jlCOqI8Aj1iPsJAIkGCQuJEQkWiRwJIYknCSyJMgk3iT0JQolICU2JUwlYiV4JY4lpCW6JdAl5iX8JhImKCY+JlQmaiaAJpYmrCbCJtgm7icEJxonMCdGJ1wncieIJ54ntCfKJ+An9igMKCIoOChOKGQoeiiQKKYovCjSKOgo/ikUKSopQClWKWwpgimYKa4pxCnaKfAqBiocKjIqSCpeKnQqiiqgKrYqzCriKvgrDiskKzorUCtmK3wrkiuoK74r1CvqLAAsFiwsLEIsWCxuLIQsmiywLMYs3CzyLQgtHi00LUotYC12LYwtoi24Lc4t5C36LhAuJi48LlIuaC5+LpQuqi7ALtYu7C8CLxgvLi9EL1ovcC+GL5wvsi/IL94v9DAKMCAwNjBMMGIweDCOMKQwujDQMOYw/DESMSgxPjFUMWoxgDGWMawxwjHYMe4yBDIaMjAyRjJcMnIyiDKeMrQyyjLgMvYzDDMiMzgzTjNkM3ozkDOmM7wz0jPoM/40FDQqNEA0VjRsNII0mDSuNMQ02jTwNQY1HDUyNUg1XjV0NYo1oDW2Ncw14jX4Ng42JDY6NlA2ZjZ8NpI2qDa+NtQ26jcANxY3LDdCN1g3bjeEN5o3sDfGN9w38jgIOB44NDhKOGA4djiMOKI4uDjOOOQ4+jkQOSY5PDlSOWg5fjmUOao5wDnWOew6AjoYOi46RDpaOnA6hjqcOrI6yDreOvQ7CjsgOzY7TDtiO3g7jjukO7o70DvmO/w8EjwoPD48VDxqPIA8ljysPMI82DzuPQQ9Gj0wPUY9XD1yPYg9nj20Pco94D32Pgw+Ij44Pk4+ZD56PpA+pj68PtI+6D7+PxQ/Kj9AP1Y/bD+CP5g/rj/EP9o/8EAGQBxAMkBIQF5AdECKQKBAtkDMQOJA+EEOQSRBOkFQQWZBfEGSQahBvkHUQepCAEIWQixCQkJYQm5ChEKaQrBCxkLcQvJDCEMeQzRDSkNgQ3ZDjEOiQ7hDzkPkQ/pEEEQmRDxEUkRoRH5ElESqRMBE1kTsRQJFGEUuRURFWkVwRYZFnEWyRchF3kX0RgpGIEY2RkxGYkZ4Ro5GpEa6RtBG5kb8RxJHKEc+R1RHakeAR5ZHrEfCR9hH7kgESBpIMEhGSFxIckiISJ5ItEjKSOBI9kkMSSJJOElOSWRJekmQSaZJvEnSSehJ/koUSipKQEpWSmxKgkqYSq5KxEraSvBLBkscSzJLSEteS3RLikugS7ZLzEviS/hMDkwkTDpMUExmTHxMfEx8THxMfEx8THxMfEx8THxMfEx8TJJMqEy+TNRM6k0ATRZNLE1CTVhNbk2ETZpNsE3GTdxN8k4ITh5ONE5KTmBOdk6MTqJOuE7OTs5O5E76TxBPJk88T1JPaE9+T35PlE+qT8BP1k/sUAJQGFAuUERQWlBwUIZQnFCyUMhQ3lD0UQpRIFE2UUxRYlF4UY5RpFG6UdBR5lH8UhJSKFI+UlRSalKAUpZSrFLCUthS7lMEUxpTMFNGU1xTclOIU55TtFPKU+BT9lQMVCJUOFROVGRUelSQVKZUvFTSVOhU/lUUVSpVQFVWVWxVglWYVa5VxFXaVfBWBlYcVjJWSFZeVnRWilagVrZWzFbiVvhXDlckVzpXUFdmV3xXkleoV75X1FfqWABYFlgsWEJYWFhuWIRYmliwWMZY3FjyWQhZHlk0WUpZYFl2WYxZolm4Wc5Z5Fn6WhBaJlo8WkpaYFp2Woxaolq4Ws5a5Fr6WxBbJls8W1JbaFt+W5RbqlvAW9Zb7FwCXBhcLlxEXFpccFyGXJxcslzIXN5c9F0KXSBdNl1MXWJdeF2OXaRdul3QXeZd/F4SXihePl5UXmpegF6WXqxewl7YXu5fBF8aXzBfRl9cX3JfiF+eX7Rfyl/gX/ZgDGAiYDhgTmBkYHpgkGCmYLxg0mDoYP5hFGEqYUBhVmFsYYJhmGGuYcRh2mHwYgZiHGIyYkhiXmJ0YopioGK2Ysxi4mL4Yw5jJGM6Y1BjZmN8Y5JjqGO+Y9Rj6mQAZBZkLGRCZFhkbmSEZJpksGTGZNxk8mUIZR5lNGVKZWBldmWMZaJluGXOZeRl+mYQZiZmPGZSZmhmfmaUZqpmwGbWZuxnAmcYZy5nRGdaZ3BnhmecZ7JnyGfeZ/RoCmggaDZoTGhiaHhojmikaLpo0GjmaPxpEmkoaT5pVGlqaYBplmmsacJp2GnuagRqGmowakZqXGpyaohqnmq0aspq4Gr2awxrIms4a05rZGt6a5Brpmu8a9Jr6Gv+bBRsKmxAbFZsbGyCbJhsrmzEbNps8G0GbRxtMm1IbV5tdG2KbaBttm3MbeJt+G4ObiRuOm5QbmZufG6Sbqhuvm7UbupvAG8WbyxvQm9Yb25vhG+ab7Bvxm/cb/JwCHAecDRwSnBgcHZwjHCicLhwznDkcPpxEHEmcTxxUnFocX5xlHGqccBx1nHscgJyGHIuckRyWnJwcoZynHKycshy3nL0cwpzIHM2c0xzYnN4c45zpHO6c9Bz5nP8dBJ0KHQ+dFR0anSAdJZ0rHTCdNh07nUEdRp1MHVGdVx1cnWIdZ51tHXKdeB19nYMdiJ2OHZOdmR2enaQdqZ2vHbSduh2/ncUdyp3QHdWd2x3gneYd653xHfad/B4BngceDJ4SHheeHR4inigeLZ4zHjiePh5DnkkeTp5UHlmeXx5knmoeb551HnqegB6FnosekJ6WHpueoR6mnqwesZ63Hryewh7Hns0e0p7YHt2e4x7onu4e8575Hv6fBB8Jnw8fFJ8aHx+fJR8qnzAfNZ87H0CfRh9Ln1EfVp9cH2GfZx9sn3Ifd599H4KfiB+Nn5MfmJ+eH6OfqR+un7QfuZ+/H8Sfyh/Pn9Uf2p/gH+Wf6x/wn/Yf+6ABIAagDCARoBcgHKAiICegLSAyoDggPaBDIEigTiBToFkgXqBkIGmgbyB0oHogf6CFIIqgkCCVoJsgoKCmIKugsSC2oLwgwaDHIMyg0iDXoN0g4qDoIO2g8yD4oP4hA6EJIQ6hFCEZoR8hJKEqIS+hNSE6oUAhRaFLIVChViFboWEhZqFsIXGhdyF8oYIhh6GNIZKhmCGdoaMhqKGuIbOhuSG+ocQhyaHPIdSh2iHfoeUh6qHwIfWh+yIAogYiC6IRIhaiHCIhoiciLKIyIjeiPSJCokgiTaJTIliiXiJjomkibqJ0InmifyKEoooij6KVIpqioCKloqsisKK2IruiwSLGoswi0aLXItyi4iLnou0i8qL4Iv2jAyMIow4jE6MZIx6jJCMpoy8jNKM6Iz+jRSNKo1AjVaNbI2CjZiNro3EjdqN8I4GjhyOMo5Ijl6OdI6KjqCOto7MjuKO+I8OjySPOo9Qj2aPfI+Sj6iPvo/UAAAAAQAABpwADAACAAAAAAACABAALwBWAAAEDQAAAAAAAAAAABAAxgADAAEECQABABAAAAADAAEECQACAA4AEAADAAEECQADACIAHgADAAEECQAEACAAQAADAAEECQAFABgAYAADAAEECQAGABAAeAADAAEECQAHABAAiAADAAEECQAIACYAmAADAAEECQAJAIoAvgADAAEECQAKBMIBSAADAAEECQALAGIGCgADAAEECQAMAGYGbAADAAEECQANBrQG0gADAAEECQAOAFwNhgADAAEECQDIABYN4gADAAEECQDJADAN+ABQAGEAcwBzAHcAbwByAGQAUgBlAGcAdQBsAGEAcgBNAG8AbgBvAHQAeQBwAGUAOgBQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMABQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkATQBvAG4AbwB0AHkAcABlACAAVAB5AHAAZQAgAEQAcgBhAHcAaQBuAGcAIABPAGYAZgBpAGMAZQAgAC0AIABSAG8AYgBpAG4AIABOAGkAYwBoAG8AbABhAHMALAAgAFAAYQB0AHIAaQBjAGkAYQAgAFMAYQB1AG4AZABlAHIAcwAgADEAOQA4ADIAQwBvAG4AdABlAG0AcABvAHIAYQByAHkAIABzAGEAbgBzACAAcwBlAHIAaQBmACAAZABlAHMAaQBnAG4ALAAgAEEAcgBpAGEAbAAgAGMAbwBuAHQAYQBpAG4AcwAgAG0AbwByAGUAIABoAHUAbQBhAG4AaQBzAHQAIABjAGgAYQByAGEAYwB0AGUAcgBpAHMAdABpAGMAcwAgAHQAaABhAG4AIABtAGEAbgB5ACAAbwBmACAAaQB0AHMAIABwAHIAZQBkAGUAYwBlAHMAcwBvAHIAcwAgAGEAbgBkACAAYQBzACAAcwB1AGMAaAAgAGkAcwAgAG0AbwByAGUAIABpAG4AIAB0AHUAbgBlACAAdwBpAHQAaAAgAHQAaABlACAAbQBvAG8AZAAgAG8AZgAgAHQAaABlACAAbABhAHMAdAAgAGQAZQBjAGEAZABlAHMAIABvAGYAIAB0AGgAZQAgAHQAdwBlAG4AdABpAGUAdABoACAAYwBlAG4AdAB1AHIAeQAuACAAIABUAGgAZQAgAG8AdgBlAHIAYQBsAGwAIAB0AHIAZQBhAHQAbQBlAG4AdAAgAG8AZgAgAGMAdQByAHYAZQBzACAAaQBzACAAcwBvAGYAdABlAHIAIABhAG4AZAAgAGYAdQBsAGwAZQByACAAdABoAGEAbgAgAGkAbgAgAG0AbwBzAHQAIABpAG4AZAB1AHMAdAByAGkAYQBsACAAcwB0AHkAbABlACAAcwBhAG4AcwAgAHMAZQByAGkAZgAgAGYAYQBjAGUAcwAuACAAIABUAGUAcgBtAGkAbgBhAGwAIABzAHQAcgBvAGsAZQBzACAAYQByAGUAIABjAHUAdAAgAG8AbgAgAHQAaABlACAAZABpAGEAZwBvAG4AYQBsACAAdwBoAGkAYwBoACAAaABlAGwAcABzACAAdABvACAAZwBpAHYAZQAgAHQAaABlACAAZgBhAGMAZQAgAGEAIABsAGUAcwBzACAAbQBlAGMAaABhAG4AaQBjAGEAbAAgAGEAcABwAGUAYQByAGEAbgBjAGUALgAgACAAQQByAGkAYQBsACAAaQBzACAAYQBuACAAZQB4AHQAcgBlAG0AZQBsAHkAIAB2AGUAcgBzAGEAdABpAGwAZQAgAGYAYQBtAGkAbAB5ACAAbwBmACAAdAB5AHAAZQBmAGEAYwBlAHMAIAB3AGgAaQBjAGgAIABjAGEAbgAgAGIAZQAgAHUAcwBlAGQAIAB3AGkAdABoACAAZQBxAHUAYQBsACAAcwB1AGMAYwBlAHMAcwAgAGYAbwByACAAdABlAHgAdAAgAHMAZQB0AHQAaQBuAGcAIABpAG4AIAByAGUAcABvAHIAdABzACwAIABwAHIAZQBzAGUAbgB0AGEAdABpAG8AbgBzACwAIABtAGEAZwBhAHoAaQBuAGUAcwAgAGUAdABjACwAIABhAG4AZAAgAGYAbwByACAAZABpAHMAcABsAGEAeQAgAHUAcwBlACAAaQBuACAAbgBlAHcAcwBwAGEAcABlAHIAcwAsACAAYQBkAHYAZQByAHQAaQBzAGkAbgBnACAAYQBuAGQAIABwAHIAbwBtAG8AdABpAG8AbgBzAC4AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG0AbwBuAG8AdAB5AHAAZQAuAGMAbwBtAC8AaAB0AG0AbAAvAG0AdABuAGEAbQBlAC8AbQBzAF8AYQByAGkAYQBsAC4AaAB0AG0AbABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AbQB0AG4AYQBtAGUALwBtAHMAXwB3AGUAbABjAG8AbQBlAC4AaAB0AG0AbABOAE8AVABJAEYASQBDAEEAVABJAE8ATgAgAE8ARgAgAEwASQBDAEUATgBTAEUAIABBAEcAUgBFAEUATQBFAE4AVAANAAoADQAKAFQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkAIABhAG4AZAAgAGkAdABzACAAdQBzAGUAIABiAHkAIAB5AG8AdQAgAGkAcwAgAGMAbwB2AGUAcgBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAGEAIABsAGkAYwBlAG4AcwBlACAAYQBnAHIAZQBlAG0AZQBuAHQALgAgAFkAbwB1ACAAaABhAHYAZQAgAG8AYgB0AGEAaQBuAGUAZAAgAHQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABzAG8AZgB0AHcAYQByAGUAIABlAGkAdABoAGUAcgAgAGQAaQByAGUAYwB0AGwAeQAgAGYAcgBvAG0AIABNAG8AbgBvAHQAeQBwAGUAIABvAHIAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAcwBvAGYAdAB3AGEAcgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAbwBuAGUAIABvAGYAIABNAG8AbgBvAHQAeQBwAGUAJwBzACAAbABpAGMAZQBuAHMAZQBlAHMALgANAAoADQAKAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABhACAAdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAZQB0ACAAbwBmACAATQBvAG4AbwB0AHkAcABlAC4AIABVAG4AbABlAHMAcwAgAHkAbwB1ACAAaABhAHYAZQAgAGUAbgB0AGUAcgBlAGQAIABpAG4AdABvACAAYQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGcAcgBhAG4AdABpAG4AZwAgAHkAbwB1ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHIAaQBnAGgAdABzACwAIAB5AG8AdQByACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAG0AaQB0AGUAZAAgAHQAbwAgAHkAbwB1AHIAIAB3AG8AcgBrAHMAdABhAHQAaQBvAG4AIABmAG8AcgAgAHkAbwB1AHIAIABvAHcAbgAgAHAAdQBiAGwAaQBzAGgAaQBuAGcAIAB1AHMAZQAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAgAG8AcgAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBJAGYAIAB5AG8AdQAgAGgAYQB2AGUAIABhAG4AeQAgAHEAdQBlAHMAdABpAG8AbgAgAGMAbwBuAGMAZQByAG4AaQBuAGcAIAB5AG8AdQByACAAcgBpAGcAaAB0AHMAIAB5AG8AdQAgAHMAaABvAHUAbABkACAAcgBlAHYAaQBlAHcAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHkAbwB1ACAAcgBlAGMAZQBpAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBvAGYAdAB3AGEAcgBlACAAbwByACAAYwBvAG4AdABhAGMAdAAgAE0AbwBuAG8AdAB5AHAAZQAgAGYAbwByACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAuAA0ACgANAAoATQBvAG4AbwB0AHkAcABlACAAYwBhAG4AIABiAGUAIABjAG8AbgB0AGEAYwB0AGUAZAAgAGEAdAA6AA0ACgANAAoAVQBTAEEAIAAtACAAKAA4ADQANwApACAANwAxADgALQAwADQAMAAwAAkACQBVAEsAIAAtACAAMAAxADEANAA0ACAAMAAxADcAMwA3ACAANwA2ADUAOQA1ADkADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBtAG8AbgBvAHQAeQBwAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AdAB5AHAAZQAvAGwAaQBjAGUAbgBzAGUALgBoAHQAbQBsAFcAZQBiAGYAbwBuAHQAIAAxAC4AMABGAHIAaQAgAEYAZQBiACAAIAA4ACAAMAA5ADoAMgA2ADoANAA0ACAAMgAwADEAMwAAAAIAAAAAAAD/JwCWAAAAAAAAAAAAAAAAAAAAAAAAAAAGnAAAAAEAAgECAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQEDAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAQQAigEFAIMAkwDyAPMAjQEGAIgAwwDeAPEAngCqAPUA9AD2AKIArQDJAMcArgBiAGMAkABkAMsAZQDIAMoAzwDMAM0AzgDpAGYA0wDQANEArwBnAPAAkQDWANQA1QBoAOsA7QCJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgBzAHUAdAB2AHcA6gB4AHoAeQB7AH0AfAC4AKEAfwB+AIAAgQDsAO4AugEHAQgBCQEKAQsBDAD9AP4BDQEOAQ8BEAD/AQABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAD4APkBIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAD6ANcBMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A4gDjAUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOALAAsQFPAVABUQFSAVMBVAFVAVYBVwFYAPsA/ADkAOUBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgC7AW8BcAFxAXIA5gDnAXMBdACmAXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPANgA4QDaANsA3ADdAOAA2QDfAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIAqAGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AJ8BtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccAlwHIAckBygCbAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzALIAswO0A7UAtgC3AMQDtgC0ALUAxQCCAMIAhwCrA7cDuAO5A7oDuwO8AMYDvQO+AL4AvwO/A8AAvAPBA8IDwwPEA8UDxgPHA8gA9wPJA8oDywPMA80DzgPPA9AAjAPRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wCYA+AAmgCZAO8ApQCSA+ED4gCcAKcAjwPjAJQAlQPkA+UD5gPnA+gD6QPqA+sD7APtA+4D7wPwA/ED8gPzA/QD9QP2A/cD+AP5A/oD+wP8A/0D/gP/BAAEAQQCBAMEBAQFBAYEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQXBBgEGQQaBBsEHAQdBB4EHwQgALkEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgDAAMEEZwRoBGkEagRrBGwEbQRuBG8EcARxBHIEcwR0BHUEdgR3BHgEeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBQ4FDwUQBREFEgUTBRQFFQUWBRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0BTUFNgU3BTgFOQU6BTsFPAU9BT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVkBWUFZgVnBWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwXQBdEF0gXTBdQF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX9Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAYhBiIGIwYkBiUGJgYnBigGKQYqBisGLAYtBi4GLwYwBjEGMgYzBjQGNQY2BjcGOAY5BjoGOwY8Bj0GPgY/BkAGQQZCBkMGRAZFBkYGRwZIBkkGSgZLBkwGTQZOBk8GUAZRBlIGUwZUBlUGVgZXBlgGWQZaBlsGXAZdBl4GXwZgBmEGYgZjBmQGZQZmBmcGaAZpBmoGawZsBm0GbgZvBnAGcQZyBnMGdAZ1BnYGdwZ4BnkGegZ7BnwGfQZ+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWds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) format('truetype');
85}
86div.overlay {
87 z-index: 99999;
88 position: fixed;
89 top: 50%;
90 left: 50%;
91 width: 200px;
92 height: 200px;
93 margin-left: -100px;
94 margin-top: -100px;
95 background: rgba(0, 0, 0, 0.8);
96 border-radius: 20px;
97 -moz-border-radius: 20px;
98 -webkit-border-radius: 20px;
99}
100div.overlay .title {
101 color: #FFF;
102 font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
103 font-weight: bold;
104 text-align: center;
105 display: block;
106 font-size: 26px;
107 position: absolute;
108 bottom: 30px;
109 left: 0;
110 width: 100%;
111}
112div.overlay .icon {
113 position: relative;
114 display: inline-block;
115 width: 128px;
116 height: 128px;
117 top: 40%;
118 left: 50%;
119 margin-left: -64px;
120 margin-top: -64px;
121 text-align: center;
122 vertical-align: middle;
123 font-family: 'clipperz-icons';
124 -webkit-font-feature-settings: "@foo", "@bar";
125 -moz-font-feature-settings: "@foo=1, @bar=1";
126 -moz-font-feature-settings: "@foo", "@bar";
127 -ms-font-feature-settings: "@foo", "@bar";
128 -o-font-feature-settings: "@foo", "@bar";
129 font-feature-settings: "@foo", "@bar";
130 -webkit-font-smoothing: antialiased;
131 text-rendering: optimizeLegibility;
132 font-size: 96pt;
133 color: white;
134 text-shadow: none;
135}
136div.overlay.ios-overlay-show {
137 -webkit-animation-name: ios-overlay-show;
138 -webkit-animation-duration: 750ms;
139 -webkit-animation-fill-mode: none;
140 -webkit-animation-iteration-count: 1;
141 -moz-animation-name: ios-overlay-show;
142 -moz-animation-duration: 750ms;
143 -moz-animation-fill-mode: none;
144 -moz-animation-iteration-count: 1;
145 -ms-animation-name: ios-overlay-show;
146 -ms-animation-duration: 750ms;
147 -ms-animation-fill-mode: none;
148 -ms-animation-iteration-count: 1;
149 -o-animation-name: ios-overlay-show;
150 -o-animation-duration: 750ms;
151 -o-animation-fill-mode: none;
152 -o-animation-iteration-count: 1;
153 animation-name: ios-overlay-show;
154 animation-duration: 750ms;
155 animation-fill-mode: none;
156 animation-iteration-count: 1;
157}
158div.overlay.ios-overlay-hide {
159 -webkit-animation-name: ios-overlay-hide;
160 -webkit-animation-duration: 750ms;
161 -webkit-animation-fill-mode: forwards;
162 -webkit-animation-iteration-count: 1;
163 -moz-animation-name: ios-overlay-hide;
164 -moz-animation-duration: 750ms;
165 -moz-animation-fill-mode: forwards;
166 -moz-animation-iteration-count: 1;
167 -ms-animation-name: ios-overlay-hide;
168 -ms-animation-duration: 750ms;
169 -ms-animation-fill-mode: forwards;
170 -ms-animation-iteration-count: 1;
171 -o-animation-name: ios-overlay-hide;
172 -o-animation-duration: 750ms;
173 -o-animation-fill-mode: forwards;
174 -o-animation-iteration-count: 1;
175 animation-name: ios-overlay-hide;
176 animation-duration: 750ms;
177 animation-fill-mode: forwards;
178 animation-iteration-count: 1;
179}
180div.overlay div.spinner {
181 position: relative;
182 width: 100px;
183 height: 100px;
184 left: 50% !important;
185 top: 40% !important;
186 margin-left: -50px;
187 margin-top: -50px;
188 display: block;
189}
190div.overlay div.spinner div {
191 width: 12%;
192 height: 26%;
193 background: #ffffff;
194 position: absolute;
195 left: 44.5%;
196 top: 37%;
197 opacity: 0;
198 -webkit-animation-name: fade;
199 -webkit-animation-duration: 1s;
200 -webkit-animation-fill-mode: linear;
201 -webkit-animation-iteration-count: infinite;
202 -moz-animation-name: fade;
203 -moz-animation-duration: 1s;
204 -moz-animation-fill-mode: linear;
205 -moz-animation-iteration-count: infinite;
206 -ms-animation-name: fade;
207 -ms-animation-duration: 1s;
208 -ms-animation-fill-mode: linear;
209 -ms-animation-iteration-count: infinite;
210 -o-animation-name: fade;
211 -o-animation-duration: 1s;
212 -o-animation-fill-mode: linear;
213 -o-animation-iteration-count: infinite;
214 animation-name: fade;
215 animation-duration: 1s;
216 animation-fill-mode: linear;
217 animation-iteration-count: infinite;
218 border-radius: 50px;
219 -moz-border-radius: 50px;
220 -webkit-border-radius: 50px;
221 -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
222 -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
223 -ms-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
224 -o-box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
225 box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
226}
227div.overlay div.spinner div.bar01 {
228 -webkit-transform: rotate(0deg) translate(0, -142%);
229 -moz-transform: rotate(0deg) translate(0, -142%);
230 -ms-transform: rotate(0deg) translate(0, -142%);
231 -o-transform: rotate(0deg) translate(0, -142%);
232 transform: rotate(0deg) translate(0, -142%);
233 -webkit-animation-delay: 0s;
234 -moz-animation-delay: 0s;
235 -ms-animation-delay: 0s;
236 -o-animation-delay: 0s;
237 animation-delay: 0s;
238}
239div.overlay div.spinner div.bar02 {
240 -webkit-transform: rotate(30deg) translate(0, -142%);
241 -moz-transform: rotate(30deg) translate(0, -142%);
242 -ms-transform: rotate(30deg) translate(0, -142%);
243 -o-transform: rotate(30deg) translate(0, -142%);
244 transform: rotate(30deg) translate(0, -142%);
245 -webkit-animation-delay: -0.9167s;
246 -moz-animation-delay: -0.9167s;
247 -ms-animation-delay: -0.9167s;
248 -o-animation-delay: -0.9167s;
249 animation-delay: -0.9167s;
250}
251div.overlay div.spinner div.bar03 {
252 -webkit-transform: rotate(60deg) translate(0, -142%);
253 -moz-transform: rotate(60deg) translate(0, -142%);
254 -ms-transform: rotate(60deg) translate(0, -142%);
255 -o-transform: rotate(60deg) translate(0, -142%);
256 transform: rotate(60deg) translate(0, -142%);
257 -webkit-animation-delay: -0.833s;
258 -moz-animation-delay: -0.833s;
259 -ms-animation-delay: -0.833s;
260 -o-animation-delay: -0.833s;
261 animation-delay: -0.833s;
262}
263div.overlay div.spinner div.bar04 {
264 -webkit-transform: rotate(90deg) translate(0, -142%);
265 -moz-transform: rotate(90deg) translate(0, -142%);
266 -ms-transform: rotate(90deg) translate(0, -142%);
267 -o-transform: rotate(90deg) translate(0, -142%);
268 transform: rotate(90deg) translate(0, -142%);
269 -webkit-animation-delay: -0.75s;
270 -moz-animation-delay: -0.75s;
271 -ms-animation-delay: -0.75s;
272 -o-animation-delay: -0.75s;
273 animation-delay: -0.75s;
274}
275div.overlay div.spinner div.bar05 {
276 -webkit-transform: rotate(120deg) translate(0, -142%);
277 -moz-transform: rotate(120deg) translate(0, -142%);
278 -ms-transform: rotate(120deg) translate(0, -142%);
279 -o-transform: rotate(120deg) translate(0, -142%);
280 transform: rotate(120deg) translate(0, -142%);
281 -webkit-animation-delay: -0.667s;
282 -moz-animation-delay: -0.667s;
283 -ms-animation-delay: -0.667s;
284 -o-animation-delay: -0.667s;
285 animation-delay: -0.667s;
286}
287div.overlay div.spinner div.bar06 {
288 -webkit-transform: rotate(150deg) translate(0, -142%);
289 -moz-transform: rotate(150deg) translate(0, -142%);
290 -ms-transform: rotate(150deg) translate(0, -142%);
291 -o-transform: rotate(150deg) translate(0, -142%);
292 transform: rotate(150deg) translate(0, -142%);
293 -webkit-animation-delay: -0.5833s;
294 -moz-animation-delay: -0.5833s;
295 -ms-animation-delay: -0.5833s;
296 -o-animation-delay: -0.5833s;
297 animation-delay: -0.5833s;
298}
299div.overlay div.spinner div.bar07 {
300 -webkit-transform: rotate(180deg) translate(0, -142%);
301 -moz-transform: rotate(180deg) translate(0, -142%);
302 -ms-transform: rotate(180deg) translate(0, -142%);
303 -o-transform: rotate(180deg) translate(0, -142%);
304 transform: rotate(180deg) translate(0, -142%);
305 -webkit-animation-delay: -0.5s;
306 -moz-animation-delay: -0.5s;
307 -ms-animation-delay: -0.5s;
308 -o-animation-delay: -0.5s;
309 animation-delay: -0.5s;
310}
311div.overlay div.spinner div.bar08 {
312 -webkit-transform: rotate(210deg) translate(0, -142%);
313 -moz-transform: rotate(210deg) translate(0, -142%);
314 -ms-transform: rotate(210deg) translate(0, -142%);
315 -o-transform: rotate(210deg) translate(0, -142%);
316 transform: rotate(210deg) translate(0, -142%);
317 -webkit-animation-delay: -0.41667s;
318 -moz-animation-delay: -0.41667s;
319 -ms-animation-delay: -0.41667s;
320 -o-animation-delay: -0.41667s;
321 animation-delay: -0.41667s;
322}
323div.overlay div.spinner div.bar09 {
324 -webkit-transform: rotate(240deg) translate(0, -142%);
325 -moz-transform: rotate(240deg) translate(0, -142%);
326 -ms-transform: rotate(240deg) translate(0, -142%);
327 -o-transform: rotate(240deg) translate(0, -142%);
328 transform: rotate(240deg) translate(0, -142%);
329 -webkit-animation-delay: -0.333s;
330 -moz-animation-delay: -0.333s;
331 -ms-animation-delay: -0.333s;
332 -o-animation-delay: -0.333s;
333 animation-delay: -0.333s;
334}
335div.overlay div.spinner div.bar10 {
336 -webkit-transform: rotate(270deg) translate(0, -142%);
337 -moz-transform: rotate(270deg) translate(0, -142%);
338 -ms-transform: rotate(270deg) translate(0, -142%);
339 -o-transform: rotate(270deg) translate(0, -142%);
340 transform: rotate(270deg) translate(0, -142%);
341 -webkit-animation-delay: -0.25s;
342 -moz-animation-delay: -0.25s;
343 -ms-animation-delay: -0.25s;
344 -o-animation-delay: -0.25s;
345 animation-delay: -0.25s;
346}
347div.overlay div.spinner div.bar11 {
348 -webkit-transform: rotate(300deg) translate(0, -142%);
349 -moz-transform: rotate(300deg) translate(0, -142%);
350 -ms-transform: rotate(300deg) translate(0, -142%);
351 -o-transform: rotate(300deg) translate(0, -142%);
352 transform: rotate(300deg) translate(0, -142%);
353 -webkit-animation-delay: -0.1667s;
354 -moz-animation-delay: -0.1667s;
355 -ms-animation-delay: -0.1667s;
356 -o-animation-delay: -0.1667s;
357 animation-delay: -0.1667s;
358}
359div.overlay div.spinner div.bar12 {
360 -webkit-transform: rotate(330deg) translate(0, -142%);
361 -moz-transform: rotate(330deg) translate(0, -142%);
362 -ms-transform: rotate(330deg) translate(0, -142%);
363 -o-transform: rotate(330deg) translate(0, -142%);
364 transform: rotate(330deg) translate(0, -142%);
365 -webkit-animation-delay: -0.0833s;
366 -moz-animation-delay: -0.0833s;
367 -ms-animation-delay: -0.0833s;
368 -o-animation-delay: -0.0833s;
369 animation-delay: -0.0833s;
370}
371@-webkit-keyframes fade {
372 from {
373 opacity: 1;
374 }
375 to {
376 opacity: 0.25;
377 }
378}
379@-o-keyframes fade {
380 from {
381 opacity: 1;
382 }
383 to {
384 opacity: 0.25;
385 }
386}
387@keyframes fade {
388 from {
389 opacity: 1;
390 }
391 to {
392 opacity: 0.25;
393 }
394}
395@-webkit-keyframes ios-overlay-show {
396 0% {
397 opacity: 0;
398 }
399 100% {
400 opacity: 1;
401 }
402}
403@-moz-keyframes ios-overlay-show {
404 0% {
405 opacity: 0;
406 }
407 100% {
408 opacity: 1;
409 }
410}
411@-ms-keyframes ios-overlay-show {
412 0% {
413 opacity: 0;
414 }
415 100% {
416 opacity: 1;
417 }
418}
419@-o-keyframes ios-overlay-show {
420 0% {
421 opacity: 0;
422 }
423 100% {
424 opacity: 1;
425 }
426}
427@keyframes ios-overlay-show {
428 0% {
429 opacity: 0;
430 }
431 100% {
432 opacity: 1;
433 }
434}
435@-webkit-keyframes ios-overlay-hide {
436 0% {
437 opacity: 1;
438 }
439 100% {
440 opacity: 0;
441 }
442}
443@-moz-keyframes ios-overlay-hide {
444 0% {
445 opacity: 1;
446 }
447 100% {
448 opacity: 0;
449 }
450}
451@-ms-keyframes ios-overlay-hide {
452 0% {
453 opacity: 1;
454 }
455 100% {
456 opacity: 0;
457 }
458}
459@-o-keyframes ios-overlay-hide {
460 0% {
461 opacity: 1;
462 }
463 100% {
464 opacity: 0;
465 }
466}
467@keyframes ios-overlay-hide {
468 0% {
469 opacity: 1;
470 }
471 100% {
472 opacity: 0;
473 }
474}
475.page {
476 position: absolute;
477 top: 0;
478 left: 0;
479 width: 100%;
480 height: 100%;
481 -webkit-transform: translate3d(0, 0, 0);
482 transform: translate3d(0, 0, 0);
483}
484.page.left {
485 -webkit-transform: translate3d(-100%, 0, 0);
486 transform: translate3d(-100%, 0, 0);
487}
488.page.center {
489 -webkit-transform: translate3d(0, 0, 0);
490 transform: translate3d(0, 0, 0);
491}
492.page.right {
493 -webkit-transform: translate3d(100%, 0, 0);
494 transform: translate3d(100%, 0, 0);
495 visibility: hidden;
496 display: none;
497}
498.page.right.transition {
499 visibility: visible;
500 display: block;
501}
502.page.transition {
503 -webkit-transition-duration: .25s;
504 transition-duration: .25s;
505}
506/*
507.registrationForm {
508 .steps {
509 .step {
510 position: absolute;
511
512 // top: 0;
513 // left: 0;
514 // width: 100%;
515 // height: 100%;
516
517 .slide();
518 }
519 }
520}
521*/
522/*
523.page {
524 transform: rotateY( 0deg) translateZ( 100px);
525
526 &.left {
527 transform: rotateY( -90deg) translateZ( 100px);
528 }
529
530 &.center {
531 transform: rotateY( 0deg) translateZ( 100px);
532 }
533
534 &.right {
535 transform: rotateY( 90deg) translateZ( 100px);
536 }
537}
538
539#mainDiv {
540 width: 100%;
541 height: 100%;
542 position: absolute;
543 transform-style: preserve-3d;
544
545 transition: transform 3s;
546
547 &.show-front { transform: translateZ( -100px ) rotateY( 0deg ); }
548 &.show-back { transform: translateZ( -100px ) rotateX( -180deg ); }
549 &.show-right { transform: translateZ( -100px ) rotateY( -90deg ); }
550 &.show-left { transform: translateZ( -100px ) rotateY( 90deg ); }
551 &.show-top { transform: translateZ( -100px ) rotateX( -90deg ); }
552 &.show-bottom { transform: translateZ( -100px ) rotateX( 90deg ); }
553}
554*/
555/*
556 # box-sizing: { content-box | border-box | inherit };
557
558 # css flex box (also with LESSCSS mixin):
559 - https://github.com/ProLoser/Flexbox.less;
560 - https://gist.github.com/jayj/4012969
561
562*/
563body {
564 font-family: "Source Code Pro";
565 background: #f8f8f8 url('data:image/png;base64,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') top left;
566 font-size: 18pt;
567}
568a {
569 cursor: pointer;
570}
571.button {
572 min-height: 48px;
573 min-width: 48px;
574 color: white;
575 font-size: 100%;
576 font-weight: 700;
577 border: 0px;
578 padding-left: 20px;
579 padding-right: 20px;
580 background-color: #dc322f;
581 -webkit-transition: background-color 0.2s linear;
582 -moz-transition: background-color 0.2s linear;
583 -o-transition: background-color 0.2s linear;
584 -ms-transition: background-color 0.2s linear;
585 transition: background-color 0.2s linear;
586}
587.button:disabled {
588 background-color: #c0c0c0;
589}
590div.page {
591 padding: 0px;
592 margin: 0px;
593 width: 100%;
594}
595div.page div.header h1 {
596 font-size: 36pt;
597 font-weight: 900;
598 color: #ff9900;
599 margin: 0px 10px;
600}
601div.page div.content {
602 margin: 0px 10px;
603}
604#loadingPage {
605 background-image: -ms-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%);
606 /* IE10 */
607 background-image: -moz-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%);
608 /* Mozilla Firefox */
609 background-image: -o-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%);
610 /* Opera */
611 background-image: -webkit-radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%);
612 /* Webkit (Chrome 11+) */
613 background-image: radial-gradient(center, circle farthest-corner, #d9daf0 0%, #6c71c4 100%);
614 /* Proposed W3C Markup */
615 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, #d9daf0), color-stop(1, #6c71c4));
616 /* Webkit (Safari/Chrome 10) */
617}
618#loadingPage div {
619 vertical-align: middle;
620 width: 100%;
621 text-align: center;
622}
623#loadingPage div h1 {
624 font-size: 40pt;
625 color: #ffffff;
626 margin-top: 5%;
627 margin-bottom: 5px;
628}
629#loadingPage div h3 {
630 font-size: 18pt;
631 color: #6c71c4;
632 margin: 0px;
633}
634#loginPage form label {
635 display: none;
636}
637#loginPage form input {
638 display: block;
639 border: 1px solid #eee8d5;
640 border-radius: 6px;
641 -moz-border-radius: 6px;
642 -webkit-border-radius: 6px;
643 padding: 5px;
644 margin-top: 5px;
645 margin-bottom: 10px;
646 font-size: 100%;
647 box-shadow: inset 0 0 0;
648}
649#loginPage .registrationLink {
650 color: #cb4b16;
651 background: none;
652}
653#loginPage .registrationLink:before {
654 content: "> ";
655}
656#loginPage .registrationLink a {
657 color: #cb4b16;
658}
659#registrationPage label {
660 display: none;
661}
662#registrationPage input {
663 display: block;
664 border: 1px solid #eee8d5;
665 border-radius: 6px;
666 -moz-border-radius: 6px;
667 -webkit-border-radius: 6px;
668 padding: 5px;
669 margin-top: 5px;
670 margin-bottom: 10px;
671 font-size: 100%;
672 box-shadow: inset 0 0 0;
673}
674#registrationPage .steps .step {
675 display: none;
676}
677#registrationPage .steps .step.center {
678 display: block;
679}
680#registrationPage .steps .step h1 {
681 color: #268bd2;
682 font-size: 24pt;
683 font-weight: 700;
684 margin: 0px;
685}
686#registrationPage .steps .step p {
687 color: #657b83;
688 font-size: 14pt;
689 font-weight: 100;
690 margin: 0px;
691}
692#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock {
693 margin-top: 10px;
694 margin-bottom: 10px;
695 clear: both;
696}
697#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock input {
698 display: block;
699 float: left;
700 margin: 5px;
701 width: 30px;
702}
703#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock p {
704 font-size: 12pt;
705 font-weight: 500;
706 display: block;
707}
708#registrationPage .steps .step.TERMS_OF_SERVICE .checkboxBlock p a {
709 color: #dc322f;
710}
711#registrationPage .steps .step .stepIndex {
712 text-align: center;
713}
714#registrationPage .steps .step .stepIndex .stepIndexItem {
715 font-weight: 900;
716 font-size: 28pt;
717 display: inline;
718 color: lightgrey;
719}
720#registrationPage .steps .step .stepIndex .stepIndexItem.center {
721 color: gray;
722}
723#registrationPage .steps .step .buttons {
724 text-align: center;
725 margin-top: 10px;
726}
727#registrationPage .steps .step .buttons .button {
728 margin: 10px;
729 text-align: center;
730 vertical-align: middle;
731 display: inline-block;
732 width: 80px;
733 font-weight: 900;
734 line-height: 45px;
735 font-size: 24px;
736}
737#registrationPage .steps .step .buttons .button.back {
738 background-color: lightgrey;
739}
740#registrationPage .steps .step .buttons .button.disabled {
741 background-color: #c0c0c0;
742 cursor: default;
743}
744#cardListPage .header {
745 border-bottom: 2px solid #2aa198;
746 display: inline-block;
747 width: 100%;
748 margin-bottom: 0px;
749 height: 46px;
750}
751#cardListPage .header a.account {
752 font-family: 'clipperz-icons';
753 -webkit-font-feature-settings: "@foo", "@bar";
754 -moz-font-feature-settings: "@foo=1, @bar=1";
755 -moz-font-feature-settings: "@foo", "@bar";
756 -ms-font-feature-settings: "@foo", "@bar";
757 -o-font-feature-settings: "@foo", "@bar";
758 font-feature-settings: "@foo", "@bar";
759 -webkit-font-smoothing: antialiased;
760 text-rendering: optimizeLegibility;
761 color: #ff9900;
762 display: block;
763 float: left;
764 font-size: 28pt;
765 padding-top: 3px;
766 padding-left: 15px;
767 padding-right: 15px;
768 vertical-align: top;
769}
770#cardListPage .header .features {
771 text-align: right;
772 display: block;
773 float: right;
774 padding-right: 5px;
775 height: 100%;
776}
777#cardListPage .header .features a {
778 font-family: 'clipperz-icons';
779 -webkit-font-feature-settings: "@foo", "@bar";
780 -moz-font-feature-settings: "@foo=1, @bar=1";
781 -moz-font-feature-settings: "@foo", "@bar";
782 -ms-font-feature-settings: "@foo", "@bar";
783 -o-font-feature-settings: "@foo", "@bar";
784 font-feature-settings: "@foo", "@bar";
785 -webkit-font-smoothing: antialiased;
786 text-rendering: optimizeLegibility;
787 color: #2aa198;
788 display: inline-block;
789 font-size: 28pt;
790 padding-left: 10px;
791 padding-right: 10px;
792 height: 100%;
793 line-height: 33pt;
794}
795#cardListPage .header .features a.selected {
796 background-color: #2aa198;
797 color: white;
798}
799#cardListPage .searchBox {
800 background-color: #2aa198;
801 width: 100%;
802 clear: both;
803}
804#cardListPage .searchBox > div {
805 padding: 4px;
806 padding-top: 2px;
807}
808#cardListPage .searchBox input {
809 font-size: 14pt;
810 display: block;
811 border: 1px solid #eee8d5;
812 border-radius: 6px;
813 -moz-border-radius: 6px;
814 -webkit-border-radius: 6px;
815 box-shadow: inset 0 0 0;
816 width: 100%;
817 margin: 0px;
818 color: #657b83;
819}
820#cardListPage .content.cardList {
821 margin-left: 0px;
822 margin-right: 0px;
823}
824#cardListPage .content.cardList .listItem {
825 min-height: 48px;
826 line-height: 24pt;
827 cursor: pointer;
828 display: inline-table;
829 width: 100%;
830}
831#cardListPage .content.cardList .listItem:nth-child(odd) {
832 background-color: #eee8d5;
833}
834#cardListPage .content.cardList .listItem .labelWrapper {
835 float: left;
836 width: 100%;
837}
838#cardListPage .content.cardList .listItem .labelWrapper span {
839 margin: 0px;
840 margin-left: 42px;
841 margin-right: 30px;
842 display: block;
843 padding-top: 7px;
844 padding-bottom: 7px;
845 color: #dc322f;
846 font-weight: 400;
847}
848#cardListPage .content.cardList .listItem .faviconWrapper {
849 float: left;
850 width: 42px;
851 margin-left: -100%;
852}
853#cardListPage .content.cardList .listItem .faviconWrapper .favicon {
854 width: 32px;
855 height: 32px;
856 padding: 8px 5px;
857 vertical-align: text-bottom;
858}
859#cardListPage .content.cardList .listItem .detailLinkWrapper {
860 float: left;
861 width: 30px;
862 margin-left: -30px;
863 text-align: center;
864 padding-top: 7px;
865}
866#cardListPage .content.cardList .listItem .detailLinkWrapper span {
867 color: #2aa198;
868 font-family: 'clipperz-icons';
869 -webkit-font-feature-settings: "@foo", "@bar";
870 -moz-font-feature-settings: "@foo=1, @bar=1";
871 -moz-font-feature-settings: "@foo", "@bar";
872 -ms-font-feature-settings: "@foo", "@bar";
873 -o-font-feature-settings: "@foo", "@bar";
874 font-feature-settings: "@foo", "@bar";
875 -webkit-font-smoothing: antialiased;
876 text-rendering: optimizeLegibility;
877}
878#cardDetailPage .header {
879 border-bottom: 2px solid #2aa198;
880 width: 100%;
881 margin-bottom: 0px;
882 height: 46px;
883}
884#cardDetailPage .header .backWrapper {
885 float: left;
886 width: 48px;
887 margin-left: -100%;
888}
889#cardDetailPage .header .backWrapper .back {
890 display: inline-block;
891 background-color: #2aa198;
892 padding: 11px;
893 box-sizing: border-box;
894 font-family: 'clipperz-icons';
895 -webkit-font-feature-settings: "@foo", "@bar";
896 -moz-font-feature-settings: "@foo=1, @bar=1";
897 -moz-font-feature-settings: "@foo", "@bar";
898 -ms-font-feature-settings: "@foo", "@bar";
899 -o-font-feature-settings: "@foo", "@bar";
900 font-feature-settings: "@foo", "@bar";
901 -webkit-font-smoothing: antialiased;
902 text-rendering: optimizeLegibility;
903}
904#cardDetailPage .header .titleWrapper {
905 float: left;
906 width: 100%;
907 height: 48px;
908 overflow: hidden;
909}
910#cardDetailPage .header .titleWrapper .title {
911 margin-left: 48px;
912 margin-right: 48px;
913 display: inline-block;
914 padding-left: 10px;
915 color: #dc322f;
916 font-weight: 400;
917 line-height: 36pt;
918 white-space: nowrap;
919}
920#cardDetailPage .header .starWrapper {
921 float: left;
922 width: 48px;
923 margin-left: -48px;
924 text-align: center;
925}
926#cardDetailPage .header .starWrapper .star {
927 font-size: 18pt;
928 line-height: 35pt;
929 color: #d33682;
930 font-family: 'clipperz-icons';
931 -webkit-font-feature-settings: "@foo", "@bar";
932 -moz-font-feature-settings: "@foo=1, @bar=1";
933 -moz-font-feature-settings: "@foo", "@bar";
934 -ms-font-feature-settings: "@foo", "@bar";
935 -o-font-feature-settings: "@foo", "@bar";
936 font-feature-settings: "@foo", "@bar";
937 -webkit-font-smoothing: antialiased;
938 text-rendering: optimizeLegibility;
939}
940#cardDetailPage .content {
941 overflow: scroll;
942 margin: 0px;
943}
944#cardDetailPage .content .fields .listItem {
945 display: inline-table;
946 width: 100%;
947 font-size: 14pt;
948 border-bottom: 1px solid #eee8d5;
949}
950#cardDetailPage .content .fields .listItem .fieldWrapper {
951 width: 100%;
952 float: left;
953}
954#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper {
955 padding: 3px 10px 3px 10px;
956 margin: 0px;
957 margin-right: 48px;
958 display: block;
959}
960#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .labelWrapper {
961 display: block;
962}
963#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .labelWrapper .label {
964 color: #cb4b16;
965 font-size: 10pt;
966 font-weight: 300;
967}
968#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper {
969 display: block;
970 box-sizing: border-box;
971}
972#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper .value {
973 color: #268bd2;
974 font-weight: 500;
975}
976#cardDetailPage .content .fields .listItem .fieldWrapper .fieldInnerWrapper .valueWrapper .value.PASSWORD {
977 font-family: 'clipperz-password';
978 -webkit-font-smoothing: antialiased;
979 text-rendering: optimizeLegibility;
980 font-size: 28pt;
981}
982#cardDetailPage .content .fields .listItem .actionWrapper {
983 float: left;
984 width: 48px;
985 margin-left: -48px;
986 text-align: center;
987}
988#cardDetailPage .content .fields .listItem .actionWrapper div {
989 font-size: 18pt;
990 line-height: 35pt;
991 color: #2aa198;
992 font-family: 'clipperz-icons';
993 -webkit-font-feature-settings: "@foo", "@bar";
994 -moz-font-feature-settings: "@foo=1, @bar=1";
995 -moz-font-feature-settings: "@foo", "@bar";
996 -ms-font-feature-settings: "@foo", "@bar";
997 -o-font-feature-settings: "@foo", "@bar";
998 font-feature-settings: "@foo", "@bar";
999 -webkit-font-smoothing: antialiased;
1000 text-rendering: optimizeLegibility;
1001}
1002#cardDetailPage .content .directLogins .listItem {
1003 min-height: 47px;
1004 line-height: 35pt;
1005 cursor: pointer;
1006 display: inline-table;
1007 width: 100%;
1008 background-color: #859900;
1009 border-bottom: 1px solid #eee8d5;
1010 font-size: 14pt;
1011}
1012#cardDetailPage .content .directLogins .listItem .labelWrapper {
1013 float: left;
1014 width: 100%;
1015}
1016#cardDetailPage .content .directLogins .listItem .labelWrapper span {
1017 margin: 0px;
1018 margin-left: 42px;
1019 margin-right: 48px;
1020 display: block;
1021 color: white;
1022 font-weight: 500;
1023}
1024#cardDetailPage .content .directLogins .listItem .faviconWrapper {
1025 float: left;
1026 width: 42px;
1027 margin-left: -100%;
1028}
1029#cardDetailPage .content .directLogins .listItem .faviconWrapper .favicon {
1030 width: 32px;
1031 height: 32px;
1032 padding: 8px 5px;
1033 vertical-align: text-bottom;
1034}
1035#cardDetailPage .content .directLogins .listItem .directLoginLinkWrapper {
1036 float: left;
1037 width: 48px;
1038 margin-left: -48px;
1039 text-align: center;
1040}
1041#cardDetailPage .content .directLogins .listItem .directLoginLinkWrapper span {
1042 font-size: 18pt;
1043 color: white;
1044 font-family: 'clipperz-icons';
1045 -webkit-font-feature-settings: "@foo", "@bar";
1046 -moz-font-feature-settings: "@foo=1, @bar=1";
1047 -moz-font-feature-settings: "@foo", "@bar";
1048 -ms-font-feature-settings: "@foo", "@bar";
1049 -o-font-feature-settings: "@foo", "@bar";
1050 font-feature-settings: "@foo", "@bar";
1051 -webkit-font-smoothing: antialiased;
1052 text-rendering: optimizeLegibility;
1053}
1054#cardDetailPage .footer {
1055 font-family: 'clipperz-icons';
1056 -webkit-font-feature-settings: "@foo", "@bar";
1057 -moz-font-feature-settings: "@foo=1, @bar=1";
1058 -moz-font-feature-settings: "@foo", "@bar";
1059 -ms-font-feature-settings: "@foo", "@bar";
1060 -o-font-feature-settings: "@foo", "@bar";
1061 font-feature-settings: "@foo", "@bar";
1062 -webkit-font-smoothing: antialiased;
1063 text-rendering: optimizeLegibility;
1064 color: white;
1065 width: 100%;
1066 position: fixed;
1067 bottom: 0px;
1068 display: none;
1069}
1070#cardDetailPage .footer a {
1071 display: inline-block;
1072 text-align: center;
1073 padding: 11px;
1074 box-sizing: border-box;
1075}
1076#cardDetailPage .footer a.cancel {
1077 width: 33%;
1078 background-color: #dc322f;
1079}
1080#cardDetailPage .footer a.save {
1081 width: 67%;
1082 background-color: #859900;
1083}
1084.icon-spin {
1085 display: inline-block;
1086 -moz-animation: spin 2s infinite linear;
1087 -o-animation: spin 2s infinite linear;
1088 -webkit-animation: spin 2s infinite linear;
1089 animation: spin 2s infinite linear;
1090}
1091@-moz-keyframes spin {
1092 0% {
1093 -moz-transform: rotate(0deg);
1094 }
1095 100% {
1096 -moz-transform: rotate(359deg);
1097 }
1098}
1099@-webkit-keyframes spin {
1100 0% {
1101 -webkit-transform: rotate(0deg);
1102 }
1103 100% {
1104 -webkit-transform: rotate(359deg);
1105 }
1106}
1107@-o-keyframes spin {
1108 0% {
1109 -o-transform: rotate(0deg);
1110 }
1111 100% {
1112 -o-transform: rotate(359deg);
1113 }
1114}
1115@-ms-keyframes spin {
1116 0% {
1117 -ms-transform: rotate(0deg);
1118 }
1119 100% {
1120 -ms-transform: rotate(359deg);
1121 }
1122}
1123@keyframes spin {
1124 0% {
1125 transform: rotate(0deg);
1126 }
1127 100% {
1128 transform: rotate(359deg);
1129 }
1130}
1131/*
1132==================================
1133
1134THREE COLUMN LAYOUT (left/right fixed size; center elastic)
1135
1136------------- ~~~~~~ ------------
1137| | | |
1138| a | b | c |
1139| | | |
1140------------- ~~~~~~ ------------
1141
1142==================================
1143
1144.listItem
1145 .bWrapper
1146 .b
1147 .aWrapper
1148 .a
1149 .cWrapper
1150 .c
1151
1152==================================
1153
1154.listItem {
1155
1156 display: inline-table;
1157 width: 100%;
1158
1159 .aWrapper {
1160 float: left;
1161 width: <a.width>px;
1162 margin-left: -100%;
1163
1164 .a {
1165
1166 }
1167 }
1168
1169 .bWrapper {
1170 float: left;
1171 width: 100%;
1172
1173
1174 .b {
1175 margin: 0px;
1176 margin-left: <a.width>px;
1177 margin-right: <c.width>px;
1178 display: block;
1179 }
1180 }
1181
1182 .cWrapper {
1183 float: left;
1184 width: <c.width>px;
1185 margin-left: -<c.width>px;
1186
1187 .c {
1188
1189 }
1190 }
1191
1192}
1193*/@media only screen and (min-width: 480px) {
1194 .loginForm {
1195 font-size: 1.2em;
1196 }
1197}
1198@media only screen and (min-width: 768px) {
1199
1200}
1201@media only screen and (min-width: 992px) {
1202
1203}
1204/**
1205 *
1206 * Main container
1207 *
1208 */
1209#addToHomeScreen {
1210 z-index: 9999;
1211 -webkit-user-select: none;
1212 user-select: none;
1213 -webkit-box-sizing: border-box;
1214 box-sizing: border-box;
1215 -webkit-touch-callout: none;
1216 touch-callout: none;
1217 width: 240px;
1218 font-size: 15px;
1219 padding: 12px 14px;
1220 text-align: left;
1221 font-family: helvetica;
1222 background-image: -webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #ffffff), color-stop(0.02, #eeeeee), color-stop(0.98, #cccccc), color-stop(1, #a3a3a3));
1223 border: 1px solid #505050;
1224 -webkit-border-radius: 8px;
1225 -webkit-background-clip: padding-box;
1226 color: #333;
1227 text-shadow: 0 1px 0 rgba(255, 255, 255, 0.75);
1228 line-height: 130%;
1229 -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.5);
1230}
1231#addToHomeScreen.addToHomeIpad {
1232 width: 268px;
1233 font-size: 18px;
1234 padding: 14px;
1235}
1236/**
1237 *
1238 * The 'wide' class is added when the popup contains the touch icon
1239 *
1240 */
1241#addToHomeScreen.addToHomeWide {
1242 width: 296px;
1243}
1244#addToHomeScreen.addToHomeIpad.addToHomeWide {
1245 width: 320px;
1246 font-size: 18px;
1247 padding: 14px;
1248}
1249/**
1250 *
1251 * The balloon arrow
1252 *
1253 */
1254#addToHomeScreen .addToHomeArrow {
1255 position: absolute;
1256 background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0, rgba(204, 204, 204, 0)), color-stop(0.4, rgba(204, 204, 204, 0)), color-stop(0.4, #cccccc));
1257 border-width: 0 1px 1px 0;
1258 border-style: solid;
1259 border-color: #505050;
1260 width: 16px;
1261 height: 16px;
1262 -webkit-transform: rotateZ(45deg);
1263 bottom: -9px;
1264 left: 50%;
1265 margin-left: -8px;
1266 -webkit-box-shadow: inset -1px -1px 0 #a9a9a9;
1267 -webkit-border-bottom-right-radius: 2px;
1268}
1269/**
1270 *
1271 * The balloon arrow for iPad
1272 *
1273 */
1274#addToHomeScreen.addToHomeIpad .addToHomeArrow {
1275 -webkit-transform: rotateZ(-135deg);
1276 background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(0, rgba(238, 238, 238, 0)), color-stop(0.4, rgba(238, 238, 238, 0)), color-stop(0.4, #eeeeee));
1277 -webkit-box-shadow: inset -1px -1px 0 #ffffff;
1278 top: -9px;
1279 bottom: auto;
1280 left: 50%;
1281}
1282/**
1283 *
1284 * Close button
1285 *
1286 */
1287#addToHomeScreen .addToHomeClose {
1288 -webkit-box-sizing: border-box;
1289 position: absolute;
1290 right: 4px;
1291 top: 4px;
1292 width: 18px;
1293 height: 18px;
1294 line-height: 14px;
1295 text-align: center;
1296 text-indent: 1px;
1297 -webkit-border-radius: 9px;
1298 background: rgba(0, 0, 0, 0.12);
1299 color: #707070;
1300 -webkit-box-shadow: 0 1px 0 #fff;
1301 font-size: 16px;
1302}
1303/**
1304 *
1305 * The '+' icon, displayed only on iOS < 4.2
1306 *
1307 */
1308#addToHomeScreen .addToHomePlus {
1309 font-weight: bold;
1310 font-size: 1.3em;
1311}
1312/**
1313 *
1314 * The 'share' icon, displayed only on iOS >= 4.2
1315 *
1316 */
1317#addToHomeScreen .addToHomeShare {
1318 display: inline-block;
1319 width: 18px;
1320 height: 15px;
1321 background-repeat: no-repeat;
1322 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC);
1323 background-size: 18px 15px;
1324 text-indent: -9999em;
1325 overflow: hidden;
1326}
1327#addToHomeScreen .addToHomeShare.addToHomeShareOS7 {
1328 width: 11px;
1329 background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=);
1330 background-size: 11px 15px;
1331}
1332/**
1333 *
1334 * The touch icon (if available)
1335 *
1336 */
1337#addToHomeScreen .addToHomeTouchIcon {
1338 display: block;
1339 float: left;
1340 -webkit-border-radius: 6px;
1341 border-radius: 6px;
1342 -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5), inset 0 0 2px rgba(255, 255, 255, 0.9);
1343 box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5), inset 0 0 2px rgba(255, 255, 255, 0.9);
1344 background-repeat: no-repeat;
1345 width: 57px;
1346 height: 57px;
1347 -webkit-background-size: 57px 57px;
1348 background-size: 57px 57px;
1349 margin: 0 12px 0 0;
1350 border: 1px solid #333;
1351 -webkit-background-clip: padding-box;
1352 background-clip: padding-box;
1353}
diff --git a/frontend/delta/fonts/clipperz-icons.json b/frontend/delta/fonts/clipperz-icons.json
new file mode 100644
index 0000000..1c58732
--- a/dev/null
+++ b/frontend/delta/fonts/clipperz-icons.json
@@ -0,0 +1 @@
{"share":"6", "iconsVersion":"1.5", "icomoon":{"selected":[{"idx":"1014","unicode":"64x6fx6ex65"},{"idx":"1013","unicode":"66x61x69x6cx65x64"},{"idx":"994","unicode":"6cx6fx63x6bx65x64"},{"idx":"879","unicode":"75x6ex6cx6fx63x6bx65x64"},{"idx":"1021","unicode":"73x74x61x72x72x65x64"},{"idx":"1020","unicode":"75x6ex73x74x61x72x72x65x64"},{"idx":"1008","unicode":"73x65x74x74x69x6ex67x73"},{"idx":"1024","unicode":"73x65x61x72x63x68"},{"idx":"997","unicode":"72x65x66x72x65x73x68"},{"idx":"947","unicode":"64x65x74x61x69x6c"},{"idx":"815","unicode":"64x6fx77x6ex6cx6fx61x64"},{"idx":"873","unicode":"61x6cx65x72x74"},{"idx":"0","unicode":"63x6cx69x70x70x65x72x7a"},{"idx":"944","unicode":"63x61x6ex63x65x6c"},{"idx":"943","unicode":"73x61x76x65"},{"idx":"837","unicode":"70x61x79x6dx65x6ex74"},{"idx":"946","unicode":"61x64x64"},{"idx":"945","unicode":"64x65x6cx65x74x65"},{"idx":"986","unicode":"74x61x67"},{"idx":"985","unicode":"74x61x67x73"},{"idx":"783","unicode":"6cx6fx61x64x69x6ex67"},{"idx":"948","unicode":"62x61x63x6b"},{"idx":"797","unicode":"67x6f"},{"idx":"892","unicode":"65x78x69x74"},{"idx":"966","unicode":"65x64x69x74"},{"idx":"886","unicode":"70x68x6fx6ex65"},{"idx":"828","unicode":"65x6dx61x69x6c"}],"customIcons":[{"metadata":{"id":"fontawesome","name":"Font Awesome","link":"http://fortawesome.github.com/Font-Awesome/","grid":"14","author":"Dave Gandy","authorLink":"https://github.com/davegandy","license":"CC BY 3.0","licenseLink":"http://creativecommons.org/licenses/by/3.0/","defaultunicode":true},"svgs":["<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"folder-open-alt, open, directory, category, browse\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 445.25,232.75q0.00-8.75 -13.25-8.75l-272.00,0.00 q-10.00,0.00 -21.375,5.375t-17.875,13.125l-73.50,90.75q-4.50,6.00 -4.50,10.00q0.00,8.75 13.25,8.75l 272.00,0.00 q 10.00,0.00 21.50-5.50t 17.75-13.25l 73.50-90.75q 4.50-5.50 4.50-9.75zM 160.00,192.00l 192.00,0.00 l0.00-40.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-144.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-16.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-80.00,0.00 q-10.00,0.00 -17.00,7.00t-7.00,17.00 l0.00,213.25 l 64.00-78.75q 11.00-13.25 29.00-21.875t 35.00-8.625zM 477.25,232.75q0.00,15.50 -11.50,30.00l-73.75,90.75q-10.75,13.25 -29.00,21.875t-35.00,8.625l-272.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 136.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,40.00 l 48.00,0.00 q 13.50,0.00 24.75,6.125t 16.75,17.625q 3.75,8.00 3.75,17.00z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"folder-close-alt, directory, category\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,328.00l0.00-176.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-176.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-16.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-80.00,0.00 q-10.00,0.00 -17.00,7.00t-7.00,17.00l0.00,240.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 304.00,0.00 q 10.00,0.00 17.00-7.00t 7.00-17.00zM 416.00,152.00l0.00,176.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-304.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 168.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"github-alt, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,304.00q0.00,10.00 -3.125,20.50t-10.75,19.00t-18.125,8.50t-18.125-8.50t-10.75-19.00t-3.125-20.50t 3.125-20.50t 10.75-19.00t 18.125-8.50t 18.125,8.50t 10.75,19.00t 3.125,20.50zM 320.00,304.00q0.00,10.00 -3.125,20.50t-10.75,19.00t-18.125,8.50t-18.125-8.50t-10.75-19.00t-3.125-20.50t 3.125-20.50t 10.75-19.00t 18.125-8.50t 18.125,8.50t 10.75,19.00t 3.125,20.50zM 360.00,304.00 q0.00-30.00 -17.25-51.00t-46.75-21.00q-10.25,0.00 -48.75,5.25q-17.75,2.75 -39.25,2.75t-39.25-2.75q-38.00-5.25 -48.75-5.25q-29.50,0.00 -46.75,21.00t-17.25,51.00q0.00,22.00 8.00,38.375t 20.25,25.75t 30.50,15.00t 35.00,7.375t 37.25,1.75l 42.00,0.00 q 20.50,0.00 37.25-1.75t 35.00-7.375t 30.50-15.00t 20.25-25.75t 8.00-38.375zM 416.00,260.00q0.00,51.75 -15.25,82.75q-9.50,19.25 -26.375,33.25t-35.25,21.50 t-42.50,11.875t-42.875,5.50t-41.75,1.125q-19.50,0.00 -35.50-0.75t-36.875-3.125t-38.125-7.50t-34.25-12.875t-30.25-20.25t-21.50-28.75q-15.50-30.75 -15.50-82.75q0.00-59.25 34.00-99.00q-6.75-20.50 -6.75-42.50q0.00-29.00 12.75-54.50q 27.00,0.00 47.50,9.875t 47.25,30.875q 36.75-8.75 77.25-8.75q 37.00,0.00 70.00,8.00q 26.25-20.50 46.75-30.25t 47.25-9.75q 12.75,25.50 12.75,54.50 q0.00,21.75 -6.75,42.00q 34.00,40.00 34.00,99.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"reply, arrow, left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,280.00q0.00,41.50 -31.75,112.75q-0.75,1.75 -2.625,6.00t-3.375,7.50t-3.25,5.50q-3.00,4.25 -7.00,4.25q-3.75,0.00 -5.875-2.50t-2.125-6.25q0.00-2.25 0.625-6.625t 0.625-5.875q 1.25-17.00 1.25-30.75q0.00-25.25 -4.375-45.25t-12.125-34.625t-20.00-25.25t-26.375-17.375t-33.25-10.625t-38.50-5.375t-43.875-1.50l-56.00,0.00 l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75 l-128.00-128.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 128.00-128.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,64.00 l 56.00,0.00 q 178.25,0.00 218.75,100.75q 13.25,33.50 13.25,83.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"392\" height=\"448\" viewBox=\"0 0 392 448\" data-du=\"\" data-tags=\"spinner, loading, busy, progress\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 124.00,336.00q0.00,15.00 -10.625,25.50t-25.375,10.50q-15.00,0.00 -25.50-10.50t-10.50-25.50t 10.50-25.50t 25.50-10.50q 14.75,0.00 25.375,10.50t 10.625,25.50zM 232.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 80.00,224.00q0.00,16.50 -11.75,28.25t-28.25,11.75t-28.25-11.75t-11.75-28.25 t 11.75-28.25t 28.25-11.75t 28.25,11.75t 11.75,28.25zM 340.00,336.00q0.00,11.50 -8.25,19.75t-19.75,8.25t-19.75-8.25t-8.25-19.75t 8.25-19.75t 19.75-8.25t 19.75,8.25t 8.25,19.75zM 132.00,112.00q0.00,18.25 -12.875,31.125t-31.125,12.875t-31.125-12.875t-12.875-31.125t 12.875-31.125t 31.125-12.875t 31.125,12.875t 12.875,31.125zM 248.00,64.00q0.00,20.00 -14.00,34.00t-34.00,14.00 t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 384.00,224.00q0.00,10.00 -7.00,17.00t-17.00,7.00t-17.00-7.00t-7.00-17.00t 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00zM 332.00,112.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"quote-right, rdquo\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,80.00l0.00,176.00 q0.00,26.00 -10.125,49.625t-27.375,40.875t-40.875,27.375t-49.625,10.125l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 16.00,0.00 q 26.50,0.00 45.25-18.75t 18.75-45.25l0.00-8.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-56.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-96.00 q0.00-20.00 14.00-34.00t 34.00-14.00l 96.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00zM 416.00,80.00 l0.00,176.00 q0.00,26.00 -10.125,49.625t-27.375,40.875t-40.875,27.375t-49.625,10.125l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 16.00,0.00 q 26.50,0.00 45.25-18.75t 18.75-45.25l0.00-8.00 q0.00-10.00 -7.00-17.00t-17.00-7.00l-56.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-96.00 q0.00-20.00 14.00-34.00t 34.00-14.00l 96.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"quote-left, ldquo\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,240.00l0.00,96.00 q0.00,20.00 -14.00,34.00t-34.00,14.00l-96.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-176.00 q0.00-26.00 10.125-49.625t 27.375-40.875t 40.875-27.375t 49.625-10.125l 16.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-16.00,0.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,8.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 56.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z M 416.00,240.00l0.00,96.00 q0.00,20.00 -14.00,34.00t-34.00,14.00l-96.00,0.00 q-20.00,0.00 -34.00-14.00t-14.00-34.00l0.00-176.00 q0.00-26.00 10.125-49.625t 27.375-40.875t 40.875-27.375t 49.625-10.125l 16.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-16.00,0.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,8.00 q0.00,10.00 7.00,17.00t 17.00,7.00l 56.00,0.00 q 20.00,0.00 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-blank\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"mobile, phone\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 116.00,352.00q0.00-8.25 -5.875-14.125t-14.125-5.875t-14.125,5.875t-5.875,14.125t 5.875,14.125t 14.125,5.875t 14.125-5.875t 5.875-14.125zM 168.00,312.00l0.00-176.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-128.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,176.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 128.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 120.00,100.00 q0.00-4.00 -4.00-4.00l-40.00,0.00 q-4.00,0.00 -4.00,4.00t 4.00,4.00l 40.00,0.00 q 4.00,0.00 4.00-4.00zM 192.00,96.00l0.00,256.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-256.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"tablet, mobile\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 256.00,312.00l0.00-240.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-208.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,240.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 208.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 288.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-208.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 208.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"laptop, computer, notebook\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 104.00,320.00q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-176.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 272.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,176.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-272.00,0.00 zM 96.00,104.00l0.00,176.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 272.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-176.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-272.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625z M 440.00,336.00l 40.00,0.00 l0.00,24.00 q0.00,10.00 -11.75,17.00t-28.25,7.00l-400.00,0.00 q-16.50,0.00 -28.25-7.00t-11.75-17.00l0.00-24.00 l 40.00,0.00 l 400.00,0.00 zM 260.00,360.00q 4.00,0.00 4.00-4.00t-4.00-4.00l-40.00,0.00 q-4.00,0.00 -4.00,4.00t 4.00,4.00l 40.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"desktop, computer, screen, display, pc\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 448.00,248.00l0.00-208.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,208.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 480.00,40.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-136.00,0.00 q0.00,9.25 4.00,19.375t 8.00,17.75t 4.00,10.875q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75 t-4.75-11.25q0.00-3.50 4.00-11.00t 8.00-17.50t 4.00-19.50l-136.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"angle-down, arrow, down\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,184.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"angle-up, arrow, up\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,296.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"angle-right, arrow, right\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 148.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"angle-left, arrow, left\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 156.75,136.00q0.00,3.25 -2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75t-2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"double-angle-down, down, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,216.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75zM 268.75,120.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75 t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 98.25,98.25l 98.25-98.25q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"double-angle-up, up, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 268.75,328.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75zM 268.75,232.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-98.25-98.25l-98.25,98.25 q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"double-angle-right, right, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 148.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75zM 244.75,240.00q0.00,3.25 -2.50,5.75l-116.50,116.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-12.50-12.50q-2.50-2.50 -2.50-5.75t 2.50-5.75 l 98.25-98.25l-98.25-98.25q-2.50-2.50 -2.50-5.75t 2.50-5.75l 12.50-12.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 116.50,116.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"double-angle-left, left, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 156.75,344.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75t-2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75zM 252.75,344.00q0.00,3.25 -2.50,5.75l-12.50,12.50q-2.50,2.50 -5.75,2.50t-5.75-2.50l-116.50-116.50q-2.50-2.50 -2.50-5.75 t 2.50-5.75l 116.50-116.50q 2.50-2.50 5.75-2.50t 5.75,2.50l 12.50,12.50q 2.50,2.50 2.50,5.75t-2.50,5.75l-98.25,98.25l 98.25,98.25q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"plus-sign, add, sum\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-80.00,0.00 l0.00-80.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,80.00 l-80.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 80.00,0.00 l0.00,80.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-80.00 l 80.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"h-sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,336.00l0.00-224.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,80.00 l-128.00,0.00 l0.00-80.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,224.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-80.00 l 128.00,0.00 l0.00,80.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"beer, mug, drink\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,224.00l0.00-96.00 l-64.00,0.00 l0.00,40.00 q0.00,11.25 0.50,19.00t 1.875,14.125t 3.625,10.00t 5.75,6.625t 8.375,3.875t 11.25,1.875t 14.50,0.625t 18.125-0.125zM 416.00,336.00l0.00,48.00 l-288.00,0.00 l0.00-48.00 l 32.00-48.00l-24.25,0.00 q-52.75,0.00 -78.25-25.625t-25.50-78.625l0.00-71.75 l-16.00-16.00l 8.00-32.00l 120.00,0.00 l 8.00-32.00l 240.00,0.00 l 8.00,48.00l-16.00,8.00l0.00,200.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"fighter-jet, pane, aircraft\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 408.00,184.00q 65.25,14.50 71.75,23.25l 0.25,0.75q-0.25,8.00 -72.00,24.00l-88.00,8.00l-56.00,16.00l-16.00,0.00 l-73.25,88.00l 17.25,0.00 q 6.50,0.00 11.25,1.125t 4.75,2.875t-4.75,2.875t-11.25,1.125l-24.00,0.00 l-40.00,0.00 l-16.00,0.00 l0.00-8.00 l 16.00,0.00 l0.00-104.00 l-40.00,0.00 l-48.00,56.00l-24.00,0.00 l-8.00-8.00l0.00-48.00 l 8.00,0.00 l0.00-8.00 l 32.00,0.00 l0.00-2.00 l-48.00-6.00l0.00-32.00 l 48.00-6.00l0.00-2.00 l-32.00,0.00 l0.00-8.00 l-8.00,0.00 l0.00-48.00 l 8.00-8.00l 24.00,0.00 l 48.00,56.00l 40.00,0.00 l0.00-104.00 l-16.00,0.00 l0.00-8.00 l 16.00,0.00 l 40.00,0.00 l 24.00,0.00 q 6.50,0.00 11.25,1.125t 4.75,2.875t-4.75,2.875t-11.25,1.125l-17.25,0.00 l 73.25,88.00l 16.00,0.00 l 56.00,16.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"medkit, medicine, kit\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 320.00,280.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-56.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,56.00 l-56.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,56.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75l0.00-56.00 l 56.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 64.00,96.00l0.00,320.00 l-8.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-208.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 8.00,0.00 zM 360.00,96.00l0.00,320.00 l-272.00,0.00 l0.00-320.00 l 40.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 40.00,0.00 zM 448.00,152.00l0.00,208.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-8.00,0.00 l0.00-320.00 l 8.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"ambulance\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 64.00,224.00l 96.00,0.00 l0.00-64.00 l-39.50,0.00 q-3.50,0.50 -5.50,2.25l-48.75,48.75q-1.75,3.00 -2.25,5.50l0.00,7.50 zM 384.00,352.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375 t 22.625-9.375t 9.375-22.625zM 416.00,184.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-56.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,56.00 l-56.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,56.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75l0.00-56.00 l 56.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 480.00,48.00l0.00,288.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-48.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-96.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l0.00-104.00 q0.00-6.50 3.25-14.50t 8.00-12.75l 49.50-49.50q 4.75-4.75 12.75-8.00t 14.50-3.25l 40.00,0.00 l0.00-80.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"hospital, building\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,416.00l 96.00,0.00 l0.00-288.00 l-64.00,0.00 l0.00,8.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-112.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-8.00 l-64.00,0.00 l0.00,288.00 l 96.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 zM 224.00,120.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,24.00 l-32.00,0.00 l0.00-24.00 q0.00-3.25 -2.375-5.625 t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-24.00 l 32.00,0.00 l0.00,24.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 352.00,112.00l0.00,320.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-320.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 80.00,0.00 l0.00-72.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 112.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,72.00 l 80.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"building, office, work\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,328.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,264.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 288.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 224.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 160.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,136.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,72.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 224.00,416.00l 96.00,0.00 l0.00-384.00 l-288.00,0.00 l0.00,384.00 l 96.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 zM 352.00,16.00l0.00,416.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-416.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"file-alt, paper, document\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 256.00,296.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,232.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 32.00,384.00l 256.00,0.00 l0.00-192.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-128.00,0.00 l0.00,320.00 z M 192.00,160.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 320.00,192.00l0.00,200.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 136.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"food, lunch, fork, knife, dinner\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 160.00,16.00l0.00,160.00 q0.00,15.25 -8.875,27.75t-23.125,17.50l0.00,194.75 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-194.75 q-14.25-5.00 -23.125-17.50t-8.875-27.75l0.00-160.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,104.00 q0.00,6.50 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25l0.00-104.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,104.00 q0.00,6.50 4.75,11.25 t 11.25,4.75t 11.25-4.75t 4.75-11.25l0.00-104.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25zM 352.00,16.00l0.00,400.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-128.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-200.00 q0.00-33.00 23.50-56.50t 56.50-23.50l 64.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"coffee, break, drink, cup, tea\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 416.00,160.00q0.00-20.00 -14.00-34.00t-34.00-14.00l-16.00,0.00 l0.00,96.00 l 16.00,0.00 q 20.00,0.00 34.00-14.00t 14.00-34.00zM0.00,352.00l 448.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l-320.00,0.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25zM 464.00,160.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-16.00,0.00 l0.00,8.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-176.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-184.00 q0.00-6.50 4.75-11.25 t 11.25-4.75l 288.00,0.00 q 39.75,0.00 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"bell-alt, alarm, notification\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 212.00,424.00q0.00-4.00 -4.00-4.00q-14.75,0.00 -25.375-10.625t-10.625-25.375q0.00-4.00 -4.00-4.00t-4.00,4.00q0.00,18.25 12.875,31.125t 31.125,12.875q 4.00,0.00 4.00-4.00zM 416.00,352.00q0.00,13.00 -9.50,22.50t-22.50,9.50l-112.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-112.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50q 47.50-40.25 71.75-99.375t 24.25-124.625 q0.00-41.25 24.00-65.50t 66.00-29.25q-2.00-4.50 -2.00-9.25q0.00-10.00 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00q0.00,4.75 -2.00,9.25q 42.00,5.00 66.00,29.25t 24.00,65.50q0.00,65.50 24.25,124.625t 71.75,99.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"suitcase, briefcase, travel, vacation\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 72.00,96.00l0.00,320.00 l-16.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-208.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 16.00,0.00 zM 352.00,96.00l0.00,320.00 l-256.00,0.00 l0.00-320.00 l 32.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 32.00,0.00 zM 448.00,152.00l0.00,208.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-16.00,0.00 l0.00-320.00 l 16.00,0.00 q 23.00,0.00 39.50,16.50 t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"stethoscope\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 320.00,176.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,176.00q0.00,15.50 -8.875,27.75t-23.125,17.50l0.00,98.75 q0.00,39.75 -32.875,67.875t-79.125,28.125t-79.125-28.125t-32.875-67.875l0.00-33.00 q-41.00-5.00 -68.50-32.00t-27.50-63.00l0.00-128.00 q0.00-6.50 4.75-11.25t 11.25-4.75q 1.50,0.00 4.00,0.50q 4.25-7.50 11.75-12.00 t 16.25-4.50q 13.25,0.00 22.625,9.375t 9.375,22.625t-9.375,22.625t-22.625,9.375q-8.25,0.00 -16.00-4.50l0.00,100.50 q0.00,26.50 23.50,45.25t 56.50,18.75t 56.50-18.75t 23.50-45.25l0.00-100.50 q-7.75,4.50 -16.00,4.50q-13.25,0.00 -22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375q 8.75,0.00 16.25,4.50t 11.75,12.00q 2.50-0.50 4.00-0.50q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,128.00 q0.00,36.00 -27.50,63.00 t-68.50,32.00l0.00,33.00 q0.00,26.50 23.50,45.25t 56.50,18.75t 56.50-18.75t 23.50-45.25l0.00-98.75 q-14.25-5.25 -23.125-17.50t-8.875-27.75q0.00-20.00 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"user-md, medic, doctor\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,336.00q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25zM 352.00,351.25q0.00,30.25 -18.25,47.50t-48.50,17.25l-218.50,0.00 q-30.25,0.00 -48.50-17.25t-18.25-47.50q0.00-17.00 1.375-32.75t 6.00-34.50t 11.875-33.125t 20.25-25.75t 30.00-15.125q-5.50,13.00 -5.50,30.00l0.00,50.75 q-14.50,5.00 -23.25,17.50t-8.75,27.75q0.00,20.00 14.00,34.00t 34.00,14.00 t 34.00-14.00t 14.00-34.00q0.00-15.25 -8.875-27.75t-23.125-17.50l0.00-50.75 q0.00-15.50 6.25-23.25q 33.00,26.00 73.75,26.00t 73.75-26.00q 6.25,7.75 6.25,23.25l0.00,16.00 q-26.50,0.00 -45.25,18.75t-18.75,45.25l0.00,22.25 q-8.00,7.25 -8.00,17.75q0.00,10.00 7.00,17.00t 17.00,7.00t 17.00-7.00t 7.00-17.00q0.00-10.50 -8.00-17.75l0.00-22.25 q0.00-13.00 9.50-22.50t 22.50-9.50t 22.50,9.50t 9.50,22.50l0.00,22.25 q-8.00,7.25 -8.00,17.75q0.00,10.00 7.00,17.00 t 17.00,7.00t 17.00-7.00t 7.00-17.00q0.00-10.50 -8.00-17.75l0.00-22.25 q0.00-17.00 -8.625-31.875t-23.375-23.375q0.00-2.50 0.125-10.625t0.00-12.00t-0.625-10.375t-1.75-11.75t-3.25-10.00q 17.00,3.75 30.00,15.125t 20.25,25.75t 11.875,33.125t 6.00,34.50t 1.375,32.75zM 272.00,128.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125 t 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud-upload, upload, load, open\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,216.00q0.00-3.50 -2.25-5.75l-88.00-88.00q-2.25-2.25 -5.75-2.25t-5.75,2.25l-87.75,87.75q-2.50,3.00 -2.50,6.00q0.00,3.50 2.25,5.75t 5.75,2.25l 56.00,0.00 l0.00,88.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-88.00 l 56.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-32.50 17.50-60.00t 47.00-41.25q-0.50-7.50 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.00,0.00 71.375,21.75t 47.125,57.75q 17.75-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,19.00 -10.25,34.50q 32.50,7.75 53.375,33.875t 20.875,59.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud-download, download, store, save\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,232.00q0.00-3.50 -2.25-5.75t-5.75-2.25l-56.00,0.00 l0.00-88.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,88.00 l-56.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,3.50 2.25,5.75l 88.00,88.00q 2.25,2.25 5.75,2.25t 5.75-2.25l 87.75-87.75q 2.50-3.00 2.50-6.00zM 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-32.50 17.50-60.00t 47.00-41.25q-0.50-7.50 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.00,0.00 71.375,21.75t 47.125,57.75q 17.75-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,19.00 -10.25,34.50q 32.50,7.75 53.375,33.875t 20.875,59.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"exchange, transfer, tab, traffic\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,296.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-344.00,0.00 l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375q-3.00,0.00 -6.00-2.50l-79.75-80.00q-2.25-2.25 -2.25-5.50q0.00-3.50 2.25-5.75l 80.00-80.00q 2.25-2.25 5.75-2.25q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,48.00 l 344.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,160.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 l-344.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 344.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"lightbulb, idea, tip\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 184.00,144.00q0.00,3.25 -2.375,5.625t-5.625,2.375t-5.625-2.375t-2.375-5.625q0.00-11.50 -13.50-17.75t-26.50-6.25q-3.25,0.00 -5.625-2.375t-2.375-5.625t 2.375-5.625t 5.625-2.375q 12.50,0.00 24.875,4.00t 21.75,13.50t 9.375,22.50zM 224.00,144.00q0.00-18.00 -8.625-33.50t-22.50-25.375t-30.75-15.50t-34.125-5.625t-34.125,5.625t-30.75,15.50t-22.50,25.375t-8.625,33.50 q0.00,25.25 17.00,45.00q 2.50,2.75 7.625,8.25t 7.625,8.25q 32.00,38.25 35.25,74.50l 57.00,0.00 q 3.25-36.25 35.25-74.50q 2.50-2.75 7.625-8.25t 7.625-8.25q 17.00-19.75 17.00-45.00zM 256.00,144.00q0.00,38.75 -25.75,67.00q-11.25,12.25 -18.625,21.75t-14.875,23.875t-8.50,26.875q 11.75,7.00 11.75,20.50q0.00,9.25 -6.25,16.00q 6.25,6.75 6.25,16.00q0.00,13.00 -11.25,20.25q 3.25,5.75 3.25,11.75 q0.00,11.50 -7.875,17.75t-19.375,6.25q-5.00,11.00 -15.00,17.50t-21.75,6.50t-21.75-6.50t-15.00-17.50q-11.50,0.00 -19.375-6.25t-7.875-17.75q0.00-6.00 3.25-11.75q-11.25-7.25 -11.25-20.25q0.00-9.25 6.25-16.00q-6.25-6.75 -6.25-16.00q0.00-13.50 11.75-20.50q-1.00-12.50 -8.50-26.875t-14.875-23.875t-18.625-21.75q-25.75-28.25 -25.75-67.00q0.00-24.75 11.125-46.125t 29.25-35.50t 41.00-22.25t 46.625-8.125 t 46.625,8.125t 41.00,22.25t 29.25,35.50t 11.125,46.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"paste, clipboard\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 192.00,416.00l 224.00,0.00 l0.00-160.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-96.00,0.00 l0.00,288.00 zM 256.00,56.00l0.00-16.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-176.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,16.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 176.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 320.00,224.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 448.00,256.00l0.00,168.00 q0.00,10.00 -7.00,17.00t-17.00,7.00 l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-40.00 l-136.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 272.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,82.00 q 5.25,3.25 9.00,7.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"umbrella, rainy\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 224.00,207.00l0.00,145.00 q0.00,26.00 -19.00,45.00t-45.00,19.00t-45.00-19.00t-19.00-45.00q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25q0.00,12.50 9.75,22.25t 22.25,9.75t 22.25-9.75t 9.75-22.25l0.00-145.00 q 8.25-2.75 16.00-2.75t 16.00,2.75zM 416.00,213.75q0.00,3.25 -2.375,5.625t-5.625,2.375q-2.75,0.00 -5.75-2.50q-12.25-11.50 -23.25-17.25t-25.50-5.75q-17.00,0.00 -32.00,9.25t-25.75,24.25 q-1.75,2.50 -4.375,7.00t-3.625,6.00q-2.75,4.25 -7.00,4.25q-4.50,0.00 -7.25-4.25q-1.00-1.50 -3.625-6.00t-4.375-7.00q-10.75-15.00 -25.625-24.25t-31.875-9.25t-31.875,9.25t-25.625,24.25q-1.75,2.50 -4.375,7.00t-3.625,6.00q-2.75,4.25 -7.25,4.25q-4.25,0.00 -7.00-4.25q-1.00-1.50 -3.625-6.00t-4.375-7.00q-10.75-15.00 -25.75-24.25t-32.00-9.25q-14.50,0.00 -25.50,5.75t-23.25,17.25 q-3.00,2.50 -5.75,2.50q-3.25,0.00 -5.625-2.375t-2.375-5.625q0.00-1.25 0.25-1.75q 11.25-45.75 43.125-79.875t 74.50-51.125t 90.125-17.00q 35.00,0.00 68.625,10.00t 61.625,28.375t 48.625,46.75t 28.875,62.875q 0.25,0.50 0.25,1.75zM 224.00,32.00l0.00,24.50 q-10.50-0.50 -16.00-0.50t-16.00,0.50l0.00-24.50 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"sitemap, tree\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,312.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 l-128.00,0.00 l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 l-128.00,0.00 l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 24.00,0.00 l0.00-48.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 l0.00-48.00 l-24.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-80.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,80.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-24.00,0.00 l0.00,48.00 l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"224\" height=\"448\" viewBox=\"0 0 224 448\" data-du=\"\" data-tags=\"bolt, lightning, power, electricity, energy\" style=\"margin-left: 12px; margin-top: 8px;\"><path d=\"M 221.25,141.50q 4.50,5.00 1.75,11.00l-135.00,289.25q-3.25,6.25 -10.50,6.25q-1.00,0.00 -3.50-0.50q-4.25-1.25 -6.375-4.75t-1.125-7.50l 49.25-202.00l-101.50,25.25q-1.00,0.25 -3.00,0.25q-4.50,0.00 -7.75-2.75q-4.50-3.75 -3.25-9.75l 50.25-206.25q 1.00-3.50 4.00-5.75t 7.00-2.25l 82.00,0.00 q 4.75,0.00 8.00,3.125t 3.25,7.375q0.00,2.00 -1.25,4.50l-42.75,115.75l 99.00-24.50q 2.00-0.50 3.00-0.50q 4.75,0.00 8.50,3.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comments-alt, chat, talk, bubbles\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 176.00,96.00q-38.25,0.00 -71.50,13.00t-52.875,35.25t-19.625,47.75q0.00,20.50 13.25,39.50t 37.25,33.00l 24.25,14.00l-8.75,21.00q 8.50-5.00 15.50-9.75l 11.00-7.75l 13.25,2.50q 19.50,3.50 38.25,3.50q 38.25,0.00 71.50-13.00t 52.875-35.25t 19.625-47.75t-19.625-47.75t-52.875-35.25t-71.50-13.00zM 176.00,64.00q 47.75,0.00 88.375,17.125t 64.125,46.625t 23.50,64.25t-23.50,64.25 t-64.125,46.625t-88.375,17.125q-21.50,0.00 -44.00-4.00q-31.00,22.00 -69.50,32.00q-9.00,2.25 -21.50,4.00l-0.75,0.00 q-2.75,0.00 -5.125-2.00t-2.875-5.25q-0.25-0.75 -0.25-1.625t 0.125-1.625t 0.50-1.50l 0.625-1.25t 0.875-1.375t 1.00-1.25t 1.125-1.25t 1.00-1.125q 1.25-1.50 5.75-6.25t 6.50-7.375t 5.625-7.25t 6.25-9.625t 5.125-11.00q-31.00-18.00 -48.75-44.25t-17.75-56.00q0.00-34.75 23.50-64.25t 64.125-46.625 t 88.375-17.125zM 381.50,356.25q 2.50,6.00 5.125,11.00t 6.25,9.625t 5.625,7.25t 6.50,7.375t 5.75,6.25q 0.25,0.25 1.00,1.125t 1.125,1.25t 1.00,1.25t 0.875,1.375l 0.625,1.25t 0.50,1.50t 0.125,1.625t-0.25,1.625q-0.75,3.50 -3.25,5.50t-5.50,1.75q-12.50-1.75 -21.50-4.00q-38.50-10.00 -69.50-32.00q-22.50,4.00 -44.00,4.00q-67.75,0.00 -118.00-33.00q 14.50,1.00 22.00,1.00q 40.25,0.00 77.25-11.25t 66.00-32.25 q 31.25-23.00 48.00-53.00t 16.75-63.50q0.00-19.25 -5.75-38.00q 32.25,17.75 51.00,44.50t 18.75,57.50q0.00,30.00 -17.75,56.125t-48.75,44.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comment-alt, chat, talk, bubble\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 224.00,96.00q-51.00,0.00 -95.375,17.375t-70.50,46.875t-26.125,63.75q0.00,28.00 17.875,53.375t 50.375,43.875l 21.75,12.50l-6.75,24.00q-6.00,22.75 -17.50,43.00q 38.00-15.75 68.75-42.75l 10.75-9.50l 14.25,1.50q 17.25,2.00 32.50,2.00q 51.00,0.00 95.375-17.375t 70.50-46.875t 26.125-63.75t-26.125-63.75t-70.50-46.875t-95.375-17.375zM 448.00,224.00 q0.00,43.50 -30.00,80.375t-81.50,58.25t-112.50,21.375q-17.50,0.00 -36.25-2.00q-49.50,43.75 -115.00,60.50q-12.25,3.50 -28.50,5.50l-1.25,0.00 q-3.75,0.00 -6.75-2.625t-4.00-6.875l0.00-0.25 q-0.75-1.00 -0.125-3.00t 0.50-2.50t 1.125-2.375l 1.50-2.25t 1.75-2.125t 2.00-2.25q 1.75-2.00 7.75-8.625t 8.625-9.50t 7.75-9.875t 8.125-12.75t 6.75-14.75t 6.50-19.00q-39.25-22.25 -61.875-55.00t-22.625-70.25q0.00-43.50 30.00-80.375 t 81.50-58.25t 112.50-21.375t 112.50,21.375t 81.50,58.25t 30.00,80.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"dashboard, meter, speed\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,288.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 144.00,176.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 251.00,296.25l 25.25-95.50q 1.50-6.50 -1.875-12.125t-9.625-7.375 t-12.00,1.625t-7.50,9.875l-25.25,95.50q-15.00,1.25 -26.75,10.875t-15.75,24.625q-5.00,19.25 5.00,36.50t 29.25,22.25t 36.50-5.00t 22.25-29.25q 4.00-15.00 -1.50-29.25t-18.00-22.75zM 416.00,288.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 256.00,128.00q0.00-13.25 -9.375-22.625 t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 368.00,176.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 448.00,288.00q0.00,65.25 -35.25,120.75q-4.75,7.25 -13.50,7.25l-350.50,0.00 q-8.75,0.00 -13.50-7.25 q-35.25-55.25 -35.25-120.75q0.00-45.50 17.75-87.00t 47.75-71.50t 71.50-47.75t 87.00-17.75t 87.00,17.75t 71.50,47.75t 47.75,71.50t 17.75,87.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"legal, hammer, rules\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 442.75,384.00q0.00,13.25 -9.25,22.50l-26.75,27.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-90.75-91.00q-9.50-9.00 -9.50-22.50q0.00-13.25 10.75-24.00l-64.00-64.00l-31.50,31.50q-3.50,3.50 -8.50,3.50t-8.50-3.50q 0.50,0.50 3.125,3.00t 3.125,3.25t 2.50,2.875t 2.50,3.375t 1.50,3.375t 1.375,4.125t 0.375,4.50q0.00,9.50 -7.00,17.00q-0.75,0.75 -4.125,4.50t-4.75,5.125 t-4.625,4.125t-5.50,3.875t-5.50,2.25t-6.50,1.125q-10.00,0.00 -17.00-7.00l-102.00-102.00q-7.00-7.00 -7.00-17.00q0.00-3.25 1.125-6.50t 2.25-5.50t 3.875-5.50t 4.125-4.625t 5.125-4.75t 4.50-4.125q 7.50-7.00 17.00-7.00q 2.50,0.00 4.50,0.375t 4.125,1.375t 3.375,1.50t 3.375,2.50t 2.875,2.50t 3.25,3.125t 3.00,3.125q-3.50-3.50 -3.50-8.50t 3.50-8.50l 87.00-87.00q 3.50-3.50 8.50-3.50t 8.50,3.50 q-0.50-0.50 -3.125-3.00t-3.125-3.25t-2.50-2.875t-2.50-3.375t-1.50-3.375t-1.375-4.125t-0.375-4.50q0.00-9.50 7.00-17.00q 0.75-0.75 4.125-4.50t 4.75-5.125t 4.625-4.125t 5.50-3.875t 5.50-2.25t 6.50-1.125q 10.00,0.00 17.00,7.00l 102.00,102.00q 7.00,7.00 7.00,17.00q0.00,3.25 -1.125,6.50t-2.25,5.50t-3.875,5.50t-4.125,4.625t-5.125,4.75t-4.50,4.125q-7.50,7.00 -17.00,7.00 q-2.50,0.00 -4.50-0.375t-4.125-1.375t-3.375-1.50t-3.375-2.50t-2.875-2.50t-3.25-3.125t-3.00-3.125q 3.50,3.50 3.50,8.50t-3.50,8.50l-31.50,31.50l 64.00,64.00q 10.75-10.75 24.00-10.75q 13.00,0.00 22.75,9.25l 90.75,90.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"undo, arrow, loop\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,39.00 -15.25,74.50t-41.00,61.25t-61.25,41.00t-74.50,15.25q-44.75,0.00 -84.125-19.00t-66.50-53.25t-36.875-78.00q-0.75-3.50 1.75-6.75q 2.25-3.00 6.25-3.00l 49.75,0.00 q 5.75,0.00 7.50,5.75q 12.50,40.50 46.25,65.375t 76.00,24.875q 26.00,0.00 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625t-10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125q-24.50,0.00 -47.00,8.875t-40.00,25.375l 34.25,34.50q 7.75,7.50 3.50,17.25q-4.25,10.00 -14.75,10.00l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-10.50 10.00-14.75q 9.75-4.25 17.25,3.50l 32.50,32.25q 26.75-25.25 61.125-39.125t 71.125-13.875q 39.00,0.00 74.50,15.25t 61.25,41.00t 41.00,61.25t 15.25,74.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"344\" height=\"448\" viewBox=\"0 0 344 448\" data-du=\"\" data-tags=\"linkedin, social\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 253.50,143.75q 42.75,0.00 67.00,21.375t 24.25,63.625l0.00,146.50 q0.00,3.50 -2.625,6.125t-6.125,2.625l-63.00,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-132.25 q0.00-17.75 -6.625-26.00t-23.875-8.25q-22.00,0.00 -30.875,12.875t-8.875,35.875l0.00,117.75 q0.00,3.50 -2.625,6.125t-6.375,2.625l-61.50,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-217.00 q0.00-3.50 2.625-6.125 t 6.125-2.625l 59.75,0.00 q 3.25,0.00 5.25,1.25t 2.625,4.625t 0.75,4.50t 0.125,5.625q 23.25-21.75 61.50-21.75zM 72.50,149.50q 3.50,0.00 6.125,2.625t 2.625,6.125l0.00,217.00 q0.00,3.50 -2.625,6.125t-6.125,2.625l-61.50,0.00 q-3.50,0.00 -6.125-2.625t-2.625-6.125l0.00-217.00 q0.00-3.50 2.625-6.125t 6.125-2.625l 61.50,0.00 zM 41.75,41.25q 17.25,0.00 29.50,12.25t 12.25,29.50t-12.25,29.50t-29.50,12.25 t-29.50-12.25t-12.25-29.50t 12.25-29.50t 29.50-12.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"envelope-alt, letter, email, mail, contact\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,177.50l0.00,198.50 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-198.50 q 11.00,12.25 25.25,21.75q 90.50,61.50 124.25,86.25q 14.25,10.50 23.125,16.375t 23.625,12.00t 27.50,6.125l 0.25,0.00 l 0.25,0.00 q 12.75,0.00 27.50-6.125t 23.625-12.00t 23.125-16.375q 42.50-30.75 124.50-86.25q 14.25-9.75 25.00-21.75zM 448.00,104.00q0.00,19.75 -12.25,37.75t-30.50,30.75 q-94.00,65.25 -117.00,81.25q-2.50,1.75 -10.625,7.625t-13.50,9.50t-13.00,8.125t-14.375,6.75t-12.50,2.25l-0.25,0.00 l-0.25,0.00 q-5.75,0.00 -12.50-2.25t-14.375-6.75t-13.00-8.125t-13.50-9.50t-10.625-7.625q-22.75-16.00 -65.50-45.625t-51.25-35.625q-15.50-10.50 -29.25-28.875t-13.75-34.125q0.00-19.50 10.375-32.50t 29.625-13.00l 368.00,0.00 q 16.25,0.00 28.125,11.75t 11.875,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort-up\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort-down\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,272.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"sort, menu, dropdown, arrows\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,272.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 256.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"columns, layout\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 40.00,384.00l 152.00,0.00 l0.00-288.00 l-160.00,0.00 l0.00,280.00 q0.00,3.25 2.375,5.625t 5.625,2.375zM 384.00,376.00l0.00-280.00 l-160.00,0.00 l0.00,288.00 l 152.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-336.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 336.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"caret-right, right, arrow, next\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 144.00,224.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-224.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"160\" height=\"448\" viewBox=\"0 0 160 448\" data-du=\"\" data-tags=\"caret-left, previous, arrow, left\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 160.00,112.00l0.00,224.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"caret-up, upload, top, arrow\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,304.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"caret-down, download, bottom, arrow\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 256.00,176.00q0.00,6.50 -4.75,11.25l-112.00,112.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"money, bill\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 192.00,288.00l 96.00,0.00 l0.00-24.00 l-32.00,0.00 l0.00-112.00 l-28.50,0.00 l-37.00,34.25l 19.25,20.00q 10.50-9.25 13.75-14.25l 0.50,0.00 l0.00,72.00 l-32.00,0.00 l0.00,24.00 zM 320.00,224.00q0.00,17.50 -5.25,35.50t-14.875,33.50t-25.375,25.25t-34.50,9.75t-34.50-9.75t-25.375-25.25t-14.875-33.50t-5.25-35.50t 5.25-35.50t 14.875-33.50t 25.375-25.25t 34.50-9.75t 34.50,9.75t 25.375,25.25t 14.875,33.50t 5.25,35.50zM 448.00,288.00 l0.00-128.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25l-288.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l0.00,128.00 q 26.50,0.00 45.25,18.75t 18.75,45.25l 288.00,0.00 q0.00-26.50 18.75-45.25t 45.25-18.75zM 480.00,80.00l0.00,288.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-448.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-288.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 448.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"google-plus, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 219.00,366.25q0.00-5.25 -1.125-10.125t-2.375-9.00t-4.375-8.625t-5.25-7.625t-6.625-7.375t-6.875-6.375t-8.00-6.375t-7.75-5.75t-8.25-5.75t-7.625-5.25q-4.25-0.50 -12.50-0.50q-13.50,0.00 -26.50,1.75t-27.00,6.25t-24.50,11.50t-17.25,18.75t-6.75,26.75q0.00,17.00 8.875,30.375t 23.25,21.00t 30.125,11.375t 31.75,3.75q 14.75,0.00 28.125-3.125t 25.125-9.75t 18.625-18.375 t 6.875-27.50zM 189.00,150.75q0.00-15.00 -4.125-31.875t-11.75-32.625t-21.00-26.00t-29.875-10.25q-23.25,0.00 -36.00,17.25t-12.75,41.25q0.00,11.75 2.875,24.75t 8.875,26.00t 14.00,23.375t 19.50,16.875t 24.25,6.50q 24.25,0.00 35.125-15.125t 10.875-40.125zM 156.25,32.00l 109.25,0.00 l-33.75,19.75l-33.75,0.00 q 17.75,11.25 27.50,31.50t 9.75,42.25q0.00,18.50 -5.75,32.875t-14.00,23.125t-16.50,16.125 t-14.00,15.25t-5.75,16.875q0.00,6.50 4.125,12.75t 10.75,12.00t 14.625,12.00t 16.00,13.875t 14.625,16.50t 10.75,21.25t 4.125,26.625q0.00,40.00 -35.00,70.50q-38.00,32.75 -105.00,32.75q-14.75,0.00 -29.875-2.50t-30.50-8.375t-27.125-14.50t-19.25-22.25t-7.50-30.375q0.00-15.25 9.25-33.75q 8.00-16.00 24.00-27.625t 36.25-17.75t 38.75-9.00t 37.50-3.375q-16.00-20.75 -16.00-37.25q0.00-3.00 0.50-5.875 t 1.25-4.875t 2.00-5.375t 1.75-5.375q-10.00,1.25 -17.50,1.25q-37.25,0.00 -63.875-24.50t-26.625-61.50q0.00-35.00 23.75-62.625t 58.50-35.375q 23.50-5.00 46.75-5.00zM 416.00,96.00l0.00,32.00 l-64.00,0.00 l0.00,64.00 l-32.00,0.00 l0.00-64.00 l-64.00,0.00 l0.00-32.00 l 64.00,0.00 l0.00-64.00 l 32.00,0.00 l0.00,64.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"google-plus-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 169.50,398.25q0.00,9.50 -2.50,17.75l-95.00,0.00 q-23.75,0.00 -42.875-14.125t-25.875-36.875q 6.00-11.25 17.25-19.375t 25.00-12.375t 26.75-6.00t 26.75-1.75q 8.00,0.00 12.25,0.50q 1.50,1.00 7.625,5.25t 8.25,5.75t 7.75,5.75t 8.00,6.375t 6.875,6.375t 6.625,7.375t 5.25,7.625t 4.375,8.625t 2.375,9.00t 1.125,10.125zM 96.25,310.50q-58.50,1.75 -96.25,21.25l0.00-108.25 q 25.75,29.50 68.25,29.50 q 8.00,0.00 17.50-1.25q-5.25,15.25 -5.25,21.50q0.00,16.75 15.75,37.25zM 139.50,182.75q0.00,25.00 -10.875,40.125t-35.125,15.125q-12.75,0.00 -24.25-6.50t-19.50-16.875t-14.00-23.375t-8.875-26.00t-2.875-24.75q0.00-24.00 12.875-41.25t 36.125-17.25q 16.50,0.00 29.75,10.25t 21.00,26.00t 11.75,32.50t 4.00,32.00zM 384.00,160.00l0.00,184.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-117.00,0.00 q 9.75-18.25 9.75-39.25q0.00-16.50 -5.50-30.625t-13.875-23.25t-18.00-17.75t-18.00-14.875t-13.875-13.625t-5.50-14.875q0.00-9.00 5.75-17.00t 14.00-15.375t 16.375-16.125t 13.875-23.25t 5.75-32.75t-6.625-36.375t-18.875-29.625q-1.50-1.50 -3.50-2.75t-3.125-1.875t-2.50-2.375t-2.625-4.25l 33.75,0.00 l 33.75-16.00l-109.25,0.00 q-34.50,0.00 -61.125,9.625t-45.625,33.375q0.00-31.50 20.25-53.25t 51.75-21.75l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,24.00 l-64.00,0.00 l0.00-64.00 l-32.00,0.00 l0.00,64.00 l-64.00,0.00 l0.00,32.00 l 64.00,0.00 l0.00,64.00 l 32.00,0.00 l0.00-64.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pinterest-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 312.00,32.00q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-181.25,0.00 q 21.25-30.50 27.00-52.50q 2.25-8.50 13.25-52.25q 5.25,9.75 18.375,16.75t 28.125,7.00q 45.25,0.00 73.875-36.875t 28.625-93.375q0.00-21.00 -8.75-40.625t-24.125-34.75t-38.125-24.25t-49.25-9.125q-26.00,0.00 -48.625,7.125t-38.25,19.125 t-26.875,27.375t-16.625,32.00t-5.375,33.125q0.00,25.50 9.875,45.00t 29.125,27.50q 3.25,1.25 5.875,0.00t 3.625-4.75q 2.50-11.00 3.75-15.25q 1.50-5.75 -2.75-10.50q-12.50-15.50 -12.50-37.50q0.00-37.50 25.875-64.125t 67.625-26.625q 37.25,0.00 58.125,20.25t 20.875,52.50q0.00,42.00 -16.875,71.50t-43.375,29.50q-15.00,0.00 -24.25-10.875t-5.75-25.875q 2.00-8.50 6.625-23.125 t 7.375-25.50t 2.75-18.625q0.00-12.25 -6.625-20.375t-18.875-8.125q-15.25,0.00 -25.875,14.125t-10.625,34.875q0.00,18.00 6.00,30.25l-24.50,103.50q-6.00,25.00 -1.75,63.50l-45.75,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pinterest, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75q-27.75,0.00 -54.50-8.00q 14.75-23.25 19.50-41.00q 2.25-8.50 13.50-52.75q 5.00,9.75 18.25,16.875t 28.50,7.125q 30.25,0.00 54.00-17.125t 36.75-47.125t 13.00-67.50q0.00-28.50 -14.875-53.50t-43.125-40.75t-63.75-15.75q-26.25,0.00 -49.00,7.25t-38.625,19.25t-27.25,27.625t-16.75,32.375t-5.375,33.50 q0.00,26.00 10.00,45.75t 29.25,27.75q 7.50,3.00 9.50-5.00q 0.50-1.75 2.00-7.75t 2.00-7.50q 1.50-5.75 -2.75-10.75q-12.75-15.25 -12.75-37.75q0.00-37.75 26.125-64.875t 68.375-27.125q 37.75,0.00 58.875,20.50t 21.125,53.25q0.00,42.50 -17.125,72.25t-43.875,29.75q-15.25,0.00 -24.50-10.875t-5.75-26.125q 2.00-8.75 6.625-23.375t 7.50-25.75t 2.875-18.875q0.00-12.50 -6.75-20.75t-19.25-8.25 q-15.50,0.00 -26.25,14.25t-10.75,35.50q0.00,18.25 6.25,30.50l-24.75,104.50q-4.25,17.50 -3.25,44.25q-51.50-22.75 -83.25-70.25t-31.75-105.75q0.00-52.25 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"truck, transfer, transport\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50t 9.50,22.50t 22.50,9.50t 22.50-9.50t 9.50-22.50zM 64.00,224.00l 96.00,0.00 l0.00-64.00 l-39.50,0.00 q-3.25,0.00 -5.50,2.25l-48.75,48.75q-2.25,2.25 -2.25,5.50l0.00,7.50 zM 384.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50t 9.50,22.50t 22.50,9.50t 22.50-9.50t 9.50-22.50zM 448.00,80.00l0.00,256.00 q0.00,3.75 -1.00,6.625t-3.375,4.625 t-4.125,2.875t-5.875,1.50t-5.625,0.50t-6.375,0.00t-5.625-0.125q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-96.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-16.00,0.00 q-0.75,0.00 -5.625,0.125t-6.375,0.00t-5.625-0.50t-5.875-1.50t-4.125-2.875t-3.375-4.625t-1.00-6.625q0.00-6.50 4.75-11.25t 11.25-4.75l0.00-80.00 q0.00-2.00 -0.125-8.75t0.00-9.50 t 0.625-8.625t 1.625-9.25t 3.50-7.625t 5.625-7.50l 49.50-49.50q 4.75-4.75 12.625-8.00t 14.625-3.25l 40.00,0.00 l0.00-48.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 256.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"magic, wand, wizard\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 297.50,145.25l 73.25-73.25l-26.75-26.75l-73.25,73.25zM 409.25,72.00q0.00,6.75 -4.50,11.25l-321.50,321.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-49.50-49.50q-4.50-4.50 -4.50-11.25t 4.50-11.25l 321.50-321.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 49.50,49.50q 4.50,4.50 4.50,11.25zM 71.50,24.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50zM 159.00,65.00 l 49.00,15.00l-49.00,15.00l-15.00,49.00l-15.00-49.00l-49.00-15.00l 49.00-15.00l 15.00-49.00zM 391.50,184.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50zM 231.50,24.50l 24.50,7.50l-24.50,7.50l-7.50,24.50l-7.50-24.50l-24.50-7.50l 24.50-7.50l 7.50-24.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"table, grid\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 128.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 128.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75 l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 128.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,344.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 256.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,248.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 80.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 416.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-336.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 336.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"underline, editor, format\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 12.00,55.75q-9.25-0.50 -11.25-1.00l-0.75-22.00q 3.25-0.25 10.00-0.25q 15.00,0.00 28.00,1.00q 33.00,1.75 41.50,1.75q 21.50,0.00 42.00-0.75q 29.00-1.00 36.50-1.25q 14.00,0.00 21.50-0.50l-0.25,3.50l 0.50,16.00l0.00,2.25 q-15.00,2.25 -31.00,2.25q-15.00,0.00 -19.75,6.25q-3.25,3.50 -3.25,33.00q0.00,3.25 0.125,8.125t 0.125,6.375l 0.25,57.25l 3.50,70.00q 1.50,31.00 12.75,50.50q 8.75,14.75 24.00,23.00q 22.00,11.75 44.25,11.75 q 26.00,0.00 47.75-7.00q 14.00-4.50 24.75-12.75q 12.00-9.00 16.25-16.00q 9.00-14.00 13.25-28.50q 5.25-18.25 5.25-57.25q0.00-19.75 -0.875-32.00t-2.75-30.625t-3.375-39.875l-1.00-14.75q-1.25-16.75 -6.00-22.00q-8.50-8.75 -19.25-8.50l-25.00,0.50l-3.50-0.75l 0.50-21.50l 21.00,0.00 l 51.25,2.50q 19.00,0.75 49.00-2.50l 4.50,0.50q 1.50,9.50 1.50,12.75q0.00,1.75 -1.00,7.75q-11.25,3.00 -21.00,3.25q-18.25,2.75 -19.75,4.25q-3.75,3.75 -3.75,10.25 q0.00,1.75 0.375,6.75t 0.375,7.75q 2.00,4.75 5.50,99.00q 1.50,48.75 -3.75,76.00q-3.75,19.00 -10.25,30.50q-9.50,16.25 -28.00,30.75q-18.75,14.25 -45.50,22.25q-27.25,8.25 -63.75,8.25q-41.75,0.00 -71.00-11.50q-29.75-11.75 -44.75-30.50q-15.25-19.00 -20.75-48.75q-4.00-20.00 -4.00-59.25l0.00-83.25 q0.00-47.00 -4.25-53.25q-6.25-9.00 -36.75-9.75zM 384.00,408.00l0.00-16.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-368.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 368.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"strikethrough, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 440.00,224.00q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-432.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 432.00,0.00 zM 120.75,208.00q-7.00-8.75 -12.75-20.00q-12.00-24.25 -12.00-47.00q0.00-45.25 33.50-77.25q 33.25-31.75 98.25-31.75q 12.50,0.00 41.75,4.75q 16.50,3.00 44.25,12.00q 2.50,9.50 5.25,29.50q 3.50,30.75 3.50,45.75q0.00,4.50 -1.25,11.25l-3.00,0.75l-21.00-1.50 l-3.50-0.50q-12.50-37.25 -25.75-51.25q-22.00-22.75 -52.50-22.75q-28.50,0.00 -45.50,14.75q-16.75,14.50 -16.75,36.50q0.00,18.25 16.50,35.00t 69.75,32.25q 17.25,5.00 43.25,16.50q 14.50,7.00 23.75,13.00l-185.75,0.00 zM 247.50,272.00l 102.75,0.00 q 1.75,9.75 1.75,23.00q0.00,27.75 -10.25,53.00q-5.75,13.75 -17.75,26.00q-9.25,8.75 -27.25,20.25q-20.00,12.00 -38.25,16.50q-20.00,5.25 -50.75,5.25q-28.50,0.00 -48.75-5.75 l-35.00-10.00q-14.25-4.00 -18.00-7.00q-2.00-2.00 -2.00-5.50l0.00-3.25 q0.00-27.00 -0.50-39.00q-0.25-7.50 0.00-17.00l 0.50-9.25l0.00-11.00 l 25.50-0.50q 3.75,8.50 7.50,17.75t 5.625,14.00t 3.125,6.75q 8.75,14.25 20.00,23.50q 10.75,9.00 26.25,14.25q 14.75,5.50 33.00,5.50q 16.00,0.00 34.75-6.75q 19.25-6.50 30.50-21.50q 11.75-15.25 11.75-32.25q0.00-21.00 -20.25-39.25q-8.50-7.25 -34.25-17.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-ol, numbered list\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 95.25,405.00q0.00,20.00 -13.625,31.50t-33.875,11.50q-26.50,0.00 -43.00-16.50l 14.25-22.00q 12.25,11.25 26.50,11.25q 7.25,0.00 12.625-3.625t 5.375-10.625q0.00-16.00 -26.25-14.00l-6.50-14.00q 2.00-2.50 8.125-10.875t 10.625-13.50t 9.25-9.625l0.00-0.25 q-4.00,0.00 -12.125,0.25t-12.125,0.25l0.00,13.25 l-26.50,0.00 l0.00-38.00 l 83.25,0.00 l0.00,22.00 l-23.75,28.75q 12.75,3.00 20.25,12.25t 7.50,22.00zM 95.75,248.25l0.00,39.75 l-90.50,0.00 q-1.50-9.00 -1.50-13.50q0.00-12.75 5.875-23.25t 14.125-17.00t 16.50-11.875t 14.125-10.875t 5.875-11.25q0.00-6.25 -3.625-9.625t-9.875-3.375q-11.50,0.00 -20.25,14.50l-21.25-14.75q 6.00-12.75 17.875-19.875t 26.375-7.125q 18.25,0.00 30.75,10.375t 12.50,28.125q0.00,12.50 -8.50,22.875t-18.75,16.125t-18.875,12.625t-8.875,13.125l 31.75,0.00 l0.00-15.00 l 26.25,0.00 zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625 t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,103.25l0.00,24.75 l-83.75,0.00 l0.00-24.75 l 26.75,0.00 q0.00-10.25 0.125-30.50t 0.125-30.25l0.00-3.00 l-0.50,0.00 q-2.00,4.25 -12.50,13.50l-17.75-19.00l 34.00-31.75l 26.50,0.00 l0.00,101.00 l 27.00,0.00 zM 448.00,200.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375 t-2.375-5.625l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,72.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-ul, bullets\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,352.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 96.00,224.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625 t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,96.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 448.00,200.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 448.00,72.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-304.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 304.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"reorder, list, menu\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,208.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,80.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"sign-blank, square\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"save, disk, floppy, store\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,384.00l 192.00,0.00 l0.00-96.00 l-192.00,0.00 l0.00,96.00 zM 320.00,384.00l 32.00,0.00 l0.00-224.00 q0.00-3.50 -2.50-9.625t-5.00-8.625l-70.25-70.25q-2.50-2.50 -8.50-5.00t-9.75-2.50l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-144.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-32.00,0.00 l0.00,320.00 l 32.00,0.00 l0.00-104.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 208.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,104.00 zM 224.00,152.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375 l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 384.00,160.00l0.00,232.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-336.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 232.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 70.00,70.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"paper-clip, attachment\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 351.00,346.25q0.00,29.25 -19.75,49.00t-49.00,19.75q-33.75,0.00 -58.75-25.00l-194.25-194.00q-28.25-28.75 -28.25-67.75q0.00-39.75 27.50-67.50t 67.25-27.75q 39.50,0.00 68.25,28.25l 151.25,151.50q 2.50,2.50 2.50,5.50q0.00,4.00 -7.625,11.625t-11.625,7.625q-3.25,0.00 -5.75-2.50l-151.50-151.75q-19.75-19.25 -45.25-19.25q-26.50,0.00 -44.75,18.75t-18.25,45.25q0.00,26.25 19.00,45.25 l 194.00,194.25q 15.75,15.75 36.25,15.75q 16.00,0.00 26.50-10.50t 10.50-26.50q0.00-20.50 -15.75-36.25l-145.25-145.25q-6.50-6.00 -15.00-6.00q-7.25,0.00 -12.00,4.75t-4.75,12.00q0.00,8.00 6.25,14.75l 102.50,102.50q 2.50,2.50 2.50,5.50q0.00,4.00 -7.75,11.75t-11.75,7.75q-3.00,0.00 -5.50-2.50l-102.50-102.50q-15.75-15.25 -15.75-37.25q0.00-20.50 14.25-34.75t 34.75-14.25q 22.00,0.00 37.25,15.75l 145.25,145.25q 25.00,24.50 25.00,58.75 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"copy, duplicate, paper, files\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 424.00,96.00q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,304.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-72.00 l-136.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-168.00 q0.00-10.00 5.00-22.00t 12.00-19.00l 102.00-102.00q 7.00-7.00 19.00-12.00t 22.00-5.00l 104.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,82.00 q 17.00-10.00 32.00-10.00l 104.00,0.00 zM 288.00,149.25l-74.75,74.75l 74.75,0.00 l0.00-74.75 zM 128.00,53.25l-74.75,74.75 l 74.75,0.00 l0.00-74.75 zM 177.00,215.00l 79.00-79.00l0.00-104.00 l-96.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,160.00 l 128.00,0.00 l0.00-64.00 q0.00-10.00 5.00-22.00t 12.00-19.00zM 416.00,416.00l0.00-288.00 l-96.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,160.00 l 224.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"cut, scissors\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 240.00,224.00q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75t-11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75zM 315.00,240.00l 126.75,99.50q 7.00,5.00 6.25,14.00q-1.25,8.75 -8.75,12.75l-32.00,16.00q-3.25,1.75 -7.25,1.75q-4.25,0.00 -7.75-2.00l-172.50-96.75l-27.50,16.50q-2.00,1.00 -3.00,1.25q 3.50,12.25 2.50,24.25q-1.75,19.25 -14.00,36.875t-33.00,30.875q-33.00,21.00 -69.25,21.00 q-34.00,0.00 -55.50-19.50q-22.50-21.00 -19.75-51.75q 1.75-19.00 14.00-36.75t 32.75-31.00q 33.00-21.00 69.50-21.00q 20.75,0.00 37.75,7.75q 2.25-3.25 5.50-5.50l 30.50-18.25l-30.50-18.25q-3.25-2.25 -5.50-5.50q-17.00,7.75 -37.75,7.75q-36.50,0.00 -69.50-21.00q-20.50-13.25 -32.75-31.00t-14.00-36.75q-1.25-14.75 3.875-28.25t 15.875-23.25q 21.25-19.75 55.50-19.75q 36.25,0.00 69.25,21.00q 20.75,13.00 33.00,30.75t 14.00,37.00 q 1.00,12.00 -2.50,24.25q 1.00,0.25 3.00,1.25l 27.50,16.50l 172.50-96.75q 3.50-2.00 7.75-2.00q 4.00,0.00 7.25,1.75l 32.00,16.00q 7.50,4.00 8.75,12.75q 0.75,9.00 -6.25,14.00zM 144.75,175.00q 11.50-10.50 5.25-27.00t-26.50-29.25q-23.00-14.75 -48.00-14.75q-18.50,0.00 -28.25,9.00q-11.50,10.50 -5.25,27.00t 26.50,29.25q 23.00,14.75 48.00,14.75q 18.50,0.00 28.25-9.00zM 123.50,361.25q 20.25-12.75 26.50-29.25t-5.25-27.00 q-9.75-9.00 -28.25-9.00q-25.00,0.00 -48.00,14.75q-20.25,12.75 -26.50,29.25t 5.25,27.00q 9.75,9.00 28.25,9.00q 25.00,0.00 48.00-14.75zM 168.00,208.00l 24.00,14.50l0.00-2.75 q0.00-9.00 8.25-14.00l 3.50-2.00l-19.75-11.75l-6.50,6.50q-0.75,0.75 -2.50,2.75t-3.00,3.00q-0.50,0.50 -1.00,0.875t-0.75,0.625zM 224.00,264.00l 24.00,8.00l 184.00-144.00l-32.00-16.00l-192.00,107.75l0.00,28.25 l-40.00,24.00l 2.25,2.00q 0.50,0.50 1.75,1.50 q 1.00,1.00 2.75,3.00t 2.75,3.00l 6.50,6.50zM 400.00,368.00l 32.00-16.00l-130.00-102.00l-44.25,34.50q-0.50,0.75 -3.25,1.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"beaker, lab, beta, experiment, test\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 381.75,362.00q 14.00,22.25 5.375,38.125t-35.125,15.875l-288.00,0.00 q-26.50,0.00 -35.125-15.875t 5.375-38.125l 125.75-198.25l0.00-99.75 l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-16.00,0.00 l0.00,99.75 zM 187.00,180.75l-68.00,107.25l 178.00,0.00 l-68.00-107.25l-5.00-7.75l0.00-9.25 l0.00-99.75 l-32.00,0.00 l0.00,99.75 l0.00,9.25 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cloud, weather\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 480.00,288.00q0.00,39.75 -28.125,67.875t-67.875,28.125l-272.00,0.00 q-46.25,0.00 -79.125-32.875t-32.875-79.125q0.00-33.00 17.75-60.375t 46.75-40.875q-0.50-7.00 -0.50-10.75q0.00-53.00 37.50-90.50t 90.50-37.50q 39.50,0.00 71.625,22.00t 46.875,57.50q 17.50-15.50 41.50-15.50q 26.50,0.00 45.25,18.75t 18.75,45.25q0.00,18.75 -10.25,34.50q 32.25,7.50 53.25,33.625t 21.00,59.875z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"link, chain, anchor\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 364.00,304.00q0.00-10.00 -7.00-17.00l-52.00-52.00q-7.00-7.00 -17.00-7.00q-10.50,0.00 -18.00,8.00q 0.75,0.75 4.75,4.625t 5.375,5.375t 3.75,4.75t 3.25,6.375t 0.875,6.875q0.00,10.00 -7.00,17.00t-17.00,7.00q-3.75,0.00 -6.875-0.875t-6.375-3.25t-4.75-3.75t-5.375-5.375t-4.625-4.75q-8.25,7.75 -8.25,18.25q0.00,10.00 7.00,17.00l 51.50,51.75q 6.75,6.75 17.00,6.75q 10.00,0.00 17.00-6.50 l 36.75-36.50q 7.00-7.00 7.00-16.75zM 188.25,127.75q0.00-10.00 -7.00-17.00l-51.50-51.75q-7.00-7.00 -17.00-7.00q-9.75,0.00 -17.00,6.75l-36.75,36.50q-7.00,7.00 -7.00,16.75q0.00,10.00 7.00,17.00l 52.00,52.00q 6.75,6.75 17.00,6.75q 10.50,0.00 18.00-7.75q-0.75-0.75 -4.75-4.625t-5.375-5.375t-3.75-4.75t-3.25-6.375t-0.875-6.875q0.00-10.00 7.00-17.00t 17.00-7.00q 3.75,0.00 6.875,0.875t 6.375,3.25t 4.75,3.75 t 5.375,5.375t 4.625,4.75q 8.25-7.75 8.25-18.25zM 412.00,304.00q0.00,30.00 -21.25,50.75l-36.75,36.50q-20.75,20.75 -50.75,20.75q-30.25,0.00 -51.00-21.25l-51.50-51.75q-20.75-20.75 -20.75-50.75q0.00-30.75 22.00-52.25l-22.00-22.00q-21.50,22.00 -52.00,22.00q-30.00,0.00 -51.00-21.00l-52.00-52.00q-21.00-21.00 -21.00-51.00t 21.25-50.75l 36.75-36.50q 20.75-20.75 50.75-20.75q 30.25,0.00 51.00,21.25l 51.50,51.75 q 20.75,20.75 20.75,50.75q0.00,30.75 -22.00,52.25l 22.00,22.00q 21.50-22.00 52.00-22.00q 30.00,0.00 51.00,21.00l 52.00,52.00q 21.00,21.00 21.00,51.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"group, people, users, team, members, community\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 148.25,224.00q-40.50,1.25 -66.25,32.00l-33.50,0.00 q-20.50,0.00 -34.50-10.125t-14.00-29.625q0.00-88.25 31.00-88.25q 1.50,0.00 10.875,5.25t 24.375,10.625t 29.75,5.375q 16.75,0.00 33.25-5.75q-1.25,9.25 -1.25,16.50q0.00,34.75 20.25,64.00zM 416.00,383.25q0.00,30.00 -18.25,47.375t-48.50,17.375l-218.50,0.00 q-30.25,0.00 -48.50-17.375t-18.25-47.375q0.00-13.25 0.875-25.875t 3.50-27.25t 6.625-27.125 t 10.75-24.375t 15.50-20.25t 21.375-13.375t 27.875-5.00q 2.50,0.00 10.75,5.375t 18.25,12.00t 26.75,12.00t 33.75,5.375t 33.75-5.375t 26.75-12.00t 18.25-12.00t 10.75-5.375q 15.25,0.00 27.875,5.00t 21.375,13.375t 15.50,20.25t 10.75,24.375t 6.625,27.125t 3.50,27.25t 0.875,25.875zM 160.00,64.00q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75 t 18.75,45.25zM 336.00,160.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125t 67.875,28.125t 28.125,67.875zM 480.00,216.25q0.00,19.50 -14.00,29.625t-34.50,10.125l-33.50,0.00 q-25.75-30.75 -66.25-32.00q 20.25-29.25 20.25-64.00q0.00-7.25 -1.25-16.50q 16.50,5.75 33.25,5.75q 14.75,0.00 29.75-5.375t 24.375-10.625 t 10.875-5.25q 31.00,0.00 31.00,88.25zM 448.00,64.00q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75t 18.75,45.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"fullscreen, maximize, expand, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.75,135.25l-88.75,88.75l 88.75,88.75l 36.00-36.00q 7.25-7.75 17.50-3.50q 9.75,4.25 9.75,14.75l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-10.50,0.00 -14.75-10.00q-4.25-9.75 3.50-17.25l 36.00-36.00l-88.75-88.75l-88.75,88.75l 36.00,36.00q 7.75,7.50 3.50,17.25q-4.25,10.00 -14.75,10.00l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-10.50 10.00-14.75q 9.75-4.25 17.25,3.50l 36.00,36.00 l 88.75-88.75l-88.75-88.75l-36.00,36.00q-4.75,4.75 -11.25,4.75q-3.00,0.00 -6.00-1.25q-10.00-4.25 -10.00-14.75l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 q 10.50,0.00 14.75,10.00q 4.25,9.75 -3.50,17.25l-36.00,36.00l 88.75,88.75l 88.75-88.75l-36.00-36.00q-7.75-7.50 -3.50-17.25q 4.25-10.00 14.75-10.00l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,112.00 q0.00,10.50 -9.75,14.75q-3.25,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.75z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"briefcase, suitcase, work, portfolio\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 160.00,96.00l 128.00,0.00 l0.00-32.00 l-128.00,0.00 l0.00,32.00 zM 448.00,256.00l0.00,120.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-120.00 l 168.00,0.00 l0.00,40.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 80.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-40.00 l 168.00,0.00 zM 256.00,256.00l0.00,32.00 l-64.00,0.00 l0.00-32.00 l 64.00,0.00 zM 448.00,136.00l0.00,96.00 l-448.00,0.00 l0.00-96.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 88.00,0.00 l0.00-40.00 q0.00-10.00 7.00-17.00 t 17.00-7.00l 144.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,40.00 l 88.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"filter\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 350.75,73.75q 4.25,10.25 -3.50,17.50l-123.25,123.25l0.00,185.50 q0.00,10.50 -9.75,14.75q-3.25,1.25 -6.25,1.25q-6.75,0.00 -11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25l0.00-121.50 l-123.25-123.25q-7.75-7.25 -3.50-17.50q 4.25-9.75 14.75-9.75l 320.00,0.00 q 10.50,0.00 14.75,9.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"tasks, bars\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 256.00,352.00l 160.00,0.00 l0.00-32.00 l-160.00,0.00 l0.00,32.00 zM 160.00,224.00l 256.00,0.00 l0.00-32.00 l-256.00,0.00 l0.00,32.00 zM 320.00,96.00l 96.00,0.00 l0.00-32.00 l-96.00,0.00 l0.00,32.00 zM 448.00,304.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,176.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75 t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"wrench, took, fix, preferences, settings, options\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,368.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 257.00,263.00l-170.50,170.50q-9.25,9.25 -22.50,9.25q-13.00,0.00 -22.75-9.25l-26.50-27.00q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 170.25-170.25q 9.75,24.50 28.625,43.375t 43.375,28.625zM 415.50,154.25q0.00,9.75 -5.75,26.50q-11.75,33.50 -41.125,54.375 t-64.625,20.875q-46.25,0.00 -79.125-32.875t-32.875-79.125t 32.875-79.125t 79.125-32.875q 14.50,0.00 30.375,4.125t 26.875,11.625q 4.00,2.75 4.00,7.00t-4.00,7.00l-73.25,42.25l0.00,56.00 l 48.25,26.75q 1.25-0.75 19.75-12.125t 33.875-20.25t 17.625-8.875q 3.75,0.00 5.875,2.50t 2.125,6.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"globe, earth, universal, language, localization\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 298.25,135.75q 2.75-1.75 6.25-5.50l0.00,0.25 q0.00,0.50 -2.375,2.50t-2.875,3.00q-0.25-0.25 -1.00-0.25zM 296.75,136.00q-0.25-0.25 -0.625-0.75t-0.375-0.75q 0.75,0.50 2.50,1.25q-1.50,1.00 -1.50,0.25zM 182.00,90.25q-4.00-0.50 -6.50-1.25q 0.25,0.00 1.625,0.25t 2.625,0.50t 2.25,0.50zM 193.25,81.00q 1.75-1.00 3.375-0.625t 1.875,1.875q-1.25-0.75 -5.25-1.25zM 191.25,82.50l-0.75-0.50q-0.50-0.75 -1.375-1.25t-1.125-0.50q 0.50,0.25 5.25,0.75 q-1.50,1.00 -2.00,1.50zM 165.75,61.50l0.00-0.50 q 0.25,0.50 0.75,1.375t 0.75,1.375zM 139.50,71.50q0.00,0.50 -0.25,0.50l-0.25-0.50l 0.50,0.00 zM 233.25,332.50l0.00,0.25 l0.00-0.25 zM 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 310.00,343.50 l 1.25-1.25q-1.75-2.50 -7.25-3.00q 0.25-3.00 -3.50-6.625t-6.75-3.875q0.00-1.00 -2.625-2.75t-4.375-2.00q-2.25-0.50 -6.75,2.25q-1.75,0.75 -1.00,1.25q-0.75-0.75 -3.00-2.75t-4.00-2.75q-0.50-0.25 -1.875-0.25t-2.125-0.50q-0.25-0.25 -1.50-1.125t-1.75-1.125t-1.625-0.75t-1.875-0.375t-1.875,0.625t-2.125,1.50t-1.125,3.875t-0.625,3.625q-2.00-1.50 -0.125-5.00t 0.375-5.00q-1.75-1.75 -5.25-0.125t-5.25,3.875 q-0.25,0.25 -2.375,1.375t-2.875,1.875q-1.00,1.50 -2.25,4.375t-1.50,3.375q0.00-0.50 -0.625-1.625t-0.625-1.625q-3.00,0.50 -4.00-0.75q 1.25,4.00 2.00,4.25l-1.00-0.50q-0.25,1.50 0.75,3.75t 1.00,2.75q 0.25,1.25 -0.375,3.25t-0.625,2.75q0.00,0.50 1.25,2.75q 1.00,4.75 -0.50,8.00q0.00,0.25 -0.875,1.75t-1.625,2.75l-0.50,1.25l-0.50-0.25q-0.25-0.25 -0.50,0.00q-0.25,1.50 -2.25,3.25t-2.50,2.75q-3.75,5.75 -2.25,9.50 q 0.75,2.00 2.50,2.50q 0.75,0.25 0.75-0.50q 0.25,2.25 -2.75,6.75q 0.25,0.25 1.00,0.75q-4.25,0.00 -2.50,3.50q 50.50-9.00 88.00-45.25l-0.75,0.00 zM 170.00,297.25q 4.00-0.75 7.625,4.00t 5.625,5.75q 10.25,5.00 14.75,2.75q0.00,2.25 3.50,7.00q 0.75,1.00 1.625,2.875t 1.375,2.625q 1.25,1.75 4.75,4.00t 4.75,4.00q 1.50-0.75 2.25-2.25q 3.25,8.75 6.00,8.50q 1.25,0.00 2.00-2.00q0.00,0.25 -0.125,0.75t-0.375,0.75q 1.75-3.75 1.25-6.50l 1.50-1.00q 1.25-1.00 1.25-1.25 q-1.50-1.50 -2.25,0.75q-7.50,3.50 -12.00-5.50q-0.50-0.75 -1.125-2.00t-1.25-3.00t-0.375-2.875t 1.50-1.125q 2.75,0.00 3.125-0.375t-0.625-1.50t-1.00-1.875q-0.25-1.00 -0.375-3.125t-0.375-3.125l-1.25-1.50q-1.25-1.50 -2.875-3.375t-1.875-2.375q-1.00,2.50 -4.125,2.125t-4.625-2.375q 0.25,0.50 -0.125,1.625t-0.375,1.625q-3.50,0.00 -4.25-0.25q 0.25-1.50 0.75-5.25t 1.00-5.50q 0.25-1.25 1.375-3.375t 2.00-3.875t 1.125-3.50 t-1.125-2.625t-4.625-0.625q-5.00,0.25 -7.25,5.50q-0.25,0.75 -0.75,2.875t-1.25,3.125t-2.25,1.75q-2.00,0.75 -6.75,0.50t-6.50-1.25q-3.50-2.00 -6.00-7.625t-2.75-10.375q0.00-2.50 0.75-6.875t 0.75-6.75t-1.50-6.625q 0.75-0.50 2.50-2.625t 2.75-2.875q 0.50-0.50 1.25-0.50l 1.25,0.00 t 1.00-0.50t 0.75-1.50q-0.25-0.25 -1.00-0.75q-0.75-0.75 -1.00-0.75q 1.00,0.75 4.75,0.25t 4.75-0.50q0.00-0.25 5.50,0.00q 4.25,3.25 6.00-0.50q0.00-0.25 -0.625-2.625t-0.125-3.625 q 1.25,7.25 8.00,2.50q 0.75,1.00 4.125,1.50t 4.625,1.25q 0.75,0.50 1.75,1.375t 1.50,1.25t 1.50,0.125t 2.25-1.75q 2.75,4.25 3.25,6.25q 2.75,10.75 5.00,12.00q 2.00,0.50 3.125,0.50t 1.25-2.625t0.00-3.875t-0.375-3.25l-0.50-9.25q-4.00-0.75 -5.00-3.125t 0.375-5.00t 4.125-4.875q 0.25-0.25 4.125-2.00t 5.375-3.00q 6.00-4.75 4.25-9.75q 2.25,0.50 2.75-2.25l-1.25-0.75q-1.00-0.75 -2.00-1.375t-1.25-0.375q 2.75-1.75 0.50-4.50q 1.25-0.75 2.00-2.875 t 2.25-2.875q 2.25,3.50 5.50,0.75q 2.00-2.25 0.50-4.50q 1.25-2.00 5.50-2.875t 5.00-2.375q 1.25,0.25 1.75,0.00t 0.50-1.125l0.00-1.875 t 0.25-2.125t 0.75-1.875q 1.00-1.50 4.00-2.625t 3.50-1.375l 4.75-3.00q 1.00-1.00 0.00-1.00q 4.50,0.50 8.00-2.75q 3.25-3.00 -1.25-5.75q 0.50-1.75 -1.00-2.625t-4.00-1.375q 0.75-0.25 3.00-0.125t 3.00-0.375q 3.75-2.75 -1.75-4.25q-5.00-1.25 -11.75,3.25q-0.75,0.50 -3.25,3.00t-4.25,2.75q 3.75-4.50 1.25-5.50q 2.00,0.25 5.625-2.25t 3.875-2.75 q 1.00-0.50 2.625-0.625t 2.125-0.375q 17.75-6.25 23.00,0.25q 2.00-2.75 2.75-3.75t 2.375-2.25t 3.875-2.00q 5.25-1.75 5.75-2.25l 0.25-5.75q-3.00,0.25 -4.50-2.00t-1.75-5.50l-1.50,2.00q0.00-1.50 -0.875-1.875t-1.875-0.125t-2.375,0.50t-1.875,0.00q-2.25-0.50 -4.875-3.875t-3.625-4.125q 2.25,0.00 2.25-1.25q-0.50-1.25 -2.50-2.00q 0.25-1.50 -0.50-2.00t-2.25,0.00q-0.50-3.00 -0.25-3.25q-1.50-0.25 -2.75-2.75t-2.00-2.50q-0.50,0.00 -1.125,0.50t-1.25,1.375l-1.25,1.75 t-0.875,1.375l-0.50,0.50q-3.00-1.50 -6.00,2.50q-2.25-0.25 -4.25,0.50q 3.75-1.50 0.50-3.25q-2.75-1.25 -5.25-0.50q 3.00-1.25 2.50-3.50t-3.00-4.00q 0.25,0.00 1.00,0.25t 1.00,0.25q-0.25-1.25 -2.375-2.375t-4.875-2.25t-3.50-1.625q-1.75-1.25 -9.00-2.625t-9.00-0.375q-1.25,0.75 -1.50,1.50t 0.375,2.125t 0.875,2.125q 1.50,5.75 1.25,6.75q-0.25,0.75 -2.125,2.00t-1.375,3.00q 0.25,1.00 2.875,2.50t 3.125,3.00q 1.25,3.25 -1.00,6.25 q-1.00,1.25 -3.75,2.75t-3.50,2.50q-1.25,1.25 -0.875,2.875t 0.125,2.375q 0.25-0.25 0.25-0.625t 0.25-0.625q0.00,3.25 2.75,5.50q 2.00,1.50 -4.00,4.50q-5.00,2.75 -5.00,1.00q 0.25-2.00 -1.875-4.00t-2.625-3.00t-0.875-4.75t-2.375-5.25q-1.50-1.00 -4.75-1.00t-4.50,1.25q0.00-2.50 -12.25-7.50q-4.25-2.00 -14.50-1.00q 1.75-0.25 0.00-4.25q-2.00-4.00 -5.25-3.00q-2.00-6.25 -1.00-8.75q 0.50-1.25 2.25-3.50t 2.25-3.75q 0.25-0.75 3.875-1.50t 4.125-2.00 q 0.25-1.00 -0.625-1.625t-2.375-1.125q 13.25,1.50 15.75-4.50q 1.25-2.25 0.75-3.50q0.00,0.25 0.50,0.25t 0.50,0.25q 3.00-0.75 1.75-4.25q 4.75-2.00 6.50-2.00q 1.25,0.25 2.75,1.50t 2.50,1.25q 4.25,0.75 5.375-2.50t-2.375-5.75q 1.75,1.00 1.75-1.50q-0.25-3.25 -1.75-4.75q-0.75-0.50 -1.625-0.625t-1.625,0.00t-1.75-0.125q-0.25,0.00 -2.00-0.50q-0.25,0.25 -0.50,0.25l-2.00,0.00 q-1.00,0.50 -1.00,1.25l0.00,0.25 q-0.25,0.75 1.00,1.50l 1.25,0.25l 0.75,0.50q-0.25,0.00 -0.625,0.625t-0.625,0.625 q0.00,0.75 0.75,1.25q-0.50,0.25 -3.50,1.875t-4.25,2.625q-0.25,0.25 -1.00,0.625t-1.00,0.625q-0.50,0.25 -1.00-0.50t-1.00-2.25t-1.00-2.875t-1.125-2.50t-1.375-1.125q-3.00,0.00 -4.50,4.25q 0.75-2.50 -3.25-4.375t-6.25-1.875q 5.00-3.75 -2.25-7.50l-0.25-0.25q-7.50,1.00 -11.25,1.75q-0.50,1.50 0.75,3.00q-0.25,1.75 1.50,2.25q0.00,0.25 0.125,0.25t 0.125,0.25q0.00-0.25 -0.125-0.25t-0.125-0.25q 0.75,0.25 2.625,0.375t 2.375,0.375 q 0.75,0.25 1.125,0.50l 1.875,1.25t 1.375,1.50t-0.625,1.25q-0.50,0.25 -2.25,1.00t-3.125,1.375t-1.625,0.875q-0.75,1.25 0.00,4.00t-0.50,3.75q-1.25-1.25 -2.50-4.625t-2.00-4.375q 2.00,2.25 -7.50,1.50l-2.00-0.25q-1.00,0.00 -3.75,0.50t-4.00,0.25q-1.75,0.00 -7.25-1.50q 1.75-4.25 1.25-6.25q 1.25,0.00 1.75-0.50l-1.50-0.75q-0.75,0.25 -6.25,2.25q 0.50,0.75 2.00,2.375t 2.25,2.875q-5.50-1.50 -6.75,0.50q0.00,0.25 -2.25,0.00q-6.25-0.25 -6.00,1.75 q 0.25,1.00 2.25,3.00q0.00,2.25 -0.25,2.25q-6.75-5.50 -7.50-5.75q-43.00,20.75 -69.00,62.00q 0.25,0.50 0.625,2.75t 0.875,2.125t 2.75-1.125q 2.25,2.25 0.75,5.25q 0.50-0.50 9.00,5.25q 14.00,10.00 5.50,13.25l0.00-1.375 t 0.25-1.625q-2.25,0.25 -4.75-1.25q-0.75,1.50 0.125,5.00t 2.875,3.50q-2.00,0.00 -2.625,4.25t-0.625,9.625t-0.25,6.375l 0.50,0.25q-0.75,3.25 1.50,9.375t 6.00,5.125q-1.00,4.50 1.25,5.25q-0.25,1.00 0.00,2.00 t 1.125,2.125t 1.50,1.75l 1.875,1.875l 1.50,1.50q 7.00,2.75 10.25,7.25q 1.00,1.50 2.625,6.125t 3.875,6.375q-0.50,1.50 2.50,5.375t 2.75,6.375q-0.25,0.00 -0.625,0.125t-0.625,0.125q 0.75,2.00 4.125,4.00t 4.125,3.50q 0.50,0.75 0.625,2.625t 0.75,3.00t 2.125,0.625q 0.75-6.00 -6.50-17.00q-4.00-6.75 -4.50-7.75q-0.75-1.25 -1.375-4.125t-1.125-3.875q 6.75,2.25 6.50,3.25q-1.25,2.50 6.50,13.00 q 0.50,0.75 2.50,2.50t 2.75,3.00q 0.75,1.00 2.375,3.625t 2.625,3.875q-0.25,0.00 -0.75,0.50l-0.75,0.75q 1.00,0.50 2.25,1.25t 2.00,1.125t 1.875,1.25t 1.875,1.875q 4.00,4.50 5.00,8.25q 0.25,1.00 0.125,3.875t 0.375,4.125q 0.50,1.50 1.50,2.75t 2.875,2.50t 2.875,1.75t 3.625,1.625t 2.875,1.375q 0.50,0.25 4.50,2.75t 6.25,3.50q 2.50,1.00 4.125,1.125t 4.00-0.625t 3.875-1.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-down, download, arrow, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,224.25q0.00-6.75 -4.50-11.25l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-47.25,47.25l0.00-125.50 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,125.50 l-47.25-47.25q-4.75-4.75 -11.25-4.75t-11.25,4.75l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 90.50,90.50l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 22.75-22.75l 90.50-90.50q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-up, upload, arrow, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,223.75q0.00-6.75 -4.50-11.25l-90.50-90.50l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-22.75,22.75l-90.50,90.50q-4.50,4.50 -4.50,11.25t 4.50,11.25l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 47.25-47.25l0.00,125.50 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-125.50 l 47.25,47.25q 4.75,4.75 11.25,4.75t 11.25-4.75l 22.75-22.75q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-right, right, arrow, next\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.25,224.00q0.00-6.75 -4.50-11.25l-22.75-22.75l-90.50-90.50q-4.50-4.50 -11.25-4.50t-11.25,4.50l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 47.25,47.25l-125.50,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 125.50,0.00 l-47.25,47.25q-4.75,4.75 -4.75,11.25t 4.75,11.25l 22.75,22.75q 4.50,4.50 11.25,4.50t 11.25-4.50l 90.50-90.50l 22.75-22.75q 4.50-4.50 4.50-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"circle-arrow-left, left, arrow, previous\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-125.50,0.00 l 47.25-47.25q 4.75-4.75 4.75-11.25t-4.75-11.25l-22.75-22.75q-4.50-4.50 -11.25-4.50t-11.25,4.50l-90.50,90.50l-22.75,22.75q-4.50,4.50 -4.50,11.25t 4.50,11.25l 22.75,22.75l 90.50,90.50q 4.50,4.50 11.25,4.50t 11.25-4.50l 22.75-22.75q 4.50-4.50 4.50-11.25t-4.50-11.25l-47.25-47.25l 125.50,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00 q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hand-down, down, bottom, point\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,240.00q0.00-21.00 -8.00-45.75t-16.00-48.50t-8.00-41.75l0.00-8.00 l-160.00,0.00 l0.00,8.00 q0.00,11.50 -6.25,22.75t-13.00,18.00t-18.00,16.50q-2.25,2.00 -3.50,3.00q-20.25,18.00 -36.25,28.00q-5.50,3.50 -17.00,9.50q-0.75,0.25 -5.625,2.625t-9.00,4.625t-8.875,5.00t-7.625,5.375t-2.875,4.625q0.00,17.75 7.625,28.875t 24.375,11.125q 10.75,0.00 21.125-3.75t 17.00-8.25t 13.75-8.25 t 12.125-3.75l0.00,144.00 q0.00,12.50 9.625,22.25t 22.375,9.75q 13.00,0.00 22.50-9.50t 9.50-22.50l0.00-82.75 q 11.50,8.75 25.75,8.75q 17.25,0.00 29.75-13.25q 8.00,4.50 17.25,4.50t 18.375-4.375t 13.125-11.875q 6.00,1.00 14.00,1.00q 21.25,0.00 31.50-12.125t 10.25-33.875zM 320.00,48.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 384.00,239.00q0.00,35.50 -19.375,57.50 t-54.375,21.75l-1.25-0.25q-19.00,15.25 -44.50,15.25q-5.50,0.00 -10.75-0.75q-13.50,7.50 -29.75,9.25l0.00,42.25 q0.00,26.25 -19.00,45.125t-45.25,18.875q-25.75,0.00 -44.75-19.00t-19.00-45.00l0.00-93.50 q-13.50,5.50 -32.00,5.50q-30.25,0.00 -47.125-20.375t-16.875-51.625q0.00-9.50 4.375-17.375t 12.375-13.75t 15.75-10.125t 18.00-9.25t 15.50-8.25q 13.75-8.75 32.25-25.00q 0.75-0.50 4.25-3.50t 5.375-4.75 t 5.375-5.125t 5.625-6.00t 4.50-5.625t 3.50-5.875t 1.125-5.375l0.00-72.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 160.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625l0.00,72.00 q0.00,14.75 14.75,55.75q 17.25,47.50 17.25,79.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hand-up, up, top, point\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,400.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,209.00q0.00-47.25 -41.75-47.25q-6.50,0.00 -14.00,1.25q-4.00-7.50 -13.125-11.875t-18.375-4.375t-17.25,4.50q-12.50-13.25 -29.75-13.25q-6.25,0.00 -13.875,2.50t-11.875,6.25l0.00-82.75 q0.00-13.00 -9.50-22.50t-22.50-9.50q-12.75,0.00 -22.375,9.75t-9.625,22.25l0.00,144.00 q-5.00,0.00 -12.125-3.75t-13.75-8.25t-17.00-8.25t-21.125-3.75q-16.75,0.00 -24.375,11.125t-7.625,28.875q0.00,6.00 34.75,22.50q 11.00,6.00 16.25,9.25q 16.00,10.00 36.25,28.00q 20.25,17.75 26.50,25.25q 14.25,17.25 14.25,35.00l0.00,8.00 l 160.00,0.00 l0.00-8.00 q0.00-18.00 8.00-41.75t 16.00-48.375t 8.00-44.875zM 384.00,207.75q0.00,33.25 -17.25,80.50q-14.75,41.00 -14.75,55.75l0.00,72.00 q0.00,13.25 -9.375,22.625 t-22.625,9.375l-160.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-72.00 q0.00-2.50 -1.125-5.375t-3.50-5.875t-4.50-5.625t-5.625-6.00t-5.375-5.125t-5.375-4.75t-4.25-3.50q-18.50-16.25 -32.25-25.00q-5.25-3.25 -15.50-8.25t-18.00-9.25t-15.75-10.125t-12.375-13.75t-4.375-17.375q0.00-31.25 16.75-51.625t 47.25-20.375q 17.00,0.00 32.00,5.50l0.00-93.50 q0.00-26.00 19.00-45.00t 44.75-19.00 q 26.25,0.00 45.25,18.875t 19.00,45.125l0.00,42.25 q 15.50,1.00 29.75,9.25q 5.25-0.75 10.75-0.75q 25.25,0.00 44.50,15.00q 34.75-0.25 54.875,21.25t 20.125,56.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"hand-left, point, left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 344.00,352.00l 8.00,0.00 l0.00-160.00 l-8.00,0.00 q-8.75,0.00 -16.75-2.875t-16.00-9.625t-12.00-11.00t-12.50-13.75q-0.50-0.75 -0.875-1.125t-1.00-1.125t-1.125-1.25q-18.00-20.25 -28.00-36.25q-3.50-5.50 -9.50-17.00q-0.25-0.75 -2.625-5.625t-4.625-9.00t-5.00-8.875t-5.375-7.625t-4.625-2.875q-17.75,0.00 -28.875,7.625t-11.125,24.375q0.00,10.75 3.75,21.125t 8.25,17.00t 8.25,13.75t 3.75,12.125l-144.00,0.00 q-12.50,0.00 -22.25,9.625t-9.75,22.375q0.00,13.00 9.50,22.50t 22.50,9.50l 82.75,0.00 q-3.75,4.25 -6.25,11.875t-2.50,13.875q0.00,17.25 13.25,29.75q-4.50,8.00 -4.50,17.25t 4.375,18.375t 11.875,13.125q-1.00,6.00 -1.00,14.00q0.00,21.25 12.125,31.50t 33.875,10.25q 21.00,0.00 45.75-8.00t 48.50-16.00t 41.75-8.00zM 416.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25 t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 448.00,192.00l0.00,160.00 q0.00,13.25 -9.375,22.625t-22.625,9.375l-72.00,0.00 q-14.75,0.00 -55.75,14.75q-47.50,17.25 -79.25,17.25q-35.50,0.00 -57.50-19.375t-21.75-54.375l 0.25-1.25q-15.25-19.00 -15.25-44.50q0.00-5.50 0.75-10.75q-8.25-14.25 -9.25-29.75l-42.25,0.00 q-26.25,0.00 -45.125-19.00t-18.875-45.25q0.00-25.75 19.00-44.75t 45.00-19.00l 93.50,0.00 q-5.50-15.00 -5.50-32.00 q0.00-30.50 20.375-47.25t 51.625-16.75q 9.50,0.00 17.375,4.375t 13.75,12.375t 10.125,15.75t 9.25,18.00t 8.25,15.50q 8.75,13.75 25.00,32.25q 0.50,0.75 3.50,4.25t 4.75,5.375t 5.125,5.375t 6.00,5.625t 5.625,4.50t 5.875,3.50t 5.375,1.125l 72.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"hand-right, point, right\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 416.00,192.00q0.00-12.75 -9.75-22.375t-22.25-9.625l-144.00,0.00 q0.00-5.00 3.75-12.125t 8.25-13.75t 8.25-17.00t 3.75-21.125q0.00-16.75 -11.125-24.375t-28.875-7.625q-6.00,0.00 -22.50,34.75q-6.00,11.00 -9.25,16.25q-10.00,16.00 -28.00,36.25q-17.75,20.25 -25.25,26.50 q-17.25,14.25 -35.00,14.25l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 18.00,0.00 41.75,8.00t 48.375,16.00t 44.875,8.00q 47.25,0.00 47.25-41.75q0.00-6.50 -1.25-14.00q 7.50-4.00 11.875-13.125t 4.375-18.375t-4.50-17.25q 13.25-12.50 13.25-29.75q0.00-6.25 -2.50-13.875t-6.25-11.875l 82.75,0.00 q 13.00,0.00 22.50-9.50t 9.50-22.50zM 448.00,191.75q0.00,26.25 -18.875,45.25t-45.125,19.00l-42.25,0.00 q-1.00,15.50 -9.25,29.75q 0.75,5.25 0.75,10.75 q0.00,25.25 -15.00,44.50q 0.25,34.75 -21.25,54.875t-56.75,20.125q-33.25,0.00 -80.50-17.25q-41.00-14.75 -55.75-14.75l-72.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 72.00,0.00 q 2.50,0.00 5.375-1.125t 5.875-3.50t 5.625-4.50t 6.00-5.625t 5.125-5.375t 4.75-5.375t 3.50-4.25q 16.25-18.50 25.00-32.25q 3.25-5.25 8.25-15.50t 9.25-18.00t 10.125-15.75t 13.75-12.375 t 17.375-4.375q 31.25,0.00 51.625,16.75t 20.375,47.25q0.00,17.00 -5.50,32.00l 93.50,0.00 q 26.00,0.00 45.00,19.00t 19.00,44.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"certificate, starburst\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 344.00,224.00l 34.50,33.75q 7.50,7.00 5.00,17.50q-3.00,10.25 -13.00,12.75l-47.00,12.00l 13.25,46.50q 3.00,10.25 -4.75,17.50q-7.25,7.75 -17.50,4.75l-46.50-13.25l-12.00,47.00q-2.50,10.00 -12.75,13.00q-3.00,0.50 -4.75,0.50q-7.75,0.00 -12.75-5.50l-33.75-34.50l-33.75,34.50q-7.00,7.50 -17.50,5.00q-10.25-2.75 -12.75-13.00l-12.00-47.00l-46.50,13.25q-10.25,3.00 -17.50-4.75q-7.75-7.25 -4.75-17.50 l 13.25-46.50l-47.00-12.00q-10.00-2.50 -13.00-12.75q-2.50-10.50 5.00-17.50l 34.50-33.75l-34.50-33.75q-7.50-7.00 -5.00-17.50q 3.00-10.25 13.00-12.75l 47.00-12.00l-13.25-46.50q-3.00-10.25 4.75-17.50q 7.25-7.75 17.50-4.75l 46.50,13.25l 12.00-47.00q 2.50-10.25 12.75-12.75q 10.25-3.00 17.50,4.75l 33.75,34.75l 33.75-34.75q 7.25-7.50 17.50-4.75q 10.25,2.50 12.75,12.75l 12.00,47.00l 46.50-13.25q 10.25-3.00 17.50,4.75q 7.75,7.25 4.75,17.50 l-13.25,46.50l 47.00,12.00q 10.00,2.50 13.00,12.75q 2.50,10.50 -5.00,17.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"bell, alarm, notification\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 212.00,424.00q0.00-4.00 -4.00-4.00q-14.75,0.00 -25.375-10.625t-10.625-25.375q0.00-4.00 -4.00-4.00t-4.00,4.00q0.00,18.25 12.875,31.125t 31.125,12.875q 4.00,0.00 4.00-4.00zM 45.75,352.00l 324.50,0.00 q-41.00-45.25 -61.625-102.875t-20.625-121.125q0.00-64.00 -80.00-64.00t-80.00,64.00q0.00,63.50 -20.625,121.125t-61.625,102.875zM 416.00,352.00q0.00,13.00 -9.50,22.50t-22.50,9.50 l-112.00,0.00 q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25l-112.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50q 47.50-40.25 71.75-99.375t 24.25-124.625q0.00-41.25 24.00-65.50t 66.00-29.25q-2.00-4.50 -2.00-9.25q0.00-10.00 7.00-17.00t 17.00-7.00t 17.00,7.00t 7.00,17.00q0.00,4.75 -2.00,9.25q 42.00,5.00 66.00,29.25t 24.00,65.50q0.00,65.50 24.25,124.625t 71.75,99.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"bullhorn, megaphone, announcement, advertisement\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,160.00q 13.25,0.00 22.625,9.375t 9.375,22.625t-9.375,22.625t-22.625,9.375l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50q-104.25-86.75 -203.00-95.00q-14.50,4.75 -22.75,16.50t-7.75,25.125t 10.00,23.125q-5.00,8.25 -5.75,16.375t 1.50,14.50t 8.375,13.75t 12.00,12.50t 15.375,12.625q-7.25,14.50 -27.875,20.75t-42.125,2.875t-33.00-13.875q-1.75-5.75 -7.375-21.875 t-8.00-23.625t-5.75-22.25t-3.75-25.25t 0.875-24.625t 5.50-27.625l-30.50,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-48.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 120.00,0.00 q 108.75,0.00 224.00-96.00q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,96.00 zM 384.00,311.00l0.00-238.50 q-98.50,75.50 -192.00,85.75l0.00,67.50 q 94.25,10.50 192.00,85.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"hdd, drive, disk, storage, hard disk\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 260.00,304.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125zM 324.00,304.00q0.00,8.25 -5.875,14.125t-14.125,5.875t-14.125-5.875t-5.875-14.125t 5.875-14.125t 14.125-5.875t 14.125,5.875t 5.875,14.125zM 352.00,344.00l0.00-80.00 q0.00-3.25 -2.375-5.625t-5.625-2.375 l-304.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,80.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 304.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 44.50,224.00l 295.00,0.00 l-39.25-120.50q-1.00-3.25 -4.00-5.375t-6.50-2.125l-195.50,0.00 q-3.50,0.00 -6.50,2.125t-4.00,5.375zM 384.00,264.00l0.00,80.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-304.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-80.00 q0.00-6.25 4.00-18.75 l 49.25-151.50q 4.25-13.25 15.75-21.50t 25.25-8.25l 195.50,0.00 q 13.75,0.00 25.25,8.25t 15.75,21.50l 49.25,151.50q 4.00,12.50 4.00,18.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"rss, atom, feed\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,336.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 224.00,366.75q 0.50,7.00 -4.25,12.00q-4.50,5.25 -11.75,5.25l-33.75,0.00 q-6.25,0.00 -10.75-4.125t-5.00-10.375q-5.50-57.25 -46.125-97.875t-97.875-46.125q-6.25-0.50 -10.375-5.00t-4.125-10.75l0.00-33.75 q0.00-7.25 5.25-11.75q 4.25-4.25 10.75-4.25l 1.25,0.00 q 40.00,3.25 76.50,20.125 t 64.75,45.375q 28.50,28.25 45.375,64.75t 20.125,76.50zM 352.00,367.25q 0.50,6.75 -4.50,11.75q-4.50,5.00 -11.50,5.00l-35.75,0.00 q-6.50,0.00 -11.125-4.375t-4.875-10.625q-3.00-53.75 -25.25-102.125t-57.875-84.00t-84.00-57.875t-102.125-25.50q-6.25-0.25 -10.625-4.875t-4.375-10.875l0.00-35.75 q0.00-7.00 5.00-11.50q 4.50-4.50 11.00-4.50l 0.75,0.00 q 65.50,3.25 125.375,30.00t 106.375,73.50 q 46.75,46.50 73.50,106.375t 30.00,125.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"credit, payment, card\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 440.00,32.00q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 zM 40.00,64.00q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,56.00 l 416.00,0.00 l0.00-56.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 zM 440.00,384.00q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-152.00 l-416.00,0.00 l0.00,152.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 zM 64.00,352.00l0.00-32.00 l 64.00,0.00 l0.00,32.00 l-64.00,0.00 zM 160.00,352.00l0.00-32.00 l 96.00,0.00 l0.00,32.00 l-96.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"unlock\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 176.00,344.00q0.00-1.50 -3.75-14.25t-8.75-28.875t-5.00-16.375q 8.00-4.00 12.75-11.75t 4.75-16.75q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625q0.00,9.00 4.75,16.625t 12.75,11.875q0.00,0.50 -5.00,16.50t-8.75,28.75t-3.75,14.25q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,144.00l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75 l-16.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25l0.00,48.00 l 24.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,144.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-144.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 168.00,0.00 l0.00-48.00 q0.00-46.25 32.875-79.125t 79.125-32.875t 79.125,32.875t 32.875,79.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"github, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,224.00q0.00-32.50 -12.75-62.125t-34.125-51.00t-51.00-34.125t-62.125-12.75t-62.125,12.75t-51.00,34.125t-34.125,51.00t-12.75,62.125q0.00,52.25 31.125,94.625t 80.875,57.875l0.00-42.25 q-13.50,1.75 -17.25,1.75q-27.50,0.00 -38.25-25.00q-3.75-9.50 -9.00-15.75q-1.25-1.50 -5.25-4.75t-7.125-6.00t-3.125-4.00q0.00-3.00 7.00-3.00q 7.25,0.00 12.875,3.625t 9.50,8.75 t 7.875,10.375t 10.125,8.875t 14.125,3.625q 10.50,0.00 20.25-3.50q 4.00-14.25 15.75-22.25q-41.50-4.00 -61.50-20.875t-20.00-56.125q0.00-29.50 18.25-49.50q-3.50-10.50 -3.50-21.00q0.00-14.50 6.75-27.25q 14.25,0.00 25.25,4.875t 25.25,15.125q 19.00-4.50 42.25-4.50q 20.00,0.00 38.25,4.00q 14.25-10.00 25.125-14.75t 24.875-4.75q 6.75,12.75 6.75,27.25q0.00,10.75 -3.50,20.75q 18.25,20.50 18.25,49.75 q0.00,39.25 -20.00,56.375t-61.25,20.875q 17.25,11.75 17.25,32.75l0.00,56.50 q 49.75-15.50 80.875-57.875t 31.125-94.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"facebook, social\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 140.00,102.75q-12.25,0.00 -15.50,3.875t-3.25,16.625l0.00,22.00 l 54.25,0.00 q 4.00,0.00 6.75,3.00q 2.75,3.25 2.50,7.25l-3.50,50.00q-0.50,3.75 -3.125,6.375t-6.375,2.625l-50.50,0.00 l0.00,192.00 q0.00,4.00 -2.75,6.75t-6.50,2.75l-62.50,0.00 q-4.00,0.00 -6.75-2.75t-2.75-6.75l0.00-192.00 l-30.50,0.00 q-4.00,0.00 -6.75-2.875t-2.75-6.875l0.00-50.00 q0.00-4.00 2.75-6.75t 6.75-2.75l 30.50,0.00 l0.00-25.75 q0.00-44.25 22.00-65.875 t 66.75-21.625q 30.00,0.00 56.25,7.50q 3.50,1.00 5.50,4.00t 1.50,6.50l-6.75,48.75q-0.50,4.00 -4.00,6.50q-3.50,2.25 -7.50,1.50q-19.00-4.00 -33.75-4.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"twitter, social\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 468.75,83.50q0.00,2.50 -1.25,4.50q-16.00,26.00 -44.75,47.50l0.00,8.25 q 1.00,56.75 -25.00,114.25q-33.50,74.25 -99.375,116.125t-147.875,41.875q-66.25,0.00 -125.00-30.50q-16.00-8.25 -21.75-12.50q-3.75-3.00 -3.75-6.75q0.00-3.25 2.375-5.625t 5.625-2.375q 3.50,0.00 11.00,0.625t 11.25,0.625q 51.00,0.00 93.75-26.50q-25.75-6.00 -45.25-24.00t-27.75-43.25q-0.50-2.00 -0.50-2.75q0.00-3.00 2.25-5.375 t 5.50-2.375q 1.25,0.00 3.50,0.50t 3.00,0.50q-22.25-13.75 -35.50-36.75t-13.25-49.00q0.00-3.75 2.875-6.375t 6.875-2.625q 2.50,0.00 8.75,2.875t 7.50,3.375q-23.00-27.50 -23.00-64.00q0.00-12.75 3.625-27.00t 10.125-23.75q 2.50-4.00 6.25-4.00q 4.00,0.00 6.75,3.00q 19.00,21.00 27.50,28.75q 30.75,27.75 69.00,44.375t 79.25,20.125q-1.00-5.25 -1.00-12.25q0.00-41.75 29.625-71.375t 71.375-29.625 q 40.75,0.00 70.50,28.50q 23.75-5.00 52.25-20.50q 2.00-1.25 4.00-1.25q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,6.00 -7.00,18.25t-12.75,19.00q 1.75-0.50 7.50-2.625t 10.75-4.00t 6.00-1.875q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"phone-sign, contact, talk, voice\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,298.25q0.00-2.75 -0.50-4.00q-0.75-2.00 -9.625-7.375t-22.125-12.375l-13.25-7.25q-1.25-0.75 -4.75-3.25t-6.25-3.75t-5.25-1.25q-4.50,0.00 -11.75,8.125t-14.25,16.375t-11.00,8.25q-1.75,0.00 -4.125-0.875t-3.875-1.625t-4.25-2.375t-3.50-2.125q-24.75-13.75 -42.625-31.625t-31.625-42.625q-0.50-0.75 -2.125-3.50t-2.375-4.25t-1.625-3.875t-0.875-4.125q0.00-3.25 5.125-8.375t 11.25-9.625 t 11.25-9.875t 5.125-9.125q0.00-2.50 -1.25-5.25t-3.75-6.25t-3.25-4.75q-0.75-1.50 -3.75-7.125t-6.25-11.375t-6.625-11.875t-6.25-10.125t-4.125-4.50t-4.00-0.50q-12.00,0.00 -25.25,5.50q-11.50,5.25 -20.00,23.625t-8.50,32.625q0.00,4.00 0.625,8.50t 1.25,7.625t 2.25,8.25t 2.50,7.375t 3.125,8.25t 2.75,7.50q 15.00,41.00 54.125,80.125t 80.125,54.125q 1.50,0.50 7.50,2.75t 8.25,3.125 t 7.375,2.50t 8.25,2.25t 7.625,1.25t 8.50,0.625q 14.25,0.00 32.625-8.50t 23.625-20.00q 5.50-13.25 5.50-25.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"bookmark-empty\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 288.00,64.00l-256.00,0.00 l0.00,310.50 l 105.75-101.50l 22.25-21.25l 22.25,21.25l 105.75,101.50l0.00-310.50 zM 291.00,32.00q 5.75,0.00 11.00,2.25q 8.25,3.25 13.125,10.25t 4.875,15.50l0.00,322.25 q0.00,8.50 -4.875,15.50t-13.125,10.25q-4.75,2.00 -11.00,2.00q-12.00,0.00 -20.75-8.00l-110.25-106.00l-110.25,106.00q-9.00,8.25 -20.75,8.25q-5.75,0.00 -11.00-2.25q-8.25-3.25 -13.125-10.25t-4.875-15.50l0.00-322.25 q0.00-8.50 4.875-15.50t 13.125-10.25q 5.25-2.25 11.00-2.25l 262.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"check-empty, checkbox, square\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,64.00l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-208.00 q0.00-16.50 -11.75-28.25t-28.25-11.75zM 352.00,104.00l0.00,208.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"phone, contact, talk, voice\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,310.00q0.00,6.75 -2.50,17.625t-5.25,17.125q-5.25,12.50 -30.50,26.50q-23.50,12.75 -46.50,12.75q-6.75,0.00 -13.125-0.875t-14.375-3.125t-11.875-3.625t-13.875-5.125t-12.25-4.50q-24.50-8.75 -43.75-20.75q-32.00-19.75 -66.125-53.875t-53.875-66.125q-12.00-19.25 -20.75-43.75q-0.75-2.25 -4.50-12.25t-5.125-13.875t-3.625-11.875t-3.125-14.375t-0.875-13.125 q0.00-23.00 12.75-46.50q 14.00-25.25 26.50-30.50q 6.25-2.75 17.125-5.25t 17.625-2.50q 3.50,0.00 5.25,0.75q 4.50,1.50 13.25,19.00q 2.75,4.75 7.50,13.50t 8.75,15.875t 7.75,13.375q 0.75,1.00 4.375,6.25t 5.375,8.875t 1.75,7.125q0.00,5.00 -7.125,12.50t-15.50,13.75t-15.50,13.25t-7.125,11.50q0.00,2.25 1.25,5.625t 2.125,5.125t 3.50,6.00t 2.875,4.75q 19.00,34.25 43.50,58.75t 58.75,43.50 q 0.50,0.25 4.75,2.875t 6.00,3.50t 5.125,2.125t 5.625,1.25q 4.50,0.00 11.50-7.125t 13.25-15.50t 13.75-15.50t 12.50-7.125q 3.50,0.00 7.125,1.75t 8.875,5.375t 6.25,4.375q 6.25,3.75 13.375,7.75t 15.875,8.75t 13.50,7.50q 17.50,8.75 19.00,13.25q 0.75,1.75 0.75,5.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"lemon, fruit, food\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 351.75,206.50q0.00-11.00 -1.75-28.375t-4.50-24.125q-3.00-7.50 -4.25-11.00t-2.25-9.125t-1.00-12.125q0.00-5.75 1.25-17.125t 1.25-16.875q0.00-9.25 -2.50-13.75q-1.00-0.25 -3.25-0.25q-4.75,0.00 -14.50,1.125t-14.75,1.125q-15.00,0.00 -44.00-6.00t-43.75-6.00q-10.75,0.00 -23.625,2.875t-21.25,5.875t-22.375,8.50q-34.25,13.50 -50.50,25.75q-24.00,18.25 -39.875,47.375t-22.00,59.00t-6.125,62.125 q0.00,10.00 3.125,30.00t 3.125,30.25q0.00,5.75 -2.75,16.625t-2.75,16.375t 3.00,9.125t 8.50,3.625q 6.00,0.00 18.125-2.75t 18.375-2.75q 14.25,0.00 42.375,3.875t 42.375,3.875q 45.25,0.00 71.00-9.00q 32.25-11.25 58.875-38.125t 41.50-61.375t 14.875-68.75zM 383.75,206.00q0.00,41.25 -17.50,81.875t-49.00,72.00t-70.25,45.125q-31.00,11.00 -81.50,11.00 q-14.25,0.00 -42.50-3.625t-42.25-3.625q-6.00,0.00 -18.125,3.625t-18.375,3.625q-18.25,0.00 -30.875-13.875t-12.625-32.125q0.00-6.00 2.75-17.00t 2.75-16.75q0.00-10.00 -3.125-30.125t-3.125-30.375q0.00-27.75 4.50-54.375t 13.625-52.375t 25.125-48.50t 37.50-39.00q 19.50-14.75 58.00-30.00q 48.50-19.50 79.00-19.50q 15.00,0.00 43.875,6.00t 43.375,6.00q 4.75,0.00 14.25-1.25t 14.50-1.25 q 20.25,0.00 29.50,12.625t 9.25,33.625q0.00,5.75 -1.25,17.00t-1.25,17.00q0.00,2.50 0.25,4.625t 0.75,4.25t 1.00,3.375t 1.625,4.00t 1.625,4.25q 4.00,10.00 6.25,29.625t 2.25,34.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"upload-alt, load, open\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,264.00l0.00,144.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-400.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-144.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 288.00,0.00 l0.00-88.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 336.00,176.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-64.00,0.00 l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-64.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 l-64.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 112.00-112.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 112.00,112.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"github-sign, git, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 145.50,327.00q0.00,16.50 -23.25,16.50q-26.75,0.00 -26.75-15.75q0.00-16.00 24.50-16.00q 25.50,0.00 25.50,15.25zM 136.50,210.50q0.00,21.25 -18.50,21.25q-19.25,0.00 -19.25-21.00q0.00-22.50 19.25-22.50q 9.00,0.00 13.75,6.50t 4.75,15.75zM 178.00,191.75l0.00-31.25 q-19.50,7.25 -33.75,7.25q-12.50-7.25 -27.50-7.25q-21.50,0.00 -36.25,14.25t-14.75,35.75q0.00,12.50 7.375,25.50t 18.375,16.75l0.00,0.75 q-9.50,4.25 -9.50,21.25 q0.00,13.00 10.25,19.25l0.00,0.75 q-28.25,9.25 -28.25,34.75q0.00,15.00 9.00,24.50t 21.00,12.75t 26.75,3.25q 56.00,0.00 56.00-46.75q0.00-12.00 -6.375-19.50t-15.625-10.625t-18.50-5.375t-15.625-5.875t-6.375-9.875q0.00-11.00 12.25-13.00q 19.25-3.75 30.50-17.50t 11.25-33.50q0.00-6.00 -2.50-13.00q 7.50-1.75 12.25-3.25zM 192.75,296.50l 34.25,0.00 q-0.50-5.00 -0.50-22.50l0.00-93.00 q0.00-14.75 0.50-19.00l-34.25,0.00 q 0.75,6.50 0.75,19.75l0.00,94.25 q0.00,13.75 -0.75,20.50zM 320.00,292.50l0.00-30.25 q-7.50,5.25 -17.00,5.25q-13.25,0.00 -13.25-20.50l0.00-56.25 l 13.00,0.00 q 2.25,0.00 6.625,0.25t 6.625,0.25l0.00-29.25 l-26.25,0.00 q0.00-20.50 0.75-25.50l-35.00,0.00 q 1.00,6.00 1.00,13.75l0.00,11.75 l-15.00,0.00 l0.00,29.25 q 9.00-0.75 9.25-0.75q 1.00,0.00 2.875,0.125t 2.875,0.125l0.00,0.50 l-0.50,0.00 l0.00,54.25 q0.00,9.25 0.625,16.00t 2.875,14.125t 6.125,12.125t 10.875,7.75t 16.50,3.00q 16.00,0.00 27.00-6.00zM 231.00,116.00 q0.00-9.00 -6.00-15.875t-15.00-6.875t-15.125,6.75t-6.125,16.00q0.00,9.00 6.25,15.625t 15.00,6.625t 14.875-6.75t 6.125-15.50zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"trophy, cup, prize, present, win, tournament\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 114.50,220.75q-18.50-40.50 -18.50-92.75l-64.00,0.00 l0.00,24.00 q0.00,19.50 23.625,40.50t 58.875,28.25zM 384.00,152.00l0.00-24.00 l-64.00,0.00 q0.00,52.25 -18.50,92.75q 35.25-7.25 58.875-28.25t 23.625-40.50zM 416.00,120.00l0.00,32.00 q0.00,17.75 -10.375,35.75t-28.00,32.50t-43.25,24.375t-53.875,11.125q-10.50,13.50 -23.75,23.75q-9.50,8.50 -13.125,18.125t-3.625,22.375q0.00,13.50 7.625,22.75 t 24.375,9.25q 18.75,0.00 33.375,11.375t 14.625,28.625l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-208.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-17.25 14.625-28.625t 33.375-11.375q 16.75,0.00 24.375-9.25t 7.625-22.75q0.00-12.75 -3.625-22.375t-13.125-18.125q-13.25-10.25 -23.75-23.75q-28.25-1.25 -53.875-11.125t-43.25-24.375t-28.00-32.50t-10.375-35.75l0.00-32.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 72.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 144.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 72.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"signin, login, enter\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 296.00,224.00q0.00,6.50 -4.75,11.25l-136.00,136.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-72.00 l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 l0.00-72.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 136.00,136.00q 4.75,4.75 4.75,11.25zM 384.00,136.00l0.00,176.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-80.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625 q0.00-1.00 -0.25-5.00t-0.125-6.625t 0.75-5.875t 2.50-4.875t 5.125-1.625l 80.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-176.00 q0.00-16.50 -11.75-28.25t-28.25-11.75l-72.00,0.00 l-2.75,0.00 l-3.25,0.00 t-2.875-0.25t-2.875-0.75t-2.00-1.375t-1.75-2.25t-0.50-3.375q0.00-1.00 -0.25-5.00t-0.125-6.625t 0.75-5.875t 2.50-4.875t 5.125-1.625l 80.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"external-link, blank, out, popout\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 352.00,232.00l0.00,80.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 176.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-176.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-80.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 448.00,16.00l0.00,128.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-44.00-44.00l-163.00,163.00q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 163.00-163.00l-44.00-44.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"pushpin, pin, needle\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 120.00,216.00l0.00-112.00 q0.00-3.50 -2.25-5.75t-5.75-2.25t-5.75,2.25t-2.25,5.75l0.00,112.00 q0.00,3.50 2.25,5.75t 5.75,2.25t 5.75-2.25t 2.25-5.75zM 288.00,304.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-107.25,0.00 l-12.75,120.75q-0.50,3.00 -2.625,5.125t-5.125,2.125l-0.25,0.00 q-6.75,0.00 -8.00-6.75l-19.00-121.25l-101.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-30.75 19.625-55.375t 44.375-24.625l0.00-128.00 q-13.00,0.00 -22.50-9.50 t-9.50-22.50t 9.50-22.50t 22.50-9.50l 160.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50t-9.50,22.50t-22.50,9.50l0.00,128.00 q 24.75,0.00 44.375,24.625t 19.625,55.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"linkedin-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 128.00,344.00l0.00-160.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,160.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 125.75,127.00q0.00-12.75 -9.00-21.875t-22.00-9.125q-12.75,0.00 -21.75,9.125t-9.00,21.875t 9.00,21.875t 21.75,9.125q 13.00,0.00 22.00-9.125t 9.00-21.875zM 320.00,344.00l0.00-108.75 q0.00-31.75 -18.375-48.125t-50.625-16.375q-22.50,0.00 -39.50,11.25q-3.00,2.00 -3.50,3.00q0.00-9.00 -8.75-9.00l-44.00,0.00 q-3.50,0.00 -7.375,1.875t-3.875,5.125l0.00,161.00 q0.00,3.25 3.875,5.625t 7.375,2.375l 45.50,0.00 q 3.00,0.00 5.125-2.375t 2.125-5.625l0.00-87.25 q0.00-35.00 28.50-35.00q 12.25,0.00 15.875,5.625t 3.625,18.375l0.00,98.25 q0.00,3.25 3.00,5.625t 6.50,2.375l 46.50,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"signout, exit, quit, logout, log out, leave\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,360.00q0.00,1.00 0.25,5.00t 0.125,6.625t-0.75,5.875t-2.50,4.875t-5.125,1.625l-80.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-176.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 80.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,1.00 0.25,5.00t 0.125,6.625t-0.75,5.875t-2.50,4.875t-5.125,1.625l-80.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,176.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 72.00,0.00 l 2.75,0.00 l 3.25,0.00 t 2.875,0.25t 2.875,0.75t 2.00,1.375t 1.75,2.25t 0.50,3.375zM 392.00,224.00q0.00,6.50 -4.75,11.25l-136.00,136.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-72.00 l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 l0.00-72.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 136.00,136.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"heart-empty, love, like\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,149.00q0.00-20.25 -5.375-35.75t-13.75-24.625t-20.375-14.875t-23.50-7.75t-24.50-2.00t-28.00,6.375t-27.625,16.00t-21.625,18.00t-15.00,15.375q-4.50,5.50 -12.25,5.50t-12.25-5.50q-6.00-7.00 -15.00-15.375t-21.625-18.00t-27.625-16.00t-28.00-6.375t-24.50,2.00t-23.50,7.75t-20.375,14.875t-13.75,24.625t-5.375,35.75q0.00,42.00 46.75,88.75l 145.25,140.00l 145.00-139.75 q 47.00-47.00 47.00-89.00zM 448.00,149.00q0.00,55.25 -57.25,112.50l-155.75,150.00q-4.50,4.50 -11.00,4.50t-11.00-4.50l-156.00-150.50q-2.50-2.00 -6.875-6.50t-13.875-16.375t-17.00-24.375t-13.375-30.25t-5.875-34.50q0.00-55.00 31.75-86.00t 87.75-31.00q 15.50,0.00 31.625,5.375t 30.00,14.50t 23.875,17.125t 19.00,17.00q 9.00-9.00 19.00-17.00t 23.875-17.125t 30.00-14.50t 31.625-5.375 q 56.00,0.00 87.75,31.00t 31.75,86.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"224\" height=\"448\" viewBox=\"0 0 224 448\" data-du=\"\" data-tags=\"star-half, rating\" style=\"margin-left: 12px; margin-top: 8px;\"><path d=\"M 208.00,8.00l0.00,334.75 l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"thumbs-down, dislike\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 64.00,112.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,256.00q0.00-8.75 -5.375-20.25t-13.375-11.75q 3.75-4.25 6.25-11.875t 2.50-13.875q0.00-17.25 -13.25-29.75q 4.50-8.00 4.50-17.25t-4.375-18.375t-11.875-13.125q 1.25-7.50 1.25-14.00q0.00-21.25 -12.25-31.50t-34.00-10.25l-32.00,0.00 q-32.75,0.00 -85.50,18.25q-1.25,0.50 -7.25,2.625 t-8.875,3.125t-8.75,2.875t-9.50,2.75t-8.25,1.625t-7.875,0.75l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 4.00,0.00 8.875,2.25t 10.00,6.75t 9.625,8.875t 10.00,11.00t 8.625,10.625t 7.875,10.25t 5.75,7.50q 13.75,17.00 19.25,22.75q 10.25,10.75 14.875,27.375t 7.625,31.375t 9.50,21.25q 24.00,0.00 32.00-11.75t 8.00-36.25q0.00-14.75 -12.00-40.125t-12.00-39.875l 88.00,0.00 q 12.50,0.00 22.25-9.625t 9.75-22.375z M 384.00,256.25q0.00,25.75 -19.00,44.75t-45.00,19.00l-44.00,0.00 q 12.00,24.75 12.00,48.00q0.00,29.50 -8.75,46.50q-8.75,17.25 -25.50,25.375t-37.75,8.125q-12.75,0.00 -22.50-9.25q-8.50-8.25 -13.50-20.50t-6.375-22.625t-4.375-21.125t-7.75-16.00q-12.00-12.50 -26.75-31.75q-25.25-32.75 -34.25-38.75l-68.50,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375 l 72.00,0.00 q 5.50,0.00 34.50-10.00q 32.00-11.00 55.75-16.50t 50.00-5.50l 28.00,0.00 q 35.00,0.00 56.625,19.75t 21.375,54.00l0.00,1.25 q 15.00,19.25 15.00,44.50q0.00,5.50 -0.75,10.75q 9.50,16.75 9.50,36.00q0.00,9.00 -2.25,17.25q 12.25,18.50 12.25,40.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"thumbs-up, like\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 64.00,336.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 352.00,192.00q0.00-12.75 -9.75-22.375t-22.25-9.625l-88.00,0.00 q0.00-14.50 12.00-39.875t 12.00-40.125q0.00-24.50 -8.00-36.25t-32.00-11.75q-6.50,6.50 -9.50,21.25t-7.625,31.375t-14.875,27.375q-5.50,5.75 -19.25,22.75q-1.00,1.25 -5.75,7.50t-7.875,10.25t-8.625,10.625 t-10.00,11.00t-9.625,8.875t-10.00,6.75t-8.875,2.25l-8.00,0.00 l0.00,160.00 l 8.00,0.00 q 3.25,0.00 7.875,0.75t 8.25,1.625t 9.50,2.75t 8.75,2.875t 8.875,3.125t 7.25,2.625q 52.75,18.25 85.50,18.25l 30.25,0.00 q 48.00,0.00 48.00-41.75q0.00-6.50 -1.25-14.00q 7.50-4.00 11.875-13.125t 4.375-18.375t-4.50-17.25q 13.25-12.50 13.25-29.75q0.00-6.25 -2.50-13.875t-6.25-11.875q 8.00-0.25 13.375-11.75t 5.375-20.25zM 384.00,191.75 q0.00,22.25 -12.25,40.75q 2.25,8.25 2.25,17.25q0.00,19.25 -9.50,36.00q 0.75,5.25 0.75,10.75q0.00,25.25 -15.00,44.50q 0.25,34.75 -21.25,54.875t-56.75,20.125l-9.00,0.00 l-23.25,0.00 q-24.00,0.00 -47.375-5.625t-54.125-16.375q-29.00-10.00 -34.50-10.00l-72.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-160.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 68.50,0.00 q 9.00-6.00 34.25-38.75q 14.50-18.75 26.75-32.00 q 6.00-6.25 8.875-21.375t 7.625-31.625t 15.50-27.00q 9.75-9.25 22.50-9.25q 21.00,0.00 37.75,8.125t 25.50,25.375t 8.75,46.50q0.00,23.25 -12.00,48.00l 44.00,0.00 q 26.00,0.00 45.00,19.00t 19.00,44.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comments, chat, talk, bubbles\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 352.00,192.00q0.00,34.75 -23.50,64.25t-64.125,46.625t-88.375,17.125q-21.50,0.00 -44.00-4.00q-31.00,22.00 -69.50,32.00q-9.00,2.25 -21.50,4.00l-0.75,0.00 q-2.75,0.00 -5.125-2.00t-2.875-5.25q-0.25-0.75 -0.25-1.625t 0.125-1.625t 0.50-1.50l 0.625-1.25t 0.875-1.375t 1.00-1.25t 1.125-1.25t 1.00-1.125q 1.25-1.50 5.75-6.25t 6.50-7.375t 5.625-7.25t 6.25-9.625t 5.125-11.00q-31.00-18.00 -48.75-44.25t-17.75-56.00 q0.00-34.75 23.50-64.25t 64.125-46.625t 88.375-17.125t 88.375,17.125t 64.125,46.625t 23.50,64.25zM 448.00,256.00q0.00,30.00 -17.75,56.125t-48.75,44.125q 2.50,6.00 5.125,11.00t 6.25,9.625t 5.625,7.25t 6.50,7.375t 5.75,6.25q 0.25,0.25 1.00,1.125t 1.125,1.25t 1.00,1.25t 0.875,1.375l 0.625,1.25t 0.50,1.50t 0.125,1.625t-0.25,1.625q-0.75,3.50 -3.25,5.50t-5.50,1.75 q-12.50-1.75 -21.50-4.00q-38.50-10.00 -69.50-32.00q-22.50,4.00 -44.00,4.00q-67.75,0.00 -118.00-33.00q 14.50,1.00 22.00,1.00q 40.25,0.00 77.25-11.25t 66.00-32.25q 31.25-23.00 48.00-53.00t 16.75-63.50q0.00-19.25 -5.75-38.00q 32.25,17.75 51.00,44.50t 18.75,57.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"cogs, settings, options, preferences, gears\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 224.00,224.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 416.00,352.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50q0.00,13.25 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 416.00,96.00q0.00-13.00 -9.50-22.50t-22.50-9.50t-22.50,9.50t-9.50,22.50q0.00,13.25 9.375,22.625t 22.625,9.375 t 22.625-9.375t 9.375-22.625zM 320.00,201.25l0.00,46.25 q0.00,2.50 -1.75,4.875t-4.00,2.625l-38.75,6.00q-2.75,8.75 -8.00,19.00q 8.50,12.00 22.50,28.75q 1.75,2.50 1.75,5.00q0.00,3.00 -1.75,4.75q-5.75,7.50 -20.625,22.375t-19.625,14.875q-2.75,0.00 -5.25-1.75l-28.75-22.50q-9.25,4.75 -19.25,7.75q-2.75,27.00 -5.75,38.75q-1.75,6.00 -7.50,6.00l-46.50,0.00 q-2.75,0.00 -5.00-1.875t-2.50-4.375 l-5.75-38.25q-8.50-2.50 -18.75-7.75l-29.50,22.25q-1.75,1.75 -5.00,1.75q-2.75,0.00 -5.25-2.00q-36.00-33.25 -36.00-40.00q0.00-2.25 1.75-4.75q 2.50-3.50 10.25-13.25t 11.75-15.25q-5.75-11.00 -8.75-20.50l-38.00-6.00q-2.50-0.25 -4.25-2.375t-1.75-4.875l0.00-46.25 q0.00-2.50 1.75-4.875t 4.00-2.625l 38.75-6.00q 2.75-8.75 8.00-19.00q-8.50-12.00 -22.50-28.75q-1.75-2.75 -1.75-5.00q0.00-3.00 1.75-5.00q 5.50-7.50 20.50-22.25t 19.75-14.75q 2.75,0.00 5.25,1.75 l 28.75,22.50q 8.50-4.50 19.25-8.00q 2.75-27.00 5.75-38.50q 1.75-6.00 7.50-6.00l 46.50,0.00 q 2.75,0.00 5.00,1.875t 2.50,4.375l 5.75,38.25q 8.50,2.50 18.75,7.75l 29.50-22.25q 2.00-1.75 5.00-1.75q 2.75,0.00 5.25,2.00q 36.00,33.25 36.00,40.00q0.00,2.25 -1.75,4.75q-3.00,4.00 -10.50,13.50t-11.25,15.00q 5.75,12.00 8.50,20.50l 38.00,5.75q 2.50,0.50 4.25,2.625t 1.75,4.875zM 480.00,334.50l0.00,35.00 q0.00,4.00 -37.25,7.75 q-3.00,6.75 -7.50,13.00q 12.75,28.25 12.75,34.50q0.00,1.00 -1.00,1.75q-30.50,17.75 -31.00,17.75q-2.00,0.00 -11.50-11.75t-13.00-17.00q-5.00,0.50 -7.50,0.50t-7.50-0.50q-3.50,5.25 -13.00,17.00t-11.50,11.75q-0.50,0.00 -31.00-17.75q-1.00-0.75 -1.00-1.75q0.00-6.25 12.75-34.50q-4.50-6.25 -7.50-13.00q-37.25-3.75 -37.25-7.75l0.00-35.00 q0.00-4.00 37.25-7.75q 3.25-7.25 7.50-13.00q-12.75-28.25 -12.75-34.50q0.00-1.00 1.00-1.75q 1.00-0.50 8.75-5.00 t 14.75-8.50t 7.50-4.00q 2.00,0.00 11.50,11.625t 13.00,16.875q 5.00-0.50 7.50-0.50t 7.50,0.50q 12.75-17.75 23.00-28.00l 1.50-0.50q 1.00,0.00 31.00,17.50q 1.00,0.75 1.00,1.75q0.00,6.25 -12.75,34.50q 4.25,5.75 7.50,13.00q 37.25,3.75 37.25,7.75zM 480.00,78.50l0.00,35.00 q0.00,4.00 -37.25,7.75q-3.00,6.75 -7.50,13.00q 12.75,28.25 12.75,34.50q0.00,1.00 -1.00,1.75q-30.50,17.75 -31.00,17.75q-2.00,0.00 -11.50-11.75t-13.00-17.00 q-5.00,0.50 -7.50,0.50t-7.50-0.50q-3.50,5.25 -13.00,17.00t-11.50,11.75q-0.50,0.00 -31.00-17.75q-1.00-0.75 -1.00-1.75q0.00-6.25 12.75-34.50q-4.50-6.25 -7.50-13.00q-37.25-3.75 -37.25-7.75l0.00-35.00 q0.00-4.00 37.25-7.75q 3.25-7.25 7.50-13.00q-12.75-28.25 -12.75-34.50q0.00-1.00 1.00-1.75q 1.00-0.50 8.75-5.00t 14.75-8.50t 7.50-4.00q 2.00,0.00 11.50,11.625t 13.00,16.875q 5.00-0.50 7.50-0.50t 7.50,0.50q 12.75-17.75 23.00-28.00l 1.50-0.50q 1.00,0.00 31.00,17.50 q 1.00,0.75 1.00,1.75q0.00,6.25 -12.75,34.50q 4.25,5.75 7.50,13.00q 37.25,3.75 37.25,7.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"key, unlock, password\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 208.00,128.00q0.00-20.00 -14.00-34.00t-34.00-14.00t-34.00,14.00t-14.00,34.00q0.00,10.50 4.75,20.75q-10.25-4.75 -20.75-4.75q-20.00,0.00 -34.00,14.00t-14.00,34.00t 14.00,34.00t 34.00,14.00t 34.00-14.00t 14.00-34.00q0.00-10.50 -4.75-20.75q 10.25,4.75 20.75,4.75q 20.00,0.00 34.00-14.00t 14.00-34.00zM 420.75,304.00q0.00,4.25 -12.25,16.50t-16.50,12.25q-2.25,0.00 -7.125-4.00t-9.125-8.25t-9.625-10.00t-6.125-6.50 l-24.00,24.00l 55.00,55.00q 7.00,7.00 7.00,17.00q0.00,10.50 -9.75,20.25t-20.25,9.75q-10.00,0.00 -17.00-7.00l-167.75-167.75q-44.00,32.75 -91.25,32.75q-40.75,0.00 -66.375-25.625t-25.625-66.375q0.00-40.00 23.75-78.25t 62.00-62.00t 78.25-23.75q 40.75,0.00 66.375,25.625t 25.625,66.375q0.00,47.25 -32.75,91.25l 88.75,88.75l 24.00-24.00q-0.75-0.75 -6.50-6.125t-10.00-9.625t-8.25-9.125 t-4.00-7.125q0.00-4.25 12.25-16.50t 16.50-12.25q 3.25,0.00 5.75,2.50q 1.50,1.50 11.50,11.125t 20.50,19.875t 21.625,21.50t 18.25,19.50t 7.125,10.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"camera-retro, image, picture, photo\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 232.00,208.00q0.00-3.50 -2.25-5.75t-5.75-2.25q-16.50,0.00 -28.25,11.75t-11.75,28.25q0.00,3.50 2.25,5.75t 5.75,2.25t 5.75-2.25t 2.25-5.75q0.00-10.00 7.00-17.00t 17.00-7.00q 3.50,0.00 5.75-2.25t 2.25-5.75zM 288.00,240.50q0.00,26.50 -18.75,45.25t-45.25,18.75t-45.25-18.75t-18.75-45.25t 18.75-45.25t 45.25-18.75t 45.25,18.75t 18.75,45.25zM 32.00,384.00l 384.00,0.00 l0.00-32.00 l-384.00,0.00 l0.00,32.00 zM 320.00,240.50q0.00-39.75 -28.125-67.875 t-67.875-28.125t-67.875,28.125t-28.125,67.875t 28.125,67.875t 67.875,28.125t 67.875-28.125t 28.125-67.875zM 64.00,80.00l 96.00,0.00 l0.00-32.00 l-96.00,0.00 l0.00,32.00 zM 32.00,128.00l 384.00,0.00 l0.00-29.50 l0.00-34.50 l-207.00,0.00 l-16.00,32.00l-161.00,0.00 l0.00,32.00 zM 448.00,64.00l0.00,320.00 q0.00,13.25 -9.375,22.625t-22.625,9.375l-384.00,0.00 q-13.25,0.00 -22.625-9.375t-9.375-22.625l0.00-320.00 q0.00-13.25 9.375-22.625t 22.625-9.375l 384.00,0.00 q 13.25,0.00 22.625,9.375t 9.375,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"facebook-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 312.00,32.00q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-87.50,0.00 q-0.50,0.00 -0.50-0.25l0.00-167.75 l 44.25,0.00 q 7.75,0.00 8.00-5.75l 3.00-41.00q 0.50-3.75 -2.00-6.25q-2.50-3.00 -6.00-3.00l-47.25,0.00 l0.00-18.00 q0.00-11.00 2.875-14.25t 13.625-3.25q 14.25,0.00 29.25,3.25q 3.25,0.75 6.50-1.25q 2.75-2.00 3.25-5.50l 5.75-41.50q 0.50-3.00 -1.375-5.625t-4.875-3.375 q-23.25-6.50 -49.25-6.50q-77.75,0.00 -77.75,74.75l0.00,21.25 l-23.75,0.00 q-3.25,0.00 -5.75,2.625t-2.50,6.125l0.00,43.00 q0.00,2.00 1.375,3.00t 2.50,1.125t 4.375,0.125l 23.75,0.00 l0.00,167.75 l 2.50,0.25l-82.50,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"twitter-sign, social\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,144.50q0.00-3.25 -2.375-5.625t-5.625-2.375q-1.25,0.00 -3.75,1.00q 5.00-8.50 5.00-13.75q0.00-3.25 -2.375-5.625t-5.625-2.375q-1.75,0.00 -4.25,1.25q-15.00,8.50 -24.25,10.75q-16.25-15.75 -38.50-15.75q-24.50,0.00 -41.125,18.125t-16.125,42.375l0.00,3.00 q-26.75-3.50 -46.875-16.00t-39.125-34.75q-2.50-3.00 -7.00-3.00q-6.50,0.00 -10.25,12.625t-3.75,21.625q0.00,15.50 7.25,29.25 q-3.25,0.50 -5.375,2.875t-2.125,5.625q0.00,28.00 20.25,46.25q-3.00,2.00 -3.00,6.25q0.00,1.50 0.25,2.25q 3.75,12.75 12.625,22.875t 21.125,15.125q-19.25,10.75 -41.25,10.75q-2.00,0.00 -6.00-0.375t-5.75-0.375q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,4.25 3.50,6.50q 15.75,11.75 37.50,18.375t 42.50,6.625q 32.50,0.00 62.00-14.50q 41.50-19.75 64.00-58.125t 22.00-84.875l0.00-3.00 q 6.75-5.50 15.625-15.75t 8.875-15.25zM 384.00,104.00l0.00,240.00 q0.00,29.75 -21.125,50.875t-50.875,21.125l-240.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-240.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 240.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"bar-chart, chart, graph, plot\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 128.00,256.00l0.00,96.00 l-64.00,0.00 l0.00-96.00 l 64.00,0.00 zM 224.00,128.00l0.00,224.00 l-64.00,0.00 l0.00-224.00 l 64.00,0.00 zM 320.00,192.00l0.00,160.00 l-64.00,0.00 l0.00-160.00 l 64.00,0.00 zM 416.00,96.00l0.00,256.00 l-64.00,0.00 l0.00-256.00 l 64.00,0.00 zM 448.00,376.00l0.00-304.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,304.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625z M 480.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"resize-horizontal, arrow\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,6.50 -4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-32.00 l-256.00,0.00 l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,32.00 l 256.00,0.00 l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"resize-vertical, arrow\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 176.00,80.00q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 l0.00,256.00 l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 32.00,0.00 l0.00-256.00 l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"folder-open, category, directory\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 469.75,238.00q0.00,7.75 -7.75,16.50l-84.00,99.00q-10.75,12.75 -30.125,21.625t-35.875,8.875l-272.00,0.00 q-8.50,0.00 -15.125-3.25t-6.625-10.75q0.00-7.75 7.75-16.50l 84.00-99.00q 10.75-12.75 30.125-21.625t 35.875-8.875l 272.00,0.00 q 8.50,0.00 15.125,3.25t 6.625,10.75zM 384.00,152.00l0.00,40.00 l-208.00,0.00 q-23.50,0.00 -49.25,11.875t-41.00,29.875l-84.25,99.00l-1.25,1.50q0.00-1.00 -0.125-3.125 t-0.125-3.125l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 136.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"folder-close, category, directory\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,152.00l0.00,176.00 q0.00,23.00 -16.50,39.50t-39.50,16.50l-304.00,0.00 q-23.00,0.00 -39.50-16.50t-16.50-39.50l0.00-240.00 q0.00-23.00 16.50-39.50t 39.50-16.50l 80.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50l0.00,8.00 l 168.00,0.00 q 23.00,0.00 39.50,16.50t 16.50,39.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"shopping-cart, cart, ecommerce, store\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 160.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 384.00,384.00q0.00,13.25 -9.375,22.625t-22.625,9.375t-22.625-9.375t-9.375-22.625t 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 416.00,112.00l0.00,128.00 q0.00,6.00 -4.00,10.625t-10.25,5.375 l-261.00,30.50q 0.25,1.75 1.125,5.375t 1.50,6.625t 0.625,5.50q0.00,4.00 -6.00,16.00l 230.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-256.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-3.50 2.75-9.875t 7.375-14.875t 5.125-9.50l-44.25-205.75l-51.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 64.00,0.00 q 4.00,0.00 7.125,1.625t 5.00,3.875t 3.25,6.125t 1.875,6.625 t 1.375,7.375t 1.125,6.375l 300.25,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"retweet, loop, arrows\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 320.00,376.00q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-2.00,0.00 -3.375-0.50t-2.25-1.75t-1.375-2.00t-0.75-2.875t-0.25-2.875l0.00-3.25 l0.00-2.75 l0.00-40.00 l0.00-104.00 l-48.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-6.00 3.75-10.25l 80.00-96.00q 4.75-5.50 12.25-5.50t 12.25,5.50l 80.00,96.00q 3.75,4.25 3.75,10.25q0.00,6.50 -4.75,11.25t-11.25,4.75l-48.00,0.00 l0.00,96.00 l 144.00,0.00 q 4.00,0.00 6.25,2.75l 40.00,48.00q 1.75,2.75 1.75,5.25 zM 480.00,272.00q0.00,6.00 -3.75,10.25l-80.00,96.00q-5.00,5.75 -12.25,5.75t-12.25-5.75l-80.00-96.00q-3.75-4.25 -3.75-10.25q0.00-6.50 4.75-11.25t 11.25-4.75l 48.00,0.00 l0.00-96.00 l-144.00,0.00 q-4.00,0.00 -6.25-3.00l-40.00-48.00q-1.75-2.25 -1.75-5.00q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 2.00,0.00 3.375,0.50t 2.25,1.75t 1.375,2.00t 0.75,2.875t 0.25,2.875l0.00,3.25 l0.00,2.75 l0.00,40.00 l0.00,104.00 l 48.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"chevron-down, download, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,176.00q0.00,13.25 -9.25,22.50l-162.75,162.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-162.75-162.75q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 18.50-18.75q 9.75-9.25 22.75-9.25q 13.25,0.00 22.50,9.25l 121.50,121.50l 121.50-121.50q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 18.75,18.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"chevron-up, upload, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,304.00q0.00,13.25 -9.25,22.50l-18.75,18.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-121.50-121.25l-121.50,121.25q-9.00,9.50 -22.50,9.50t-22.50-9.50l-18.75-18.75q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 162.75-162.75q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 162.50,162.75q 9.50,9.50 9.50,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"magnet\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,208.00l0.00,32.00 q0.00,50.25 -24.625,90.50t-68.50,62.875t-98.875,22.625t-98.875-22.625t-68.50-62.875t-24.625-90.50l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,13.00 5.875,22.50t 13.375,14.25t 17.75,7.50t 16.00,3.25t 11.00,0.50t 11.00-0.50t 16.00-3.25t 17.75-7.50t 13.375-14.25t 5.875-22.50l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 128.00,48.00l0.00,96.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 384.00,48.00l0.00,96.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 96.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"comment, bubble, chat, talk\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,43.50 -30.00,80.375t-81.50,58.25t-112.50,21.375q-17.50,0.00 -36.25-2.00q-49.50,43.75 -115.00,60.50q-12.25,3.50 -28.50,5.50q-4.25,0.50 -7.625-2.25t-4.375-7.25l0.00-0.25 q-0.75-1.00 -0.125-3.00t 0.50-2.50t 1.125-2.375l 1.50-2.25t 1.75-2.125t 2.00-2.25q 1.75-2.00 7.75-8.625t 8.625-9.50t 7.75-9.875t 8.125-12.75t 6.75-14.75t 6.50-19.00q-39.25-22.25 -61.875-55.00t-22.625-70.25 q0.00-32.50 17.75-62.125t 47.75-51.125t 71.50-34.125t 87.00-12.625q 61.00,0.00 112.50,21.375t 81.50,58.25t 30.00,80.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"random, shuffle, order, media, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 166.50,120.25q-15.00,23.00 -34.25,68.25q-5.50-11.25 -9.25-18.125t-10.125-15.875t-12.75-14.125t-15.75-8.75t-20.375-3.625l-56.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 56.00,0.00 q 62.50,0.00 102.50,56.25zM 448.00,320.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q-8.00,0.00 -21.25,0.125t-20.25,0.25t-18.25-0.25 t-17.75-1.25t-16.00-2.625t-15.75-4.625t-14.50-7.125t-14.75-10.00t-13.75-13.375t-14.00-17.375q 14.75-23.25 34.00-68.25q 5.50,11.25 9.25,18.125t 10.125,15.875t 12.75,14.125t 15.75,8.75t 20.375,3.625l 64.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75zM 448.00,96.00q0.00,3.50 -2.25,5.75l-80.00,80.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625 l0.00-48.00 l-64.00,0.00 q-12.00,0.00 -21.75,3.75t-17.25,11.25t-12.75,15.375t-11.25,19.375q-8.00,15.50 -19.50,42.75q-7.25,16.50 -12.375,27.75t-13.50,26.25t-16.00,25.00t-18.50,20.75t-22.50,17.125t-26.625,10.50t-32.00,4.125l-56.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 56.00,0.00 q 12.00,0.00 21.75-3.75t 17.25-11.25t 12.75-15.375t 11.25-19.375q 8.00-15.50 19.50-42.75q 7.25-16.50 12.375-27.75 t 13.50-26.25t 16.00-25.00t 18.50-20.75t 22.50-17.125t 26.625-10.50t 32.00-4.125l 64.00,0.00 l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25q 3.00,0.00 6.00,2.50l 79.75,79.75q 2.25,2.25 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"calendar, date, schedule\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 32.00,416.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 120.00,416.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 32.00,328.00l 72.00,0.00 l0.00-80.00 l-72.00,0.00 l0.00,80.00 zM 120.00,328.00l 80.00,0.00 l0.00-80.00 l-80.00,0.00 l0.00,80.00 zM 32.00,232.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 216.00,416.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 120.00,232.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 312.00,416.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 216.00,328.00l 80.00,0.00 l0.00-80.00 l-80.00,0.00 l0.00,80.00 z M 128.00,112.00l0.00-72.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,72.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 312.00,328.00l 72.00,0.00 l0.00-80.00 l-72.00,0.00 l0.00,80.00 zM 216.00,232.00l 80.00,0.00 l0.00-72.00 l-80.00,0.00 l0.00,72.00 zM 312.00,232.00l 72.00,0.00 l0.00-72.00 l-72.00,0.00 l0.00,72.00 zM 320.00,112.00l0.00-72.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-16.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,72.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 16.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,96.00l0.00,320.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-352.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-320.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 16.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 96.00,0.00 l0.00-24.00 q0.00-16.50 11.75-28.25t 28.25-11.75 l 16.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25l0.00,24.00 l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"plane, airplane, aircraft, flight, vacation, travel\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 349.25,53.00q0.00,21.75 -37.25,59.00l-60.00,60.00l 35.75,186.50l 0.25,1.50q0.00,3.50 -2.25,5.75l-16.00,16.00q-2.25,2.25 -5.75,2.25q-5.25,0.00 -7.25-4.50l-68.50-143.75l-61.25,61.25q 17.00,59.50 17.00,63.00t-2.25,5.75l-16.00,16.00q-2.25,2.25 -5.75,2.25q-4.50,0.00 -7.00-4.00l-38.75-70.00l-70.00-38.75q-4.25-2.25 -4.25-7.00q0.00-3.50 2.25-5.75l 16.00-16.25q 2.25-2.25 5.75-2.25t 63.00,17.00l 61.25-61.25 l-143.75-68.50q-4.50-2.00 -4.50-7.25q0.00-3.50 2.25-5.75l 16.00-16.00q 2.25-2.25 5.75-2.25q 1.00,0.00 1.50,0.25l 186.50,35.75l 60.00-60.00q 37.25-37.25 59.00-37.25q 8.00,0.00 13.125,5.125t 5.125,13.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"warning-sign, sign\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 256.00,343.75l0.00-47.50 q0.00-3.50 -2.375-5.875t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.875l0.00,47.50 q0.00,3.50 2.375,5.875t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.875zM 255.50,250.25l 4.50-114.75q0.00-3.00 -2.50-4.75q-3.25-2.75 -6.00-2.75l-55.00,0.00 q-2.75,0.00 -6.00,2.75q-2.50,1.75 -2.50,5.25l 4.25,114.25q0.00,2.50 2.50,4.125t 6.00,1.625l 46.25,0.00 q 3.50,0.00 5.875-1.625t 2.625-4.125zM 252.00,16.75l 192.00,352.00q 8.75,15.75 -0.50,31.50q-4.25,7.25 -11.625,11.50t-15.875,4.25l-384.00,0.00 q-8.50,0.00 -15.875-4.25t-11.625-11.50q-9.25-15.75 -0.50-31.50l 192.00-352.00q 4.25-7.75 11.75-12.25t 16.25-4.50t 16.25,4.50t 11.75,12.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"eye-close, blocked, private\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 138.75,333.75l 19.50-35.25q-21.75-15.75 -34.00-39.75t-12.25-50.75q0.00-30.25 15.25-56.25q-57.25,29.25 -95.25,88.25q 41.75,64.50 106.75,93.75zM 236.00,144.00q0.00-5.00 -3.50-8.50t-8.50-3.50q-31.25,0.00 -53.625,22.375t-22.375,53.625q0.00,5.00 3.50,8.50t 8.50,3.50t 8.50-3.50t 3.50-8.50q0.00-21.50 15.25-36.75t 36.75-15.25q 5.00,0.00 8.50-3.50t 3.50-8.50zM 326.75,96.25q0.00,1.75 -0.25,2.25 q-26.25,47.00 -78.75,141.50t-79.00,141.75l-12.25,22.25q-2.50,4.00 -7.00,4.00q-3.00,0.00 -33.50-17.50q-4.00-2.50 -4.00-7.00q0.00-3.00 11.00-21.75q-35.75-16.25 -65.875-43.25t-52.125-61.25q-5.00-7.75 -5.00-17.25t 5.00-17.25q 38.25-58.75 95.00-92.75t 124.00-34.00q 22.25,0.00 45.00,4.25l 13.50-24.25q 2.50-4.00 7.00-4.00q 1.25,0.00 4.50,1.50t 7.75,3.875t 8.25,4.625t 7.875,4.625t 4.875,2.875 q 4.00,2.50 4.00,6.75zM 336.00,208.00q0.00,34.75 -19.75,63.375t-52.25,41.125l 70.00-125.50q 2.00,11.25 2.00,21.00zM 448.00,240.00q0.00,8.75 -5.00,17.25q-9.75,16.00 -27.25,36.25q-37.50,43.00 -86.875,66.75t-104.875,23.75l 18.50-33.00q 53.00-4.50 98.125-34.25t 75.375-76.75q-28.75-44.75 -70.50-73.50l 15.75-28.00q 23.75,16.00 45.625,38.25t 36.125,46.00q 5.00,8.50 5.00,17.25z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"eye-open, view, visit\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,240.00q-38.00-59.00 -95.25-88.25q 15.25,26.00 15.25,56.25q0.00,46.25 -32.875,79.125t-79.125,32.875t-79.125-32.875t-32.875-79.125q0.00-30.25 15.25-56.25q-57.25,29.25 -95.25,88.25q 33.25,51.25 83.375,81.625t 108.625,30.375t 108.625-30.375t 83.375-81.625zM 236.00,144.00q0.00-5.00 -3.50-8.50t-8.50-3.50q-31.25,0.00 -53.625,22.375 t-22.375,53.625q0.00,5.00 3.50,8.50t 8.50,3.50t 8.50-3.50t 3.50-8.50q0.00-21.50 15.25-36.75t 36.75-15.25q 5.00,0.00 8.50-3.50t 3.50-8.50zM 448.00,240.00q0.00,8.50 -5.00,17.25q-35.00,57.50 -94.125,92.125t-124.875,34.625t-124.875-34.75t-94.125-92.00q-5.00-8.75 -5.00-17.25t 5.00-17.25q 35.00-57.25 94.125-92.00t 124.875-34.75t 124.875,34.75t 94.125,92.00q 5.00,8.75 5.00,17.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"fire, hot\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,424.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,160.00q0.00,19.50 -6.125,36.00t-16.00,28.125t-21.875,22.00t-24.00,19.375t-21.875,18.00t-16.00,20.375t-6.125,24.125q0.00,24.00 16.75,56.00l-1.00-0.25l 0.25,0.25 q-22.50-10.25 -40.00-20.75t-34.625-25.00t-28.375-30.625t-18.125-37.625t-6.875-46.00q0.00-19.50 6.125-36.00t 16.00-28.125t 21.875-22.00t 24.00-19.375t 21.875-18.00t 16.00-20.375t 6.125-24.125q0.00-23.50 -16.50-56.00l 0.75,0.25l-0.25-0.25q 22.50,10.25 40.00,20.75t 34.625,25.00t 28.375,30.625t 18.125,37.625t 6.875,46.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"leaf, nature, green\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 320.00,176.00q0.00-6.50 -4.75-11.25t-11.25-4.75q-43.00,0.00 -79.50,12.375t-64.875,33.50t-58.875,54.875q-4.75,5.25 -4.75,11.25q0.00,6.50 4.75,11.25t 11.25,4.75q 6.00,0.00 11.25-4.75q 6.75-6.00 18.50-17.75t 16.75-16.50q 34.25-31.00 67.125-44.00t 78.375-13.00q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,126.50q0.00,23.75 -5.00,48.25q-11.50,56.00 -46.125,95.75t-89.375,67.00 q-53.50,27.00 -109.50,27.00q-37.00,0.00 -71.50-11.75q-3.75-1.25 -22.00-10.50t-24.00-9.25q-4.00,0.00 -9.875,8.00t-11.25,17.50t-13.125,17.50t-15.00,8.00q-7.50,0.00 -12.75-2.75t-7.75-6.00t-6.75-10.50q-0.50-1.00 -1.50-2.75t-1.375-2.50t-0.75-2.375t-0.375-3.375q0.00-8.75 7.75-18.375t 17.00-16.375t 17.00-14.00t 7.75-12.00q0.00-1.00 -3.50-9.50t-4.00-11.00q-2.25-12.75 -2.25-26.00q0.00-28.75 10.875-55.00t 29.75-46.125 t 42.625-34.75t 51.00-23.875q 13.75-4.50 36.25-6.375t 44.875-2.25t 44.625-1.50t 40.875-6.00t 28.375-14.125l 7.375-7.375t 7.375-7.00t 6.75-5.00t 9.125-4.00t 10.875-1.125q 9.75,0.00 17.625,11.50t 11.875,28.00t 6.00,31.00t 2.00,24.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"gift, present, birthday, holiday\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 232.00,339.00l0.00-179.00 l-80.00,0.00 l0.00,179.00 q0.00,6.25 4.625,9.625t 11.375,3.375l 48.00,0.00 q 6.75,0.00 11.375-3.375t 4.625-9.625zM 118.00,128.00l 48.75,0.00 l-31.50-40.25q-6.00-7.75 -17.25-7.75q-10.00,0.00 -17.00,7.00t-7.00,17.00t 7.00,17.00t 17.00,7.00zM 290.00,104.00q0.00-10.00 -7.00-17.00t-17.00-7.00q-11.25,0.00 -17.25,7.75l-31.25,40.25l 48.50,0.00 q 10.00,0.00 17.00-7.00t 7.00-17.00zM 384.00,168.00l0.00,80.00 q0.00,3.50 -2.50,5.50t-6.75,2.625t-8.00,0.625t-8.625-0.375t-6.125-0.375l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 q-1.25,0.00 -6.125,0.375t-8.625,0.375t-8.00-0.625t-6.75-2.625t-2.50-5.50l0.00-80.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 110.00,0.00 q-23.25,0.00 -39.625-16.375t-16.375-39.625t 16.375-39.625t 39.625-16.375 q 27.00,0.00 42.00,19.25l 32.00,41.25l 32.00-41.25q 15.00-19.25 42.00-19.25q 23.25,0.00 39.625,16.375t 16.375,39.625t-16.375,39.625t-39.625,16.375l 110.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"exclamation-sign, sign, notification, attention, warning\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 224.00,343.75l0.00-47.50 q0.00-3.50 -2.25-5.875t-5.50-2.375l-48.00,0.00 q-3.25,0.00 -5.75,2.50t-2.50,5.75l0.00,47.50 q0.00,3.25 2.50,5.75t 5.75,2.50l 48.00,0.00 q 3.25,0.00 5.50-2.375t 2.25-5.875zM 223.50,257.75l 4.50-155.25q0.00-3.00 -2.50-4.50q-2.50-2.00 -6.00-2.00l-55.00,0.00 q-3.50,0.00 -6.00,2.00q-2.50,1.50 -2.50,4.50l 4.25,155.25q0.00,2.50 2.50,4.375t 6.00,1.875l 46.25,0.00 q 3.50,0.00 5.875-1.875t 2.625-4.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"asterisk, star\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 370.50,262.50q 11.50,6.50 14.875,19.375t-3.125,24.375l-16.00,27.50q-6.50,11.50 -19.375,14.875t-24.375-3.125l-66.50-38.25l0.00,76.75 q0.00,13.00 -9.50,22.50t-22.50,9.50l-32.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-76.75 l-66.50,38.25q-11.50,6.50 -24.375,3.125t-19.375-14.875l-16.00-27.50q-6.50-11.50 -3.125-24.375t 14.875-19.375l 66.50-38.50l-66.50-38.50 q-11.50-6.50 -14.875-19.375t 3.125-24.375l 16.00-27.50q 6.50-11.50 19.375-14.875t 24.375,3.125l 66.50,38.25l0.00-76.75 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,76.75 l 66.50-38.25q 11.50-6.50 24.375-3.125t 19.375,14.875l 16.00,27.50q 6.50,11.50 3.125,24.375t-14.875,19.375l-66.50,38.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"minus, remove, delete, subtract\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-304.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 304.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"plus, add, sum\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-104.00,0.00 l0.00,104.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-48.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 104.00,0.00 l0.00-104.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 48.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00l0.00,104.00 l 104.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"resize-small, contract, collapse\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,240.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-36.00-36.00l-83.00,83.00q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 83.00-83.00l-36.00-36.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 380.75,72.00q0.00,3.25 -2.50,5.75l-83.00,83.00l 36.00,36.00q 4.75,4.75 4.75,11.25t-4.75,11.25 t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 36.00,36.00l 83.00-83.00q 2.50-2.50 5.75-2.50t 5.75,2.50l 28.50,28.50q 2.50,2.50 2.50,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"resize-full, expand, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 188.75,264.00q0.00,3.25 -2.50,5.75l-83.00,83.00l 36.00,36.00q 4.75,4.75 4.75,11.25t-4.75,11.25t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 36.00,36.00l 83.00-83.00q 2.50-2.50 5.75-2.50t 5.75,2.50l 28.50,28.50q 2.50,2.50 2.50,5.75zM 384.00,48.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-36.00-36.00l-83.00,83.00 q-2.50,2.50 -5.75,2.50t-5.75-2.50l-28.50-28.50q-2.50-2.50 -2.50-5.75t 2.50-5.75l 83.00-83.00l-36.00-36.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"share-alt, arrow, forward\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,160.00q0.00,6.50 -4.75,11.25l-128.00,128.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-64.00 l-56.00,0.00 q-24.50,0.00 -43.875,1.50t-38.50,5.375t-33.25,10.625t-26.375,17.375t-20.00,25.25t-12.125,34.625t-4.375,45.25q0.00,13.75 1.25,30.75q0.00,1.50 0.625,5.875t 0.625,6.625q0.00,3.75 -2.125,6.25t-5.875,2.50q-4.00,0.00 -7.00-4.25q-1.75-2.25 -3.25-5.50 t-3.375-7.50t-2.625-6.00q-31.75-71.25 -31.75-112.75q0.00-49.75 13.25-83.25q 40.50-100.75 218.75-100.75l 56.00,0.00 l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 128.00,128.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"arrow-down, download, bottom\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,208.00q0.00,13.25 -9.25,22.50l-162.75,163.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-162.75-163.00q-9.50-9.00 -9.50-22.50q0.00-13.25 9.50-22.75l 18.50-18.75q 9.75-9.25 22.75-9.25q 13.25,0.00 22.50,9.25l 73.50,73.50l0.00-176.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 32.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50l0.00,176.00 l 73.50-73.50q 9.25-9.25 22.50-9.25q 13.00,0.00 22.75,9.25l 18.75,18.75q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"arrow-up, upload, top\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 402.75,242.75q0.00,12.75 -9.25,22.50l-18.75,18.75q-9.50,9.50 -22.75,9.50q-13.50,0.00 -22.50-9.50l-73.50-73.25l0.00,176.00 q0.00,13.00 -9.375,21.125t-22.625,8.125l-32.00,0.00 q-13.25,0.00 -22.625-8.125t-9.375-21.125l0.00-176.00 l-73.50,73.25q-9.00,9.50 -22.50,9.50t-22.50-9.50l-18.75-18.75q-9.50-9.50 -9.50-22.50q0.00-13.25 9.50-22.75l 162.75-162.75q 8.75-9.25 22.50-9.25q 13.50,0.00 22.75,9.25l 162.75,162.75 q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"arrow-right, next, right\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 368.00,240.00q0.00,13.50 -9.25,22.75l-162.75,162.75q-9.75,9.25 -22.75,9.25q-12.75,0.00 -22.50-9.25l-18.75-18.75q-9.50-9.50 -9.50-22.75t 9.50-22.75l 73.25-73.25l-176.00,0.00 q-13.00,0.00 -21.125-9.375t-8.125-22.625l0.00-32.00 q0.00-13.25 8.125-22.625t 21.125-9.375l 176.00,0.00 l-73.25-73.50q-9.50-9.00 -9.50-22.50t 9.50-22.50l 18.75-18.75q 9.50-9.50 22.50-9.50q 13.25,0.00 22.75,9.50l 162.75,162.75q 9.25,8.75 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"arrow-left, previous, left\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00l0.00,32.00 q0.00,13.25 -8.125,22.625t-21.125,9.375l-176.00,0.00 l 73.25,73.50q 9.50,9.00 9.50,22.50t-9.50,22.50l-18.75,19.00q-9.25,9.25 -22.50,9.25q-13.00,0.00 -22.75-9.25l-162.75-163.00q-9.25-9.25 -9.25-22.50q0.00-13.00 9.25-22.75l 162.75-162.50q 9.50-9.50 22.75-9.50q 13.00,0.00 22.50,9.50l 18.75,18.50q 9.50,9.50 9.50,22.75t-9.50,22.75l-73.25,73.25l 176.00,0.00 q 13.00,0.00 21.125,9.375 t 8.125,22.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ban-circle, block, forbidden\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 320.00,224.00q0.00-34.75 -17.75-65.00l-175.25,175.25q 30.25,17.75 65.00,17.75q 26.00,0.00 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 81.75,289.00l 175.25-175.25q-30.25-17.75 -65.00-17.75q-26.00,0.00 -49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625q0.00,34.75 17.75,65.00zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ok-circle, correct, tick, checkmark\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 297.25,192.00q0.00,6.75 -4.50,11.25l-80.00,80.00l-25.50,25.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-25.50-25.50l-48.00-48.00q-4.50-4.50 -4.50-11.25t 4.50-11.25l 25.50-25.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 36.75,36.75l 68.75-68.75q 4.50-4.50 11.25-4.50t 11.25,4.50l 25.50,25.50q 4.50,4.50 4.50,11.25zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375 t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"remove-circle, cancel, close, remove, delete\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 281.25,272.00q0.00,6.75 -4.50,11.25l-25.50,25.50q-4.50,4.50 -11.25,4.50t-11.25-4.50l-36.75-36.75l-36.75,36.75q-4.50,4.50 -11.25,4.50t-11.25-4.50l-25.50-25.50q-4.50-4.50 -4.50-11.25t 4.50-11.25l 36.75-36.75l-36.75-36.75q-4.50-4.50 -4.50-11.25t 4.50-11.25l 25.50-25.50q 4.50-4.50 11.25-4.50t 11.25,4.50l 36.75,36.75l 36.75-36.75q 4.50-4.50 11.25-4.50t 11.25,4.50l 25.50,25.50q 4.50,4.50 4.50,11.25 t-4.50,11.25l-36.75,36.75l 36.75,36.75q 4.50,4.50 4.50,11.25zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875 t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"screenshot, target, goal, spot\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 299.25,256.00l-27.25,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 27.25,0.00 q-8.00-27.00 -28.125-47.125t-47.125-28.125l0.00,27.25 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-27.25 q-27.00,8.00 -47.125,28.125t-28.125,47.125l 27.25,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-27.25,0.00 q 8.00,27.00 28.125,47.125t 47.125,28.125l0.00-27.25 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,27.25 q 27.00-8.00 47.125-28.125t 28.125-47.125zM 384.00,208.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-35.75,0.00 q-9.25,40.25 -38.625,69.625t-69.625,38.625l0.00,35.75 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-35.75 q-40.25-9.25 -69.625-38.625t-38.625-69.625l-35.75,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 35.75,0.00 q 9.25-40.25 38.625-69.625t 69.625-38.625l0.00-35.75 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,35.75 q 40.25,9.25 69.625,38.625t 38.625,69.625l 35.75,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"info-sign, information, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,344.00l0.00-16.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-24.00,0.00 l0.00-120.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-80.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 24.00,0.00 l0.00,96.00 l-24.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,16.00 q0.00,3.50 2.25,5.75t 5.75,2.25l 112.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 224.00,152.00l0.00-48.00 q0.00-3.50 -2.25-5.75t-5.75-2.25l-48.00,0.00 q-3.50,0.00 -5.75,2.25t-2.25,5.75l0.00,48.00 q0.00,3.50 2.25,5.75 t 5.75,2.25l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"question-sign, help, support, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 224.00,344.00l0.00-48.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-48.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,48.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 48.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 288.00,176.00q0.00-24.25 -14.625-43.00t-36.125-27.875t-45.25-9.125t-45.25,9.125t-36.125,27.875t-14.625,43.00l0.00,2.75 l0.00,3.25 t 0.25,2.875t 0.75,2.875t 1.375,2.00t 2.25,1.75 t 3.375,0.50l 48.00,0.00 q 3.50,0.00 5.75-2.25t 2.25-5.75q0.00-3.00 2.75-6.75q 4.75-7.75 12.625-12.50t 16.625-4.75q 9.75,0.00 20.75,5.375t 11.00,14.375q0.00,8.25 -6.625,14.50t-15.875,11.00t-18.625,10.375t-16.00,15.875t-6.625,24.50l0.00,2.75 l0.00,3.25 t 0.25,2.875t 0.75,2.875t 1.375,2.00t 2.25,1.75t 3.375,0.50l 48.00,0.00 q 4.25,0.00 6.00-2.625t 2.00-6.125t 3.375-8.25t 9.375-8.00q 15.00-8.25 17.50-9.75q 15.50-11.00 24.625-27.00 t 9.125-34.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"ok-sign, checkmark, tick, correct, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 321.00,183.50q0.00-7.00 -4.50-11.50l-22.75-22.50q-4.75-4.75 -11.25-4.75t-11.25,4.75l-102.00,101.75l-56.50-56.50q-4.75-4.75 -11.25-4.75t-11.25,4.75l-22.75,22.50q-4.50,4.50 -4.50,11.50q0.00,6.75 4.50,11.25l 90.50,90.50q 4.75,4.75 11.25,4.75q 6.75,0.00 11.50-4.75l 135.75-135.75q 4.50-4.50 4.50-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75 t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"remove-sign, cancel, remove, delete, close, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 287.25,280.50q0.00-6.50 -4.75-11.25l-45.25-45.25l 45.25-45.25q 4.75-4.75 4.75-11.25q0.00-6.75 -4.75-11.50l-22.50-22.50q-4.75-4.75 -11.50-4.75q-6.50,0.00 -11.25,4.75l-45.25,45.25l-45.25-45.25q-4.75-4.75 -11.25-4.75q-6.75,0.00 -11.50,4.75l-22.50,22.50q-4.75,4.75 -4.75,11.50q0.00,6.50 4.75,11.25l 45.25,45.25l-45.25,45.25q-4.75,4.75 -4.75,11.25q0.00,6.75 4.75,11.50l 22.50,22.50q 4.75,4.75 11.50,4.75 q 6.50,0.00 11.25-4.75l 45.25-45.25l 45.25,45.25q 4.75,4.75 11.25,4.75q 6.75,0.00 11.50-4.75l 22.50-22.50q 4.75-4.75 4.75-11.50zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"minus-sign, remove, delete, subtract, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 304.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875 t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"plus-sign, add, sum, sign\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 304.00,240.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-64.00,0.00 l0.00-64.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,64.00 l-64.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 64.00,0.00 l0.00,64.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25l0.00-64.00 l 64.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 384.00,224.00q0.00,52.25 -25.75,96.375 t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"chevron-right, right, arrow-right, next\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 274.75,208.00q0.00,13.00 -9.25,22.75l-163.00,162.75q-9.25,9.25 -22.50,9.25t-22.50-9.25l-19.00-18.75q-9.25-9.75 -9.25-22.75q0.00-13.25 9.25-22.50l 121.50-121.50l-121.50-121.25q-9.25-9.75 -9.25-22.75q0.00-13.25 9.25-22.50l 19.00-18.75q 9.00-9.50 22.50-9.50t 22.50,9.50l 163.00,162.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"chevron-left, arrow-left, left, previous\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 185.50,393.25l-163.00-162.75q-9.25-9.25 -9.25-22.625t 9.25-22.625l 163.00-162.75q 9.25-9.25 22.625-9.25t 22.625,9.25l 18.75,18.75q 9.25,9.25 9.25,22.625t-9.25,22.625l-121.50,121.50l 121.50,121.25q 9.25,9.50 9.25,22.75t-9.25,22.50l-18.75,18.75q-9.25,9.25 -22.625,9.25t-22.625-9.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"eject, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 3.50,244.75l 177.50-177.50q 4.75-4.75 11.25-4.75t 11.25,4.75l 177.50,177.50q 4.75,4.75 3.25,8.00t-8.00,3.25l-368.00,0.00 q-6.50,0.00 -8.00-3.25t 3.25-8.00zM 368.25,384.00l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-64.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,64.00 q0.00,6.50 -4.75,11.25t-11.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"step-forward, forward, next, media, control\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-169.50 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-169.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"fast-forward, forward, next, media, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-177.50 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-169.50 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-169.50 q-1.25,2.50 -3.25,4.75l-177.50,177.50 q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-177.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"forward, next, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 11.25,412.75q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-368.00 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 2.00,2.00 3.25,4.75l0.00-177.50 q0.00-6.50 3.25-8.00t 8.00,3.25l 177.50,177.50q 4.75,4.75 4.75,11.25t-4.75,11.25l-177.50,177.50q-4.75,4.75 -8.00,3.25t-3.25-8.00l0.00-177.50 q-1.25,2.50 -3.25,4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"stop, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pause, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 160.00,48.00l0.00,352.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-128.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 128.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"play, media, control\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 346.00,231.75l-332.00,184.50q-5.75,3.25 -9.875,0.75t-4.125-9.00l0.00-368.00 q0.00-6.50 4.125-9.00t 9.875,0.75l 332.00,184.50q 5.75,3.25 5.75,7.75t-5.75,7.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"backward, previous, back, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 404.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.00-2.25 -3.25-4.75l0.00,177.50 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-4.75-4.75 -4.75-11.25t 4.75-11.25l 177.50-177.50q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,177.50 q 1.25-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"fast-backward, first, previous, control\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 436.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,177.50 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,169.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,169.50 q 1.00-2.75 3.25-4.75l 177.50-177.50 q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,177.50 q 1.00-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"step-backward, previous, control\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 244.75,35.25q 4.75-4.75 8.00-3.25t 3.25,8.00l0.00,368.00 q0.00,6.50 -3.25,8.00t-8.00-3.25l-177.50-177.50q-2.25-2.25 -3.25-4.75l0.00,169.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-352.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,169.50 q 1.00-2.75 3.25-4.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"move, arrows\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,224.00q0.00,6.50 -4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-32.00 l-96.00,0.00 l0.00,96.00 l 32.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-64.00,64.00q-4.75,4.75 -11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25t 4.75-11.25t 11.25-4.75l 32.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-64.00-64.00q-4.75-4.75 -4.75-11.25 t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25l0.00,32.00 l 96.00,0.00 l0.00-96.00 l-32.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 64.00-64.00q 4.75-4.75 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25t-4.75,11.25t-11.25,4.75l-32.00,0.00 l0.00,96.00 l 96.00,0.00 l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75t 11.25,4.75l 64.00,64.00q 4.75,4.75 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"check, checkbox, correct, tick\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,232.50l0.00,79.50 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 15.75,0.00 29.25,6.25q 3.75,1.75 4.50,5.75q 0.75,4.25 -2.25,7.25l-12.25,12.25q-2.50,2.50 -5.75,2.50q-0.75,0.00 -2.25-0.50q-5.75-1.50 -11.25-1.50l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-63.50 q0.00-3.25 2.25-5.50l 16.00-16.00q 2.50-2.50 5.75-2.50q 1.50,0.00 3.00,0.75q 5.00,2.00 5.00,7.25zM 409.75,110.25l-203.50,203.50q-6.00,6.00 -14.25,6.00t-14.25-6.00l-107.50-107.50q-6.00-6.00 -6.00-14.25t 6.00-14.25l 27.50-27.50q 6.00-6.00 14.25-6.00t 14.25,6.00l 65.75,65.75l 161.75-161.75q 6.00-6.00 14.25-6.00t 14.25,6.00l 27.50,27.50 q 6.00,6.00 6.00,14.25t-6.00,14.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"share\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,247.25l0.00,64.75 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 63.75,0.00 l0.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625q0.00,6.75 -6.50,8.00q-19.25,6.50 -33.25,15.00q-2.50,1.00 -4.00,1.00l-28.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-53.50 q0.00-4.75 4.50-7.25q 7.00-3.25 13.50-9.25q 4.00-4.00 8.75-2.00q 5.25,2.25 5.25,7.25zM 411.25,123.25l-96.00,96.00q-4.50,4.75 -11.25,4.75q-3.00,0.00 -6.25-1.25q-9.75-4.25 -9.75-14.75l0.00-48.00 l-40.00,0.00 q-80.75,0.00 -109.50,32.75q-29.75,34.25 -18.50,118.25q 0.75,5.75 -5.00,8.50q-2.00,0.50 -3.00,0.50q-4.00,0.00 -6.50-3.25q-2.50-3.50 -5.25-7.75t-9.875-17.125t-12.375-24.875 t-9.625-28.50t-4.375-30.50q0.00-12.25 0.875-22.75t 3.50-22.50t 7.00-22.00t 11.75-20.375t 17.125-18.50t 23.625-15.375t 31.125-12.125t 39.875-7.625t 49.125-2.75l 40.00,0.00 l0.00-48.00 q0.00-10.50 9.75-14.75q 3.25-1.25 6.25-1.25q 6.50,0.00 11.25,4.75l 96.00,96.00q 4.75,4.75 4.75,11.25t-4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"edit, write, blog\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 222.00,296.00l 29.00-29.00l-38.00-38.00l-29.00,29.00l0.00,14.00 l 24.00,0.00 l0.00,24.00 l 14.00,0.00 zM 332.00,116.00q-4.00-4.00 -8.25,0.25l-87.50,87.50q-4.25,4.25 -0.25,8.25t 8.25-0.25l 87.50-87.50q 4.25-4.25 0.25-8.25zM 352.00,264.50l0.00,47.50 q0.00,29.75 -21.125,50.875t-50.875,21.125l-208.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-208.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 208.00,0.00 q 15.75,0.00 29.25,6.25q 3.75,1.75 4.50,5.75q 0.75,4.25 -2.25,7.25l-12.25,12.25q-3.50,3.50 -8.00,2.00q-5.75-1.50 -11.25-1.50l-208.00,0.00 q-16.50,0.00 -28.25,11.75t-11.75,28.25l0.00,208.00 q0.00,16.50 11.75,28.25t 28.25,11.75l 208.00,0.00 q 16.50,0.00 28.25-11.75t 11.75-28.25l0.00-31.50 q0.00-3.25 2.25-5.50l 16.00-16.00q 3.75-3.75 8.75-1.75t 5.00,7.25zM 328.00,80.00l 72.00,72.00l-168.00,168.00l-72.00,0.00 l0.00-72.00 zM 439.00,113.00l-23.00,23.00 l-72.00-72.00l 23.00-23.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 38.00,38.00q 7.00,7.00 7.00,17.00t-7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"tint, droplet, water, color\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 128.00,288.00q0.00-9.00 -5.00-17.25q-0.25-0.25 -3.875-5.625t-6.375-9.50t-6.25-11.00t-5.25-12.625q-1.00-4.00 -5.25-4.00t-5.25,4.00q-1.75,5.75 -5.25,12.625t-6.25,11.00t-6.375,9.50t-3.875,5.625q-5.00,8.25 -5.00,17.25q0.00,13.25 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 256.00,256.00q0.00,53.00 -37.50,90.50t-90.50,37.50t-90.50-37.50t-37.50-90.50 q0.00-36.25 20.25-68.75q 1.50-2.25 15.625-22.625t 25.25-37.75t 24.875-44.50t 20.75-50.375q 2.25-7.50 8.50-11.75t 12.75-4.25t 12.875,4.25t 8.375,11.75q 7.00,23.25 20.75,50.375t 24.875,44.50t 25.25,37.75t 15.625,22.625q 20.25,31.75 20.25,68.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"adjust, contrast\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,32.00q 52.25,0.00 96.375,25.75t 69.875,69.875t 25.75,96.375t-25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75zM 64.00,224.00q0.00,26.00 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125l0.00-256.00 q-26.00,0.00 -49.625,10.125 t-40.875,27.375t-27.375,40.875t-10.125,49.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"map-marker, location, marker\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 192.00,160.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 256.00,160.00q0.00,27.25 -8.25,44.75l-91.00,193.50q-4.00,8.25 -11.875,13.00t-16.875,4.75t-16.875-4.75t-11.625-13.00l-91.25-193.50q-8.25-17.50 -8.25-44.75q0.00-53.00 37.50-90.50t 90.50-37.50t 90.50,37.50t 37.50,90.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"pencil, write, edit, blog\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 90.75,384.00l 22.75-22.75l-58.75-58.75l-22.75,22.75l0.00,26.75 l 32.00,0.00 l0.00,32.00 l 26.75,0.00 zM 221.50,152.00q0.00-5.50 -5.50-5.50q-2.50,0.00 -4.25,1.75l-135.50,135.50q-1.75,1.75 -1.75,4.25q0.00,5.50 5.50,5.50q 2.50,0.00 4.25-1.75l 135.50-135.50q 1.75-1.75 1.75-4.25zM 208.00,104.00l 104.00,104.00l-208.00,208.00l-104.00,0.00 l0.00-104.00 zM 378.75,128.00q0.00,13.25 -9.25,22.50l-41.50,41.50l-104.00-104.00l 41.50-41.25q 9.00-9.50 22.50-9.50 q 13.25,0.00 22.75,9.50l 58.75,58.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"picture, image, photo\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 160.00,144.00q0.00,20.00 -14.00,34.00t-34.00,14.00t-34.00-14.00t-14.00-34.00t 14.00-34.00t 34.00-14.00t 34.00,14.00t 14.00,34.00zM 416.00,240.00l0.00,112.00 l-352.00,0.00 l0.00-48.00 l 80.00-80.00l 40.00,40.00l 128.00-128.00zM 440.00,64.00l-400.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,304.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 400.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625l0.00-304.00 q0.00-3.25 -2.375-5.625t-5.625-2.375zM 480.00,72.00l0.00,304.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-304.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"facetime-video, video, movie, camera, film\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 475.00,64.50q 5.00,2.00 5.00,7.50l0.00,304.00 q0.00,5.50 -5.00,7.50q-2.00,0.50 -3.00,0.50q-3.00,0.00 -5.75-2.25l-146.25-146.50l0.00,76.75 q0.00,29.75 -21.125,50.875t-50.875,21.125l-176.00,0.00 q-29.75,0.00 -50.875-21.125t-21.125-50.875l0.00-176.00 q0.00-29.75 21.125-50.875t 50.875-21.125l 176.00,0.00 q 29.75,0.00 50.875,21.125t 21.125,50.875l0.00,76.75 l 146.25-146.50q 4.00-3.75 8.75-1.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"indent-right\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 88.00,208.00q0.00,3.50 -2.25,5.75l-72.00,72.00q-2.25,2.25 -5.75,2.25q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-144.00 q0.00-3.25 2.375-5.625t 5.625-2.375q 3.50,0.00 5.75,2.25l 72.00,72.00q 2.25,2.25 2.25,5.75zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"indent-left\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,136.00l0.00,144.00 q0.00,3.25 -2.375,5.625t-5.625,2.375q-3.50,0.00 -5.75-2.25l-72.00-72.00q-2.25-2.25 -2.25-5.75t 2.25-5.75l 72.00-72.00q 2.25-2.25 5.75-2.25q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-272.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 272.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-432.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 432.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list, menu\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 64.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 64.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,328.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 64.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,232.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625 t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,136.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 448.00,40.00l0.00,48.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-336.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-48.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 336.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-justify, justify, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-right, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-384.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 384.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 448.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-288.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-center, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 352.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 224.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 416.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75 l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 352.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 320.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-160.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 160.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"align-left, paragraph, editor, format\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 448.00,336.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-416.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 416.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 352.00,240.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-320.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 320.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 416.00,144.00l0.00,32.00 q0.00,6.50 -4.75,11.25 t-11.25,4.75l-384.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 384.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25zM 320.00,48.00l0.00,32.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-288.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-32.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 288.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"text-width, format, text\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 20.25,32.25l 13.50,6.75q 5.00,1.25 52.75,1.25l 32.50,0.00 l 4.75-0.75l 28.75-0.25l 111.50,0.25l 79.50,0.00 l 8.50,0.50q 3.50,0.25 7.00-1.75t 5.25-4.00l 1.75-2.00l 10.50-0.25q 3.75,0.00 7.00,0.25l0.00,26.125 t 0.25,32.875l 0.25,25.00l-0.25,14.50q0.00,8.00 -1.00,12.75q-9.75,3.75 -17.00,4.50q-6.25-10.75 -13.50-32.00q-2.00-6.00 -3.875-15.625t-2.875-16.375t-1.50-7.25q-3.25-3.75 -6.75-4.75q-1.75-0.50 -14.625-0.50t-34.625,0.25t-32.00,0.25 q-23.50,0.00 -31.75,1.25q-2.50,24.25 -2.00,34.00l 0.25,38.00l0.00-13.00 l 0.75,89.75l-0.25,36.75q-0.25,11.50 2.75,21.25q 12.25,6.25 22.25,8.00q 0.50,0.00 4.50,1.25t 11.00,3.25t 10.75,3.00q 7.50,2.00 12.50,4.50q 1.25,11.25 1.25,12.50q0.00,2.50 -0.75,7.25q-3.50,0.25 -8.50,0.25q-27.50,0.00 -46.75-2.50q-18.00-2.00 -59.50-2.00q-20.50,0.00 -58.25,3.25q-11.25,1.25 -17.50,1.25q-0.50-5.50 -0.50-6.50l-0.25-6.50l0.00-2.25 q 5.25-8.25 19.75-12.25 q 34.75-9.50 39.75-12.50q 2.25-5.25 3.00-14.00q 1.50-34.25 1.50-108.25l-1.25-11.00q0.00-66.25 -0.50-69.50q-0.50-2.75 -1.50-3.75q-1.50-1.25 -3.50-1.50q-9.50-1.50 -37.00-1.50q-12.50,0.00 -42.125,3.50t-33.125,6.00q-3.25,2.25 -5.50,8.25t-5.50,18.75t-6.00,21.00q-1.50,4.75 -4.875,8.00t-5.125,3.25q-11.00-6.75 -14.00-11.00l0.00-74.25 l0.00-21.50 zM 376.25,355.75q 6.50,5.00 6.50,12.25t-6.50,12.25l-40.50,31.50 q-6.50,5.00 -11.125,2.75t-4.625-10.50l0.00-20.00 l-256.00,0.00 l0.00,20.00 q0.00,8.25 -4.625,10.50t-11.125-2.75l-40.50-31.50q-6.50-5.00 -6.50-12.25t 6.50-12.25l 40.50-31.50q 6.50-5.00 11.125-2.75t 4.625,10.50l0.00,20.00 l 256.00,0.00 l0.00-20.00 q0.00-8.25 4.625-10.50t 11.125,2.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"text-height, format, editor\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 20.25,32.25l 13.50,6.75q 5.00,1.25 52.75,1.25l 32.50,0.00 l 4.75-0.75l 28.75-0.25l 53.75,0.25l 73.25,0.00 l 8.50,0.50q 3.50,0.25 7.00-1.75t 5.25-4.00l 1.75-2.00l 10.50-0.25q 3.75,0.00 7.00,0.25l0.00,26.125 t 0.25,32.875l 0.25,25.00l-0.25,14.50q0.00,8.00 -1.00,12.75q-9.75,3.75 -17.00,4.50q-6.25-10.75 -13.50-32.00q-2.00-6.00 -3.875-15.625t-2.875-16.375t-1.50-7.25q-3.25-3.75 -6.75-4.75q-1.75-0.50 -10.625-0.50t-25.875,0.25t-27.75,0.25 q-8.50,0.00 -16.75,1.25q-2.50,24.25 -2.00,34.00l 0.25,38.00l0.00,83.00 l 0.75,89.75l-0.25,36.75q-0.25,11.50 2.75,21.25q 12.25,6.25 22.25,8.00q 0.50,0.00 4.50,1.25t 11.00,3.25t 10.75,3.00q 7.50,2.00 12.50,4.50q 1.25,11.25 1.25,12.50q0.00,2.50 -0.75,7.25q-3.50,0.25 -8.50,0.25q-27.50,0.00 -46.75-2.50q-18.00-2.00 -59.50-2.00q-22.00,0.00 -58.25,3.50q-12.00,1.00 -17.50,1.00q-0.50-5.50 -0.50-6.50l-0.25-6.50l0.00-2.25 q 5.25-8.25 19.75-12.25 q 34.75-9.50 39.75-12.50q 2.25-5.25 3.00-14.00q 2.00-48.00 1.50-108.25l-1.25-107.00q-0.25-15.50 -0.125-29.625t 0.125-25.625t-0.50-14.25t-1.50-3.75q-1.50-1.25 -3.50-1.50q-9.50-1.50 -37.00-1.50q-10.75,0.00 -25.00,3.375t-18.25,6.125q-3.25,2.25 -5.50,8.25t-5.50,18.75t-6.00,21.00q-1.50,4.75 -4.875,8.00t-5.125,3.25q-11.00-6.75 -14.00-11.00l0.00-74.25 l0.00-21.50 zM 436.00,352.00q 8.25,0.00 10.50,4.625t-2.75,11.125 l-31.50,40.50q-5.00,6.50 -12.25,6.50t-12.25-6.50l-31.50-40.50q-5.00-6.50 -2.75-11.125t 10.50-4.625l 20.00,0.00 l0.00-256.00 l-20.00,0.00 q-8.25,0.00 -10.50-4.625t 2.75-11.125l 31.50-40.50q 5.00-6.50 12.25-6.50t 12.25,6.50l 31.50,40.50q 5.00,6.50 2.75,11.125t-10.50,4.625l-20.00,0.00 l0.00,256.00 l 20.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"256\" height=\"448\" viewBox=\"0 0 256 448\" data-du=\"\" data-tags=\"italic, editor, format\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M0.00,415.50l 4.25-21.25q 1.00-0.25 19.25-5.00q 19.00-4.75 29.00-9.75q 7.25-9.25 10.25-25.25l 6.75-34.75l 14.00-67.00l 3.00-16.00q 2.00-11.00 4.25-21.125t 4.00-16.75t 3.125-11.625t 2.25-7.625t 0.875-2.875l 7.25-39.25l 4.00-15.75l 5.50-33.75l 2.00-12.50l0.00-9.50 q-10.25-5.50 -36.00-7.00q-7.00-0.50 -9.50-1.00l 4.75-25.75l 79.25,3.50q 9.75,0.50 18.25,0.50q 16.50,0.00 53.50-2.25q 8.25-0.50 17.00-1.125t 9.00-0.625q-0.50,4.75 -1.50,9.50 q-1.75,7.25 -3.25,12.75q-13.75,4.75 -27.25,7.75q-16.00,4.00 -25.25,7.75q-3.00,7.75 -6.00,22.00q-2.25,11.00 -3.25,20.50q-11.00,49.75 -16.50,76.50l-15.25,77.75l-9.50,39.50l-10.75,58.75l-3.00,11.25q-0.50,1.75 0.25,6.75q 16.00,3.75 29.75,5.25q 9.00,1.25 16.50,2.50q-0.25,7.25 -1.75,14.50q-1.75,7.75 -2.25,10.25q-4.50,0.00 -5.75,0.25q-6.00,0.50 -10.50,0.50q-2.25,0.00 -7.00-0.75q-4.75-1.00 -36.25-4.25 l-49.50-0.50q-10.25-0.25 -43.50,2.75q-18.50,1.75 -24.50,2.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"bold, editor, format\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 138.75,380.25q 19.00,8.00 35.00,8.00q 32.75,0.00 54.00-10.25t 30.50-28.25q 9.50-17.50 9.50-45.25q0.00-28.50 -10.25-45.00q-14.50-23.50 -35.25-31.50q-20.00-8.00 -61.75-8.00q-18.50,0.00 -25.25,2.50l0.00,36.00 l-0.25,43.25l 0.75,67.50q0.00,3.75 3.00,11.00zM 135.25,193.75q 10.75,1.75 27.25,1.75q 43.75,0.00 66.00-16.25t 22.25-56.00q0.00-28.00 -21.25-46.75q-21.00-18.75 -63.75-18.75q-13.00,0.00 -32.50,3.25q0.00,11.00 0.50,19.25 q 1.75,30.50 1.50,69.75l-0.25,24.50q0.00,10.75 0.25,19.25zM0.00,416.00l 0.50-23.50q 11.25-2.25 17.00-3.00q 19.25-3.00 30.75-7.75q 4.25-6.75 5.25-12.75q 2.25-16.50 2.25-48.50l-0.50-124.25q-1.25-64.00 -2.25-101.00q-0.25-21.75 -2.75-27.25q-0.25-1.00 -3.00-3.00q-4.50-3.00 -17.25-3.75q-7.50-0.50 -28.50-3.25l-1.00-20.75l 65.00-1.50l 95.00-3.25l 11.25-0.25q 1.25,0.00 3.50-0.125t 3.50-0.125q 0.25,0.00 5.375,0.125t 10.125,0.125l 18.50,0.00 q 22.00,0.00 47.75,6.75 q 10.75,3.25 24.00,9.75q 14.25,7.25 25.50,19.00q 11.00,11.75 16.25,26.00t 5.25,30.50q0.00,17.50 -8.00,32.00t-23.75,26.25q-6.50,5.00 -37.50,19.25q 44.25,10.25 66.75,36.50q 23.00,26.50 23.00,59.00q0.00,19.00 -7.25,40.25q-5.25,15.50 -17.75,29.25q-16.50,18.00 -35.00,27.00q-18.25,9.00 -50.75,15.00q-20.50,3.75 -49.50,2.75l-49.25-1.00q-21.00-0.50 -74.50,2.75q-8.25,0.75 -68.00,2.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"font, letter, glyph, editor\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 181.25,139.75l-42.50,112.50q 18.25,0.25 38.375,0.50t 29.75,0.375t 13.125,0.125l 7.25-0.50q-8.00-23.75 -23.00-60.25q-13.25-33.00 -23.00-52.75zM 5.25,416.00l-5.25,0.00 l 0.50-19.75q 5.50-1.75 20.00-4.50q 22.25-4.00 27.50-7.75q 5.00-4.00 12.00-17.00l 59.25-154.00l 70.00-181.00l 18.75,0.00 l 13.25,0.00 l 2.75,5.25l 51.25,120.00q 25.75,60.50 31.00,74.25q 9.75,25.50 24.00,58.75q 6.50,14.50 16.25,41.00q 6.00,16.75 16.25,37.25 q 5.50,12.25 8.75,14.25q 5.50,4.75 17.25,5.75q 11.75,1.50 25.75,6.75q 1.50,9.75 1.50,14.25q0.00,3.50 -0.25,6.50q-20.00,0.00 -48.00-2.00q-23.25-2.00 -47.25-2.00q-19.75,0.00 -33.75,0.50l-50.00,2.75l-14.50,0.50q0.00-11.25 1.00-19.50l 32.75-7.00q 14.00-3.25 17.00-5.75q 3.00-3.00 3.00-6.75t-1.50-8.00l-11.75-28.50l-23.00-57.00l-112.50-0.50q-7.25,16.25 -26.00,68.50q-5.75,16.00 -5.75,21.00q0.00,7.75 4.25,10.75 q 6.50,5.25 25.75,8.00q 0.75,0.00 3.375,0.50t 7.50,1.25t 10.125,1.50q 0.25,7.00 0.25,14.50q0.00,4.25 -0.50,6.75q-16.50,0.00 -87.25-5.00l-12.00,2.00q-20.25,3.50 -41.75,3.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"camera, photo, picture, image\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 240.00,168.00q 29.75,0.00 50.875,21.125t 21.125,50.875t-21.125,50.875t-50.875,21.125t-50.875-21.125t-21.125-50.875t 21.125-50.875t 50.875-21.125zM 416.00,64.00q 26.50,0.00 45.25,18.75t 18.75,45.25l0.00,224.00 q0.00,26.50 -18.75,45.25t-45.25,18.75l-352.00,0.00 q-26.50,0.00 -45.25-18.75t-18.75-45.25l0.00-224.00 q0.00-26.50 18.75-45.25t 45.25-18.75l 56.00,0.00 l 12.75-34.00 q 4.75-12.25 17.375-21.125t 25.875-8.875l 128.00,0.00 q 13.25,0.00 25.875,8.875t 17.375,21.125l 12.75,34.00l 56.00,0.00 zM 240.00,352.00q 46.25,0.00 79.125-32.875t 32.875-79.125t-32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"print\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 96.00,384.00l 224.00,0.00 l0.00-64.00 l-224.00,0.00 l0.00,64.00 zM 96.00,224.00l 224.00,0.00 l0.00-96.00 l-40.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-40.00 l-160.00,0.00 l0.00,160.00 zM 384.00,240.00q0.00-6.50 -4.75-11.25t-11.25-4.75t-11.25,4.75t-4.75,11.25t 4.75,11.25t 11.25,4.75t 11.25-4.75t 4.75-11.25zM 416.00,240.00l0.00,104.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-56.00,0.00 l0.00,40.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00 l0.00-40.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-104.00 q0.00-19.75 14.125-33.875t 33.875-14.125l 16.00,0.00 l0.00-136.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 168.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 38.00,38.00q 7.00,7.00 12.00,19.00t 5.00,22.00l0.00,64.00 l 16.00,0.00 q 19.75,0.00 33.875,14.125t 14.125,33.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"bookmark, favorite, ribbon\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 291.00,32.00q 5.75,0.00 11.00,2.25q 8.25,3.25 13.125,10.25t 4.875,15.50l0.00,322.25 q0.00,8.50 -4.875,15.50t-13.125,10.25q-4.75,2.00 -11.00,2.00q-12.00,0.00 -20.75-8.00l-110.25-106.00l-110.25,106.00q-9.00,8.25 -20.75,8.25q-5.75,0.00 -11.00-2.25q-8.25-3.25 -13.125-10.25t-4.875-15.50l0.00-322.25 q0.00-8.50 4.875-15.50t 13.125-10.25q 5.25-2.25 11.00-2.25l 262.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"book, read, study, learn, education\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 409.75,119.50q 10.00,14.25 4.50,32.25l-68.75,226.50q-4.75,16.00 -19.125,26.875t-30.625,10.875l-230.75,0.00 q-19.25,0.00 -37.125-13.375t-24.875-32.875q-6.00-16.75 -0.50-31.75q0.00-1.00 0.75-6.75t 1.00-9.25q 0.25-2.00 -0.75-5.375t-0.75-4.875q 0.50-2.75 2.00-5.25t 4.125-5.875t 4.125-5.875q 5.75-9.50 11.25-22.875t 7.50-22.875q 0.75-2.50 0.125-7.50t-0.125-7.00q 0.75-2.75 4.25-7.00t 4.25-5.75 q 5.25-9.00 10.50-23.00t 6.25-22.50q 0.25-2.25 -0.625-8.00t 0.125-7.00q 1.00-3.25 5.50-7.625t 5.50-5.625q 4.75-6.50 10.625-21.125t 6.875-24.125q 0.25-2.00 -0.75-6.375t-0.50-6.625q 0.50-2.00 2.25-4.50t 4.50-5.75t 4.25-5.25q 2.00-3.00 4.125-7.625t 3.75-8.75t 4.00-9.00t 4.875-8.00t 6.625-5.875t 9.00-2.875t 11.875,1.375l-0.25,0.75q 9.50-2.25 12.75-2.25l 190.25,0.00 q 18.50,0.00 28.50,14.00t 4.50,32.50l-68.50,226.50 q-9.00,29.75 -17.875,38.375t-32.125,8.625l-217.25,0.00 q-6.75,0.00 -9.50,3.75q-2.75,4.00 -0.25,10.75q 6.00,17.50 36.00,17.50l 230.75,0.00 q 7.25,0.00 14.00-3.875t 8.75-10.375l 75.00-246.75q 1.75-5.50 1.25-14.25q 9.50,3.75 14.75,10.75zM 143.75,120.00q-1.00,3.25 0.50,5.625t 5.00,2.375l 152.00,0.00 q 3.25,0.00 6.375-2.375t 4.125-5.625l 5.25-16.00q 1.00-3.25 -0.50-5.625t-5.00-2.375l-152.00,0.00 q-3.25,0.00 -6.375,2.375 t-4.125,5.625zM 123.00,184.00q-1.00,3.25 0.50,5.625t 5.00,2.375l 152.00,0.00 q 3.25,0.00 6.375-2.375t 4.125-5.625l 5.25-16.00q 1.00-3.25 -0.50-5.625t-5.00-2.375l-152.00,0.00 q-3.25,0.00 -6.375,2.375t-4.125,5.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"tags, price, ecommerce\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 112.00,112.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 378.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-178.75-179.00q-9.50-9.25 -16.125-25.25t-6.625-29.25l0.00-104.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 104.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125 l 178.75,178.50q 9.25,9.75 9.25,22.75zM 474.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-9.00,0.00 -14.75-3.50t-13.25-11.25l 117.50-117.50q 9.25-9.25 9.25-22.50q0.00-13.00 -9.25-22.75l-178.75-178.50q-9.50-9.50 -25.50-16.125t-29.25-6.625l 56.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125l 178.75,178.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"tag, price, ecommerce\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 112.00,112.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625t 9.375,22.625t 22.625,9.375t 22.625-9.375t 9.375-22.625zM 378.75,256.00q0.00,13.25 -9.25,22.50l-122.75,123.00q-9.75,9.25 -22.75,9.25q-13.25,0.00 -22.50-9.25l-178.75-179.00q-9.50-9.25 -16.125-25.25t-6.625-29.25l0.00-104.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 104.00,0.00 q 13.25,0.00 29.25,6.625t 25.50,16.125 l 178.75,178.50q 9.25,9.75 9.25,22.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"barcode\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 168.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 352.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 392.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 144.00,32.00l0.00,384.00 l-16.00,0.00 l0.00-384.00 l 16.00,0.00 zM 320.00,32.00l0.00,384.00 l-64.00,0.00 l0.00-384.00 l 64.00,0.00 zM 224.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 112.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 448.00,32.00l0.00,384.00 l-32.00,0.00 l0.00-384.00 l 32.00,0.00 zM 64.00,32.00l0.00,384.00 l-64.00,0.00 l0.00-384.00 l 64.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"qrcode\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 96.00,288.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 96.00,96.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 288.00,96.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 32.00,351.75l 96.00,0.00 l0.00-95.75 l-96.00,0.00 l0.00,95.75 zM 32.00,160.00l 96.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,96.00 zM 224.00,160.00l 96.00,0.00 l0.00-96.00 l-96.00,0.00 l0.00,96.00 zM 160.00,224.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 zM 288.00,352.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 352.00,352.00l0.00,32.00 l-32.00,0.00 l0.00-32.00 l 32.00,0.00 z M 352.00,224.00l0.00,96.00 l-96.00,0.00 l0.00-32.00 l-32.00,0.00 l0.00,96.00 l-32.00,0.00 l0.00-160.00 l 96.00,0.00 l0.00,32.00 l 32.00,0.00 l0.00-32.00 l 32.00,0.00 zM 160.00,32.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 zM 352.00,32.00l0.00,160.00 l-160.00,0.00 l0.00-160.00 l 160.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"volume-up, speaker\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25zM 288.00,224.00q0.00,19.00 -10.625,35.375t-28.125,23.375q-2.50,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.625t-4.75-11.375q0.00-5.25 3.00-8.875t 7.25-6.25t 8.50-5.75t 7.25-8.875 t 3.00-14.25t-3.00-14.25t-7.25-8.875t-8.50-5.75t-7.25-6.25t-3.00-8.875q0.00-6.75 4.75-11.375t 11.25-4.625q 3.75,0.00 6.25,1.25q 17.50,6.75 28.125,23.25t 10.625,35.50zM 352.00,224.00q0.00,38.25 -21.25,70.625t-56.25,47.125q-3.25,1.25 -6.25,1.25q-6.75,0.00 -11.50-4.75t-4.75-11.25q0.00-9.75 9.75-14.75q 14.00-7.25 19.00-11.00q 18.50-13.50 28.875-33.875t 10.375-43.375t-10.375-43.375 t-28.875-33.875q-5.00-3.75 -19.00-11.00q-9.75-5.00 -9.75-14.75q0.00-6.50 4.75-11.25t 11.25-4.75q 3.25,0.00 6.50,1.25q 35.00,14.75 56.25,47.125t 21.25,70.625zM 416.00,224.00q0.00,57.50 -31.75,105.625t-84.50,70.875q-3.25,1.25 -6.50,1.25q-6.50,0.00 -11.25-4.75t-4.75-11.25q0.00-9.00 9.75-14.75q 1.75-1.00 5.625-2.625t 5.625-2.625q 11.50-6.25 20.50-12.75q 30.75-22.75 48.00-56.75t 17.25-72.25t-17.25-72.25 t-48.00-56.75q-9.00-6.50 -20.50-12.75q-1.75-1.00 -5.625-2.625t-5.625-2.625q-9.75-5.75 -9.75-14.75q0.00-6.50 4.75-11.25t 11.25-4.75q 3.25,0.00 6.50,1.25q 52.75,22.75 84.50,70.875t 31.75,105.625z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"volume-down, speaker\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25zM 288.00,224.00q0.00,19.00 -10.625,35.375t-28.125,23.375q-2.50,1.25 -6.25,1.25q-6.50,0.00 -11.25-4.625t-4.75-11.375q0.00-5.25 3.00-8.875t 7.25-6.25t 8.50-5.75t 7.25-8.875 t 3.00-14.25t-3.00-14.25t-7.25-8.875t-8.50-5.75t-7.25-6.25t-3.00-8.875q0.00-6.75 4.75-11.375t 11.25-4.625q 3.75,0.00 6.25,1.25q 17.50,6.75 28.125,23.25t 10.625,35.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"192\" height=\"448\" viewBox=\"0 0 192 448\" data-du=\"\" data-tags=\"volume-off, speaker, mute\" style=\"margin-left: 13px; margin-top: 8px;\"><path d=\"M 192.00,88.00l0.00,272.00 q0.00,6.50 -4.75,11.25t-11.25,4.75t-11.25-4.75l-83.25-83.25l-65.50,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-96.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 65.50,0.00 l 83.25-83.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"headphones, listen, music\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,221.50q0.00,41.50 -15.00,78.50l-5.00,12.25l-46.25,8.25q-5.50,20.75 -22.625,34.125t-39.125,13.375l0.00,8.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,8.00 q 17.75,0.00 32.50,8.875t 23.25,23.875l 17.00-3.00q 7.25-23.75 7.25-48.25q0.00-37.00 -22.00-69.75t-59.125-52.25t-78.875-19.50 t-78.875,19.50t-59.125,52.25t-22.00,69.75q0.00,24.50 7.25,48.25l 17.00,3.00q 8.50-15.00 23.25-23.875t 32.50-8.875l0.00-8.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-8.00 q-22.00,0.00 -39.125-13.375t-22.625-34.125l-46.25-8.25l-5.00-12.25q-15.00-37.00 -15.00-78.50q0.00-37.75 16.75-72.75t 44.75-60.625 t 66.50-40.875t 80.00-15.25t 80.00,15.25t 66.50,40.875t 44.75,60.625t 16.75,72.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"flag, report\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 80.00,64.00q0.00,18.00 -16.00,27.50l0.00,316.50 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-316.50 q-16.00-9.50 -16.00-27.50q0.00-13.25 9.375-22.625t 22.625-9.375t 22.625,9.375t 9.375,22.625zM 448.00,80.00l0.00,190.75 q0.00,6.25 -3.125,9.625t-9.875,6.875q-53.75,29.00 -92.25,29.00q-15.25,0.00 -30.875-5.50t-27.125-12.00 t-28.875-12.00t-35.625-5.50q-48.00,0.00 -116.00,36.50q-4.25,2.25 -8.25,2.25q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-185.50 q0.00-8.00 7.75-13.75q 5.25-3.50 19.75-10.75q 59.00-30.00 105.25-30.00q 26.75,0.00 50.00,7.25t 54.75,22.00q 9.50,4.75 22.00,4.75q 13.50,0.00 29.375-5.25t 27.50-11.75t 22.00-11.75t 13.625-5.25q 6.50,0.00 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"288\" height=\"448\" viewBox=\"0 0 288 448\" data-du=\"\" data-tags=\"lock, password, secure, private, protected, encrypted\" style=\"margin-left: 11px; margin-top: 8px;\"><path d=\"M 176.00,256.00q0.00-13.25 -9.375-22.625t-22.625-9.375t-22.625,9.375t-9.375,22.625q0.00,9.25 4.75,16.75t 12.75,11.75l-17.25,57.25q-1.25,3.75 1.25,7.00t 6.50,3.25l 48.00,0.00 q 4.00,0.00 6.50-3.25t 1.25-7.00l-17.25-57.25q 8.00-4.25 12.75-11.75t 4.75-16.75zM 80.00,192.00l 128.00,0.00 l0.00-48.00 q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25l0.00,48.00 zM 288.00,216.00l0.00,144.00 q0.00,10.00 -7.00,17.00 t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-144.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 8.00,0.00 l0.00-48.00 q0.00-46.00 33.00-79.00t 79.00-33.00t 79.00,33.00t 33.00,79.00l0.00,48.00 l 8.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"list-alt\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 96.00,296.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 96.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 96.00,168.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,296.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625z M 384.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,168.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-240.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 240.00,0.00 q 3.25,0.00 5.625,2.375 t 2.375,5.625zM 416.00,344.00l0.00-208.00 q0.00-3.25 -2.375-5.625t-5.625-2.375l-368.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625l0.00,208.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 368.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 448.00,72.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 368.00,0.00 q 16.50,0.00 28.25,11.75 t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"refresh, synchronize\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 377.75,264.00q0.00,1.25 -0.25,1.75q-16.00,67.00 -67.00,108.625t-119.50,41.625q-36.50,0.00 -70.625-13.75t-60.875-39.25l-32.25,32.25q-4.75,4.75 -11.25,4.75t-11.25-4.75t-4.75-11.25l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 112.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25l-34.25,34.25q 17.75,16.50 40.25,25.50t 46.75,9.00q 33.50,0.00 62.50-16.25t 46.50-44.75q 2.75-4.25 13.25-29.25 q 2.00-5.75 7.50-5.75l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 384.00,64.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25l 34.50-34.50q-37.00-34.25 -87.25-34.25q-33.50,0.00 -62.50,16.25t-46.50,44.75q-2.75,4.25 -13.25,29.25q-2.00,5.75 -7.50,5.75l-49.75,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-1.75 q 16.25-67.00 67.50-108.625t 120.00-41.625 q 36.50,0.00 71.00,13.875t 61.25,39.125l 32.50-32.25q 4.75-4.75 11.25-4.75t 11.25,4.75t 4.75,11.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"repeat, loop, reload, refresh, synchronize\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,64.00l0.00,112.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-112.00,0.00 q-10.50,0.00 -14.75-10.00q-4.25-9.75 3.50-17.25l 34.50-34.50q-37.00-34.25 -87.25-34.25q-26.00,0.00 -49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125q 42.25,0.00 76.00-24.875t 46.25-65.375q 1.75-5.75 7.50-5.75l 49.75,0.00 q 4.00,0.00 6.25,3.00q 2.50,3.25 1.75,6.75q-9.75,43.75 -36.875,78.00t-66.50,53.25t-84.125,19.00q-39.00,0.00 -74.50-15.25t-61.25-41.00t-41.00-61.25t-15.25-74.50t 15.25-74.50t 41.00-61.25t 61.25-41.00t 74.50-15.25q 36.75,0.00 71.125,13.875t 61.125,39.125l 32.50-32.25q 7.25-7.75 17.50-3.50q 9.75,4.25 9.75,14.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"play-circle, media, control\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 288.00,224.00q0.00,9.25 -8.25,14.00l-128.00,72.00q-3.50,2.00 -7.75,2.00t-8.00-2.25q-8.00-4.50 -8.00-13.75l0.00-144.00 q0.00-9.25 8.00-13.75q 7.75-5.00 15.75-0.25l 128.00,72.00q 8.25,4.75 8.25,14.00zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625 t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"inbox, drawer, storage, archive\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 255.75,240.00l 79.00,0.00 q-0.25-0.75 -0.625-2.00t-0.625-2.00l-53.00-124.00l-177.00,0.00 l-53.00,124.00q-0.25,0.50 -0.625,2.00t-0.625,2.00l 79.00,0.00 l 23.75,48.00l 80.00,0.00 zM 384.00,247.50l0.00,120.50 q0.00,6.50 -4.75,11.25t-11.25,4.75l-352.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-120.50 q0.00-15.50 6.25-30.75l 59.50-138.00q 2.50-6.25 9.125-10.50t 13.125-4.25l 208.00,0.00 q 6.50,0.00 13.125,4.25t 9.125,10.50l 59.50,138.00 q 6.25,15.25 6.25,30.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"upload, load, open\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,216.00q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 l0.00,88.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-48.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-88.00 l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75q0.00-3.00 2.50-6.00l 79.75-79.75q 2.25-2.25 5.75-2.25t 5.75,2.25l 80.00,80.00q 2.25,2.25 2.25,5.75zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375 t-49.625-10.125t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375 t 25.75-96.375t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"download, arrow, store, save\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 280.00,232.00q0.00,3.00 -2.50,6.00l-79.75,79.75q-2.25,2.25 -5.75,2.25t-5.75-2.25l-80.00-80.00q-2.25-2.25 -2.25-5.75q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 l0.00-88.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 48.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125 t-49.625,10.125t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375 t 69.875-69.875t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"download-alt, arrow, store, save\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 334.75,201.75q 4.25,10.25 -3.50,17.50l-112.00,112.00q-4.50,4.75 -11.25,4.75t-11.25-4.75l-112.00-112.00q-7.75-7.25 -3.50-17.50q 4.25-9.75 14.75-9.75l 64.00,0.00 l0.00-112.00 q0.00-6.50 4.75-11.25t 11.25-4.75l 64.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25l0.00,112.00 l 64.00,0.00 q 10.50,0.00 14.75,9.75zM 408.00,256.00q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-400.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75 t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,88.00 l 288.00,0.00 l0.00-88.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"road, asphalt\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 277.75,249.00l0.00-1.00 l-6.00-80.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l-46.50,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-6.00,80.00l0.00,1.00 q-0.25,3.00 2.00,5.00t 5.25,2.00l 61.00,0.00 q 3.00,0.00 5.25-2.00t 2.00-5.00zM 467.50,365.75q0.00,18.25 -11.50,18.25l-176.00,0.00 q 3.25,0.00 5.50-2.375t 2.00-5.625l-5.00-64.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l-68.00,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-5.00,64.00 q-0.25,3.25 2.00,5.625t 5.50,2.375l-176.00,0.00 q-11.50,0.00 -11.50-18.25q0.00-13.50 6.50-29.00l 104.25-261.00q 2.00-4.75 6.50-8.25t 9.50-3.50l 84.75,0.00 q-3.25,0.00 -5.75,2.375t-2.75,5.625l-3.75,48.00q-0.25,3.50 2.00,5.75t 5.50,2.25l 41.50,0.00 q 3.25,0.00 5.50-2.25t 2.00-5.75l-3.75-48.00q-0.25-3.25 -2.75-5.625t-5.75-2.375l 84.75,0.00 q 5.00,0.00 9.50,3.50t 6.50,8.25l 104.25,261.00q 6.50,15.50 6.50,29.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"time, clock\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 272.00,232.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-96.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-112.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,88.00 l 72.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 320.00,224.00q0.00-26.00 -10.125-49.625t-27.375-40.875t-40.875-27.375t-49.625-10.125t-49.625,10.125 t-40.875,27.375t-27.375,40.875t-10.125,49.625t 10.125,49.625t 27.375,40.875t 40.875,27.375t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625zM 384.00,224.00q0.00,52.25 -25.75,96.375t-69.875,69.875t-96.375,25.75t-96.375-25.75t-69.875-69.875t-25.75-96.375t 25.75-96.375t 69.875-69.875 t 96.375-25.75t 96.375,25.75t 69.875,69.875t 25.75,96.375z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"320\" height=\"448\" viewBox=\"0 0 320 448\" data-du=\"\" data-tags=\"file, paper, new, empty\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 32.00,384.00l 256.00,0.00 l0.00-192.00 l-104.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-104.00 l-128.00,0.00 l0.00,320.00 zM 192.00,160.00l 74.75,0.00 l-74.75-74.75l0.00,74.75 zM 320.00,192.00l0.00,200.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-272.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-336.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 136.00,0.00 q 10.00,0.00 22.00,5.00t 19.00,12.00l 102.00,102.00q 7.00,7.00 12.00,19.00t 5.00,22.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"home, house, building\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 352.00,248.00l0.00,120.00 q0.00,6.50 -4.75,11.25t-11.25,4.75l-96.00,0.00 l0.00-96.00 l-64.00,0.00 l0.00,96.00 l-96.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25l0.00-120.00 q0.00-0.25 0.125-0.75t 0.125-0.75l 143.75-118.50l 143.75,118.50q 0.25,0.50 0.25,1.50zM 407.75,230.75l-15.50,18.50q-2.00,2.25 -5.25,2.75l-0.75,0.00 q-3.25,0.00 -5.25-1.75l-173.00-144.25l-173.00,144.25q-3.00,2.00 -6.00,1.75q-3.25-0.50 -5.25-2.75l-15.50-18.50q-2.00-2.50 -1.75-5.875t 2.75-5.375 l 179.75-149.75q 8.00-6.50 19.00-6.50t 19.00,6.50l 61.00,51.00l0.00-48.75 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75l0.00,102.00 l 54.75,45.50q 2.50,2.00 2.75,5.375t-1.75,5.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"trash, remove, delete, bin\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 128.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 192.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,184.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-16.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 16.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 288.00,365.00l0.00-237.00 l-224.00,0.00 l0.00,237.00 q0.00,5.50 1.75,10.125t 3.625,6.75t 2.625,2.125l 208.00,0.00 q 0.75,0.00 2.625-2.125t 3.625-6.75t 1.75-10.125zM 120.00,96.00l 112.00,0.00 l-12.00-29.25q-1.75-2.25 -4.25-2.75l-79.25,0.00 q-2.50,0.50 -4.25,2.75zM 352.00,104.00l0.00,16.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-24.00,0.00 l0.00,237.00 q0.00,20.75 -11.75,35.875t-28.25,15.125l-208.00,0.00 q-16.50,0.00 -28.25-14.625t-11.75-35.375l0.00-238.00 l-24.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-16.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 77.25,0.00 l 17.50-41.75q 3.75-9.25 13.50-15.75t 19.75-6.50l 80.00,0.00 q 10.00,0.00 19.75,6.50t 13.50,15.75l 17.50,41.75l 77.25,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"cog, settings, options, gear, preferences\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,224.00q0.00-26.50 -18.75-45.25t-45.25-18.75t-45.25,18.75t-18.75,45.25t 18.75,45.25t 45.25,18.75t 45.25-18.75t 18.75-45.25zM 384.00,196.75l0.00,55.50 q0.00,3.00 -2.00,5.75t-5.00,3.25l-46.25,7.00q-4.75,13.50 -9.75,22.75q 8.75,12.50 26.75,34.50q 2.50,3.00 2.50,6.25t-2.25,5.75q-6.75,9.25 -24.75,27.00t-23.50,17.75q-3.00,0.00 -6.50-2.25l-34.50-27.00q-11.00,5.75 -22.75,9.50 q-4.00,34.00 -7.25,46.50q-1.75,7.00 -9.00,7.00l-55.50,0.00 q-3.50,0.00 -6.125-2.125t-2.875-5.375l-7.00-46.00q-12.25-4.00 -22.50-9.25l-35.25,26.75q-2.50,2.25 -6.25,2.25q-3.50,0.00 -6.25-2.75q-31.50-28.50 -41.25-42.00q-1.75-2.50 -1.75-5.75q0.00-3.00 2.00-5.75q 3.75-5.25 12.75-16.625t 13.50-17.625q-6.75-12.50 -10.25-24.75l-45.75-6.75q-3.25-0.50 -5.25-3.125t-2.00-5.875l0.00-55.50 q0.00-3.00 2.00-5.75t 4.75-3.25 l 46.50-7.00q 3.50-11.50 9.75-23.00q-10.00-14.25 -26.75-34.50q-2.50-3.00 -2.50-6.00q0.00-2.50 2.25-5.75q 6.50-9.00 24.625-26.875t 23.625-17.875q 3.25,0.00 6.50,2.50l 34.50,26.75q 11.00-5.75 22.75-9.50q 4.00-34.00 7.25-46.50q 1.75-7.00 9.00-7.00l 55.50,0.00 q 3.50,0.00 6.125,2.125t 2.875,5.375l 7.00,46.00q 12.25,4.00 22.50,9.25l 35.50-26.75q 2.25-2.25 6.00-2.25q 3.25,0.00 6.25,2.50q 32.25,29.75 41.25,42.50q 1.75,2.00 1.75,5.50 q0.00,3.00 -2.00,5.75q-3.75,5.25 -12.75,16.625t-13.50,17.625q 6.50,12.50 10.25,24.50l 45.75,7.00q 3.25,0.50 5.25,3.125t 2.00,5.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"signal, bars, stats\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 64.00,360.00l0.00,48.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-48.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 160.00,328.00l0.00,80.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-80.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 256.00,264.00l0.00,144.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75 l0.00-144.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 352.00,168.00l0.00,240.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-240.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75zM 448.00,40.00l0.00,368.00 q0.00,3.50 -2.25,5.75t-5.75,2.25l-48.00,0.00 q-3.50,0.00 -5.75-2.25t-2.25-5.75l0.00-368.00 q0.00-3.50 2.25-5.75t 5.75-2.25l 48.00,0.00 q 3.50,0.00 5.75,2.25t 2.25,5.75z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"off, switch, power\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,224.00q0.00,39.00 -15.25,74.50t-41.00,61.25t-61.25,41.00t-74.50,15.25t-74.50-15.25t-61.25-41.00t-41.00-61.25t-15.25-74.50q0.00-45.50 20.125-85.75t 56.625-67.50q 10.75-8.00 23.875-6.25t 20.875,12.50q 8.00,10.50 6.125,23.625t-12.375,21.125q-24.50,18.50 -37.875,45.25t-13.375,57.00q0.00,26.00 10.125,49.625t 27.375,40.875t 40.875,27.375 t 49.625,10.125t 49.625-10.125t 40.875-27.375t 27.375-40.875t 10.125-49.625q0.00-30.25 -13.375-57.00t-37.875-45.25q-10.50-8.00 -12.375-21.125t 6.125-23.625q 7.75-10.75 21.00-12.50t 23.75,6.25q 36.50,27.25 56.625,67.50t 20.125,85.75zM 224.00,32.00l0.00,160.00 q0.00,13.00 -9.50,22.50t-22.50,9.50t-22.50-9.50t-9.50-22.50l0.00-160.00 q0.00-13.00 9.50-22.50t 22.50-9.50t 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"zoom-out, magnifier\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-144.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 144.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125z M 416.00,416.00q0.00,13.25 -9.375,22.625t-22.625,9.375q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875t-56.25-37.50t-37.50-56.25t-13.875-68.375t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z \" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"zoom-in, magnifier, enlarge\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 256.00,200.00l0.00,16.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-56.00,0.00 l0.00,56.00 q0.00,3.25 -2.375,5.625t-5.625,2.375l-16.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-56.00 l-56.00,0.00 q-3.25,0.00 -5.625-2.375t-2.375-5.625l0.00-16.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 56.00,0.00 l0.00-56.00 q0.00-3.25 2.375-5.625t 5.625-2.375l 16.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625l0.00,56.00 l 56.00,0.00 q 3.25,0.00 5.625,2.375t 2.375,5.625zM 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125zM 416.00,416.00q0.00,13.25 -9.375,22.625t-22.625,9.375q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875 t-56.25-37.50t-37.50-56.25t-13.875-68.375t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"remove, cancel, close, delete, mutiply\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 324.50,330.50q0.00,10.00 -7.00,17.00l-34.00,34.00q-7.00,7.00 -17.00,7.00t-17.00-7.00l-73.50-73.50l-73.50,73.50q-7.00,7.00 -17.00,7.00t-17.00-7.00l-34.00-34.00q-7.00-7.00 -7.00-17.00t 7.00-17.00l 73.50-73.50l-73.50-73.50q-7.00-7.00 -7.00-17.00t 7.00-17.00l 34.00-34.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 73.50,73.50l 73.50-73.50q 7.00-7.00 17.00-7.00t 17.00,7.00l 34.00,34.00q 7.00,7.00 7.00,17.00 t-7.00,17.00l-73.50,73.50l 73.50,73.50q 7.00,7.00 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"ok, checkmark, tick, correct\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 417.75,141.50q0.00,10.00 -7.00,17.00l-181.00,181.00l-34.00,34.00q-7.00,7.00 -17.00,7.00t-17.00-7.00l-34.00-34.00l-90.50-90.50q-7.00-7.00 -7.00-17.00t 7.00-17.00l 34.00-34.00q 7.00-7.00 17.00-7.00t 17.00,7.00l 73.50,73.75l 164.00-164.25q 7.00-7.00 17.00-7.00t 17.00,7.00l 34.00,34.00q 7.00,7.00 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"th-list, list, ul\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 128.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00 l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-240.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 240.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"th, grid\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 128.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 128.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00 l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,312.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 288.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,184.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00zM 448.00,56.00l0.00,48.00 q0.00,10.00 -7.00,17.00t-17.00,7.00l-80.00,0.00 q-10.00,0.00 -17.00-7.00t-7.00-17.00l0.00-48.00 q0.00-10.00 7.00-17.00t 17.00-7.00l 80.00,0.00 q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"th-large, grid, icons\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 192.00,256.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 192.00,64.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 416.00,256.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50 l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50zM 416.00,64.00l0.00,96.00 q0.00,13.00 -9.50,22.50t-22.50,9.50l-128.00,0.00 q-13.00,0.00 -22.50-9.50t-9.50-22.50l0.00-96.00 q0.00-13.00 9.50-22.50t 22.50-9.50l 128.00,0.00 q 13.00,0.00 22.50,9.50t 9.50,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"480\" height=\"448\" viewBox=\"0 0 480 448\" data-du=\"\" data-tags=\"film, movie, video\" style=\"margin-left: 7px; margin-top: 8px;\"><path d=\"M 96.00,400.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,304.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,208.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 352.00,400.00l0.00-128.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,128.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 96.00,112.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25 t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,400.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 352.00,208.00l0.00-128.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-192.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,128.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 192.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,304.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,208.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 448.00,112.00l0.00-32.00 q0.00-6.50 -4.75-11.25t-11.25-4.75l-32.00,0.00 q-6.50,0.00 -11.25,4.75 t-4.75,11.25l0.00,32.00 q0.00,6.50 4.75,11.25t 11.25,4.75l 32.00,0.00 q 6.50,0.00 11.25-4.75t 4.75-11.25zM 480.00,72.00l0.00,336.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-400.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-336.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 400.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"352\" height=\"448\" viewBox=\"0 0 352 448\" data-du=\"\" data-tags=\"user, profile, member\" style=\"margin-left: 10px; margin-top: 8px;\"><path d=\"M 352.00,351.25q0.00,30.00 -18.25,47.375t-48.50,17.375l-218.50,0.00 q-30.25,0.00 -48.50-17.375t-18.25-47.375q0.00-13.25 0.875-25.875t 3.50-27.25t 6.625-27.125t 10.75-24.375t 15.50-20.25t 21.375-13.375t 27.875-5.00q 2.25,0.00 10.50,5.375t 18.625,12.00t 27.00,12.00t 33.375,5.375t 33.375-5.375t 27.00-12.00t 18.625-12.00t 10.50-5.375q 15.25,0.00 27.875,5.00t 21.375,13.375t 15.50,20.25 t 10.75,24.375t 6.625,27.125t 3.50,27.25t 0.875,25.875zM 272.00,128.00q0.00,39.75 -28.125,67.875t-67.875,28.125t-67.875-28.125t-28.125-67.875t 28.125-67.875t 67.875-28.125t 67.875,28.125t 28.125,67.875z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"star-empty, favorite, rate\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 284.25,251.00l 76.50-74.25l-105.50-15.50l-47.25-95.50l-47.25,95.50l-105.50,15.50l 76.50,74.25l-18.25,105.25l 94.50-49.75l 94.25,49.75zM 416.00,161.75q0.00,5.50 -6.50,12.00l-90.75,88.50l 21.50,125.00q 0.25,1.75 0.25,5.00q0.00,12.50 -10.25,12.50q-4.75,0.00 -10.00-3.00l-112.25-59.00l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00 l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25t 12.25,10.25l 56.25,113.75l 125.50,18.25q 14.00,2.25 14.00,11.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"star, favorite, rate\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 416.00,161.75q0.00,5.50 -6.50,12.00l-90.75,88.50l 21.50,125.00q 0.25,1.75 0.25,5.00q0.00,5.25 -2.625,8.875t-7.625,3.625q-4.75,0.00 -10.00-3.00l-112.25-59.00l-112.25,59.00q-5.50,3.00 -10.00,3.00q-5.25,0.00 -7.875-3.625t-2.625-8.875q0.00-1.50 0.50-5.00l 21.50-125.00l-91.00-88.50q-6.25-6.75 -6.25-12.00q0.00-9.25 14.00-11.50l 125.50-18.25l 56.25-113.75q 4.75-10.25 12.25-10.25t 12.25,10.25l 56.25,113.75 l 125.50,18.25q 14.00,2.25 14.00,11.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"heart, love, like\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 224.00,416.00q-6.50,0.00 -11.00-4.50l-156.00-150.50q-2.50-2.00 -6.875-6.50t-13.875-16.375t-17.00-24.375t-13.375-30.25t-5.875-34.50q0.00-55.00 31.75-86.00t 87.75-31.00q 15.50,0.00 31.625,5.375t 30.00,14.50t 23.875,17.125t 19.00,17.00q 9.00-9.00 19.00-17.00t 23.875-17.125t 30.00-14.50t 31.625-5.375q 56.00,0.00 87.75,31.00t 31.75,86.00q0.00,55.25 -57.25,112.50l-155.75,150.00 q-4.50,4.50 -11.00,4.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"envelope, letter, email, mail, contact\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 416.00,376.00l0.00-192.00 q-8.00,9.00 -17.25,16.50q-67.00,51.50 -106.50,84.50q-12.75,10.75 -20.75,16.75t-21.625,12.125t-25.625,6.125l-0.25,0.00 l-0.25,0.00 q-12.00,0.00 -25.625-6.125t-21.625-12.125t-20.75-16.75q-39.50-33.00 -106.50-84.50q-9.25-7.50 -17.25-16.50l0.00,192.00 q0.00,3.25 2.375,5.625t 5.625,2.375l 368.00,0.00 q 3.25,0.00 5.625-2.375t 2.375-5.625zM 416.00,113.25l0.00-2.75 l0.00-3.375 t-0.125-3.25 t-0.75-3.125t-1.375-2.25t-2.25-1.875t-3.50-0.625l-368.00,0.00 q-3.25,0.00 -5.625,2.375t-2.375,5.625q0.00,42.00 36.75,71.00q 48.25,38.00 100.25,79.25q 1.50,1.25 8.75,7.375t 11.50,9.375t 11.125,7.875t 12.625,6.875t 10.75,2.25l 0.25,0.00 l 0.25,0.00 q 5.00,0.00 10.75-2.25t 12.625-6.875t 11.125-7.875t 11.50-9.375t 8.75-7.375q 52.00-41.25 100.25-79.25q 13.50-10.75 25.125-28.875t 11.625-32.875z M 448.00,104.00l0.00,272.00 q0.00,16.50 -11.75,28.25t-28.25,11.75l-368.00,0.00 q-16.50,0.00 -28.25-11.75t-11.75-28.25l0.00-272.00 q0.00-16.50 11.75-28.25t 28.25-11.75l 368.00,0.00 q 16.50,0.00 28.25,11.75t 11.75,28.25z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"416\" height=\"448\" viewBox=\"0 0 416 448\" data-du=\"\" data-tags=\"search, magnifier, lookup, find\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 288.00,208.00q0.00-46.25 -32.875-79.125t-79.125-32.875t-79.125,32.875t-32.875,79.125t 32.875,79.125t 79.125,32.875t 79.125-32.875t 32.875-79.125zM 416.00,416.00q0.00,13.00 -9.50,22.50t-22.50,9.50q-13.50,0.00 -22.50-9.50l-85.75-85.50q-44.75,31.00 -99.75,31.00q-35.75,0.00 -68.375-13.875t-56.25-37.50t-37.50-56.25t-13.875-68.375 t 13.875-68.375t 37.50-56.25t 56.25-37.50t 68.375-13.875t 68.375,13.875t 56.25,37.50t 37.50,56.25t 13.875,68.375q0.00,55.00 -31.00,99.75l 85.75,85.75q 9.25,9.25 9.25,22.50z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"384\" height=\"448\" viewBox=\"0 0 384 448\" data-du=\"\" data-tags=\"music, song, sound\" style=\"margin-left: 9px; margin-top: 8px;\"><path d=\"M 384.00,56.00l0.00,280.00 q0.00,12.50 -8.50,22.25t-21.50,15.125t-25.875,8.00t-24.125,2.625t-24.125-2.625t-25.875-8.00t-21.50-15.125t-8.50-22.25t 8.50-22.25t 21.50-15.125t 25.875-8.00t 24.125-2.625q 26.25,0.00 48.00,9.75l0.00-134.25 l-192.00,59.25l0.00,177.25 q0.00,12.50 -8.50,22.25t-21.50,15.125t-25.875,8.00t-24.125,2.625t-24.125-2.625t-25.875-8.00t-21.50-15.125t-8.50-22.25 t 8.50-22.25t 21.50-15.125t 25.875-8.00t 24.125-2.625q 26.25,0.00 48.00,9.75l0.00-241.75 q0.00-7.75 4.75-14.125t 12.25-8.875l 208.00-64.00q 3.00-1.00 7.00-1.00q 10.00,0.00 17.00,7.00t 7.00,17.00z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>","<svg width=\"448\" height=\"448\" viewBox=\"0 0 448 448\" data-du=\"\" data-tags=\"glass, drink\" style=\"margin-left: 8px; margin-top: 8px;\"><path d=\"M 424.75,46.50q0.00,8.75 -10.75,19.50l-158.00,158.00l0.00,192.00 l 80.00,0.00 q 6.50,0.00 11.25,4.75t 4.75,11.25t-4.75,11.25t-11.25,4.75l-224.00,0.00 q-6.50,0.00 -11.25-4.75t-4.75-11.25t 4.75-11.25t 11.25-4.75l 80.00,0.00 l0.00-192.00 l-158.00-158.00q-10.75-10.75 -10.75-19.50q0.00-5.75 4.50-9.125t 9.50-4.375t 10.75-1.00l 352.00,0.00 q 5.75,0.00 10.75,1.00t 9.50,4.375t 4.50,9.125z\" transform=\"scale(0.03571428571428571 0.03571428571428571)\"></path></svg>"]},"<svg width=\"97px\" height=\"96px\" viewBox=\"0 0 97 96\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:sketch=\"http://www.bohemiancoding.com/sketch/ns\" data-tags=\"Slice 1\" style=\"margin-left: -16px; margin-top: -16px;\">\n \n \n \n \n\n \n <path d=\"M7.21875,24.78125 L36.609375,34.34375 L36.609375,0.453125 L60.9375,0.453125 L60.9375,34.34375 L90.328125,24.78125 L96.9375,45.734375 L66.984375,55.015625 L86.53125,83 L68.53125,95.796875 L48.984375,69.359375 L28.875,95.796875 L10.875,83 L30.5625,55.015625 L0.609375,45.734375 L0.609375,45.734375 L7.21875,24.78125 L7.21875,24.78125 Z M7.21875,24.78125\" transform=\"scale(0.6597938144329897 0.6597938144329897)\"></path></svg>"],"IDs":[778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,0],"user":{"email":"keyamoon@gmail.com","newsletter":true,"secret":"29769e48fe4bab8807b024a41d770900e18015c1af12cf4ad63d2d19009e6a90aead0d2885d7a32787d7336b442a44662cdfddfa2a2b0c74445becb1f50a8998","uid":4}},"inputCache":"{\"baseline\":\"14.285714285714286\",\"emSize\":\"448\",\"prev_size\":\"32\",\"hdr-imported\":\"checked\",\"iconAlignment\":\"0\",\"showGrid\":\"checked\",\"fi_name\":\"clipperz icons\",\"fi_id\":\"\",\"fi_link\":\"\",\"fi_author\":\"\",\"fi_authorLink\":\"\",\"fi_license\":\"\",\"fi_licenseLink\":\"\",\"include_metadata\":false,\"base64\":true,\"img-height\":\"32\",\"img-color\":\"000000\",\"include_png\":\"checked\",\"fi_class\":\"icon-\",\"showCloudLinks\":false,\"sprites-cols\":\"16\",\"ligatures\":true,\"include_sprites\":false,\"hdr-fontawesome\":true,\"designGrid\":\"\",\"whitespace\":\"50\",\"glyph_widths\":\"100\",\"manualMetrics\":false}"} \ No newline at end of file
diff --git a/frontend/delta/html/index_template.html b/frontend/delta/html/index_template.html
new file mode 100644
index 0000000..0bd6fa8
--- a/dev/null
+++ b/frontend/delta/html/index_template.html
@@ -0,0 +1,130 @@
1<!--
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22-->
23
24<html>
25<head>
26 <title>@page.title@</title>
27 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
28 <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- user-scalable=no, maximum-scale=1.0-->
29
30 <meta name="apple-mobile-web-app-capable" content="yes" />
31 <meta name="apple-mobile-web-app-status-bar-style" content="black" />
32<!--
33@copyright@
34-->
35
36 <meta name="HandheldFriendly" content="True">
37 <meta name="MobileOptimized" content="320">
38
39<!-- link rel="apple-touch-icon-precomposed" ... -->
40 <link rel="apple-touch-icon" sizes="144x144" href="data:image/png;charset=utf-8;base64,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">
41 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
42 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAJp0lEQVR4Ae2ce4zU1RXHz53ZYQGrKKglFomN+DbxFbWWWnnKo+s7NGpqRGt3QUA0NfYPTdSkDWpTiiK77ICW1Fca0sQXYMX1QbVFTdMaNdZXVNoCja3BRxVmdub6Ob/fzuz8dmb295yVrXOS3/we93fPOfd7zz333HN/u8ZaK02qj0CqflGzRBFoGVIYsuZ85M2TouQjyU1Jhnrrpd0+HKl+hEpDC5DIyTJaLpXdETTVKiM5Ppd3+f2/BagoBZpX5IhCWjd67SgSpemDfGBrAtQEyAcBn+KmBTUB8kHAp7hpQU2AfBDwKW5aUBMgHwR8ipsW1ATIBwGf4qYFNQHyQcCnuGlBPgDVzwf9xhxEauJoUmovy3wbNYPjI/4rLl5nRkqvnCpp+btcYT+spU19gHJykYyQuyQnb8ka87hY+QMMXiSb93ktRsPmWdaMRtfTxcgs2tRGjvJI2ngNz1bXakN9gITKhuppOc45cnI9DN+RbrMBRk/Ix7JVbrCf1mK61z27w+wrY+Q76DWb4we0a5LTMk3AGUfbNn5DAJQ1E6l4Kubn5u9cRmmAOso5cnKd7E/qc43ZxBub5H/yZ7nW7nJE7S0/K8z+so+cgTpz0HUO58MZEaac0cz1KaqbOtpWbXO73db3tHyqbUFWJsPsYE9qXRkpUC5YhlzkJMBawjtLZJS8L2vNE5RtxGe9ID+2H5UlDOXFPWYsnToZveaik1rLYU6aX3XWNG8JlEqd9HmGtuaoJxIQICPnVvKouvaCJSh0GMAsYAguAKR/0BubUehxwHteltR2flU8oz5YyWSSke/RYTpMZnI+tLxXo3rWAqWWLLfNDw0sMlUbh3eab7J78BJCJjrWMrDGYPc6nvVQu3SH53bue+CjYD0jrXI1xy2yZzAmg5S1UrbHqd8JKFPpmDY6ZTqgHFKWqaDoEYbSvNyL9eyW02Sp/Xdl1WqAus05CHs0NDiVXEvXGmWpcDXjgvyT3zyN+XbkXQ3lV5T3+NXJYwK83CEfdZeE6mVyQTpXOuxj5WdcqIiB1Fbz6cC3gtyr4rpFqD4g5TQoOjgqT/kpwMpLeSrvJMCBTV+bdZh6yAtQ1oyhdEpiQitFaUOSaExSfCp102tXtyn4T8WgTF6AdOczzXSYREPKIobJhbZZ264YVJAXIMv02MJrYZ1cBcNhe6ltdts+t7IN/QD92oxixpnxtbSeEiJqRYqBYtFH/QCNlBMoPCaR2avEfbid3SD4GMKcE0qq9wNkZDExikYaX29SDBSLPtKQzqUiaY3dsh/+57t4oXGxAq8Sz739PDCwLch/weBPuJmXS6pXB4r3mkOIKmfywtkcZ4LmBMKy/kXecHfgCoqOGw0M85iDdQLYP3L3JEaxWa6027kuUzVA5SIu1rEi3uOkCaYD0RyOIwEr4zhyHa/DBSwFRQFRYPIOLG+hu2YiehhQW0kI1s1EDA4QHMq0Hs/+kZwIONMRpumDk4BqlAPS3ghWCRQ95+ULfv/KBLQJkHpkrPxN5ll95kvBAapklTVqRUdhUVMROJvryYA1hnt3WaGWNdTWpbJLoKjsPCm9FKmXIsk9y0I5JW+S7wn9bWQ0gJBfpltNCmgmYkvfR8FZPJ/GeTyAqZKNB0pB6Ze1E9k9gPIkNrMFiLbJzTbWuiA+QOjnIc3PtDrJpxk8n4/C+zTMmhQcSz5TZB3HU/jLF5LOPyUPEJo61GXOomc30oDRDQXI8N1rAZ/YYbeURCd57g8Uk+SqW0Zp6WTcNw4c1Vd9jcpIIUsttwHUGIBysoyc9rFOVrEBSntYauYyw85Lq/zc8zyhm+QB6jKXEnDNdxx0Qkr6stHJIC1XymrzQ993Q76QrA/KmsOR/xzKfmvIF70aCBaYtfLMpovsByFxqPt6chbkxkYrMPehB0ebp8FqhnCjRZbLeqNwJULJASSyCL/TNqRDayAEOtRa5EKWnO0Di6LeJzPEuswpKNZDzDOGIO2rJe3yIhAJUX67fTWuMvEt6F72vdOyEoCSAUeDvzikHZQhXSNyZ2VmMCrL+ADl5UYUOiORoeVGxkUsMR65Q20qMfz18RixvKvaWQ3DcbWZBTgPY9IjY0fL7npqPXz+gkXeFnuoatdbomzL+rDdPh+mWZXvRregTjOeCHYFvR0fHM1r5uRtfpeyZLgdcH4P8PFIh1qaKFv4xqnLHBCVWUSAjH7dsYxGHB07WlYNiiw4C9JBT+9wGlIEqDyAKXBxSKPsEeStjNwSlU00gFbLjxB8WWxwVGvVoEADrrbPlBuxwP6LobGI518k4o8yfHXSZQb/YqUs3HsRHqBuc4TjIyy/cZNirt/5nexkqA6kDrsZgJYhJR6pjobubJFfsaCdEJZZOIA0WhYak+FzE41c45AOn7y8DgBLSWrpYKimcXI772yM7Y/cBe0kYLpNNMEXgkK9jK+4BmXnBv4oqZ4iKrUgn8CvQ67yfo/jqTLP5gBwMSBti21J7tR/CbnOyz0yfG6CT/MrzWnMV5sx1/1oWDxyF5aLccqrAjHqNucBkIYAmVjDWuVaBnRepshC+2YQ2cEsKGsOJN9yN0rGB2cEavXKb2WHdAVR0Hmnwz6CxS2PPaupW0hjQymm/k7zjSDygwGk3xWnvZ+FBGFe9Y56sBzbL0Z+GjqZPlZupe6zsf2R67TPxB8dX6VfjQfBANrBflKvXEAvvgPjaKSSetlZs6y02+1/QjPRfSwjCxkeO+ms8KTLF9d6X8FFzMX3bQ3CJLgPUm46TbbKL1HwYscXhPFFKWrkAWehXRtEsbrvdJtLkH8f3IKHGa7v0f/6sBYrvCnMzkc4gFRrTUbtYvax5IAzcgCN9ic33slSi0+FE/h/PGvMXfgj/Ubbn1R2r2wHnBtkgX3Av4L3jWBDrLLOPFuQn9hOHs1A6BbHJwy2+nbBeZFl488SAUd12Y0V5NhTV971SFvmgrMBgKZFAUdZh7egSoU0F1Qg3WHkWmaGVhTxkipp5UPG/EwWoa94C2PedZoT8SlPwWVcVdihQWhBPkP2L5gtVzAhRP5rpXgAldqYNfoHIsvpMf3LGZfUqvSjmbzMx+/cX3o10XOXuQqQsgBkAEPluVajM6Wl0xLYTAw/xGq1sN1uoL+mAc6DzgyjTlF7sVdWNQwc1WOh3IPMdY4slZmiQ/bwVzt5x2K36CtxKRkLKmmh65zxzFQtmHavvMHHA3Ma/idTGsSKPM1xMFZzHVbzUEmdJM7JAlTSaJU5nd7cFTScL1WLfF5lTsZ2+LM4+1pkHnUqNgagOsKG4+NkfNBwbHlAnb8ErD6s9j493lIAAAAASUVORK5CYII=">
43 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,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">
44 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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">
45
46 <meta http-equiv="cleartype" content="on">
47 <meta name="apple-mobile-web-app-capable" content="yes">
48 <!-- link rel="apple-touch-startup-image" href="data:image/png;charset=utf-8;base64,iVBORw0K...ggo=" -->
49
50@css@
51
52 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
53
54<script>
55 Clipperz_IEisBroken = false;
56 Clipperz_normalizedNewLine = '\n';
57 Clipperz_dumpUrl = "@dump.path@";
58 Clipperz_version = "@application.version@";
59 "use strict";
60
61 var addToHomeConfig = {
62 autostart: false,
63 startDelay: 0
64 };
65
66</script>
67
68<!--[if IE]><script>
69Clipperz_IEisBroken = true;
70Clipperz_normalizedNewLine = '\x0d\x0a';
71</script><![endif]-->
72
73</head>
74<body>
75<div id="mainDiv">
76 <div class="page" id="loadingPage">
77 <div>
78 <h1>clipperz</h1>
79 <h3 class="clipperzPayoff">keep it to yourself</h3>
80 </div>
81 </div>
82 <div class="page right" id="loginPage"></div>
83 <div class="page right" id="registrationPage"></div>
84 <div class="page right" id="cardListPage"></div>
85 <div class="page right" id="cardDetailPage"></div>
86 <div class="page right" id="accountPage"></div>
87 <div class="page right" id="preferencesPage"></div>
88 <div class="page right" id="errorPage"></div>
89</div>
90<div class="overlay" id="overlay">
91 <div class="spinner">
92 <div class="bar01"></div>
93 <div class="bar02"></div>
94 <div class="bar03"></div>
95 <div class="bar04"></div>
96 <div class="bar05"></div>
97 <div class="bar06"></div>
98 <div class="bar07"></div>
99 <div class="bar08"></div>
100 <div class="bar09"></div>
101 <div class="bar10"></div>
102 <div class="bar11"></div>
103 <div class="bar12"></div>
104 </div>
105 <span class="icon done" style="display:none">done</span>
106 <span class="icon failed" style="display:none">failed</span>
107 <span class="title">loading</span>
108</div>
109
110@js_LINKED@
111@js_EMBEDDED@
112
113<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
114
115<script>
116 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
117 /*offline_data_placeholder*/
118
119/* * /
120 MochiKit.DOM.addLoadEvent(function () {
121 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
122 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
123 });
124
125 //Live Reload hoock
126 document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')
127/ * */
128</script>
129</body>
130</html>
diff --git a/frontend/delta/js/Clipperz/Async.js b/frontend/delta/js/Clipperz/Async.js
new file mode 100644
index 0000000..971fde5
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Async.js
@@ -0,0 +1,707 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//Clipperz.Async = MochiKit.Async;
25
26
27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
28if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; }
29
30Clipperz.Async.VERSION = "0.1";
31Clipperz.Async.NAME = "Clipperz.Async";
32
33Clipperz.Async.Deferred = function(aName, args) {
34 args = args || {};
35
36 Clipperz.Async.Deferred.superclass.constructor.call(this, args.canceller);
37
38 this._args = args;
39 this._name = aName || "Anonymous deferred";
40 this._count = 0;
41 this._shouldTrace = ((CLIPPERZ_DEFERRED_TRACING_ENABLED === true) || (args.trace === true));
42 this._vars = null;
43
44 return this;
45}
46
47//=============================================================================
48
49Clipperz.Base.extend(Clipperz.Async.Deferred, MochiKit.Async.Deferred, {
50
51 'name': function () {
52 return this._name;
53 },
54
55 'args': function () {
56 return this._args;
57 },
58
59 //-----------------------------------------------------------------------------
60
61 'callback': function (aValue) {
62 if (this._shouldTrace) {
63 Clipperz.log("CALLBACK " + this._name, aValue);
64 }
65
66 if (this.chained == false) {
67 var message;
68
69 message = "ERROR [" + this._name + "]";
70 this.addErrback(function(aResult) {
71 if (! (aResult instanceof MochiKit.Async.CancelledError)) {
72 Clipperz.log(message, aResult);
73 }
74 return aResult;
75 });
76
77 if (this._shouldTrace) {
78 var resultMessage;
79
80 resultMessage = "RESULT " + this._name + " <==";
81 // this.addCallback(function(aResult) {
82 Clipperz.Async.Deferred.superclass.addCallback.call(this, function(aResult) {
83 Clipperz.log(resultMessage, aResult);
84 return aResult;
85 });
86 }
87 }
88
89 if (CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED === true) {
90 Clipperz.log("callback " + this._name, this);
91 }
92
93 return Clipperz.Async.Deferred.superclass.callback.apply(this, arguments);
94 },
95
96 //-----------------------------------------------------------------------------
97
98 'addCallback': function () {
99 var message;
100
101 if (this._shouldTrace) {
102 this._count ++;
103 message = "[" + this._count + "] " + this._name + " ";
104 // this.addBoth(function(aResult) {Clipperz.log(message + "-->", aResult); return aResult;});
105 this.addCallbacks(
106 function(aResult) {Clipperz.log("-OK- " + message + "-->"/*, aResult*/); return aResult;},
107 function(aResult) {Clipperz.log("FAIL " + message + "-->"/*, aResult*/); return aResult;}
108 );
109 }
110
111 Clipperz.Async.Deferred.superclass.addCallback.apply(this, arguments);
112
113 if (this._shouldTrace) {
114 // this.addBoth(function(aResult) {Clipperz.log(message + "<--", aResult); return aResult;});
115 this.addCallbacks(
116 function(aResult) {Clipperz.log("-OK- " + message + "<--", aResult); return aResult;},
117 function(aResult) {Clipperz.log("FAIL " + message + "<--", aResult); return aResult;}
118 );
119 }
120 },
121
122 //=============================================================================
123
124 'addCallbackPass': function() {
125 var passFunction;
126
127 passFunction = MochiKit.Base.partial.apply(null, arguments);
128
129 this.addCallback(function() {
130 var result;
131
132 result = arguments[arguments.length -1];
133 passFunction();
134
135 return result;
136 });
137 },
138
139 //-----------------------------------------------------------------------------
140
141 'addErrbackPass': function() {
142 var passFunction;
143
144 passFunction = MochiKit.Base.partial.apply(null, arguments);
145
146 this.addErrback(function() {
147 var result;
148
149 result = arguments[arguments.length -1];
150 passFunction();
151
152 return result;
153 });
154 },
155
156 //-----------------------------------------------------------------------------
157
158 'addBothPass': function() {
159 var passFunction;
160
161 passFunction = MochiKit.Base.partial.apply(null, arguments);
162
163 this.addBoth(function() {
164 var result;
165
166 result = arguments[arguments.length -1];
167 passFunction();
168
169 return result;
170 });
171 },
172
173 //-----------------------------------------------------------------------------
174
175 'addIf': function (aThenBlock, anElseBlock) {
176 this.addCallback(MochiKit.Base.bind(function (aValue) {
177 var deferredResult;
178
179 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
180 deferredResult = Clipperz.Async.callbacks(this._name + " <then>", aThenBlock, null, aValue);
181 } else {
182 deferredResult = Clipperz.Async.callbacks(this._name + " <else>", anElseBlock, null, aValue);
183 }
184
185 return deferredResult;
186 }))
187 },
188
189 //-----------------------------------------------------------------------------
190
191 'addMethod': function () {
192 this.addCallback(MochiKit.Base.method.apply(this, arguments));
193 },
194
195 //-----------------------------------------------------------------------------
196
197 'addMethodcaller': function () {
198 this.addCallback(MochiKit.Base.methodcaller.apply(this, arguments));
199 },
200
201 //=============================================================================
202
203 'addLog': function (aLog) {
204 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
205 this.addBothPass(function(res) {Clipperz.log(aLog + " ", res);});
206 }
207 },
208
209 //=============================================================================
210
211 'acquireLock': function (aLock) {
212 // this.addCallback(function (aResult) {
213 // return Clipperz.Async.callbacks("Clipperz.Async.acquireLock", [
214 // MochiKit.Base.method(aLock, 'acquire'),
215 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
216 // ], {trace:false});
217 // });
218
219 this.addCallback(MochiKit.Base.method(aLock, 'acquire'));
220 },
221
222 'releaseLock': function (aLock) {
223 // this.addCallback(function (aResult) {
224 // return Clipperz.Async.callbacks("Clipperz.Async.release <ok>", [
225 // MochiKit.Base.method(aLock, 'release'),
226 // MochiKit.Base.partial(MochiKit.Async.succeed, aResult)
227 // ], {trace:false});
228 // });
229 // this.addErrback(function (aResult) {
230///Clipperz.log("releaseLock.addErrback:", aResult);
231 // return Clipperz.Async.callbacks("Clipperz.Async.release <fail>", [
232 // MochiKit.Base.method(aLock, 'release'),
233 // MochiKit.Base.partial(MochiKit.Async.fail, aResult)
234 // ], {trace:false});
235 // });
236
237 // this.addBothPass(MochiKit.Base.method(aLock, 'release'));
238 this.addCallbackPass(MochiKit.Base.method(aLock, 'release'));
239 this.addErrback(function (anError) {
240 aLock.release();
241
242 return anError;
243 });
244 },
245
246 //=============================================================================
247
248 'collectResults': function (someRequests) {
249 this.addCallback(Clipperz.Async.collectResults(this._name + " <collect results>", someRequests, this._args));
250 },
251
252 'addCallbackList': function (aRequestList) {
253 this.addCallback(Clipperz.Async.callbacks, this._name + " <callback list>", aRequestList, this._args);
254 },
255
256 //=============================================================================
257
258 'vars': function () {
259 if (this._vars == null) {
260 this._vars = {}
261 }
262
263 return this._vars;
264 },
265
266 'setValue': function (aKey) {
267 this.addCallback(MochiKit.Base.bind(function (aValue) {
268 this.vars()[aKey] = aValue;
269 return aValue;
270 }, this));
271 },
272
273 'getValue': function (aKey) {
274 this.addCallback(MochiKit.Base.bind(function () {
275 return this.vars()[aKey];
276 }, this));
277 },
278
279 //=============================================================================
280
281 'wait': function (someSeconds) {
282 this.addCallback(MochiKit.Async.wait, someSeconds);
283 },
284
285 //=============================================================================
286
287 __syntaxFix__: "syntax fix"
288});
289
290//#############################################################################
291
292Clipperz.Async.DeferredSynchronizer = function(aName, someMethods) {
293 this._name = aName || "Anonymous deferred Synchronizer";
294 this._methods = someMethods;
295
296 this._numberOfMethodsDone= 0;
297 this._methodResults = [];
298
299 this._result = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer # " + this.name(), {trace:false});
300 this._result.addMethod(this, 'methodResults');
301 this._result.addCallback(function(someResults) {
302 varcancels;
303 var errors;
304 var result;
305
306 cancels = MochiKit.Base.filter(function(aResult) { return (aResult instanceof MochiKit.Async.CancelledError)}, someResults);
307
308 if (cancels.length == 0) {
309 errors = MochiKit.Base.filter(function(aResult) { return (aResult instanceof Error)}, someResults);
310
311 if (errors.length == 0) {
312 // result = MochiKit.Async.succeed(someResults);
313 result = someResults;
314 } else {
315 result = MochiKit.Async.fail(someResults);
316 }
317 } else {
318 result = MochiKit.Async.fail(cancels[0]);
319 }
320
321 return result;
322 }/*, this._methodResults */);
323
324 return this;
325}
326
327MochiKit.Base.update(Clipperz.Async.DeferredSynchronizer.prototype, {
328
329 //-----------------------------------------------------------------------------
330
331 'name': function() {
332 return this._name;
333 },
334
335 //-----------------------------------------------------------------------------
336
337 'methods': function() {
338 return this._methods;
339 },
340
341 'methodResults': function() {
342 return this._methodResults;
343 },
344
345 //-----------------------------------------------------------------------------
346
347 'result': function() {
348 return this._result;
349 },
350
351 //-----------------------------------------------------------------------------
352
353 'numberOfMethodsDone':function() {
354 return this._numberOfMethodsDone;
355 },
356
357 'incrementNumberOfMethodsDone': function() {
358 this._numberOfMethodsDone ++;
359 },
360
361 //-----------------------------------------------------------------------------
362
363 'run': function(args, aValue) {
364 var deferredResults;
365 var i, c;
366
367 deferredResults = [];
368 args = args || {};
369
370 c = this.methods().length;
371 for (i=0; i<c; i++) {
372 var deferredResult;
373 varmethodCalls;
374 var ii, cc;
375
376//Clipperz.log("TYPEOF", typeof(this.methods()[i]));
377 if (typeof(this.methods()[i]) == 'function') {
378 methodCalls = [ this.methods()[i] ];
379 } else {
380 methodCalls = this.methods()[i];
381 }
382
383 cc = methodCalls.length;
384 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.DeferredSynchronizer.run => " + this.name() + "[" + i + "]", args);
385 for (ii=0; ii<cc; ii++) {
386 deferredResult.addCallback(methodCalls[ii]);
387 }
388 deferredResult.addBoth(MochiKit.Base.method(this, 'handleMethodCallDone', i));
389
390 deferredResults.push(deferredResult);
391 }
392
393 for (i=0; i<c; i++) {
394 deferredResults[i].callback(aValue);
395 }
396
397 return this.result();
398 },
399
400 //-----------------------------------------------------------------------------
401
402 'handleMethodCallDone': function(anIndexValue, aResult) {
403 this.incrementNumberOfMethodsDone();
404 this.methodResults()[anIndexValue] = aResult;
405
406 if (this.numberOfMethodsDone() < this.methods().length) {
407 //nothing to do here other than possibly log something
408 } else if (this.numberOfMethodsDone() == this.methods().length) {
409 this.result().callback();
410 } else if (this.numberOfMethodsDone() > this.methods().length) {
411 alert("Clipperz.Async.Deferred.handleMethodCallDone -> WTF!");
412 //WTF!!! :(
413 }
414
415 },
416
417 //-----------------------------------------------------------------------------
418
419 __syntaxFix__: "syntax fix"
420});
421
422//#############################################################################
423
424MochiKit.Base.update(Clipperz.Async, {
425
426 'callbacks': function (aName, someFunctions, someArguments, aCallbackValue) {
427 var deferredResult;
428 var i, c;
429
430 deferredResult = new Clipperz.Async.Deferred(aName, someArguments);
431 c = someFunctions.length;
432 for (i=0; i<c; i++) {
433 deferredResult.addCallback(someFunctions[i]);
434 }
435 deferredResult.callback(aCallbackValue);
436
437 return deferredResult;
438 },
439
440 //-------------------------------------------------------------------------
441
442 'forkAndJoin': function (aName, someMethods, args) {
443 return MochiKit.Base.partial(function (aName, someMethods, args, aValue) {
444 var synchronizer;
445 varresult;
446
447 args = args || {};
448 synchronizer = new Clipperz.Async.DeferredSynchronizer(aName, someMethods);
449 result = synchronizer.run(args, aValue);
450
451 return result;
452 }, aName, someMethods, args);
453 },
454
455 //-------------------------------------------------------------------------
456
457 'collectResults': function(aName, someRequests, args) {
458 return MochiKit.Base.partial(function(aName, someRequests, args, aValue) {
459 var deferredResult;
460 var requestKeys;
461 var methods;
462
463 requestKeys = MochiKit.Base.keys(someRequests);
464 methods = MochiKit.Base.values(someRequests);
465
466 deferredResult = new Clipperz.Async.Deferred(aName, args);
467 deferredResult.addCallback(Clipperz.Async.forkAndJoin(aName + " [inner forkAndJoin]", methods, args));
468 deferredResult.addBoth(function(someResults) {
469 var returnFunction;
470 var results;
471 var i,c;
472 var result;
473
474 if (someResults instanceof MochiKit.Async.CancelledError) {
475 returnFunction = MochiKit.Async.fail;
476 result = someResults;
477 } else {
478 if (someResults instanceof Error) {
479 returnFunction = MochiKit.Async.fail;
480 results = someResults['message'];
481 } else {
482 returnFunction = MochiKit.Async.succeed;
483 results = someResults;
484 }
485
486 result = {};
487
488 c = requestKeys.length;
489 for (i=0; i<c; i++) {
490 result[requestKeys[i]] = results[i];
491 }
492 }
493
494 return returnFunction.call(null, result);
495 });
496 deferredResult.callback(aValue);
497
498 return deferredResult;
499 }, aName, someRequests, args);
500 },
501
502 //-------------------------------------------------------------------------
503
504 'collectAll': function (someDeferredObjects) {
505 var deferredResult;
506
507 deferredResult = new MochiKit.Async.DeferredList(someDeferredObjects, false, false, false);
508 deferredResult.addCallback(function (aResultList) {
509 return MochiKit.Base.map(function (aResult) {
510 if (aResult[0]) {
511 return aResult[1];
512 } else {
513 throw aResult[1];
514 }
515 }, aResultList);
516 });
517
518 return deferredResult;
519 },
520
521 //-------------------------------------------------------------------------
522
523 'setItem': function (anObject, aKey, aValue) {
524 anObject[aKey] = aValue;
525
526 return anObject;
527 },
528
529 'setItemOnObject': function (aKey, aValue, anObject) {
530 anObject[aKey] = aValue;
531
532 return anObject;
533 },
534
535 'setDeferredItemOnObject': function (aKey, aDeferredFunction, anObject) {
536 return Clipperz.Async.callbacks("Clipperz.Async.setDeferredItemOnObject", [
537 aDeferredFunction,
538 MochiKit.Base.partial(Clipperz.Async.setItem, anObject, aKey)
539 ], {trace:false}, anObject);
540 },
541
542 //-------------------------------------------------------------------------
543
544 'deferredIf': function (aName, aThenBlock, anElseBlock) {
545 return function (aValue) {
546 var deferredResult;
547
548 if (!MochiKit.Base.isUndefinedOrNull(aValue) && aValue) {
549 deferredResult = Clipperz.Async.callbacks(aName + " <then>", aThenBlock, null, aValue);
550 } else {
551 deferredResult = Clipperz.Async.callbacks(aName + " <else>", anElseBlock, null, aValue);
552 }
553
554 return deferredResult;
555 }
556 },
557
558 //-------------------------------------------------------------------------
559
560 'log': function(aMessage, aResult) {
561 if (CLIPPERZ_DEFERRED_LOGGING_ENABLED) {
562 Clipperz.log(aMessage + " ", aResult);
563 }
564
565 return aResult;
566 },
567
568 //=========================================================================
569
570 'deferredCompare': function (aComparator, aDeferred, bDeferred) {
571 var deferredResult;
572
573 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredCompare", {trace:false});
574 deferredResult.addCallback(Clipperz.Async.collectAll, [aDeferred, bDeferred]);
575 deferredResult.addCallback(function (someResults) {
576 var result;
577
578 if (aComparator(someResults[0], someResults[1]) > 0) {
579 result = MochiKit.Async.succeed();
580 } else {
581 result = MochiKit.Async.fail();
582 };
583
584 return result;
585 });
586 deferredResult.callback();
587
588 return deferredResult;
589 },
590
591 //-------------------------------------------------------------------------
592
593 'insertIntoSortedArray': function (anObject, aDeferredComparator, aSortedResult) {
594 var deferredResult;
595 var i, c;
596
597 if (aSortedResult.length == 0) {
598 deferredResult = MochiKit.Async.succeed([anObject]);
599 } else {
600 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray", {trace:false});
601 c = aSortedResult.length + 1;
602 for (i=0; i<c; i++) {
603 deferredResult.addCallback(function (aDeferredComparator, aObject, bObject, aContext) {
604 var innerDeferredResult;
605
606 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.insertIntoSortedArray <inner compare>", {trace:false});
607 innerDeferredResult.addCallback(aDeferredComparator, aObject, bObject);
608 innerDeferredResult.addErrback(MochiKit.Async.fail, aContext);
609 innerDeferredResult.callback();
610
611 return innerDeferredResult;
612 }, aDeferredComparator, anObject, aSortedResult[i], i);
613 }
614 deferredResult.addMethod(aSortedResult, 'push', anObject);
615 deferredResult.addErrback(function (anError) {
616 aSortedResult.splice(anError.message, 0, anObject);
617 })
618 deferredResult.addBoth(MochiKit.Async.succeed, aSortedResult);
619 deferredResult.callback();
620 }
621
622 return deferredResult;
623 },
624
625 //-------------------------------------------------------------------------
626
627 'deferredSort': function (aDeferredComparator, someObjects) {
628 var deferredResult;
629 var i, c;
630
631 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredSort", {trace:false});
632 c = someObjects.length;
633 for (i=0; i<c; i++) {
634 deferredResult.addCallback(Clipperz.Async.insertIntoSortedArray, someObjects[i], aDeferredComparator);
635 if ((i % 50) == 0) {
636 //Clipperz.log("######### sort wait ##########");
637 deferredResult.addCallback(MochiKit.Async.wait, 0.5);
638 }
639 }
640 deferredResult.callback([]);
641
642 return deferredResult;
643 },
644
645 //=========================================================================
646
647 'deferredFilter': function (aFunction, someObjects) {
648 vardeferredResult;
649 vari, c;
650
651 deferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter", {trace:false});
652 c = someObjects.length;
653 for (i=0; i<c; i++) {
654 deferredResult.addCallback(function (aFunction, anObject, anIndex, aResult) {
655 var innerDeferredResult;
656
657 innerDeferredResult = new Clipperz.Async.Deferred("Clipperz.Async.deferredFilter <inner - " + anIndex + ">", {trace:false});
658 innerDeferredResult.addCallback(aFunction, anObject);
659 innerDeferredResult.addCallback(function (aFilterResult) {
660 if (aFilterResult) {
661 aResult.push(anObject);
662 };
663 });
664 innerDeferredResult.addBoth(MochiKit.Async.succeed, aResult);
665 innerDeferredResult.callback();
666
667 return innerDeferredResult;
668 }, aFunction, someObjects[i], i);
669 }
670 deferredResult.callback([]);
671
672 return deferredResult;
673 },
674
675 'forEach': function (aFunction) {
676 return MochiKit.Base.partial(function (aFunction, anIterable) {
677 MochiKit.Iter.forEach(anIterable, aFunction);
678 }, aFunction);
679 },
680
681 //=========================================================================
682
683 'or': function (someValues) {
684 return Clipperz.Async.callbacks("Clipperz.Async.or", [
685 MochiKit.Base.values,
686 MochiKit.Base.flattenArguments,
687//function (aValue) { Clipperz.log("Record.hasAnyCleanTextData - flatten", aValue); return aValue; },
688 function(someInnerValues) {
689 return MochiKit.Iter.some(someInnerValues, MochiKit.Base.operator.identity);
690 }
691 ], {trace:false}, someValues);
692 },
693
694 //=========================================================================
695
696 'clearResult': function () {},
697
698 //=========================================================================
699 __syntaxFix__: "syntax fix"
700});
701
702
703//#############################################################################
704
705CLIPPERZ_DEFERRED_LOGGING_ENABLED = true;
706CLIPPERZ_DEFERRED_TRACING_ENABLED = false;
707CLIPPERZ_DEFERRED_CALL_LOGGING_ENABLED = false;
diff --git a/frontend/delta/js/Clipperz/Base.js b/frontend/delta/js/Clipperz/Base.js
new file mode 100644
index 0000000..84b2172
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Base.js
@@ -0,0 +1,514 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; }
26
27Clipperz.Base.VERSION = "0.2";
28Clipperz.Base.NAME = "Clipperz.Base";
29
30MochiKit.Base.update(Clipperz.Base, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'itemgetter': function (aKeyPath) {
47 // return MochiKit.Base.compose.apply(null, [MochiKit.Base.itemgetter('key3')]);
48 return MochiKit.Base.compose.apply(null,
49 MochiKit.Base.map(
50 MochiKit.Base.itemgetter,
51 MochiKit.Iter.reversed(
52 aKeyPath.split('.')
53 )
54 )
55 );
56 },
57
58 //-------------------------------------------------------------------------
59
60 'isUrl': function (aValue) {
61 return (MochiKit.Base.urlRegExp.test(aValue));
62 },
63
64 'isEmail': function (aValue) {
65 return (MochiKit.Base.emailRegExp.test(aValue));
66 },
67
68 //-------------------------------------------------------------------------
69
70 'caseInsensitiveCompare': function (a, b) {
71 return MochiKit.Base.compare(a.toLowerCase(), b.toLowerCase());
72 },
73
74 'reverseComparator': function (aComparator) {
75 return MochiKit.Base.compose(function(aResult) { return -aResult; }, aComparator);
76 },
77
78 'caseInsensitiveKeyComparator': function (aKey) {
79 return function (a, b) {
80 return MochiKit.Base.compare(a[aKey].toLowerCase(), b[aKey].toLowerCase());
81 }
82 },
83 //-------------------------------------------------------------------------
84/*
85 'dependsOn': function(module, deps) {
86 if (!(module in Clipperz)) {
87 MochiKit[module] = {};
88 }
89
90 if (typeof(dojo) != 'undefined') {
91 dojo.provide('Clipperz.' + module);
92 }
93 for (var i = 0; i < deps.length; i++) {
94 if (typeof(dojo) != 'undefined') {
95 dojo.require('Clipperz.' + deps[i]);
96 }
97 if (typeof(JSAN) != 'undefined') {
98 JSAN.use('Clipperz.' + deps[i], []);
99 }
100 if (!(deps[i] in Clipperz)) {
101 throw 'Clipperz.' + module + ' depends on Clipperz.' + deps[i] + '!'
102 }
103 }
104 },
105*/
106 //-------------------------------------------------------------------------
107
108 'trim': function (aValue) {
109 return aValue.replace(/^\s+|\s+$/g, "");
110 },
111
112 //-------------------------------------------------------------------------
113
114 'stringToByteArray': function (aValue) {
115 varresult;
116 var i, c;
117
118 result = [];
119
120 c = aValue.length;
121 for (i=0; i<c; i++) {
122 result[i] = aValue.charCodeAt(i);
123 }
124
125 return result;
126 },
127
128 //.........................................................................
129
130 'byteArrayToString': function (anArrayOfBytes) {
131 varresult;
132 var i, c;
133
134 result = "";
135
136 c = anArrayOfBytes.length;
137 for (i=0; i<c; i++) {
138 result += String.fromCharCode(anArrayOfBytes[i]);
139 }
140
141 return result;
142 },
143
144 //-------------------------------------------------------------------------
145
146 'getValueForKeyInFormContent': function (aFormContent, aKey) {
147 return aFormContent[1][MochiKit.Base.find(aFormContent[0], aKey)];
148 },
149
150 //-------------------------------------------------------------------------
151
152 'indexOfObjectInArray': function(anObject, anArray) {
153 varresult;
154 vari, c;
155
156 result = -1;
157
158 c = anArray.length;
159 for (i=0; ((i<c) && (result < 0)); i++) {
160 if (anArray[i] === anObject) {
161 result = i;
162 }
163 }
164
165 return result;
166 },
167
168 //-------------------------------------------------------------------------
169
170 'removeObjectAtIndexFromArray': function(anIndex, anArray) {
171 anArray.splice(anIndex, 1);
172 },
173
174 //-------------------------------------------------------------------------
175
176 'removeObjectFromArray': function(anObject, anArray) {
177 varobjectIndex;
178
179 objectIndex = Clipperz.Base.indexOfObjectInArray(anObject, anArray);
180 if (objectIndex > -1) {
181 Clipperz.Base.removeObjectAtIndexFromArray(objectIndex, anArray);
182 } else {
183 Clipperz.log("Trying to remove an object not present in the array");
184 throw Clipperz.Base.exception.ObjectNotFound;
185 }
186 },
187
188 'removeFromArray': function(anArray, anObject) {
189 return Clipperz.Base.removeObjectFromArray(anObject, anArray);
190 },
191
192 //-------------------------------------------------------------------------
193
194 'splitStringAtFixedTokenSize': function(aString, aTokenSize) {
195 var result;
196 varstringToProcess;
197
198 stringToProcess = aString;
199 result = [];
200 if (stringToProcess != null) {
201 while (stringToProcess.length > aTokenSize) {
202 result.push(stringToProcess.substring(0, aTokenSize));
203 stringToProcess = stringToProcess.substring(aTokenSize);
204 }
205
206 result.push(stringToProcess);
207 }
208
209 return result;
210 },
211
212 //-------------------------------------------------------------------------
213
214 'objectType': function(anObject) {
215 var result;
216
217 if (anObject == null) {
218 result = null;
219 } else {
220 result = typeof(anObject);
221
222 if (result == "object") {
223 if (anObject instanceof Array) {
224 result = 'array'
225 } else if (anObject.constructor == Boolean) {
226 result = 'boolean'
227 } else if (anObject instanceof Date) {
228 result = 'date'
229 } else if (anObject instanceof Error) {
230 result = 'error'
231 } else if (anObject instanceof Function) {
232 result = 'function'
233 } else if (anObject.constructor == Number) {
234 result = 'number'
235 } else if (anObject.constructor == String) {
236 result = 'string'
237 } else if (anObject instanceof Object) {
238 result = 'object'
239 } else {
240 throw Clipperz.Base.exception.UnknownType;
241 }
242 }
243 }
244
245 return result;
246 },
247
248 //-------------------------------------------------------------------------
249
250 'escapeHTML': function(aValue) {
251 var result;
252
253 result = aValue;
254 result = result.replace(/</g, "&lt;");
255 result = result.replace(/>/g, "&gt;");
256
257 return result;
258 },
259
260 //-------------------------------------------------------------------------
261
262 'deepClone': function(anObject) {
263 var result;
264
265 result = Clipperz.Base.evalJSON(Clipperz.Base.serializeJSON(anObject));
266
267 return result;
268 },
269
270 //-------------------------------------------------------------------------
271
272 //'deepCompare': function (aObject, bObject) {
273 // return (Clipperz.Base.serializeJSON(aObject) == Clipperz.Base.serializeJSON(bObject));
274 //},
275
276 //-------------------------------------------------------------------------
277
278 'evalJSON': function(aString) {
279 return JSON.parse(aString);
280 },
281
282 'serializeJSON': function(anObject) {
283 return JSON.stringify(anObject);
284 },
285
286 'formatJSON': function (anObject, sIndent) {
287 var realTypeOf = function (v) {
288 if (typeof(v) == "object") {
289 if (v === null) return "null";
290 if (v.constructor == (new Array).constructor) return "array";
291 if (v.constructor == (new Date).constructor) return "date";
292 if (v.constructor == (new RegExp).constructor) return "regex";
293 return "object";
294 }
295 return typeof(v);
296 };
297
298 //function FormatJSON(oData, sIndent) {
299 if (arguments.length < 2) {
300 var sIndent = "";
301 }
302 // var sIndentStyle = " ";
303 var sIndentStyle = " ";
304 var sDataType = realTypeOf(anObject);
305
306 // open object
307 if (sDataType == "array") {
308 if (anObject.length == 0) {
309 return "[]";
310 }
311 var sHTML = "[";
312 } else if (sDataType == "object") {
313 var sHTML = "{";
314 } else {
315 return "{}";
316 }
317 // } else {
318 // var iCount = 0;
319 // $.each(anObject, function() {
320 // iCount++;
321 // return;
322 // });
323 // if (iCount == 0) { // object is empty
324 // return "{}";
325 // }
326 // var sHTML = "{";
327 // }
328
329 // loop through items
330 var iCount = 0;
331 // $.each(anObject, function(sKey, vValue) {
332 MochiKit.Iter.forEach(MochiKit.Base.keys(anObject), function(sKey) {
333 var vValue = anObject[sKey];
334
335 if (iCount > 0) {
336 sHTML += ",";
337 }
338 if (sDataType == "array") {
339 sHTML += ("\n" + sIndent + sIndentStyle);
340 } else {
341 sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
342 }
343
344 // display relevant data type
345 switch (realTypeOf(vValue)) {
346 case "array":
347 case "object":
348 sHTML += Clipperz.Base.formatJSON(vValue, (sIndent + sIndentStyle));
349 break;
350 case "boolean":
351 case "number":
352 sHTML += vValue.toString();
353 break;
354 case "null":
355 sHTML += "null";
356 break;
357 case "string":
358 sHTML += ("\"" + vValue + "\"");
359 break;
360 default:
361 sHTML += ("TYPEOF: " + typeof(vValue));
362 }
363
364 // loop
365 iCount++;
366 });
367
368 // close object
369 if (sDataType == "array") {
370 sHTML += ("\n" + sIndent + "]");
371 } else {
372 sHTML += ("\n" + sIndent + "}");
373 }
374
375 // return
376 return sHTML;
377 },
378
379 //-------------------------------------------------------------------------
380
381 'mergeItems': function (anArrayOfValues) {
382 var result;
383 var i, c;
384
385 result = {};
386
387 c = anArrayOfValues.length;
388 for (i=0; i<c; i++) {
389 result[anArrayOfValues[i][0]] = anArrayOfValues[i][1];
390 }
391
392 return result;
393 },
394
395 //-------------------------------------------------------------------------
396
397 'map': function (fn, lstObj/*, lst... */) {
398 var result;
399
400 if (MochiKit.Base.isArrayLike(lstObj)) {
401 result = MochiKit.Base.map.apply(this, arguments);
402 } else {
403 varkeys;
404 var values;
405 var computedValues;
406
407 keys = MochiKit.Base.keys(lstObj);
408 values = MochiKit.Base.values(lstObj);
409 computedValues = MochiKit.Base.map(fn, values);
410
411 result = Clipperz.Base.mergeItems(MochiKit.Base.zip(keys, computedValues));
412 }
413
414 return result;
415 },
416
417 //-------------------------------------------------------------------------
418
419 'sanitizeString': function(aValue) {
420 var result;
421
422 if (Clipperz.Base.objectType(aValue) == 'string') {
423 result = aValue;
424 result = result.replace(/</img,"&lt;");
425 result = result.replace(/>/img,"&gt;");
426 } else {
427 result = aValue;
428 }
429
430 return result;
431 },
432
433 //-------------------------------------------------------------------------
434
435 'module': function(aValue) {
436 // aValue = 'Clipperz.PM.Compact'
437//
438 // if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
439 // if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
440 // if (typeof(Clipperz.PM.UI.Common.Components) == 'undefined') { Clipperz.PM.UI.Common.Components = {}; }
441
442 var currentScope;
443 var pathElements;
444 var i,c;
445
446 currentScope = window;
447 pathElements = aValue.split('.');
448 c = pathElements.length;
449 for (i=0; i<c; i++) {
450 if (typeof(currentScope[pathElements[i]]) == 'undefined') {
451 currentScope[pathElements[i]] = {};
452 }
453
454 currentScope = currentScope[pathElements[i]];
455 }
456 },
457
458 //-------------------------------------------------------------------------
459
460 'exception': {
461 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
462 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType"),
463 'VulnerabilityIssue':new MochiKit.Base.NamedError("Clipperz.Base.exception.VulnerabilityIssue"),
464 'MandatoryParameter':new MochiKit.Base.NamedError("Clipperz.Base.exception.MandatoryParameter"),
465 'ObjectNotFound': new MochiKit.Base.NamedError("Clipperz.Base.exception.ObjectNotFound"),
466 'raise': function (aName) {
467 throw Clipperz.Base.exception[aName];
468 }
469 },
470
471 //-------------------------------------------------------------------------
472
473 'extend': YAHOO.extendX,
474
475 //-------------------------------------------------------------------------
476 __syntaxFix__: "syntax fix"
477
478});
479
480 //Original regExp courtesy of John Gruber: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls
481 //Updated to match Clipperz usage pattern.
482//MochiKit.Base.urlRegExp = new RegExp(/\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))/);
483MochiKit.Base.urlRegExp = new RegExp(/^((([\w-]+:\/\/?)|(www\.))[^\s()<>]+((?:\([\w\d]+\)|([^[:punct:]\s]|\/)))?)/);
484
485 //RegExp found here: http://www.tipsntracks.com/117/validate-an-email-address-using-regular-expressions.html
486MochiKit.Base.emailRegExp = new RegExp(/^([a-zA-Z0-9_\-\.]+)@(([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([01]?\d\d?|2[0-4]\d|25[0-5])\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d))$/);
487
488
489MochiKit.Base.registerComparator('Object dummy comparator',
490 function(a, b) {
491 return ((a.constructor == Object) && (b.constructor == Object));
492 },
493 function(a, b) {
494 var result;
495 var aKeys;
496 var bKeys;
497
498 aKeys = MochiKit.Base.keys(a).sort();
499 bKeys = MochiKit.Base.keys(b).sort();
500 result = MochiKit.Base.compare(aKeys, bKeys);
501
502 if (result == 0) {
503 vari, c;
504
505 c = aKeys.length;
506 for (i=0; (i<c) && (result == 0); i++) {
507 result = MochiKit.Base.compare(a[aKeys[i]], b[bKeys[i]]);
508 }
509 }
510
511 return result;
512 },
513 true
514);
diff --git a/frontend/delta/js/Clipperz/ByteArray.js b/frontend/delta/js/Clipperz/ByteArray.js
new file mode 100644
index 0000000..22c7c6e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/ByteArray.js
@@ -0,0 +1,1459 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25
26//=============================================================================
27
28Clipperz.ByteArray_abstract = function(args) {
29 return this;
30}
31
32Clipperz.ByteArray_abstract.prototype = MochiKit.Base.update(null, {
33
34 //-------------------------------------------------------------------------
35
36 'toString': function() {
37 return "Clipperz.ByteArray_abstract";
38 },
39
40 //-------------------------------------------------------------------------
41
42 'equals': function(aValue) {
43 return (this.compare(aValue) == 0);
44 },
45
46 //-------------------------------------------------------------------------
47
48 'compare': function(aValue) {
49 var result;
50 var i;
51
52 result = MochiKit.Base.compare(this.length(), aValue.length());
53 i = this.length();
54
55 while ((result == 0) && (i>0)) {
56 i--;
57 result = MochiKit.Base.compare(this.byteAtIndex(i), aValue.byteAtIndex(i));
58 }
59
60 return result;
61 },
62
63 //-------------------------------------------------------------------------
64
65 'clone': function() {
66 throw Clipperz.Base.exception.AbstractMethod;
67 },
68
69 //-------------------------------------------------------------------------
70
71 'newInstance': function() {
72 throw Clipperz.Base.exception.AbstractMethod;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'reset': function() {
78 throw Clipperz.Base.exception.AbstractMethod;
79 },
80
81 //-------------------------------------------------------------------------
82
83 'length': function() {
84 throw Clipperz.Base.exception.AbstractMethod;
85 },
86
87 //-------------------------------------------------------------------------
88
89 'checkByteValue': function(aValue) {
90 if ((aValue & 0xff) != aValue) {
91 Clipperz.logError("Clipperz.ByteArray.appendByte: the provided value (0x" + aValue.toString(16) + ") is not a byte value.");
92 throw Clipperz.ByteArray.exception.InvalidValue;
93 }
94 },
95
96 //-------------------------------------------------------------------------
97
98 'xorMergeWithBlock': function(aBlock, anAllignment, paddingMode) {
99 var result;
100 var a, b;
101 var aLength;
102 var bLength;
103 var i, c;
104
105 if (this.length() > aBlock.length()) {
106 a = this;
107 b = aBlock;
108 } else {
109 a = aBlock;
110 b = this;
111 }
112
113 aLength = a.length();
114 bLength = b.length();
115
116 if (aLength != bLength) {
117 if (paddingMode == 'truncate') {
118 if (anAllignment == 'left') {
119 a = a.split(0, bLength);
120 } else {
121 a = a.split(aLength - bLength);
122 }
123 } else {
124 var ii, cc;
125 var padding;
126
127 // padding = new Clipperz.ByteArray();
128 padding = this.newInstance();
129 cc = aLength - bLength;
130 for (ii=0; ii<cc; ii++) {
131 padding.appendByte(0);
132 }
133
134 if (anAllignment == 'left') {
135 b = b.appendBlock(padding);
136 } else {
137 b = padding.appendBlock(b);
138 }
139 }
140 }
141
142 result = this.newInstance();
143 c = a.length();
144 for (i=0; i<c; i++) {
145 result.appendByte(a.byteAtIndex(i) ^ b.byteAtIndex(i));
146 }
147
148 return result;
149 },
150
151 //-------------------------------------------------------------------------
152
153 'appendBlock': function(aBlock) {
154 throw Clipperz.Base.exception.AbstractMethod;
155 },
156
157 //-------------------------------------------------------------------------
158
159 'appendByte': function(aValue) {
160 throw Clipperz.Base.exception.AbstractMethod;
161 },
162
163 'appendBytes': function(args) {
164 varvalues;
165 vari,c;
166
167 if (args.constructor == Array) {
168 values = args;
169 } else {
170 values = arguments;
171 }
172
173 c = values.length;
174 for (i=0; i<c; i++) {
175 this.appendByte(values[i]);
176 }
177
178 return this;
179 },
180
181 //-------------------------------------------------------------------------
182
183 'appendWord': function(aValue, isLittleEndian) {
184 var result;
185 var processAsLittleEndian;
186
187 processAsLittleEndian = isLittleEndian === true ? true : false;
188
189 if (processAsLittleEndian) {
190 result = this.appendBytes( (aValue) & 0xff, (aValue >> 8) & 0xff, (aValue >> 16) & 0xff, (aValue >> 24) & 0xff ); //little endian
191 } else {
192 result = this.appendBytes( (aValue >> 24) & 0xff, (aValue >> 16) & 0xff, (aValue >> 8) & 0xff, (aValue) & 0xff ); //big endian - DEFAULT
193 }
194
195 return result;
196 },
197
198 'appendWords': function(args) {
199 varvalues;
200 vari,c;
201
202 if (args.constructor == Array) {
203 values = args;
204 } else {
205 values = arguments;
206 }
207
208 c = values.length;
209 for (i=0; i<c; i++) {
210 this.appendWord(values[i], false);
211 }
212
213 return this;
214 },
215
216 //-------------------------------------------------------------------------
217
218 'appendBigEndianWords': function(args) {
219 varvalues;
220 vari,c;
221
222 if (args.constructor == Array) {
223 values = args;
224 } else {
225 values = arguments;
226 }
227
228 c = values.length;
229 for (i=0; i<c; i++) {
230 this.appendWord(values[i], true);
231 }
232
233 return this;
234 },
235
236 //-------------------------------------------------------------------------
237
238 'appendBinaryString': function (aBinaryString) {
239 var i,c;
240
241 c = aBinaryString.length;
242 for (i=0; i<c; i++) {
243 this.appendByte(aBinaryString.charCodeAt(i));
244 };
245
246 return this;
247 },
248
249 //-------------------------------------------------------------------------
250
251 'byteAtIndex': function(anIndex) {
252 throw Clipperz.Base.exception.AbstractMethod;
253 },
254
255 'setByteAtIndex': function(aValue, anIndex) {
256 throw Clipperz.Base.exception.AbstractMethod;
257 },
258
259 //-------------------------------------------------------------------------
260
261 'bitAtIndex': function(aBitPosition) {
262 var result;
263 varbytePosition;
264 var bitPositionInSelectedByte;
265 var selectedByte;
266 var selectedByteMask;
267
268 bytePosition = this.length() - Math.ceil((aBitPosition + 1)/ 8);
269 bitPositionInSelectedByte = aBitPosition % 8;
270 selectedByte = this.byteAtIndex(bytePosition);
271
272 if (bitPositionInSelectedByte > 0) {
273 selectedByteMask = (1 << bitPositionInSelectedByte);
274 } else {
275 selectedByteMask = 1;
276 }
277 result = selectedByte & selectedByteMask ? 1 : 0;
278
279 return result;
280 },
281
282 //-------------------------------------------------------------------------
283
284 'bitBlockAtIndexWithSize': function(aBitPosition, aSize) {
285 var result;
286 var bitValue;
287 var i,c;
288
289 result = 0;
290 c = aSize;
291 for (i=0; i<c; i++) {
292 bitValue = this.bitAtIndex(aBitPosition + i);
293 result = result | bitValue << i;
294 }
295
296 return result;
297 },
298
299 //-------------------------------------------------------------------------
300
301 'asString': function() {
302 varresult;
303 varlength;
304 vari;
305
306 result = [];
307
308 i = 0;
309 length = this.length();
310
311 while (i < length) {
312 varcurrentCharacter;
313 varcurrentByte;
314 varunicode;
315
316 currentByte = this.byteAtIndex(i);
317
318 if ((currentByte & 0x80) == 0x00 ) { //0xxxxxxx
319 unicode = currentByte;
320 currentCharacter = String.fromCharCode(unicode);
321 } else if ((currentByte & 0xe0) == 0xc0 ) { //110xxxxx 10xxxxxx
322 unicode = (currentByte & 0x1f) << 6;
323 i++; currentByte = this.byteAtIndex(i);
324 unicode = unicode | (currentByte & 0x3f);
325
326 currentCharacter = String.fromCharCode(unicode);
327 } else if ((currentByte & 0xf0) == 0xe0 ) { //1110xxxx 10xxxxxx 10xxxxxx
328 unicode = (currentByte & 0x0f) << (6+6);
329 i++; currentByte = this.byteAtIndex(i);
330 unicode = unicode | ((currentByte & 0x3f) << 6);
331 i++; currentByte = this.byteAtIndex(i);
332 unicode = unicode | (currentByte & 0x3f);
333
334 currentCharacter = String.fromCharCode(unicode);
335 } else { //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
336 unicode = (currentByte & 0x07) << (6+6+6);
337 i++; currentByte = this.byteAtIndex(i);
338 unicode = unicode | ((currentByte & 0x3f) << (6+6));
339 i++; currentByte = this.byteAtIndex(i);
340 unicode = unicode | ((currentByte & 0x3f) << 6);
341 i++; currentByte = this.byteAtIndex(i);
342 unicode = unicode | (currentByte & 0x3f);
343
344 currentCharacter = String.fromCharCode(unicode);
345 }
346
347 result.push(currentCharacter);
348 i++;
349 }
350
351 return result.join("");
352 },
353
354 //-------------------------------------------------------------------------
355
356 'toHexString': function() {
357 throw Clipperz.Base.exception.AbstractMethod;
358 },
359
360 //-------------------------------------------------------------------------
361
362 'base64map': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
363 'base64mapIndex': "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(''),
364
365 //-------------------------------------------------------------------------
366
367 'appendBase64String': function(aValue) {
368 var i;
369 var length;
370
371 length = aValue.length;
372
373 if ((length % 4) != 0) {
374 Clipperz.logError("the value passed to the 'ByteArray.setBase64Value' is not correct");
375 throw Clipperz.ByteArray.exception.InvalidValue;
376 }
377
378 i = 0;
379 while (i<length) {
380 var value1, value2, value3, value4;
381 var byte1, byte2, byte3;
382
383 value1 = this.base64map.indexOf(aValue.charAt(i));
384 value2 = this.base64map.indexOf(aValue.charAt(i+1));
385 value3 = this.base64map.indexOf(aValue.charAt(i+2));
386 value4 = this.base64map.indexOf(aValue.charAt(i+3));
387
388 byte1 = (value1 << 2) | ((value2 & 0x30) >> 4);
389 if (value3 != -1) {
390 byte2 = ((value2 & 0x0f) << 4) | ((value3 & 0x3c) >> 2);
391
392 if (value4 != -1) {
393 byte3 = ((value3 & 0x03) << 6) | (value4);
394 } else {
395 byte3 = null;
396 }
397 } else {
398 byte2 = null;
399 byte3 = null;
400 }
401
402 this.appendByte(byte1);
403 this.appendByte(byte2);
404 this.appendByte(byte3);
405
406 i += 4;
407 }
408
409 return this;
410 },
411
412 //-------------------------------------------------------------------------
413
414 'toBase64String': function() {
415 var result;
416 var length;
417 var i;
418 var byte1, byte2, byte3;
419 var char1, char2, char3, char4;
420
421 i = 0;
422 length = this.length();
423 result = new Array(Math.ceil(length/3));
424
425 while (i < length) {
426 byte1 = this.byteAtIndex(i);
427 if ((i+2) < length) {
428 byte2 = this.byteAtIndex(i+1);
429 byte3 = this.byteAtIndex(i+2);
430 } else if ((i+2) == length) {
431 byte2 = this.byteAtIndex(i+1);
432 byte3 = null;
433 } else {
434 byte2 = null;
435 byte3 = null;
436 }
437
438 char1 = this.base64mapIndex[byte1 >> 2];
439 if (byte2 != null) {
440 char2 = this.base64mapIndex[((byte1 & 0x03) << 4) | ((byte2 & 0xf0) >> 4)];
441 if (byte3 != null) {
442 char3 = this.base64mapIndex[((byte2 & 0x0f) << 2) | ((byte3 & 0xc0) >> 6)];
443 char4 = this.base64mapIndex[(byte3 & 0x3f)];
444 } else {
445 char3 = this.base64mapIndex[(byte2 & 0x0f) << 2];
446 char4 = "=";
447 }
448 } else {
449 char2 = this.base64mapIndex[(byte1 & 0x03) << 4];
450 char3 = "=";
451 char4 = "=";
452 }
453
454 result.push(char1 + char2 + char3 + char4);
455
456 i += 3;
457 }
458
459 return result.join("");
460 },
461
462 //-------------------------------------------------------------------------
463
464 'base32map': "0123456789abcdefghjkmnpqrstvwxyz",
465 'base32mapIndex': "0123456789abcdefghjkmnpqrstvwxyz".split(''),
466
467 //-------------------------------------------------------------------------
468
469 'appendBase32String': function(aValue) {
470 var value;
471 var i;
472 var length;
473 var value1, value2, value3, value4, value5, value6, value7, value8;
474 var byte1, byte2, byte3, byte4, byte5;
475
476 value = aValue.toLowerCase();
477 value = value.replace(/[\s\-]/g, '');
478 value = value.replace(/[0o]/g, '0');
479 value = value.replace(/[1il]/g, '1');
480
481 length = value.length;
482
483 if ((length % 8) != 0) {
484 Clipperz.logError("the value passed to the 'ByteArray.setBase32Value' is not correct");
485 throw Clipperz.ByteArray.exception.InvalidValue;
486 }
487
488 i = 0;
489 while (i<length) {
490 value1 = this.base32map.indexOf(value.charAt(i));
491 value2 = this.base32map.indexOf(value.charAt(i+1));
492 value3 = this.base32map.indexOf(value.charAt(i+2));
493 value4 = this.base32map.indexOf(value.charAt(i+3));
494 value5 = this.base32map.indexOf(value.charAt(i+4));
495 value6 = this.base32map.indexOf(value.charAt(i+5));
496 value7 = this.base32map.indexOf(value.charAt(i+6));
497 value8 = this.base32map.indexOf(value.charAt(i+7));
498
499 byte1 = byte2 = byte3 = byte4 = byte5 = null;
500
501 byte1 = (value1 << 3) | ((value2 & 0x1c) >> 2);
502 if (value3 != -1) {
503 byte2 = ((value2 & 0x03) << 6) | (value3 << 1) | ((value4 & 0x10) >> 4);
504 if (value5 != -1) {
505 byte3 = ((value4 & 0x0f) << 4) | ((value5 & 0x1e) >> 1);
506 if (value6 != -1) {
507 byte4 = ((value5 & 0x01) << 7) | (value6 << 2) | ((value7 & 0x18) >> 3);
508 if (value8 != -1) {
509 byte5 = ((value7 & 0x07) << 5) | (value8);
510 }
511 }
512 }
513 }
514
515 this.appendByte(byte1);
516 this.appendByte(byte2);
517 this.appendByte(byte3);
518 this.appendByte(byte4);
519 this.appendByte(byte5);
520
521 i += 8;
522 }
523
524 return this;
525 },
526
527 //-------------------------------------------------------------------------
528
529 'toBase32String': function() {
530 var result;
531 var length;
532 var i;
533 var byte1, byte2, byte3, byte4, byte5;
534 var char1, char2, char3, char4, char5, char6, char7, char8;
535
536 i = 0;
537 length = this.length();
538 result = new Array(Math.ceil(length/5));
539
540 while (i < length) {
541 byte1 = this.byteAtIndex(i);
542
543 if ((i+4) < length) {
544 byte2 = this.byteAtIndex(i+1);
545 byte3 = this.byteAtIndex(i+2);
546 byte4 = this.byteAtIndex(i+3);
547 byte5 = this.byteAtIndex(i+4);
548 } else if ((i+4) == length) {
549 byte2 = this.byteAtIndex(i+1);
550 byte3 = this.byteAtIndex(i+2);
551 byte4 = this.byteAtIndex(i+3);
552 byte5 = null;
553 } else if ((i+3) == length) {
554 byte2 = this.byteAtIndex(i+1);
555 byte3 = this.byteAtIndex(i+2);
556 byte4 = null;
557 byte5 = null;
558 } else if ((i+2) == length) {
559 byte2 = this.byteAtIndex(i+1);
560 byte3 = null;
561 byte4 = null;
562 byte5 = null;
563 } else {
564 byte2 = null;
565 byte3 = null;
566 byte4 = null;
567 byte5 = null;
568 }
569
570
571 char1 = this.base32mapIndex[byte1 >> 3];
572 char2 = char3 = char4 = char5 = char6 = char7 = char8 = "=";
573
574 if (byte2 != null) {
575 char2 = this.base32mapIndex[((byte1 & 0x07) << 2) | ((byte2 & 0xc0) >> 6)];
576 char3 = this.base32mapIndex[((byte2 & 0x3e) >> 1)];
577 if (byte3 != null) {
578 char4 = this.base32mapIndex[((byte2 & 0x01) << 4) | ((byte3 & 0xf0) >> 4)];
579 if (byte4 != null) {
580 char5 = this.base32mapIndex[((byte3 & 0x0f) << 1) | ((byte4 & 0x80) >> 7)];
581 char6 = this.base32mapIndex[(byte4 & 0x7c) >> 2];
582 if (byte5 != null) {
583 char7 = this.base32mapIndex[((byte4 & 0x03) << 3) | ((byte5 & 0xe0) >> 5)];
584 char8 = this.base32mapIndex[(byte5 & 0x1f)];
585 } else {
586 char7 = this.base32mapIndex[(byte4 & 0x03) << 3];
587 }
588 } else {
589 char5 = this.base32mapIndex[(byte3 & 0x0f) << 1];
590 }
591
592 } else {
593 char4 = this.base32mapIndex[(byte2 & 0x01) << 4];
594 }
595 } else {
596 char2 = this.base32mapIndex[(byte1 & 0x07) << 2];
597 }
598
599 result.push(char1 + char2 + char3 + char4 + char5 + char6 + char7 + char8);
600 i += 5;
601 }
602
603 return result.join("");
604 },
605
606 //-------------------------------------------------------------------------
607
608 'toBinaryString': function () {
609 vari, c;
610 var result;
611
612 result = '';
613
614 c = this.length();
615 for (i=0; i<c; i++) {
616 result += String.fromCharCode(this.byteAtIndex(i));
617 }
618
619 return result;
620 },
621
622
623 //-------------------------------------------------------------------------
624
625 'split': function(aStartingIndex, anEndingIndex) {
626 throw Clipperz.Base.exception.AbstractMethod;
627 },
628
629 //-------------------------------------------------------------------------
630
631 'increment': function() {
632 var i;
633 var done;
634
635 done = false;
636 i = this.length() - 1;
637
638 while ((i>=0) && (done == false)) {
639 var currentByteValue;
640
641 currentByteValue = this.byteAtIndex(i);
642
643 if (currentByteValue == 0xff) {
644 this.setByteAtIndex(0, i);
645 if (i>= 0) {
646 i --;
647 } else {
648 done = true;
649 }
650 } else {
651 this.setByteAtIndex(currentByteValue + 1, i);
652 done = true;
653 }
654 }
655 },
656
657 //-------------------------------------------------------------------------
658
659 'arrayValues': function() {
660 throw Clipperz.Base.exception.AbstractMethod;
661 },
662
663 //-------------------------------------------------------------------------
664 __syntaxFix__: "syntax fix"
665
666});
667
668//=============================================================================
669//
670 //Clipperz.ByteArray_hex
671//
672//=============================================================================
673/*
674Clipperz.ByteArray_hex = function (args) {
675 this._value = "";
676
677 if (typeof(args) != 'undefined') {
678 if (args.constructor == Array) {
679 this.appendBytes(args);
680 } else if (args.constructor == String) {
681 if (args.indexOf("0x") == 0) {
682 varvalue;
683
684 value = args.substring(2).toLowerCase();
685 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activate
686 if ((value.length % 2) == 0) {
687 this._value = value;
688 } else {
689 this._value = "0" + value;
690 }
691 } else {
692Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
693 throw Clipperz.ByteArray.exception.InvalidValue;
694 }
695 } else {
696 varvalue;
697 vari,c;
698
699 c = args.length;
700 value = new Array(c);
701 for (i=0; i<c; i++) {
702 value.push(Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i)));
703 }
704
705 this._value = value.join("");
706 }
707 } else {
708 this.appendBytes(MochiKit.Base.extend(null, arguments));
709 }
710 }
711 return this;
712}
713
714Clipperz.ByteArray_hex.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
715
716 //-------------------------------------------------------------------------
717
718 'toString': function() {
719 return "Clipperz.ByteArray_hex";
720 },
721
722 //-------------------------------------------------------------------------
723
724 'clone': function() {
725 var result;
726
727 result = this.newInstance();
728 result._value = this._value;
729
730 return result;
731 },
732
733 //-------------------------------------------------------------------------
734
735 'newInstance': function() {
736 return new Clipperz.ByteArray_hex();
737 },
738
739 //-------------------------------------------------------------------------
740
741 'reset': function() {
742 this._value = "";
743 },
744
745 //-------------------------------------------------------------------------
746
747 'length': function() {
748 return (this._value.length / 2);
749 },
750
751 //-------------------------------------------------------------------------
752
753 'appendBlock': function(aBlock) {
754 this._value = this._value += aBlock.toHexString().substring(2);
755
756 return this;
757 },
758
759 //-------------------------------------------------------------------------
760
761 'appendByte': function(aValue) {
762 if (aValue != null) {
763 this.checkByteValue(aValue);
764 this._value += Clipperz.ByteArray.byteToHex(aValue);
765 }
766
767 return this;
768 },
769
770 //-------------------------------------------------------------------------
771
772 'byteAtIndex': function(anIndex) {
773 return parseInt(this._value.substr(anIndex*2, 2), 16);
774 },
775
776 'setByteAtIndex': function(aValue, anIndex) {
777 varmissingBytes;
778
779 this.checkByteValue(aValue);
780
781 missingBytes = anIndex - this.length();
782
783 if (missingBytes < 0) {
784 varcurrentValue;
785 varfirstCutIndex;
786 var secondCutIndex;
787
788 firstCutIndex = anIndex * 2;
789 secondCutIndex = firstCutIndex + 2;
790 currentValue = this._value;
791 this._value =currentValue.substring(0, firstCutIndex) +
792 Clipperz.ByteArray.byteToHex(aValue) +
793 currentValue.substring(secondCutIndex);
794 } else if (missingBytes == 0) {
795 this.appendByte(aValue);
796 } else {
797 var i,c;
798
799 c = missingBytes;
800 for (i=0; i<c; i++) {
801 this.appendByte(0);
802 }
803
804 this.appendByte(aValue);
805 }
806 },
807
808 //-------------------------------------------------------------------------
809
810 'toHexString': function() {
811 return "0x" + this._value;
812 },
813
814 //-------------------------------------------------------------------------
815
816 'split': function(aStartingIndex, anEndingIndex) {
817 var result;
818 varstartingIndex;
819 var endingIndex;
820
821 result = this.newInstance();
822
823 startingIndex = aStartingIndex * 2;
824 if (typeof(anEndingIndex) != 'undefined') {
825 endingIndex = anEndingIndex * 2;
826 result._value = this._value.substring(startingIndex, endingIndex);
827 } else {
828 result._value = this._value.substring(startingIndex);
829 }
830
831 return result;
832 },
833
834 //-------------------------------------------------------------------------
835
836 'arrayValues': function() {
837 var result;
838 var i,c;
839
840 c = this.length();
841
842 result = new Array(c);
843 for (i=0; i<c; i++) {
844 result[i] = this.byteAtIndex(i);
845 }
846
847 return result;
848 },
849
850 //-------------------------------------------------------------------------
851 __syntaxFix__: "syntax fix"
852});
853*/
854
855//=============================================================================
856//
857 //Clipperz.ByteArray_array
858//
859//=============================================================================
860
861Clipperz.ByteArray_array = function (args) {
862 if (typeof(args) != 'undefined') {
863 if (args.constructor == Array) {
864 this._value = args.slice(0);
865 } else if (args.constructor == String) {
866 var result;
867 varvalue;
868 var i, c;
869
870 if (args.indexOf("0x") == 0) {
871
872 value = args.substring(2).toLowerCase();
873 if (/[0123456789abcdef]*/.test(value)) {
874 if ((value.length % 2) != 0) {
875 value = "0" + value;
876 }
877 } else {
878 Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
879 throw Clipperz.ByteArray.exception.InvalidValue;
880 }
881
882 c = value.length / 2
883 result = new Array(c);
884 for (i=0; i<c; i++) {
885 result[i] = parseInt(value.substr(i*2, 2), 16);
886 }
887
888 } else {
889 var unicode;
890 result = [];
891 c = args.length;
892 for (i=0; i<c; i++) {
893 // Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar(result, args.charCodeAt(i));
894
895 unicode = args.charCodeAt(i);
896 if (unicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
897 result.push(unicode);
898 // } else if ((unicode >= 0x80) && (unicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
899 } else if (unicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
900 result.push((unicode >> 6) | 0xc0);
901 result.push((unicode & 0x3F) | 0x80);
902 // } else if ((unicode >= 0x0800) && (unicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
903 } else if (unicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
904 result.push((unicode >> 12) | 0xe0);
905 result.push(((unicode >> 6) & 0x3f) | 0x80);
906 result.push((unicode & 0x3f) | 0x80);
907 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
908 result.push((unicode >> 18) | 0xf0);
909 result.push(((unicode >> 12) & 0x3f) | 0x80);
910 result.push(((unicode >> 6) & 0x3f) | 0x80);
911 result.push((unicode & 0x3f) | 0x80);
912 }
913 }
914 }
915
916
917 this._value = result;
918 } else {
919 this._value = [];
920 this.appendBytes(MochiKit.Base.extend(null, arguments));
921 }
922 } else {
923 this._value = [];
924 }
925
926 return this;
927}
928
929Clipperz.ByteArray_array.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
930
931 //-------------------------------------------------------------------------
932
933 'toString': function() {
934 return "Clipperz.ByteArray_array";
935 },
936
937 //-------------------------------------------------------------------------
938
939 'clone': function() {
940 var result;
941
942 result = this.newInstance();
943 result.appendBytes(this._value);
944
945 return result;
946 },
947
948 //-------------------------------------------------------------------------
949
950 'newInstance': function() {
951 return new Clipperz.ByteArray_array();
952 },
953
954 //-------------------------------------------------------------------------
955
956 'reset': function() {
957 this._value = [];
958 },
959
960 //-------------------------------------------------------------------------
961
962 'length': function() {
963 return (this._value.length);
964 },
965
966 //-------------------------------------------------------------------------
967
968 'appendBlock': function(aBlock) {
969 MochiKit.Base.extend(this._value, aBlock._value);
970
971 return this;
972 },
973
974 //-------------------------------------------------------------------------
975
976 'appendByte': function(aValue) {
977 if (aValue != null) {
978 this.checkByteValue(aValue);
979 this._value.push(aValue);
980 }
981
982 return this;
983 },
984
985 //-------------------------------------------------------------------------
986
987 'byteAtIndex': function(anIndex) {
988 return this._value[anIndex];
989 },
990
991 'setByteAtIndex': function(aValue, anIndex) {
992 varmissingBytes;
993
994 this.checkByteValue(aValue);
995
996 missingBytes = anIndex - this.length();
997
998 if (missingBytes < 0) {
999 this._value[anIndex] = aValue;
1000 } else if (missingBytes == 0) {
1001 this._value.push(aValue);
1002 } else {
1003 var i,c;
1004
1005 c = missingBytes;
1006 for (i=0; i<c; i++) {
1007 this._value.push(0);
1008 }
1009
1010 this._value.push(aValue);
1011 }
1012 },
1013
1014 //-------------------------------------------------------------------------
1015
1016 'toHexString': function() {
1017 var result;
1018 var i, c;
1019
1020 result = "0x";
1021 c = this.length();
1022 for (i=0; i<c; i++) {
1023 result += Clipperz.ByteArray.byteToHex(this._value[i]);
1024 }
1025
1026 return result;
1027 },
1028
1029 //-------------------------------------------------------------------------
1030
1031 'split': function(aStartingIndex, anEndingIndex) {
1032 var result;
1033
1034 result = this.newInstance();
1035 result._value = this._value.slice(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1036
1037 return result;
1038 },
1039
1040 //-------------------------------------------------------------------------
1041
1042 'arrayValues': function() {
1043 return this._value.slice(0);
1044 },
1045
1046 //-------------------------------------------------------------------------
1047 __syntaxFix__: "syntax fix"
1048});
1049
1050
1051
1052
1053
1054//=============================================================================
1055//
1056 //Clipperz.ByteArray_string
1057//
1058//=============================================================================
1059/*
1060Clipperz.ByteArray_string = function (args) {
1061 this._value = "";
1062
1063 if (typeof(args) != 'undefined') {
1064 if (args.constructor == Array) {
1065 this.appendBytes(args);
1066 } else if (args.constructor == String) {
1067 var result;
1068 varvalue;
1069 var i, c;
1070
1071 if (args.indexOf("0x") == 0) {
1072
1073 value = args.substring(2).toLowerCase();
1074 if (/[0123456789abcdef]* /.test(value)) { the space in the regexp shoud be removed if the code is activated
1075 if ((value.length % 2) != 0) {
1076 value = "0" + value;
1077 }
1078 } else {
1079Clipperz.logError("Clipperz.ByteArray should be inizialized with an hex string.");
1080 throw Clipperz.ByteArray.exception.InvalidValue;
1081 }
1082 } else {
1083 value = "";
1084 c = args.length;
1085 for (i=0; i<c; i++) {
1086 value += Clipperz.ByteArray.unicodeToUtf8HexString(args.charCodeAt(i));
1087 }
1088 }
1089
1090 c = value.length / 2
1091 for (i=0; i<c; i++) {
1092 this.appendByte(parseInt(value.substr(i*2, 2), 16));
1093 }
1094 } else {
1095 this.appendBytes(MochiKit.Base.extend(null, arguments));
1096 }
1097 }
1098
1099 return this;
1100}
1101
1102Clipperz.ByteArray_string.prototype = MochiKit.Base.update(new Clipperz.ByteArray_abstract(), {
1103
1104 //-------------------------------------------------------------------------
1105
1106 'toString': function() {
1107 return "Clipperz.ByteArray_string";
1108 },
1109
1110 //-------------------------------------------------------------------------
1111
1112 'clone': function() {
1113 var result;
1114
1115 result = this.newInstance();
1116 result._value = this._value;
1117
1118 return result;
1119 },
1120
1121 //-------------------------------------------------------------------------
1122
1123 'newInstance': function() {
1124 return new Clipperz.ByteArray_string();
1125 },
1126
1127 //-------------------------------------------------------------------------
1128
1129 'reset': function() {
1130 this._value = "";
1131 },
1132
1133 //-------------------------------------------------------------------------
1134
1135 'length': function() {
1136 return (this._value.length);
1137 },
1138
1139 //-------------------------------------------------------------------------
1140
1141 'appendBlock': function(aBlock) {
1142 this._value += aBlock._value;
1143
1144 return this;
1145 },
1146
1147 //-------------------------------------------------------------------------
1148
1149 'appendByte': function(aValue) {
1150 if (aValue != null) {
1151 this.checkByteValue(aValue);
1152 this._value += String.fromCharCode(aValue);
1153 }
1154
1155 return this;
1156 },
1157
1158 //-------------------------------------------------------------------------
1159
1160 'byteAtIndex': function(anIndex) {
1161 return this._value.charCodeAt(anIndex);
1162 },
1163
1164 'setByteAtIndex': function(aValue, anIndex) {
1165 varmissingBytes;
1166
1167 this.checkByteValue(aValue);
1168
1169 missingBytes = anIndex - this.length();
1170
1171 if (missingBytes < 0) {
1172 this._value = this._value.substring(0, anIndex) + String.fromCharCode(aValue) + this._value.substring(anIndex + 1);
1173 } else if (missingBytes == 0) {
1174 this.appendByte(aValue);
1175 } else {
1176 var i,c;
1177
1178 c = missingBytes;
1179 for (i=0; i<c; i++) {
1180 this.appendByte(0);
1181 }
1182
1183 this.appendByte(aValue);
1184 }
1185 },
1186
1187 //-------------------------------------------------------------------------
1188
1189 'toHexString': function() {
1190 var result;
1191 var i, c;
1192
1193 result = "0x";
1194 c = this.length();
1195 for (i=0; i<c; i++) {
1196 result += Clipperz.ByteArray.byteToHex(this.byteAtIndex(i));
1197 }
1198
1199 return result;
1200 },
1201
1202 //-------------------------------------------------------------------------
1203
1204 'split': function(aStartingIndex, anEndingIndex) {
1205 var result;
1206 result = this.newInstance();
1207 result._value = this._value.substring(aStartingIndex, anEndingIndex ? anEndingIndex : this.length());
1208
1209 return result;
1210 },
1211
1212 //-------------------------------------------------------------------------
1213
1214 'arrayValues': function() {
1215 var result;
1216 var i,c;
1217
1218 c = this.length();
1219
1220 result = new Array(c);
1221 for (i=0; i<c; i++) {
1222 result[i] = this.byteAtIndex(i);
1223 }
1224
1225 return result;
1226 },
1227
1228 //-------------------------------------------------------------------------
1229 __syntaxFix__: "syntax fix"
1230});
1231*/
1232
1233//=============================================================================
1234//
1235 //Clipperz.ByteArray
1236//
1237//=============================================================================
1238
1239Clipperz.ByteArray = Clipperz.ByteArray_array;
1240//Clipperz.ByteArray = Clipperz.ByteArray_string;
1241//Clipperz.ByteArray = Clipperz.ByteArray_hex;
1242
1243//#############################################################################
1244
1245Clipperz.ByteArray.byteToHex = function(aByte) {
1246 return ((aByte < 16) ? "0" : "") + aByte.toString(16);
1247}
1248
1249
1250Clipperz.ByteArray.unicodeToUtf8HexString = function(aUnicode) {
1251 var result;
1252 varself;
1253
1254 self = Clipperz.ByteArray;
1255
1256 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1257 result = self.byteToHex(aUnicode);
1258 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1259 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1260 result = self.byteToHex((aUnicode >> 6) | 0xc0);
1261 result += self.byteToHex((aUnicode & 0x3F) | 0x80);
1262 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1263 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1264 result = self.byteToHex((aUnicode >> 12) | 0xe0);
1265 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1266 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1267 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1268 result = self.byteToHex((aUnicode >> 18) | 0xf0);
1269 result += self.byteToHex(((aUnicode >> 12) & 0x3f) | 0x80);
1270 result += self.byteToHex(((aUnicode >> 6) & 0x3f) | 0x80);
1271 result += self.byteToHex((aUnicode & 0x3f) | 0x80);
1272 }
1273
1274 return result;
1275}
1276
1277Clipperz.ByteArray.pushUtf8BytesOfUnicodeChar = function(anArray, aUnicode) {
1278 varself;
1279
1280 self = Clipperz.ByteArray;
1281
1282 if (aUnicode <= 0x7f) { //0x00000000 - 0x0000007f -> 0xxxxxxx
1283 anArray.push(aUnicode);
1284 // } else if ((aUnicode >= 0x80) && (aUnicode <= 0x7ff)) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1285 } else if (aUnicode <= 0x7ff) { //0x00000080 - 0x000007ff -> 110xxxxx 10xxxxxx
1286 anArray.push((aUnicode >> 6) | 0xc0);
1287 anArray.push((aUnicode & 0x3F) | 0x80);
1288 // } else if ((aUnicode >= 0x0800) && (aUnicode <= 0xffff)) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1289 } else if (aUnicode <= 0xffff) { //0x00000800 - 0x0000ffff -> 1110xxxx 10xxxxxx 10xxxxxx
1290 anArray.push((aUnicode >> 12) | 0xe0);
1291 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1292 anArray.push((aUnicode & 0x3f) | 0x80);
1293 } else { //0x00010000 - 0x001fffff -> 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1294 anArray.push((aUnicode >> 18) | 0xf0);
1295 anArray.push(((aUnicode >> 12) & 0x3f) | 0x80);
1296 anArray.push(((aUnicode >> 6) & 0x3f) | 0x80);
1297 anArray.push((aUnicode & 0x3f) | 0x80);
1298 }
1299}
1300
1301Clipperz.ByteArray.prefixMatchingBits = function (aValue, bValue) {
1302 varresult;
1303 var i,c;
1304
1305 result = 0;
1306
1307 c = Math.min(aValue.length(), bValue.length());
1308 i = 0;
1309 while (i<c && (aValue.byteAtIndex(i) == bValue.byteAtIndex(i))) {
1310 result += 8;
1311 i++;
1312 }
1313
1314 if (i<c) {
1315 varxorValue;
1316
1317 xorValue = (aValue.byteAtIndex(i) ^ bValue.byteAtIndex(i));
1318
1319 if (xorValue >= 128) {
1320 result += 0;
1321 } else if (xorValue >= 64) {
1322 result += 1;
1323 } else if (xorValue >= 32) {
1324 result += 2;
1325 } else if (xorValue >= 16) {
1326 result += 3;
1327 } else if (xorValue >= 8) {
1328 result += 4;
1329 } else if (xorValue >= 4) {
1330 result += 5;
1331 } else if (xorValue >= 2) {
1332 result += 6;
1333 } else if (xorValue >= 1) {
1334 result += 7;
1335 }
1336 }
1337
1338 return result;
1339};
1340
1341Clipperz.ByteArray.exception = {
1342 InvalidValue: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue")
1343};
1344
1345//#############################################################################
1346
1347Clipperz.ByteArrayIterator = function(args) {
1348 args = args || {};
1349
1350 this._byteArray = args.byteArray;
1351 this._blockSize = args.blockSize;
1352 this._finalPadding = args.finalPadding || false;
1353
1354 this._currentPosition = 0;
1355
1356 return this;
1357}
1358
1359Clipperz.ByteArrayIterator.prototype = MochiKit.Base.update(null, {
1360
1361 //-------------------------------------------------------------------------
1362
1363 'toString': function() {
1364 return "Clipperz.ByteArrayIterator";
1365 },
1366
1367 //-------------------------------------------------------------------------
1368
1369 'blockSize': function() {
1370 var result;
1371
1372 result = this._blockSize;
1373
1374 return result;
1375 },
1376
1377 //-------------------------------------------------------------------------
1378
1379 'currentPosition': function() {
1380 var result;
1381
1382 result = this._currentPosition;
1383
1384 return result;
1385 },
1386
1387 //-------------------------------------------------------------------------
1388
1389 'byteArray': function() {
1390 var result;
1391
1392 result = this._byteArray;
1393
1394 return result;
1395 },
1396
1397 //-------------------------------------------------------------------------
1398
1399 'finalPadding': function() {
1400 var result;
1401
1402 result = this._finalPadding;
1403
1404 return result;
1405 },
1406
1407 //-------------------------------------------------------------------------
1408
1409 'nextBlock': function() {
1410 var result;
1411 var currentPosition;
1412 varbyteArrayLength;
1413
1414 currentPosition = this._currentPosition;
1415 byteArrayLength = this.byteArray().length();
1416
1417 if (currentPosition < byteArrayLength) {
1418 var i,c;
1419
1420 c = this.blockSize();
1421 result = new Array(c);
1422 for (i=0; i<c; i++) {
1423 if (currentPosition < byteArrayLength) {
1424 result[i] = this.byteArray().byteAtIndex(currentPosition);
1425 currentPosition++;
1426 } else if (this.finalPadding() == true) {
1427 result[i] = 0;
1428 }
1429 }
1430
1431 this._currentPosition = currentPosition;
1432 } else {
1433 result = null;
1434 }
1435
1436 return result;
1437 },
1438
1439 //-------------------------------------------------------------------------
1440
1441 'nextBlockArray': function() {
1442 var result;
1443 var nextBlock;
1444
1445 nextBlock = this.nextBlock();
1446
1447 if (nextBlock != null) {
1448 result = new Clipperz.ByteArray(nextBlock);
1449 } else {
1450 result = null;
1451 }
1452
1453 return result;
1454 },
1455
1456 //-----------------------------------------------------------------------------
1457 __syntaxFix__: "syntax fix"
1458
1459});
diff --git a/frontend/delta/js/Clipperz/CSVProcessor.js b/frontend/delta/js/Clipperz/CSVProcessor.js
new file mode 100644
index 0000000..1288ed7
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/CSVProcessor.js
@@ -0,0 +1,344 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25
26
27Clipperz.CSVProcessor = function(args) {
28 args = args || {};
29
30 // this._status = undefined;
31 // this._error_input= undefined;
32 // this._string = undefined;
33 // this._fields = undefined;
34
35 this._quoteChar = args['quoteChar'] ||"\042";
36 this._eol = args['eol'] ||"";
37 this._escapeChar = args['escapeChar'] ||"\042";
38 this._separatorChar = args['separatorChar'] ||",";
39 this._binary = args['binary'] ||false;
40 this._alwaysQuote = args['alwaysQuote'] ||false;
41
42 return this;
43}
44
45//=============================================================================
46
47Clipperz.CSVProcessor.prototype = MochiKit.Base.update(null, {
48
49 //-------------------------------------------------------------------------
50
51 'quoteChar': function() {
52 return this._quoteChar;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'eol': function() {
58 return this._eol;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'escapeChar': function() {
64 return this._escapeChar;
65 },
66
67 //-------------------------------------------------------------------------
68
69 'separatorChar': function() {
70 return this._separatorChar;
71 },
72
73 'setSeparatorChar': function(aValue) {
74 this._separatorChar = aValue;
75 },
76
77 //-------------------------------------------------------------------------
78
79 'binary': function() {
80 return this._binary;
81 },
82
83 //-------------------------------------------------------------------------
84
85 'alwaysQuote': function() {
86 return this._alwaysQuote;
87 },
88
89 //-------------------------------------------------------------------------
90/*
91 'parse': function(aValue) {
92 var result;
93 var lines;
94 var parameter;
95
96//Clipperz.logDebug(">>> CSVProcessor.parse");
97 result = [];
98
99 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n* /g, "").replace(/\n$/g, "");;
100 parameter = {
101 line: lines
102 }
103
104 do {
105 var fields;
106
107 fields = this.parseLine(parameter);
108
109 if (fields != null) {
110 result.push(fields);
111 }
112
113 parameter.line = parameter.line.replace(/^\n* /g, "").replace(/\n$/g, "");
114
115//Clipperz.logDebug("line: '" + parameter.line + "'");
116 } while (parameter.line != "");
117//Clipperz.logDebug("--- CSVProcessor.parse - result: " + Clipperz.Base.serializeJSON(result));
118//Clipperz.logDebug("<<< CSVProcessor.parse");
119
120 return result;
121 },
122*/
123 //-------------------------------------------------------------------------
124
125 'deferredParse_core': function(aContext) {
126 var deferredResult;
127
128 if (aContext.line == "") {
129 deferredResult = MochiKit.Async.succeed(aContext.result);
130 } else {
131 var fields;
132
133 fields = this.parseLine(aContext);
134 if (fields != null) {
135 aContext.result.push(fields);
136 }
137
138 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
139
140 deferredResult = new Clipperz.Async.Deferred("CVSProcessor.deferredParse_core");
141 // deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
142 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
143 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
144 deferredResult.addMethod(this, 'deferredParse_core')
145 deferredResult.callback(aContext);
146 }
147
148 return deferredResult;
149 },
150
151 //.........................................................................
152
153 'deferredParse': function(aValue) {
154 var deferredResult;
155 var lines;
156 var context;
157
158 lines = aValue.replace(/\r?\n/g, "\n").replace(/^\n*/g, "").replace(/\n$/g, "");
159
160 context = {
161 line: lines,
162 size: lines.length,
163 result: []
164 }
165
166 deferredResult = new Clipperz.Async.Deferred("CSVProcessor.deferredParse");
167 deferredResult.addMethod(this, 'deferredParse_core');
168 deferredResult.callback(context);
169
170 return deferredResult;
171 },
172
173 //-------------------------------------------------------------------------
174
175 'parseLine': function(aParameter) {
176 var result;
177 var palatable;
178 var line;
179 var processedField;
180
181 result = [];
182
183 do {
184 processedField = this.parseField(aParameter);
185 if (processedField != null) {
186 result.push(processedField)
187 };
188 } while (processedField != null);
189
190 return result;
191 },
192
193 //-------------------------------------------------------------------------
194
195 'parseField': function(aParameter) {
196 var result;
197
198 var inQuotes;
199 var validRegExp;
200 var singleQuoteBeginRegexp;
201 var escapedQuoteBeginRegexp;
202 var singleQuoteCommaEndRegexp;
203 var singleQuoteNewLineEndRegexp;
204 var commaBeginRegexp;
205 var newlineRegexp;
206
207
208 singleQuoteBeginRegexp = new RegExp("^" + '\\' + this.quoteChar());
209 escapedQuoteBeginRegexp = new RegExp("^" + '\\' + this.escapeChar() + '\\' + this.quoteChar());
210 singleQuoteCommaEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + '\\' + this.separatorChar());
211 singleQuoteNewLineEndRegexp= new RegExp("^" + '\\' + this.quoteChar() + "\n");
212 commaBeginRegexp = new RegExp("^" + '\\' + this.separatorChar());
213 newlineRegexp = new RegExp("^\n");
214
215 inQuotes = false;
216
217//Clipperz.logDebug("#################################### '" + aParameter.line + "'");
218 if (aParameter.line == "") {
219 if (aParameter.isThereAnEmptyFinalField == true) {
220 aParameter.isThereAnEmptyFinalField = false;
221 result = "";
222 } else {
223 result = null;
224 }
225 } else {
226 if (this.binary()) {
227 validRegexp = /^./;
228 // validRegexp = /^[^\\]/;
229 } else {
230 validRegexp = /^[\t\040-\176]/;
231 }
232
233 try {
234 var done;
235
236 done = false;
237 result = "";
238
239 while (!done) {
240 if (aParameter.line.length < 1) {
241//Clipperz.logDebug("---> 1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
242 if (inQuotes == true) {
243//Clipperz.logDebug("---> 1.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
244 throw new Error("CSV Parsing error; end of string, missing closing double-quote...");
245 } else {
246//Clipperz.logDebug("---> 1.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
247 done = true;
248 }
249 } else if (escapedQuoteBeginRegexp.test(aParameter.line)) {
250//Clipperz.logDebug("---> 2.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
251 result += this.quoteChar();
252 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
253//Clipperz.logDebug("<--- 2.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
254 } else if (singleQuoteBeginRegexp.test(aParameter.line)) {
255//Clipperz.logDebug("---> 3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
256 if (inQuotes == true) {
257 if (aParameter.line.length == 1) {
258//Clipperz.logDebug("---> 3.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
259 aParameter.line = '';
260 done = true;
261 } else if (singleQuoteCommaEndRegexp.test(aParameter.line)) {
262//Clipperz.logDebug("---> 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
263 aParameter.line = aParameter.line.substr(2, aParameter.line.length - 1);
264 done = true;
265//Clipperz.logDebug("<--- 3.3: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
266 } else if (singleQuoteNewLineEndRegexp.test(aParameter.line)) {
267 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
268 done = true;
269 } else {
270 throw new Error("CSV Parsing error; double-quote, followed by undesirable character (bad character sequence)... " + aParameter.line);
271 }
272 } else {
273//Clipperz.logDebug("---> 4: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
274 if (result == "") {
275//Clipperz.logDebug("---> 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
276 inQuotes = true;
277 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
278//Clipperz.logDebug("<--- 4.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
279 } else {
280 throw new Error("CSV Parsing error; double-quote, outside of double-quotes (bad character sequence)...");
281 }
282 }
283 } else if (commaBeginRegexp.test(aParameter.line)) {
284//Clipperz.logDebug("---> 5: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
285 if (inQuotes) {
286//Clipperz.logDebug("---> 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
287 result += aParameter.line.substr(0 ,1);
288 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
289//Clipperz.logDebug("<--- 5.1: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
290 } else {
291//Clipperz.logDebug("---> 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
292 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
293 if (newlineRegexp.test(aParameter.line) || aParameter.line == "") {
294//Clipperz.logDebug("######");
295 aParameter.isThereAnEmptyFinalField = true;
296 };
297 done = true;
298//Clipperz.logDebug("<--- 5.2: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
299 }
300 } else if (validRegexp.test(aParameter.line)) {
301//Clipperz.logDebug("---> 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
302 result += aParameter.line.substr(0, 1);
303 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
304//Clipperz.logDebug("<--- 6: '" + aParameter.line.replace(/\n/g, "\\n") + "'");
305 } else if (newlineRegexp.test(aParameter.line)) {
306 if (inQuotes == true) {
307 result += aParameter.line.substr(0 ,1);
308 aParameter.line = aParameter.line.substr(1, aParameter.line.length - 1);
309 } else {
310 if (result == "") {
311 if (aParameter.isThereAnEmptyFinalField == true) {
312 aParameter.isThereAnEmptyFinalField = false;
313 } else {
314 result = null;
315 }
316 }
317
318 done = true;
319 }
320 } else {
321 throw new Error("CSV Parsing error; an undesirable character... '" + aParameter.line.substr(0,1) + "'");
322 }
323 }
324 } catch(exception) {
325 Clipperz.logError(exception.message);
326 // result = null;
327 throw exception;
328 }
329 }
330
331//if (result != null) {
332 //Clipperz.logDebug("<=== result: '" + result.replace(/\n/g, "\\n") + "'");
333//} else {
334 //Clipperz.logDebug("<=== result: NULL");
335//}
336
337 return result;
338 },
339
340 //-------------------------------------------------------------------------
341 __syntaxFix__: "syntax fix"
342});
343
344
diff --git a/frontend/delta/js/Clipperz/Crypto/AES.js b/frontend/delta/js/Clipperz/Crypto/AES.js
new file mode 100644
index 0000000..cb56f11
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/AES.js
@@ -0,0 +1,859 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!";
26}
27
28 //Dependency commented to avoid a circular reference
29//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!";
31//}
32
33if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; }
34
35//#############################################################################
36
37Clipperz.Crypto.AES.DeferredExecutionContext = function(args) {
38 args = args || {};
39
40 this._key = args.key;
41 this._message = args.message;
42 this._result = args.message.clone();
43 this._nonce = args.nonce;
44 this._messageLength = this._message.length();
45
46 this._messageArray = this._message.arrayValues();
47 this._resultArray = this._result.arrayValues();
48 this._nonceArray = this._nonce.arrayValues();
49
50 this._executionStep = 0;
51
52 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
53 this._elaborationChunks = 10;
54 this._pauseTime = 0.02; // 0.02 //0.2;
55
56 return this;
57}
58
59Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
60
61 'key': function() {
62 return this._key;
63 },
64
65 'message': function() {
66 return this._message;
67 },
68
69 'messageLength': function() {
70 return this._messageLength;
71 },
72
73 'result': function() {
74 return new Clipperz.ByteArray(this.resultArray());
75 },
76
77 'nonce': function() {
78 return this._nonce;
79 },
80
81 'messageArray': function() {
82 return this._messageArray;
83 },
84
85 'resultArray': function() {
86 return this._resultArray;
87 },
88
89 'nonceArray': function() {
90 return this._nonceArray;
91 },
92
93 'elaborationChunkSize': function() {
94 // return Clipperz.Crypto.AES.DeferredExecution.chunkSize;
95 // return this._elaborationChunkSize;
96 return (this._elaborationChunks * 1024);
97 },
98
99 'executionStep': function() {
100 return this._executionStep;
101 },
102
103 'setExecutionStep': function(aValue) {
104 this._executionStep = aValue;
105 },
106
107 'tuneExecutionParameters': function (anElapsedTime) {
108//var originalChunks = this._elaborationChunks;
109 if (anElapsedTime > 0) {
110 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
111 }
112//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
113 },
114
115 'pause': function(aValue) {
116 // return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue);
117 return MochiKit.Async.wait(this._pauseTime, aValue);
118 },
119
120 'isDone': function () {
121 return (this._executionStep >= this._messageLength);
122 },
123
124 //-----------------------------------------------------------------------------
125 __syntaxFix__: "syntax fix"
126
127});
128
129//#############################################################################
130
131Clipperz.Crypto.AES.Key = function(args) {
132 args = args || {};
133
134 this._key = args.key;
135 this._keySize = args.keySize || this.key().length();
136
137 if (this.keySize() == 128/8) {
138 this._b = 176;
139 this._numberOfRounds = 10;
140 } else if (this.keySize() == 256/8) {
141 this._b = 240;
142 this._numberOfRounds = 14;
143 } else {
144 Clipperz.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
145 throw Clipperz.Crypto.AES.exception.UnsupportedKeySize;
146 }
147
148 this._stretchedKey = null;
149
150 return this;
151}
152
153Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, {
154
155 'asString': function() {
156 return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")";
157 },
158
159 //-----------------------------------------------------------------------------
160
161 'key': function() {
162 return this._key;
163 },
164
165 'keySize': function() {
166 return this._keySize;
167 },
168
169 'b': function() {
170 return this._b;
171 },
172
173 'numberOfRounds': function() {
174 return this._numberOfRounds;
175 },
176 //=========================================================================
177
178 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
179 varresult;
180 var sbox;
181
182 sbox = Clipperz.Crypto.AES.sbox();
183
184 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex],
185 sbox[aWord[2]],
186 sbox[aWord[3]],
187 sbox[aWord[0]]];
188
189 return result;
190 },
191
192 //-----------------------------------------------------------------------------
193
194 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
195 varresult;
196 var i,c;
197
198 result = [];
199 c = 4;
200 for (i=0; i<c; i++) {
201 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
202 }
203
204 return result;
205 },
206
207 //-----------------------------------------------------------------------------
208
209 'sboxShakeup': function(aWord) {
210 var result;
211 var sbox;
212 var i,c;
213
214 result = [];
215 sbox = Clipperz.Crypto.AES.sbox();
216 c =4;
217 for (i=0; i<c; i++) {
218 result[i] = sbox[aWord[i]];
219 }
220
221 return result;
222 },
223
224 //-----------------------------------------------------------------------------
225
226 'stretchKey': function(aKey) {
227 varcurrentWord;
228 varkeyLength;
229 varpreviousStretchIndex;
230 var i,c;
231
232 keyLength = aKey.length();
233 previousStretchIndex = keyLength - this.keySize();
234
235 currentWord = [aKey.byteAtIndex(keyLength - 4),
236 aKey.byteAtIndex(keyLength - 3),
237 aKey.byteAtIndex(keyLength - 2),
238 aKey.byteAtIndex(keyLength - 1)];
239 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
240
241 if (this.keySize() == 256/8) {
242 c = 8;
243 } else if (this.keySize() == 128/8){
244 c = 4;
245 }
246
247 for (i=0; i<c; i++) {
248 if (i == 4) {
249 //fifth streatch word
250 currentWord = this.sboxShakeup(currentWord);
251 }
252
253 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
254 aKey.appendBytes(currentWord);
255 }
256
257 return aKey;
258 },
259
260 //-----------------------------------------------------------------------------
261
262 'stretchedKey': function() {
263 if (this._stretchedKey == null) {
264 var stretchedKey;
265
266 stretchedKey = this.key().clone();
267
268 while (stretchedKey.length() < this.keySize()) {
269 stretchedKey.appendByte(0);
270 }
271
272 while (stretchedKey.length() < this.b()) {
273 stretchedKey = this.stretchKey(stretchedKey);
274 }
275
276 this._stretchedKey = stretchedKey.split(0, this.b());
277 }
278
279 return this._stretchedKey;
280 },
281
282 //=========================================================================
283 __syntaxFix__: "syntax fix"
284});
285
286//#############################################################################
287
288Clipperz.Crypto.AES.State = function(args) {
289 args = args || {};
290
291 this._data = args.block;
292 this._key = args.key;
293
294 return this;
295}
296
297Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, {
298
299 'key': function() {
300 return this._key;
301 },
302
303 //-----------------------------------------------------------------------------
304
305 'data': function() {
306 return this._data;
307 },
308
309 'setData': function(aValue) {
310 this._data = aValue;
311 },
312
313 //=========================================================================
314
315 'addRoundKey': function(aRoundNumber) {
316 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
317 vardata;
318 varstretchedKey;
319 varfirstStretchedKeyIndex;
320 var i,c;
321
322 data = this.data();
323 stretchedKey = this.key().stretchedKey();
324 firstStretchedKeyIndex = aRoundNumber * (128/8);
325 c = 128/8;
326 for (i=0; i<c; i++) {
327 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
328 }
329 },
330
331 //-----------------------------------------------------------------------------
332
333 'subBytes': function() {
334 // a non-linear substitution step where each byte is replaced with another according to a lookup table.
335 var i,c;
336 vardata;
337 var sbox;
338
339 data = this.data();
340 sbox = Clipperz.Crypto.AES.sbox();
341
342 c = 16;
343 for (i=0; i<c; i++) {
344 data[i] = sbox[data[i]];
345 }
346 },
347
348 //-----------------------------------------------------------------------------
349
350 'shiftRows': function() {
351 //a transposition step where each row of the state is shifted cyclically a certain number of steps.
352 varnewValue;
353 vardata;
354 varshiftMapping;
355 vari,c;
356
357 newValue = new Array(16);
358 data = this.data();
359 shiftMapping = Clipperz.Crypto.AES.shiftRowMapping();
360 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
361 c = 16;
362 for (i=0; i<c; i++) {
363 newValue[i] = data[shiftMapping[i]];
364 }
365 for (i=0; i<c; i++) {
366 data[i] = newValue[i];
367 }
368 },
369
370 //-----------------------------------------------------------------------------
371/*
372 'mixColumnsWithValues': function(someValues) {
373 varresult;
374 vara;
375 var i,c;
376
377 c = 4;
378 result = [];
379 a = [];
380 for (i=0; i<c; i++) {
381 a[i] = [];
382 a[i][1] = someValues[i]
383 if ((a[i][1] & 0x80) == 0x80) {
384 a[i][2] = (a[i][1] << 1) ^ 0x11b;
385 } else {
386 a[i][2] = a[i][1] << 1;
387 }
388
389 a[i][3] = a[i][2] ^ a[i][1];
390 }
391
392 for (i=0; i<c; i++) {
393 varx;
394
395 x = Clipperz.Crypto.AES.mixColumnsMatrix()[i];
396 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
397 }
398
399 return result;
400 },
401
402 'mixColumns': function() {
403 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
404 var data;
405 var i, c;
406
407 data = this.data();
408 c = 4;
409 for(i=0; i<c; i++) {
410 varblockIndex;
411 var mixedValues;
412
413 blockIndex = i * 4;
414 mixedValues = this.mixColumnsWithValues([data[blockIndex + 0],
415 data[blockIndex + 1],
416 data[blockIndex + 2],
417 data[blockIndex + 3]]);
418 data[blockIndex + 0] = mixedValues[0];
419 data[blockIndex + 1] = mixedValues[1];
420 data[blockIndex + 2] = mixedValues[2];
421 data[blockIndex + 3] = mixedValues[3];
422 }
423 },
424*/
425
426 'mixColumns': function() {
427 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
428 var data;
429 var i, c;
430 var a_1;
431 var a_2;
432
433 a_1 = new Array(4);
434 a_2 = new Array(4);
435
436 data = this.data();
437 c = 4;
438 for(i=0; i<c; i++) {
439 varblockIndex;
440 var ii, cc;
441
442 blockIndex = i * 4;
443
444 cc = 4;
445 for (ii=0; ii<cc; ii++) {
446 var value;
447
448 value = data[blockIndex + ii];
449 a_1[ii] = value;
450 a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1);
451 }
452
453 data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3];
454 data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3];
455 data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3];
456 data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3];
457 }
458 },
459
460 //=========================================================================
461
462 'spinRound': function(aRoundNumber) {
463 this.addRoundKey(aRoundNumber);
464 this.subBytes();
465 this.shiftRows();
466 this.mixColumns();
467 },
468
469 'spinLastRound': function() {
470 this.addRoundKey(this.key().numberOfRounds() - 1);
471 this.subBytes();
472 this.shiftRows();
473 this.addRoundKey(this.key().numberOfRounds());
474 },
475
476 //=========================================================================
477
478 'encrypt': function() {
479 vari,c;
480
481 c = this.key().numberOfRounds() - 1;
482 for (i=0; i<c; i++) {
483 this.spinRound(i);
484 }
485
486 this.spinLastRound();
487 },
488
489 //=========================================================================
490 __syntaxFix__: "syntax fix"
491});
492
493//#############################################################################
494
495Clipperz.Crypto.AES.VERSION = "0.1";
496Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES";
497
498MochiKit.Base.update(Clipperz.Crypto.AES, {
499
500 //http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html
501 //http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
502 //http://en.wikipedia.org/wiki/Rijndael_key_schedule
503 //http://en.wikipedia.org/wiki/Rijndael_S-box
504
505 '__repr__': function () {
506 return "[" + this.NAME + " " + this.VERSION + "]";
507 },
508
509 'toString': function () {
510 return this.__repr__();
511 },
512
513 //=============================================================================
514
515 '_sbox': null,
516 'sbox': function() {
517 if (Clipperz.Crypto.AES._sbox == null) {
518 Clipperz.Crypto.AES._sbox = [
5190x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
5200xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
5210xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
5220x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
5230x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
5240x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
5250xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
5260x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
5270xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
5280x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
5290xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
5300xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
5310xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
5320x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
5330xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
5340x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
535 ];
536 }
537
538 return Clipperz.Crypto.AES._sbox;
539 },
540
541 //-----------------------------------------------------------------------------
542 //
543 // 0 4 8 12 0 4 812
544 // 1 5 9 13 => 5 9 131
545 // 2 6 10 14 10 14 26
546 // 3 7 11 15 15 3 711
547 //
548 '_shiftRowMapping': null,
549 'shiftRowMapping': function() {
550 if (Clipperz.Crypto.AES._shiftRowMapping == null) {
551 Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
552 }
553
554 return Clipperz.Crypto.AES._shiftRowMapping;
555 },
556
557 //-----------------------------------------------------------------------------
558
559 '_mixColumnsMatrix': null,
560 'mixColumnsMatrix': function() {
561 if (Clipperz.Crypto.AES._mixColumnsMatrix == null) {
562 Clipperz.Crypto.AES._mixColumnsMatrix = [[2, 3, 1 ,1],
563 [1, 2, 3, 1],
564 [1, 1, 2, 3],
565 [3, 1, 1, 2] ];
566 }
567
568 return Clipperz.Crypto.AES._mixColumnsMatrix;
569 },
570
571 '_roundConstants': null,
572 'roundConstants': function() {
573 if (Clipperz.Crypto.AES._roundConstants == null) {
574 Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154];
575 // Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a];
576 }
577
578 return Clipperz.Crypto.AES._roundConstants;
579 },
580
581 //=============================================================================
582
583 'incrementNonce': function(aNonce) {
584//Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce");
585 var i;
586 var done;
587
588 done = false;
589 i = aNonce.length - 1;
590
591 while ((i>=0) && (done == false)) {
592 var currentByteValue;
593
594 currentByteValue = aNonce[i];
595
596 if (currentByteValue == 0xff) {
597 aNonce[i] = 0;
598 if (i>= 0) {
599 i --;
600 } else {
601 done = true;
602 }
603 } else {
604 aNonce[i] = currentByteValue + 1;
605 done = true;
606 }
607 }
608//Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce");
609 },
610
611 //-----------------------------------------------------------------------------
612
613 'encryptBlock': function(aKey, aBlock) {
614 varresult;
615 varstate;
616
617 state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey});
618//is(state.data(), 'before');
619 state.encrypt();
620 result = state.data();
621
622 return result;
623 },
624
625 //-----------------------------------------------------------------------------
626
627 'encryptBlocks': function(aKey, aMessage, aNonce) {
628 varresult;
629 var nonce;
630 var self;
631 varmessageIndex;
632 varmessageLength;
633 var blockSize;
634
635 self = Clipperz.Crypto.AES;
636 blockSize = 128/8;
637 messageLength = aMessage.length;
638 nonce = aNonce;
639
640 result = aMessage;
641 messageIndex = 0;
642 while (messageIndex < messageLength) {
643 var encryptedBlock;
644 var i,c;
645
646 self.incrementNonce(nonce);
647 encryptedBlock = self.encryptBlock(aKey, nonce);
648
649 if ((messageLength - messageIndex) > blockSize) {
650 c = blockSize;
651 } else {
652 c = messageLength - messageIndex;
653 }
654
655 for (i=0; i<c; i++) {
656 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
657 }
658
659 messageIndex += blockSize;
660 }
661
662 return result;
663 },
664
665 //-----------------------------------------------------------------------------
666
667 'encrypt': function(aKey, someData, aNonce) {
668 var result;
669 var nonce;
670 varencryptedData;
671 var key;
672
673 key = new Clipperz.Crypto.AES.Key({key:aKey});
674 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
675
676 encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues());
677
678 result = nonce.appendBytes(encryptedData);
679
680 return result;
681 },
682
683 //-----------------------------------------------------------------------------
684
685 'decrypt': function(aKey, someData) {
686 var result;
687 var nonce;
688 var encryptedData;
689 var decryptedData;
690 vardataIterator;
691 var key;
692
693 key = new Clipperz.Crypto.AES.Key({key:aKey});
694
695 encryptedData = someData.arrayValues();
696 nonce = encryptedData.slice(0, (128/8));
697 encryptedData = encryptedData.slice(128/8);
698 decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce);
699
700 result = new Clipperz.ByteArray(decryptedData);
701
702 return result;
703 },
704
705 //=============================================================================
706
707 'deferredEncryptExecutionChunk': function(anExecutionContext) {
708 varresult;
709 var nonce;
710 var self;
711 varmessageIndex;
712 varmessageLength;
713 var blockSize;
714 var executionLimit;
715 var startTime, endTime;
716
717 self = Clipperz.Crypto.AES;
718 startTime = new Date();
719 blockSize = 128/8;
720 messageLength = anExecutionContext.messageArray().length;
721 nonce = anExecutionContext.nonceArray();
722 result = anExecutionContext.resultArray();
723
724 messageIndex = anExecutionContext.executionStep();
725 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
726 executionLimit = Math.min(executionLimit, messageLength);
727
728 while (messageIndex < executionLimit) {
729 var encryptedBlock;
730 var i,c;
731
732 self.incrementNonce(nonce);
733 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
734
735 if ((executionLimit - messageIndex) > blockSize) {
736 c = blockSize;
737 } else {
738 c = executionLimit - messageIndex;
739 }
740
741 for (i=0; i<c; i++) {
742 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
743 }
744
745 messageIndex += blockSize;
746 }
747 anExecutionContext.setExecutionStep(messageIndex);
748 endTime = new Date();
749 anExecutionContext.tuneExecutionParameters(endTime - startTime);
750
751 return anExecutionContext;
752 },
753
754 //-----------------------------------------------------------------------------
755/*
756 'deferredEncryptBlocks': function(anExecutionContext) {
757 vardeferredResult;
758 varmessageSize;
759 var i,c;
760
761 messageSize = anExecutionContext.messageLength();
762
763 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks");
764
765 c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize());
766 for (i=0; i<c; i++) {
767 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk);
768 deferredResult.addMethod(anExecutionContext, 'pause');
769 }
770
771 deferredResult.callback(anExecutionContext);
772
773 return deferredResult;
774 },
775*/
776
777 'deferredEncryptBlocks': function(anExecutionContext) {
778 vardeferredResult;
779
780 if (! anExecutionContext.isDone()) {
781 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [
782 Clipperz.Crypto.AES.deferredEncryptExecutionChunk,
783 MochiKit.Base.method(anExecutionContext, 'pause'),
784 Clipperz.Crypto.AES.deferredEncryptBlocks
785 ], {trace:false}, anExecutionContext);
786 } else {
787 deferredResult = MochiKit.Async.succeed(anExecutionContext);
788 }
789
790 return deferredResult;
791 },
792
793 //-----------------------------------------------------------------------------
794
795 'deferredEncrypt': function(aKey, someData, aNonce) {
796 var deferredResult;
797 varexecutionContext;
798 var result;
799 var nonce;
800 var key;
801
802 key = new Clipperz.Crypto.AES.Key({key:aKey});
803 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
804
805 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
806
807 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt");
808 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
809 deferredResult.addCallback(function(anExecutionContext) {
810 var result;
811
812 result = anExecutionContext.nonce().clone();
813 result.appendBytes(anExecutionContext.resultArray());
814
815 return result;
816 });
817 deferredResult.callback(executionContext)
818
819 return deferredResult;
820 },
821
822 //-----------------------------------------------------------------------------
823
824 'deferredDecrypt': function(aKey, someData) {
825 var deferredResult
826 var nonce;
827 var message;
828 var key;
829
830 key = new Clipperz.Crypto.AES.Key({key:aKey});
831 nonce = someData.split(0, (128/8));
832 message = someData.split(128/8);
833 executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce});
834
835 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt");
836 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks);
837 deferredResult.addCallback(function(anExecutionContext) {
838 return anExecutionContext.result();
839 });
840 deferredResult.callback(executionContext);
841
842 return deferredResult;
843 },
844
845 //-----------------------------------------------------------------------------
846 __syntaxFix__: "syntax fix"
847
848});
849
850//#############################################################################
851
852//Clipperz.Crypto.AES.DeferredExecution = {
853 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768;
854 // 'pauseTime': 0.02 //0.2
855//}
856
857Clipperz.Crypto.AES.exception = {
858 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")
859};
diff --git a/frontend/delta/js/Clipperz/Crypto/AES_2.js b/frontend/delta/js/Clipperz/Crypto/AES_2.js
new file mode 100644
index 0000000..1627f39
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/AES_2.js
@@ -0,0 +1,843 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.AES_2 depends on Clipperz.ByteArray!";
26}
27
28 //Dependency commented to avoid a circular reference
29//try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
30 //throw "Clipperz.Crypto.AES_2 depends on Clipperz.Crypto.PRNG!";
31//}
32
33if (typeof(Clipperz.Crypto.AES_2) == 'undefined') { Clipperz.Crypto.AES_2 = {}; }
34
35//#############################################################################
36
37Clipperz.Crypto.AES_2.DeferredExecutionContext = function(args) {
38 args = args || {};
39
40 this._key = args.key;
41 this._message = args.message;
42 this._result = args.message.clone();
43 this._nonce = args.nonce;
44 this._messageLength = this._message.length();
45
46 this._messageArray = this._message.arrayValues();
47 this._resultArray = this._result.arrayValues();
48 this._nonceArray = this._nonce.arrayValues();
49
50 this._executionStep = 0;
51
52 // this._elaborationChunkSize = 1024; // 4096; // 16384; //4096;
53 this._elaborationChunks = 10;
54 this._pauseTime = 0.02; // 0.02 //0.2;
55
56 return this;
57}
58
59Clipperz.Crypto.AES_2.DeferredExecutionContext.prototype = MochiKit.Base.update(null, {
60
61 'key': function() {
62 return this._key;
63 },
64
65 'message': function() {
66 return this._message;
67 },
68
69 'messageLength': function() {
70 return this._messageLength;
71 },
72
73 'result': function() {
74 return new Clipperz.ByteArray(this.resultArray());
75 },
76
77 'nonce': function() {
78 return this._nonce;
79 },
80
81 'messageArray': function() {
82 return this._messageArray;
83 },
84
85 'resultArray': function() {
86 return this._resultArray;
87 },
88
89 'nonceArray': function() {
90 return this._nonceArray;
91 },
92
93 'elaborationChunkSize': function() {
94 // return Clipperz.Crypto.AES_2.DeferredExecution.chunkSize;
95 // return this._elaborationChunkSize;
96 return (this._elaborationChunks * 1024);
97 },
98
99 'executionStep': function() {
100 return this._executionStep;
101 },
102
103 'setExecutionStep': function(aValue) {
104 this._executionStep = aValue;
105 },
106
107 'tuneExecutionParameters': function (anElapsedTime) {
108//var originalChunks = this._elaborationChunks;
109 if (anElapsedTime > 0) {
110 this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2)));
111 }
112//Clipperz.log("tuneExecutionParameters - elapsedTime: " + anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]");
113 },
114
115 'pause': function(aValue) {
116 // return MochiKit.Async.wait(Clipperz.Crypto.AES_2.DeferredExecution.pauseTime, aValue);
117 return MochiKit.Async.wait(this._pauseTime, aValue);
118 },
119
120 'isDone': function () {
121 return (this._executionStep >= this._messageLength);
122 },
123
124 //-----------------------------------------------------------------------------
125 __syntaxFix__: "syntax fix"
126
127});
128
129//#############################################################################
130
131Clipperz.Crypto.AES_2.Key = function(args) {
132 args = args || {};
133
134 this._key = args.key;
135 this._keySize = args.keySize || this.key().length();
136
137 if (this.keySize() == 128/8) {
138 this._b = 176;
139 this._numberOfRounds = 10;
140 } else if (this.keySize() == 256/8) {
141 this._b = 240;
142 this._numberOfRounds = 14;
143 } else {
144 Clipperz.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits");
145 throw Clipperz.Crypto.AES_2.exception.UnsupportedKeySize;
146 }
147
148 this._stretchedKey = null;
149
150 return this;
151}
152
153Clipperz.Crypto.AES_2.Key.prototype = MochiKit.Base.update(null, {
154
155 'asString': function() {
156 return "Clipperz.Crypto.AES_2.Key (" + this.key().toHexString() + ")";
157 },
158
159 //-----------------------------------------------------------------------------
160
161 'key': function() {
162 return this._key;
163 },
164
165 'keySize': function() {
166 return this._keySize;
167 },
168
169 'b': function() {
170 return this._b;
171 },
172
173 'numberOfRounds': function() {
174 return this._numberOfRounds;
175 },
176 //=========================================================================
177
178 'keyScheduleCore': function(aWord, aRoundConstantsIndex) {
179 varresult;
180 var sbox;
181
182 sbox = Clipperz.Crypto.AES_2.sbox();
183
184 result = [sbox[aWord[1]] ^ Clipperz.Crypto.AES_2.roundConstants()[aRoundConstantsIndex],
185 sbox[aWord[2]],
186 sbox[aWord[3]],
187 sbox[aWord[0]]];
188
189 return result;
190 },
191
192 //-----------------------------------------------------------------------------
193
194 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) {
195 varresult;
196 var i,c;
197
198 result = [];
199 c = 4;
200 for (i=0; i<c; i++) {
201 result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i);
202 }
203
204 return result;
205 },
206
207 //-----------------------------------------------------------------------------
208
209 'sboxShakeup': function(aWord) {
210 var result;
211 var sbox;
212 var i,c;
213
214 result = [];
215 sbox = Clipperz.Crypto.AES_2.sbox();
216 c =4;
217 for (i=0; i<c; i++) {
218 result[i] = sbox[aWord[i]];
219 }
220
221 return result;
222 },
223
224 //-----------------------------------------------------------------------------
225
226 'stretchKey': function(aKey) {
227 varcurrentWord;
228 varkeyLength;
229 varpreviousStretchIndex;
230 var i,c;
231
232 keyLength = aKey.length();
233 previousStretchIndex = keyLength - this.keySize();
234
235 currentWord = [aKey.byteAtIndex(keyLength - 4),
236 aKey.byteAtIndex(keyLength - 3),
237 aKey.byteAtIndex(keyLength - 2),
238 aKey.byteAtIndex(keyLength - 1)];
239 currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize());
240
241 if (this.keySize() == 256/8) {
242 c = 8;
243 } else if (this.keySize() == 128/8){
244 c = 4;
245 }
246
247 for (i=0; i<c; i++) {
248 if (i == 4) {
249 //fifth streatch word
250 currentWord = this.sboxShakeup(currentWord);
251 }
252
253 currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4));
254 aKey.appendBytes(currentWord);
255 }
256
257 return aKey;
258 },
259
260 //-----------------------------------------------------------------------------
261
262 'stretchedKey': function() {
263 if (this._stretchedKey == null) {
264 var stretchedKey;
265
266 stretchedKey = this.key().clone();
267
268 while (stretchedKey.length() < this.keySize()) {
269 stretchedKey.appendByte(0);
270 }
271
272 while (stretchedKey.length() < this.b()) {
273 stretchedKey = this.stretchKey(stretchedKey);
274 }
275
276 this._stretchedKey = stretchedKey.split(0, this.b());
277 }
278
279 return this._stretchedKey;
280 },
281
282 //=========================================================================
283 __syntaxFix__: "syntax fix"
284});
285
286//#############################################################################
287
288Clipperz.Crypto.AES_2.State = function(args) {
289 args = args || {};
290
291 this._data = args.block.slice(0);
292 this._key = args.key;
293
294 return this;
295}
296
297Clipperz.Crypto.AES_2.State.prototype = MochiKit.Base.update(null, {
298
299 'key': function() {
300 return this._key;
301 },
302
303 //-----------------------------------------------------------------------------
304
305 'data': function() {
306 return this._data;
307 },
308
309 'setData': function(aValue) {
310 this._data = aValue;
311 },
312
313 //=========================================================================
314
315 'addRoundKey': function(aRoundNumber) {
316 //each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule.
317 vardata;
318 varstretchedKey;
319 varfirstStretchedKeyIndex;
320 var i,c;
321
322 data = this.data();
323 stretchedKey = this.key().stretchedKey();
324 firstStretchedKeyIndex = aRoundNumber * (128/8);
325 c = 128/8;
326 for (i=0; i<c; i++) {
327 data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i);
328 }
329 },
330
331 //-----------------------------------------------------------------------------
332
333 'subBytes': function() {
334 // a non-linear substitution step where each byte is replaced with another according to a lookup table.
335 var i,c;
336 vardata;
337 var sbox;
338
339 data = this.data();
340 sbox = Clipperz.Crypto.AES_2.sbox();
341
342 c = 16;
343 for (i=0; i<c; i++) {
344 data[i] = sbox[data[i]];
345 }
346 },
347
348 //-----------------------------------------------------------------------------
349
350 'shiftRows': function() {
351 //a transposition step where each row of the state is shifted cyclically a certain number of steps.
352 varnewValue;
353 vardata;
354 varshiftMapping;
355 vari,c;
356
357 newValue = new Array(16);
358 data = this.data();
359 shiftMapping = Clipperz.Crypto.AES_2.shiftRowMapping();
360 // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
361 c = 16;
362 for (i=0; i<c; i++) {
363 newValue[i] = data[shiftMapping[i]];
364 }
365 for (i=0; i<c; i++) {
366 data[i] = newValue[i];
367 }
368 },
369
370 //-----------------------------------------------------------------------------
371/*
372 'mixColumnsWithValues': function(someValues) {
373 varresult;
374 vara;
375 var i,c;
376
377 c = 4;
378 result = [];
379 a = [];
380 for (i=0; i<c; i++) {
381 a[i] = [];
382 a[i][1] = someValues[i]
383 if ((a[i][1] & 0x80) == 0x80) {
384 a[i][2] = (a[i][1] << 1) ^ 0x11b;
385 } else {
386 a[i][2] = a[i][1] << 1;
387 }
388
389 a[i][3] = a[i][2] ^ a[i][1];
390 }
391
392 for (i=0; i<c; i++) {
393 varx;
394
395 x = Clipperz.Crypto.AES_2.mixColumnsMatrix()[i];
396 result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]];
397 }
398
399 return result;
400 },
401
402 'mixColumns': function() {
403 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
404 var data;
405 var i, c;
406
407 data = this.data();
408 c = 4;
409 for(i=0; i<c; i++) {
410 varblockIndex;
411 var mixedValues;
412
413 blockIndex = i * 4;
414 mixedValues = this.mixColumnsWithValues([data[blockIndex + 0],
415 data[blockIndex + 1],
416 data[blockIndex + 2],
417 data[blockIndex + 3]]);
418 data[blockIndex + 0] = mixedValues[0];
419 data[blockIndex + 1] = mixedValues[1];
420 data[blockIndex + 2] = mixedValues[2];
421 data[blockIndex + 3] = mixedValues[3];
422 }
423 },
424*/
425
426 'mixColumns': function() {
427 //a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation.
428 var data;
429 var i, c;
430 var a_1;
431 var a_2;
432
433 a_1 = new Array(4);
434 a_2 = new Array(4);
435
436 data = this.data();
437 c = 4;
438 for(i=0; i<c; i++) {
439 varblockIndex;
440 var ii, cc;
441
442 blockIndex = i * 4;
443
444 cc = 4;
445 for (ii=0; ii<cc; ii++) {
446 var value;
447
448 value = data[blockIndex + ii];
449 a_1[ii] = value;
450 a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1);
451 }
452
453 data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3];
454 data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3];
455 data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3];
456 data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3];
457 }
458 },
459
460 //=========================================================================
461
462 'spinRound': function(aRoundNumber) {
463 this.addRoundKey(aRoundNumber);
464 this.subBytes();
465 this.shiftRows();
466 this.mixColumns();
467 },
468
469 'spinLastRound': function() {
470 this.addRoundKey(this.key().numberOfRounds() - 1);
471 this.subBytes();
472 this.shiftRows();
473 this.addRoundKey(this.key().numberOfRounds());
474 },
475
476 //=========================================================================
477
478 'encrypt': function() {
479 vari,c;
480
481 c = this.key().numberOfRounds() - 1;
482 for (i=0; i<c; i++) {
483 this.spinRound(i);
484 }
485
486 this.spinLastRound();
487 },
488
489 //=========================================================================
490 __syntaxFix__: "syntax fix"
491});
492
493//#############################################################################
494
495Clipperz.Crypto.AES_2.VERSION = "0.1";
496Clipperz.Crypto.AES_2.NAME = "Clipperz.Crypto.AES_2";
497
498MochiKit.Base.update(Clipperz.Crypto.AES_2, {
499
500 //http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html
501 //http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
502 //http://en.wikipedia.org/wiki/Rijndael_key_schedule
503 //http://en.wikipedia.org/wiki/Rijndael_S-box
504
505 '__repr__': function () {
506 return "[" + this.NAME + " " + this.VERSION + "]";
507 },
508
509 'toString': function () {
510 return this.__repr__();
511 },
512
513 //=============================================================================
514
515 '_sbox': null,
516 'sbox': function() {
517 if (Clipperz.Crypto.AES_2._sbox == null) {
518 Clipperz.Crypto.AES_2._sbox = [
5190x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
5200xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
5210xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
5220x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
5230x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
5240x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
5250xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
5260x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
5270xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
5280x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
5290xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
5300xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
5310xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
5320x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
5330xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
5340x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
535 ];
536 }
537
538 return Clipperz.Crypto.AES_2._sbox;
539 },
540
541 //-----------------------------------------------------------------------------
542 //
543 // 0 4 8 12 0 4 812
544 // 1 5 9 13 => 5 9 131
545 // 2 6 10 14 10 14 26
546 // 3 7 11 15 15 3 711
547 //
548 '_shiftRowMapping': null,
549 'shiftRowMapping': function() {
550 if (Clipperz.Crypto.AES_2._shiftRowMapping == null) {
551 Clipperz.Crypto.AES_2._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11];
552 }
553
554 return Clipperz.Crypto.AES_2._shiftRowMapping;
555 },
556
557 //-----------------------------------------------------------------------------
558
559 '_mixColumnsMatrix': null,
560 'mixColumnsMatrix': function() {
561 if (Clipperz.Crypto.AES_2._mixColumnsMatrix == null) {
562 Clipperz.Crypto.AES_2._mixColumnsMatrix = [[2, 3, 1 ,1],
563 [1, 2, 3, 1],
564 [1, 1, 2, 3],
565 [3, 1, 1, 2] ];
566 }
567
568 return Clipperz.Crypto.AES_2._mixColumnsMatrix;
569 },
570
571 '_roundConstants': null,
572 'roundConstants': function() {
573 if (Clipperz.Crypto.AES_2._roundConstants == null) {
574 Clipperz.Crypto.AES_2._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154];
575 // Clipperz.Crypto.AES_2._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a];
576 }
577
578 return Clipperz.Crypto.AES_2._roundConstants;
579 },
580
581 //=============================================================================
582
583 'incrementNonce': function(nonce) {
584 var i;
585 var done;
586
587 done = false;
588 i = nonce.length - 1;
589
590 while ((i>=0) && (done == false)) {
591 var currentByteValue;
592
593 currentByteValue = nonce[i];
594
595 if (currentByteValue == 0xff) {
596 nonce[i] = 0;
597 if (i>= 0) {
598 i --;
599 } else {
600 done = true;
601 }
602 } else {
603 nonce[i] = currentByteValue + 1;
604 done = true;
605 }
606 }
607 },
608
609 //-----------------------------------------------------------------------------
610
611 'encryptBlock': function(aKey, aBlock) {
612 varresult;
613 varstate;
614
615 state = new Clipperz.Crypto.AES_2.State({block:aBlock, key:aKey});
616//is(state.data(), 'before');
617 state.encrypt();
618 result = state.data();
619
620 return result;
621 },
622
623 //-----------------------------------------------------------------------------
624
625 'encryptBlocks': function(aKey, aMessage, aNonce) {
626 varresult;
627 var nonce;
628 var self;
629 varmessageIndex;
630 varmessageLength;
631 var blockSize;
632
633 self = Clipperz.Crypto.AES_2;
634 blockSize = 128/8;
635 messageLength = aMessage.length;
636 nonce = aNonce;
637
638 result = aMessage;
639 messageIndex = 0;
640 while (messageIndex < messageLength) {
641 var encryptedBlock;
642 var i,c;
643
644 encryptedBlock = self.encryptBlock(aKey, nonce);
645
646 if ((messageLength - messageIndex) > blockSize) {
647 c = blockSize;
648 } else {
649 c = messageLength - messageIndex;
650 }
651
652 for (i=0; i<c; i++) {
653 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
654 }
655
656 messageIndex += blockSize;
657 // nonce = self.incrementNonce(nonce);
658 self.incrementNonce(nonce)
659 }
660
661 return result;
662 },
663
664 //-----------------------------------------------------------------------------
665
666 'encrypt': function(aKey, someData, aNonce) {
667 var result;
668 var nonce;
669 varencryptedData;
670 var key;
671
672 key = new Clipperz.Crypto.AES_2.Key({key:aKey});
673 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
674
675 encryptedData = Clipperz.Crypto.AES_2.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues());
676
677 result = nonce.appendBytes(encryptedData);
678
679 return result;
680 },
681
682 //-----------------------------------------------------------------------------
683
684 'decrypt': function(aKey, someData) {
685 var result;
686 var nonce;
687 var encryptedData;
688 var decryptedData;
689 vardataIterator;
690 var key;
691
692 key = new Clipperz.Crypto.AES_2.Key({key:aKey});
693
694 encryptedData = someData.arrayValues();
695 nonce = encryptedData.slice(0, (128/8));
696 encryptedData = encryptedData.slice(128/8);
697 decryptedData = Clipperz.Crypto.AES_2.encryptBlocks(key, encryptedData, nonce);
698
699 result = new Clipperz.ByteArray(decryptedData);
700
701 return result;
702 },
703
704 //=============================================================================
705
706 'deferredEncryptExecutionChunk': function(anExecutionContext) {
707 varresult;
708 var nonce;
709 var self;
710 varmessageIndex;
711 varmessageLength;
712 var blockSize;
713 var executionLimit;
714 var startTime, endTime;
715
716 self = Clipperz.Crypto.AES_2;
717 startTime = new Date();
718 blockSize = 128/8;
719 messageLength = anExecutionContext.messageArray().length;
720 nonce = anExecutionContext.nonceArray();
721 result = anExecutionContext.resultArray();
722
723 messageIndex = anExecutionContext.executionStep();
724 executionLimit = messageIndex + anExecutionContext.elaborationChunkSize();
725 executionLimit = Math.min(executionLimit, messageLength);
726
727 while (messageIndex < executionLimit) {
728 var encryptedBlock;
729 var i,c;
730
731//console.log("+++ nonce: [" + nonce + "]")
732 encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce);
733
734 if ((executionLimit - messageIndex) > blockSize) {
735 c = blockSize;
736 } else {
737 c = executionLimit - messageIndex;
738 }
739
740 for (i=0; i<c; i++) {
741 result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i];
742 }
743
744 messageIndex += blockSize;
745 // nonce = self.incrementNonce(nonce);
746 self.incrementNonce(nonce);
747 }
748 anExecutionContext.setExecutionStep(messageIndex);
749 endTime = new Date();
750 anExecutionContext.tuneExecutionParameters(endTime - startTime);
751
752 return anExecutionContext;
753 },
754
755 //-----------------------------------------------------------------------------
756
757 'deferredEncryptBlocks': function(anExecutionContext) {
758 vardeferredResult;
759
760//console.log("executionContext", anExecutionContext)
761//console.log(" --- nonce: " + anExecutionContext.nonceArray())
762 if (! anExecutionContext.isDone()) {
763 deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES_2.deferredEncryptBloks", [
764 Clipperz.Crypto.AES_2.deferredEncryptExecutionChunk,
765 MochiKit.Base.method(anExecutionContext, 'pause'),
766 Clipperz.Crypto.AES_2.deferredEncryptBlocks
767 ], {trace:false}, anExecutionContext);
768 } else {
769 deferredResult = MochiKit.Async.succeed(anExecutionContext);
770 }
771
772 return deferredResult;
773 },
774
775 //-----------------------------------------------------------------------------
776
777 'deferredEncrypt': function(aKey, someData, aNonce) {
778 var deferredResult;
779 varexecutionContext;
780 var result;
781 var nonce;
782 var key;
783
784 key = new Clipperz.Crypto.AES_2.Key({key:aKey});
785 nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8);
786
787 executionContext = new Clipperz.Crypto.AES_2.DeferredExecutionContext({key:key, message:someData, nonce:nonce});
788
789 deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt");
790 deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncryptBlocks);
791 deferredResult.addCallback(function(anExecutionContext) {
792 var result;
793
794 result = anExecutionContext.nonce().clone();
795 result.appendBytes(anExecutionContext.resultArray());
796
797 return result;
798 });
799 deferredResult.callback(executionContext)
800
801 return deferredResult;
802 },
803
804 //-----------------------------------------------------------------------------
805
806 'deferredDecrypt': function(aKey, someData) {
807 var deferredResult
808 var nonce;
809 var message;
810 var key;
811
812 key = new Clipperz.Crypto.AES_2.Key({key:aKey});
813 nonce = someData.split(0, (128/8));
814//console.log("nonce: [" + nonce.arrayValues() + "]")
815 message = someData.split(128/8);
816//console.log("message: [" + message.arrayValues() + "]")
817 executionContext = new Clipperz.Crypto.AES_2.DeferredExecutionContext({key:key, message:message, nonce:nonce});
818
819 deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt");
820 deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncryptBlocks);
821 deferredResult.addCallback(function(anExecutionContext) {
822 return anExecutionContext.result();
823 });
824 deferredResult.callback(executionContext);
825
826 return deferredResult;
827 },
828
829 //-----------------------------------------------------------------------------
830 __syntaxFix__: "syntax fix"
831
832});
833
834//#############################################################################
835
836//Clipperz.Crypto.AES_2.DeferredExecution = {
837 // 'chunkSize': 16384, // 4096, // 1024 4096 8192 1638432768;
838 // 'pauseTime': 0.02 //0.2
839//}
840
841Clipperz.Crypto.AES_2.exception = {
842 'UnsupportedKeySize': new MochiKit.Base.NamedError("Clipperz.Crypto.AES_2.exception.UnsupportedKeySize")
843};
diff --git a/frontend/delta/js/Clipperz/Crypto/Base.js b/frontend/delta/js/Clipperz/Crypto/Base.js
new file mode 100644
index 0000000..9acfc49
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/Base.js
@@ -0,0 +1,1847 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.Base) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.Base depends on Clipperz.Base!";
26}
27
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; }
30
31Clipperz.Crypto.Base.VERSION = "0.1";
32Clipperz.Crypto.Base.NAME = "Clipperz.Crypto.Base";
33
34//#############################################################################
35 //Downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip (jsSha2/sha256.js)
36//#############################################################################
37
38/* A JavaScript implementation of the Secure Hash Algorithm, SHA-256
39 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
40 * Distributed under the BSD License
41 * Some bits taken from Paul Johnston's SHA-1 implementation
42 */
43var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
44function safe_add (x, y) {
45 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
46 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
47 return (msw << 16) | (lsw & 0xFFFF);
48}
49function S (X, n) {return ( X >>> n ) | (X << (32 - n));}
50function R (X, n) {return ( X >>> n );}
51function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}
52function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}
53function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}
54function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}
55function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}
56function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}
57function core_sha256 (m, l) {
58 var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
59 var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
60 var W = new Array(64);
61 var a, b, c, d, e, f, g, h, i, j;
62 var T1, T2;
63 /* append padding */
64 m[l >> 5] |= 0x80 << (24 - l % 32);
65 m[((l + 64 >> 9) << 4) + 15] = l;
66 for ( var i = 0; i<m.length; i+=16 ) {
67 a = HASH[0]; b = HASH[1]; c = HASH[2]; d = HASH[3]; e = HASH[4]; f = HASH[5]; g = HASH[6]; h = HASH[7];
68 for ( var j = 0; j<64; j++) {
69 if (j < 16) W[j] = m[j + i];
70 else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
71 T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
72 T2 = safe_add(Sigma0256(a), Maj(a, b, c));
73 h = g; g = f; f = e; e = safe_add(d, T1); d = c; c = b; b = a; a = safe_add(T1, T2);
74 }
75 HASH[0] = safe_add(a, HASH[0]); HASH[1] = safe_add(b, HASH[1]); HASH[2] = safe_add(c, HASH[2]); HASH[3] = safe_add(d, HASH[3]); HASH[4] = safe_add(e, HASH[4]); HASH[5] = safe_add(f, HASH[5]); HASH[6] = safe_add(g, HASH[6]); HASH[7] = safe_add(h, HASH[7]);
76 }
77 return HASH;
78}
79function str2binb (str) {
80 var bin = Array();
81 var mask = (1 << chrsz) - 1;
82 for(var i = 0; i < str.length * chrsz; i += chrsz)
83 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
84 return bin;
85}
86function binb2hex (binarray) {
87 var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
88 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
89 var str = "";
90 for (var i = 0; i < binarray.length * 4; i++) {
91 str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
92 }
93 return str;
94}
95function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
96
97
98
99//#############################################################################
100 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (entropy.js)
101//#############################################################################
102
103 // Entropy collection utilities
104
105 /*Start by declaring static storage and initialise
106 the entropy vector from the time we come through
107 here. */
108
109 var entropyData = new Array(); // Collected entropy data
110 var edlen = 0; // Keyboard array data length
111
112 addEntropyTime(); // Start entropy collection with page load time
113 ce(); // Roll milliseconds into initial entropy
114
115 //Add a byte to the entropy vector
116
117 function addEntropyByte(b) {
118 entropyData[edlen++] = b;
119 }
120
121 /*Capture entropy. When the user presses a key or performs
122 various other events for which we can request
123 notification, add the time in 255ths of a second to the
124 entropyData array. The name of the function is short
125 so it doesn't bloat the form object declarations in
126 which it appears in various "onXXX" events. */
127
128 function ce() {
129 addEntropyByte(Math.floor((((new Date).getMilliseconds()) * 255) / 999));
130 }
131
132 //Add a 32 bit quantity to the entropy vector
133
134 function addEntropy32(w) {
135 var i;
136
137 for (i = 0; i < 4; i++) {
138 addEntropyByte(w & 0xFF);
139 w >>= 8;
140 }
141 }
142
143 /*Add the current time and date (milliseconds since the epoch,
144 truncated to 32 bits) to the entropy vector. */
145
146 function addEntropyTime() {
147 addEntropy32((new Date()).getTime());
148 }
149
150 /* Start collection of entropy from mouse movements. The
151 argument specifies the number of entropy items to be
152 obtained from mouse motion, after which mouse motion
153 will be ignored. Note that you can re-enable mouse
154 motion collection at any time if not already underway. */
155
156 var mouseMotionCollect = 0;
157 var oldMoveHandler; // For saving and restoring mouse move handler in IE4
158
159 function mouseMotionEntropy(maxsamp) {
160 if (mouseMotionCollect <= 0) {
161 mouseMotionCollect = maxsamp;
162 if ((document.implementation.hasFeature("Events", "2.0")) &&
163 document.addEventListener) {
164 // Browser supports Document Object Model (DOM) 2 events
165 document.addEventListener("mousemove", mouseMoveEntropy, false);
166 } else {
167 if (document.attachEvent) {
168 // Internet Explorer 5 and above event model
169 document.attachEvent("onmousemove", mouseMoveEntropy);
170 } else {
171 //Internet Explorer 4 event model
172 oldMoveHandler = document.onmousemove;
173 document.onmousemove = mouseMoveEntropy;
174 }
175 }
176//dump("Mouse enable", mouseMotionCollect);
177 }
178 }
179
180 /*Collect entropy from mouse motion events. Note that
181 this is craftily coded to work with either DOM2 or Internet
182 Explorer style events. Note that we don't use every successive
183 mouse movement event. Instead, we XOR the three bytes collected
184 from the mouse and use that to determine how many subsequent
185 mouse movements we ignore before capturing the next one. */
186
187 var mouseEntropyTime = 0; // Delay counter for mouse entropy collection
188
189 function mouseMoveEntropy(e) {
190 if (!e) {
191 e = window.event; // Internet Explorer event model
192 }
193 if (mouseMotionCollect > 0) {
194 if (mouseEntropyTime-- <= 0) {
195 addEntropyByte(e.screenX & 0xFF);
196 addEntropyByte(e.screenY & 0xFF);
197 ce();
198 mouseMotionCollect--;
199 mouseEntropyTime = (entropyData[edlen - 3] ^ entropyData[edlen - 2] ^
200 entropyData[edlen - 1]) % 19;
201//dump("Mouse Move", byteArrayToHex(entropyData.slice(-3)));
202 }
203 if (mouseMotionCollect <= 0) {
204 if (document.removeEventListener) {
205 document.removeEventListener("mousemove", mouseMoveEntropy, false);
206 } else if (document.detachEvent) {
207 document.detachEvent("onmousemove", mouseMoveEntropy);
208 } else {
209 document.onmousemove = oldMoveHandler;
210 }
211//dump("Spung!", 0);
212 }
213 }
214 }
215
216 /*Compute a 32 byte key value from the entropy vector.
217 We compute the value by taking the MD5 sum of the even
218 and odd bytes respectively of the entropy vector, then
219 concatenating the two MD5 sums. */
220
221 function keyFromEntropy() {
222 var i, k = new Array(32);
223
224 if (edlen == 0) {
225 alert("Blooie! Entropy vector void at call to keyFromEntropy.");
226 }
227//dump("Entropy bytes", edlen);
228
229 md5_init();
230 for (i = 0; i < edlen; i += 2) {
231 md5_update(entropyData[i]);
232 }
233 md5_finish();
234 for (i = 0; i < 16; i++) {
235 k[i] = digestBits[i];
236 }
237
238 md5_init();
239 for (i = 1; i < edlen; i += 2) {
240 md5_update(entropyData[i]);
241 }
242 md5_finish();
243 for (i = 0; i < 16; i++) {
244 k[i + 16] = digestBits[i];
245 }
246
247//dump("keyFromEntropy", byteArrayToHex(k));
248 return k;
249 }
250
251//#############################################################################
252 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aesprng.js)
253//#############################################################################
254
255
256 // AES based pseudorandom number generator
257
258 /* Constructor. Called with an array of 32 byte (0-255) values
259 containing the initial seed. */
260
261 function AESprng(seed) {
262 this.key = new Array();
263 this.key = seed;
264 this.itext = hexToByteArray("9F489613248148F9C27945C6AE62EECA3E3367BB14064E4E6DC67A9F28AB3BD1");
265 this.nbytes = 0; // Bytes left in buffer
266
267 this.next = AESprng_next;
268 this.nextbits = AESprng_nextbits;
269 this.nextInt = AESprng_nextInt;
270 this.round = AESprng_round;
271
272 /* Encrypt the initial text with the seed key
273 three times, feeding the output of the encryption
274 back into the key for the next round. */
275
276 bsb = blockSizeInBits;
277 blockSizeInBits = 256;
278 var i, ct;
279 for (i = 0; i < 3; i++) {
280 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
281 }
282
283 /* Now make between one and four additional
284 key-feedback rounds, with the number determined
285 by bits from the result of the first three
286 rounds. */
287
288 var n = 1 + (this.key[3] & 2) + (this.key[9] & 1);
289 for (i = 0; i < n; i++) {
290 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
291 }
292 blockSizeInBits = bsb;
293 }
294
295 function AESprng_round() {
296 bsb = blockSizeInBits;
297 blockSizeInBits = 256;
298 this.key = rijndaelEncrypt(this.itext, this.key, "ECB");
299 this.nbytes = 32;
300 blockSizeInBits = bsb;
301 }
302
303 //Return next byte from the generator
304
305 function AESprng_next() {
306 if (this.nbytes <= 0) {
307 this.round();
308 }
309 return(this.key[--this.nbytes]);
310 }
311
312 //Return n bit integer value (up to maximum integer size)
313
314 function AESprng_nextbits(n) {
315 var i, w = 0, nbytes = Math.floor((n + 7) / 8);
316
317 for (i = 0; i < nbytes; i++) {
318 w = (w << 8) | this.next();
319 }
320 return w & ((1 << n) - 1);
321 }
322
323 // Return integer between 0 and n inclusive
324
325 function AESprng_nextInt(n) {
326 var p = 1, nb = 0;
327
328 // Determine smallest p, 2^p > n
329 // nb = log_2 p
330
331 while (n >= p) {
332 p <<= 1;
333 nb++;
334 }
335 p--;
336
337 /* Generate values from 0 through n by first generating
338 values v from 0 to (2^p)-1, then discarding any results v > n.
339 For the rationale behind this (and why taking
340 values mod (n + 1) is biased toward smaller values, see
341 Ferguson and Schneier, "Practical Cryptography",
342 ISBN 0-471-22357-3, section 10.8). */
343
344 while (true) {
345 var v = this.nextbits(nb) & p;
346
347 if (v <= n) {
348 return v;
349 }
350 }
351 }
352
353//#############################################################################
354 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (md5.js)
355//#############################################################################
356
357/*
358 * md5.jvs 1.0b 27/06/96
359 *
360 * Javascript implementation of the RSA Data Security, Inc. MD5
361 * Message-Digest Algorithm.
362 *
363 * Copyright (c) 1996 Henri Torgemane. All Rights Reserved.
364 *
365 * Permission to use, copy, modify, and distribute this software
366 * and its documentation for any purposes and without
367 * fee is hereby granted provided that this copyright notice
368 * appears in all copies.
369 *
370 * Of course, this soft is provided "as is" without express or implied
371 * warranty of any kind.
372
373 This version contains some trivial reformatting modifications
374 by John Walker.
375
376 */
377
378function array(n) {
379 for (i = 0; i < n; i++) {
380 this[i] = 0;
381 }
382 this.length = n;
383}
384
385/* Some basic logical functions had to be rewritten because of a bug in
386 * Javascript.. Just try to compute 0xffffffff >> 4 with it..
387 * Of course, these functions are slower than the original would be, but
388 * at least, they work!
389 */
390
391function integer(n) {
392 return n % (0xffffffff + 1);
393}
394
395function shr(a, b) {
396 a = integer(a);
397 b = integer(b);
398 if (a - 0x80000000 >= 0) {
399 a = a % 0x80000000;
400 a >>= b;
401 a += 0x40000000 >> (b - 1);
402 } else {
403 a >>= b;
404 }
405 return a;
406}
407
408function shl1(a) {
409 a = a % 0x80000000;
410 if (a & 0x40000000 == 0x40000000) {
411 a -= 0x40000000;
412 a *= 2;
413 a += 0x80000000;
414 } else {
415 a *= 2;
416 }
417 return a;
418}
419
420function shl(a, b) {
421 a = integer(a);
422 b = integer(b);
423 for (var i = 0; i < b; i++) {
424 a = shl1(a);
425 }
426 return a;
427}
428
429function and(a, b) {
430 a = integer(a);
431 b = integer(b);
432 var t1 = a - 0x80000000;
433 var t2 = b - 0x80000000;
434 if (t1 >= 0) {
435 if (t2 >= 0) {
436 return ((t1 & t2) + 0x80000000);
437 } else {
438 return (t1 & b);
439 }
440 } else {
441 if (t2 >= 0) {
442 return (a & t2);
443 } else {
444 return (a & b);
445 }
446 }
447}
448
449function or(a, b) {
450 a = integer(a);
451 b = integer(b);
452 var t1 = a - 0x80000000;
453 var t2 = b - 0x80000000;
454 if (t1 >= 0) {
455 if (t2 >= 0) {
456 return ((t1 | t2) + 0x80000000);
457 } else {
458 return ((t1 | b) + 0x80000000);
459 }
460 } else {
461 if (t2 >= 0) {
462 return ((a | t2) + 0x80000000);
463 } else {
464 return (a | b);
465 }
466 }
467}
468
469function xor(a, b) {
470 a = integer(a);
471 b = integer(b);
472 var t1 = a - 0x80000000;
473 var t2 = b - 0x80000000;
474 if (t1 >= 0) {
475 if (t2 >= 0) {
476 return (t1 ^ t2);
477 } else {
478 return ((t1 ^ b) + 0x80000000);
479 }
480 } else {
481 if (t2 >= 0) {
482 return ((a ^ t2) + 0x80000000);
483 } else {
484 return (a ^ b);
485 }
486 }
487}
488
489function not(a) {
490 a = integer(a);
491 return 0xffffffff - a;
492}
493
494/* Here begin the real algorithm */
495
496var state = new array(4);
497var count = new array(2);
498 count[0] = 0;
499 count[1] = 0;
500var buffer = new array(64);
501var transformBuffer = new array(16);
502var digestBits = new array(16);
503
504var S11 = 7;
505var S12 = 12;
506var S13 = 17;
507var S14 = 22;
508var S21 = 5;
509var S22 = 9;
510var S23 = 14;
511var S24 = 20;
512var S31 = 4;
513var S32 = 11;
514var S33 = 16;
515var S34 = 23;
516var S41 = 6;
517var S42 = 10;
518var S43 = 15;
519var S44 = 21;
520
521function F(x, y, z) {
522 return or(and(x, y), and(not(x), z));
523}
524
525function G(x, y, z) {
526 return or(and(x, z), and(y, not(z)));
527}
528
529function H(x, y, z) {
530 return xor(xor(x, y), z);
531}
532
533function I(x, y, z) {
534 return xor(y ,or(x , not(z)));
535}
536
537function rotateLeft(a, n) {
538 return or(shl(a, n), (shr(a, (32 - n))));
539}
540
541function FF(a, b, c, d, x, s, ac) {
542 a = a + F(b, c, d) + x + ac;
543 a = rotateLeft(a, s);
544 a = a + b;
545 return a;
546}
547
548function GG(a, b, c, d, x, s, ac) {
549 a = a + G(b, c, d) + x + ac;
550 a = rotateLeft(a, s);
551 a = a + b;
552 return a;
553}
554
555function HH(a, b, c, d, x, s, ac) {
556 a = a + H(b, c, d) + x + ac;
557 a = rotateLeft(a, s);
558 a = a + b;
559 return a;
560}
561
562function II(a, b, c, d, x, s, ac) {
563 a = a + I(b, c, d) + x + ac;
564 a = rotateLeft(a, s);
565 a = a + b;
566 return a;
567}
568
569function transform(buf, offset) {
570 var a = 0, b = 0, c = 0, d = 0;
571 var x = transformBuffer;
572
573 a = state[0];
574 b = state[1];
575 c = state[2];
576 d = state[3];
577
578 for (i = 0; i < 16; i++) {
579 x[i] = and(buf[i * 4 + offset], 0xFF);
580 for (j = 1; j < 4; j++) {
581 x[i] += shl(and(buf[i * 4 + j + offset] ,0xFF), j * 8);
582 }
583 }
584
585 /* Round 1 */
586 a = FF( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
587 d = FF( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
588 c = FF( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
589 b = FF( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
590 a = FF( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
591 d = FF( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
592 c = FF( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
593 b = FF( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
594 a = FF( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
595 d = FF( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
596 c = FF( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
597 b = FF( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
598 a = FF( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
599 d = FF( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
600 c = FF( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
601 b = FF( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
602
603 /* Round 2 */
604 a = GG( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
605 d = GG( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
606 c = GG( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
607 b = GG( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
608 a = GG( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
609 d = GG( d, a, b, c, x[10], S22, 0x2441453); /* 22 */
610 c = GG( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
611 b = GG( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
612 a = GG( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
613 d = GG( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
614 c = GG( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
615 b = GG( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
616 a = GG( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
617 d = GG( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
618 c = GG( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
619 b = GG( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
620
621 /* Round 3 */
622 a = HH( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
623 d = HH( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
624 c = HH( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
625 b = HH( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
626 a = HH( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
627 d = HH( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
628 c = HH( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
629 b = HH( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
630 a = HH( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
631 d = HH( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
632 c = HH( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
633 b = HH( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
634 a = HH( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
635 d = HH( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
636 c = HH( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
637 b = HH( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
638
639 /* Round 4 */
640 a = II( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
641 d = II( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
642 c = II( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
643 b = II( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
644 a = II( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
645 d = II( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
646 c = II( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
647 b = II( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
648 a = II( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
649 d = II( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
650 c = II( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
651 b = II( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
652 a = II( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
653 d = II( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
654 c = II( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
655 b = II( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
656
657 state[0] += a;
658 state[1] += b;
659 state[2] += c;
660 state[3] += d;
661
662}
663
664function md5_init() {
665 count[0] = count[1] = 0;
666 state[0] = 0x67452301;
667 state[1] = 0xefcdab89;
668 state[2] = 0x98badcfe;
669 state[3] = 0x10325476;
670 for (i = 0; i < digestBits.length; i++) {
671 digestBits[i] = 0;
672 }
673}
674
675function md5_update(b) {
676 var index, i;
677
678 index = and(shr(count[0],3) , 0x3F);
679 if (count[0] < 0xFFFFFFFF - 7) {
680 count[0] += 8;
681 } else {
682 count[1]++;
683 count[0] -= 0xFFFFFFFF + 1;
684 count[0] += 8;
685 }
686 buffer[index] = and(b, 0xff);
687 if (index >= 63) {
688 transform(buffer, 0);
689 }
690}
691
692function md5_finish() {
693 var bits = new array(8);
694 var padding;
695 var i = 0, index = 0, padLen = 0;
696
697 for (i = 0; i < 4; i++) {
698 bits[i] = and(shr(count[0], (i * 8)), 0xFF);
699 }
700 for (i = 0; i < 4; i++) {
701 bits[i + 4] = and(shr(count[1], (i * 8)), 0xFF);
702 }
703 index = and(shr(count[0], 3), 0x3F);
704 padLen = (index < 56) ? (56 - index) : (120 - index);
705 padding = new array(64);
706 padding[0] = 0x80;
707 for (i = 0; i < padLen; i++) {
708 md5_update(padding[i]);
709 }
710 for (i = 0; i < 8; i++) {
711 md5_update(bits[i]);
712 }
713
714 for (i = 0; i < 4; i++) {
715 for (j = 0; j < 4; j++) {
716 digestBits[i * 4 + j] = and(shr(state[i], (j * 8)) , 0xFF);
717 }
718 }
719}
720
721/* End of the MD5 algorithm */
722
723//#############################################################################
724 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (aes.js)
725//#############################################################################
726
727
728/* rijndael.js Rijndael Reference Implementation
729
730 This is a modified version of the software described below,
731 produced in September 2003 by John Walker for use in the
732 JavsScrypt browser-based encryption package. The principal
733 changes are replacing the original getRandomBytes function with
734 one which calls our pseudorandom generator (which must
735 be instantiated and seeded before the first call on getRandomBytes),
736 and changing keySizeInBits to 256. Some code not required by the
737 JavsScrypt application has been commented out. Please see
738 http://www.fourmilab.ch/javascrypt/ for further information on
739 JavaScrypt.
740
741 The following is the original copyright and application
742 information.
743
744 Copyright (c) 2001 Fritz Schneider
745
746 This software is provided as-is, without express or implied warranty.
747 Permission to use, copy, modify, distribute or sell this software, with or
748 without fee, for any purpose and by any individual or organization, is hereby
749 granted, provided that the above copyright notice and this paragraph appear
750 in all copies. Distribution as a part of an application or binary must
751 include the above copyright notice in the documentation and/or other materials
752 provided with the application or distribution.
753
754 As the above disclaimer notes, you are free to use this code however you
755 want. However, I would request that you send me an email
756 (fritz /at/ cs /dot/ ucsd /dot/ edu) to say hi if you find this code useful
757 or instructional. Seeing that people are using the code acts as
758 encouragement for me to continue development. If you *really* want to thank
759 me you can buy the book I wrote with Thomas Powell, _JavaScript:
760 _The_Complete_Reference_ :)
761
762 This code is an UNOPTIMIZED REFERENCE implementation of Rijndael.
763 If there is sufficient interest I can write an optimized (word-based,
764 table-driven) version, although you might want to consider using a
765 compiled language if speed is critical to your application. As it stands,
766 one run of the monte carlo test (10,000 encryptions) can take up to
767 several minutes, depending upon your processor. You shouldn't expect more
768 than a few kilobytes per second in throughput.
769
770 Also note that there is very little error checking in these functions.
771 Doing proper error checking is always a good idea, but the ideal
772 implementation (using the instanceof operator and exceptions) requires
773 IE5+/NS6+, and I've chosen to implement this code so that it is compatible
774 with IE4/NS4.
775
776 And finally, because JavaScript doesn't have an explicit byte/char data
777 type (although JavaScript 2.0 most likely will), when I refer to "byte"
778 in this code I generally mean "32 bit integer with value in the interval
779 [0,255]" which I treat as a byte.
780
781 See http://www-cse.ucsd.edu/~fritz/rijndael.html for more documentation
782 of the (very simple) API provided by this code.
783
784 Fritz Schneider
785 fritz at cs.ucsd.edu
786
787*/
788
789
790// Rijndael parameters -- Valid values are 128, 192, or 256
791
792var keySizeInBits = 256;
793var blockSizeInBits = 128;
794
795//
796// Note: in the following code the two dimensional arrays are indexed as
797// you would probably expect, as array[row][column]. The state arrays
798// are 2d arrays of the form state[4][Nb].
799
800
801// The number of rounds for the cipher, indexed by [Nk][Nb]
802var roundsArray = [ ,,,,[,,,,10,, 12,, 14],,
803 [,,,,12,, 12,, 14],,
804 [,,,,14,, 14,, 14] ];
805
806// The number of bytes to shift by in shiftRow, indexed by [Nb][row]
807var shiftOffsets = [ ,,,,[,1, 2, 3],,[,1, 2, 3],,[,1, 3, 4] ];
808
809// The round constants used in subkey expansion
810var Rcon = [
8110x01, 0x02, 0x04, 0x08, 0x10, 0x20,
8120x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
8130xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc,
8140x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4,
8150xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ];
816
817// Precomputed lookup table for the SBox
818var SBox = [
819 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171,
820118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164,
821114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113,
822216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226,
823235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214,
824179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203,
825190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69,
826249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245,
827188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68,
82823, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42,
829144, 136, 70, 238, 184, 20, 222, 94, 11, 219, 224, 50, 58, 10, 73,
830 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, 231, 200, 55, 109,
831141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, 186, 120, 37,
832 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, 112, 62,
833181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225,
834248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223,
835140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187,
836 22 ];
837
838// Precomputed lookup table for the inverse SBox
839var SBoxInverse = [
840 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215,
841251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222,
842233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66,
843250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73,
844109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92,
845204, 93, 101, 182, 146, 108, 112, 72, 80, 253, 237, 185, 218, 94, 21,
846 70, 87, 167, 141, 157, 132, 144, 216, 171, 0, 140, 188, 211, 10, 247,
847228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2,
848193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220,
849234, 151, 242, 207, 206, 240, 180, 230, 115, 150, 172, 116, 34, 231, 173,
850 53, 133, 226, 249, 55, 232, 28, 117, 223, 110, 71, 241, 26, 113, 29,
851 41, 197, 137, 111, 183, 98, 14, 170, 24, 190, 27, 252, 86, 62, 75,
852198, 210, 121, 32, 154, 219, 192, 254, 120, 205, 90, 244, 31, 221, 168,
853 51, 136, 7, 199, 49, 177, 18, 16, 89, 39, 128, 236, 95, 96, 81,
854127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160,
855224, 59, 77, 174, 42, 245, 176, 200, 235, 187, 60, 131, 83, 153, 97,
856 23, 43, 4, 126, 186, 119, 214, 38, 225, 105, 20, 99, 85, 33, 12,
857125 ];
858
859// This method circularly shifts the array left by the number of elements
860// given in its parameter. It returns the resulting array and is used for
861// the ShiftRow step. Note that shift() and push() could be used for a more
862// elegant solution, but they require IE5.5+, so I chose to do it manually.
863
864function cyclicShiftLeft(theArray, positions) {
865 var temp = theArray.slice(0, positions);
866 theArray = theArray.slice(positions).concat(temp);
867 return theArray;
868}
869
870// Cipher parameters ... do not change these
871var Nk = keySizeInBits / 32;
872var Nb = blockSizeInBits / 32;
873var Nr = roundsArray[Nk][Nb];
874
875// Multiplies the element "poly" of GF(2^8) by x. See the Rijndael spec.
876
877function xtime(poly) {
878 poly <<= 1;
879 return ((poly & 0x100) ? (poly ^ 0x11B) : (poly));
880}
881
882// Multiplies the two elements of GF(2^8) together and returns the result.
883// See the Rijndael spec, but should be straightforward: for each power of
884// the indeterminant that has a 1 coefficient in x, add y times that power
885// to the result. x and y should be bytes representing elements of GF(2^8)
886
887function mult_GF256(x, y) {
888 var bit, result = 0;
889
890 for (bit = 1; bit < 256; bit *= 2, y = xtime(y)) {
891 if (x & bit)
892 result ^= y;
893 }
894 return result;
895}
896
897// Performs the substitution step of the cipher. State is the 2d array of
898// state information (see spec) and direction is string indicating whether
899// we are performing the forward substitution ("encrypt") or inverse
900// substitution (anything else)
901
902function byteSub(state, direction) {
903 var S;
904 if (direction == "encrypt") // Point S to the SBox we're using
905 S = SBox;
906 else
907 S = SBoxInverse;
908 for (var i = 0; i < 4; i++) // Substitute for every byte in state
909 for (var j = 0; j < Nb; j++)
910 state[i][j] = S[state[i][j]];
911}
912
913// Performs the row shifting step of the cipher.
914
915function shiftRow(state, direction) {
916 for (var i=1; i<4; i++) // Row 0 never shifts
917 if (direction == "encrypt")
918 state[i] = cyclicShiftLeft(state[i], shiftOffsets[Nb][i]);
919 else
920 state[i] = cyclicShiftLeft(state[i], Nb - shiftOffsets[Nb][i]);
921
922}
923
924// Performs the column mixing step of the cipher. Most of these steps can
925// be combined into table lookups on 32bit values (at least for encryption)
926// to greatly increase the speed.
927
928function mixColumn(state, direction) {
929 var b = []; // Result of matrix multiplications
930 for (var j = 0; j < Nb; j++) { // Go through each column...
931 for (var i = 0; i < 4; i++) { // and for each row in the column...
932 if (direction == "encrypt")
933 b[i] = mult_GF256(state[i][j], 2) ^ // perform mixing
934 mult_GF256(state[(i+1)%4][j], 3) ^
935 state[(i+2)%4][j] ^
936 state[(i+3)%4][j];
937 else
938 b[i] = mult_GF256(state[i][j], 0xE) ^
939 mult_GF256(state[(i+1)%4][j], 0xB) ^
940 mult_GF256(state[(i+2)%4][j], 0xD) ^
941 mult_GF256(state[(i+3)%4][j], 9);
942 }
943 for (var i = 0; i < 4; i++) // Place result back into column
944 state[i][j] = b[i];
945 }
946}
947
948// Adds the current round key to the state information. Straightforward.
949
950function addRoundKey(state, roundKey) {
951 for (var j = 0; j < Nb; j++) { // Step through columns...
952 state[0][j] ^= (roundKey[j] & 0xFF); // and XOR
953 state[1][j] ^= ((roundKey[j]>>8) & 0xFF);
954 state[2][j] ^= ((roundKey[j]>>16) & 0xFF);
955 state[3][j] ^= ((roundKey[j]>>24) & 0xFF);
956 }
957}
958
959// This function creates the expanded key from the input (128/192/256-bit)
960// key. The parameter key is an array of bytes holding the value of the key.
961// The returned value is an array whose elements are the 32-bit words that
962// make up the expanded key.
963
964function keyExpansion(key) {
965 var expandedKey = new Array();
966 var temp;
967
968 // in case the key size or parameters were changed...
969 Nk = keySizeInBits / 32;
970 Nb = blockSizeInBits / 32;
971 Nr = roundsArray[Nk][Nb];
972
973 for (var j=0; j < Nk; j++) // Fill in input key first
974 expandedKey[j] =
975 (key[4*j]) | (key[4*j+1]<<8) | (key[4*j+2]<<16) | (key[4*j+3]<<24);
976
977 // Now walk down the rest of the array filling in expanded key bytes as
978 // per Rijndael's spec
979 for (j = Nk; j < Nb * (Nr + 1); j++) { // For each word of expanded key
980 temp = expandedKey[j - 1];
981 if (j % Nk == 0)
982 temp = ( (SBox[(temp>>8) & 0xFF]) |
983 (SBox[(temp>>16) & 0xFF]<<8) |
984 (SBox[(temp>>24) & 0xFF]<<16) |
985 (SBox[temp & 0xFF]<<24) ) ^ Rcon[Math.floor(j / Nk) - 1];
986 else if (Nk > 6 && j % Nk == 4)
987 temp = (SBox[(temp>>24) & 0xFF]<<24) |
988 (SBox[(temp>>16) & 0xFF]<<16) |
989 (SBox[(temp>>8) & 0xFF]<<8) |
990 (SBox[temp & 0xFF]);
991 expandedKey[j] = expandedKey[j-Nk] ^ temp;
992 }
993 return expandedKey;
994}
995
996// Rijndael's round functions...
997
998function Round(state, roundKey) {
999 byteSub(state, "encrypt");
1000 shiftRow(state, "encrypt");
1001 mixColumn(state, "encrypt");
1002 addRoundKey(state, roundKey);
1003}
1004
1005function InverseRound(state, roundKey) {
1006 addRoundKey(state, roundKey);
1007 mixColumn(state, "decrypt");
1008 shiftRow(state, "decrypt");
1009 byteSub(state, "decrypt");
1010}
1011
1012function FinalRound(state, roundKey) {
1013 byteSub(state, "encrypt");
1014 shiftRow(state, "encrypt");
1015 addRoundKey(state, roundKey);
1016}
1017
1018function InverseFinalRound(state, roundKey){
1019 addRoundKey(state, roundKey);
1020 shiftRow(state, "decrypt");
1021 byteSub(state, "decrypt");
1022}
1023
1024// encrypt is the basic encryption function. It takes parameters
1025// block, an array of bytes representing a plaintext block, and expandedKey,
1026// an array of words representing the expanded key previously returned by
1027// keyExpansion(). The ciphertext block is returned as an array of bytes.
1028
1029function encrypt(block, expandedKey) {
1030 var i;
1031 if (!block || block.length*8 != blockSizeInBits)
1032 return;
1033 if (!expandedKey)
1034 return;
1035
1036 block = packBytes(block);
1037 addRoundKey(block, expandedKey);
1038 for (i=1; i<Nr; i++)
1039 Round(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1040 FinalRound(block, expandedKey.slice(Nb*Nr));
1041 return unpackBytes(block);
1042}
1043
1044// decrypt is the basic decryption function. It takes parameters
1045// block, an array of bytes representing a ciphertext block, and expandedKey,
1046// an array of words representing the expanded key previously returned by
1047// keyExpansion(). The decrypted block is returned as an array of bytes.
1048
1049function decrypt(block, expandedKey) {
1050 var i;
1051 if (!block || block.length*8 != blockSizeInBits)
1052 return;
1053 if (!expandedKey)
1054 return;
1055
1056 block = packBytes(block);
1057 InverseFinalRound(block, expandedKey.slice(Nb*Nr));
1058 for (i = Nr - 1; i>0; i--)
1059 InverseRound(block, expandedKey.slice(Nb*i, Nb*(i+1)));
1060 addRoundKey(block, expandedKey);
1061 return unpackBytes(block);
1062}
1063
1064/* !NEEDED
1065// This method takes a byte array (byteArray) and converts it to a string by
1066// applying String.fromCharCode() to each value and concatenating the result.
1067// The resulting string is returned. Note that this function SKIPS zero bytes
1068// under the assumption that they are padding added in formatPlaintext().
1069// Obviously, do not invoke this method on raw data that can contain zero
1070// bytes. It is really only appropriate for printable ASCII/Latin-1
1071// values. Roll your own function for more robust functionality :)
1072
1073function byteArrayToString(byteArray) {
1074 var result = "";
1075 for(var i=0; i<byteArray.length; i++)
1076 if (byteArray[i] != 0)
1077 result += String.fromCharCode(byteArray[i]);
1078 return result;
1079}
1080*/
1081
1082// This function takes an array of bytes (byteArray) and converts them
1083// to a hexadecimal string. Array element 0 is found at the beginning of
1084// the resulting string, high nibble first. Consecutive elements follow
1085// similarly, for example [16, 255] --> "10ff". The function returns a
1086// string.
1087
1088function byteArrayToHex(byteArray) {
1089 var result = "";
1090 if (!byteArray)
1091 return;
1092 for (var i=0; i<byteArray.length; i++)
1093 result += ((byteArray[i]<16) ? "0" : "") + byteArray[i].toString(16);
1094
1095 return result;
1096}
1097
1098// This function converts a string containing hexadecimal digits to an
1099// array of bytes. The resulting byte array is filled in the order the
1100// values occur in the string, for example "10FF" --> [16, 255]. This
1101// function returns an array.
1102
1103function hexToByteArray(hexString) {
1104 var byteArray = [];
1105 if (hexString.length % 2) // must have even length
1106 return;
1107 if (hexString.indexOf("0x") == 0 || hexString.indexOf("0X") == 0)
1108 hexString = hexString.substring(2);
1109 for (var i = 0; i<hexString.length; i += 2)
1110 byteArray[Math.floor(i/2)] = parseInt(hexString.slice(i, i+2), 16);
1111 return byteArray;
1112}
1113
1114// This function packs an array of bytes into the four row form defined by
1115// Rijndael. It assumes the length of the array of bytes is divisible by
1116// four. Bytes are filled in according to the Rijndael spec (starting with
1117// column 0, row 0 to 3). This function returns a 2d array.
1118
1119function packBytes(octets) {
1120 var state = new Array();
1121 if (!octets || octets.length % 4)
1122 return;
1123
1124 state[0] = new Array(); state[1] = new Array();
1125 state[2] = new Array(); state[3] = new Array();
1126 for (var j=0; j<octets.length; j+= 4) {
1127 state[0][j/4] = octets[j];
1128 state[1][j/4] = octets[j+1];
1129 state[2][j/4] = octets[j+2];
1130 state[3][j/4] = octets[j+3];
1131 }
1132 return state;
1133}
1134
1135// This function unpacks an array of bytes from the four row format preferred
1136// by Rijndael into a single 1d array of bytes. It assumes the input "packed"
1137// is a packed array. Bytes are filled in according to the Rijndael spec.
1138// This function returns a 1d array of bytes.
1139
1140function unpackBytes(packed) {
1141 var result = new Array();
1142 for (var j=0; j<packed[0].length; j++) {
1143 result[result.length] = packed[0][j];
1144 result[result.length] = packed[1][j];
1145 result[result.length] = packed[2][j];
1146 result[result.length] = packed[3][j];
1147 }
1148 return result;
1149}
1150
1151// This function takes a prospective plaintext (string or array of bytes)
1152// and pads it with pseudorandom bytes if its length is not a multiple of the block
1153// size. If plaintext is a string, it is converted to an array of bytes
1154// in the process. The type checking can be made much nicer using the
1155// instanceof operator, but this operator is not available until IE5.0 so I
1156// chose to use the heuristic below.
1157
1158function formatPlaintext(plaintext) {
1159 var bpb = blockSizeInBits / 8; // bytes per block
1160 var fillWithRandomBits;
1161 var i;
1162
1163 // if primitive string or String instance
1164 if ((!((typeof plaintext == "object") &&
1165 ((typeof (plaintext[0])) == "number"))) &&
1166 ((typeof plaintext == "string") || plaintext.indexOf))
1167 {
1168 plaintext = plaintext.split("");
1169 // Unicode issues here (ignoring high byte)
1170 for (i=0; i<plaintext.length; i++) {
1171 plaintext[i] = plaintext[i].charCodeAt(0) & 0xFF;
1172 }
1173 }
1174
1175 i = plaintext.length % bpb;
1176 if (i > 0) {
1177//alert("adding " + (bpb - 1) + " bytes");
1178 // plaintext = plaintext.concat(getRandomBytes(bpb - i));
1179 {
1180 varpaddingBytes;
1181 var ii,cc;
1182
1183 paddingBytes = new Array();
1184 cc = bpb - i;
1185 for (ii=0; ii<cc; ii++) {
1186 paddingBytes[ii] = cc;
1187 }
1188
1189//is("cc", cc);
1190//is(getRandomBytes(bpb - i) + "", paddingBytes + "");
1191 plaintext = plaintext.concat(paddingBytes);
1192 }
1193 }
1194
1195 return plaintext;
1196}
1197
1198// Returns an array containing "howMany" random bytes.
1199
1200function getRandomBytes(howMany) {
1201 var i, bytes = new Array();
1202
1203//alert("getting some random bytes");
1204 for (i = 0; i < howMany; i++) {
1205 bytes[i] = prng.nextInt(255);
1206 }
1207 return bytes;
1208}
1209
1210// rijndaelEncrypt(plaintext, key, mode)
1211// Encrypts the plaintext using the given key and in the given mode.
1212// The parameter "plaintext" can either be a string or an array of bytes.
1213// The parameter "key" must be an array of key bytes. If you have a hex
1214// string representing the key, invoke hexToByteArray() on it to convert it
1215// to an array of bytes. The third parameter "mode" is a string indicating
1216// the encryption mode to use, either "ECB" or "CBC". If the parameter is
1217// omitted, ECB is assumed.
1218//
1219// An array of bytes representing the cihpertext is returned. To convert
1220// this array to hex, invoke byteArrayToHex() on it.
1221
1222function rijndaelEncrypt(plaintext, key, mode) {
1223 var expandedKey, i, aBlock;
1224 var bpb = blockSizeInBits / 8; // bytes per block
1225 var ct; // ciphertext
1226
1227 if (!plaintext || !key)
1228 return;
1229 if (key.length*8 != keySizeInBits)
1230 return;
1231 if (mode == "CBC") {
1232 ct = getRandomBytes(bpb); // get IV
1233//dump("IV", byteArrayToHex(ct));
1234 } else {
1235 mode = "ECB";
1236 ct = new Array();
1237 }
1238
1239 // convert plaintext to byte array and pad with zeros if necessary.
1240 plaintext = formatPlaintext(plaintext);
1241
1242 expandedKey = keyExpansion(key);
1243
1244 for (var block = 0; block < plaintext.length / bpb; block++) {
1245 aBlock = plaintext.slice(block * bpb, (block + 1) * bpb);
1246 if (mode == "CBC") {
1247 for (var i = 0; i < bpb; i++) {
1248 aBlock[i] ^= ct[(block * bpb) + i];
1249 }
1250 }
1251 ct = ct.concat(encrypt(aBlock, expandedKey));
1252 }
1253
1254 return ct;
1255}
1256
1257// rijndaelDecrypt(ciphertext, key, mode)
1258// Decrypts the using the given key and mode. The parameter "ciphertext"
1259// must be an array of bytes. The parameter "key" must be an array of key
1260// bytes. If you have a hex string representing the ciphertext or key,
1261// invoke hexToByteArray() on it to convert it to an array of bytes. The
1262// parameter "mode" is a string, either "CBC" or "ECB".
1263//
1264// An array of bytes representing the plaintext is returned. To convert
1265// this array to a hex string, invoke byteArrayToHex() on it. To convert it
1266// to a string of characters, you can use byteArrayToString().
1267
1268function rijndaelDecrypt(ciphertext, key, mode) {
1269 var expandedKey;
1270 var bpb = blockSizeInBits / 8; // bytes per block
1271 var pt = new Array(); // plaintext array
1272 var aBlock; // a decrypted block
1273 var block; // current block number
1274
1275 if (!ciphertext || !key || typeof ciphertext == "string")
1276 return;
1277 if (key.length*8 != keySizeInBits)
1278 return;
1279 if (!mode) {
1280 mode = "ECB"; // assume ECB if mode omitted
1281 }
1282
1283 expandedKey = keyExpansion(key);
1284
1285 // work backwards to accomodate CBC mode
1286 for (block=(ciphertext.length / bpb)-1; block>0; block--) {
1287 aBlock =
1288 decrypt(ciphertext.slice(block*bpb,(block+1)*bpb), expandedKey);
1289 if (mode == "CBC")
1290 for (var i=0; i<bpb; i++)
1291 pt[(block-1)*bpb + i] = aBlock[i] ^ ciphertext[(block-1)*bpb + i];
1292 else
1293 pt = aBlock.concat(pt);
1294 }
1295
1296 // do last block if ECB (skips the IV in CBC)
1297 if (mode == "ECB")
1298 pt = decrypt(ciphertext.slice(0, bpb), expandedKey).concat(pt);
1299
1300 return pt;
1301}
1302
1303//#############################################################################
1304 //Downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip (utf-8.js)
1305//#############################################################################
1306
1307
1308 /*Encoding and decoding of Unicode character strings as
1309 UTF-8 byte streams. */
1310
1311 //UNICODE_TO_UTF8 -- Encode Unicode argument string as UTF-8 return value
1312
1313 function unicode_to_utf8(s) {
1314 var utf8 = "";
1315
1316 for (var n = 0; n < s.length; n++) {
1317 var c = s.charCodeAt(n);
1318
1319 if (c <= 0x7F) {
1320 // 0x00 - 0x7F: Emit as single byte, unchanged
1321 utf8 += String.fromCharCode(c);
1322 } else if ((c >= 0x80) && (c <= 0x7FF)) {
1323 // 0x80 - 0x7FF: Output as two byte code, 0xC0 in first byte
1324 // 0x80 in second byte
1325 utf8 += String.fromCharCode((c >> 6) | 0xC0);
1326 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1327 } else {
1328 // 0x800 - 0xFFFF: Output as three bytes, 0xE0 in first byte
1329 // 0x80 in second byte
1330 // 0x80 in third byte
1331 utf8 += String.fromCharCode((c >> 12) | 0xE0);
1332 utf8 += String.fromCharCode(((c >> 6) & 0x3F) | 0x80);
1333 utf8 += String.fromCharCode((c & 0x3F) | 0x80);
1334 }
1335 }
1336 return utf8;
1337 }
1338
1339 //UTF8_TO_UNICODE -- Decode UTF-8 argument into Unicode string return value
1340
1341 function utf8_to_unicode(utf8) {
1342 var s = "", i = 0, b1, b2, b2;
1343
1344 while (i < utf8.length) {
1345 b1 = utf8.charCodeAt(i);
1346 if (b1 < 0x80) { // One byte code: 0x00 0x7F
1347 s += String.fromCharCode(b1);
1348 i++;
1349 } else if((b1 >= 0xC0) && (b1 < 0xE0)) {// Two byte code: 0x80 - 0x7FF
1350 b2 = utf8.charCodeAt(i + 1);
1351 s += String.fromCharCode(((b1 & 0x1F) << 6) | (b2 & 0x3F));
1352 i += 2;
1353 } else { // Three byte code: 0x800 - 0xFFFF
1354 b2 = utf8.charCodeAt(i + 1);
1355 b3 = utf8.charCodeAt(i + 2);
1356 s += String.fromCharCode(((b1 & 0xF) << 12) |
1357 ((b2 & 0x3F) << 6) |
1358 (b3 & 0x3F));
1359 i += 3;
1360 }
1361 }
1362 return s;
1363 }
1364
1365 /*ENCODE_UTF8 -- Encode string as UTF8 only if it contains
1366 a character of 0x9D (Unicode OPERATING
1367 SYSTEM COMMAND) or a character greater
1368 than 0xFF. This permits all strings
1369 consisting exclusively of 8 bit
1370 graphic characters to be encoded as
1371 themselves. We choose 0x9D as the sentinel
1372 character as opposed to one of the more
1373 logical PRIVATE USE characters because 0x9D
1374 is not overloaded by the regrettable
1375 "Windows-1252" character set. Now such characters
1376 don't belong in JavaScript strings, but you never
1377 know what somebody is going to paste into a
1378 text box, so this choice keeps Windows-encoded
1379 strings from bloating to UTF-8 encoding. */
1380
1381 function encode_utf8(s) {
1382 var i, necessary = false;
1383
1384 for (i = 0; i < s.length; i++) {
1385 if ((s.charCodeAt(i) == 0x9D) ||
1386 (s.charCodeAt(i) > 0xFF)) {
1387 necessary = true;
1388 break;
1389 }
1390 }
1391 if (!necessary) {
1392 return s;
1393 }
1394 return String.fromCharCode(0x9D) + unicode_to_utf8(s);
1395 }
1396
1397 /* DECODE_UTF8 -- Decode a string encoded with encode_utf8
1398 above. If the string begins with the
1399 sentinel character 0x9D (OPERATING
1400 SYSTEM COMMAND), then we decode the
1401 balance as a UTF-8 stream. Otherwise,
1402 the string is output unchanged, as
1403 it's guaranteed to contain only 8 bit
1404 characters excluding 0x9D. */
1405
1406 function decode_utf8(s) {
1407 if ((s.length > 0) && (s.charCodeAt(0) == 0x9D)) {
1408 return utf8_to_unicode(s.substring(1));
1409 }
1410 return s;
1411 }
1412
1413
1414//#############################################################################
1415 //Downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
1416//#############################################################################
1417
1418/*
1419 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
1420 * Digest Algorithm, as defined in RFC 1321.
1421 * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
1422 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
1423 * Distributed under the BSD License
1424 * See http://pajhome.org.uk/crypt/md5 for more info.
1425 */
1426
1427/*
1428 * Configurable variables. You may need to tweak these to be compatible with
1429 * the server-side, but the defaults work in most cases.
1430 */
1431var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
1432var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
1433var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
1434
1435/*
1436 * These are the functions you'll usually want to call
1437 * They take string arguments and return either hex or base-64 encoded strings
1438 */
1439function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
1440function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
1441function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));}
1442function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
1443function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
1444function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }
1445
1446/*
1447 * Perform a simple self-test to see if the VM is working
1448 */
1449function md5_vm_test()
1450{
1451 return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
1452}
1453
1454/*
1455 * Calculate the MD5 of an array of little-endian words, and a bit length
1456 */
1457function core_md5(x, len)
1458{
1459 /* append padding */
1460 x[len >> 5] |= 0x80 << ((len) % 32);
1461 x[(((len + 64) >>> 9) << 4) + 14] = len;
1462
1463 var a = 1732584193;
1464 var b = -271733879;
1465 var c = -1732584194;
1466 var d = 271733878;
1467
1468 for(var i = 0; i < x.length; i += 16)
1469 {
1470 var olda = a;
1471 var oldb = b;
1472 var oldc = c;
1473 var oldd = d;
1474
1475 a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
1476 d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
1477 c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
1478 b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
1479 a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
1480 d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
1481 c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
1482 b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
1483 a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
1484 d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
1485 c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
1486 b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
1487 a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
1488 d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
1489 c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
1490 b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
1491
1492 a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
1493 d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
1494 c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
1495 b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
1496 a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
1497 d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
1498 c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
1499 b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
1500 a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
1501 d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
1502 c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
1503 b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
1504 a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
1505 d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
1506 c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
1507 b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
1508
1509 a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
1510 d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
1511 c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
1512 b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
1513 a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
1514 d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
1515 c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
1516 b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
1517 a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
1518 d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
1519 c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
1520 b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
1521 a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
1522 d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
1523 c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
1524 b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
1525
1526 a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
1527 d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
1528 c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
1529 b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
1530 a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
1531 d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
1532 c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
1533 b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
1534 a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
1535 d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
1536 c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
1537 b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
1538 a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
1539 d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
1540 c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
1541 b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
1542
1543 a = safe_add(a, olda);
1544 b = safe_add(b, oldb);
1545 c = safe_add(c, oldc);
1546 d = safe_add(d, oldd);
1547 }
1548 return Array(a, b, c, d);
1549
1550}
1551
1552/*
1553 * These functions implement the four basic operations the algorithm uses.
1554 */
1555function md5_cmn(q, a, b, x, s, t)
1556{
1557 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
1558}
1559function md5_ff(a, b, c, d, x, s, t)
1560{
1561 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
1562}
1563function md5_gg(a, b, c, d, x, s, t)
1564{
1565 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
1566}
1567function md5_hh(a, b, c, d, x, s, t)
1568{
1569 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
1570}
1571function md5_ii(a, b, c, d, x, s, t)
1572{
1573 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
1574}
1575
1576/*
1577 * Calculate the HMAC-MD5, of a key and some data
1578 */
1579function core_hmac_md5(key, data)
1580{
1581 var bkey = str2binl(key);
1582 if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
1583
1584 var ipad = Array(16), opad = Array(16);
1585 for(var i = 0; i < 16; i++)
1586 {
1587 ipad[i] = bkey[i] ^ 0x36363636;
1588 opad[i] = bkey[i] ^ 0x5C5C5C5C;
1589 }
1590
1591 var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
1592 return core_md5(opad.concat(hash), 512 + 128);
1593}
1594
1595/*
1596 * Add integers, wrapping at 2^32. This uses 16-bit operations internally
1597 * to work around bugs in some JS interpreters.
1598 */
1599function safe_add(x, y)
1600{
1601 var lsw = (x & 0xFFFF) + (y & 0xFFFF);
1602 var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
1603 return (msw << 16) | (lsw & 0xFFFF);
1604}
1605
1606/*
1607 * Bitwise rotate a 32-bit number to the left.
1608 */
1609function bit_rol(num, cnt)
1610{
1611 return (num << cnt) | (num >>> (32 - cnt));
1612}
1613
1614/*
1615 * Convert a string to an array of little-endian words
1616 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
1617 */
1618function str2binl(str)
1619{
1620 var bin = Array();
1621 var mask = (1 << chrsz) - 1;
1622 for(var i = 0; i < str.length * chrsz; i += chrsz)
1623 bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
1624 return bin;
1625}
1626
1627/*
1628 * Convert an array of little-endian words to a string
1629 */
1630function binl2str(bin)
1631{
1632 var str = "";
1633 var mask = (1 << chrsz) - 1;
1634 for(var i = 0; i < bin.length * 32; i += chrsz)
1635 str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
1636 return str;
1637}
1638
1639/*
1640 * Convert an array of little-endian words to a hex string.
1641 */
1642function binl2hex(binarray)
1643{
1644 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
1645 var str = "";
1646 for(var i = 0; i < binarray.length * 4; i++)
1647 {
1648 str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
1649 hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
1650 }
1651 return str;
1652}
1653
1654/*
1655 * Convert an array of little-endian words to a base-64 string
1656 */
1657function binl2b64(binarray)
1658{
1659 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1660 var str = "";
1661 for(var i = 0; i < binarray.length * 4; i += 3)
1662 {
1663 var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
1664 | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
1665 | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
1666 for(var j = 0; j < 4; j++)
1667 {
1668 if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
1669 else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
1670 }
1671 }
1672 return str;
1673}
1674
1675
1676//#############################################################################
1677//#############################################################################
1678//#############################################################################
1679
1680
1681
1682MochiKit.Base.update(Clipperz.Crypto.Base, {
1683
1684 '__repr__': function () {
1685 return "[" + this.NAME + " " + this.VERSION + "]";
1686 },
1687
1688 'toString': function () {
1689 return this.__repr__();
1690 },
1691
1692 //-----------------------------------------------------------------------------
1693
1694 'encryptUsingSecretKey': function (aKey, aMessage) {
1695//Clipperz.Profile.start("Clipperz.Crypto.Base.encryptUsingSecretKey");
1696 var result;
1697 var plaintext;
1698 varheader;
1699 varkey;
1700
1701 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1702
1703 addEntropyTime();
1704 prng = new AESprng(keyFromEntropy());
1705
1706 plaintext = encode_utf8(aMessage);
1707
1708 header = Clipperz.Base.byteArrayToString(hexToByteArray(Clipperz.Crypto.Base.computeMD5HashValue(plaintext)));
1709
1710 // Add message length in bytes to header
1711 i = plaintext.length;
1712 header += String.fromCharCode(i >>> 24);
1713 header += String.fromCharCode(i >>> 16);
1714 header += String.fromCharCode(i >>> 8);
1715 header += String.fromCharCode(i & 0xFF);
1716
1717 //The format of the actual message passed to rijndaelEncrypt
1718 //is:
1719 //
1720 // Bytes Content
1721 // 0-15 MD5 signature of plaintext
1722 // 16-19 Length of plaintext, big-endian order
1723 // 20-end Plaintext
1724 //
1725 //Note that this message will be padded with zero bytes
1726 //to an integral number of AES blocks (blockSizeInBits / 8).
1727 //This does not include the initial vector for CBC
1728 //encryption, which is added internally by rijndaelEncrypt.
1729 result = byteArrayToHex(rijndaelEncrypt(header + plaintext, key, "CBC"));
1730
1731 delete prng;
1732
1733//Clipperz.Profile.stop("Clipperz.Crypto.Base.encryptUsingSecretKey");
1734 return result;
1735 },
1736
1737 //.............................................................................
1738
1739 'decryptUsingSecretKey': function (aKey, aMessage) {
1740//Clipperz.Profile.start("Clipperz.Crypto.Base.decryptUsingSecretKey");
1741 varkey;
1742 var decryptedText;
1743 vartextLength;
1744 varheader;
1745 varheaderDigest;
1746 var plaintext;
1747 var i;
1748
1749 key = hexToByteArray(Clipperz.Crypto.Base.computeHashValue(aKey));
1750
1751 decryptedText = rijndaelDecrypt(hexToByteArray(aMessage), key, "CBC");
1752
1753 header = decryptedText.slice(0, 20);
1754 decryptedText = decryptedText.slice(20);
1755
1756 headerDigest = byteArrayToHex(header.slice(0,16));
1757 textLength = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19];
1758
1759 if ((textLength < 0) || (textLength > decryptedText.length)) {
1760 // jslog.warning("Message (length " + decryptedText.length + ") truncated. " + textLength + " characters expected.");
1761 //Try to sauve qui peut by setting length to entire message
1762 textLength = decryptedText.length;
1763 }
1764
1765 plainText = "";
1766
1767 for (i=0; i<textLength; i++) {
1768 plainText += String.fromCharCode(decryptedText[i]);
1769 }
1770
1771 if (Clipperz.Crypto.Base.computeMD5HashValue(plainText) != headerDigest) {
1772 // jslog.warning("Message corrupted. Checksum of decrypted message does not match.");
1773 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
1774 // throw new Error("Message corrupted. Checksum of decrypted message does not match. Parsed result: " + decode_utf8(plainText));
1775 }
1776
1777 // That's it; plug plaintext into the result field
1778
1779 result = decode_utf8(plainText);
1780
1781//Clipperz.Profile.stop("Clipperz.Crypto.Base.decryptUsingSecretKey");
1782 return result;
1783 },
1784
1785 //-----------------------------------------------------------------------------
1786
1787 'computeHashValue': function (aMessage) {
1788//Clipperz.Profile.start("Clipperz.Crypto.Base.computeHashValue");
1789 varresult;
1790
1791 result = hex_sha256(aMessage);
1792//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeHashValue");
1793
1794 return result;
1795 },
1796
1797 //.........................................................................
1798
1799 'computeMD5HashValue': function (aMessage) {
1800 varresult;
1801//Clipperz.Profile.start("Clipperz.Crypto.Base.computeMD5HashValue");
1802 result = hex_md5(aMessage);
1803//Clipperz.Profile.stop("Clipperz.Crypto.Base.computeMD5HashValue");
1804
1805 return result;
1806 },
1807
1808 //-----------------------------------------------------------------------------
1809
1810 'generateRandomSeed': function () {
1811//Clipperz.Profile.start("Clipperz.Crypto.Base.generateRandomSeed");
1812 varresult;
1813 var seed;
1814 var prng;
1815 var charA;
1816 var i;
1817
1818 addEntropyTime();
1819
1820 seed = keyFromEntropy();
1821 prng = new AESprng(seed);
1822
1823 result = "";
1824 charA = ("A").charCodeAt(0);
1825
1826 for (i = 0; i < 64; i++) {
1827 result += String.fromCharCode(charA + prng.nextInt(25));
1828 }
1829
1830 delete prng;
1831
1832 result = Clipperz.Crypto.Base.computeHashValue(result);
1833
1834//Clipperz.Profile.stop("Clipperz.Crypto.Base.generateRandomSeed");
1835 return result;
1836 },
1837
1838 //-----------------------------------------------------------------------------
1839
1840 'exception': {
1841 'CorruptedMessage': new MochiKit.Base.NamedError("Clipperz.Crypto.Base.exception.CorruptedMessage")
1842 },
1843
1844 //.........................................................................
1845 __syntaxFix__: "syntax fix"
1846});
1847
diff --git a/frontend/delta/js/Clipperz/Crypto/BigInt.js b/frontend/delta/js/Clipperz/Crypto/BigInt.js
new file mode 100644
index 0000000..031ed30
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/BigInt.js
@@ -0,0 +1,1754 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
26
27//#############################################################################
28 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
29//#############################################################################
30
31
32////////////////////////////////////////////////////////////////////////////////////////
33// Big Integer Library v. 5.0
34// Created 2000, last modified 2006
35// Leemon Baird
36// www.leemon.com
37//
38// This file is public domain. You can use it for any purpose without restriction.
39// I do not guarantee that it is correct, so use it at your own risk. If you use
40// it for something interesting, I'd appreciate hearing about it. If you find
41// any bugs or make any improvements, I'd appreciate hearing about those too.
42// It would also be nice if my name and address were left in the comments.
43// But none of that is required.
44//
45// This code defines a bigInt library for arbitrary-precision integers.
46// A bigInt is an array of integers storing the value in chunks of bpe bits,
47// little endian (buff[0] is the least significant word).
48// Negative bigInts are stored two's complement.
49// Some functions assume their parameters have at least one leading zero element.
50// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
51// so the caller must make sure overflow won't happen.
52// For each function where a parameter is modified, that same
53// variable must not be used as another argument too.
54// So, you cannot square x by doing multMod_(x,x,n).
55// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
56//
57// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
58// For most functions, if it needs a BigInt as a local variable it will actually use
59// a global, and will only allocate to it when it's not the right size. This ensures
60// that when a function is called repeatedly with same-sized parameters, it only allocates
61// memory on the first call.
62//
63// Note that for cryptographic purposes, the calls to Math.random() must
64// be replaced with calls to a better pseudorandom number generator.
65//
66// In the following, "bigInt" means a bigInt with at least one leading zero element,
67// and "integer" means a nonnegative integer less than radix. In some cases, integer
68// can be negative. Negative bigInts are 2s complement.
69//
70// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
71//
72// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
73// function dup(x) //returns a copy of bigInt x
74// function findPrimes(n) //return array of all primes less than integer n
75// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
76// function int2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
77// function trim(x,k) //return a copy of x with exactly k leading zero elements
78//
79// The following functions do not modify their inputs, so there is never a problem with the result being too big:
80//
81// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
82// function equals(x,y) //is the bigInt x equal to the bigint y?
83// function equalsInt(x,y) //is bigint x equal to integer y?
84// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
85// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
86// function isZero(x) //is the bigInt x equal to zero?
87// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
88// function modInt(x,n) //return x mod n for bigInt x and integer n.
89// function negative(x) //is bigInt x negative?
90//
91// The following functions do not modify their inputs, but allocate memory and call functions with underscores
92//
93// function add(x,y) //return (x+y) for bigInts x and y.
94// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
95// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
96// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
97// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
98// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
99// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
100// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
101// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
102// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
103//
104// The following functions write a bigInt result to one of the parameters, but
105// the result is never bigger than the original, so there can't be overflow problems:
106//
107// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
108// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
109// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
110// function mod_(x,n) //do x=x mod n for bigInts x and n.
111// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
112//
113// The following functions write a bigInt result to one of the parameters. The caller is responsible for
114// ensuring it is large enough to hold the result.
115//
116// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
117// function add_(x,y) //do x=x+y for bigInts x and y
118// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
119// function copy_(x,y) //do x=y on bigInts x and y
120// function copyInt_(x,n) //do x=n on bigInt x and integer n
121// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
122// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
123// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
124// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
125// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
126// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
127// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
128// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
129// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
130// function mult_(x,y) //do x=x*y for bigInts x and y.
131// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
132// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
133// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
134// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
135// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
136// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
137// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
138// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
139//
140// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
141// powMod_() = algorithm 14.94, Montgomery exponentiation
142// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
143// GCD_() = algorothm 14.57, Lehmer's algorithm
144// mont_() = algorithm 14.36, Montgomery multiplication
145// divide_() = algorithm 14.20 Multiple-precision division
146// squareMod_() = algorithm 14.16 Multiple-precision squaring
147// randTruePrime_() = algorithm 4.62, Maurer's algorithm
148// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
149//
150// Profiling shows:
151// randTruePrime_() spends:
152// 10% of its time in calls to powMod_()
153// 85% of its time in calls to millerRabin()
154// millerRabin() spends:
155// 99% of its time in calls to powMod_() (always with a base of 2)
156// powMod_() spends:
157// 94% of its time in calls to mont_() (almost always with x==y)
158//
159// This suggests there are several ways to speed up this library slightly:
160// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
161// -- this should especially focus on being fast when raising 2 to a power mod n
162// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
163// - tune the parameters in randTruePrime_(), including c, m, and recLimit
164// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
165// within the loop when all the parameters are the same length.
166//
167// There are several ideas that look like they wouldn't help much at all:
168// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
169// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
170// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
171// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
172// method would be slower. This is unfortunate because the code currently spends almost all of its time
173// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
174// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
175// sentences that seem to imply it's faster to do a non-modular square followed by a single
176// Montgomery reduction, but that's obviously wrong.
177////////////////////////////////////////////////////////////////////////////////////////
178
179//globals
180bpe=0; //bits stored per array element
181mask=0; //AND this with an array element to chop it down to bpe bits
182radix=mask+1; //equals 2^bpe. A single 1 bit to the left of the last bit of mask.
183
184//the digits for converting to different bases
185digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-';
186
187//initialize the global variables
188for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
189bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
190mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
191radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
192one=int2bigInt(1,1,1); //constant used in powMod_()
193
194//the following global variables are scratchpad memory to
195//reduce dynamic memory allocation in the inner loop
196t=new Array(0);
197ss=t; //used in mult_()
198s0=t; //used in multMod_(), squareMod_()
199s1=t; //used in powMod_(), multMod_(), squareMod_()
200s2=t; //used in powMod_(), multMod_()
201s3=t; //used in powMod_()
202s4=t; s5=t; //used in mod_()
203s6=t; //used in bigInt2str()
204s7=t; //used in powMod_()
205T=t; //used in GCD_()
206sa=t; //used in mont_()
207mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
208eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
209md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
210
211primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
212 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
213
214////////////////////////////////////////////////////////////////////////////////////////
215
216//return array of all primes less than integer n
217function findPrimes(n) {
218 var i,s,p,ans;
219 s=new Array(n);
220 for (i=0;i<n;i++)
221 s[i]=0;
222 s[0]=2;
223 p=0; //first p elements of s are primes, the rest are a sieve
224 for(;s[p]<n;) { //s[p] is the pth prime
225 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
226 s[i]=1;
227 p++;
228 s[p]=s[p-1]+1;
229 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
230 }
231 ans=new Array(p);
232 for(i=0;i<p;i++)
233 ans[i]=s[i];
234 return ans;
235}
236
237//does a single round of Miller-Rabin base b consider x to be a possible prime?
238//x is a bigInt, and b is an integer
239function millerRabin(x,b) {
240 var i,j,k,s;
241
242 if (mr_x1.length!=x.length) {
243 mr_x1=dup(x);
244 mr_r=dup(x);
245 mr_a=dup(x);
246 }
247
248 copyInt_(mr_a,b);
249 copy_(mr_r,x);
250 copy_(mr_x1,x);
251
252 addInt_(mr_r,-1);
253 addInt_(mr_x1,-1);
254
255 //s=the highest power of two that divides mr_r
256 k=0;
257 for (i=0;i<mr_r.length;i++)
258 for (j=1;j<mask;j<<=1)
259 if (x[i] & j) {
260 s=(k<mr_r.length+bpe ? k : 0);
261 i=mr_r.length;
262 j=mask;
263 } else
264 k++;
265
266 if (s)
267 rightShift_(mr_r,s);
268
269 powMod_(mr_a,mr_r,x);
270
271 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
272 j=1;
273 while (j<=s-1 && !equals(mr_a,mr_x1)) {
274 squareMod_(mr_a,x);
275 if (equalsInt(mr_a,1)) {
276 return 0;
277 }
278 j++;
279 }
280 if (!equals(mr_a,mr_x1)) {
281 return 0;
282 }
283 }
284 return 1;
285}
286
287//returns how many bits long the bigInt is, not counting leading zeros.
288function bitSize(x) {
289 var j,z,w;
290 for (j=x.length-1; (x[j]==0) && (j>0); j--);
291 for (z=0,w=x[j]; w; (w>>=1),z++);
292 z+=bpe*j;
293 return z;
294}
295
296//return a copy of x with at least n elements, adding leading zeros if needed
297function expand(x,n) {
298 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
299 copy_(ans,x);
300 return ans;
301}
302
303//return a k-bit true random prime using Maurer's algorithm.
304function randTruePrime(k) {
305 var ans=int2bigInt(0,k,0);
306 randTruePrime_(ans,k);
307 return trim(ans,1);
308}
309
310//return a new bigInt equal to (x mod n) for bigInts x and n.
311function mod(x,n) {
312 var ans=dup(x);
313 mod_(ans,n);
314 return trim(ans,1);
315}
316
317//return (x+n) where x is a bigInt and n is an integer.
318function addInt(x,n) {
319 var ans=expand(x,x.length+1);
320 addInt_(ans,n);
321 return trim(ans,1);
322}
323
324//return x*y for bigInts x and y. This is faster when y<x.
325function mult(x,y) {
326 var ans=expand(x,x.length+y.length);
327 mult_(ans,y);
328 return trim(ans,1);
329}
330
331//return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
332function powMod(x,y,n) {
333 var ans=expand(x,n.length);
334 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
335 return trim(ans,1);
336}
337
338//return (x-y) for bigInts x and y. Negative answers will be 2s complement
339function sub(x,y) {
340 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
341 sub_(ans,y);
342 return trim(ans,1);
343}
344
345//return (x+y) for bigInts x and y.
346function add(x,y) {
347 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
348 add_(ans,y);
349 return trim(ans,1);
350}
351
352//return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
353function inverseMod(x,n) {
354 var ans=expand(x,n.length);
355 var s;
356 s=inverseMod_(ans,n);
357 return s ? trim(ans,1) : null;
358}
359
360//return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
361function multMod(x,y,n) {
362 var ans=expand(x,n.length);
363 multMod_(ans,y,n);
364 return trim(ans,1);
365}
366
367//generate a k-bit true random prime using Maurer's algorithm,
368//and put it into ans. The bigInt ans must be large enough to hold it.
369function randTruePrime_(ans,k) {
370 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
371
372 if (primes.length==0)
373 primes=findPrimes(30000); //check for divisibility by primes <=30000
374
375 if (pows.length==0) {
376 pows=new Array(512);
377 for (j=0;j<512;j++) {
378 pows[j]=Math.pow(2,j/511.-1.);
379 }
380 }
381
382 //c and m should be tuned for a particular machine and value of k, to maximize speed
383 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
384 c=0.1;
385 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
386 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
387
388 if (s_i2.length!=ans.length) {
389 s_i2=dup(ans);
390 s_R =dup(ans);
391 s_n1=dup(ans);
392 s_r2=dup(ans);
393 s_d =dup(ans);
394 s_x1=dup(ans);
395 s_x2=dup(ans);
396 s_b =dup(ans);
397 s_n =dup(ans);
398 s_i =dup(ans);
399 s_rm=dup(ans);
400 s_q =dup(ans);
401 s_a =dup(ans);
402 s_aa=dup(ans);
403 }
404
405 if (k <= recLimit) { //generate small random primes by trial division up to its square root
406 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
407 copyInt_(ans,0);
408 for (dd=1;dd;) {
409 dd=0;
410 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
411 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
412 if (0==(ans[0]%primes[j])) {
413 dd=1;
414 break;
415 }
416 }
417 }
418 carry_(ans);
419 return;
420 }
421
422 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
423 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
424 for (r=1; k-k*r<=m; )
425 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
426 else
427 r=.5;
428
429 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
430
431 recSize=Math.floor(r*k)+1;
432
433 randTruePrime_(s_q,recSize);
434 copyInt_(s_i2,0);
435 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
436 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
437
438 z=bitSize(s_i);
439
440 for (;;) {
441 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
442 randBigInt_(s_R,z,0);
443 if (greater(s_i,s_R))
444 break;
445 } //now s_R is in the range [0,s_i-1]
446 addInt_(s_R,1); //now s_R is in the range [1,s_i]
447 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
448
449 copy_(s_n,s_q);
450 mult_(s_n,s_R);
451 multInt_(s_n,2);
452 addInt_(s_n,1); //s_n=2*s_R*s_q+1
453
454 copy_(s_r2,s_R);
455 multInt_(s_r2,2); //s_r2=2*s_R
456
457 //check s_n for divisibility by small primes up to B
458 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
459 if (modInt(s_n,primes[j])==0) {
460 divisible=1;
461 break;
462 }
463
464 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
465 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
466 divisible=1;
467
468 if (!divisible) { //if it passes that test, continue checking s_n
469 addInt_(s_n,-3);
470 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
471 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
472 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
473 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
474 randBigInt_(s_a,zz,0);
475 if (greater(s_n,s_a))
476 break;
477 } //now s_a is in the range [0,s_n-1]
478 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
479 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
480 copy_(s_b,s_a);
481 copy_(s_n1,s_n);
482 addInt_(s_n1,-1);
483 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
484 addInt_(s_b,-1);
485 if (isZero(s_b)) {
486 copy_(s_b,s_a);
487 powMod_(s_b,s_r2,s_n);
488 addInt_(s_b,-1);
489 copy_(s_aa,s_n);
490 copy_(s_d,s_b);
491 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
492 if (equalsInt(s_d,1)) {
493 copy_(ans,s_aa);
494 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
495 }
496 }
497 }
498 }
499}
500
501//set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
502//array b must be big enough to hold the result. Must have n>=1
503function randBigInt_(b,n,s) {
504 var i,a;
505 for (i=0;i<b.length;i++)
506 b[i]=0;
507 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
508 for (i=0;i<a;i++) {
509 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
510 }
511 b[a-1] &= (2<<((n-1)%bpe))-1;
512 if (s)
513 b[a-1] |= (1<<((n-1)%bpe));
514}
515
516//set x to the greatest common divisor of x and y.
517//x,y are bigInts with the same number of elements. y is destroyed.
518function GCD_(x,y) {
519 var i,xp,yp,A,B,C,D,q,sing;
520 if (T.length!=x.length)
521 T=dup(x);
522
523 sing=1;
524 while (sing) { //while y has nonzero elements other than y[0]
525 sing=0;
526 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
527 if (y[i]) {
528 sing=1;
529 break;
530 }
531 if (!sing) break; //quit when y all zero elements except possibly y[0]
532
533 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
534 xp=x[i];
535 yp=y[i];
536 A=1; B=0; C=0; D=1;
537 while ((yp+C) && (yp+D)) {
538 q =Math.floor((xp+A)/(yp+C));
539 qp=Math.floor((xp+B)/(yp+D));
540 if (q!=qp)
541 break;
542 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
543 t= B-q*D; B=D; D=t;
544 t=xp-q*yp; xp=yp; yp=t;
545 }
546 if (B) {
547 copy_(T,x);
548 linComb_(x,y,A,B); //x=A*x+B*y
549 linComb_(y,T,D,C); //y=D*y+C*T
550 } else {
551 mod_(x,y);
552 copy_(T,x);
553 copy_(x,y);
554 copy_(y,T);
555 }
556 }
557 if (y[0]==0)
558 return;
559 t=modInt(x,y[0]);
560 copyInt_(x,y[0]);
561 y[0]=t;
562 while (y[0]) {
563 x[0]%=y[0];
564 t=x[0]; x[0]=y[0]; y[0]=t;
565 }
566}
567
568//do x=x**(-1) mod n, for bigInts x and n.
569//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
570//The x array must be at least as large as the n array.
571function inverseMod_(x,n) {
572 var k=1+2*Math.max(x.length,n.length);
573
574 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
575 copyInt_(x,0);
576 return 0;
577 }
578
579 if (eg_u.length!=k) {
580 eg_u=new Array(k);
581 eg_v=new Array(k);
582 eg_A=new Array(k);
583 eg_B=new Array(k);
584 eg_C=new Array(k);
585 eg_D=new Array(k);
586 }
587
588 copy_(eg_u,x);
589 copy_(eg_v,n);
590 copyInt_(eg_A,1);
591 copyInt_(eg_B,0);
592 copyInt_(eg_C,0);
593 copyInt_(eg_D,1);
594 for (;;) {
595 while(!(eg_u[0]&1)) { //while eg_u is even
596 halve_(eg_u);
597 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
598 halve_(eg_A);
599 halve_(eg_B);
600 } else {
601 add_(eg_A,n); halve_(eg_A);
602 sub_(eg_B,x); halve_(eg_B);
603 }
604 }
605
606 while (!(eg_v[0]&1)) { //while eg_v is even
607 halve_(eg_v);
608 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
609 halve_(eg_C);
610 halve_(eg_D);
611 } else {
612 add_(eg_C,n); halve_(eg_C);
613 sub_(eg_D,x); halve_(eg_D);
614 }
615 }
616
617 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
618 sub_(eg_u,eg_v);
619 sub_(eg_A,eg_C);
620 sub_(eg_B,eg_D);
621 } else { //eg_v > eg_u
622 sub_(eg_v,eg_u);
623 sub_(eg_C,eg_A);
624 sub_(eg_D,eg_B);
625 }
626
627 if (equalsInt(eg_u,0)) {
628 if (negative(eg_C)) //make sure answer is nonnegative
629 add_(eg_C,n);
630 copy_(x,eg_C);
631
632 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
633 copyInt_(x,0);
634 return 0;
635 }
636 return 1;
637 }
638 }
639}
640
641//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
642function inverseModInt_(x,n) {
643 var a=1,b=0,t;
644 for (;;) {
645 if (x==1) return a;
646 if (x==0) return 0;
647 b-=a*Math.floor(n/x);
648 n%=x;
649
650 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
651 if (n==0) return 0;
652 a-=b*Math.floor(x/n);
653 x%=n;
654 }
655}
656
657//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
658// v = GCD_(x,y) = a*x-b*y
659//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
660function eGCD_(x,y,v,a,b) {
661 var g=0;
662 var k=Math.max(x.length,y.length);
663 if (eg_u.length!=k) {
664 eg_u=new Array(k);
665 eg_A=new Array(k);
666 eg_B=new Array(k);
667 eg_C=new Array(k);
668 eg_D=new Array(k);
669 }
670 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
671 halve_(x);
672 halve_(y);
673 g++;
674 }
675 copy_(eg_u,x);
676 copy_(v,y);
677 copyInt_(eg_A,1);
678 copyInt_(eg_B,0);
679 copyInt_(eg_C,0);
680 copyInt_(eg_D,1);
681 for (;;) {
682 while(!(eg_u[0]&1)) { //while u is even
683 halve_(eg_u);
684 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
685 halve_(eg_A);
686 halve_(eg_B);
687 } else {
688 add_(eg_A,y); halve_(eg_A);
689 sub_(eg_B,x); halve_(eg_B);
690 }
691 }
692
693 while (!(v[0]&1)) { //while v is even
694 halve_(v);
695 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
696 halve_(eg_C);
697 halve_(eg_D);
698 } else {
699 add_(eg_C,y); halve_(eg_C);
700 sub_(eg_D,x); halve_(eg_D);
701 }
702 }
703
704 if (!greater(v,eg_u)) { //v<=u
705 sub_(eg_u,v);
706 sub_(eg_A,eg_C);
707 sub_(eg_B,eg_D);
708 } else { //v>u
709 sub_(v,eg_u);
710 sub_(eg_C,eg_A);
711 sub_(eg_D,eg_B);
712 }
713 if (equalsInt(eg_u,0)) {
714 if (negative(eg_C)) { //make sure a (C)is nonnegative
715 add_(eg_C,y);
716 sub_(eg_D,x);
717 }
718 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
719 copy_(a,eg_C);
720 copy_(b,eg_D);
721 leftShift_(v,g);
722 return;
723 }
724 }
725}
726
727
728//is bigInt x negative?
729function negative(x) {
730 return ((x[x.length-1]>>(bpe-1))&1);
731}
732
733
734//is (x << (shift*bpe)) > y?
735//x and y are nonnegative bigInts
736//shift is a nonnegative integer
737function greaterShift(x,y,shift) {
738 var kx=x.length, ky=y.length;
739 k=((kx+shift)<ky) ? (kx+shift) : ky;
740 for (i=ky-1-shift; i<kx && i>=0; i++)
741 if (x[i]>0)
742 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
743 for (i=kx-1+shift; i<ky; i++)
744 if (y[i]>0)
745 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
746 for (i=k-1; i>=shift; i--)
747 if (x[i-shift]>y[i]) return 1;
748 else if (x[i-shift]<y[i]) return 0;
749 return 0;
750}
751
752//is x > y? (x and y both nonnegative)
753function greater(x,y) {
754 var i;
755 var k=(x.length<y.length) ? x.length : y.length;
756
757 for (i=x.length;i<y.length;i++)
758 if (y[i])
759 return 0; //y has more digits
760
761 for (i=y.length;i<x.length;i++)
762 if (x[i])
763 return 1; //x has more digits
764
765 for (i=k-1;i>=0;i--)
766 if (x[i]>y[i])
767 return 1;
768 else if (x[i]<y[i])
769 return 0;
770 return 0;
771}
772
773//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
774//x must have at least one leading zero element.
775//y must be nonzero.
776//q and r must be arrays that are exactly the same length as x.
777//the x array must have at least as many elements as y.
778function divide_(x,y,q,r) {
779 var kx, ky;
780 var i,j,y1,y2,c,a,b;
781 copy_(r,x);
782 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
783 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
784
785 //normalize: ensure the most significant element of y has its highest bit set
786 b=y[ky-1];
787 for (a=0; b; a++)
788 b>>=1;
789 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
790 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
791 leftShift_(r,a);
792
793 copyInt_(q,0); // q=0
794 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
795 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
796 q[kx-ky]++; // q[kx-ky]++;
797 } // }
798
799 for (i=kx-1; i>=ky; i--) {
800 if (r[i]==y[ky-1])
801 q[i-ky]=mask;
802 else
803 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
804
805 //The following for(;;) loop is equivalent to the commented while loop,
806 //except that the uncommented version avoids overflow.
807 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
808 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
809 // q[i-ky]--;
810 for (;;) {
811 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
812 c=y2>>bpe;
813 y2=y2 & mask;
814 y1=c+q[i-ky]*y[ky-1];
815 c=y1>>bpe;
816 y1=y1 & mask;
817
818 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
819 q[i-ky]--;
820 else
821 break;
822 }
823
824 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
825 if (negative(r)) {
826 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
827 q[i-ky]--;
828 }
829 }
830
831 rightShift_(y,a); //undo the normalization step
832 rightShift_(r,a); //undo the normalization step
833}
834
835//do carries and borrows so each element of the bigInt x fits in bpe bits.
836function carry_(x) {
837 var i,k,c,b;
838 k=x.length;
839 c=0;
840 for (i=0;i<k;i++) {
841 c+=x[i];
842 b=0;
843 if (c<0) {
844 b=-(c>>bpe);
845 c+=b*radix;
846 }
847 x[i]=c & mask;
848 c=(c>>bpe)-b;
849 }
850}
851
852//return x mod n for bigInt x and integer n.
853function modInt(x,n) {
854 var i,c=0;
855 for (i=x.length-1; i>=0; i--)
856 c=(c*radix+x[i])%n;
857 return c;
858}
859
860//convert the integer t into a bigInt with at least the given number of bits.
861//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
862//Pad the array with leading zeros so that it has at least minSize elements.
863//There will always be at least one leading 0 element.
864function int2bigInt(t,bits,minSize) {
865 var i,k;
866 k=Math.ceil(bits/bpe)+1;
867 k=minSize>k ? minSize : k;
868 buff=new Array(k);
869 copyInt_(buff,t);
870 return buff;
871}
872
873//return the bigInt given a string representation in a given base.
874//Pad the array with leading zeros so that it has at least minSize elements.
875//If base=-1, then it reads in a space-separated list of array elements in decimal.
876//The array will always have at least one leading zero, unless base=-1.
877function str2bigInt(s,base,minSize) {
878 var d, i, j, x, y, kk;
879 var k=s.length;
880 if (base==-1) { //comma-separated list of array elements in decimal
881 x=new Array(0);
882 for (;;) {
883 y=new Array(x.length+1);
884 for (i=0;i<x.length;i++)
885 y[i+1]=x[i];
886 y[0]=parseInt(s,10);
887 x=y;
888 d=s.indexOf(',',0);
889 if (d<1)
890 break;
891 s=s.substring(d+1);
892 if (s.length==0)
893 break;
894 }
895 if (x.length<minSize) {
896 y=new Array(minSize);
897 copy_(y,x);
898 return y;
899 }
900 return x;
901 }
902
903 x=int2bigInt(0,base*k,0);
904 for (i=0;i<k;i++) {
905 d=digitsStr.indexOf(s.substring(i,i+1),0);
906 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
907 d-=26;
908 if (d<base && d>=0) { //ignore illegal characters
909 multInt_(x,base);
910 addInt_(x,d);
911 }
912 }
913
914 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
915 k=minSize>k+1 ? minSize : k+1;
916 y=new Array(k);
917 kk=k<x.length ? k : x.length;
918 for (i=0;i<kk;i++)
919 y[i]=x[i];
920 for (;i<k;i++)
921 y[i]=0;
922 return y;
923}
924
925//is bigint x equal to integer y?
926//y must have less than bpe bits
927function equalsInt(x,y) {
928 var i;
929 if (x[0]!=y)
930 return 0;
931 for (i=1;i<x.length;i++)
932 if (x[i])
933 return 0;
934 return 1;
935}
936
937//are bigints x and y equal?
938//this works even if x and y are different lengths and have arbitrarily many leading zeros
939function equals(x,y) {
940 var i;
941 var k=x.length<y.length ? x.length : y.length;
942 for (i=0;i<k;i++)
943 if (x[i]!=y[i])
944 return 0;
945 if (x.length>y.length) {
946 for (;i<x.length;i++)
947 if (x[i])
948 return 0;
949 } else {
950 for (;i<y.length;i++)
951 if (y[i])
952 return 0;
953 }
954 return 1;
955}
956
957//is the bigInt x equal to zero?
958function isZero(x) {
959 var i;
960 for (i=0;i<x.length;i++)
961 if (x[i])
962 return 0;
963 return 1;
964}
965
966//convert a bigInt into a string in a given base, from base 2 up to base 95.
967//Base -1 prints the contents of the array representing the number.
968function bigInt2str(x,base) {
969 var i,t,s="";
970
971 if (s6.length!=x.length)
972 s6=dup(x);
973 else
974 copy_(s6,x);
975
976 if (base==-1) { //return the list of array contents
977 for (i=x.length-1;i>0;i--)
978 s+=x[i]+',';
979 s+=x[0];
980 }
981 else { //return it in the given base
982 while (!isZero(s6)) {
983 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
984 s=digitsStr.substring(t,t+1)+s;
985 }
986 }
987 if (s.length==0)
988 s="0";
989 return s;
990}
991
992//returns a duplicate of bigInt x
993function dup(x) {
994 var i;
995 buff=new Array(x.length);
996 copy_(buff,x);
997 return buff;
998}
999
1000//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1001function copy_(x,y) {
1002 var i;
1003 var k=x.length<y.length ? x.length : y.length;
1004 for (i=0;i<k;i++)
1005 x[i]=y[i];
1006 for (i=k;i<x.length;i++)
1007 x[i]=0;
1008}
1009
1010//do x=y on bigInt x and integer y.
1011function copyInt_(x,n) {
1012 var i,c;
1013 for (c=n,i=0;i<x.length;i++) {
1014 x[i]=c & mask;
1015 c>>=bpe;
1016 }
1017}
1018
1019//do x=x+n where x is a bigInt and n is an integer.
1020//x must be large enough to hold the result.
1021function addInt_(x,n) {
1022 var i,k,c,b;
1023 x[0]+=n;
1024 k=x.length;
1025 c=0;
1026 for (i=0;i<k;i++) {
1027 c+=x[i];
1028 b=0;
1029 if (c<0) {
1030 b=-(c>>bpe);
1031 c+=b*radix;
1032 }
1033 x[i]=c & mask;
1034 c=(c>>bpe)-b;
1035 if (!c) return; //stop carrying as soon as the carry_ is zero
1036 }
1037}
1038
1039//right shift bigInt x by n bits. 0 <= n < bpe.
1040function rightShift_(x,n) {
1041 var i;
1042 var k=Math.floor(n/bpe);
1043 if (k) {
1044 for (i=0;i<x.length-k;i++) //right shift x by k elements
1045 x[i]=x[i+k];
1046 for (;i<x.length;i++)
1047 x[i]=0;
1048 n%=bpe;
1049 }
1050 for (i=0;i<x.length-1;i++) {
1051 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1052 }
1053 x[i]>>=n;
1054}
1055
1056//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1057function halve_(x) {
1058 var i;
1059 for (i=0;i<x.length-1;i++) {
1060 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1061 }
1062 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1063}
1064
1065//left shift bigInt x by n bits.
1066function leftShift_(x,n) {
1067 var i;
1068 var k=Math.floor(n/bpe);
1069 if (k) {
1070 for (i=x.length; i>=k; i--) //left shift x by k elements
1071 x[i]=x[i-k];
1072 for (;i>=0;i--)
1073 x[i]=0;
1074 n%=bpe;
1075 }
1076 if (!n)
1077 return;
1078 for (i=x.length-1;i>0;i--) {
1079 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1080 }
1081 x[i]=mask & (x[i]<<n);
1082}
1083
1084//do x=x*n where x is a bigInt and n is an integer.
1085//x must be large enough to hold the result.
1086function multInt_(x,n) {
1087 var i,k,c,b;
1088 if (!n)
1089 return;
1090 k=x.length;
1091 c=0;
1092 for (i=0;i<k;i++) {
1093 c+=x[i]*n;
1094 b=0;
1095 if (c<0) {
1096 b=-(c>>bpe);
1097 c+=b*radix;
1098 }
1099 x[i]=c & mask;
1100 c=(c>>bpe)-b;
1101 }
1102}
1103
1104//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1105function divInt_(x,n) {
1106 var i,r=0,s;
1107 for (i=x.length-1;i>=0;i--) {
1108 s=r*radix+x[i];
1109 x[i]=Math.floor(s/n);
1110 r=s%n;
1111 }
1112 return r;
1113}
1114
1115//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1116//x must be large enough to hold the answer.
1117function linComb_(x,y,a,b) {
1118 var i,c,k,kk;
1119 k=x.length<y.length ? x.length : y.length;
1120 kk=x.length;
1121 for (c=0,i=0;i<k;i++) {
1122 c+=a*x[i]+b*y[i];
1123 x[i]=c & mask;
1124 c>>=bpe;
1125 }
1126 for (i=k;i<kk;i++) {
1127 c+=a*x[i];
1128 x[i]=c & mask;
1129 c>>=bpe;
1130 }
1131}
1132
1133//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1134//x must be large enough to hold the answer.
1135function linCombShift_(x,y,b,ys) {
1136 var i,c,k,kk;
1137 k=x.length<ys+y.length ? x.length : ys+y.length;
1138 kk=x.length;
1139 for (c=0,i=ys;i<k;i++) {
1140 c+=x[i]+b*y[i-ys];
1141 x[i]=c & mask;
1142 c>>=bpe;
1143 }
1144 for (i=k;c && i<kk;i++) {
1145 c+=x[i];
1146 x[i]=c & mask;
1147 c>>=bpe;
1148 }
1149}
1150
1151//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1152//x must be large enough to hold the answer.
1153function addShift_(x,y,ys) {
1154 var i,c,k,kk;
1155 k=x.length<ys+y.length ? x.length : ys+y.length;
1156 kk=x.length;
1157 for (c=0,i=ys;i<k;i++) {
1158 c+=x[i]+y[i-ys];
1159 x[i]=c & mask;
1160 c>>=bpe;
1161 }
1162 for (i=k;c && i<kk;i++) {
1163 c+=x[i];
1164 x[i]=c & mask;
1165 c>>=bpe;
1166 }
1167}
1168
1169//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1170//x must be large enough to hold the answer.
1171function subShift_(x,y,ys) {
1172 var i,c,k,kk;
1173 k=x.length<ys+y.length ? x.length : ys+y.length;
1174 kk=x.length;
1175 for (c=0,i=ys;i<k;i++) {
1176 c+=x[i]-y[i-ys];
1177 x[i]=c & mask;
1178 c>>=bpe;
1179 }
1180 for (i=k;c && i<kk;i++) {
1181 c+=x[i];
1182 x[i]=c & mask;
1183 c>>=bpe;
1184 }
1185}
1186
1187//do x=x-y for bigInts x and y.
1188//x must be large enough to hold the answer.
1189//negative answers will be 2s complement
1190function sub_(x,y) {
1191 var i,c,k,kk;
1192 k=x.length<y.length ? x.length : y.length;
1193 for (c=0,i=0;i<k;i++) {
1194 c+=x[i]-y[i];
1195 x[i]=c & mask;
1196 c>>=bpe;
1197 }
1198 for (i=k;c && i<x.length;i++) {
1199 c+=x[i];
1200 x[i]=c & mask;
1201 c>>=bpe;
1202 }
1203}
1204
1205//do x=x+y for bigInts x and y.
1206//x must be large enough to hold the answer.
1207function add_(x,y) {
1208 var i,c,k,kk;
1209 k=x.length<y.length ? x.length : y.length;
1210 for (c=0,i=0;i<k;i++) {
1211 c+=x[i]+y[i];
1212 x[i]=c & mask;
1213 c>>=bpe;
1214 }
1215 for (i=k;c && i<x.length;i++) {
1216 c+=x[i];
1217 x[i]=c & mask;
1218 c>>=bpe;
1219 }
1220}
1221
1222//do x=x*y for bigInts x and y. This is faster when y<x.
1223function mult_(x,y) {
1224 var i;
1225 if (ss.length!=2*x.length)
1226 ss=new Array(2*x.length);
1227 copyInt_(ss,0);
1228 for (i=0;i<y.length;i++)
1229 if (y[i])
1230 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1231 copy_(x,ss);
1232}
1233
1234//do x=x mod n for bigInts x and n.
1235function mod_(x,n) {
1236 if (s4.length!=x.length)
1237 s4=dup(x);
1238 else
1239 copy_(s4,x);
1240 if (s5.length!=x.length)
1241 s5=dup(x);
1242 divide_(s4,n,s5,x); //x = remainder of s4 / n
1243}
1244
1245//do x=x*y mod n for bigInts x,y,n.
1246//for greater speed, let y<x.
1247function multMod_(x,y,n) {
1248 var i;
1249 if (s0.length!=2*x.length)
1250 s0=new Array(2*x.length);
1251 copyInt_(s0,0);
1252 for (i=0;i<y.length;i++)
1253 if (y[i])
1254 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1255 mod_(s0,n);
1256 copy_(x,s0);
1257}
1258
1259//do x=x*x mod n for bigInts x,n.
1260function squareMod_(x,n) {
1261 var i,j,d,c,kx,kn,k;
1262 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1263 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1264 if (s0.length!=k)
1265 s0=new Array(k);
1266 copyInt_(s0,0);
1267 for (i=0;i<kx;i++) {
1268 c=s0[2*i]+x[i]*x[i];
1269 s0[2*i]=c & mask;
1270 c>>=bpe;
1271 for (j=i+1;j<kx;j++) {
1272 c=s0[i+j]+2*x[i]*x[j]+c;
1273 s0[i+j]=(c & mask);
1274 c>>=bpe;
1275 }
1276 s0[i+kx]=c;
1277 }
1278 mod_(s0,n);
1279 copy_(x,s0);
1280}
1281
1282//return x with exactly k leading zero elements
1283function trim(x,k) {
1284 var i,y;
1285 for (i=x.length; i>0 && !x[i-1]; i--);
1286 y=new Array(i+k);
1287 copy_(y,x);
1288 return y;
1289}
1290
1291//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1292//this is faster when n is odd. x usually needs to have as many elements as n.
1293function powMod_(x,y,n) {
1294 var k1,k2,kn,np;
1295 if(s7.length!=n.length)
1296 s7=dup(n);
1297
1298 //for even modulus, use a simple square-and-multiply algorithm,
1299 //rather than using the more complex Montgomery algorithm.
1300 if ((n[0]&1)==0) {
1301 copy_(s7,x);
1302 copyInt_(x,1);
1303 while(!equalsInt(y,0)) {
1304 if (y[0]&1)
1305 multMod_(x,s7,n);
1306 divInt_(y,2);
1307 squareMod_(s7,n);
1308 }
1309 return;
1310 }
1311
1312 //calculate np from n for the Montgomery multiplications
1313 copyInt_(s7,0);
1314 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1315 np=radix-inverseModInt_(modInt(n,radix),radix);
1316 s7[kn]=1;
1317 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1318
1319 if (s3.length!=x.length)
1320 s3=dup(x);
1321 else
1322 copy_(s3,x);
1323
1324 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1325 if (y[k1]==0) { //anything to the 0th power is 1
1326 copyInt_(x,1);
1327 return;
1328 }
1329 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1330 for (;;) {
1331 if (!(k2>>=1)) { //look at next bit of y
1332 k1--;
1333 if (k1<0) {
1334 mont_(x,one,n,np);
1335 return;
1336 }
1337 k2=1<<(bpe-1);
1338 }
1339 mont_(x,x,n,np);
1340
1341 if (k2 & y[k1]) //if next bit is a 1
1342 mont_(x,s3,n,np);
1343 }
1344}
1345
1346//do x=x*y*Ri mod n for bigInts x,y,n,
1347// where Ri = 2**(-kn*bpe) mod n, and kn is the
1348// number of elements in the n array, not
1349// counting leading zeros.
1350//x must be large enough to hold the answer.
1351//It's OK if x and y are the same variable.
1352//must have:
1353// x,y < n
1354// n is odd
1355// np = -(n^(-1)) mod radix
1356function mont_(x,y,n,np) {
1357 var i,j,c,ui,t;
1358 var kn=n.length;
1359 var ky=y.length;
1360
1361 if (sa.length!=kn)
1362 sa=new Array(kn);
1363
1364 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1365 //this function sometimes gives wrong answers when the next line is uncommented
1366 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1367
1368 copyInt_(sa,0);
1369
1370 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1371 for (i=0; i<kn; i++) {
1372 t=sa[0]+x[i]*y[0];
1373 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1374 c=(t+ui*n[0]) >> bpe;
1375 t=x[i];
1376
1377 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1378 for (j=1;j<ky;j++) {
1379 c+=sa[j]+t*y[j]+ui*n[j];
1380 sa[j-1]=c & mask;
1381 c>>=bpe;
1382 }
1383 for (;j<kn;j++) {
1384 c+=sa[j]+ui*n[j];
1385 sa[j-1]=c & mask;
1386 c>>=bpe;
1387 }
1388 sa[j-1]=c & mask;
1389 }
1390
1391 if (!greater(n,sa))
1392 sub_(sa,n);
1393 copy_(x,sa);
1394}
1395
1396
1397
1398
1399//#############################################################################
1400//#############################################################################
1401//#############################################################################
1402//#############################################################################
1403//#############################################################################
1404//#############################################################################
1405//#############################################################################
1406
1407
1408
1409
1410
1411//#############################################################################
1412
1413Clipperz.Crypto.BigInt = function (aValue, aBase) {
1414 varbase;
1415 varvalue;
1416
1417 if (typeof(aValue) == 'object') {
1418 this._internalValue = aValue;
1419 } else {
1420 if (typeof(aValue) == 'undefined') {
1421 value = "0";
1422 } else {
1423 value = aValue + "";
1424 }
1425
1426 if (typeof(aBase) == 'undefined') {
1427 base = 10;
1428 } else {
1429 base = aBase;
1430 }
1431
1432 this._internalValue = str2bigInt(value, base, 1, 1);
1433 }
1434
1435 return this;
1436}
1437
1438//=============================================================================
1439
1440MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1441
1442 'clone': function() {
1443 return new Clipperz.Crypto.BigInt(this.internalValue());
1444 },
1445
1446 //-------------------------------------------------------------------------
1447
1448 'internalValue': function () {
1449 return this._internalValue;
1450 },
1451
1452 //-------------------------------------------------------------------------
1453
1454 'isBigInt': true,
1455
1456 //-------------------------------------------------------------------------
1457
1458 'toString': function(aBase) {
1459 return this.asString(aBase);
1460 },
1461
1462 //-------------------------------------------------------------------------
1463
1464 'asString': function (aBase, minimumLength) {
1465 varresult;
1466 varbase;
1467
1468 if (typeof(aBase) == 'undefined') {
1469 base = 10;
1470 } else {
1471 base = aBase;
1472 }
1473
1474 result = bigInt2str(this.internalValue(), base).toLowerCase();
1475
1476 if ((typeof(minimumLength) != 'undefined') && (result.length < minimumLength)) {
1477 var i, c;
1478 c = (minimumLength - result.length);
1479 for (i=0; i<c; i++) {
1480 result = '0' + result;
1481 }
1482 }
1483
1484 return result;
1485 },
1486
1487 //-------------------------------------------------------------------------
1488
1489 'asByteArray': function() {
1490 return new Clipperz.ByteArray("0x" + this.asString(16), 16);
1491 },
1492
1493 //-------------------------------------------------------------------------
1494
1495 'equals': function (aValue) {
1496 var result;
1497
1498 if (aValue.isBigInt) {
1499 result = equals(this.internalValue(), aValue.internalValue());
1500 } else if (typeof(aValue) == "number") {
1501 result = equalsInt(this.internalValue(), aValue);
1502 } else {
1503 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1504 }
1505
1506 return result;
1507 },
1508
1509 //-------------------------------------------------------------------------
1510
1511 'compare': function(aValue) {
1512/*
1513 var result;
1514 var thisAsString;
1515 var aValueAsString;
1516
1517 thisAsString = this.asString(10);
1518 aValueAsString = aValue.asString(10);
1519
1520 result = MochiKit.Base.compare(thisAsString.length, aValueAsString.length);
1521 if (result == 0) {
1522 result = MochiKit.Base.compare(thisAsString, aValueAsString);
1523 }
1524
1525 return result;
1526*/
1527 var result;
1528
1529 if (equals(this.internalValue(), aValue.internalValue())) {
1530 result = 0;
1531 } else if (greater(this.internalValue(), aValue.internalValue())) {
1532 result = 1;
1533 } else {
1534 result = -1;
1535 }
1536
1537 return result;
1538 },
1539
1540 //-------------------------------------------------------------------------
1541
1542 'add': function (aValue) {
1543 var result;
1544
1545 if (aValue.isBigInt) {
1546 result = add(this.internalValue(), aValue.internalValue());
1547 } else {
1548 result = addInt(this.internalValue(), aValue);
1549 }
1550
1551 return new Clipperz.Crypto.BigInt(result);
1552 },
1553
1554 //-------------------------------------------------------------------------
1555
1556 'subtract': function (aValue) {
1557 var result;
1558 var value;
1559
1560 if (aValue.isBigInt) {
1561 value = aValue;
1562 } else {
1563 value = new Clipperz.Crypto.BigInt(aValue);
1564 }
1565
1566 result = sub(this.internalValue(), value.internalValue());
1567
1568 return new Clipperz.Crypto.BigInt(result);
1569 },
1570
1571 //-------------------------------------------------------------------------
1572
1573 'multiply': function (aValue, aModule) {
1574 var result;
1575 var value;
1576
1577 if (aValue.isBigInt) {
1578 value = aValue;
1579 } else {
1580 value = new Clipperz.Crypto.BigInt(aValue);
1581 }
1582
1583 if (typeof(aModule) == 'undefined') {
1584 result = mult(this.internalValue(), value.internalValue());
1585 } else {
1586 if (greater(this.internalValue(), value.internalValue())) {
1587 result = multMod(this.internalValue(), value.internalValue(), aModule);
1588 } else {
1589 result = multMod(value.internalValue(), this.internalValue(), aModule);
1590 }
1591 }
1592
1593 return new Clipperz.Crypto.BigInt(result);
1594 },
1595
1596 //-------------------------------------------------------------------------
1597
1598 'module': function (aModule) {
1599 varresult;
1600 var module;
1601
1602 if (aModule.isBigInt) {
1603 module = aModule;
1604 } else {
1605 module = new Clipperz.Crypto.BigInt(aModule);
1606 }
1607
1608 result = mod(this.internalValue(), module.internalValue());
1609
1610 return new Clipperz.Crypto.BigInt(result);
1611 },
1612
1613 //-------------------------------------------------------------------------
1614
1615 'powerModule': function(aValue, aModule) {
1616 varresult;
1617 varvalue;
1618 var module;
1619
1620 if (aValue.isBigInt) {
1621 value = aValue;
1622 } else {
1623 value = new Clipperz.Crypto.BigInt(aValue);
1624 }
1625
1626 if (aModule.isBigInt) {
1627 module = aModule;
1628 } else {
1629 module = new Clipperz.Crypto.BigInt(aModule);
1630 }
1631
1632 if (aValue == -1) {
1633 result = inverseMod(this.internalValue(), module.internalValue());
1634 } else {
1635 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1636 }
1637
1638 return new Clipperz.Crypto.BigInt(result);
1639 },
1640
1641 //-------------------------------------------------------------------------
1642
1643 'xor': function(aValue) {
1644 var result;
1645 varthisByteArray;
1646 var aValueByteArray;
1647 var xorArray;
1648
1649 thisByteArray = new Clipperz.ByteArray("0x" + this.asString(16), 16);
1650 aValueByteArray = new Clipperz.ByteArray("0x" + aValue.asString(16), 16);
1651 xorArray = thisByteArray.xorMergeWithBlock(aValueByteArray, 'right');
1652 result = new Clipperz.Crypto.BigInt(xorArray.toHexString(), 16);
1653
1654 return result;
1655 },
1656
1657 //-------------------------------------------------------------------------
1658
1659 'shiftLeft': function(aNumberOfBitsToShift) {
1660 var result;
1661 var internalResult;
1662 var wholeByteToShift;
1663 var bitsLeftToShift;
1664
1665 wholeByteToShift = Math.floor(aNumberOfBitsToShift / 8);
1666 bitsLeftToShift = aNumberOfBitsToShift % 8;
1667
1668 if (wholeByteToShift == 0) {
1669 internalResult = this.internalValue();
1670 } else {
1671 var hexValue;
1672 var i,c;
1673
1674 hexValue = this.asString(16);
1675 c = wholeByteToShift;
1676 for (i=0; i<c; i++) {
1677 hexValue += "00";
1678 }
1679 internalResult = str2bigInt(hexValue, 16, 1, 1);
1680 }
1681
1682 if (bitsLeftToShift > 0) {
1683 leftShift_(internalResult, bitsLeftToShift);
1684 }
1685 result = new Clipperz.Crypto.BigInt(internalResult);
1686
1687 return result;
1688 },
1689
1690 //-------------------------------------------------------------------------
1691
1692 'bitSize': function() {
1693 return bitSize(this.internalValue());
1694 },
1695
1696 //-------------------------------------------------------------------------
1697
1698 'isBitSet': function(aBitPosition) {
1699 var result;
1700
1701 if (this.asByteArray().bitAtIndex(aBitPosition) == 0) {
1702 result = false;
1703 } else {
1704 result = true;
1705 };
1706
1707 return result;
1708 },
1709
1710 //-------------------------------------------------------------------------
1711 __syntaxFix__: "syntax fix"
1712
1713});
1714
1715//#############################################################################
1716
1717Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1718 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1719}
1720
1721//#############################################################################
1722//#############################################################################
1723
1724Clipperz.Crypto.BigInt.ZERO = new Clipperz.Crypto.BigInt(0);
1725
1726//#############################################################################
1727
1728Clipperz.Crypto.BigInt.equals = function(a, b) {
1729 return a.equals(b);
1730}
1731
1732Clipperz.Crypto.BigInt.add = function(a, b) {
1733 return a.add(b);
1734}
1735
1736Clipperz.Crypto.BigInt.subtract = function(a, b) {
1737 return a.subtract(b);
1738}
1739
1740Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1741 return a.multiply(b, module);
1742}
1743
1744Clipperz.Crypto.BigInt.module = function(a, module) {
1745 return a.module(module);
1746}
1747
1748Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1749 return a.powerModule(b, module);
1750}
1751
1752Clipperz.Crypto.BigInt.exception = {
1753 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1754}
diff --git a/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js b/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js
new file mode 100644
index 0000000..bc60330
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/BigInt_scoped.js
@@ -0,0 +1,1644 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
26
27if (typeof(Leemon) == 'undefined') { Leemon = {}; }
28if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; }
29if (typeof(Baird.Crypto.BigInt) == 'undefined') { Baird.Crypto.BigInt = {}; }
30
31
32//#############################################################################
33 //Downloaded on March 05, 2007 from http://www.leemon.com/crypto/BigInt.js
34//#############################################################################
35
36////////////////////////////////////////////////////////////////////////////////////////
37// Big Integer Library v. 5.0
38// Created 2000, last modified 2006
39// Leemon Baird
40// www.leemon.com
41//
42// This file is public domain. You can use it for any purpose without restriction.
43// I do not guarantee that it is correct, so use it at your own risk. If you use
44// it for something interesting, I'd appreciate hearing about it. If you find
45// any bugs or make any improvements, I'd appreciate hearing about those too.
46// It would also be nice if my name and address were left in the comments.
47// But none of that is required.
48//
49// This code defines a bigInt library for arbitrary-precision integers.
50// A bigInt is an array of integers storing the value in chunks of bpe bits,
51// little endian (buff[0] is the least significant word).
52// Negative bigInts are stored two's complement.
53// Some functions assume their parameters have at least one leading zero element.
54// Functions with an underscore at the end of the name have unpredictable behavior in case of overflow,
55// so the caller must make sure overflow won't happen.
56// For each function where a parameter is modified, that same
57// variable must not be used as another argument too.
58// So, you cannot square x by doing multMod_(x,x,n).
59// You must use squareMod_(x,n) instead, or do y=dup(x); multMod_(x,y,n).
60//
61// These functions are designed to avoid frequent dynamic memory allocation in the inner loop.
62// For most functions, if it needs a BigInt as a local variable it will actually use
63// a global, and will only allocate to it when it's not the right size. This ensures
64// that when a function is called repeatedly with same-sized parameters, it only allocates
65// memory on the first call.
66//
67// Note that for cryptographic purposes, the calls to Math.random() must
68// be replaced with calls to a better pseudorandom number generator.
69//
70// In the following, "bigInt" means a bigInt with at least one leading zero element,
71// and "integer" means a nonnegative integer less than radix. In some cases, integer
72// can be negative. Negative bigInts are 2s complement.
73//
74// The following functions do not modify their inputs, but dynamically allocate memory every time they are called:
75//
76// function bigInt2str(x,base) //convert a bigInt into a string in a given base, from base 2 up to base 95
77// function dup(x) //returns a copy of bigInt x
78// function findPrimes(n) //return array of all primes less than integer n
79// function int2bigInt(t,n,m) //convert integer t to a bigInt with at least n bits and m array elements
80// function str2bigInt(s,b,n,m) //convert string s in base b to a bigInt with at least n bits and m array elements
81// function trim(x,k) //return a copy of x with exactly k leading zero elements
82//
83// The following functions do not modify their inputs, so there is never a problem with the result being too big:
84//
85// function bitSize(x) //returns how many bits long the bigInt x is, not counting leading zeros
86// function equals(x,y) //is the bigInt x equal to the bigint y?
87// function equalsInt(x,y) //is bigint x equal to integer y?
88// function greater(x,y) //is x>y? (x and y are nonnegative bigInts)
89// function greaterShift(x,y,shift)//is (x <<(shift*bpe)) > y?
90// function isZero(x) //is the bigInt x equal to zero?
91// function millerRabin(x,b) //does one round of Miller-Rabin base integer b say that bigInt x is possibly prime (as opposed to definitely composite)?
92// function modInt(x,n) //return x mod n for bigInt x and integer n.
93// function negative(x) //is bigInt x negative?
94//
95// The following functions do not modify their inputs, but allocate memory and call functions with underscores
96//
97// function add(x,y) //return (x+y) for bigInts x and y.
98// function addInt(x,n) //return (x+n) where x is a bigInt and n is an integer.
99// function expand(x,n) //return a copy of x with at least n elements, adding leading zeros if needed
100// function inverseMod(x,n) //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
101// function mod(x,n) //return a new bigInt equal to (x mod n) for bigInts x and n.
102// function mult(x,y) //return x*y for bigInts x and y. This is faster when y<x.
103// function multMod(x,y,n) //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
104// function powMod(x,y,n) //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
105// function randTruePrime(k) //return a new, random, k-bit, true prime using Maurer's algorithm.
106// function sub(x,y) //return (x-y) for bigInts x and y. Negative answers will be 2s complement
107//
108// The following functions write a bigInt result to one of the parameters, but
109// the result is never bigger than the original, so there can't be overflow problems:
110//
111// function divInt_(x,n) //do x=floor(x/n) for bigInt x and integer n, and return the remainder
112// function GCD_(x,y) //set x to the greatest common divisor of bigInts x and y, (y is destroyed).
113// function halve_(x) //do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
114// function mod_(x,n) //do x=x mod n for bigInts x and n.
115// function rightShift_(x,n) //right shift bigInt x by n bits. 0 <= n < bpe.
116//
117// The following functions write a bigInt result to one of the parameters. The caller is responsible for
118// ensuring it is large enough to hold the result.
119//
120// function addInt_(x,n) //do x=x+n where x is a bigInt and n is an integer
121// function add_(x,y) //do x=x+y for bigInts x and y
122// function addShift_(x,y,ys) //do x=x+(y<<(ys*bpe))
123// function copy_(x,y) //do x=y on bigInts x and y
124// function copyInt_(x,n) //do x=n on bigInt x and integer n
125// function carry_(x) //do carries and borrows so each element of the bigInt x fits in bpe bits.
126// function divide_(x,y,q,r) //divide_ x by y giving quotient q and remainder r
127// function eGCD_(x,y,d,a,b) //sets a,b,d to positive big integers such that d = GCD_(x,y) = a*x-b*y
128// function inverseMod_(x,n) //do x=x**(-1) mod n, for bigInts x and n. Returns 1 (0) if inverse does (doesn't) exist
129// function inverseModInt_(x,n) //return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
130// function leftShift_(x,n) //left shift bigInt x by n bits. n<bpe.
131// function linComb_(x,y,a,b) //do x=a*x+b*y for bigInts x and y and integers a and b
132// function linCombShift_(x,y,b,ys) //do x=x+b*(y<<(ys*bpe)) for bigInts x and y, and integers b and ys
133// function mont_(x,y,n,np) //Montgomery multiplication (see comments where the function is defined)
134// function mult_(x,y) //do x=x*y for bigInts x and y.
135// function multInt_(x,n) //do x=x*n where x is a bigInt and n is an integer.
136// function multMod_(x,y,n) //do x=x*y mod n for bigInts x,y,n.
137// function powMod_(x,y,n) //do x=x**y mod n, where x,y,n are bigInts (n is odd) and ** is exponentiation. 0**0=1.
138// function randBigInt_(b,n,s) //do b = an n-bit random BigInt. if s=1, then nth bit (most significant bit) is set to 1. n>=1.
139// function randTruePrime_(ans,k) //do ans = a random k-bit true random prime (not just probable prime) with 1 in the msb.
140// function squareMod_(x,n) //do x=x*x mod n for bigInts x,n
141// function sub_(x,y) //do x=x-y for bigInts x and y. Negative answers will be 2s complement.
142// function subShift_(x,y,ys) //do x=x-(y<<(ys*bpe)). Negative answers will be 2s complement.
143//
144// The following functions are based on algorithms from the _Handbook of Applied Cryptography_
145// powMod_() = algorithm 14.94, Montgomery exponentiation
146// eGCD_,inverseMod_() = algorithm 14.61, Binary extended GCD_
147// GCD_() = algorothm 14.57, Lehmer's algorithm
148// mont_() = algorithm 14.36, Montgomery multiplication
149// divide_() = algorithm 14.20 Multiple-precision division
150// squareMod_() = algorithm 14.16 Multiple-precision squaring
151// randTruePrime_() = algorithm 4.62, Maurer's algorithm
152// millerRabin() = algorithm 4.24, Miller-Rabin algorithm
153//
154// Profiling shows:
155// randTruePrime_() spends:
156// 10% of its time in calls to powMod_()
157// 85% of its time in calls to millerRabin()
158// millerRabin() spends:
159// 99% of its time in calls to powMod_() (always with a base of 2)
160// powMod_() spends:
161// 94% of its time in calls to mont_() (almost always with x==y)
162//
163// This suggests there are several ways to speed up this library slightly:
164// - convert powMod_ to use a Montgomery form of k-ary window (or maybe a Montgomery form of sliding window)
165// -- this should especially focus on being fast when raising 2 to a power mod n
166// - convert randTruePrime_() to use a minimum r of 1/3 instead of 1/2 with the appropriate change to the test
167// - tune the parameters in randTruePrime_(), including c, m, and recLimit
168// - speed up the single loop in mont_() that takes 95% of the runtime, perhaps by reducing checking
169// within the loop when all the parameters are the same length.
170//
171// There are several ideas that look like they wouldn't help much at all:
172// - replacing trial division in randTruePrime_() with a sieve (that speeds up something taking almost no time anyway)
173// - increase bpe from 15 to 30 (that would help if we had a 32*32->64 multiplier, but not with JavaScript's 32*32->32)
174// - speeding up mont_(x,y,n,np) when x==y by doing a non-modular, non-Montgomery square
175// followed by a Montgomery reduction. The intermediate answer will be twice as long as x, so that
176// method would be slower. This is unfortunate because the code currently spends almost all of its time
177// doing mont_(x,x,...), both for randTruePrime_() and powMod_(). A faster method for Montgomery squaring
178// would have a large impact on the speed of randTruePrime_() and powMod_(). HAC has a couple of poorly-worded
179// sentences that seem to imply it's faster to do a non-modular square followed by a single
180// Montgomery reduction, but that's obviously wrong.
181////////////////////////////////////////////////////////////////////////////////////////
182
183//
184 //The whole library has been moved into the Baird.Crypto.BigInt scope by Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
185//
186Baird.Crypto.BigInt.VERSION = "5.0";
187Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt";
188
189MochiKit.Base.update(Baird.Crypto.BigInt, {
190 //globals
191 'bpe': 0, //bits stored per array element
192 'mask': 0, //AND this with an array element to chop it down to bpe bits
193 'radix': Baird.Crypto.BigInt.mask + 1,//equals 2^bpe. A single 1 bit to the left of the last bit of mask.
194
195 //the digits for converting to different bases
196 'digitsStr': '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-',
197
198//initialize the global variables
199for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
200bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
201mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
202radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask
203one=int2bigInt(1,1,1); //constant used in powMod_()
204
205//the following global variables are scratchpad memory to
206//reduce dynamic memory allocation in the inner loop
207t=new Array(0);
208ss=t; //used in mult_()
209s0=t; //used in multMod_(), squareMod_()
210s1=t; //used in powMod_(), multMod_(), squareMod_()
211s2=t; //used in powMod_(), multMod_()
212s3=t; //used in powMod_()
213s4=t; s5=t; //used in mod_()
214s6=t; //used in bigInt2str()
215s7=t; //used in powMod_()
216T=t; //used in GCD_()
217sa=t; //used in mont_()
218mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin()
219eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_()
220md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_()
221
222primes=t; pows=t; s_i=t; s_i2=t; s_R=t; s_rm=t; s_q=t; s_n1=t;
223 s_a=t; s_r2=t; s_n=t; s_b=t; s_d=t; s_x1=t; s_x2=t, s_aa=t; //used in randTruePrime_()
224
225////////////////////////////////////////////////////////////////////////////////////////
226
227 //return array of all primes less than integer n
228 'findPrimes': function(n) {
229 var i,s,p,ans;
230 s=new Array(n);
231 for (i=0;i<n;i++)
232 s[i]=0;
233 s[0]=2;
234 p=0; //first p elements of s are primes, the rest are a sieve
235 for(;s[p]<n;) { //s[p] is the pth prime
236 for(i=s[p]*s[p]; i<n; i+=s[p]) //mark multiples of s[p]
237 s[i]=1;
238 p++;
239 s[p]=s[p-1]+1;
240 for(; s[p]<n && s[s[p]]; s[p]++); //find next prime (where s[p]==0)
241 }
242 ans=new Array(p);
243 for(i=0;i<p;i++)
244 ans[i]=s[i];
245 return ans;
246 },
247
248 //does a single round of Miller-Rabin base b consider x to be a possible prime?
249 //x is a bigInt, and b is an integer
250 'millerRabin': function(x,b) {
251 var i,j,k,s;
252
253 if (mr_x1.length!=x.length) {
254 mr_x1=dup(x);
255 mr_r=dup(x);
256 mr_a=dup(x);
257 }
258
259 copyInt_(mr_a,b);
260 copy_(mr_r,x);
261 copy_(mr_x1,x);
262
263 addInt_(mr_r,-1);
264 addInt_(mr_x1,-1);
265
266 //s=the highest power of two that divides mr_r
267 k=0;
268 for (i=0;i<mr_r.length;i++)
269 for (j=1;j<mask;j<<=1)
270 if (x[i] & j) {
271 s=(k<mr_r.length+bpe ? k : 0);
272 i=mr_r.length;
273 j=mask;
274 } else
275 k++;
276
277 if (s)
278 rightShift_(mr_r,s);
279
280 powMod_(mr_a,mr_r,x);
281
282 if (!equalsInt(mr_a,1) && !equals(mr_a,mr_x1)) {
283 j=1;
284 while (j<=s-1 && !equals(mr_a,mr_x1)) {
285 squareMod_(mr_a,x);
286 if (equalsInt(mr_a,1)) {
287 return 0;
288 }
289 j++;
290 }
291 if (!equals(mr_a,mr_x1)) {
292 return 0;
293 }
294 }
295
296 return 1;
297 },
298
299 //returns how many bits long the bigInt is, not counting leading zeros.
300 'bitSize': function(x) {
301 var j,z,w;
302 for (j=x.length-1; (x[j]==0) && (j>0); j--);
303 for (z=0,w=x[j]; w; (w>>=1),z++);
304 z+=bpe*j;
305 return z;
306 },
307
308 //return a copy of x with at least n elements, adding leading zeros if needed
309 'expand': function(x,n) {
310 var ans=int2bigInt(0,(x.length>n ? x.length : n)*bpe,0);
311 copy_(ans,x);
312 return ans;
313 },
314
315 //return a k-bit true random prime using Maurer's algorithm.
316 'randTruePrime': function(k) {
317 var ans=int2bigInt(0,k,0);
318 randTruePrime_(ans,k);
319 return trim(ans,1);
320 },
321
322 //return a new bigInt equal to (x mod n) for bigInts x and n.
323 'mod': function(x,n) {
324 var ans=dup(x);
325 mod_(ans,n);
326 return trim(ans,1);
327 },
328
329 //return (x+n) where x is a bigInt and n is an integer.
330 'addInt': function(x,n) {
331 var ans=expand(x,x.length+1);
332 addInt_(ans,n);
333 return trim(ans,1);
334 },
335
336 //return x*y for bigInts x and y. This is faster when y<x.
337 'mult': function(x,y) {
338 var ans=expand(x,x.length+y.length);
339 mult_(ans,y);
340 return trim(ans,1);
341 },
342
343 //return (x**y mod n) where x,y,n are bigInts and ** is exponentiation. 0**0=1. Faster for odd n.
344 'powMod': function(x,y,n) {
345 var ans=expand(x,n.length);
346 powMod_(ans,trim(y,2),trim(n,2),0); //this should work without the trim, but doesn't
347 return trim(ans,1);
348 },
349
350 //return (x-y) for bigInts x and y. Negative answers will be 2s complement
351 'sub': function(x,y) {
352 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
353 sub_(ans,y);
354 return trim(ans,1);
355 },
356
357 //return (x+y) for bigInts x and y.
358 'add': function(x,y) {
359 var ans=expand(x,(x.length>y.length ? x.length+1 : y.length+1));
360 add_(ans,y);
361 return trim(ans,1);
362 },
363
364 //return (x**(-1) mod n) for bigInts x and n. If no inverse exists, it returns null
365 'inverseMod': function(x,n) {
366 var ans=expand(x,n.length);
367 var s;
368 s=inverseMod_(ans,n);
369 return s ? trim(ans,1) : null;
370 },
371
372 //return (x*y mod n) for bigInts x,y,n. For greater speed, let y<x.
373 'multMod': function(x,y,n) {
374 var ans=expand(x,n.length);
375 multMod_(ans,y,n);
376 return trim(ans,1);
377 },
378
379 //generate a k-bit true random prime using Maurer's algorithm,
380 //and put it into ans. The bigInt ans must be large enough to hold it.
381 'randTruePrime_': function(ans,k) {
382 var c,m,pm,dd,j,r,B,divisible,z,zz,recSize;
383
384 if (primes.length==0)
385 primes=findPrimes(30000); //check for divisibility by primes <=30000
386
387 if (pows.length==0) {
388 pows=new Array(512);
389 for (j=0;j<512;j++) {
390 pows[j]=Math.pow(2,j/511.-1.);
391 }
392 }
393
394 //c and m should be tuned for a particular machine and value of k, to maximize speed
395 //this was: c=primes[primes.length-1]/k/k; //check using all the small primes. (c=0.1 in HAC)
396 c=0.1;
397 m=20; //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
398 recLimit=20; /*must be at least 2 (was 29)*/ //stop recursion when k <=recLimit
399
400 if (s_i2.length!=ans.length) {
401 s_i2=dup(ans);
402 s_R =dup(ans);
403 s_n1=dup(ans);
404 s_r2=dup(ans);
405 s_d =dup(ans);
406 s_x1=dup(ans);
407 s_x2=dup(ans);
408 s_b =dup(ans);
409 s_n =dup(ans);
410 s_i =dup(ans);
411 s_rm=dup(ans);
412 s_q =dup(ans);
413 s_a =dup(ans);
414 s_aa=dup(ans);
415 }
416
417 if (k <= recLimit) { //generate small random primes by trial division up to its square root
418 pm=(1<<((k+2)>>1))-1; //pm is binary number with all ones, just over sqrt(2^k)
419 copyInt_(ans,0);
420 for (dd=1;dd;) {
421 dd=0;
422 ans[0]= 1 | (1<<(k-1)) | Math.floor(Math.random()*(1<<k)); //random, k-bit, odd integer, with msb 1
423 for (j=1;(j<primes.length) && ((primes[j]&pm)==primes[j]);j++) { //trial division by all primes 3...sqrt(2^k)
424 if (0==(ans[0]%primes[j])) {
425 dd=1;
426 break;
427 }
428 }
429 }
430 carry_(ans);
431 return;
432 }
433
434 B=c*k*k; //try small primes up to B (or all the primes[] array if the largest is less than B).
435 if (k>2*m) //generate this k-bit number by first recursively generating a number that has between k/2 and k-m bits
436 for (r=1; k-k*r<=m; )
437 r=pows[Math.floor(Math.random()*512)]; //r=Math.pow(2,Math.random()-1);
438 else
439 r=.5;
440
441 //simulation suggests the more complex algorithm using r=.333 is only slightly faster.
442
443 recSize=Math.floor(r*k)+1;
444
445 randTruePrime_(s_q,recSize);
446 copyInt_(s_i2,0);
447 s_i2[Math.floor((k-2)/bpe)] |= (1<<((k-2)%bpe)); //s_i2=2^(k-2)
448 divide_(s_i2,s_q,s_i,s_rm); //s_i=floor((2^(k-1))/(2q))
449
450 z=bitSize(s_i);
451
452 for (;;) {
453 for (;;) { //generate z-bit numbers until one falls in the range [0,s_i-1]
454 randBigInt_(s_R,z,0);
455 if (greater(s_i,s_R))
456 break;
457 } //now s_R is in the range [0,s_i-1]
458 addInt_(s_R,1); //now s_R is in the range [1,s_i]
459 add_(s_R,s_i); //now s_R is in the range [s_i+1,2*s_i]
460
461 copy_(s_n,s_q);
462 mult_(s_n,s_R);
463 multInt_(s_n,2);
464 addInt_(s_n,1); //s_n=2*s_R*s_q+1
465
466 copy_(s_r2,s_R);
467 multInt_(s_r2,2); //s_r2=2*s_R
468
469 //check s_n for divisibility by small primes up to B
470 for (divisible=0,j=0; (j<primes.length) && (primes[j]<B); j++)
471 if (modInt(s_n,primes[j])==0) {
472 divisible=1;
473 break;
474 }
475
476 if (!divisible) //if it passes small primes check, then try a single Miller-Rabin base 2
477 if (!millerRabin(s_n,2)) //this line represents 75% of the total runtime for randTruePrime_
478 divisible=1;
479
480 if (!divisible) { //if it passes that test, continue checking s_n
481 addInt_(s_n,-3);
482 for (j=s_n.length-1;(s_n[j]==0) && (j>0); j--); //strip leading zeros
483 for (zz=0,w=s_n[j]; w; (w>>=1),zz++);
484 zz+=bpe*j; //zz=number of bits in s_n, ignoring leading zeros
485 for (;;) { //generate z-bit numbers until one falls in the range [0,s_n-1]
486 randBigInt_(s_a,zz,0);
487 if (greater(s_n,s_a))
488 break;
489 } //now s_a is in the range [0,s_n-1]
490 addInt_(s_n,3); //now s_a is in the range [0,s_n-4]
491 addInt_(s_a,2); //now s_a is in the range [2,s_n-2]
492 copy_(s_b,s_a);
493 copy_(s_n1,s_n);
494 addInt_(s_n1,-1);
495 powMod_(s_b,s_n1,s_n); //s_b=s_a^(s_n-1) modulo s_n
496 addInt_(s_b,-1);
497 if (isZero(s_b)) {
498 copy_(s_b,s_a);
499 powMod_(s_b,s_r2,s_n);
500 addInt_(s_b,-1);
501 copy_(s_aa,s_n);
502 copy_(s_d,s_b);
503 GCD_(s_d,s_n); //if s_b and s_n are relatively prime, then s_n is a prime
504 if (equalsInt(s_d,1)) {
505 copy_(ans,s_aa);
506 return; //if we've made it this far, then s_n is absolutely guaranteed to be prime
507 }
508 }
509 }
510 }
511 },
512
513 //set b to an n-bit random BigInt. If s=1, then nth bit (most significant bit) is set to 1.
514 //array b must be big enough to hold the result. Must have n>=1
515 'randBigInt_': function(b,n,s) {
516 var i,a;
517 for (i=0;i<b.length;i++)
518 b[i]=0;
519 a=Math.floor((n-1)/bpe)+1; //# array elements to hold the BigInt
520 for (i=0;i<a;i++) {
521 b[i]=Math.floor(Math.random()*(1<<(bpe-1)));
522 }
523 b[a-1] &= (2<<((n-1)%bpe))-1;
524 if (s)
525 b[a-1] |= (1<<((n-1)%bpe));
526 },
527
528 //set x to the greatest common divisor of x and y.
529 //x,y are bigInts with the same number of elements. y is destroyed.
530 'GCD_': function(x,y) {
531 var i,xp,yp,A,B,C,D,q,sing;
532 if (T.length!=x.length)
533 T=dup(x);
534
535 sing=1;
536 while (sing) { //while y has nonzero elements other than y[0]
537 sing=0;
538 for (i=1;i<y.length;i++) //check if y has nonzero elements other than 0
539 if (y[i]) {
540 sing=1;
541 break;
542 }
543 if (!sing) break; //quit when y all zero elements except possibly y[0]
544
545 for (i=x.length;!x[i] && i>=0;i--); //find most significant element of x
546 xp=x[i];
547 yp=y[i];
548 A=1; B=0; C=0; D=1;
549 while ((yp+C) && (yp+D)) {
550 q =Math.floor((xp+A)/(yp+C));
551 qp=Math.floor((xp+B)/(yp+D));
552 if (q!=qp)
553 break;
554 t= A-q*C; A=C; C=t; // do (A,B,xp, C,D,yp) = (C,D,yp, A,B,xp) - q*(0,0,0, C,D,yp)
555 t= B-q*D; B=D; D=t;
556 t=xp-q*yp; xp=yp; yp=t;
557 }
558 if (B) {
559 copy_(T,x);
560 linComb_(x,y,A,B); //x=A*x+B*y
561 linComb_(y,T,D,C); //y=D*y+C*T
562 } else {
563 mod_(x,y);
564 copy_(T,x);
565 copy_(x,y);
566 copy_(y,T);
567 }
568 }
569 if (y[0]==0)
570 return;
571 t=modInt(x,y[0]);
572 copyInt_(x,y[0]);
573 y[0]=t;
574 while (y[0]) {
575 x[0]%=y[0];
576 t=x[0]; x[0]=y[0]; y[0]=t;
577 }
578 },
579
580//do x=x**(-1) mod n, for bigInts x and n.
581//If no inverse exists, it sets x to zero and returns 0, else it returns 1.
582//The x array must be at least as large as the n array.
583function inverseMod_(x,n) {
584 var k=1+2*Math.max(x.length,n.length);
585
586 if(!(x[0]&1) && !(n[0]&1)) { //if both inputs are even, then inverse doesn't exist
587 copyInt_(x,0);
588 return 0;
589 }
590
591 if (eg_u.length!=k) {
592 eg_u=new Array(k);
593 eg_v=new Array(k);
594 eg_A=new Array(k);
595 eg_B=new Array(k);
596 eg_C=new Array(k);
597 eg_D=new Array(k);
598 }
599
600 copy_(eg_u,x);
601 copy_(eg_v,n);
602 copyInt_(eg_A,1);
603 copyInt_(eg_B,0);
604 copyInt_(eg_C,0);
605 copyInt_(eg_D,1);
606 for (;;) {
607 while(!(eg_u[0]&1)) { //while eg_u is even
608 halve_(eg_u);
609 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if eg_A==eg_B==0 mod 2
610 halve_(eg_A);
611 halve_(eg_B);
612 } else {
613 add_(eg_A,n); halve_(eg_A);
614 sub_(eg_B,x); halve_(eg_B);
615 }
616 }
617
618 while (!(eg_v[0]&1)) { //while eg_v is even
619 halve_(eg_v);
620 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if eg_C==eg_D==0 mod 2
621 halve_(eg_C);
622 halve_(eg_D);
623 } else {
624 add_(eg_C,n); halve_(eg_C);
625 sub_(eg_D,x); halve_(eg_D);
626 }
627 }
628
629 if (!greater(eg_v,eg_u)) { //eg_v <= eg_u
630 sub_(eg_u,eg_v);
631 sub_(eg_A,eg_C);
632 sub_(eg_B,eg_D);
633 } else { //eg_v > eg_u
634 sub_(eg_v,eg_u);
635 sub_(eg_C,eg_A);
636 sub_(eg_D,eg_B);
637 }
638
639 if (equalsInt(eg_u,0)) {
640 if (negative(eg_C)) //make sure answer is nonnegative
641 add_(eg_C,n);
642 copy_(x,eg_C);
643
644 if (!equalsInt(eg_v,1)) { //if GCD_(x,n)!=1, then there is no inverse
645 copyInt_(x,0);
646 return 0;
647 }
648 return 1;
649 }
650 }
651}
652
653//return x**(-1) mod n, for integers x and n. Return 0 if there is no inverse
654function inverseModInt_(x,n) {
655 var a=1,b=0,t;
656 for (;;) {
657 if (x==1) return a;
658 if (x==0) return 0;
659 b-=a*Math.floor(n/x);
660 n%=x;
661
662 if (n==1) return b; //to avoid negatives, change this b to n-b, and each -= to +=
663 if (n==0) return 0;
664 a-=b*Math.floor(x/n);
665 x%=n;
666 }
667}
668
669//Given positive bigInts x and y, change the bigints v, a, and b to positive bigInts such that:
670// v = GCD_(x,y) = a*x-b*y
671//The bigInts v, a, b, must have exactly as many elements as the larger of x and y.
672function eGCD_(x,y,v,a,b) {
673 var g=0;
674 var k=Math.max(x.length,y.length);
675 if (eg_u.length!=k) {
676 eg_u=new Array(k);
677 eg_A=new Array(k);
678 eg_B=new Array(k);
679 eg_C=new Array(k);
680 eg_D=new Array(k);
681 }
682 while(!(x[0]&1) && !(y[0]&1)) { //while x and y both even
683 halve_(x);
684 halve_(y);
685 g++;
686 }
687 copy_(eg_u,x);
688 copy_(v,y);
689 copyInt_(eg_A,1);
690 copyInt_(eg_B,0);
691 copyInt_(eg_C,0);
692 copyInt_(eg_D,1);
693 for (;;) {
694 while(!(eg_u[0]&1)) { //while u is even
695 halve_(eg_u);
696 if (!(eg_A[0]&1) && !(eg_B[0]&1)) { //if A==B==0 mod 2
697 halve_(eg_A);
698 halve_(eg_B);
699 } else {
700 add_(eg_A,y); halve_(eg_A);
701 sub_(eg_B,x); halve_(eg_B);
702 }
703 }
704
705 while (!(v[0]&1)) { //while v is even
706 halve_(v);
707 if (!(eg_C[0]&1) && !(eg_D[0]&1)) { //if C==D==0 mod 2
708 halve_(eg_C);
709 halve_(eg_D);
710 } else {
711 add_(eg_C,y); halve_(eg_C);
712 sub_(eg_D,x); halve_(eg_D);
713 }
714 }
715
716 if (!greater(v,eg_u)) { //v<=u
717 sub_(eg_u,v);
718 sub_(eg_A,eg_C);
719 sub_(eg_B,eg_D);
720 } else { //v>u
721 sub_(v,eg_u);
722 sub_(eg_C,eg_A);
723 sub_(eg_D,eg_B);
724 }
725 if (equalsInt(eg_u,0)) {
726 if (negative(eg_C)) { //make sure a (C)is nonnegative
727 add_(eg_C,y);
728 sub_(eg_D,x);
729 }
730 multInt_(eg_D,-1); ///make sure b (D) is nonnegative
731 copy_(a,eg_C);
732 copy_(b,eg_D);
733 leftShift_(v,g);
734 return;
735 }
736 }
737}
738
739
740//is bigInt x negative?
741function negative(x) {
742 return ((x[x.length-1]>>(bpe-1))&1);
743}
744
745
746//is (x << (shift*bpe)) > y?
747//x and y are nonnegative bigInts
748//shift is a nonnegative integer
749function greaterShift(x,y,shift) {
750 var kx=x.length, ky=y.length;
751 k=((kx+shift)<ky) ? (kx+shift) : ky;
752 for (i=ky-1-shift; i<kx && i>=0; i++)
753 if (x[i]>0)
754 return 1; //if there are nonzeros in x to the left of the first column of y, then x is bigger
755 for (i=kx-1+shift; i<ky; i++)
756 if (y[i]>0)
757 return 0; //if there are nonzeros in y to the left of the first column of x, then x is not bigger
758 for (i=k-1; i>=shift; i--)
759 if (x[i-shift]>y[i]) return 1;
760 else if (x[i-shift]<y[i]) return 0;
761 return 0;
762}
763
764//is x > y? (x and y both nonnegative)
765function greater(x,y) {
766 var i;
767 var k=(x.length<y.length) ? x.length : y.length;
768
769 for (i=x.length;i<y.length;i++)
770 if (y[i])
771 return 0; //y has more digits
772
773 for (i=y.length;i<x.length;i++)
774 if (x[i])
775 return 1; //x has more digits
776
777 for (i=k-1;i>=0;i--)
778 if (x[i]>y[i])
779 return 1;
780 else if (x[i]<y[i])
781 return 0;
782 return 0;
783}
784
785//divide_ x by y giving quotient q and remainder r. (q=floor(x/y), r=x mod y). All 4 are bigints.
786//x must have at least one leading zero element.
787//y must be nonzero.
788//q and r must be arrays that are exactly the same length as x.
789//the x array must have at least as many elements as y.
790function divide_(x,y,q,r) {
791 var kx, ky;
792 var i,j,y1,y2,c,a,b;
793 copy_(r,x);
794 for (ky=y.length;y[ky-1]==0;ky--); //kx,ky is number of elements in x,y, not including leading zeros
795 for (kx=r.length;r[kx-1]==0 && kx>ky;kx--);
796
797 //normalize: ensure the most significant element of y has its highest bit set
798 b=y[ky-1];
799 for (a=0; b; a++)
800 b>>=1;
801 a=bpe-a; //a is how many bits to shift so that the high order bit of y is leftmost in its array element
802 leftShift_(y,a); //multiply both by 1<<a now, then divide_ both by that at the end
803 leftShift_(r,a);
804
805 copyInt_(q,0); // q=0
806 while (!greaterShift(y,r,kx-ky)) { // while (leftShift_(y,kx-ky) <= r) {
807 subShift_(r,y,kx-ky); // r=r-leftShift_(y,kx-ky)
808 q[kx-ky]++; // q[kx-ky]++;
809 } // }
810
811 for (i=kx-1; i>=ky; i--) {
812 if (r[i]==y[ky-1])
813 q[i-ky]=mask;
814 else
815 q[i-ky]=Math.floor((r[i]*radix+r[i-1])/y[ky-1]);
816
817 //The following for(;;) loop is equivalent to the commented while loop,
818 //except that the uncommented version avoids overflow.
819 //The commented loop comes from HAC, which assumes r[-1]==y[-1]==0
820 // while (q[i-ky]*(y[ky-1]*radix+y[ky-2]) > r[i]*radix*radix+r[i-1]*radix+r[i-2])
821 // q[i-ky]--;
822 for (;;) {
823 y2=(ky>1 ? y[ky-2] : 0)*q[i-ky];
824 c=y2>>bpe;
825 y2=y2 & mask;
826 y1=c+q[i-ky]*y[ky-1];
827 c=y1>>bpe;
828 y1=y1 & mask;
829
830 if (c==r[i] ? y1==r[i-1] ? y2>(i>1 ? r[i-2] : 0) : y1>r[i-1] : c>r[i])
831 q[i-ky]--;
832 else
833 break;
834 }
835
836 linCombShift_(r,y,-q[i-ky],i-ky); //r=r-q[i-ky]*leftShift_(y,i-ky)
837 if (negative(r)) {
838 addShift_(r,y,i-ky); //r=r+leftShift_(y,i-ky)
839 q[i-ky]--;
840 }
841 }
842
843 rightShift_(y,a); //undo the normalization step
844 rightShift_(r,a); //undo the normalization step
845}
846
847//do carries and borrows so each element of the bigInt x fits in bpe bits.
848function carry_(x) {
849 var i,k,c,b;
850 k=x.length;
851 c=0;
852 for (i=0;i<k;i++) {
853 c+=x[i];
854 b=0;
855 if (c<0) {
856 b=-(c>>bpe);
857 c+=b*radix;
858 }
859 x[i]=c & mask;
860 c=(c>>bpe)-b;
861 }
862}
863
864//return x mod n for bigInt x and integer n.
865function modInt(x,n) {
866 var i,c=0;
867 for (i=x.length-1; i>=0; i--)
868 c=(c*radix+x[i])%n;
869 return c;
870}
871
872//convert the integer t into a bigInt with at least the given number of bits.
873//the returned array stores the bigInt in bpe-bit chunks, little endian (buff[0] is least significant word)
874//Pad the array with leading zeros so that it has at least minSize elements.
875//There will always be at least one leading 0 element.
876function int2bigInt(t,bits,minSize) {
877 var i,k;
878 k=Math.ceil(bits/bpe)+1;
879 k=minSize>k ? minSize : k;
880 buff=new Array(k);
881 copyInt_(buff,t);
882 return buff;
883}
884
885//return the bigInt given a string representation in a given base.
886//Pad the array with leading zeros so that it has at least minSize elements.
887//If base=-1, then it reads in a space-separated list of array elements in decimal.
888//The array will always have at least one leading zero, unless base=-1.
889function str2bigInt(s,base,minSize) {
890 var d, i, j, x, y, kk;
891 var k=s.length;
892 if (base==-1) { //comma-separated list of array elements in decimal
893 x=new Array(0);
894 for (;;) {
895 y=new Array(x.length+1);
896 for (i=0;i<x.length;i++)
897 y[i+1]=x[i];
898 y[0]=parseInt(s,10);
899 x=y;
900 d=s.indexOf(',',0);
901 if (d<1)
902 break;
903 s=s.substring(d+1);
904 if (s.length==0)
905 break;
906 }
907 if (x.length<minSize) {
908 y=new Array(minSize);
909 copy_(y,x);
910 return y;
911 }
912 return x;
913 }
914
915 x=int2bigInt(0,base*k,0);
916 for (i=0;i<k;i++) {
917 d=digitsStr.indexOf(s.substring(i,i+1),0);
918 if (base<=36 && d>=36) //convert lowercase to uppercase if base<=36
919 d-=26;
920 if (d<base && d>=0) { //ignore illegal characters
921 multInt_(x,base);
922 addInt_(x,d);
923 }
924 }
925
926 for (k=x.length;k>0 && !x[k-1];k--); //strip off leading zeros
927 k=minSize>k+1 ? minSize : k+1;
928 y=new Array(k);
929 kk=k<x.length ? k : x.length;
930 for (i=0;i<kk;i++)
931 y[i]=x[i];
932 for (;i<k;i++)
933 y[i]=0;
934 return y;
935}
936
937//is bigint x equal to integer y?
938//y must have less than bpe bits
939function equalsInt(x,y) {
940 var i;
941 if (x[0]!=y)
942 return 0;
943 for (i=1;i<x.length;i++)
944 if (x[i])
945 return 0;
946 return 1;
947}
948
949//are bigints x and y equal?
950//this works even if x and y are different lengths and have arbitrarily many leading zeros
951function equals(x,y) {
952 var i;
953 var k=x.length<y.length ? x.length : y.length;
954 for (i=0;i<k;i++)
955 if (x[i]!=y[i])
956 return 0;
957 if (x.length>y.length) {
958 for (;i<x.length;i++)
959 if (x[i])
960 return 0;
961 } else {
962 for (;i<y.length;i++)
963 if (y[i])
964 return 0;
965 }
966 return 1;
967}
968
969//is the bigInt x equal to zero?
970function isZero(x) {
971 var i;
972 for (i=0;i<x.length;i++)
973 if (x[i])
974 return 0;
975 return 1;
976}
977
978//convert a bigInt into a string in a given base, from base 2 up to base 95.
979//Base -1 prints the contents of the array representing the number.
980function bigInt2str(x,base) {
981 var i,t,s="";
982
983 if (s6.length!=x.length)
984 s6=dup(x);
985 else
986 copy_(s6,x);
987
988 if (base==-1) { //return the list of array contents
989 for (i=x.length-1;i>0;i--)
990 s+=x[i]+',';
991 s+=x[0];
992 }
993 else { //return it in the given base
994 while (!isZero(s6)) {
995 t=divInt_(s6,base); //t=s6 % base; s6=floor(s6/base);
996 s=digitsStr.substring(t,t+1)+s;
997 }
998 }
999 if (s.length==0)
1000 s="0";
1001 return s;
1002}
1003
1004//returns a duplicate of bigInt x
1005function dup(x) {
1006 var i;
1007 buff=new Array(x.length);
1008 copy_(buff,x);
1009 return buff;
1010}
1011
1012//do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
1013function copy_(x,y) {
1014 var i;
1015 var k=x.length<y.length ? x.length : y.length;
1016 for (i=0;i<k;i++)
1017 x[i]=y[i];
1018 for (i=k;i<x.length;i++)
1019 x[i]=0;
1020}
1021
1022//do x=y on bigInt x and integer y.
1023function copyInt_(x,n) {
1024 var i,c;
1025 for (c=n,i=0;i<x.length;i++) {
1026 x[i]=c & mask;
1027 c>>=bpe;
1028 }
1029}
1030
1031//do x=x+n where x is a bigInt and n is an integer.
1032//x must be large enough to hold the result.
1033function addInt_(x,n) {
1034 var i,k,c,b;
1035 x[0]+=n;
1036 k=x.length;
1037 c=0;
1038 for (i=0;i<k;i++) {
1039 c+=x[i];
1040 b=0;
1041 if (c<0) {
1042 b=-(c>>bpe);
1043 c+=b*radix;
1044 }
1045 x[i]=c & mask;
1046 c=(c>>bpe)-b;
1047 if (!c) return; //stop carrying as soon as the carry_ is zero
1048 }
1049}
1050
1051//right shift bigInt x by n bits. 0 <= n < bpe.
1052function rightShift_(x,n) {
1053 var i;
1054 var k=Math.floor(n/bpe);
1055 if (k) {
1056 for (i=0;i<x.length-k;i++) //right shift x by k elements
1057 x[i]=x[i+k];
1058 for (;i<x.length;i++)
1059 x[i]=0;
1060 n%=bpe;
1061 }
1062 for (i=0;i<x.length-1;i++) {
1063 x[i]=mask & ((x[i+1]<<(bpe-n)) | (x[i]>>n));
1064 }
1065 x[i]>>=n;
1066}
1067
1068//do x=floor(|x|/2)*sgn(x) for bigInt x in 2's complement
1069function halve_(x) {
1070 var i;
1071 for (i=0;i<x.length-1;i++) {
1072 x[i]=mask & ((x[i+1]<<(bpe-1)) | (x[i]>>1));
1073 }
1074 x[i]=(x[i]>>1) | (x[i] & (radix>>1)); //most significant bit stays the same
1075}
1076
1077//left shift bigInt x by n bits.
1078function leftShift_(x,n) {
1079 var i;
1080 var k=Math.floor(n/bpe);
1081 if (k) {
1082 for (i=x.length; i>=k; i--) //left shift x by k elements
1083 x[i]=x[i-k];
1084 for (;i>=0;i--)
1085 x[i]=0;
1086 n%=bpe;
1087 }
1088 if (!n)
1089 return;
1090 for (i=x.length-1;i>0;i--) {
1091 x[i]=mask & ((x[i]<<n) | (x[i-1]>>(bpe-n)));
1092 }
1093 x[i]=mask & (x[i]<<n);
1094}
1095
1096//do x=x*n where x is a bigInt and n is an integer.
1097//x must be large enough to hold the result.
1098function multInt_(x,n) {
1099 var i,k,c,b;
1100 if (!n)
1101 return;
1102 k=x.length;
1103 c=0;
1104 for (i=0;i<k;i++) {
1105 c+=x[i]*n;
1106 b=0;
1107 if (c<0) {
1108 b=-(c>>bpe);
1109 c+=b*radix;
1110 }
1111 x[i]=c & mask;
1112 c=(c>>bpe)-b;
1113 }
1114}
1115
1116//do x=floor(x/n) for bigInt x and integer n, and return the remainder
1117function divInt_(x,n) {
1118 var i,r=0,s;
1119 for (i=x.length-1;i>=0;i--) {
1120 s=r*radix+x[i];
1121 x[i]=Math.floor(s/n);
1122 r=s%n;
1123 }
1124 return r;
1125}
1126
1127//do the linear combination x=a*x+b*y for bigInts x and y, and integers a and b.
1128//x must be large enough to hold the answer.
1129function linComb_(x,y,a,b) {
1130 var i,c,k,kk;
1131 k=x.length<y.length ? x.length : y.length;
1132 kk=x.length;
1133 for (c=0,i=0;i<k;i++) {
1134 c+=a*x[i]+b*y[i];
1135 x[i]=c & mask;
1136 c>>=bpe;
1137 }
1138 for (i=k;i<kk;i++) {
1139 c+=a*x[i];
1140 x[i]=c & mask;
1141 c>>=bpe;
1142 }
1143}
1144
1145//do the linear combination x=a*x+b*(y<<(ys*bpe)) for bigInts x and y, and integers a, b and ys.
1146//x must be large enough to hold the answer.
1147function linCombShift_(x,y,b,ys) {
1148 var i,c,k,kk;
1149 k=x.length<ys+y.length ? x.length : ys+y.length;
1150 kk=x.length;
1151 for (c=0,i=ys;i<k;i++) {
1152 c+=x[i]+b*y[i-ys];
1153 x[i]=c & mask;
1154 c>>=bpe;
1155 }
1156 for (i=k;c && i<kk;i++) {
1157 c+=x[i];
1158 x[i]=c & mask;
1159 c>>=bpe;
1160 }
1161}
1162
1163//do x=x+(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1164//x must be large enough to hold the answer.
1165function addShift_(x,y,ys) {
1166 var i,c,k,kk;
1167 k=x.length<ys+y.length ? x.length : ys+y.length;
1168 kk=x.length;
1169 for (c=0,i=ys;i<k;i++) {
1170 c+=x[i]+y[i-ys];
1171 x[i]=c & mask;
1172 c>>=bpe;
1173 }
1174 for (i=k;c && i<kk;i++) {
1175 c+=x[i];
1176 x[i]=c & mask;
1177 c>>=bpe;
1178 }
1179}
1180
1181//do x=x-(y<<(ys*bpe)) for bigInts x and y, and integers a,b and ys.
1182//x must be large enough to hold the answer.
1183function subShift_(x,y,ys) {
1184 var i,c,k,kk;
1185 k=x.length<ys+y.length ? x.length : ys+y.length;
1186 kk=x.length;
1187 for (c=0,i=ys;i<k;i++) {
1188 c+=x[i]-y[i-ys];
1189 x[i]=c & mask;
1190 c>>=bpe;
1191 }
1192 for (i=k;c && i<kk;i++) {
1193 c+=x[i];
1194 x[i]=c & mask;
1195 c>>=bpe;
1196 }
1197}
1198
1199//do x=x-y for bigInts x and y.
1200//x must be large enough to hold the answer.
1201//negative answers will be 2s complement
1202function sub_(x,y) {
1203 var i,c,k,kk;
1204 k=x.length<y.length ? x.length : y.length;
1205 for (c=0,i=0;i<k;i++) {
1206 c+=x[i]-y[i];
1207 x[i]=c & mask;
1208 c>>=bpe;
1209 }
1210 for (i=k;c && i<x.length;i++) {
1211 c+=x[i];
1212 x[i]=c & mask;
1213 c>>=bpe;
1214 }
1215}
1216
1217//do x=x+y for bigInts x and y.
1218//x must be large enough to hold the answer.
1219function add_(x,y) {
1220 var i,c,k,kk;
1221 k=x.length<y.length ? x.length : y.length;
1222 for (c=0,i=0;i<k;i++) {
1223 c+=x[i]+y[i];
1224 x[i]=c & mask;
1225 c>>=bpe;
1226 }
1227 for (i=k;c && i<x.length;i++) {
1228 c+=x[i];
1229 x[i]=c & mask;
1230 c>>=bpe;
1231 }
1232}
1233
1234//do x=x*y for bigInts x and y. This is faster when y<x.
1235function mult_(x,y) {
1236 var i;
1237 if (ss.length!=2*x.length)
1238 ss=new Array(2*x.length);
1239 copyInt_(ss,0);
1240 for (i=0;i<y.length;i++)
1241 if (y[i])
1242 linCombShift_(ss,x,y[i],i); //ss=1*ss+y[i]*(x<<(i*bpe))
1243 copy_(x,ss);
1244}
1245
1246//do x=x mod n for bigInts x and n.
1247function mod_(x,n) {
1248 if (s4.length!=x.length)
1249 s4=dup(x);
1250 else
1251 copy_(s4,x);
1252 if (s5.length!=x.length)
1253 s5=dup(x);
1254 divide_(s4,n,s5,x); //x = remainder of s4 / n
1255}
1256
1257//do x=x*y mod n for bigInts x,y,n.
1258//for greater speed, let y<x.
1259function multMod_(x,y,n) {
1260 var i;
1261 if (s0.length!=2*x.length)
1262 s0=new Array(2*x.length);
1263 copyInt_(s0,0);
1264 for (i=0;i<y.length;i++)
1265 if (y[i])
1266 linCombShift_(s0,x,y[i],i); //s0=1*s0+y[i]*(x<<(i*bpe))
1267 mod_(s0,n);
1268 copy_(x,s0);
1269}
1270
1271//do x=x*x mod n for bigInts x,n.
1272function squareMod_(x,n) {
1273 var i,j,d,c,kx,kn,k;
1274 for (kx=x.length; kx>0 && !x[kx-1]; kx--); //ignore leading zeros in x
1275 k=kx>n.length ? 2*kx : 2*n.length; //k=# elements in the product, which is twice the elements in the larger of x and n
1276 if (s0.length!=k)
1277 s0=new Array(k);
1278 copyInt_(s0,0);
1279 for (i=0;i<kx;i++) {
1280 c=s0[2*i]+x[i]*x[i];
1281 s0[2*i]=c & mask;
1282 c>>=bpe;
1283 for (j=i+1;j<kx;j++) {
1284 c=s0[i+j]+2*x[i]*x[j]+c;
1285 s0[i+j]=(c & mask);
1286 c>>=bpe;
1287 }
1288 s0[i+kx]=c;
1289 }
1290 mod_(s0,n);
1291 copy_(x,s0);
1292}
1293
1294//return x with exactly k leading zero elements
1295function trim(x,k) {
1296 var i,y;
1297 for (i=x.length; i>0 && !x[i-1]; i--);
1298 y=new Array(i+k);
1299 copy_(y,x);
1300 return y;
1301}
1302
1303//do x=x**y mod n, where x,y,n are bigInts and ** is exponentiation. 0**0=1.
1304//this is faster when n is odd. x usually needs to have as many elements as n.
1305function powMod_(x,y,n) {
1306 var k1,k2,kn,np;
1307 if(s7.length!=n.length)
1308 s7=dup(n);
1309
1310 //for even modulus, use a simple square-and-multiply algorithm,
1311 //rather than using the more complex Montgomery algorithm.
1312 if ((n[0]&1)==0) {
1313 copy_(s7,x);
1314 copyInt_(x,1);
1315 while(!equalsInt(y,0)) {
1316 if (y[0]&1)
1317 multMod_(x,s7,n);
1318 divInt_(y,2);
1319 squareMod_(s7,n);
1320 }
1321 return;
1322 }
1323
1324 //calculate np from n for the Montgomery multiplications
1325 copyInt_(s7,0);
1326 for (kn=n.length;kn>0 && !n[kn-1];kn--);
1327 np=radix-inverseModInt_(modInt(n,radix),radix);
1328 s7[kn]=1;
1329 multMod_(x ,s7,n); // x = x * 2**(kn*bp) mod n
1330
1331 if (s3.length!=x.length)
1332 s3=dup(x);
1333 else
1334 copy_(s3,x);
1335
1336 for (k1=y.length-1;k1>0 & !y[k1]; k1--); //k1=first nonzero element of y
1337 if (y[k1]==0) { //anything to the 0th power is 1
1338 copyInt_(x,1);
1339 return;
1340 }
1341 for (k2=1<<(bpe-1);k2 && !(y[k1] & k2); k2>>=1); //k2=position of first 1 bit in y[k1]
1342 for (;;) {
1343 if (!(k2>>=1)) { //look at next bit of y
1344 k1--;
1345 if (k1<0) {
1346 mont_(x,one,n,np);
1347 return;
1348 }
1349 k2=1<<(bpe-1);
1350 }
1351 mont_(x,x,n,np);
1352
1353 if (k2 & y[k1]) //if next bit is a 1
1354 mont_(x,s3,n,np);
1355 }
1356}
1357
1358//do x=x*y*Ri mod n for bigInts x,y,n,
1359// where Ri = 2**(-kn*bpe) mod n, and kn is the
1360// number of elements in the n array, not
1361// counting leading zeros.
1362//x must be large enough to hold the answer.
1363//It's OK if x and y are the same variable.
1364//must have:
1365// x,y < n
1366// n is odd
1367// np = -(n^(-1)) mod radix
1368function mont_(x,y,n,np) {
1369 var i,j,c,ui,t;
1370 var kn=n.length;
1371 var ky=y.length;
1372
1373 if (sa.length!=kn)
1374 sa=new Array(kn);
1375
1376 for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
1377 //this function sometimes gives wrong answers when the next line is uncommented
1378 //for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
1379
1380 copyInt_(sa,0);
1381
1382 //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
1383 for (i=0; i<kn; i++) {
1384 t=sa[0]+x[i]*y[0];
1385 ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
1386 c=(t+ui*n[0]) >> bpe;
1387 t=x[i];
1388
1389 //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
1390 for (j=1;j<ky;j++) {
1391 c+=sa[j]+t*y[j]+ui*n[j];
1392 sa[j-1]=c & mask;
1393 c>>=bpe;
1394 }
1395 for (;j<kn;j++) {
1396 c+=sa[j]+ui*n[j];
1397 sa[j-1]=c & mask;
1398 c>>=bpe;
1399 }
1400 sa[j-1]=c & mask;
1401 }
1402
1403 if (!greater(n,sa))
1404 sub_(sa,n);
1405 copy_(x,sa);
1406}
1407
1408
1409
1410
1411//#############################################################################
1412//#############################################################################
1413//#############################################################################
1414//#############################################################################
1415//#############################################################################
1416//#############################################################################
1417//#############################################################################
1418
1419
1420
1421
1422
1423//#############################################################################
1424
1425Clipperz.Crypto.BigInt = function (aValue, aBase) {
1426 varbase;
1427 varvalue;
1428
1429 if (typeof(aValue) == 'object') {
1430 this._internalValue = aValue;
1431 } else {
1432 if (typeof(aValue) == 'undefined') {
1433 value = "0";
1434 } else {
1435 value = aValue + "";
1436 }
1437
1438 if (typeof(aBase) == 'undefined') {
1439 base = 10;
1440 } else {
1441 base = aBase;
1442 }
1443
1444 this._internalValue = str2bigInt(value, base, 1, 1);
1445 }
1446
1447 return this;
1448}
1449
1450//=============================================================================
1451
1452MochiKit.Base.update(Clipperz.Crypto.BigInt.prototype, {
1453
1454 //-------------------------------------------------------------------------
1455
1456 'internalValue': function () {
1457 return this._internalValue;
1458 },
1459
1460 //-------------------------------------------------------------------------
1461
1462 'isBigInt': true,
1463
1464 //-------------------------------------------------------------------------
1465
1466 'toString': function(aBase) {
1467 return this.asString(aBase);
1468 },
1469
1470 //-------------------------------------------------------------------------
1471
1472 'asString': function (aBase) {
1473 varbase;
1474
1475 if (typeof(aBase) == 'undefined') {
1476 base = 10;
1477 } else {
1478 base = aBase;
1479 }
1480
1481 return bigInt2str(this.internalValue(), base).toLowerCase();
1482 },
1483
1484 //-------------------------------------------------------------------------
1485
1486 'equals': function (aValue) {
1487 var result;
1488
1489 if (aValue.isBigInt) {
1490 result = equals(this.internalValue(), aValue.internalValue());
1491 } else if (typeof(aValue) == "number") {
1492 result = equalsInt(this.internalValue(), aValue);
1493 } else {
1494 throw Clipperz.Crypt.BigInt.exception.UnknownType;
1495 }
1496
1497 return result;
1498 },
1499
1500 //-------------------------------------------------------------------------
1501
1502 'add': function (aValue) {
1503 var result;
1504
1505 if (aValue.isBigInt) {
1506 result = add(this.internalValue(), aValue.internalValue());
1507 } else {
1508 result = addInt(this.internalValue(), aValue);
1509 }
1510
1511 return new Clipperz.Crypto.BigInt(result);
1512 },
1513
1514 //-------------------------------------------------------------------------
1515
1516 'subtract': function (aValue) {
1517 var result;
1518 var value;
1519
1520 if (aValue.isBigInt) {
1521 value = aValue;
1522 } else {
1523 value = new Clipperz.Crypto.BigInt(aValue);
1524 }
1525
1526 result = sub(this.internalValue(), value.internalValue());
1527
1528 return new Clipperz.Crypto.BigInt(result);
1529 },
1530
1531 //-------------------------------------------------------------------------
1532
1533 'multiply': function (aValue, aModule) {
1534 var result;
1535 var value;
1536
1537 if (aValue.isBigInt) {
1538 value = aValue;
1539 } else {
1540 value = new Clipperz.Crypto.BigInt(aValue);
1541 }
1542
1543 if (typeof(aModule) == 'undefined') {
1544 result = mult(this.internalValue(), value.internalValue());
1545 } else {
1546 result = multMod(this.internalValue(), value.internalValue(), aModule);
1547 }
1548
1549 return new Clipperz.Crypto.BigInt(result);
1550 },
1551
1552 //-------------------------------------------------------------------------
1553
1554 'module': function (aModule) {
1555 varresult;
1556 var module;
1557
1558 if (aModule.isBigInt) {
1559 module = aModule;
1560 } else {
1561 module = new Clipperz.Crypto.BigInt(aModule);
1562 }
1563
1564 result = mod(this.internalValue(), module.internalValue());
1565
1566 return new Clipperz.Crypto.BigInt(result);
1567 },
1568
1569 //-------------------------------------------------------------------------
1570
1571 'powerModule': function(aValue, aModule) {
1572 varresult;
1573 varvalue;
1574 var module;
1575
1576 if (aValue.isBigInt) {
1577 value = aValue;
1578 } else {
1579 value = new Clipperz.Crypto.BigInt(aValue);
1580 }
1581
1582 if (aModule.isBigInt) {
1583 module = aModule;
1584 } else {
1585 module = new Clipperz.Crypto.BigInt(aModule);
1586 }
1587
1588 if (aValue == -1) {
1589 result = inverseMod(this.internalValue(), module.internalValue());
1590 } else {
1591 result = powMod(this.internalValue(), value.internalValue(), module.internalValue());
1592 }
1593
1594 return new Clipperz.Crypto.BigInt(result);
1595 },
1596
1597 //-------------------------------------------------------------------------
1598
1599 'bitSize': function() {
1600 return bitSize(this.internalValue());
1601 },
1602
1603 //-------------------------------------------------------------------------
1604 __syntaxFix__: "syntax fix"
1605
1606});
1607
1608//#############################################################################
1609
1610Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) {
1611 return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize));
1612}
1613
1614//#############################################################################
1615//#############################################################################
1616//#############################################################################
1617
1618Clipperz.Crypto.BigInt.equals = function(a, b) {
1619 return a.equals(b);
1620}
1621
1622Clipperz.Crypto.BigInt.add = function(a, b) {
1623 return a.add(b);
1624}
1625
1626Clipperz.Crypto.BigInt.subtract = function(a, b) {
1627 return a.subtract(b);
1628}
1629
1630Clipperz.Crypto.BigInt.multiply = function(a, b, module) {
1631 return a.multiply(b, module);
1632}
1633
1634Clipperz.Crypto.BigInt.module = function(a, module) {
1635 return a.module(module);
1636}
1637
1638Clipperz.Crypto.BigInt.powerModule = function(a, b, module) {
1639 return a.powerModule(b, module);
1640}
1641
1642Clipperz.Crypto.BigInt.exception = {
1643 UnknownType: new MochiKit.Base.NamedError("Clipperz.Crypto.BigInt.exception.UnknownType")
1644}
diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
new file mode 100644
index 0000000..0d76b9c
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Curve.js
@@ -0,0 +1,500 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.Curve = function(args) {
31 args = args || {};
32
33 this._modulus = args.modulus;
34
35 this._a = args.a;
36 this._b = args.b;
37 this._G = args.G;
38 this._r = args.r;
39 this._h = args.h;
40
41 this._finiteField = null;
42
43 return this;
44}
45
46Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, {
47
48 'asString': function() {
49 return "Clipperz.Crypto.ECC.BinaryField.Curve";
50 },
51
52 //-----------------------------------------------------------------------------
53
54 'modulus': function() {
55 return this._modulus;
56 },
57
58 'a': function() {
59 return this._a;
60 },
61
62 'b': function() {
63 return this._b;
64 },
65
66 'G': function() {
67 return this._G;
68 },
69
70 'r': function() {
71 return this._r;
72 },
73
74 'h': function() {
75 return this._h;
76 },
77
78 //-----------------------------------------------------------------------------
79
80 'finiteField': function() {
81 if (this._finiteField == null) {
82 this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()})
83 }
84
85 return this._finiteField;
86 },
87
88 //-----------------------------------------------------------------------------
89
90 'negate': function(aPointA) {
91 var result;
92
93 result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())})
94
95 return result;
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'add': function(aPointA, aPointB) {
101 var result;
102
103 if (aPointA.isZero()) {
104 result = aPointB;
105 } else if (aPointB.isZero()) {
106 result = aPointA;
107 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
108 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
109 } else {
110 varf2m;
111 var x, y;
112 var lambda;
113 var aX, aY, bX, bY;
114
115 aX = aPointA.x()._value;
116 aY = aPointA.y()._value;
117 bX = aPointB.x()._value;
118 bY = aPointB.y()._value;
119
120 f2m = this.finiteField();
121
122 if (aPointA.x().compare(aPointB.x()) != 0) {
123 lambda =f2m._fastMultiply(
124 f2m._add(aY, bY),
125 f2m._inverse(f2m._add(aX, bX))
126 );
127 x = f2m._add(this.a()._value, f2m._square(lambda));
128 f2m._overwriteAdd(x, lambda);
129 f2m._overwriteAdd(x, aX);
130 f2m._overwriteAdd(x, bX);
131 } else {
132 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
133 x = f2m._add(this.a()._value, f2m._square(lambda));
134 f2m._overwriteAdd(x, lambda);
135 }
136
137 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
138 f2m._overwriteAdd(y, x);
139 f2m._overwriteAdd(y, bY);
140
141 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
142 }
143
144 return result;
145 },
146
147 //-----------------------------------------------------------------------------
148
149 'addTwice': function(aPointA) {
150 return this.add(aPointA, aPointA);
151 },
152
153 //-----------------------------------------------------------------------------
154
155 'overwriteAdd': function(aPointA, aPointB) {
156 if (aPointA.isZero()) {
157 // result = aPointB;
158 aPointA._x._value = aPointB._x._value;
159 aPointA._y._value = aPointB._y._value;
160 } else if (aPointB.isZero()) {
161 // result = aPointA;
162 } else if ((aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) {
163 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
164 aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O;
165 aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O;
166 } else {
167 varf2m;
168 var x, y;
169 var lambda;
170 var aX, aY, bX, bY;
171
172 aX = aPointA.x()._value;
173 aY = aPointA.y()._value;
174 bX = aPointB.x()._value;
175 bY = aPointB.y()._value;
176
177 f2m = this.finiteField();
178
179 if (aPointA.x().compare(aPointB.x()) != 0) {
180 lambda =f2m._fastMultiply(
181 f2m._add(aY, bY),
182 f2m._inverse(f2m._add(aX, bX))
183 );
184 x = f2m._add(this.a()._value, f2m._square(lambda));
185 f2m._overwriteAdd(x, lambda);
186 f2m._overwriteAdd(x, aX);
187 f2m._overwriteAdd(x, bX);
188 } else {
189 lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX)));
190 x = f2m._add(this.a()._value, f2m._square(lambda));
191 f2m._overwriteAdd(x, lambda);
192 }
193
194 y = f2m._fastMultiply(f2m._add(bX, x), lambda);
195 f2m._overwriteAdd(y, x);
196 f2m._overwriteAdd(y, bY);
197
198 // result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)})
199 aPointA._x._value = x;
200 aPointA._y._value = y;
201
202 }
203
204 return result;
205 },
206
207 //-----------------------------------------------------------------------------
208
209 'multiply': function(aValue, aPoint) {
210 var result;
211
212//console.profile();
213 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
214
215 if (aValue.isZero() == false) {
216 var k, Q;
217 var i;
218 var countIndex; countIndex = 0;
219
220 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
221 k = aValue;
222 Q = aPoint;
223 } else {
224 Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
225 k = aValue.negate();
226 Q = this.negate(aPoint);
227 }
228
229 for (i=k.bitSize()-1; i>=0; i--) {
230 result = this.add(result, result);
231 // this.overwriteAdd(result, result);
232 if (k.isBitSet(i)) {
233 result = this.add(result, Q);
234 // this.overwriteAdd(result, Q);
235 }
236
237 // if (countIndex==100) {Clipperz.log("multiply.break"); break;} else countIndex++;
238 }
239 }
240//console.profileEnd();
241
242 return result;
243 },
244
245 //-----------------------------------------------------------------------------
246
247 'deferredMultiply': function(aValue, aPoint) {
248 var deferredResult;
249 var result;
250
251Clipperz.log(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint);
252//console.profile("ECC.Curve.multiply");
253 deferredResult = new MochiKit.Async.Deferred();
254//deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} );
255//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 1: " + res); return res;});
256
257 result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O});
258//deferredResult.addBoth(function(res) {Clipperz.logDebug("# 2: " + res); return res;});
259
260 if (aValue.isZero() == false) {
261 var k, Q;
262 var i;
263 var countIndex; countIndex = 0;
264
265 if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) {
266 k = aValue;
267 Q = aPoint;
268 } else {
269 Clipperz.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!");
270 k = aValue.negate();
271 Q = this.negate(aPoint);
272 }
273
274
275 for (i=k.bitSize()-1; i>=0; i--) {
276 deferredResult.addMethod(this, "addTwice");
277 //# result = this.add(result, result);
278 // this.overwriteAdd(result, result);
279 if (k.isBitSet(i)) {
280 deferredResult.addMethod(this, "add", Q);
281 //# result = this.add(result, Q);
282 // this.overwriteAdd(result, Q);
283 }
284 if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);}
285 }
286 }
287//#console.profileEnd();
288//deferredResult.addBoth(function(res) {console.profileEnd(); return res;});
289 deferredResult.callback(result);
290
291 //# return result;
292 return deferredResult;
293 },
294
295 //-----------------------------------------------------------------------------
296 __syntaxFix__: "syntax fix"
297});
298
299
300//#############################################################################
301
302Clipperz.Crypto.ECC.StandardCurves = {};
303
304MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
305/*
306 '_K571': null,
307 'K571': function() {
308 if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) {
309 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
310 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
311 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
312 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
313 G: new Clipperz.Crypto.ECC.BinaryField.Point({
314 x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
315 y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
316 }),
317 r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
318 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
319 });
320 }
321
322 return Clipperz.Crypto.ECC.StandardCurves._K571;
323 },
324
325
326
327 '_K283': null,
328 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
329 if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) {
330 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
331 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
332 a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16),
333 b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
334 G: new Clipperz.Crypto.ECC.BinaryField.Point({
335 x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
336 y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
337 }),
338 r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
339 h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16)
340 });
341 }
342
343 return Clipperz.Crypto.ECC.StandardCurves._K283;
344 },
345*/
346 //-----------------------------------------------------------------------------
347
348 '_B571': null,
349 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
350 if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) {
351 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
352 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16),
353 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
354 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16),
355 G: new Clipperz.Crypto.ECC.BinaryField.Point({
356 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
357 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
358 }),
359 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
360 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
361
362 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
363 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
364 });
365
366 //-----------------------------------------------------------------------------
367 //
368 //Guide to Elliptic Curve Cryptography
369 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
370 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
371 //
372 //-----------------------------------------------------------------------------
373 //
374 // http://www.milw0rm.com/papers/136
375 //
376 // -------------------------------------------------------------------------
377 // Polynomial Reduction Algorithm Modulo f571
378 // -------------------------------------------------------------------------
379 //
380 // Input: Polynomial p(x) of degree 1140 or less, stored as
381 // an array of 2T machinewords.
382 // Output: p(x) mod f571(x)
383 //
384 // FOR i = T-1, ..., 0 DO
385 // SET X := P[i+T]
386 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
387 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
388 //
389 // SET X := P[T-1] >> 27
390 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
391 // P[T-1] := P[T-1] & 0x07ffffff
392 //
393 // RETURN P[T-1],...,P[0]
394 //
395 // -------------------------------------------------------------------------
396 //
397 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
398 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
399 varresult;
400
401 if (aValue.bitSize() > 1140) {
402 Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
403 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
404 } else {
405 varC, T;
406 var i;
407
408 C = aValue._value.slice(0);
409 for (i=35; i>=18; i--) {
410 T = C[i];
411 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
412 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
413 }
414 T = (C[17] >>> 27);
415 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
416 C[17] = (C[17] & 0x07ffffff);
417
418 for(i=18; i<=35; i++) {
419 C[i] = 0;
420 }
421
422 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
423 }
424
425 return result;
426 };
427 }
428
429 return Clipperz.Crypto.ECC.StandardCurves._B571;
430 },
431
432 //-----------------------------------------------------------------------------
433
434 '_B283': null,
435 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
436 if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) {
437 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
438 // modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
439 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
440 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
441 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
442 G: new Clipperz.Crypto.ECC.BinaryField.Point({
443 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
444 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
445 }),
446 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
447 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
448
449 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
450 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
451 });
452
453 //-----------------------------------------------------------------------------
454 //
455 //Guide to Elliptic Curve Cryptography
456 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
457 //- Pag: 56, Alorithm 2.43
458 //
459 //-----------------------------------------------------------------------------
460 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
461 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
462 varresult;
463
464 if (aValue.bitSize() > 564) {
465 Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
466 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
467 } else {
468 varC, T;
469 var i;
470
471 C = aValue._value.slice(0);
472 for (i=17; i>=9; i--) {
473 T = C[i];
474 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
475 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
476 }
477 T = (C[8] >>> 27);
478 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
479 C[8] = (C[8] & 0x07ffffff);
480
481 for(i=9; i<=17; i++) {
482 C[i] = 0;
483 }
484
485 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
486 }
487
488 return result;
489 };
490 }
491
492 return Clipperz.Crypto.ECC.StandardCurves._B283;
493 },
494
495 //-----------------------------------------------------------------------------
496 __syntaxFix__: "syntax fix"
497});
498
499//#############################################################################
500
diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
new file mode 100644
index 0000000..7b7c2c6
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/FiniteField.js
@@ -0,0 +1,519 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) {
31 args = args || {};
32 this._modulus = args.modulus;
33
34 return this;
35}
36
37Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, {
38
39 'asString': function() {
40 return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")";
41 },
42
43 //-----------------------------------------------------------------------------
44
45 'modulus': function() {
46 return this._modulus;
47 },
48
49 //-----------------------------------------------------------------------------
50
51 '_module': function(aValue) {
52 varresult;
53 var modulusComparison;
54
55 modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value);
56
57 if (modulusComparison < 0) {
58 result = aValue;
59 } else if (modulusComparison == 0) {
60 result = [0];
61 } else {
62 var modulusBitSize;
63 var resultBitSize;
64
65 result = aValue;
66
67 modulusBitSize = this.modulus().bitSize();
68 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
69 while (resultBitSize >= modulusBitSize) {
70 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize));
71 resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result);
72 }
73 }
74
75 return result;
76 },
77
78 'module': function(aValue) {
79 return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0)));
80 },
81
82 //-----------------------------------------------------------------------------
83
84 '_add': function(a, b) {
85 return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b);
86 },
87
88 '_overwriteAdd': function(a, b) {
89 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b);
90 },
91
92 'add': function(a, b) {
93 return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value));
94 },
95
96 //-----------------------------------------------------------------------------
97
98 'negate': function(aValue) {
99 return aValue.clone();
100 },
101
102 //-----------------------------------------------------------------------------
103
104 '_multiply': function(a, b) {
105 var result;
106 var valueToXor;
107 var i,c;
108
109 result = [0];
110 valueToXor = b;
111 c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a);
112 for (i=0; i<c; i++) {
113 if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) {
114 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor);
115 }
116 valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1);
117 }
118 result = this._module(result);
119
120 return result;
121 },
122
123 'multiply': function(a, b) {
124 return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value));
125 },
126
127 //-----------------------------------------------------------------------------
128
129 '_fastMultiply': function(a, b) {
130 var result;
131 var B;
132 var i,c;
133
134 result = [0];
135 B = b.slice(0); //Is this array copy avoidable?
136 c = 32;
137 for (i=0; i<c; i++) {
138 var ii, cc;
139
140 cc = a.length;
141 for (ii=0; ii<cc; ii++) {
142 if (((a[ii] >>> i) & 0x01) == 1) {
143 Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii);
144 }
145 }
146
147 if (i < (c-1)) {
148 B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1);
149 }
150 }
151 result = this._module(result);
152
153 return result;
154 },
155
156 'fastMultiply': function(a, b) {
157 return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value));
158 },
159
160 //-----------------------------------------------------------------------------
161 //
162 //Guide to Elliptic Curve Cryptography
163 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
164 //- Pag: 49, Alorithm 2.34
165 //
166 //-----------------------------------------------------------------------------
167
168 '_square': function(aValue) {
169 var result;
170 var value;
171 var c,i;
172 var precomputedValues;
173
174 value = aValue;
175 result = new Array(value.length * 2);
176 precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes;
177
178 c = value.length;
179 for (i=0; i<c; i++) {
180 result[i*2] = precomputedValues[(value[i] & 0x000000ff)];
181 result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16);
182
183 result[i*2 + 1] = precomputedValues[(value[i] & 0x00ff0000) >>> 16];
184 result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16);
185 }
186
187 return this._module(result);
188 },
189
190 'square': function(aValue) {
191 return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value));
192 },
193
194 //-----------------------------------------------------------------------------
195
196 '_inverse': function(aValue) {
197 varresult;
198 var b, c;
199 var u, v;
200
201 // b = Clipperz.Crypto.ECC.BinaryField.Value.I._value;
202 b = [1];
203 // c = Clipperz.Crypto.ECC.BinaryField.Value.O._value;
204 c = [0];
205 u = this._module(aValue);
206 v = this.modulus()._value.slice(0);
207
208 while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) {
209 varbitDifferenceSize;
210
211 bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v);
212 if (bitDifferenceSize < 0) {
213 var swap;
214
215 swap = u;
216 u = v;
217 v = swap;
218
219 swap = c;
220 c = b;
221 b = swap;
222
223 bitDifferenceSize = -bitDifferenceSize;
224 }
225
226 u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
227 b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
228 // this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize));
229 // this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize));
230 }
231
232 result = this._module(b);
233
234 return result;
235 },
236
237 'inverse': function(aValue) {
238 return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value));
239 },
240
241 //-----------------------------------------------------------------------------
242 __syntaxFix__: "syntax fix"
243});
244
245
246Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [
247 0x0000, // 0 = 0000 0000 -> 0000 0000 0000 0000
248 0x0001, // 1 = 0000 0001 -> 0000 0000 0000 0001
249 0x0004, // 2 = 0000 0010 -> 0000 0000 0000 0100
250 0x0005, // 3 = 0000 0011 -> 0000 0000 0000 0101
251 0x0010, // 4 = 0000 0100 -> 0000 0000 0001 0000
252 0x0011, // 5 = 0000 0101 -> 0000 0000 0001 0001
253 0x0014, // 6 = 0000 0110 -> 0000 0000 0001 0100
254 0x0015, // 7 = 0000 0111 -> 0000 0000 0001 0101
255 0x0040, // 8 = 0000 1000 -> 0000 0000 0100 0000
256 0x0041, // 9 = 0000 1001 -> 0000 0000 0100 0001
257 0x0044, // 10 = 0000 1010 -> 0000 0000 0100 0100
258 0x0045, // 11 = 0000 1011 -> 0000 0000 0100 0101
259 0x0050, // 12 = 0000 1100 -> 0000 0000 0101 0000
260 0x0051, // 13 = 0000 1101 -> 0000 0000 0101 0001
261 0x0054, // 14 = 0000 1110 -> 0000 0000 0101 0100
262 0x0055, // 15 = 0000 1111 -> 0000 0000 0101 0101
263
264 0x0100, // 16 = 0001 0000 -> 0000 0001 0000 0000
265 0x0101, // 17 = 0001 0001 -> 0000 0001 0000 0001
266 0x0104, // 18 = 0001 0010 -> 0000 0001 0000 0100
267 0x0105, // 19 = 0001 0011 -> 0000 0001 0000 0101
268 0x0110, // 20 = 0001 0100 -> 0000 0001 0001 0000
269 0x0111, // 21 = 0001 0101 -> 0000 0001 0001 0001
270 0x0114, // 22 = 0001 0110 -> 0000 0001 0001 0100
271 0x0115, // 23 = 0001 0111 -> 0000 0001 0001 0101
272 0x0140, // 24 = 0001 1000 -> 0000 0001 0100 0000
273 0x0141, // 25 = 0001 1001 -> 0000 0001 0100 0001
274 0x0144, // 26 = 0001 1010 -> 0000 0001 0100 0100
275 0x0145, // 27 = 0001 1011 -> 0000 0001 0100 0101
276 0x0150, // 28 = 0001 1100 -> 0000 0001 0101 0000
277 0x0151, // 28 = 0001 1101 -> 0000 0001 0101 0001
278 0x0154, // 30 = 0001 1110 -> 0000 0001 0101 0100
279 0x0155, // 31 = 0001 1111 -> 0000 0001 0101 0101
280
281 0x0400, // 32 = 0010 0000 -> 0000 0100 0000 0000
282 0x0401, // 33 = 0010 0001 -> 0000 0100 0000 0001
283 0x0404, // 34 = 0010 0010 -> 0000 0100 0000 0100
284 0x0405, // 35 = 0010 0011 -> 0000 0100 0000 0101
285 0x0410, // 36 = 0010 0100 -> 0000 0100 0001 0000
286 0x0411, // 37 = 0010 0101 -> 0000 0100 0001 0001
287 0x0414, // 38 = 0010 0110 -> 0000 0100 0001 0100
288 0x0415, // 39 = 0010 0111 -> 0000 0100 0001 0101
289 0x0440, // 40 = 0010 1000 -> 0000 0100 0100 0000
290 0x0441, // 41 = 0010 1001 -> 0000 0100 0100 0001
291 0x0444, // 42 = 0010 1010 -> 0000 0100 0100 0100
292 0x0445, // 43 = 0010 1011 -> 0000 0100 0100 0101
293 0x0450, // 44 = 0010 1100 -> 0000 0100 0101 0000
294 0x0451, // 45 = 0010 1101 -> 0000 0100 0101 0001
295 0x0454, // 46 = 0010 1110 -> 0000 0100 0101 0100
296 0x0455, // 47 = 0010 1111 -> 0000 0100 0101 0101
297
298 0x0500, // 48 = 0011 0000 -> 0000 0101 0000 0000
299 0x0501, // 49 = 0011 0001 -> 0000 0101 0000 0001
300 0x0504, // 50 = 0011 0010 -> 0000 0101 0000 0100
301 0x0505, // 51 = 0011 0011 -> 0000 0101 0000 0101
302 0x0510, // 52 = 0011 0100 -> 0000 0101 0001 0000
303 0x0511, // 53 = 0011 0101 -> 0000 0101 0001 0001
304 0x0514, // 54 = 0011 0110 -> 0000 0101 0001 0100
305 0x0515, // 55 = 0011 0111 -> 0000 0101 0001 0101
306 0x0540, // 56 = 0011 1000 -> 0000 0101 0100 0000
307 0x0541, // 57 = 0011 1001 -> 0000 0101 0100 0001
308 0x0544, // 58 = 0011 1010 -> 0000 0101 0100 0100
309 0x0545, // 59 = 0011 1011 -> 0000 0101 0100 0101
310 0x0550, // 60 = 0011 1100 -> 0000 0101 0101 0000
311 0x0551, // 61 = 0011 1101 -> 0000 0101 0101 0001
312 0x0554, // 62 = 0011 1110 -> 0000 0101 0101 0100
313 0x0555, // 63 = 0011 1111 -> 0000 0101 0101 0101
314
315 0x1000, // 64 = 0100 0000 -> 0001 0000 0000 0000
316 0x1001, // 65 = 0100 0001 -> 0001 0000 0000 0001
317 0x1004, // 66 = 0100 0010 -> 0001 0000 0000 0100
318 0x1005, // 67 = 0100 0011 -> 0001 0000 0000 0101
319 0x1010, // 68 = 0100 0100 -> 0001 0000 0001 0000
320 0x1011, // 69 = 0100 0101 -> 0001 0000 0001 0001
321 0x1014, // 70 = 0100 0110 -> 0001 0000 0001 0100
322 0x1015, // 71 = 0100 0111 -> 0001 0000 0001 0101
323 0x1040, // 72 = 0100 1000 -> 0001 0000 0100 0000
324 0x1041, // 73 = 0100 1001 -> 0001 0000 0100 0001
325 0x1044, // 74 = 0100 1010 -> 0001 0000 0100 0100
326 0x1045, // 75 = 0100 1011 -> 0001 0000 0100 0101
327 0x1050, // 76 = 0100 1100 -> 0001 0000 0101 0000
328 0x1051, // 77 = 0100 1101 -> 0001 0000 0101 0001
329 0x1054, // 78 = 0100 1110 -> 0001 0000 0101 0100
330 0x1055, // 79 = 0100 1111 -> 0001 0000 0101 0101
331
332 0x1100, // 80 = 0101 0000 -> 0001 0001 0000 0000
333 0x1101, // 81 = 0101 0001 -> 0001 0001 0000 0001
334 0x1104, // 82 = 0101 0010 -> 0001 0001 0000 0100
335 0x1105, // 83 = 0101 0011 -> 0001 0001 0000 0101
336 0x1110, // 84 = 0101 0100 -> 0001 0001 0001 0000
337 0x1111, // 85 = 0101 0101 -> 0001 0001 0001 0001
338 0x1114, // 86 = 0101 0110 -> 0001 0001 0001 0100
339 0x1115, // 87 = 0101 0111 -> 0001 0001 0001 0101
340 0x1140, // 88 = 0101 1000 -> 0001 0001 0100 0000
341 0x1141, // 89 = 0101 1001 -> 0001 0001 0100 0001
342 0x1144, // 90 = 0101 1010 -> 0001 0001 0100 0100
343 0x1145, // 91 = 0101 1011 -> 0001 0001 0100 0101
344 0x1150, // 92 = 0101 1100 -> 0001 0001 0101 0000
345 0x1151, // 93 = 0101 1101 -> 0001 0001 0101 0001
346 0x1154, // 94 = 0101 1110 -> 0001 0001 0101 0100
347 0x1155, // 95 = 0101 1111 -> 0001 0001 0101 0101
348
349 0x1400, // 96 = 0110 0000 -> 0001 0100 0000 0000
350 0x1401, // 97 = 0110 0001 -> 0001 0100 0000 0001
351 0x1404, // 98 = 0110 0010 -> 0001 0100 0000 0100
352 0x1405, // 99 = 0110 0011 -> 0001 0100 0000 0101
353 0x1410, //100 = 0110 0100 -> 0001 0100 0001 0000
354 0x1411, //101 = 0110 0101 -> 0001 0100 0001 0001
355 0x1414, //102 = 0110 0110 -> 0001 0100 0001 0100
356 0x1415, //103 = 0110 0111 -> 0001 0100 0001 0101
357 0x1440, //104 = 0110 1000 -> 0001 0100 0100 0000
358 0x1441, //105 = 0110 1001 -> 0001 0100 0100 0001
359 0x1444, //106 = 0110 1010 -> 0001 0100 0100 0100
360 0x1445, //107 = 0110 1011 -> 0001 0100 0100 0101
361 0x1450, //108 = 0110 1100 -> 0001 0100 0101 0000
362 0x1451, //109 = 0110 1101 -> 0001 0100 0101 0001
363 0x1454, //110 = 0110 1110 -> 0001 0100 0101 0100
364 0x1455, //111 = 0110 1111 -> 0001 0100 0101 0101
365
366 0x1500, //112 = 0111 0000 -> 0001 0101 0000 0000
367 0x1501, //113 = 0111 0001 -> 0001 0101 0000 0001
368 0x1504, //114 = 0111 0010 -> 0001 0101 0000 0100
369 0x1505, //115 = 0111 0011 -> 0001 0101 0000 0101
370 0x1510, //116 = 0111 0100 -> 0001 0101 0001 0000
371 0x1511, //117 = 0111 0101 -> 0001 0101 0001 0001
372 0x1514, //118 = 0111 0110 -> 0001 0101 0001 0100
373 0x1515, //119 = 0111 0111 -> 0001 0101 0001 0101
374 0x1540, //120 = 0111 1000 -> 0001 0101 0100 0000
375 0x1541, //121 = 0111 1001 -> 0001 0101 0100 0001
376 0x1544, //122 = 0111 1010 -> 0001 0101 0100 0100
377 0x1545, //123 = 0111 1011 -> 0001 0101 0100 0101
378 0x1550, //124 = 0111 1100 -> 0001 0101 0101 0000
379 0x1551, //125 = 0111 1101 -> 0001 0101 0101 0001
380 0x1554, //126 = 0111 1110 -> 0001 0101 0101 0100
381 0x1555, //127 = 0111 1111 -> 0001 0101 0101 0101
382
383 0x4000, //128 = 1000 0000 -> 0100 0000 0000 0000
384 0x4001, //129 = 1000 0001 -> 0100 0000 0000 0001
385 0x4004, //130 = 1000 0010 -> 0100 0000 0000 0100
386 0x4005, //131 = 1000 0011 -> 0100 0000 0000 0101
387 0x4010, //132 = 1000 0100 -> 0100 0000 0001 0000
388 0x4011, //133 = 1000 0101 -> 0100 0000 0001 0001
389 0x4014, //134 = 1000 0110 -> 0100 0000 0001 0100
390 0x4015, //135 = 1000 0111 -> 0100 0000 0001 0101
391 0x4040, //136 = 1000 1000 -> 0100 0000 0100 0000
392 0x4041, //137 = 1000 1001 -> 0100 0000 0100 0001
393 0x4044, //138 = 1000 1010 -> 0100 0000 0100 0100
394 0x4045, //139 = 1000 1011 -> 0100 0000 0100 0101
395 0x4050, //140 = 1000 1100 -> 0100 0000 0101 0000
396 0x4051, //141 = 1000 1101 -> 0100 0000 0101 0001
397 0x4054, //142 = 1000 1110 -> 0100 0000 0101 0100
398 0x4055, //143 = 1000 1111 -> 0100 0000 0101 0101
399
400 0x4100, //144 = 1001 0000 -> 0100 0001 0000 0000
401 0x4101, //145 = 1001 0001 -> 0100 0001 0000 0001
402 0x4104, //146 = 1001 0010 -> 0100 0001 0000 0100
403 0x4105, //147 = 1001 0011 -> 0100 0001 0000 0101
404 0x4110, //148 = 1001 0100 -> 0100 0001 0001 0000
405 0x4111, //149 = 1001 0101 -> 0100 0001 0001 0001
406 0x4114, //150 = 1001 0110 -> 0100 0001 0001 0100
407 0x4115, //151 = 1001 0111 -> 0100 0001 0001 0101
408 0x4140, //152 = 1001 1000 -> 0100 0001 0100 0000
409 0x4141, //153 = 1001 1001 -> 0100 0001 0100 0001
410 0x4144, //154 = 1001 1010 -> 0100 0001 0100 0100
411 0x4145, //155 = 1001 1011 -> 0100 0001 0100 0101
412 0x4150, //156 = 1001 1100 -> 0100 0001 0101 0000
413 0x4151, //157 = 1001 1101 -> 0100 0001 0101 0001
414 0x4154, //158 = 1001 1110 -> 0100 0001 0101 0100
415 0x4155, //159 = 1001 1111 -> 0100 0001 0101 0101
416
417 0x4400, //160 = 1010 0000 -> 0100 0100 0000 0000
418 0x4401, //161 = 1010 0001 -> 0100 0100 0000 0001
419 0x4404, //162 = 1010 0010 -> 0100 0100 0000 0100
420 0x4405, //163 = 1010 0011 -> 0100 0100 0000 0101
421 0x4410, //164 = 1010 0100 -> 0100 0100 0001 0000
422 0x4411, //165 = 1010 0101 -> 0100 0100 0001 0001
423 0x4414, //166 = 1010 0110 -> 0100 0100 0001 0100
424 0x4415, //167 = 1010 0111 -> 0100 0100 0001 0101
425 0x4440, //168 = 1010 1000 -> 0100 0100 0100 0000
426 0x4441, //169 = 1010 1001 -> 0100 0100 0100 0001
427 0x4444, //170 = 1010 1010 -> 0100 0100 0100 0100
428 0x4445, //171 = 1010 1011 -> 0100 0100 0100 0101
429 0x4450, //172 = 1010 1100 -> 0100 0100 0101 0000
430 0x4451, //173 = 1010 1101 -> 0100 0100 0101 0001
431 0x4454, //174 = 1010 1110 -> 0100 0100 0101 0100
432 0x4455, //175 = 1010 1111 -> 0100 0100 0101 0101
433
434 0x4500, //176 = 1011 0000 -> 0100 0101 0000 0000
435 0x4501, //177 = 1011 0001 -> 0100 0101 0000 0001
436 0x4504, //178 = 1011 0010 -> 0100 0101 0000 0100
437 0x4505, //179 = 1011 0011 -> 0100 0101 0000 0101
438 0x4510, //180 = 1011 0100 -> 0100 0101 0001 0000
439 0x4511, //181 = 1011 0101 -> 0100 0101 0001 0001
440 0x4514, //182 = 1011 0110 -> 0100 0101 0001 0100
441 0x4515, //183 = 1011 0111 -> 0100 0101 0001 0101
442 0x4540, //184 = 1011 1000 -> 0100 0101 0100 0000
443 0x4541, //185 = 1011 1001 -> 0100 0101 0100 0001
444 0x4544, //186 = 1011 1010 -> 0100 0101 0100 0100
445 0x4545, //187 = 1011 1011 -> 0100 0101 0100 0101
446 0x4550, //188 = 1011 1100 -> 0100 0101 0101 0000
447 0x4551, //189 = 1011 1101 -> 0100 0101 0101 0001
448 0x4554, //190 = 1011 1110 -> 0100 0101 0101 0100
449 0x4555, //191 = 1011 1111 -> 0100 0101 0101 0101
450
451 0x5000, //192 = 1100 0000 -> 0101 0000 0000 0000
452 0x5001, //193 = 1100 0001 -> 0101 0000 0000 0001
453 0x5004, //194 = 1100 0010 -> 0101 0000 0000 0100
454 0x5005, //195 = 1100 0011 -> 0101 0000 0000 0101
455 0x5010, //196 = 1100 0100 -> 0101 0000 0001 0000
456 0x5011, //197 = 1100 0101 -> 0101 0000 0001 0001
457 0x5014, //198 = 1100 0110 -> 0101 0000 0001 0100
458 0x5015, //199 = 1100 0111 -> 0101 0000 0001 0101
459 0x5040, //200 = 1100 1000 -> 0101 0000 0100 0000
460 0x5041, //201 = 1100 1001 -> 0101 0000 0100 0001
461 0x5044, //202 = 1100 1010 -> 0101 0000 0100 0100
462 0x5045, //203 = 1100 1011 -> 0101 0000 0100 0101
463 0x5050, //204 = 1100 1100 -> 0101 0000 0101 0000
464 0x5051, //205 = 1100 1101 -> 0101 0000 0101 0001
465 0x5054, //206 = 1100 1110 -> 0101 0000 0101 0100
466 0x5055, //207 = 1100 1111 -> 0101 0000 0101 0101
467
468 0x5100, //208 = 1101 0000 -> 0101 0001 0000 0000
469 0x5101, //209 = 1101 0001 -> 0101 0001 0000 0001
470 0x5104, //210 = 1101 0010 -> 0101 0001 0000 0100
471 0x5105, //211 = 1101 0011 -> 0101 0001 0000 0101
472 0x5110, //212 = 1101 0100 -> 0101 0001 0001 0000
473 0x5111, //213 = 1101 0101 -> 0101 0001 0001 0001
474 0x5114, //214 = 1101 0110 -> 0101 0001 0001 0100
475 0x5115, //215 = 1101 0111 -> 0101 0001 0001 0101
476 0x5140, //216 = 1101 1000 -> 0101 0001 0100 0000
477 0x5141, //217 = 1101 1001 -> 0101 0001 0100 0001
478 0x5144, //218 = 1101 1010 -> 0101 0001 0100 0100
479 0x5145, //219 = 1101 1011 -> 0101 0001 0100 0101
480 0x5150, //220 = 1101 1100 -> 0101 0001 0101 0000
481 0x5151, //221 = 1101 1101 -> 0101 0001 0101 0001
482 0x5154, //222 = 1101 1110 -> 0101 0001 0101 0100
483 0x5155, //223 = 1101 1111 -> 0101 0001 0101 0101
484
485 0x5400, //224 = 1110 0000 -> 0101 0100 0000 0000
486 0x5401, //225 = 1110 0001 -> 0101 0100 0000 0001
487 0x5404, //226 = 1110 0010 -> 0101 0100 0000 0100
488 0x5405, //227 = 1110 0011 -> 0101 0100 0000 0101
489 0x5410, //228 = 1110 0100 -> 0101 0100 0001 0000
490 0x5411, //229 = 1110 0101 -> 0101 0100 0001 0001
491 0x5414, //230 = 1110 0110 -> 0101 0100 0001 0100
492 0x5415, //231 = 1110 0111 -> 0101 0100 0001 0101
493 0x5440, //232 = 1110 1000 -> 0101 0100 0100 0000
494 0x5441, //233 = 1110 1001 -> 0101 0100 0100 0001
495 0x5444, //234 = 1110 1010 -> 0101 0100 0100 0100
496 0x5445, //235 = 1110 1011 -> 0101 0100 0100 0101
497 0x5450, //236 = 1110 1100 -> 0101 0100 0101 0000
498 0x5451, //237 = 1110 1101 -> 0101 0100 0101 0001
499 0x5454, //238 = 1110 1110 -> 0101 0100 0101 0100
500 0x5455, //239 = 1110 1111 -> 0101 0100 0101 0101
501
502 0x5500, //240 = 1111 0000 -> 0101 0101 0000 0000
503 0x5501, //241 = 1111 0001 -> 0101 0101 0000 0001
504 0x5504, //242 = 1111 0010 -> 0101 0101 0000 0100
505 0x5505, //243 = 1111 0011 -> 0101 0101 0000 0101
506 0x5510, //244 = 1111 0100 -> 0101 0101 0001 0000
507 0x5511, //245 = 1111 0101 -> 0101 0101 0001 0001
508 0x5514, //246 = 1111 0110 -> 0101 0101 0001 0100
509 0x5515, //247 = 1111 0111 -> 0101 0101 0001 0101
510 0x5540, //248 = 1111 1000 -> 0101 0101 0100 0000
511 0x5541, //249 = 1111 1001 -> 0101 0101 0100 0001
512 0x5544, //250 = 1111 1010 -> 0101 0101 0100 0100
513 0x5545, //251 = 1111 1011 -> 0101 0101 0100 0101
514 0x5550, //252 = 1111 1100 -> 0101 0101 0101 0000
515 0x5551, //253 = 1111 1101 -> 0101 0101 0101 0001
516 0x5554, //254 = 1111 1110 -> 0101 0101 0101 0100
517 0x5555 //255 = 1111 1111 -> 0101 0101 0101 0101
518
519]
diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js
new file mode 100644
index 0000000..fef3220
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Point.js
@@ -0,0 +1,62 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
28if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
29
30Clipperz.Crypto.ECC.BinaryField.Point = function(args) {
31 args = args || {};
32 this._x = args.x;
33 this._y = args.y;
34
35 return this;
36}
37
38Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, {
39
40 'asString': function() {
41 return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")";
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'x': function() {
47 return this._x;
48 },
49
50 'y': function() {
51 return this._y;
52 },
53
54 //-----------------------------------------------------------------------------
55
56 'isZero': function() {
57 return (this.x().isZero() && this.y().isZero())
58 },
59
60 //-----------------------------------------------------------------------------
61 __syntaxFix__: "syntax fix"
62});
diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js
new file mode 100644
index 0000000..634772a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/ECC/BinaryField/Value.js
@@ -0,0 +1,379 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!";
26//}
27if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; }
30if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; }
31
32Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) {
33 if (aValue.constructor == String) {
34 varvalue;
35 varstringLength;
36 var numberOfWords;
37 vari,c;
38
39 if (aBase != 16) {
40 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
41 }
42
43 value = aValue.replace(/ /g, '');
44 stringLength = value.length;
45 numberOfWords = Math.ceil(stringLength / 8);
46 this._value = new Array(numberOfWords);
47
48 c = numberOfWords;
49 for (i=0; i<c; i++) {
50 varword;
51
52 if (i < (c-1)) {
53 word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16);
54 } else {
55 word = parseInt(value.substr(0, stringLength-(i*8)), 16);
56 }
57
58 this._value[i] = word;
59 }
60 } else if (aValue.constructor == Array) {
61 var itemsToCopy;
62
63 itemsToCopy = aValue.length;
64 while (aValue[itemsToCopy - 1] == 0) {
65 itemsToCopy --;
66 }
67
68 this._value = aValue.slice(0, itemsToCopy);
69 } else if (aValue.constructor == Number) {
70 this._value = [aValue];
71 } else {
72 // throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType;
73 }
74
75 this._bitSize == aBitSize || null;
76
77 return this;
78}
79
80Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, {
81
82 'value': function() {
83 return this._value;
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'wordSize': function() {
89 return this._value.length
90 },
91
92 //-----------------------------------------------------------------------------
93
94 'clone': function() {
95 return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize);
96 },
97
98 //-----------------------------------------------------------------------------
99
100 'isZero': function() {
101 return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0);
102 },
103
104 //-----------------------------------------------------------------------------
105
106 'asString': function(aBase) {
107 varresult;
108 var i,c;
109
110 if (aBase != 16) {
111 throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase;
112 }
113
114 result = "";
115 c = this.wordSize();
116 for (i=0; i<c; i++) {
117 varwordAsString;
118
119 // wordAsString = ("00000000" + this.value()[i].toString(16));
120 wordAsString = ("00000000" + this._value[i].toString(16));
121 wordAsString = wordAsString.substring(wordAsString.length - 8);
122 result = wordAsString + result;
123 }
124
125 result = result.replace(/^(00)*/, "");
126
127 if (result == "") {
128 result = "0";
129 }
130
131 return result;
132 },
133
134 //-----------------------------------------------------------------------------
135
136 'shiftLeft': function(aNumberOfBitsToShift) {
137 //this method seems like it is never called. :-(
138 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift));
139 },
140
141 //-----------------------------------------------------------------------------
142
143 'bitSize': function() {
144 if (this._bitSize == null) {
145 this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value);
146 }
147
148 return this._bitSize;
149 },
150
151 //-----------------------------------------------------------------------------
152
153 'isBitSet': function(aBitPosition) {
154 return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition);
155 },
156
157 //-----------------------------------------------------------------------------
158
159 'xor': function(aValue) {
160 return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value));
161 },
162
163 //-----------------------------------------------------------------------------
164
165 'compare': function(aValue) {
166 return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value);
167 },
168
169 //-----------------------------------------------------------------------------
170 __syntaxFix__: "syntax fix"
171});
172
173Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16);
174Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16);
175
176Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) {
177 var result;
178 var resultSize;
179 var i,c;
180 var firstItemOffset;
181
182 firstItemOffset = aFirstItemOffset || 0;
183 resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
184
185 result = new Array(resultSize);
186
187 c = firstItemOffset;
188 for (i=0; i<c; i++) {
189 result[i] = a[i];
190 }
191
192 c = resultSize;
193 for (i=firstItemOffset; i<c; i++) {
194 result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
195 }
196
197 return result;
198};
199
200Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) {
201 var i,c;
202 var firstItemOffset;
203
204 firstItemOffset = aFirstItemOffset || 0;
205
206 c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset;
207 for (i=firstItemOffset; i<c; i++) {
208 a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0);
209 }
210};
211
212Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) {
213 var numberOfWordsToShift;
214 varnumberOfBitsToShift;
215 var result;
216 varoverflowValue;
217 var nextOverflowValue;
218 vari,c;
219
220 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
221 numberOfBitsToShift = aNumberOfBitsToShift % 32;
222
223 result = new Array(aWordArray.length + numberOfWordsToShift);
224
225 c = numberOfWordsToShift;
226 for (i=0; i<c; i++) {
227 result[i] = 0;
228 }
229
230 overflowValue = 0;
231 nextOverflowValue = 0;
232
233 c = aWordArray.length;
234 for (i=0; i<c; i++) {
235 varvalue;
236 varresultWord;
237
238 // value = this.value()[i];
239 value = aWordArray[i];
240
241 if (numberOfBitsToShift > 0) {
242 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
243 value = value & (0xffffffff >>> numberOfBitsToShift);
244 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
245 } else {
246 resultWord = value;
247 }
248
249 result[i+numberOfWordsToShift] = resultWord;
250 overflowValue = nextOverflowValue;
251 }
252
253 if (overflowValue != 0) {
254 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
255 }
256
257 return result;
258};
259
260Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) {
261 var numberOfWordsToShift;
262 varnumberOfBitsToShift;
263 var result;
264 varoverflowValue;
265 vari,c;
266
267 numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32);
268 numberOfBitsToShift = aNumberOfBitsToShift % 32;
269
270 result = new Array(aWordArray.length + numberOfWordsToShift);
271
272 c = numberOfWordsToShift;
273 for (i=0; i<c; i++) {
274 result[i] = 0;
275 }
276
277 overflowValue = 0;
278 nextOverflowValue = 0;
279
280 c = aWordArray.length;
281 for (i=0; i<c; i++) {
282 varvalue;
283 varresultWord;
284
285 // value = this.value()[i];
286 value = aWordArray[i];
287
288 if (numberOfBitsToShift > 0) {
289 var nextOverflowValue;
290
291 nextOverflowValue = (value >>> (32 - numberOfBitsToShift));
292 value = value & (0xffffffff >>> numberOfBitsToShift);
293 resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0);
294 } else {
295 resultWord = value;
296 }
297
298 result[i+numberOfWordsToShift] = resultWord;
299 overflowValue = nextOverflowValue;
300 }
301
302 if (overflowValue != 0) {
303 result[aWordArray.length + numberOfWordsToShift] = overflowValue;
304 }
305
306 return result;
307};
308
309Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) {
310 varresult;
311 varnotNullElements;
312 var mostValuableWord;
313 var matchingBitsInMostImportantWord;
314 var mask;
315 var i,c;
316
317 notNullElements = aWordArray.length;
318
319 if ((aWordArray.length == 1) && (aWordArray[0] == 0)) {
320 result = 0;
321 } else {
322 notNullElements --;
323 while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) {
324 notNullElements --;
325 }
326
327 result = notNullElements * 32;
328 mostValuableWord = aWordArray[notNullElements];
329
330 matchingBits = 32;
331 mask = 0x80000000;
332
333 while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) {
334 matchingBits --;
335 mask >>>= 1;
336 }
337
338 result += matchingBits;
339 }
340
341 return result;
342};
343
344Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) {
345 var result;
346 varbyteIndex;
347 var bitIndexInSelectedByte;
348
349 byteIndex = Math.floor(aBitPosition / 32);
350 bitIndexInSelectedByte = aBitPosition % 32;
351
352 if (byteIndex <= aWordArray.length) {
353 result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0);
354 } else {
355 result = false;
356 }
357
358 return result;
359};
360
361Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) {
362 varresult;
363 var i,c;
364
365 result = MochiKit.Base.compare(a.length, b.length);
366
367 c = a.length;
368 for (i=0; (i<c) && (result==0); i++) {
369 result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]);
370 }
371
372 return result;
373};
374
375
376Clipperz.Crypto.ECC.BinaryField.Value['exception']= {
377 'UnsupportedBase': new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"),
378 'UnsupportedConstructorValueType':new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType")
379};
diff --git a/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js b/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js
new file mode 100644
index 0000000..239e264
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/ECC/StandardCurves.js
@@ -0,0 +1,229 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) {
25 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!";
26//}
27//try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) {
28 //throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!";
29//}
30
31Clipperz.Crypto.ECC.StandardCurves = {};
32
33MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, {
34
35 //==============================================================================
36
37 '_K571': null,
38 'K571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
39 if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
40 Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({
41 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
42 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
43 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
44 G: new Clipperz.Crypto.ECC.Koblitz.Point({
45 x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16),
46 y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16)
47 }),
48 r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16),
49 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
50 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16)
51 });
52 }
53
54 return Clipperz.Crypto.ECC.StandardCurves._K571;
55 },
56
57 //-----------------------------------------------------------------------------
58
59 '_K283': null,
60 'K283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
61 if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) {
62 Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({
63 modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
64 a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16),
65 b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16),
66 G: new Clipperz.Crypto.ECC.Koblitz.Point({
67 x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16),
68 y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16)
69 }),
70 r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16),
71 h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16),
72 primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16)
73 });
74 }
75
76 return Clipperz.Crypto.ECC.StandardCurves._K283;
77 },
78
79 //==============================================================================
80
81 '_B571': null,
82 'B571': function() { //f(z) = z^571 + z^10 + z^5 + z^2 + 1
83 if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
84 Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({
85 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16),
86 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
87 b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16),
88 G: new Clipperz.Crypto.ECC.BinaryField.Point({
89 x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16),
90 y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16)
91 }),
92 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16),
93 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
94
95 // S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10),
96 // n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16)
97 });
98
99 //-----------------------------------------------------------------------------
100 //
101 //Guide to Elliptic Curve Cryptography
102 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
103 //- Pag: 56, Alorithm 2.45 (with a typo!!!)
104 //
105 //-----------------------------------------------------------------------------
106 //
107 // http://www.milw0rm.com/papers/136
108 //
109 // -------------------------------------------------------------------------
110 // Polynomial Reduction Algorithm Modulo f571
111 // -------------------------------------------------------------------------
112 //
113 // Input: Polynomial p(x) of degree 1140 or less, stored as
114 // an array of 2T machinewords.
115 // Output: p(x) mod f571(x)
116 //
117 // FOR i = T-1, ..., 0 DO
118 // SET X := P[i+T]
119 // P[i] := P[i] ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15)
120 // P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27)
121 //
122 // SET X := P[T-1] >> 27
123 // P[0] := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10)
124 // P[T-1] := P[T-1] & 0x07ffffff
125 //
126 // RETURN P[T-1],...,P[0]
127 //
128 // -------------------------------------------------------------------------
129 //
130 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module;
131 Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) {
132 varresult;
133
134 if (aValue.bitSize() > 1140) {
135 Clipperz.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation");
136 result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue);
137 } else {
138 varC, T;
139 var i;
140
141 C = aValue._value.slice(0);
142 for (i=35; i>=18; i--) {
143 T = C[i];
144 C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0);
145 C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0);
146 }
147 T = (C[17] >>> 27);
148 C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0);
149 C[17] = (C[17] & 0x07ffffff);
150
151 for(i=18; i<=35; i++) {
152 C[i] = 0;
153 }
154
155 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
156 }
157
158 return result;
159 };
160 }
161
162 return Clipperz.Crypto.ECC.StandardCurves._B571;
163 },
164
165 //-----------------------------------------------------------------------------
166
167 '_B283': null,
168 'B283': function() { //f(z) = z^283 + z^12 + z^7 + z^5 + 1
169 if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) {
170 Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({
171 modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16),
172 a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16),
173 b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16),
174 G: new Clipperz.Crypto.ECC.BinaryField.Point({
175 x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16),
176 y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16)
177 }),
178 r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16),
179 h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16)
180 });
181
182 //-----------------------------------------------------------------------------
183 //
184 //Guide to Elliptic Curve Cryptography
185 //Darrel Hankerson, Alfred Menezes, Scott Vanstone
186 //- Pag: 56, Alorithm 2.43
187 //
188 //-----------------------------------------------------------------------------
189 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module;
190 Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) {
191 varresult;
192
193 if (aValue.bitSize() > 564) {
194 Clipperz.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation");
195 result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue);
196 } else {
197 varC, T;
198 var i;
199
200 C = aValue._value.slice(0);
201 for (i=17; i>=9; i--) {
202 T = C[i];
203 C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0);
204 C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0);
205 }
206 T = (C[8] >>> 27);
207 C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0);
208 C[8] = (C[8] & 0x07ffffff);
209
210 for(i=9; i<=17; i++) {
211 C[i] = 0;
212 }
213
214 result = new Clipperz.Crypto.ECC.BinaryField.Value(C);
215 }
216
217 return result;
218 };
219 }
220
221 return Clipperz.Crypto.ECC.StandardCurves._B283;
222 },
223
224 //==============================================================================
225 __syntaxFix__: "syntax fix"
226});
227
228
229
diff --git a/frontend/delta/js/Clipperz/Crypto/PRNG.js b/frontend/delta/js/Clipperz/Crypto/PRNG.js
new file mode 100644
index 0000000..c539f06
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/PRNG.js
@@ -0,0 +1,841 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) {
29 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!";
30}
31
32try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) {
33 throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!";
34}
35
36if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; }
37
38//#############################################################################
39
40Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) {
41 args = args || {};
42 //MochiKit.Base.bindMethods(this);
43
44 this._stack = new Clipperz.ByteArray();
45 this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256;
46 return this;
47}
48
49Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, {
50
51 'toString': function() {
52 return "Clipperz.Crypto.PRNG.EntropyAccumulator";
53 },
54
55 //-------------------------------------------------------------------------
56
57 'stack': function() {
58 return this._stack;
59 },
60
61 'setStack': function(aValue) {
62 this._stack = aValue;
63 },
64
65 'resetStack': function() {
66 this.stack().reset();
67 },
68
69 'maxStackLengthBeforeHashing': function() {
70 return this._maxStackLengthBeforeHashing;
71 },
72
73 //-------------------------------------------------------------------------
74
75 'addRandomByte': function(aValue) {
76 this.stack().appendByte(aValue);
77
78 if (this.stack().length() > this.maxStackLengthBeforeHashing()) {
79 this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack()));
80 }
81 },
82
83 //-------------------------------------------------------------------------
84 __syntaxFix__: "syntax fix"
85});
86
87//#############################################################################
88
89Clipperz.Crypto.PRNG.RandomnessSource = function(args) {
90 args = args || {};
91 MochiKit.Base.bindMethods(this);
92
93 this._generator = args.generator || null;
94 this._sourceId = args.sourceId || null;
95 this._boostMode = args.boostMode || false;
96
97 this._nextPoolIndex = 0;
98
99 return this;
100}
101
102Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, {
103
104 'generator': function() {
105 return this._generator;
106 },
107
108 'setGenerator': function(aValue) {
109 this._generator = aValue;
110 },
111
112 //-------------------------------------------------------------------------
113
114 'boostMode': function() {
115 return this._boostMode;
116 },
117
118 'setBoostMode': function(aValue) {
119 this._boostMode = aValue;
120 },
121
122 //-------------------------------------------------------------------------
123
124 'sourceId': function() {
125 return this._sourceId;
126 },
127
128 'setSourceId': function(aValue) {
129 this._sourceId = aValue;
130 },
131
132 //-------------------------------------------------------------------------
133
134 'nextPoolIndex': function() {
135 return this._nextPoolIndex;
136 },
137
138 'incrementNextPoolIndex': function() {
139 this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators());
140 },
141
142 //-------------------------------------------------------------------------
143
144 'updateGeneratorWithValue': function(aRandomValue) {
145 if (this.generator() != null) {
146 this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue);
147 this.incrementNextPoolIndex();
148 }
149 },
150
151 //-------------------------------------------------------------------------
152 __syntaxFix__: "syntax fix"
153});
154
155//#############################################################################
156
157Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) {
158 args = args || {};
159 //MochiKit.Base.bindMethods(this);
160
161 this._intervalTime = args.intervalTime || 1000;
162
163 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
164
165 this.collectEntropy();
166 return this;
167}
168
169Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
170
171 'intervalTime': function() {
172 return this._intervalTime;
173 },
174
175 //-------------------------------------------------------------------------
176
177 'collectEntropy': function() {
178 varnow;
179 varentropyByte;
180 var intervalTime;
181 now = new Date();
182 entropyByte = (now.getTime() & 0xff);
183
184 intervalTime = this.intervalTime();
185 if (this.boostMode() == true) {
186 intervalTime = intervalTime / 9;
187 }
188
189 this.updateGeneratorWithValue(entropyByte);
190 setTimeout(this.collectEntropy, intervalTime);
191 },
192
193 //-------------------------------------------------------------------------
194
195 'numberOfRandomBits': function() {
196 return 5;
197 },
198
199 //-------------------------------------------------------------------------
200
201 'pollingFrequency': function() {
202 return 10;
203 },
204
205 //-------------------------------------------------------------------------
206 __syntaxFix__: "syntax fix"
207});
208
209//*****************************************************************************
210
211Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) {
212 args = args || {};
213
214 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
215
216 this._numberOfBitsToCollectAtEachEvent = 4;
217 this._randomBitsCollector = 0;
218 this._numberOfRandomBitsCollected = 0;
219
220 MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy');
221
222 return this;
223}
224
225Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
226
227 //-------------------------------------------------------------------------
228
229 'numberOfBitsToCollectAtEachEvent': function() {
230 return this._numberOfBitsToCollectAtEachEvent;
231 },
232
233 //-------------------------------------------------------------------------
234
235 'randomBitsCollector': function() {
236 return this._randomBitsCollector;
237 },
238
239 'setRandomBitsCollector': function(aValue) {
240 this._randomBitsCollector = aValue;
241 },
242
243 'appendRandomBitsToRandomBitsCollector': function(aValue) {
244 var collectedBits;
245 var numberOfRandomBitsCollected;
246
247 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
248 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
249 this.setRandomBitsCollector(collectetBits);
250 numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent();
251
252 if (numberOfRandomBitsCollected == 8) {
253 this.updateGeneratorWithValue(collectetBits);
254 numberOfRandomBitsCollected = 0;
255 this.setRandomBitsCollector(0);
256 }
257
258 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
259 },
260
261 //-------------------------------------------------------------------------
262
263 'numberOfRandomBitsCollected': function() {
264 return this._numberOfRandomBitsCollected;
265 },
266
267 'setNumberOfRandomBitsCollected': function(aValue) {
268 this._numberOfRandomBitsCollected = aValue;
269 },
270
271 //-------------------------------------------------------------------------
272
273 'collectEntropy': function(anEvent) {
274 var mouseLocation;
275 var randomBit;
276 var mask;
277
278 mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent());
279
280 mouseLocation = anEvent.mouse().client;
281 randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask);
282 this.appendRandomBitsToRandomBitsCollector(randomBit)
283 },
284
285 //-------------------------------------------------------------------------
286
287 'numberOfRandomBits': function() {
288 return 1;
289 },
290
291 //-------------------------------------------------------------------------
292
293 'pollingFrequency': function() {
294 return 10;
295 },
296
297 //-------------------------------------------------------------------------
298 __syntaxFix__: "syntax fix"
299});
300
301//*****************************************************************************
302
303Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) {
304 args = args || {};
305 Clipperz.Crypto.PRNG.RandomnessSource.call(this, args);
306
307 this._randomBitsCollector = 0;
308 this._numberOfRandomBitsCollected = 0;
309
310 MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy');
311
312 return this;
313}
314
315Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, {
316
317 //-------------------------------------------------------------------------
318
319 'randomBitsCollector': function() {
320 return this._randomBitsCollector;
321 },
322
323 'setRandomBitsCollector': function(aValue) {
324 this._randomBitsCollector = aValue;
325 },
326
327 'appendRandomBitToRandomBitsCollector': function(aValue) {
328 var collectedBits;
329 var numberOfRandomBitsCollected;
330
331 numberOfRandomBitsCollected = this.numberOfRandomBitsCollected();
332 collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected);
333 this.setRandomBitsCollector(collectetBits);
334 numberOfRandomBitsCollected ++;
335
336 if (numberOfRandomBitsCollected == 8) {
337 this.updateGeneratorWithValue(collectetBits);
338 numberOfRandomBitsCollected = 0;
339 this.setRandomBitsCollector(0);
340 }
341
342 this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected)
343 },
344
345 //-------------------------------------------------------------------------
346
347 'numberOfRandomBitsCollected': function() {
348 return this._numberOfRandomBitsCollected;
349 },
350
351 'setNumberOfRandomBitsCollected': function(aValue) {
352 this._numberOfRandomBitsCollected = aValue;
353 },
354
355 //-------------------------------------------------------------------------
356
357 'collectEntropy': function(anEvent) {
358/*
359 var mouseLocation;
360 var randomBit;
361
362 mouseLocation = anEvent.mouse().client;
363
364 randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1);
365 this.appendRandomBitToRandomBitsCollector(randomBit);
366*/
367 },
368
369 //-------------------------------------------------------------------------
370
371 'numberOfRandomBits': function() {
372 return 1;
373 },
374
375 //-------------------------------------------------------------------------
376
377 'pollingFrequency': function() {
378 return 10;
379 },
380
381 //-------------------------------------------------------------------------
382 __syntaxFix__: "syntax fix"
383});
384
385//#############################################################################
386
387Clipperz.Crypto.PRNG.Fortuna = function(args) {
388 vari,c;
389
390 args = args || {};
391
392 this._key = args.seed || null;
393 if (this._key == null) {
394 this._counter = 0;
395 this._key = new Clipperz.ByteArray();
396 } else {
397 this._counter = 1;
398 }
399
400 this._aesKey = null;
401
402 this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64;
403 this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32;
404
405 this._accumulators = [];
406 c = this.numberOfEntropyAccumulators();
407 for (i=0; i<c; i++) {
408 this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator());
409 }
410
411 this._randomnessSources = [];
412 this._reseedCounter = 0;
413
414 return this;
415}
416
417Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, {
418
419 'toString': function() {
420 return "Clipperz.Crypto.PRNG.Fortuna";
421 },
422
423 //-------------------------------------------------------------------------
424
425 'key': function() {
426 return this._key;
427 },
428
429 'setKey': function(aValue) {
430 this._key = aValue;
431 this._aesKey = null;
432 },
433
434 'aesKey': function() {
435 if (this._aesKey == null) {
436 this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()});
437 }
438
439 return this._aesKey;
440 },
441
442 'accumulators': function() {
443 return this._accumulators;
444 },
445
446 'firstPoolReseedLevel': function() {
447 return this._firstPoolReseedLevel;
448 },
449
450 //-------------------------------------------------------------------------
451
452 'reseedCounter': function() {
453 return this._reseedCounter;
454 },
455
456 'incrementReseedCounter': function() {
457 this._reseedCounter = this._reseedCounter +1;
458 },
459
460 //-------------------------------------------------------------------------
461
462 'reseed': function() {
463 varnewKeySeed;
464 var reseedCounter;
465 varreseedCounterMask;
466 var i, c;
467
468 newKeySeed = this.key();
469 this.incrementReseedCounter();
470 reseedCounter = this.reseedCounter();
471
472 c = this.numberOfEntropyAccumulators();
473 reseedCounterMask = 0xffffffff >>> (32 - c);
474 for (i=0; i<c; i++) {
475 if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) {
476 newKeySeed.appendBlock(this.accumulators()[i].stack());
477 this.accumulators()[i].resetStack();
478 }
479 }
480
481 if (reseedCounter == 1) {
482 c = this.randomnessSources().length;
483 for (i=0; i<c; i++) {
484 this.randomnessSources()[i].setBoostMode(false);
485 }
486 }
487
488 this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed));
489 if (reseedCounter == 1) {
490Clipperz.log("### PRNG.readyToGenerateRandomBytes");
491 MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes');
492 }
493 MochiKit.Signal.signal(this, 'reseeded');
494 },
495
496 //-------------------------------------------------------------------------
497
498 'isReadyToGenerateRandomValues': function() {
499 return this.reseedCounter() != 0;
500 },
501
502 //-------------------------------------------------------------------------
503
504 'entropyLevel': function() {
505 return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel());
506 },
507
508 //-------------------------------------------------------------------------
509
510 'counter': function() {
511 return this._counter;
512 },
513
514 'incrementCounter': function() {
515 this._counter += 1;
516 },
517
518 'counterBlock': function() {
519 var result;
520
521 result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0);
522
523 return result;
524 },
525
526 //-------------------------------------------------------------------------
527
528 'getRandomBlock': function() {
529 var result;
530
531 result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues()));
532 this.incrementCounter();
533
534 return result;
535 },
536
537 //-------------------------------------------------------------------------
538
539 'getRandomBytes': function(aSize) {
540 var result;
541
542 if (this.isReadyToGenerateRandomValues()) {
543 var i,c;
544 var newKey;
545
546 result = new Clipperz.ByteArray();
547
548 c = Math.ceil(aSize / (128 / 8));
549 for (i=0; i<c; i++) {
550 result.appendBlock(this.getRandomBlock());
551 }
552
553 if (result.length() != aSize) {
554 result = result.split(0, aSize);
555 }
556
557 newKey = this.getRandomBlock().appendBlock(this.getRandomBlock());
558 this.setKey(newKey);
559 } else {
560Clipperz.logWarning("Fortuna generator has not enough entropy, yet!");
561 throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy;
562 }
563
564 return result;
565 },
566
567 //-------------------------------------------------------------------------
568
569 'addRandomByte': function(aSourceId, aPoolId, aRandomValue) {
570 varselectedAccumulator;
571
572 selectedAccumulator = this.accumulators()[aPoolId];
573 selectedAccumulator.addRandomByte(aRandomValue);
574
575 if (aPoolId == 0) {
576 MochiKit.Signal.signal(this, 'addedRandomByte')
577 if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) {
578 this.reseed();
579 }
580 }
581 },
582
583 //-------------------------------------------------------------------------
584
585 'numberOfEntropyAccumulators': function() {
586 return this._numberOfEntropyAccumulators;
587 },
588
589 //-------------------------------------------------------------------------
590
591 'randomnessSources': function() {
592 return this._randomnessSources;
593 },
594
595 'addRandomnessSource': function(aRandomnessSource) {
596 aRandomnessSource.setGenerator(this);
597 aRandomnessSource.setSourceId(this.randomnessSources().length);
598 this.randomnessSources().push(aRandomnessSource);
599
600 if (this.isReadyToGenerateRandomValues() == false) {
601 aRandomnessSource.setBoostMode(true);
602 }
603 },
604
605 //-------------------------------------------------------------------------
606
607 'deferredEntropyCollection': function(aValue) {
608 var result;
609
610
611 if (this.isReadyToGenerateRandomValues()) {
612 result = aValue;
613 } else {
614 var deferredResult;
615
616 deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection");
617 deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue));
618 MochiKit.Signal.connect(this,
619 'readyToGenerateRandomBytes',
620 deferredResult,
621 'callback');
622
623 result = deferredResult;
624 }
625
626 return result;
627 },
628
629 //-------------------------------------------------------------------------
630
631 'fastEntropyAccumulationForTestingPurpose': function() {
632 while (! this.isReadyToGenerateRandomValues()) {
633 this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256));
634 }
635 },
636
637 //-------------------------------------------------------------------------
638
639 'dump': function(appendToDoc) {
640 var tbl;
641 var i,c;
642
643 tbl = document.createElement("table");
644 tbl.border = 0;
645 with (tbl.style) {
646 border = "1px solid lightgrey";
647 fontFamily = 'Helvetica, Arial, sans-serif';
648 fontSize = '8pt';
649 //borderCollapse = "collapse";
650 }
651 var hdr = tbl.createTHead();
652 var hdrtr = hdr.insertRow(0);
653 // document.createElement("tr");
654 {
655 var ntd;
656
657 ntd = hdrtr.insertCell(0);
658 ntd.style.borderBottom = "1px solid lightgrey";
659 ntd.style.borderRight = "1px solid lightgrey";
660 ntd.appendChild(document.createTextNode("#"));
661
662 ntd = hdrtr.insertCell(1);
663 ntd.style.borderBottom = "1px solid lightgrey";
664 ntd.style.borderRight = "1px solid lightgrey";
665 ntd.appendChild(document.createTextNode("s"));
666
667 ntd = hdrtr.insertCell(2);
668 ntd.colSpan = this.firstPoolReseedLevel();
669 ntd.style.borderBottom = "1px solid lightgrey";
670 ntd.style.borderRight = "1px solid lightgrey";
671 ntd.appendChild(document.createTextNode("base values"));
672
673 ntd = hdrtr.insertCell(3);
674 ntd.colSpan = 20;
675 ntd.style.borderBottom = "1px solid lightgrey";
676 ntd.appendChild(document.createTextNode("extra values"));
677
678 }
679
680 c = this.accumulators().length;
681 for (i=0; i<c ; i++) {
682 varcurrentAccumulator;
683 var bdytr;
684 var bdytd;
685 var ii, cc;
686
687 currentAccumulator = this.accumulators()[i]
688
689 bdytr = tbl.insertRow(true);
690
691 bdytd = bdytr.insertCell(0);
692 bdytd.style.borderRight = "1px solid lightgrey";
693 bdytd.style.color = "lightgrey";
694 bdytd.appendChild(document.createTextNode("" + i));
695
696 bdytd = bdytr.insertCell(1);
697 bdytd.style.borderRight = "1px solid lightgrey";
698 bdytd.style.color = "gray";
699 bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length()));
700
701
702 cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel());
703 for (ii=0; ii<cc; ii++) {
704 var cellText;
705
706 bdytd = bdytr.insertCell(ii + 2);
707
708 if (ii < currentAccumulator.stack().length()) {
709 cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii));
710 } else {
711 cellText = "_";
712 }
713
714 if (ii == (this.firstPoolReseedLevel() - 1)) {
715 bdytd.style.borderRight = "1px solid lightgrey";
716 }
717
718 bdytd.appendChild(document.createTextNode(cellText));
719 }
720
721 }
722
723
724 if (appendToDoc) {
725 var ne = document.createElement("div");
726 ne.id = "entropyGeneratorStatus";
727 with (ne.style) {
728 fontFamily = "Courier New, monospace";
729 fontSize = "12px";
730 lineHeight = "16px";
731 borderTop = "1px solid black";
732 padding = "10px";
733 }
734 if (document.getElementById(ne.id)) {
735 MochiKit.DOM.swapDOM(ne.id, ne);
736 } else {
737 document.body.appendChild(ne);
738 }
739 ne.appendChild(tbl);
740 }
741
742 return tbl;
743 },
744
745 //-----------------------------------------------------------------------------
746 __syntaxFix__: "syntax fix"
747});
748
749//#############################################################################
750
751Clipperz.Crypto.PRNG.Random = function(args) {
752 args = args || {};
753 //MochiKit.Base.bindMethods(this);
754
755 return this;
756}
757
758Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, {
759
760 'toString': function() {
761 return "Clipperz.Crypto.PRNG.Random";
762 },
763
764 //-------------------------------------------------------------------------
765
766 'getRandomBytes': function(aSize) {
767//Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes");
768 varresult;
769 var i,c;
770
771 result = new Clipperz.ByteArray()
772 c = aSize || 1;
773 for (i=0; i<c; i++) {
774 result.appendByte((Math.random()*255) & 0xff);
775 }
776
777//Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes");
778 return result;
779 },
780
781 //-------------------------------------------------------------------------
782 __syntaxFix__: "syntax fix"
783});
784
785//#############################################################################
786
787_clipperz_crypt_prng_defaultPRNG = null;
788
789Clipperz.Crypto.PRNG.defaultRandomGenerator = function() {
790 if (_clipperz_crypt_prng_defaultPRNG == null) {
791 _clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna();
792
793 //.............................................................
794 //
795 // TimeRandomnessSource
796 //
797 //.............................................................
798 {
799 var newRandomnessSource;
800
801 newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111});
802 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
803 }
804
805 //.............................................................
806 //
807 // MouseRandomnessSource
808 //
809 //.............................................................
810 {
811 varnewRandomnessSource;
812
813 newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource();
814 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
815 }
816
817 //.............................................................
818 //
819 // KeyboardRandomnessSource
820 //
821 //.............................................................
822 {
823 varnewRandomnessSource;
824
825 newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource();
826 _clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource);
827 }
828
829 }
830
831 return _clipperz_crypt_prng_defaultPRNG;
832};
833
834//#############################################################################
835
836Clipperz.Crypto.PRNG.exception = {
837 NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")
838};
839
840
841MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator);
diff --git a/frontend/delta/js/Clipperz/Crypto/RSA.js b/frontend/delta/js/Clipperz/Crypto/RSA.js
new file mode 100644
index 0000000..5a480f1
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/RSA.js
@@ -0,0 +1,146 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!";
26}
27
28if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; }
29
30Clipperz.Crypto.RSA.VERSION = "0.1";
31Clipperz.Crypto.RSA.NAME = "Clipperz.RSA";
32
33//#############################################################################
34
35MochiKit.Base.update(Clipperz.Crypto.RSA, {
36
37 //-------------------------------------------------------------------------
38
39 'publicKeyWithValues': function (e, d, n) {
40 varresult;
41
42 result = {};
43
44 if (e.isBigInt) {
45 result.e = e;
46 } else {
47 result.e = new Clipperz.Crypto.BigInt(e, 16);
48 }
49
50 if (d.isBigInt) {
51 result.d = d;
52 } else {
53 result.d = new Clipperz.Crypto.BigInt(d, 16);
54 }
55
56 if (n.isBigInt) {
57 result.n = n;
58 } else {
59 result.n = new Clipperz.Crypto.BigInt(n, 16);
60 }
61
62 return result;
63 },
64
65 'privateKeyWithValues': function(e, d, n) {
66 return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
67 },
68
69 //-----------------------------------------------------------------------------
70
71 'encryptUsingPublicKey': function (aKey, aMessage) {
72 varmessageValue;
73 varresult;
74
75 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
76 result = messageValue.powerModule(aKey.e, aKey.n);
77
78 return result.asString(16);
79 },
80
81 //.............................................................................
82
83 'decryptUsingPublicKey': function (aKey, aMessage) {
84 return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage);
85 },
86
87 //-----------------------------------------------------------------------------
88
89 'encryptUsingPrivateKey': function (aKey, aMessage) {
90 varmessageValue;
91 varresult;
92
93 messageValue = new Clipperz.Crypto.BigInt(aMessage, 16);
94 result = messageValue.powerModule(aKey.d, aKey.n);
95
96 return result.asString(16);
97 },
98
99 //.............................................................................
100
101 'decryptUsingPrivateKey': function (aKey, aMessage) {
102 return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage);
103 },
104
105 //-----------------------------------------------------------------------------
106
107 'generatePublicKey': function(aNumberOfBits) {
108 varresult;
109 vare;
110 vard;
111 varn;
112
113 e = new Clipperz.Crypto.BigInt("10001", 16);
114
115 {
116 var p, q;
117 varphi;
118
119 do {
120 p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
121 } while (p.module(e).equals(1));
122
123 do {
124 q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits);
125 } while ((q.equals(p)) || (q.module(e).equals(1)));
126
127 n = p.multiply(q);
128 phi = (p.subtract(1).multiply(q.subtract(1)));
129 d = e.powerModule(-1, phi);
130 }
131
132 result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n);
133
134 return result;
135 },
136
137 //-------------------------------------------------------------------------
138
139 __syntaxFix__: "syntax fix"
140
141 //-------------------------------------------------------------------------
142
143});
144
145//#############################################################################
146
diff --git a/frontend/delta/js/Clipperz/Crypto/SHA.js b/frontend/delta/js/Clipperz/Crypto/SHA.js
new file mode 100644
index 0000000..f8bfe6e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/SHA.js
@@ -0,0 +1,296 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; }
29if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; }
30
31Clipperz.Crypto.SHA.VERSION = "0.3";
32Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA";
33
34MochiKit.Base.update(Clipperz.Crypto.SHA, {
35
36 '__repr__': function () {
37 return "[" + this.NAME + " " + this.VERSION + "]";
38 },
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-----------------------------------------------------------------------------
45
46 'rotateRight': function(aValue, aNumberOfBits) {
47//Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight");
48 var result;
49
50 result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits));
51
52//Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight");
53 return result;
54 },
55
56 'shiftRight': function(aValue, aNumberOfBits) {
57//Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight");
58 var result;
59
60 result = aValue >>> aNumberOfBits;
61
62//Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight");
63 return result;
64 },
65
66 //-----------------------------------------------------------------------------
67
68 'safeAdd': function() {
69//Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd");
70 varresult;
71 vari, c;
72
73 result = arguments[0];
74 c = arguments.length;
75 for (i=1; i<c; i++) {
76 varlowerBytesSum;
77
78 lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff);
79 result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff);
80 }
81
82//Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd");
83 return result;
84 },
85
86 //-----------------------------------------------------------------------------
87
88 'sha256_array': function(aValue) {
89//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array");
90 varresult;
91 varmessage;
92 var h0, h1, h2, h3, h4, h5, h6, h7;
93 vark;
94 varmessageLength;
95 varmessageLengthInBits;
96 var_i, _c;
97 var charBits;
98 var rotateRight;
99 var shiftRight;
100 var safeAdd;
101 varbytesPerBlock;
102 var currentMessageIndex;
103
104 bytesPerBlock = 512/8;
105 rotateRight = Clipperz.Crypto.SHA.rotateRight;
106 shiftRight = Clipperz.Crypto.SHA.shiftRight;
107 safeAdd = Clipperz.Crypto.SHA.safeAdd;
108
109 charBits = 8;
110
111 h0 = 0x6a09e667;
112 h1 = 0xbb67ae85;
113 h2 = 0x3c6ef372;
114 h3 = 0xa54ff53a;
115 h4 = 0x510e527f;
116 h5 = 0x9b05688c;
117 h6 = 0x1f83d9ab;
118 h7 = 0x5be0cd19;
119
120 k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
121 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
122 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
123 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
124 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
125 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
126 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
127 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
128
129 message = aValue;
130 messageLength = message.length;
131
132 //Pre-processing:
133 message.push(0x80); //append a single "1" bit to message
134
135 _c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits;
136 if (_c < 0) {
137 _c = _c + (512 / charBits);
138 }
139
140 for (_i=0; _i<_c; _i++) {
141 message.push(0x00); //append "0" bits until message length ≡ 448 ≡ -64 (mod 512)
142 }
143
144 messageLengthInBits = messageLength * charBits;
145 message.push(0x00); //the 4 most high byte are alway 0 as message length is represented with a 32bit value;
146 message.push(0x00);
147 message.push(0x00);
148 message.push(0x00);
149 message.push((messageLengthInBits >> 24)& 0xff);
150 message.push((messageLengthInBits >> 16)& 0xff);
151 message.push((messageLengthInBits >> 8) & 0xff);
152 message.push( messageLengthInBits & 0xff);
153
154 currentMessageIndex = 0;
155 while(currentMessageIndex < message.length) {
156 varw;
157 vara, b, c, d, e, f, g, h;
158
159 w = Array(64);
160
161 _c = 16;
162 for (_i=0; _i<_c; _i++) {
163 var _j;
164
165 _j = currentMessageIndex + _i*4;
166 w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0);
167 }
168
169 _c = 64;
170 for (_i=16; _i<_c; _i++) {
171 vars0, s1;
172
173 s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3));
174 s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10));
175 w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1);
176 }
177
178 a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7;
179
180 _c = 64;
181 for (_i=0; _i<_c; _i++) {
182 var s0, s1, ch, maj, t1, t2;
183
184 s0 = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22));
185 maj = (a & b) ^ (a & c) ^ (b & c);
186 t2 = safeAdd(s0, maj);
187 s1 = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25));
188 ch = (e & f) ^ ((~e) & g);
189 t1 = safeAdd(h, s1, ch, k[_i], w[_i]);
190
191 h = g;
192 g = f;
193 f = e;
194 e = safeAdd(d, t1);
195 d = c;
196 c = b;
197 b = a;
198 a = safeAdd(t1, t2);
199 }
200
201 h0 = safeAdd(h0, a);
202 h1 = safeAdd(h1, b);
203 h2 = safeAdd(h2, c);
204 h3 = safeAdd(h3, d);
205 h4 = safeAdd(h4, e);
206 h5 = safeAdd(h5, f);
207 h6 = safeAdd(h6, g);
208 h7 = safeAdd(h7, h);
209
210 currentMessageIndex += bytesPerBlock;
211 }
212
213 result = new Array(256/8);
214 result[0] = (h0 >> 24)& 0xff;
215 result[1] = (h0 >> 16)& 0xff;
216 result[2] = (h0 >> 8)& 0xff;
217 result[3] = h0 & 0xff;
218
219 result[4] = (h1 >> 24)& 0xff;
220 result[5] = (h1 >> 16)& 0xff;
221 result[6] = (h1 >> 8)& 0xff;
222 result[7] = h1 & 0xff;
223
224 result[8] = (h2 >> 24)& 0xff;
225 result[9] = (h2 >> 16)& 0xff;
226 result[10] = (h2 >> 8)& 0xff;
227 result[11] = h2 & 0xff;
228
229 result[12] = (h3 >> 24)& 0xff;
230 result[13] = (h3 >> 16)& 0xff;
231 result[14] = (h3 >> 8)& 0xff;
232 result[15] = h3 & 0xff;
233
234 result[16] = (h4 >> 24)& 0xff;
235 result[17] = (h4 >> 16)& 0xff;
236 result[18] = (h4 >> 8)& 0xff;
237 result[19] = h4 & 0xff;
238
239 result[20] = (h5 >> 24)& 0xff;
240 result[21] = (h5 >> 16)& 0xff;
241 result[22] = (h5 >> 8)& 0xff;
242 result[23] = h5 & 0xff;
243
244 result[24] = (h6 >> 24)& 0xff;
245 result[25] = (h6 >> 16)& 0xff;
246 result[26] = (h6 >> 8)& 0xff;
247 result[27] = h6 & 0xff;
248
249 result[28] = (h7 >> 24)& 0xff;
250 result[29] = (h7 >> 16)& 0xff;
251 result[30] = (h7 >> 8)& 0xff;
252 result[31] = h7 & 0xff;
253
254//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array");
255 return result;
256 },
257
258 //-----------------------------------------------------------------------------
259
260 'sha256': function(aValue) {
261//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256");
262 var result;
263 var resultArray;
264 varvalueArray;
265
266 valueArray = aValue.arrayValues();
267 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
268
269 result = new Clipperz.ByteArray(resultArray);
270
271//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
272 return result;
273 },
274
275 //-----------------------------------------------------------------------------
276
277 'sha_d256': function(aValue) {
278//Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256");
279 var result;
280 var resultArray;
281 varvalueArray;
282
283 valueArray = aValue.arrayValues();
284 resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray);
285 resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray);
286
287 result = new Clipperz.ByteArray(resultArray);
288
289//Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256");
290 return result;
291 },
292
293 //-----------------------------------------------------------------------------
294 __syntaxFix__: "syntax fix"
295
296});
diff --git a/frontend/delta/js/Clipperz/Crypto/SRP.js b/frontend/delta/js/Clipperz/Crypto/SRP.js
new file mode 100644
index 0000000..597e72d
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Crypto/SRP.js
@@ -0,0 +1,316 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!";
26}
27
28try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) {
29 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!";
30}
31
32try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) {
33 throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!";
34}
35
36if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; }
37
38Clipperz.Crypto.SRP.VERSION = "0.1";
39Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP";
40
41//#############################################################################
42
43MochiKit.Base.update(Clipperz.Crypto.SRP, {
44
45 '_n': null,
46 '_g': null,
47 //-------------------------------------------------------------------------
48
49 'n': function() {
50 if (Clipperz.Crypto.SRP._n == null) {
51 Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16);
52 }
53
54 return Clipperz.Crypto.SRP._n;
55 },
56
57 //-------------------------------------------------------------------------
58
59 'g': function() {
60 if (Clipperz.Crypto.SRP._g == null) {
61 Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2); //eventually 5 (as suggested on the Diffi-Helmann documentation)
62 }
63
64 return Clipperz.Crypto.SRP._g;
65 },
66
67 //-----------------------------------------------------------------------------
68
69 'exception': {
70 'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")
71 },
72
73 //-------------------------------------------------------------------------
74 __syntaxFix__: "syntax fix"
75
76});
77
78//#############################################################################
79//
80 // S R P C o n n e c t i o n version 1.0
81//
82//=============================================================================
83Clipperz.Crypto.SRP.Connection = function (args) {
84 args = args || {};
85
86 this._C = args.C;
87 this._P = args.P;
88 this.hash = args.hash;
89
90 this._a = null;
91 this._A = null;
92
93 this._s = null;
94 this._B = null;
95
96 this._x = null;
97
98 this._u = null;
99 this._K = null;
100 this._M1 = null;
101 this._M2 = null;
102
103 this._sessionKey = null;
104
105 return this;
106}
107
108Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, {
109
110 'toString': function () {
111 return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription();
112 },
113
114 //-------------------------------------------------------------------------
115
116 'C': function () {
117 return this._C;
118 },
119
120 //-------------------------------------------------------------------------
121
122 'P': function () {
123 return this._P;
124 },
125
126 //-------------------------------------------------------------------------
127
128 'a': function () {
129 if (this._a == null) {
130 this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16);
131 // this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10);
132 }
133
134 return this._a;
135 },
136
137 //-------------------------------------------------------------------------
138
139 'A': function () {
140 if (this._A == null) {
141 //Warning: this value should be strictly greater than zero: how should we perform this check?
142 this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n());
143
144 if (this._A.equals(0)) {
145 Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0.");
146 throw Clipperz.Crypto.SRP.exception.InvalidValue;
147 }
148 }
149
150 return this._A;
151 },
152
153 //-------------------------------------------------------------------------
154
155 's': function () {
156 return this._s;
157 },
158
159 'set_s': function(aValue) {
160 this._s = aValue;
161 },
162
163 //-------------------------------------------------------------------------
164
165 'B': function () {
166 return this._B;
167 },
168
169 'set_B': function(aValue) {
170 //Warning: this value should be strictly greater than zero: how should we perform this check?
171 if (! aValue.equals(0)) {
172 this._B = aValue;
173 } else {
174 Clipperz.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0.");
175 throw Clipperz.Crypto.SRP.exception.InvalidValue;
176 }
177 },
178
179 //-------------------------------------------------------------------------
180
181 'x': function () {
182 if (this._x == null) {
183 this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16);
184 }
185
186 return this._x;
187 },
188
189 //-------------------------------------------------------------------------
190
191 'u': function () {
192 if (this._u == null) {
193 this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16);
194 }
195
196 return this._u;
197 },
198
199 //-------------------------------------------------------------------------
200
201 'S': function () {
202 if (this._S == null) {
203 var bigint;
204 varsrp;
205
206 bigint = Clipperz.Crypto.BigInt;
207 srp = Clipperz.Crypto.SRP;
208
209 this._S =bigint.powerModule(
210 bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())),
211 bigint.add(this.a(), bigint.multiply(this.u(), this.x())),
212 srp.n()
213 )
214 }
215
216 return this._S;
217 },
218
219 //-------------------------------------------------------------------------
220
221 'K': function () {
222 if (this._K == null) {
223 this._K = this.stringHash(this.S().asString());
224 }
225
226 return this._K;
227 },
228
229 //-------------------------------------------------------------------------
230
231 'M1': function () {
232 if (this._M1 == null) {
233 this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K());
234 }
235
236 return this._M1;
237 },
238
239 //-------------------------------------------------------------------------
240
241 'M2': function () {
242 if (this._M2 == null) {
243 this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K());
244 }
245
246 return this._M2;
247 },
248
249 //=========================================================================
250
251 'serverSideCredentialsWithSalt': function(aSalt) {
252 var result;
253 var s, x, v;
254
255 s = aSalt;
256 x = this.stringHash(s + this.P());
257 v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n());
258
259 result = {};
260 result['C'] = this.C();
261 result['s'] = s;
262 result['v'] = v.asString(16);
263
264 return result;
265 },
266
267 'serverSideCredentials': function() {
268 var result;
269 var s;
270
271 s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
272
273 result = this.serverSideCredentialsWithSalt(s);
274
275 return result;
276 },
277
278 //=========================================================================
279/*
280 'computeServerSide_S': function(b) {
281 var result;
282 var v;
283 var bigint;
284 varsrp;
285
286 bigint = Clipperz.Crypto.BigInt;
287 srp = Clipperz.Crypto.SRP;
288
289 v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16);
290 // _S = (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n());
291 result = bigint.powerModule(
292 bigint.multiply(
293 this.A(),
294 bigint.powerModule(v, this.u(), srp.n())
295 ), new Clipperz.Crypto.BigInt(b, 10), srp.n()
296 );
297
298 return result;
299 },
300*/
301 //=========================================================================
302
303 'stringHash': function(aValue) {
304 varresult;
305
306 result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2);
307
308 return result;
309 },
310
311 //=========================================================================
312 __syntaxFix__: "syntax fix"
313
314});
315
316//#############################################################################
diff --git a/frontend/delta/js/Clipperz/DOM.js b/frontend/delta/js/Clipperz/DOM.js
new file mode 100644
index 0000000..1d52a4b
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/DOM.js
@@ -0,0 +1,134 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; }
26
27Clipperz.DOM.VERSION = "0.1";
28Clipperz.DOM.NAME = "Clipperz.DOM";
29
30MochiKit.Base.update(Clipperz.DOM, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'selectOptionMatchingValue': function (aSelectElement, aValue, shouldUseCaseInsensitiveTest) {
47 var selectedOptionIndex;
48 var i, c;
49
50 selectedOptionIndex = -1;
51
52 c = aSelectElement.options.length;
53 for (i=0; (i<c) && (selectedOptionIndex == -1); i++) {
54 if (shouldUseCaseInsensitiveTest == true) {
55 if (aSelectElement.options[i].value.toLowerCase() == aValue.toLowerCase()) {
56 selectedOptionIndex = i;
57 }
58 } else {
59 if (aSelectElement.options[i].value == aValue) {
60 selectedOptionIndex = i;
61 }
62 }
63 }
64
65 if (selectedOptionIndex != -1) {
66 aSelectElement.selectedIndex = selectedOptionIndex;
67 }
68 },
69
70 //-------------------------------------------------------------------------
71
72 'setFormContents': function(aNode, someValues) {
73 var node;
74 var values;
75 var i, c;
76
77 values = {};
78 c = someValues[0].length;
79 for (i=0; i<c; i++) {
80 values[someValues[0][i]] = someValues[1][i];
81 }
82
83 // var m = MochiKit.Base;
84 // var self = MochiKit.DOM;
85 if (typeof(aNode) == "undefined" || aNode === null) {
86 node = MochiKit.DOM._document.body;
87 } else {
88 node = MochiKit.DOM.getElement(aNode);
89 }
90
91 MochiKit.Base.nodeWalk(node, function(aNode) {
92 var result;
93 var name;
94
95 result = null;
96 name = aNode.name;
97 if (MochiKit.Base.isNotEmpty(name) && (typeof(values[name]) != 'undefined')) {
98 var tagName;
99
100 tagName = aNode.tagName.toUpperCase();
101 if (tagName === "INPUT" && (aNode.type == "radio" || aNode.type == "checkbox")) {
102 aNode.checked = values[name];
103 } else if (tagName === "SELECT") {
104 if (aNode.type == "select-one") {
105 Clipperz.DOM.selectOptionMatchingValue(aNode, values[name]);
106 } else { //aNode.type == "select-multiple"
107 Clipperz.logWarning("### unhandled Select.type = 'select-multiple' condition");
108 }
109 } else if (tagName === "FORM" || tagName === "P" || tagName === "SPAN" || tagName === "DIV") {
110 result = aNode.childNodes;
111 } else {
112 aNode.value = values[name]
113 }
114 } else {
115 result = aNode.childNodes;
116 }
117
118 return result;
119 });
120 },
121
122 //-------------------------------------------------------------------------
123
124 'get': MochiKit.DOM.getElement,
125
126 //-------------------------------------------------------------------------
127
128 'Helper': Clipperz.YUI.DomHelper,
129
130 //-------------------------------------------------------------------------
131 __syntaxFix__: "syntax fix"
132
133});
134
diff --git a/frontend/delta/js/Clipperz/Date.js b/frontend/delta/js/Clipperz/Date.js
new file mode 100644
index 0000000..163790e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Date.js
@@ -0,0 +1,297 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; }
26
27Clipperz.Date.VERSION = "0.1";
28Clipperz.Date.NAME = "Clipperz.Date";
29
30MochiKit.Base.update(Clipperz.Date, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'daysInMonth': [31,28,31,30,31,30,31,31,30,31,30,31],
47
48 //-------------------------------------------------------------------------
49
50 'englishOrdinalDaySuffixForDate': function(aDate) {
51 var result;
52
53 switch (aDate.getDate()) {
54 case 1:
55 case 21:
56 case 31:
57 result = "st";
58 break;
59 case 2:
60 case 22:
61 result = "nd";
62 break;
63 case 3:
64 case 23:
65 result = "rd";
66 break;
67 default:
68 result = "th";
69 break;
70 }
71
72 return result;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'isLeapYear': function(aDate) {
78 var year;
79 var result;
80
81 year = aDate.getFullYear();
82 result = ((year & 0x03) == 0 && (year % 100 || (year % 400 == 0 && year)));
83
84 return result;
85 },
86
87 //-------------------------------------------------------------------------
88
89 'getDaysInMonth': function(aDate) {
90 var result;
91
92 if (aDate.getMonth() == 1) {
93 Clipperz.Date.isLeapYear(aDate)
94 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
95 } else {
96 result = Clipperz.Date.daysInMonth[aDate.getMonth()];
97 }
98
99 return result;
100 },
101
102 //-------------------------------------------------------------------------
103
104 'getTimezone': function(aDate) {
105 var result;
106
107 result = aDate.toString();
108 result = result.replace(/([A-Z]{3}) [0-9]{4}/, '$1');
109 result = result.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
110
111 return result;
112 },
113
114 'getGMTOffset': function(aDate) {
115 return (aDate.getTimezoneOffset() > 0 ? "-" : "+")+ MochiKit.Format.numberFormatter('00')(Math.floor(this.getTimezoneOffset() / 60))
116 + MochiKit.Format.numberFormatter('00')(this.getTimezoneOffset() % 60);
117 },
118
119 //-------------------------------------------------------------------------
120
121 'dayOfYear': function(aDate) {
122 var result;
123 var i,c;
124
125 result = 0;
126 c = aDate.getMonth();
127 for (i=0; i<c; i++) {
128 if (i == 1) {
129 result += Clipperz.Date.isLeapYear(aDate) ? 29 : 28;
130 } else {
131 result += Clipperz.Date.daysInMonth[i];
132 }
133 }
134 return num + this.getDate() - 1;
135 },
136
137 //-------------------------------------------------------------------------
138
139 'getPHPLikeFormatCode': function(aCharacter) {
140 var result;
141
142 switch (aCharacter) {
143 case "d":
144 result = " + MochiKit.Format.numberFormatter('00')(aDate.getDate())";
145 break;
146 case "D":
147 result = " + aLocale['shortDays'][aDate.getDay()]";
148 break;
149 case "j":
150 result = " + aDate.getDate()";
151 break;
152 case "l":
153 result = " + aLocale['days'][aDate.getDay()]";
154 break;
155 case "S":
156 result = " + Clipperz.Date.englishOrdinalDaySuffixForDate(aDate)";
157 break;
158 case "w":
159 result = " + aDate.getDay()";
160 break;
161 case "z":
162 result = " + aDate.getDayOfYear()";
163 break;
164 case "W":
165 result = " + aDate.getWeekOfYear()";
166 break;
167 case "F":
168 result = " + aLocale['months'][aDate.getMonth()]";
169 break;
170 case "m":
171 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMonth() + 1)";
172 break;
173 case "M":
174 result = " + aLocale['shortMonths'][aDate.getMonth()]";
175 break;
176 case "n":
177 result = " + (aDate.getMonth() + 1)";
178 break;
179 case "t":
180 result = " + Clipperz.Date.getDaysInMonth(aDate)";
181 break;
182 case "L":
183 result = " + (Clipperz.Date.isLeapYear(aDate) ? 1 : 0)";
184 break;
185 case "Y":
186 result = " + aDate.getFullYear()";
187 break;
188 case "y":
189 result = " + ('' + aDate.getFullYear()).substring(2, 4)";
190 break;
191 case "a":
192 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'] : aLocale['pmDesignation'])";
193 break;
194 case "A":
195 result = " + (aDate.getHours() < 12 ? aLocale['amDesignation'].toUpperCase() : aLocale['pmDesignation'].toUpperCase())";
196 break;
197 case "g":
198 result = " + ((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
199 break;
200 case "G":
201 result = " + aDate.getHours()";
202 break;
203 case "h":
204 result = " + MochiKit.Format.numberFormatter('00')((aDate.getHours() %12) ? aDate.getHours() % 12 : 12)";
205 break;
206 case "H":
207 result = " + MochiKit.Format.numberFormatter('00')(aDate.getHours())";
208 break;
209 case "i":
210 result = " + MochiKit.Format.numberFormatter('00')(aDate.getMinutes())";
211 break;
212 case "s":
213 result = " + MochiKit.Format.numberFormatter('00')(aDate.getSeconds())";
214 break;
215 case "O":
216 result = " + aDate.getGMTOffset()";
217 break;
218 case "T":
219 result = " + Clipperz.Date.getTimezone(aDate)";
220 break;
221 case "Z":
222 result = " + ( + aDate.getTimezoneOffset() * -60)";
223 break;
224 default:
225 result = " + '" + aCharacter + "'";
226 break;
227 };
228
229 return result;
230 },
231
232 //=========================================================================
233
234 'formatDateWithPHPLikeTemplateAndLocale': function(aDate, aFormat, aLocale) {
235 var result;
236 var formatterCode;
237 var formatter;
238 var i,c;
239
240 formatterCode = "Clipperz.Date.__scratchFormatter = function(aDate, aLocale){return ''";
241
242 c = aFormat.length;
243 i = 0;
244
245 while (i<c) {
246 var character;
247
248 character = aFormat.charAt(i);
249 if (character == "\\") {
250 i++;
251 character = aFormat.charAt(i);
252 formatterCode += " + '" + character + "'"
253 } else {
254 formatterCode += Clipperz.Date.getPHPLikeFormatCode(character);
255 }
256
257 i++;
258 }
259
260 formatterCode += ";}";
261 eval(formatterCode);
262
263 result = Clipperz.Date.__scratchFormatter.call(this, aDate, aLocale);
264 delete Clipperz.Date.__scratchFormatter;
265
266 return result;
267 },
268
269 //-------------------------------------------------------------------------
270
271 'parseDateWithPHPLikeTemplateAndLocale': function(aString, aFormat, aLocale) {
272 return new Date();
273 },
274
275 //=========================================================================
276
277 'formatDateWithUTCFormatAndLocale': function(aDate, aLocale) {
278 // return Clipperz.Date.formatWithJavaLikeTemplateAndLocale(aDate, "EEE, dd MMMM yyyy HH:mm:ss zzz", aLocale);
279 return aDate.toString();
280 },
281
282 'parseDateWithUTCFormatAndLocale': function(aValue, aLocale) {
283 return new Date(Date.parse(aValue));
284 },
285
286 //=========================================================================
287
288 'exception': {
289 // 'AbstractMethod': new MochiKit.Base.NamedError("Clipperz.Base.exception.AbstractMethod"),
290 // 'UnknownType': new MochiKit.Base.NamedError("Clipperz.Base.exception.UnknownType")
291 },
292
293 //-------------------------------------------------------------------------
294 __syntaxFix__: "syntax fix"
295
296});
297
diff --git a/frontend/delta/js/Clipperz/KeePassExportProcessor.js b/frontend/delta/js/Clipperz/KeePassExportProcessor.js
new file mode 100644
index 0000000..e35d729
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/KeePassExportProcessor.js
@@ -0,0 +1,191 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25
26
27Clipperz.KeePassExportProcessor = function(args) {
28 args = args || {};
29
30 return this;
31}
32
33//=============================================================================
34
35Clipperz.KeePassExportProcessor.prototype = MochiKit.Base.update(null, {
36
37 //-------------------------------------------------------------------------
38
39 'deferredParse_core': function(aContext) {
40 var deferredResult;
41
42 if (aContext.line == "") {
43 deferredResult = MochiKit.Async.succeed(aContext.result);
44 } else {
45 var record;
46
47 record = this.parseRecord(aContext);
48 if (record != null) {
49 aContext.result.push(record);
50 }
51
52 aContext.line = aContext.line.replace(/^\n*/g, "").replace(/\n$/g, "");
53
54 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredParse_core");
55 deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'importProcessorProgressUpdate', {status:'processing', size:aContext.size, progress:(aContext.size - aContext.line.length)});
56 deferredResult.addCallback(MochiKit.Async.wait, 0.2);
57 deferredResult.addMethod(this, 'deferredParse_core');
58 deferredResult.callback(aContext);
59 }
60
61 return deferredResult;
62 },
63
64 //.........................................................................
65
66 'deferredParse': function(aValue) {
67 var deferredResult;
68 var lines;
69 var context;
70
71 lines = aValue.replace(/\r?\n/g, "\n");
72 context = {
73 line: lines,
74 size: lines.length,
75 result: []
76 }
77
78 deferredResult = new Clipperz.Async.Deferred("KeePassExportProcessor.deferredResult");
79 deferredResult.addMethod(this, 'deferredParse_core');
80 deferredResult.callback(context);
81
82 return deferredResult;
83 },
84
85 //-------------------------------------------------------------------------
86
87 'parseRecord': function(aContext) {
88 var result;
89 var recordLabelRegexp;
90 varfieldLabelRegexp;
91 var fieldValueRegexp;
92 var fullLineRegexp;
93/*
94[Record name]
95Group Tree:
96UserName:
97URL:
98Password:
99Notes: test
100UUID: 525f62430079bae48b79ed2961924b05
101Icon: 0
102Creation Time: 2007-06-26 17:56:03
103Last Access: 2007-10-25 16:23:51
104Last Modification: 2007-10-25 16:23:51
105Expires: 2999-12-28 23:59:59
106
107 [Record name] ==> Title
108 Group: General ==> Group
109 Group Tree: ==> Group Tree
110 UserName: ==> UserName
111 URL: ==>URL
112 Password: ==>Password
113 Notes: test ==>Notes
114 UUID: 525f62430079bae48b79ed2961924b05 ==>UUID
115 Icon: 0 ==>Icon
116 Creation Time: 2007-06-26 17:56:03 ==>Creation Time
117 Last Access: 2007-10-25 16:23:51 ==>Last Access
118 Last Modification: 2007-10-25 16:23:51 ==>Last Modification
119 Expires: 2999-12-28 23:59:59 ==> Expires
120 Attachment Description: ==> Attachment Description
121 Attachment: ==> Attachment
122*/
123 // recordLabelRegexp = new RegExp("(^\\[(.*)\\]\\n|^Title:\s*(.*)\\n)");
124 recordLabelRegexp = new RegExp("^\\[(.*)\\]\\n|^Title:\s*(.*)\\n");
125 fieldLabelRegexp = new RegExp("^\s?(Group|Group Tree|Username|UserName|User Name|Url|URL|Password|Notes|Comment|UUID|Icon|Creation Time|Last Access|Last Modification|Expires|Attachment Description|Attachment|Valid until): ");
126 fieldValueRegexp = new RegExp("(.*)(\\n|$)");
127 fullLineRegexp = new RegExp("^(.*\\n)");
128
129 if (recordLabelRegexp.test(aContext.line) == true) {
130 var line;
131
132 line = aContext.line;
133
134 result = {};
135 result['Title'] = line.match(recordLabelRegexp)[1];
136 line = line.replace(/^.*\n/, "");
137 while (fieldLabelRegexp.test(line) == true) {
138 var fieldName;
139 var fieldValue;
140
141 fieldName = RegExp.$1;
142 line = RegExp.rightContext;
143
144 fieldValue = line.match(fieldValueRegexp)[1];
145 line = RegExp.rightContext;
146
147 if (fieldName == 'Notes') {
148 var isMultiline;
149
150 isMultiline = false;
151
152 if ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
153 fieldValue += '\n';
154 }
155
156 while ((line != "") && (fieldLabelRegexp.test(line) == false) && (recordLabelRegexp.test(line) == false)) {
157 var newLineValue;
158
159 newLineValue = line.match(fullLineRegexp)[1];
160 if (newLineValue != "\n") {
161 isMultiline = true;
162 }
163 fieldValue += newLineValue;
164 line = RegExp.rightContext;
165 }
166
167 if (isMultiline) {
168 fieldValue = fieldValue.replace(/\n$/g, "");
169 } else {
170 fieldValue = fieldValue.replace(/\n\n$/g, "");
171 }
172
173 line = line.replace(/^\n/, '');
174 }
175
176 result[fieldName] = fieldValue;
177 }
178 } else {
179 result = null;
180 }
181
182 aContext.line = line;
183
184 return result;
185 },
186
187 //-------------------------------------------------------------------------
188 __syntaxFix__: "syntax fix"
189});
190
191
diff --git a/frontend/delta/js/Clipperz/KeyValueObjectStore.js b/frontend/delta/js/Clipperz/KeyValueObjectStore.js
new file mode 100644
index 0000000..8bc125b
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/KeyValueObjectStore.js
@@ -0,0 +1,166 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25
26//#############################################################################
27
28Clipperz.KeyValueObjectStore = function(args) {
29 args = args || {};
30
31 //this._name = args['name'] || "unnamed KeyValueObjectStore";
32 this._values = args['values'] || {};
33 //this._referenceObjectStore = null;
34
35 return this;
36}
37
38Clipperz.KeyValueObjectStore.prototype = MochiKit.Base.update(null, {
39
40 'values': function() {
41 return this._values;
42 },
43
44 'initWithValues': function (someValues) {
45 this._values = Clipperz.Base.deepClone(someValues) || {};
46 return this;
47 },
48
49 'setValues': function (someValues) {
50 this._values = someValues;
51 return this;
52 },
53
54 //'initWithObjectStore': function (anObjectStore) {
55 // this._referenceObjectStore = anObjectStore;
56 //},
57
58 'removeAllData': function () {
59 this._values = {};
60 },
61
62 //-------------------------------------------------------------------------
63
64 'getValue': function(aKeyPath) {
65 var result;
66 var keys;
67 var i,c;
68
69 result = this.values();
70
71 keys = (aKeyPath + '').split('.');
72 c = keys.length;
73 i = 0;
74
75 while ((i<c) && (result != null)) {
76 if (typeof result[keys[i]] != 'undefined') {
77 result = result[keys[i]];
78 } else {
79 result = null;
80 }
81
82 i++;
83 }
84
85 return result;
86 },
87
88 //-------------------------------------------------------------------------
89
90 'setValue': function(aKeyPath, aValue) {
91 var targetObject;
92 var keys;
93 var i,c;
94
95 targetObject = this.values();
96 keys = (aKeyPath + '').split('.');
97 c = keys.length - 1;
98 for (i=0; i<c; i++) {
99 if (typeof targetObject[keys[i]] == 'undefined') {
100 targetObject[keys[i]] = {}
101 }
102
103 targetObject = targetObject[keys[i]];
104 }
105
106 targetObject[keys[c]] = aValue;
107
108 return aValue;
109 },
110
111 //-------------------------------------------------------------------------
112
113 'removeValue': function (aKeyPath) {
114 // this.setValue(aKeyPath, null);
115
116 var targetObject;
117 var keys;
118 var i,c;
119
120 targetObject = this.values();
121 keys = ('' + aKeyPath).split('.');
122 c = keys.length - 1;
123 for (i=0; i<c; i++) {
124 if (typeof targetObject[keys[i]] == 'undefined') {
125 targetObject[keys[i]] = {}
126 }
127
128 targetObject = targetObject[keys[i]];
129 }
130
131 delete targetObject[keys[c]];
132 },
133
134 //-------------------------------------------------------------------------
135
136 'deferredGetOrSet': function(aKeyPath, aGetterFunction) {
137 var deferredResult;
138
139 if (this.getValue(aKeyPath) != null) {
140 deferredResult = MochiKit.Async.succeed(this.getValue(aKeyPath));
141 } else {
142 deferredResult = new Clipperz.Async.Deferred("KeyValueObjectStore.deferredGetOrSet [" + aKeyPath + "]", {trace:false});
143
144 deferredResult.addCallback(aGetterFunction);
145 deferredResult.addMethod(this, 'setValue', aKeyPath);
146 deferredResult.callback();
147 }
148
149 return deferredResult;
150 },
151
152 //-------------------------------------------------------------------------
153
154 'isEmpty': function () {
155 return (MochiKit.Base.keys(this.values()).length == 0)
156 },
157
158 //-------------------------------------------------------------------------
159/*
160 'dumpData': function () {
161 return Clipperz.Base.serializeJSON(this.values());
162 },
163*/
164 //-------------------------------------------------------------------------
165 __syntaxFix__: "syntax fix"
166});
diff --git a/frontend/delta/js/Clipperz/Logging.js b/frontend/delta/js/Clipperz/Logging.js
new file mode 100644
index 0000000..b6b806a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Logging.js
@@ -0,0 +1,32 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.Base.module('Clipperz');
25
26Clipperz.log = function () {
27 console.log.apply(console, arguments);
28}
29
30 Clipperz.logError= Clipperz.log;
31 Clipperz.logWarning= Clipperz.log;
32 Clipperz.logDebug= Clipperz.log; \ No newline at end of file
diff --git a/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js b/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js
new file mode 100644
index 0000000..4818b76
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/BookmarkletProcessor.js
@@ -0,0 +1,191 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/*
25if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
26if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
27
28Clipperz.PM.BookmarkletProcessor = function(aConfiguration) {
29 this._configuration = aConfiguration;
30
31 this._editableFields = null;
32 this._favicon = null;
33
34 return this;
35}
36
37Clipperz.PM.BookmarkletProcessor.prototype = MochiKit.Base.update(null, {
38
39 'toString': function() {
40 return "Clipperz.PM.BookmarkletProcessor";
41 },
42
43 //-------------------------------------------------------------------------
44
45 'configuration': function() {
46 return this._configuration;
47 },
48
49 //-------------------------------------------------------------------------
50
51 'pageTitle': function() {
52 return this.configuration().page.title;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'fields': function() {
58 return this.configuration().form.inputs;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'editableFields': function() {
64 if (this._editableFields == null) {
65 this._editableFields = MochiKit.Base.filter(function(aField) {
66 var result;
67 var type;
68
69 type = aField['type'].toLowerCase();
70 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
71
72 return result;
73 }, this.fields())
74 }
75
76 return this._editableFields;
77 },
78
79 //-------------------------------------------------------------------------
80
81 'hostname': function() {
82 if (this._hostname == null) {
83 var actionUrl;
84
85 actionUrl = this.configuration()['form']['attributes']['action'];
86 this._hostname = actionUrl.replace(/ ^ h t t p s ? : \ / \ / ( [ ^ \ / ] * ) \ / . * /, '$1');
87 }
88
89 return this._hostname;
90 },
91
92 'favicon': function() {
93 if (this._favicon == null) {
94 this._favicon = "http://" + this.hostname() + "/favicon.ico";
95 }
96
97 return this._favicon;
98 },
99
100 //-------------------------------------------------------------------------
101 __syntaxFix__: "syntax fix"
102});
103
104//#############################################################################
105/ *
106Clipperz.PM.BookmarkletProcessor.createRecordFromBookmarkletConfiguration = function(anUser, aConfiguration) {
107 var processor;
108 var record;
109 var recordVersion;
110 var directLogin;
111 var bindings;
112 var i,c;
113
114 processor = new Clipperz.PM.BookmarkletProcessor(aConfiguration);
115
116 record = new Clipperz.PM.DataModel.Record({
117 'label':processor.pageTitle(),
118 'notes':"",
119 'user': anUser
120 });
121 recordVersion = new Clipperz.PM.DataModel.Record.Version(record, {})
122 record.setCurrentVersion(recordVersion);
123
124 bindings = {};
125
126 c = processor.editableFields().length;
127 for (i=0; i<c; i++) {
128 var formField;
129 var recordField;
130
131 formField = processor.editableFields()[i];
132 recordField = new Clipperz.PM.DataModel.RecordField({
133 'label':formField['name'],
134 'value':formField['value'],
135 'type': Clipperz.PM.Strings.inputTypeToRecordFieldType[formField['type']],
136 'hidden': false,
137 'recordVersion':recordVersion
138 });
139 recordVersion.addField(recordField);
140
141 bindings[formField['name']] = recordField.key();
142 }
143
144 directLogin = new Clipperz.PM.DataModel.DirectLogin({
145 'record': record,
146 'label': processor.pageTitle(),
147 'favicon': processor.favicon(),
148 'formData': processor.configuration()['form'],
149 'bindingData':bindings,
150 'bookmarkletVersion':'0.2'
151 });
152 record.addDirectLogin(directLogin);
153
154 anUser.addRecord(record);
155
156 return record;
157};
158* /
159//-----------------------------------------------------------------------------
160
161Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration = function(aConfiguration) {
162 var result;
163
164 //throw "XSS Bookmarklet attempt";
165
166 result = aConfiguration;
167
168 return result;
169};
170
171//-----------------------------------------------------------------------------
172
173Clipperz.PM.BookmarkletProcessor.checkBookmarkletConfiguration = function(aConfiguration) {
174 var result;
175
176 try {
177 result = Clipperz.Base.evalJSON(aConfiguration);
178 result = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(result);
179
180 if (result['version'] != '0.2.3') {
181 throw "WrongBookmarkletVersion";
182 }
183 } catch (exception) {
184 throw exception;
185 }
186
187 return result;
188};
189
190//-----------------------------------------------------------------------------
191*/ \ No newline at end of file
diff --git a/frontend/delta/js/Clipperz/PM/Connection.js b/frontend/delta/js/Clipperz/PM/Connection.js
new file mode 100644
index 0000000..c02125f
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Connection.js
@@ -0,0 +1,636 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26
27//-----------------------------------------------------------------------------
28//
29 // Abstract C O N N E C T I O N class
30//
31//-----------------------------------------------------------------------------
32
33Clipperz.PM.Connection = function (args) {
34 args = args || {};
35
36 this._proxy = args.proxy || Clipperz.PM.Proxy.defaultProxy;
37 this._getCredentialsFunction = args.getCredentialsFunction;
38
39 this._clipperz_pm_crypto_version = null;
40 this._connectionId = null;
41 this._sharedSecret = null;
42 this._serverLockValue = null;
43
44 return this;
45}
46
47Clipperz.PM.Connection.prototype = MochiKit.Base.update(null, {
48
49 'toString': function() {
50 return "Connection [" + this.version() + "]";
51 },
52
53 //=========================================================================
54
55 'version': function() {
56 throw Clipperz.Base.exception.AbstractMethod;
57 },
58
59 'clipperz_pm_crypto_version': function() {
60 if (this._clipperz_pm_crypto_version == null) {
61 var connectionVersions;
62 varversions;
63 varversion;
64 var i, c;
65
66 version = null;
67 connectionVersions = Clipperz.PM.Connection.communicationProtocol.versions;
68 versions = MochiKit.Base.keys(connectionVersions);
69 c = versions.length;
70 for (i=0; i<c; i++) {
71 if (! (versions[i] == 'current')) {
72 if (this instanceof connectionVersions[versions[i]]) {
73 version = versions[i];
74 };
75 }
76 }
77
78 this._clipperz_pm_crypto_version = version;
79 }
80
81 return this._clipperz_pm_crypto_version;
82 },
83
84 //-------------------------------------------------------------------------
85
86 'defaultErrorHandler': function(anErrorString, anException) {
87 // Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString, anException);
88 Clipperz.logError("### Connection.defaultErrorHandler: " + anErrorString + " (" + anException + ")");
89 },
90
91 //-------------------------------------------------------------------------
92
93 'getCredentialsFunction': function () {
94 return this._getCredentialsFunction;
95 },
96
97 'normalizedCredentials': function(someValues) {
98 throw Clipperz.Base.exception.AbstractMethod;
99 },
100
101 //=========================================================================
102
103 'proxy': function () {
104 return this._proxy;
105 },
106
107 //=========================================================================
108
109 'register': function () {
110 throw Clipperz.Base.exception.AbstractMethod;
111 },
112
113 'login': function() {
114 throw Clipperz.Base.exception.AbstractMethod;
115 },
116
117 //-------------------------------------------------------------------------
118
119 'message': function(someArguments, aCallback) {
120 throw Clipperz.Base.exception.AbstractMethod;
121 },
122
123 //-------------------------------------------------------------------------
124
125 'serverSideUserCredentials': function() {
126 throw Clipperz.Base.exception.AbstractMethod;
127 },
128
129 //=========================================================================
130
131 'sharedSecret': function () {
132 return this._sharedSecret;
133 },
134
135 'setSharedSecret': function (aValue) {
136 this._sharedSecret = aValue;
137 },
138
139 //-------------------------------------------------------------------------
140
141 'connectionId': function() {
142 return this._connectionId;
143 },
144
145 'setConnectionId': function(aValue) {
146 this._connectionId = aValue;
147 },
148
149 //-------------------------------------------------------------------------
150
151 'serverLockValue': function () {
152 return this._serverLockValue;
153 },
154
155 'setServerLockValue': function (aValue) {
156 this._serverLockValue = aValue;
157 },
158
159 //=========================================================================
160/*
161 //TODO: ?????
162 'oneTimePassword': function() {
163 return this._oneTimePassword;
164 },
165
166 'setOneTimePassword': function(aValue) {
167 this._oneTimePassword = aValue;
168 },
169*/
170 //=========================================================================
171
172 'reset': function() {
173 this.setSharedSecret(null);
174 this.setConnectionId(null);
175 },
176
177 //=========================================================================
178 __syntaxFix__: "syntax fix"
179
180}
181);
182
183
184if (typeof(Clipperz.PM.Connection.SRP) == 'undefined') { Clipperz.PM.Connection.SRP = {}; }
185//-----------------------------------------------------------------------------
186//
187 // S R P [ 1 . 0 ] C O N N E C T I O N class
188//
189//-----------------------------------------------------------------------------
190
191Clipperz.PM.Connection.SRP['1.0'] = function (args) {
192 Clipperz.PM.Connection.call(this, args);
193
194 return this;
195}
196
197Clipperz.PM.Connection.SRP['1.0'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection(), {
198
199 'version': function() {
200 return '1.0';
201 },
202
203 //=========================================================================
204
205 'register': function (someUserData) {
206 vardeferredResult;
207 var cryptoVersion;
208 var srpConnection;
209
210 cryptoVersion = this.clipperz_pm_crypto_version();
211
212 deferredResult = new Clipperz.Async.Deferred("Connection.registerWithVersion", {trace:false});
213 deferredResult.collectResults({
214 'credentials': [
215 this.getCredentialsFunction(),
216 MochiKit.Base.method(this, 'normalizedCredentials'),
217 MochiKit.Base.bind(function(someCredentials) {
218 var srpConnection;
219 var result;
220
221 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
222 result = srpConnection.serverSideCredentials();
223 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
224
225 return result;
226 }, this)
227 ],
228 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData),
229 'version':MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Connection.communicationProtocol.currentVersion),
230 'message':MochiKit.Base.partial(MochiKit.Async.succeed, 'completeRegistration')
231 });
232 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
233 deferredResult.addMethod(this.proxy(), 'registration');
234 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
235
236 deferredResult.callback();
237
238 return deferredResult;
239 },
240
241 //-------------------------------------------------------------------------
242
243 'updateCredentials': function (aUsername, aPassphrase, someUserData) {
244 vardeferredResult;
245
246 deferredResult = new Clipperz.Async.Deferred("Connection.updateCredentials", {trace:false});
247 deferredResult.collectResults({
248 'credentials': [
249 MochiKit.Base.method(this, 'normalizedCredentials', {username:aUsername, password:aPassphrase}),
250 MochiKit.Base.bind(function(someCredentials) {
251 var srpConnection;
252 var result;
253
254 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
255 result = srpConnection.serverSideCredentials();
256 result['version'] = Clipperz.PM.Connection.communicationProtocol.currentVersion;
257
258 return result;
259 }, this)
260 ],
261 'user': MochiKit.Base.partial(MochiKit.Async.succeed, someUserData)
262 });
263 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
264 deferredResult.addMethod(this, 'message', 'upgradeUserCredentials');
265 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
266 deferredResult.callback();
267
268 return deferredResult;
269
270 },
271
272 //=========================================================================
273
274 'redeemOneTimePassword': function (someParameters) {
275/*
276 //=========================================================================
277 //LOGIN WITH PASSPHRASE, extracted from the TRUNK version (LoginPanel.js)
278 deferredResult.addCallback(function(anUsername, aOneTimePassword) {
279 var args;
280
281 args = {
282 'message': 'oneTimePassword',
283 'version': Clipperz.PM.Crypto.communicationProtocol.currentVersion,
284 'parameters': {
285 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(anUsername, aOneTimePassword),
286 'oneTimePasswordKeyChecksum': Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(anUsername, aOneTimePassword)
287 }
288 }
289
290 return args;
291 }, anUsername, oneTimePassword);
292 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_loadingOTP');
293 deferredResult.addCallback(MochiKit.Base.method(Clipperz.PM.Proxy.defaultProxy, 'handshake'));
294 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'OTP_login_extractingPassphrase');
295 deferredResult.addCallback(function(aResult) {
296 return Clipperz.PM.Crypto.deferredDecrypt(oneTimePassword, aResult['data'], aResult['version']);
297 });
298 deferredResult.addCallback(function(aResult) {
299 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
300 });
301 deferredResult.addMethod(this, 'doLoginWithUsernameAndPassphrase', anUsername),
302*/
303 var args;
304 var normalizedOTP;
305
306 normalizedOTP = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(someParameters['password']);
307
308 args = {
309 'message': 'oneTimePassword',
310 'version': Clipperz.PM.Connection.communicationProtocol.currentVersion,
311 'parameters': {
312 'oneTimePasswordKey': Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(someParameters['username'], normalizedOTP),
313 'oneTimePasswordKeyChecksum':Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(someParameters['username'], normalizedOTP)
314 }
315 }
316
317 return Clipperz.Async.callbacks("Connction.redeemOTP", [
318 MochiKit.Base.method(this.proxy(), 'handshake', args),
319 function(aResult) {
320 return Clipperz.PM.Crypto.deferredDecrypt({
321 value:aResult['data'],
322 key:normalizedOTP,
323 version:aResult['version']
324 });
325 },
326 function(aResult) {
327 return (new Clipperz.ByteArray().appendBase64String(aResult['passphrase'])).asString();
328 }
329 ], {trace:false})
330 },
331
332 'login': function(isReconnecting) {
333 vardeferredResult;
334 var cryptoVersion;
335 var srpConnection;
336
337 cryptoVersion = this.clipperz_pm_crypto_version();
338 deferredResult = new Clipperz.Async.Deferred("Connection.login", {trace:false});
339 deferredResult.addCallback(this.getCredentialsFunction());
340 deferredResult.addMethod(this, 'normalizedCredentials');
341 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_sendingCredentials');
342 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
343 deferredResult.addCallback(MochiKit.Base.bind(function(someCredentials) {
344 srpConnection = new Clipperz.Crypto.SRP.Connection({ C:someCredentials['username'], P:someCredentials['password'], hash:this.hash() });
345 }, this));
346 deferredResult.addCallback(function() {
347 var result;
348
349 result = {
350 message: 'connect',
351 version: cryptoVersion,
352 parameters: {
353 C: srpConnection.C(),
354 A: srpConnection.A().asString(16)
355 // reconnecting: this.connectionId()
356 }
357 };
358
359 // TODO: ?????
360 // if (isReconnecting == true) {
361 // args.parameters['reconnecting'] = aConnection.connectionId();
362 // }
363
364 return result;
365 });
366 deferredResult.addMethod(this.proxy(), 'handshake');
367 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_credentialVerification');
368 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
369 deferredResult.addCallback(function(someParameters) {
370 var result;
371
372 srpConnection.set_s(new Clipperz.Crypto.BigInt(someParameters['s'], 16));
373 srpConnection.set_B(new Clipperz.Crypto.BigInt(someParameters['B'], 16));
374
375 //TODO: ?????
376 // if (typeof(someParameters['oneTimePassword']) != 'undefined') {
377 // this.setOneTimePassword(someParameters['oneTimePassword']);
378 // }
379
380 result = {
381 message: 'credentialCheck',
382 version: cryptoVersion,
383 parameters: {
384 M1: srpConnection.M1()
385 }
386 };
387
388 return result;
389 });
390 deferredResult.addMethod(this.proxy(), 'handshake');
391 deferredResult.addCallback(function(someParameters) {
392 var result;
393
394 if (someParameters['M2'] == srpConnection.M2()) {
395 result = MochiKit.Async.succeed(someParameters);
396 } else {
397 result = MochiKit.Async.fail(Clipperz.PM.Connection.exception.WrongChecksum);
398 }
399
400 return result;
401 });
402 deferredResult.addCallback(MochiKit.Base.bind(function(someParameters) {
403 this.setConnectionId(someParameters['connectionId']);
404 this.setSharedSecret(srpConnection.K());
405 // TODO: ?????
406 // if (this.oneTimePassword() != null) {
407 /// ?? result = this.user().oneTimePasswordManager().archiveOneTimePassword(this.oneTimePassword()));
408 // }
409
410 if ((isReconnecting == true) && (this.serverLockValue() != someParameters['lock'])) {
411 throw Clipperz.PM.Connection.exception.StaleData;
412 } else {
413 this.setServerLockValue(someParameters['lock']);
414 }
415
416 return someParameters;
417 }, this));
418 // deferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'updatedProgressState', 'connection_loggedIn');
419 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
420 // deferredResult.addCallback(MochiKit.Async.succeed, {result:"done"});
421
422 deferredResult.callback();
423
424 return deferredResult;
425 },
426
427 //=========================================================================
428
429 'logout': function() {
430 return Clipperz.Async.callbacks("Connection.logout", [
431 MochiKit.Base.method(this, 'setSharedSecret'),
432 MochiKit.Base.method(this.proxy(), 'logout', {})
433 ], {trace:false});
434 },
435
436 //=========================================================================
437
438 'ping': function () {
439 //TODO: ping the server in order to have a valid session
440 },
441
442 //=========================================================================
443
444 'message': function(aMessageName, someParameters) {
445 var args;
446 var parameters;
447
448 parameters = someParameters || {};
449 if (typeof(parameters['user']) != 'undefined') {
450 parameters['user']['lock'] = this.serverLockValue();
451 }
452
453 args = {
454 message: aMessageName,
455 srpSharedSecret: this.sharedSecret(),
456 // parameters: (someParameters || {})
457 parameters: parameters
458 }
459
460 return this.sendMessage(args);
461 },
462
463 //-------------------------------------------------------------------------
464
465 'sendMessage': function(someArguments) {
466 vardeferredResult;
467
468 deferredResult = new Clipperz.Async.Deferred("Connection.sendMessage", {trace:false});
469 deferredResult.addMethod(this.proxy(), 'message', someArguments);
470 deferredResult.addCallback(MochiKit.Base.bind(function(res) {
471 if (typeof(res['lock']) != 'undefined') {
472 this.setServerLockValue(res['lock']);
473 }
474 return res;
475 }, this));
476
477 deferredResult.addErrback(MochiKit.Base.method(this, 'messageExceptionHandler'), someArguments);
478 deferredResult.callback();
479
480 return deferredResult
481 },
482
483 //-------------------------------------------------------------------------
484
485 'messageExceptionHandler': function(anOriginalMessageArguments, anError) {
486 var result;
487
488Clipperz.log(">>> Connection.messageExceptionHandler: " + anError.message, anError);
489 if (anError instanceof MochiKit.Async.CancelledError) {
490 result = anError;
491 } else {
492 if ((anError.message == 'Trying to communicate without an active connection')||
493 (anError.message == 'No tollManager available for current session')
494 ) {
495 result = this.reestablishConnection(anOriginalMessageArguments);
496 } else if (anError.message == 'Session with stale data') {
497 MochiKit.Signal.signal(this, 'EXCEPTION');
498 } else {
499 result = anError;
500 }
501 }
502Clipperz.log("<<< Connection.messageExceptionHandler")
503
504 return result;;
505 },
506
507 //=========================================================================
508
509 'reestablishConnection': function(anOriginalMessageArguments) {
510 var deferredResult;
511
512 deferredResult = new Clipperz.Async.Deferred("Connection.reestablishConnection");
513 deferredResult.addMethod(this, 'reset');
514 deferredResult.addMethod(this, 'login', true);
515 deferredResult.addCallback(MochiKit.Base.bind(function(aMessage) {
516 aMessage['srpSharedSecret'] = this.sharedSecret();
517 return aMessage;
518 }, this), anOriginalMessageArguments);
519 deferredResult.addMethod(this, 'sendMessage');
520 deferredResult.addErrback(MochiKit.Signal.signal, this, 'EXCEPTION', null);
521 deferredResult.callback();
522
523 return deferredResult;
524 },
525
526 //=========================================================================
527
528 'serverSideUserCredentials': function(aUsername, aPassword) {
529 varresult;
530 varnewSrpConnection;
531 var normalizedAttributes;
532
533 normalizedAttributes = this.normalizedCredentials({username:aUsername, password:aPassword});
534 newSrpConnection = new Clipperz.Crypto.SRP.Connection({ C:normalizedAttributes['username'], P:normalizedAttributes['password'], hash:this.hash() });
535 result = newSrpConnection.serverSideCredentials();
536 result['version'] = this.clipperz_pm_crypto_version();
537
538 return result;
539 },
540
541 //=========================================================================
542
543 'normalizedCredentials': function(someValues) {
544 var result;
545
546 result = {}
547 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'])).toHexString().substring(2);
548 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
549
550 return result;
551 },
552
553 //-----------------------------------------------------------------------------
554
555 'hash': function() {
556 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash;
557 },
558
559 //-----------------------------------------------------------------------------
560 __syntaxFix__: "syntax fix"
561
562});
563
564
565
566//-----------------------------------------------------------------------------
567//
568 // S R P [ 1 . 1 ] C O N N E C T I O N class
569//
570//-----------------------------------------------------------------------------
571
572Clipperz.PM.Connection.SRP['1.1'] = function (args) {
573 Clipperz.PM.Connection.SRP['1.0'].call(this, args);
574
575 return this;
576}
577
578Clipperz.PM.Connection.SRP['1.1'].prototype = MochiKit.Base.update(new Clipperz.PM.Connection.SRP['1.0'](), {
579
580 'version': function() {
581 return '1.1';
582 },
583
584 //-----------------------------------------------------------------------------
585
586 'normalizedCredentials': function(someValues) {
587 var result;
588
589 result = {}
590 result['username'] = this.hash()(new Clipperz.ByteArray(someValues['username'] + someValues['password'])).toHexString().substring(2);
591 result['password'] = this.hash()(new Clipperz.ByteArray(someValues['password'] + someValues['username'])).toHexString().substring(2);
592
593 return result;
594 },
595
596 //-----------------------------------------------------------------------------
597
598 'hash': function() {
599 return Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash;
600 },
601
602 //-----------------------------------------------------------------------------
603 __syntaxFix__: "syntax fix"
604
605});
606
607Clipperz.PM.Connection.exception = {
608 WrongChecksum: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue"),
609 StaleData: new MochiKit.Base.NamedError("Stale data"),
610 UnexpectedRequest:new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.UnexpectedRequest")
611};
612
613
614Clipperz.PM.Connection.communicationProtocol = {
615 'currentVersion': '0.2',
616 'versions': {
617 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
618 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
619 },
620 'fallbackVersions': {
621 // 'current':'0.1',
622 '0.2': '0.1',
623 '0.1': null
624 }
625};
626
627MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
628 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
629});
630
631MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.fallbackVersions, {
632 'current': Clipperz.PM.Connection.communicationProtocol.fallbackVersions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
633});
634
635
636
diff --git a/frontend/delta/js/Clipperz/PM/Crypto.js b/frontend/delta/js/Clipperz/PM/Crypto.js
new file mode 100644
index 0000000..7edf17f
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Crypto.js
@@ -0,0 +1,546 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
27
28Clipperz.PM.Crypto.VERSION = "0.2";
29Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
30
31Clipperz.PM.Crypto.encryptingFunctions = {};
32
33MochiKit.Base.update(Clipperz.PM.Crypto, {
34
35 '__repr__': function () {
36 return "[" + this.NAME + " " + this.VERSION + "]";
37 },
38
39 //-------------------------------------------------------------------------
40
41 'toString': function () {
42 return this.__repr__();
43 },
44
45 //-------------------------------------------------------------------------
46/*
47 'communicationProtocol': {
48 'currentVersion': '0.2',
49 'versions': {
50 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
51 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
52 },
53 'fallbackVersions': {
54 'current':'0.1',
55 '0.2': '0.1',
56 '0.1': null
57 }
58 },
59*/
60 //-------------------------------------------------------------------------
61
62 'encryptingFunctions': {
63 'currentVersion': '0.4',
64 'versions': {
65
66 //#####################################################################
67
68 '0.1': {
69 'encrypt': function(aKey, aValue) {
70 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
71 },
72
73 'deferredEncrypt': function(aKey, aValue) {
74 var deferredResult;
75
76 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
77 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
78 deferredResult.callback();
79
80 return deferredResult;
81 },
82
83 'decrypt': function(aKey, aValue) {
84 var result;
85
86 if (aValue != null) {
87 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
88 } else {
89 result = null;
90 }
91
92 return result;
93 },
94
95 'deferredDecrypt': function(aKey, aValue) {
96 var deferredResult;
97
98 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
99 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
100 deferredResult.callback();
101
102 return deferredResult;
103 },
104
105 'hash': function(aValue) {
106 var result;
107 var strngResult;
108
109 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!!
110 result = new Clipperz.ByteArray("0x" + stringResult);
111
112 return result;
113 },
114
115 'deriveKey': function(aStringValue) {
116 return Clipperz.Crypto.Base.computeHashValue(aStringValue);
117 }
118 },
119
120 //#####################################################################
121
122 '0.2': {
123 'encrypt': function(aKey, aValue, aNonce) {
124 var result;
125 varkey, value;
126 var dataToEncrypt;
127 var encryptedData;
128
129 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
130 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
131 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
132 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
133 result = encryptedData.toBase64String();
134
135 return result;
136 },
137
138 'deferredEncrypt': function(aKey, aValue, aNonce) {
139 var deferredResult;
140 varkey, value;
141 var dataToEncrypt;
142 // var encryptedData;
143
144 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
145 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
146 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
147
148 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
149 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
150 deferredResult.addCallback(function(aResult) {
151 return aResult.toBase64String();
152 })
153 deferredResult.callback();
154
155 return deferredResult;
156 },
157
158 'decrypt': function(aKey, aValue) {
159 var result;
160
161 if (aValue != null) {
162 var key, value;
163 var decryptedData;
164 var decryptedValue;
165
166 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
167 value = new Clipperz.ByteArray().appendBase64String(aValue);
168
169 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
170 decryptedValue = decryptedData.split((256/8));
171
172 try {
173 result = Clipperz.Base.evalJSON(decryptedValue.asString());
174 } catch (exception) {
175 Clipperz.logError("Error while decrypting data [1]");
176 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
177 }
178 } else {
179 result = null;
180 }
181
182 return result;
183 },
184
185 'deferredDecrypt': function(aKey, aValue) {
186 var result;
187
188 if (aValue != null) {
189 var deferredResult;
190 var key, value;
191 // var decryptedData;
192
193 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
194 value = new Clipperz.ByteArray().appendBase64String(aValue);
195
196 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
197 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
198 deferredResult.addCallback(function(aResult) {
199 var result;
200 var decryptedData;
201
202 decryptedData = aResult.split((256/8));
203
204 try {
205 result = Clipperz.Base.evalJSON(decryptedData.asString());
206 } catch (exception) {
207 Clipperz.logError("Error while decrypting data [2]");
208 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
209 }
210
211 return result;
212 })
213 deferredResult.callback();
214
215 result = deferredResult;
216 } else {
217 result = MochiKit.Async.succeed(null);
218 }
219
220 return result;
221 },
222
223 'hash': Clipperz.Crypto.SHA.sha_d256,
224
225 'deriveKey': function(aStringValue) {
226 varbyteData;
227 var result;
228
229 byteData = new Clipperz.ByteArray(aStringValue);
230 result = Clipperz.Crypto.SHA.sha_d256(byteData);
231
232 return result;
233 }
234 },
235
236 //#####################################################################
237
238 '0.3': {
239 'encrypt': function(aKey, aValue, aNonce) {
240 var result;
241 varkey, value;
242 var data;
243 var dataToEncrypt;
244 var encryptedData;
245
246 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
247 value = Clipperz.Base.serializeJSON(aValue);
248 data = new Clipperz.ByteArray(value);
249 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
250 result = encryptedData.toBase64String();
251
252 return result;
253 },
254
255 'deferredEncrypt': function(aKey, aValue, aNonce) {
256 var deferredResult;
257 varkey, value;
258 var data;
259 var dataToEncrypt;
260 var encryptedData;
261
262 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
263 value = Clipperz.Base.serializeJSON(aValue);
264 data = new Clipperz.ByteArray(value);
265
266 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
267 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
268 deferredResult.addCallback(function(aResult) {
269 return aResult.toBase64String();
270 })
271 deferredResult.callback();
272
273 return deferredResult;
274 },
275
276 'decrypt': function(aKey, aValue) {
277 var result;
278
279 if (aValue != null) {
280 var key, value;
281 var decryptedData;
282
283 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
284 value = new Clipperz.ByteArray().appendBase64String(aValue);
285
286 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
287
288 value = decryptedData.asString();
289 try {
290 result = Clipperz.Base.evalJSON(value);
291 } catch (exception) {
292 Clipperz.logError("Error while decrypting data [3]");
293 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
294 }
295 } else {
296 result = null;
297 }
298
299 return result;
300 },
301
302 'deferredDecrypt': function(aKey, aValue) {
303 var deferredResult;
304
305 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
306 // now = new Date;
307
308 if (aValue != null) {
309 var key, value;
310 // var decryptedData;
311
312 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
313 value = new Clipperz.ByteArray().appendBase64String(aValue);
314
315 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
316 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
317 deferredResult.addCallback(function(aResult) {
318 return aResult.asString();
319 });
320 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
321 deferredResult.addCallback(Clipperz.Base.evalJSON);
322 deferredResult.addErrback(function(anError) {
323console.log("PIPPO_1", anError)
324 Clipperz.logError("Error while decrypting data [4]");
325 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
326 })
327 } else {
328 deferredResult.addCallback(function() {
329 return null;
330 });
331 }
332 deferredResult.callback();
333
334 return deferredResult;
335 },
336
337 'hash': Clipperz.Crypto.SHA.sha_d256,
338
339 'deriveKey': function(aStringValue) {
340 varbyteData;
341 var result;
342
343 byteData = new Clipperz.ByteArray(aStringValue);
344 result = Clipperz.Crypto.SHA.sha_d256(byteData);
345
346 return result;
347 }
348 },
349
350 //#####################################################################
351
352 '0.4': {
353 'encrypt': function(aKey, aValue, aNonce) {
354 var result;
355 varkey, value;
356 var data;
357 var dataToEncrypt;
358 var encryptedData;
359
360 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
361 value = Clipperz.Base.serializeJSON(aValue);
362 data = new Clipperz.ByteArray(value);
363 encryptedData = Clipperz.Crypto.AES_2.encrypt(key, data, aNonce);
364 result = encryptedData.toBase64String();
365
366 return result;
367 },
368
369 'deferredEncrypt': function(aKey, aValue, aNonce) {
370 var deferredResult;
371 varkey, value;
372 var data;
373 var dataToEncrypt;
374 var encryptedData;
375
376 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
377 value = Clipperz.Base.serializeJSON(aValue);
378 data = new Clipperz.ByteArray(value);
379
380 deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredEncrypt")
381 deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredEncrypt, key, data, aNonce);
382 deferredResult.addCallback(function(aResult) {
383 return aResult.toBase64String();
384 })
385 deferredResult.callback();
386
387 return deferredResult;
388 },
389
390 'decrypt': function(aKey, aValue) {
391 var result;
392
393 if (aValue != null) {
394 var key, value;
395 var decryptedData;
396
397 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
398 value = new Clipperz.ByteArray().appendBase64String(aValue);
399
400 decryptedData = Clipperz.Crypto.AES_2.decrypt(key, value);
401
402 value = decryptedData.asString();
403 try {
404 result = Clipperz.Base.evalJSON(value);
405 } catch (exception) {
406 console.log("PIPPO_2", anError)
407 Clipperz.logError("Error while decrypting data [4]");
408 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
409 }
410 } else {
411 result = null;
412 }
413
414 return result;
415 },
416
417 'deferredDecrypt': function(aKey, aValue) {
418 var deferredResult;
419
420 deferredResult = new Clipperz.Async.Deferred("Crypto[0.4].deferredDecrypt", {trace: false});
421
422 if (aValue != null) {
423 var key, value;
424
425 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
426 value = new Clipperz.ByteArray().appendBase64String(aValue);
427
428 deferredResult.addCallback(Clipperz.Crypto.AES_2.deferredDecrypt, key, value);
429 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
430 deferredResult.addCallback(function(aResult) {
431 return aResult.asString();
432 });
433 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
434 deferredResult.addCallback(Clipperz.Base.evalJSON);
435 deferredResult.addErrback(function(anError) {
436 Clipperz.logError("Error while decrypting data [4]");
437 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
438 })
439 } else {
440 deferredResult.addCallback(function() {
441 return null;
442 });
443 }
444 deferredResult.callback();
445
446 return deferredResult;
447 },
448
449 'hash': Clipperz.Crypto.SHA.sha_d256,
450
451 'deriveKey': function(aStringValue) {
452 varbyteData;
453 var result;
454
455 byteData = new Clipperz.ByteArray(aStringValue);
456 result = Clipperz.Crypto.SHA.sha_d256(byteData);
457
458 return result;
459 }
460 },
461
462 //#####################################################################
463 __syntaxFix__: "syntax fix"
464 }
465 },
466
467 //-------------------------------------------------------------------------
468
469 'encrypt': function(aKey, aValue, aVersion) {
470 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
471 },
472
473 'deferredEncrypt': function(someParameters) {
474 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']);
475 },
476
477 //.........................................................................
478
479 'decrypt': function(aKey, aValue, aVersion) {
480 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
481 },
482
483 'deferredDecrypt': function(someParameters) {
484 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']);
485 },
486
487 //-------------------------------------------------------------------------
488
489 'hash': function(aValue) {
490 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue);
491 },
492
493 //-------------------------------------------------------------------------
494
495 'randomKey': function() {
496 return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
497 },
498
499 //-------------------------------------------------------------------------
500
501 'deriveKey': function(aValue) {
502 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue);
503 },
504
505 //-------------------------------------------------------------------------
506
507 'passwordEntropy': function(aValue) {
508 var result;
509 varbitPerChar;
510
511 bitPerChar = 4;
512 if (/[a-z]/.test(aValue)) {
513 bitPerChar ++;
514 }
515 if (/[A-Z]/.test(aValue)) {
516 bitPerChar ++;
517 }
518 if (/[^a-zA-Z0-9]/.test(aValue)) {
519 bitPerChar ++;
520 }
521
522 result = aValue.length * bitPerChar;
523
524 return result;
525 },
526
527 //-------------------------------------------------------------------------
528
529 'nullValue': '####',
530
531 //-------------------------------------------------------------------------
532 __syntaxFix__: "syntax fix"
533
534});
535
536//*****************************************************************************
537
538//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
539 //'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
540//});
541
542MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
543 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
544});
545
546//*****************************************************************************
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js
new file mode 100644
index 0000000..8db90de
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLogin.js
@@ -0,0 +1,1086 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.Base.module('Clipperz.PM.DataModel');
25
26Clipperz.PM.DataModel.DirectLogin = function(args) {
27 args = args || {};
28
29 Clipperz.PM.DataModel.DirectLogin.superclass.constructor.apply(this, arguments);
30
31 this._reference =args.reference
32 ||Clipperz.PM.Crypto.randomKey();
33 this._record =args.record
34 ||Clipperz.Base.exception.raise('MandatoryParameter');
35
36 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction
37 ||this.record().retrieveDirectLoginIndexDataFunction()
38 ||Clipperz.Base.exception.raise('MandatoryParameter');
39 this._setIndexDataFunction = args.setIndexDataFunction
40 ||this.record().setDirectLoginIndexDataFunction()
41 ||Clipperz.Base.exception.raise('MandatoryParameter');
42 this._removeIndexDataFunction =args.removeIndexDataFunction
43 ||this.record().removeDirectLoginIndexDataFunction()
44 ||Clipperz.Base.exception.raise('MandatoryParameter');
45
46 this._inputs = null;
47 this._bindings = null;
48 this._formValues = null;
49
50 // this._inputsDeferredLock = new MochiKit.Async.DeferredLock();
51 // this._bindingsDeferredLock = new MochiKit.Async.DeferredLock();
52 // this._formValuesDeferredLock = new MochiKit.Async.DeferredLock();
53
54 this._transientState = null;
55
56 this._isBrandNew = MochiKit.Base.isUndefinedOrNull(args.reference);
57
58 this.record().addDirectLogin(this);
59
60 return this;
61}
62
63Clipperz.Base.extend(Clipperz.PM.DataModel.DirectLogin, Object, {
64
65 'toString': function() {
66 return "DirectLogin (" + this.reference() + ")";
67 },
68
69 //=========================================================================
70
71 'reference': function () {
72 return this._reference;
73 },
74
75 //-------------------------------------------------------------------------
76
77 'record': function () {
78 return this._record;
79 },
80
81 //=========================================================================
82
83 'isBrandNew': function () {
84 return this._isBrandNew;
85 },
86
87 //=========================================================================
88
89 'removeIndexDataFunction': function () {
90 return this._removeIndexDataFunction;
91 },
92
93 'remove': function () {
94 return Clipperz.Async.callbacks("DirectLogin.remove", [
95 MochiKit.Base.partial(this.removeIndexDataFunction(), this.reference()),
96 MochiKit.Base.method(this.record(), 'removeDirectLogin', this)
97 ], {trace:false});
98 },
99
100 //=========================================================================
101 /*
102 'inputsDeferredLock': function () {
103 return this._inputsDeferredLock;
104 },
105
106 'bindingsDeferredLock': function () {
107 return this._bindingsDeferredLock;
108 },
109
110 'formValuesDeferredLock': function () {
111 return this._formValuesDeferredLock;
112 },
113*/
114 //=========================================================================
115
116 'label': function () {
117 return this.getIndexDataForKey('label');
118 },
119
120 'setLabelKeepingBackwardCompatibilityWithBeta': function (aValue) {
121 return Clipperz.Async.callbacks("DirectLogin.setLabelKeepingBackwardCompatibilityWithBeta", [
122 MochiKit.Base.method(this, 'setIndexDataForKey', 'label', aValue),
123 MochiKit.Base.method(this, 'setValue', 'label', aValue)
124 ], {trace:false});
125 },
126
127 'setLabel': function (aValue) {
128 return this.setLabelKeepingBackwardCompatibilityWithBeta(aValue);
129 // return this.setIndexDataForKey('label', aValue);
130 },
131
132 //=========================================================================
133
134 'favicon': function () {
135 return this.getIndexDataForKey('favicon');
136 },
137
138 'setFavicon': function (aValue) {
139 return this.setIndexDataForKey('favicon', aValue);
140 },
141
142 'faviconUrlWithBookmarkletConfiguration': function (aBookmarkletConfiguration) {
143 varresult;
144
145 if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['page']['favicon'])) {
146 result = aBookmarkletConfiguration['page']['favicon'];
147 } else if (! MochiKit.Base.isUndefinedOrNull(aBookmarkletConfiguration['form']['attributes']['action'])) {
148 var actionUrl;
149 var hostname;
150
151 actionUrl = aBookmarkletConfiguration['form']['attributes']['action'];
152 hostname = actionUrl.replace(/^https?:\/\/([^\/]*)\/.*/, '$1');
153 result = "http://" + hostname + "/favicon.ico";
154 } else {
155 result = null;
156 }
157
158
159 return result;
160 },
161
162 //-------------------------------------------------------------------------
163/*
164 'faviconData': function () {
165 var regexp = new RegExp('^data\:\/\/.*', 'i');
166
167 return Clipperz.Async.callbacks("DirectLogin.favicon", [
168 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
169 MochiKit.Base.method(regexp, 'test'),
170 Clipperz.Async.deferredIf("is data URL", [
171 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon')
172 ], [
173 MochiKit.Base.method(this, 'transientState'),
174 MochiKit.Base.itemgetter('faviconData'),
175 Clipperz.Async.deferredIf('has a chaced value for the favicon data', [
176 MochiKit.Base.operator.identity
177 ], [
178 MochiKit.Base.method(this, 'getIndexDataForKey', 'favicon'),
179 MochiKit.Base.method(this, 'loadFaviconDataFromURL')
180 ])
181
182 ])
183 ], {trace:false});
184 },
185
186 //-------------------------------------------------------------------------
187
188 'loadFaviconDataFromURL': function (anURL) {
189 var deferredResult;
190 var image;
191
192 deferredResult = new Clipperz.Async.Deferred("DirectLogin.loadFaviconDataFromURL", {trace:false});
193 deferredResult.addCallback(function (anEvent) {
194 var image = anEvent.src();
195 var canvas = document.createElement("canvas");
196 var result;
197
198 canvas.width = image.width;
199 canvas.height = image.height;
200
201 var ctx = canvas.getContext("2d");
202 ctx.drawImage(image, 0, 0);
203
204 result = canvas.toDataURL(/*"image/png"* /);
205
206 return result;
207 });
208 deferredResult.addErrback(MochiKit.Async.succeed, Clipperz.PM.Strings.getValue('defaultFaviconUrl'));
209 deferredResult.addBoth(MochiKit.Base.bind(function (aDataUrl) {
210 this.transientState()['faviconData'] = aDataUrl;
211
212 return aDataUrl;
213 }, this));
214
215 image = new Image();
216 MochiKit.Signal.connect(image, 'onload', MochiKit.Base.method(deferredResult, 'callback'));
217 MochiKit.Signal.connect(image, 'onerror', MochiKit.Base.method(deferredResult, 'errback'));
218 MochiKit.Signal.connect(image, 'onabort', MochiKit.Base.method(deferredResult, 'errback'));
219
220 image.src = anURL;
221
222 return deferredResult;
223 },
224*/
225
226 //=========================================================================
227
228 'type': function () {
229 return this.getValue('formData.attributes.type')
230 },
231
232 //=========================================================================
233
234 'serializedData': function () {
235 return Clipperz.Async.collectResults("DirectLogin.serializedData", {
236 'bookmarkletVersion': MochiKit.Base.method(this, 'getValue', 'bookmarkletVersion'),
237 'formData': MochiKit.Base.method(this, 'getValue', 'formData'),
238 'formValues': MochiKit.Base.method(this, 'getValue', 'formValues'),
239 'bindingData': [
240 MochiKit.Base.method(this, 'bindings'),
241 function (someBindings) {
242 var result;
243 var bindingKey;
244
245 result = {}
246 for (bindingKey in someBindings) {
247 result[bindingKey] = someBindings[bindingKey].serializedData();
248 }
249
250 return result;
251 }
252 ]
253 }, {trace:false})()
254 },
255
256 //=========================================================================
257/*
258 'fixFormDataFromBookmarkletVersion_0_1': function(aValue) {
259//{"type":"radio", "name":"action", "value":"new-user", "checked":false }, { "type":"radio", "name":"action", "value":"sign-in", "checked":true }
260 // ||
261 // \ /
262 // \/
263//{"name":"dominio", "type":"radio", "options":[{"value":"@alice.it", "checked":true}, {"value":"@tin.it", "checked":false}, {"value":"@virgilio.it", "checked":false}, {"value":"@tim.it", "checked":false}]}
264 var result;
265 var inputs;
266 var updatedInputs;
267 var radios;
268
269 result = aValue;
270 inputs = aValue['inputs'];
271
272 updatedInputs = MochiKit.Base.filter(function(anInput) {
273 varresult;
274 var type;
275
276 type = anInput['type'] || 'text';
277 result = type.toLowerCase() != 'radio';
278
279 return result;
280 }, inputs);
281 radios = MochiKit.Base.filter(function(anInput) {
282 varresult;
283 var type;
284
285 type = anInput['type'] || 'text';
286 result = type.toLowerCase() == 'radio';
287
288 return result;
289 }, inputs);
290
291 if (radios.length > 0) {
292 var updatedRadios;
293
294 updatedRadios = {};
295 MochiKit.Iter.forEach(radios, MochiKit.Base.bind(function(aRadio) {
296 varradioConfiguration;
297
298 radioConfiguration = updatedRadios[aRadio['name']];
299 if (radioConfiguration == null) {
300 radioConfiguration = {type:'radio', name:aRadio['name'], options:[]};
301 updatedRadios[aRadio['name']] = radioConfiguration;
302 }
303
304 //TODO: remove the value: field and replace it with element.dom.value = <some value>
305 radioConfiguration.options.push({value:aRadio['value'], checked:aRadio['checked']});
306
307 //TODO: shoud remove the 'formValues' call, as it is now deferred
308 // if ((aRadio['checked'] == true) && (this.formValues()[aRadio['name']] == null)) {
309 // this.formValues()[aRadio['name']] = aRadio['value'];
310 // }
311 }, this))
312
313 updatedInputs = MochiKit.Base.concat(updatedInputs, MochiKit.Base.values(updatedRadios));
314 }
315
316 delete result.inputs;
317 result.inputs = updatedInputs;
318
319 return result;
320 },
321
322 '_fixConfiguration': function (aConfiguration) {
323 var fixedConfiguration;
324 // var inputs;
325 // var bindings;
326 // var i,c;
327
328 fixedConfiguration = Clipperz.Base.deepClone(aConfiguration);
329
330//Clipperz.log("PROCESS CONFIGURATION", aConfiguration);
331 switch (aConfiguration['bookmarkletVersion']) {
332 case '0.1':
333 fixedConfiguration['formData'] = this.fixFormDataFromBookmarkletVersion_0_1(aConfiguration['formData']);
334 break;
335 case '0.2':
336 fixedConfiguration['formData'] = aConfiguration['formData'];
337 break;
338 }
339
340 / *
341 aConfiguration['_inputs'] = [];
342 c = formData['inputs'].length;
343 for (i=0; i<c; i++) {
344 aConfiguration['_inputs'].push(new Clipperz.PM.DataModel.DirectLoginInput(formData['inputs'][i]));
345 }
346* /
347/ *
348 aConfiguration['_bindings'] = {};
349 if (aConfiguration['legacyBindingData'] == null) {
350 if (aConfiguration['bindingData'] != null) {
351 var bindingKey;
352
353 for (bindingKey in aConfiguration['bindingData']) {
354 var newBinding;
355
356 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldKey:aConfiguration['bindingData'][bindingKey]});
357 aConfiguration['_bindings'][newBinding.key()] = newBinding;
358 }
359 } else {
360 var editableFields;
361
362 editableFields = MochiKit.Base.filter(function(aField) {
363 var result;
364 var type;
365
366 type = aField['type'].toLowerCase();
367 result = ((type != 'hidden') && (type != 'submit') && (type != 'checkbox') && (type != 'radio') && (type != 'select'));
368
369 return result;
370 }, aConfiguration['_inputs']);
371
372 MochiKit.Iter.forEach(editableFields, MochiKit.Base.bind(function(anEditableField) {
373 var newBinding;
374
375 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(anEditableField['name']);
376 aConfiguration['_bindings'][newBinding.key()] = newBinding;
377 }, this));
378 }
379
380 } else {
381 var bindingKey;
382
383 for (bindingKey in aConfiguration['legacyBindingData']) {
384 var newBinding;
385
386 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(bindingKey, {fieldName:aConfiguration['legacyBindingData'][bindingKey]});
387 aConfiguration['_bindings'][newBinding.key()] = newBinding;
388 }
389 }
390* /
391
392 return fixedConfiguration;
393 },
394
395 //-------------------------------------------------------------------------
396
397 'getObjectDataStore': function () {
398 var deferredResult;
399
400 deferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore", {trace:false});
401 deferredResult.acquireLock(this.objectDataStoreDeferredLock());
402 deferredResult.addCallback(MochiKit.Base.bind(function () {
403 var innerDeferredResult;
404
405 if (this._objectDataStore == null) {
406 this._objectDataStore = new Clipperz.KeyValueObjectStore();
407
408 innerDeferredResult = new Clipperz.Async.Deferred("DirectLogin.getObjectDataStore <inner deferred>", {trace:false});
409 // innerDeferredResult.addMethod(this.record(), 'getValue', 'directLogins' + '.' + this.reference());
410 innerDeferredResult.addMethod(this, 'getValue', ''),
411 innerDeferredResult.addMethod(this, 'setOriginalState');
412 innerDeferredResult.addMethod(this, '_fixConfiguration');
413 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
414 // innerDeferredResult.addMethod(this._objectDataStore, 'setValues');
415 innerDeferredResult.callback();
416 } else {
417 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
418 }
419
420 return innerDeferredResult;
421 }, this));
422 deferredResult.releaseLock(this.objectDataStoreDeferredLock());
423 deferredResult.callback();
424
425 return deferredResult;
426 },
427
428 //-------------------------------------------------------------------------
429
430 'hasInitiatedObjectDataStore': function () {
431 return (this._objectDataStore != null);
432 },
433
434 //-------------------------------------------------------------------------
435
436 'resetObjectDataStore': function () {
437 this._objectDataStore.removeAllData();
438 this._objectDataStore = null;
439 },
440*/
441 //=========================================================================
442
443 'bookmarkletConfiguration': function () {
444 return Clipperz.Async.callbacks("DirectLogin.bookmarkletConfiguration", [
445 Clipperz.Async.collectResults("DirectLogin.bookmarkletConfiguration <inner results>", {
446 'label': MochiKit.Base.method(this, 'label'),
447 'configuration': MochiKit.Base.method(this, 'getValue', '')
448 }, {trace:false}),
449 function (someValues) {
450 var result;
451
452 if (someValues['configuration'] != null) {
453 varconfiguration;
454
455 configuration = {
456 'page': {
457 'title': someValues['label']
458 //'favicon'
459 // 'url'
460 },
461 'form': someValues['configuration']['formData'],
462 'version':someValues['configuration']['bookmarkletVersion']
463 }
464
465 result = Clipperz.Base.formatJSON(configuration);
466 } else {
467 result = '';
468 }
469
470 return result;
471 }
472 ], {trace:false});
473
474 },
475
476 //-------------------------------------------------------------------------
477
478 'setBookmarkletConfiguration': function (aValue) {
479 var bookmarkletConfiguration;
480
481 bookmarkletConfiguration = Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration(aValue);
482
483 return Clipperz.Async.callbacks("DirectLogin.setBookmarkletConfiguration", [
484 MochiKit.Base.method(this, 'setValue', 'formData', bookmarkletConfiguration['form']),
485 MochiKit.Base.method(this, 'setValue', 'bookmarkletVersion', bookmarkletConfiguration['version']),
486
487 MochiKit.Base.method(this, 'favicon'),
488 Clipperz.Async.deferredIf("the favicon is not set", [
489 ], [
490 MochiKit.Base.method(this, 'faviconUrlWithBookmarkletConfiguration', bookmarkletConfiguration),
491 MochiKit.Base.method(this, 'setFavicon')
492 ]),
493
494 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration'),
495 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
496 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
497
498 MochiKit.Base.noop
499 ], {trace:false});
500 },
501
502 //=========================================================================
503
504 'formAttributes': function () {
505 return this.getValue('formData.attributes');
506 },
507
508 //=========================================================================
509
510 'inputs': function () {
511 return Clipperz.Async.callbacks("DirectLogin.inputs", [
512 Clipperz.Async.deferredIf("this._inputs is defined", [
513 ], [
514 MochiKit.Base.method(this, 'updateInputsAfterChangingBookmarkletConfiguration')
515 ])
516 ], {trace:false}, this._inputs);
517 },
518
519 'setInputWithFormDataConfiguration': function (aFormDataConfiguration) {
520 this._inputs = {};
521
522 if (aFormDataConfiguration != null) {
523 MochiKit.Iter.forEach(aFormDataConfiguration['inputs'], MochiKit.Base.bind(function (anInputData) {
524 var newInput;
525
526 newInput = new Clipperz.PM.DataModel.DirectLoginInput(anInputData);
527 this._inputs[newInput.name()] = newInput;
528 }, this));
529 }
530
531 return this._inputs;
532 },
533
534 'updateInputsAfterChangingBookmarkletConfiguration': function () {
535 return Clipperz.Async.callbacks("DirectLogin.updateInputsAfterChangingBookmarkletConfiguration", [
536 MochiKit.Base.method(this, 'getValue', 'formData'),
537 MochiKit.Base.method(this, 'setInputWithFormDataConfiguration')
538 ], {trace:false});
539 },
540
541 //=========================================================================
542
543 'inputValues': function () {
544 return Clipperz.Async.callbacks("DirectLogin.inputValues", [
545 MochiKit.Base.method(this, 'inputs'),
546 MochiKit.Base.values,
547 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.partial(MochiKit.Base.method(this, 'inputValue'))),
548 Clipperz.Async.collectAll,
549 Clipperz.Base.mergeItems
550 ], {trace:false});
551 },
552
553 'inputValue': function (anInput) {
554 vardeferredResult;
555
556 deferredResult = new Clipperz.Async.Deferred("DirectLogin.inputValue", {trace:false});
557
558 if (anInput.needsFormValue()) {
559 deferredResult.addMethod(this, 'formValues');
560 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
561 deferredResult.addMethodcaller('value');
562 } else if (anInput.needsBinding()) {
563 deferredResult.addMethod(this, 'bindings');
564 deferredResult.addCallback(MochiKit.Base.itemgetter(anInput.name()));
565 deferredResult.addMethodcaller('field');
566 deferredResult.addMethodcaller('value');
567 } else {
568 deferredResult.addCallback(MochiKit.Async.succeed, anInput.value());
569 }
570 deferredResult.addCallback(function (anActualValue) {
571 return [anInput.name(), anActualValue];
572 });
573
574 deferredResult.callback();
575
576 return deferredResult;
577 },
578
579 //=========================================================================
580
581 'bindings': function () {
582 return Clipperz.Async.callbacks("DirectLogin.bindings", [
583 Clipperz.Async.deferredIf("this._bindings is defined", [
584 ], [
585 MochiKit.Base.method(this, 'updateBindingsAfterChangingBookmarkletConfiguration'),
586 MochiKit.Base.bind(function () { return this._bindings;}, this)
587 ])
588 ], {trace:false}, this._bindings);
589 },
590
591 'bindFormFieldWithLabelToRecordFieldWithLabel': function (aFormFieldLabel, aRecordFieldLabel) {
592 return Clipperz.Async.callbacks("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel", [
593 Clipperz.Async.collectResults("DirectLogin.bindFormFieldWithLabelToCardFieldWithLabel - collect results", {
594 'binding': [
595 MochiKit.Base.method(this, 'bindings'),
596 MochiKit.Base.itemgetter(aFormFieldLabel)
597 ],
598 'field': [
599 MochiKit.Base.method(this.record(), 'fieldWithLabel', aRecordFieldLabel)
600 ]
601 }),
602 function (someValues) {
603 someValues['binding'].setField(someValues['field'])
604 }
605 ], {trace:false});
606 },
607
608 //-------------------------------------------------------------------------
609/*
610 'bindingValues': function () {
611 return Clipperz.Async.callbacks("DirectLogin.bindingValues", [
612 Clipperz.Async.collectResults("DirectLogin.bindingValues [collectResults]", {
613 'fieldValues': [
614 MochiKit.Base.method(this, 'record'),
615 MochiKit.Base.methodcaller('getFieldsValues')
616 ],
617 'bindings': MochiKit.Base.method(this, 'bindings')
618 }, {trace:false}),
619 function (someData) {
620 var result;
621 varbindingKey;
622
623 result = {};
624 for (bindingKey in someData['bindings']) {
625 result[bindingKey] = someData['fieldValues'][someData['bindings'][bindingKey].fieldKey()]['value'];
626 }
627
628 return result;
629 }
630 ], {trace:false});
631 },
632*/
633 //-------------------------------------------------------------------------
634
635 'updateBindingsAfterChangingBookmarkletConfiguration': function () {
636 return Clipperz.Async.callbacks("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration", [
637 Clipperz.Async.collectResults("DirectLogin.updateBindingsAfterChangingBookmarkletConfiguration<collect results>", {
638 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
639 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
640 'inputs': MochiKit.Base.method(this, 'inputs')
641 }, {trace:false}),
642 MochiKit.Base.bind(function (someValues) {
643 var availableBindingValues;
644 var inputRequiringBindingValues;
645 var newBindingValues;
646
647 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['bindingData'])) {
648 availableBindingValues = {};
649 } else {
650 availableBindingValues = Clipperz.Base.deepClone(someValues['originalValues']['bindingData'])
651 }
652
653 if (someValues['currentValues'] != null) {
654 MochiKit.Base.update(availableBindingValues, someValues['currentValues']['bindingData']);
655 }
656
657 this._bindings = {};
658 newBindingValues = {}
659 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsBinding'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
660 varnewBinding;
661
662 newBindingValues[anInput.name()] = availableBindingValues[anInput.name()];
663 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
664 'key': anInput.name(),
665 'field':availableBindingValues[anInput.name()]
666 });
667
668 this._bindings[anInput.name()] = newBinding;
669 }, this))
670
671 return newBindingValues;
672
673/*
674 this._bindings = {};
675
676 if (someValues['currentValues'] != null) {
677 if (someValues['currentValues']['bindingData'] != null) {
678 var bindingKey;
679
680 for (bindingKey in someValues['currentValues']['bindingData']) {
681 var newBinding;
682
683 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
684 'key': bindingKey,
685 'field':someValues['currentValues']['bindingData'][bindingKey]
686 });
687 this._bindings[newBinding.key()] = newBinding;
688 }
689 } else if (someValues['currentValues']['legacyBindingData'] == null) {
690 var bindingKey;
691
692 for (bindingKey in someValues['currentValues']['legacyBindingData']) {
693 var newBinding;
694
695 newBinding = new Clipperz.PM.DataModel.DirectLoginBinding(this, {
696 'key': bindingKey,
697 'field':someValues['currentValues']['legacyBindingData'][bindingKey]
698 });
699 this._bindings[newBinding.key()] = newBinding;
700 }
701 } else {
702 WTF = TODO;
703 }
704 }
705
706 return this._bindings;
707*/
708 }, this),
709 MochiKit.Base.method(this, 'setValue', 'bindingData')
710 ], {trace:false});
711 },
712
713 //=========================================================================
714
715 'formValues': function () {
716 return Clipperz.Async.callbacks("DirectLogin.formValues", [
717 Clipperz.Async.deferredIf("this._formValues is defined", [
718 ], [
719 MochiKit.Base.method(this, 'updateFormValuesAfterChangingBookmarkletConfiguration'),
720 MochiKit.Base.bind(function () { return this._formValues;}, this)
721 ])
722 ], {trace:false}, this._formValues);
723 },
724
725 //-------------------------------------------------------------------------
726
727 'updateFormValuesAfterChangingBookmarkletConfiguration': function () {
728 return Clipperz.Async.callbacks("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration", [
729 Clipperz.Async.collectResults("DirectLogin.updateFormValuesAfterChangingBookmarkletConfiguration <collect results>", {
730 'currentValues':MochiKit.Base.method(this, 'getValue', ''),
731 'originalValues':MochiKit.Base.method(this, 'originalConfiguration'),
732 'inputs': MochiKit.Base.method(this, 'inputs')
733 }, {trace:false}),
734 MochiKit.Base.bind(function (someValues) {
735 var availableFormValues;
736 var inputRequiringFormValues;
737 var newFormValues;
738
739 if (MochiKit.Base.isUndefinedOrNull(someValues['originalValues']) || MochiKit.Base.isUndefinedOrNull(someValues['originalValues']['formValues'])) {
740 availableFormValues = {};
741 } else {
742 availableFormValues = Clipperz.Base.deepClone(someValues['originalValues']['formValues'])
743 }
744
745 MochiKit.Base.update(availableFormValues, someValues['currentValues']['formValues']);
746
747 this._formValues = {};
748 newFormValues = {};
749 MochiKit.Iter.forEach(MochiKit.Base.filter(MochiKit.Base.methodcaller('needsFormValue'), MochiKit.Base.values(someValues['inputs'])), MochiKit.Base.bind(function (anInput) {
750 varnewFormValue;
751 var fieldOptions;
752
753 fieldOptions = {
754 'type': anInput.type(),
755 'options':anInput.options()
756 };
757
758 newFormValues[anInput.name()] = availableFormValues[anInput.name()]
759 newFormValue = new Clipperz.PM.DataModel.DirectLoginFormValue(this, {
760 'key': anInput.name(),
761 'fieldOptions':fieldOptions,
762 'value': availableFormValues[anInput.name()]
763 });
764
765 this._formValues[anInput.name()] = newFormValue;
766 }, this))
767
768 return newFormValues;
769 }, this),
770 MochiKit.Base.method(this, 'setValue', 'formValues')
771 ], {trace:false});
772 },
773
774 //=========================================================================
775
776 'retrieveIndexDataFunction': function () {
777 return this._retrieveIndexDataFunction;
778 },
779
780 'getIndexDataForKey': function (aKey) {
781 return Clipperz.Async.callbacks("DirectLogin.getIndexDataForKey", [
782 MochiKit.Base.partial(this.retrieveIndexDataFunction(), this.reference()),
783 Clipperz.Async.deferredIf("DirectLogin.getIndexDataForKey - index data not null", [
784 MochiKit.Base.itemgetter(aKey)
785 ],[
786 MochiKit.Async.succeed
787 ])
788 ], {trace:false});
789 },
790
791 //-------------------------------------------------------------------------
792
793 'setIndexDataForKey': function (aKey, aValue) {
794 return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [
795 MochiKit.Base.method(this, 'getIndexDataForKey', aKey),
796 MochiKit.Base.bind(function (anActualValue) {
797 var transientStateKey;
798
799 transientStateKey = 'original_' + aKey;
800 if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) {
801 if (anActualValue != aValue) {
802 this.transientState()[transientStateKey] = anActualValue;
803 }
804 } else if (this.transientState()[transientStateKey] == aValue) {
805 this.transientState()[transientStateKey] = null;
806 }
807 }, this),
808 MochiKit.Base.partial(this._setIndexDataFunction, this.reference(), aKey, aValue)
809 ], {trace:false})
810 },
811
812 //-------------------------------------------------------------------------
813/*
814 'setValueForKey': function (aKey, aValue) {
815 return Clipperz.Async.callbacks("DirectLogin.setValueForKey", [
816 MochiKit.Base.method(this, 'getIndexDataForKey', aKey),
817 MochiKit.Base.bind(function (anActualValue) {
818 var transientStateKey;
819
820 transientStateKey = 'original_' + aKey;
821 if (MochiKit.Base.isUndefinedOrNull(this.transientState()[transientStateKey])) {
822 if (anActualValue != aValue) {
823 this.transientState()[transientStateKey] = anActualValue;
824 }
825 } else if (this.transientState()[transientStateKey] == aValue) {
826 this.transientState()[transientStateKey] = null;
827 }
828 }, this),
829 MochiKit.Base.method(this, 'setIndexDataForKey', aKey, aValue)
830 ], {trace:false})
831 },
832*/
833 //=========================================================================
834/*
835 'storedConfiguration': function () {
836 return this.record().getValue('directLogins' + '.' + this.reference());
837 },
838
839 //'setStoredConfiguration': function (aValue) {
840 // return this.record().setValue('directLogins' + '.' + this.reference(), aValue);
841 //},
842*/
843 //=========================================================================
844
845 'hasPendingChanges': function () {
846 varresult;
847 var deferredResult;
848
849 result = false;
850 result = result || this.isBrandNew();
851 result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_label']));
852 result = result || (! MochiKit.Base.isUndefinedOrNull(this.transientState()['original_favicon']));
853
854 if ((result == false) && (this.originalConfiguration() != null)) {
855 deferredResult = Clipperz.Async.callbacks("DirectLogin.hasPendingChanges", [
856 MochiKit.Base.method(this, 'serializedData'),
857 MochiKit.Base.bind(function (aCurrentConfiguration) {
858 varoriginalConfiguration;
859 var currentConfiguration;
860 var result;
861
862 originalConfiguration = this.originalConfiguration();
863 currentConfiguration = aCurrentConfiguration;
864
865 result = false;
866 result = result || (MochiKit.Base.compare(originalConfiguration['bookmarkletVersion'], currentConfiguration['bookmarkletVersion'])!= 0);
867 result = result || (MochiKit.Base.compare(originalConfiguration['formData'], currentConfiguration['formData']) != 0);
868 result = result || (MochiKit.Base.compare(originalConfiguration['formValues'], currentConfiguration['formValues']) != 0);
869 result = result || (MochiKit.Base.compare(originalConfiguration['bindingData'], currentConfiguration['bindingData']) != 0);
870
871 return result;
872 }, this)
873 ], {trace:false});
874 } else {
875 deferredResult = MochiKit.Async.succeed(result);
876 }
877
878 return deferredResult;
879 },
880
881 //-------------------------------------------------------------------------
882
883 'revertChanges': function () {
884 var deferredResult;
885
886 if (this.transientState()['original_label'] != null) {
887 this.setLabel(this.transientState()['original_label']);
888 }
889
890 if (this.transientState()['original_favicon'] != null) {
891 this.setFavicon(this.transientState()['original_favicon']);
892 }
893
894 if (this.originalConfiguration() != null) {
895 deferredResult = this.setValue('', this.originalConfiguration());
896 } else {
897 deferredResult = MochiKit.Async.succeed();
898 }
899
900 this._inputs = null;
901 this._bindings = null;
902 this._formValues= null;
903
904 this.resetTransientState(false);
905
906/*
907 if (this.hasInitiatedObjectDataStore()) {
908 deferredResult = Clipperz.Async.callbacks("DirectLogin.revertChanges", [
909 // MochiKit.Base.method(this.record(), 'setValue', 'directLogins' + '.' + this.reference(), this.originalState()),
910 MochiKit.Base.method(this, 'setValue', '', this.originalState()),
911 MochiKit.Base.method(this, 'resetObjectDataStore')
912 ], {trace:false})
913 } else {
914 deferredResult = MochiKit.Async.succeed();
915 }
916*/
917 return deferredResult;
918 },
919
920
921 //=========================================================================
922
923 'transientState': function () {
924 if (this._transientState == null) {
925 this._transientState = {}
926 }
927
928 return this._transientState;
929 },
930
931 'resetTransientState': function (isCommitting) {
932 this._transientState = null;
933 },
934
935 'commitTransientState': function (isCommitting) {
936 this._transientState = null;
937 this._isBrandNew = false;
938 },
939
940 //-------------------------------------------------------------------------
941
942 'originalConfiguration': function () {
943 return this.transientState()['original_configuration'];
944 },
945
946 'setOriginalConfiguration': function (aConfiguration) {
947 this.transientState()['original_configuration'] = Clipperz.Base.deepClone(aConfiguration);
948 },
949
950 //=========================================================================
951
952 'actualKey': function (aValueKey) {
953 var actualKey;
954
955 actualKey = 'directLogins' + '.' + this.reference();
956 if (aValueKey != '') {
957 actualKey = actualKey + '.' + aValueKey;
958 }
959
960 return actualKey;
961 },
962
963 //-------------------------------------------------------------------------
964
965 'getValue': function (aValueKey) {
966 return this.record().getValue(this.actualKey(aValueKey));
967 },
968
969 'setValue': function (aValueKey, aValue) {
970 // return this.record().setValue(this.actualKey(aValueKey), aValue);
971
972 return Clipperz.Async.callbacks("DirectLogin.setValue", [
973 MochiKit.Base.method(this, 'getValue', ''),
974 MochiKit.Base.bind(function (aValue) {
975 if (this.originalConfiguration() == null) {
976 this.setOriginalConfiguration(aValue);
977 }
978 }, this),
979 // MochiKit.Base.method(this, 'originalConfiguration'),
980 // Clipperz.Async.deferredIf("originalConfiguration has been set", [
981 // ], [
982 // MochiKit.Base.method(this, 'getValue', ''),
983 // MochiKit.Base.method(this, 'setOriginalConfiguration')
984 // ]),
985 MochiKit.Base.method(this.record(), 'setValue', this.actualKey(aValueKey), aValue)
986 ], {trace:false});
987 },
988
989 'removeValue': function (aValueKey) {
990 // return this.record().removeValue(this.actualKey(aValueKey));
991
992 return Clipperz.Async.callbacks("DirectLogin.setValue", [
993 MochiKit.Base.method(this, 'originalConfiguration'),
994 Clipperz.Async.deferredIf("originalConfiguration has been set", [
995 ], [
996 MochiKit.Base.method(this, 'getValue', ''),
997 MochiKit.Base.method(this, 'setOriginalConfiguration')
998 ]),
999 MochiKit.Base.method(this.record(), 'removeValue', this.actualKey(aValueKey))
1000 ], {trace:false});
1001 },
1002
1003 //=========================================================================
1004
1005 'content': function () {
1006 // return this.serializedData();
1007 // return MochiKit.Async.succeed(this);
1008
1009 var deferredResult;
1010 varfieldValues;
1011
1012 fieldValues = {};
1013 deferredResult = new Clipperz.Async.Deferred("DirectLogin.content", {trace:false});
1014 deferredResult.addMethod(this, 'reference');
1015 deferredResult.addCallback(function (aValue) { fieldValues['reference'] = aValue; });
1016 deferredResult.addMethod(this, 'label');
1017 deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; });
1018 deferredResult.addMethod(this, 'favicon');
1019 deferredResult.addCallback(function (aValue) { fieldValues['favicon'] = aValue; });
1020 deferredResult.addCallback(function () { return fieldValues; });
1021 deferredResult.callback();
1022
1023 return deferredResult;
1024 },
1025
1026 //=========================================================================
1027
1028 'deleteAllCleanTextData': function () {
1029 this._inputs = null;
1030 this._bindings = null;
1031 this._formValues = null;
1032
1033 this.resetTransientState();
1034 },
1035
1036 //-------------------------------------------------------------------------
1037
1038 'hasAnyCleanTextData': function () {
1039 var result;
1040
1041 result = false;
1042
1043 result = result || (this._inputs != null);
1044 result = result || (this._bindings != null);
1045 result = result || (this._formValues != null);
1046 result = result || (MochiKit.Base.keys(this.transientState()).length != 0);
1047
1048 return MochiKit.Async.succeed(result);
1049 },
1050
1051 //=========================================================================
1052 __syntaxFix__: "syntax fix"
1053});
1054
1055//#############################################################################
1056
1057Clipperz.PM.DataModel.DirectLogin.exception = {
1058 'WrongBookmarkletConfiguration': new MochiKit.Base.NamedError("Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration")
1059};
1060
1061Clipperz.PM.DataModel.DirectLogin.checkBookmarkletConfiguration = function(aConfiguration) {
1062 var configuration;
1063
1064 try {
1065 configuration = Clipperz.Base.evalJSON(aConfiguration);
1066 // configuration = Clipperz.PM.BookmarkletProcessor.sanitizeBookmarkletConfiguration(configuration);
1067
1068 if (MochiKit.Base.isUndefinedOrNull(configuration['page']['title'])
1069 ||MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['action'])
1070 // ||MochiKit.Base.isUndefinedOrNull(configuration['form']['attributes']['method'])
1071 ||MochiKit.Base.isUndefinedOrNull(configuration['form']['inputs'])
1072 ||MochiKit.Base.isUndefinedOrNull(configuration['version'])
1073 ) {
1074 throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration;
1075 }
1076
1077 // if (MochiKit.Base.isUndefinedOrNull(configuration['favicon'])) {
1078 // throw Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration;
1079 // }
1080
1081 } catch (exception) {
1082 throw exception;
1083 }
1084
1085 return configuration;
1086};
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js
new file mode 100644
index 0000000..a8ebb97
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginBinding.js
@@ -0,0 +1,120 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28
29//#############################################################################
30
31Clipperz.PM.DataModel.DirectLoginBinding = function(aDirectLogin, args) {
32 args = args || {};
33
34 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
35
36 this._key = args.key|| Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fieldKey = args.field || /* this.directLogin().fieldWithName(args.fieldName).reference() || */null;
38
39 return this;
40}
41
42Clipperz.PM.DataModel.DirectLoginBinding.prototype = MochiKit.Base.update(null, {
43
44 'toString': function() {
45 return "DirectLoginBinding (" + this.key() + ", " + this.fieldKey() + ")";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'directLogin': function () {
51 return this._directLogin;
52 },
53
54 //-------------------------------------------------------------------------
55
56 'key': function() {
57 return this._key;
58 },
59
60 //-------------------------------------------------------------------------
61
62 'fieldKey': function() {
63 return this._fieldKey;
64 },
65
66 'setFieldKey': function(aValue) {
67 this._fieldKey = aValue;
68
69 return this.directLogin().setValue('bindingData' + '.' + this.key(), aValue);
70 },
71
72 //'fieldName': function() {
73 // return this._fieldName;
74 //},
75
76 //-------------------------------------------------------------------------
77
78 'field': function() {
79 var deferredResult;
80
81 if (this.fieldKey() != null) {
82 deferredResult = Clipperz.Async.callbacks("DirectLoginBinding.field [1]", [
83 MochiKit.Base.method(this.directLogin().record(), 'fields'),
84 MochiKit.Base.itemgetter(this.fieldKey())
85 ], {trace:false});
86 // } else if (this.fieldName() != null) {
87 // WTF = TODO;
88 // result = this.directLogin().record().fieldWithName(this.fieldName());
89 //
90 // this.setFieldKey(result.key());
91 } else {
92 deferredResult = MochiKit.Async.succeed(null);
93 }
94
95 return deferredResult;
96 },
97
98 'setField': function (aField) {
99 this.setFieldKey(aField.reference());
100 },
101
102 //-------------------------------------------------------------------------
103/*
104 'fieldValue': function () {
105 return Clipperz.Async.callbacks("DirectLoginBinding.fieldValue", [
106 MochiKit.Base.method('field'),
107 MochiKit.Base.methodcaller('value')
108 ], {trace:false});
109 },
110*/
111 //-------------------------------------------------------------------------
112
113 'serializedData': function() {
114 return this.fieldKey();
115 },
116
117 //-------------------------------------------------------------------------
118 __syntaxFix__: "syntax fix"
119});
120
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
new file mode 100644
index 0000000..2429f88
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginFormValue.js
@@ -0,0 +1,101 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28
29//#############################################################################
30
31Clipperz.PM.DataModel.DirectLoginFormValue = function(aDirectLogin, args) {
32 args = args || {};
33
34 this._directLogin = aDirectLogin|| Clipperz.Base.exception.raise('MandatoryParameter');
35
36 this._key = args.key || Clipperz.Base.exception.raise('MandatoryParameter');
37 this._fieldOptions = args.fieldOptions|| Clipperz.Base.exception.raise('MandatoryParameter');
38 this._value = args.value || null;
39
40 return this;
41}
42
43Clipperz.PM.DataModel.DirectLoginFormValue.prototype = MochiKit.Base.update(null, {
44
45 'toString': function() {
46 return "DirectLoginFormValue (" + this.key() + ", " + this.value() + ")";
47 },
48
49 //-------------------------------------------------------------------------
50
51 'directLogin': function () {
52 return this._directLogin;
53 },
54
55 //-------------------------------------------------------------------------
56
57 'key': function() {
58 return this._key;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'fieldOptions': function() {
64 return this._fieldOptions;
65 },
66
67 //-------------------------------------------------------------------------
68
69 'type': function () {
70 return this.fieldOptions()['type'];
71 },
72
73 //-------------------------------------------------------------------------
74
75 'value': function() {
76 varresult;
77
78 result = this._value;
79
80 // if ((result == null) && (this.type() == 'checkbox')) {
81 // result = false;
82 // };
83
84 return result;
85 },
86
87 'setValue': function (aValue) {
88 this._value = aValue;
89 return this.directLogin().setValue('formValues' + '.' + this.key(), aValue);
90 },
91
92 //-------------------------------------------------------------------------
93/*
94 'serializedData': function() {
95 return this.value();
96 },
97*/
98 //-------------------------------------------------------------------------
99 __syntaxFix__: "syntax fix"
100});
101
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js
new file mode 100644
index 0000000..d9995fc
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/DirectLoginInput.js
@@ -0,0 +1,192 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28//#############################################################################
29
30Clipperz.PM.DataModel.DirectLoginInput = function(args) {
31 this._args = args;
32
33 return this;
34}
35
36Clipperz.PM.DataModel.DirectLoginInput.prototype = MochiKit.Base.update(null, {
37
38 'args': function() {
39 return this._args;
40 },
41
42 //-------------------------------------------------------------------------
43
44 'name': function() {
45 return this.args()['name'];
46 },
47
48 //-------------------------------------------------------------------------
49
50 'type': function() {
51 var result;
52
53 result = this.args()['type'];
54
55 if (result != null) {
56 result = result.toLowerCase();
57 }
58 return result;
59 },
60
61 //-------------------------------------------------------------------------
62
63 'options': function() {
64 return this.args()['options'];
65 },
66
67 //-------------------------------------------------------------------------
68
69 'value': function() {
70 return this.args()['value'];
71 },
72
73 //-------------------------------------------------------------------------
74 /*
75 'formConfiguration': function(someFormValues, someBindings, someFields) {
76 var result;
77
78 if (this.shouldSetValue()) {
79 switch (this.type()) {
80 case 'select':
81 var currentValue;
82 var options;
83
84 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
85 currentValue = someFormValues[this.name()];
86 options = this.args()['options'];
87
88 result = MochiKit.DOM.SELECT({name:this.name()},
89 MochiKit.Base.map(function(anOption) {
90 var options;
91
92 options = {value:anOption['value']};
93 if (currentValue == anOption['value']) {
94 options.selected = true;
95 }
96
97 return MochiKit.DOM.OPTION(options, anOption['label'])
98 }, options)
99 )
100 break;
101 case 'checkbox':
102 var options;
103
104 options = {type:'checkbox', name: this.name()};
105 // if (this.directLogin()._configuration['formValues'][this.name()] == true) {
106 if (someFormValues[this.name()] == true) {
107 options['checked'] = true;
108 };
109
110 result = MochiKit.DOM.INPUT(options, null);
111 break;
112 case 'radio':
113 var currentName;
114 var currentValue;
115 var options;
116
117 currentName = this.name();
118 // currentValue = this.directLogin()._configuration['formValues'][this.name()];
119 currentValue = someFormValues[this.name()];
120 options = this.args()['options'];
121
122 result = MochiKit.DOM.DIV(null,
123 MochiKit.Base.map(function(anOption) {
124 var options;
125 var isChecked;
126 var inputNode;
127 var divNode;
128
129 options = {type:'radio', name:currentName, value:anOption['value']}
130 isChecked = (currentValue == anOption['value']);
131 if (isChecked) {
132 options.checked = true;
133 }
134
135 if (Clipperz_IEisBroken == true) {
136 var checkedValue;
137
138 checkedValue = (isChecked ? " CHECKED" : "");
139 inputNode = MochiKit.DOM.currentDocument().createElement("<INPUT TYPE='RADIO' NAME='" + currentName + "' VALUE='" + anOption['value'] + "'" + checkedValue + ">");
140 } else {
141 inputNode = MochiKit.DOM.INPUT(options, anOption['value']);
142 }
143 divNode = MochiKit.DOM.DIV(null, inputNode);
144
145 return divNode;
146 }, options)
147 );
148 break;
149 }
150 } else {
151 var binding;
152 // binding = this.directLogin().bindings()[this.name()];
153 binding = someBindings[this.name()];
154
155 result = MochiKit.DOM.INPUT({
156 type:((this.type() != 'password') ? this.type() : 'text'),
157 name:this.name(),
158 // value:((binding != null)? binding.field().value() : this.value())
159 value:((binding != null)? someFields[binding.fieldKey()]['value'] : this.value())
160 // value:((binding != null)? someFields[binding.fieldKey()].value() : this.value())
161 }, null);
162 }
163
164 return result;
165 },
166 */
167 //-------------------------------------------------------------------------
168
169 'needsFormValue': function() {
170 var type;
171 var result;
172
173 type = this.type();
174 result = ((type == 'checkbox') || (type == 'radio') || (type == 'select'));
175
176 return result;
177 },
178
179 'needsBinding': function() {
180 var type;
181 var result;
182
183 type = this.type();
184 result = ((type == 'text') || (type == 'password'));
185
186 return result;
187 },
188
189 //-------------------------------------------------------------------------
190 __syntaxFix__: "syntax fix"
191});
192
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js b/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
new file mode 100644
index 0000000..1aa7a52
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/EncryptedRemoteObject.js
@@ -0,0 +1,542 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!";
26}
27
28if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
29if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
30
31Clipperz.PM.DataModel.EncryptedRemoteObject = function(args) {
32 args = args || {};
33
34 this._name = args.name || null;
35 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
36 this._isBrandNew = ((args.reference == null) && (args.remoteData == null));
37
38 if ((this._isBrandNew == false) && (args['retrieveKeyFunction'] == null)) {
39 Clipperz.Base.exception.raise('MandatoryParameter');
40 } else {
41 this._retrieveKeyFunction = args['retrieveKeyFunction'];
42 }
43
44 this._retrieveRemoteDataFunction = args.retrieveRemoteDataFunction|| null;
45 this._remoteData = args.remoteData || null;
46 // this._remoteData = args.remoteData ? Clipperz.Base.deepClone(args.remoteData) : null;
47 if ((!this._isBrandNew) && ((this._retrieveRemoteDataFunction == null) && (this._remoteData == null))) {
48 Clipperz.Base.exception.raise('MandatoryParameter');
49 }
50
51
52 this._encryptedDataKeypath = args.encryptedDataKeypath || 'data'; //Clipperz.Base.exception.raise('MandatoryParameter');
53 this._encryptedVersionKeypath = args.encryptedVersionKeypath || 'version';//Clipperz.Base.exception.raise('MandatoryParameter');
54
55
56 this._transientState = null;
57 this._deferredLocks = {};
58
59 if (this._isBrandNew == true) {
60 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [1]'}*/);
61 } else {
62 this._objectDataStore = null;
63 }
64
65 return this;
66}
67
68//
69 // Basic data workflow
70 //=======================
71//
72 //getRemoteData
73 // unpackRemoteData
74 // getDecryptData [encryptedDataKeypath, encryptedVersionKeypath]
75 // unpackData
76 //
77 //
78 // ?? packData
79 // ?? encryptDataWithKey
80 // ??packRemoteData [encryptedDataKeypath (?), encryptedVersionKeypath (?)]
81//
82
83Clipperz.PM.DataModel.EncryptedRemoteObject.prototype = MochiKit.Base.update(null, {
84
85 'toString': function () {
86 return "Clipperz.PM.DataModel.EncryptedRemoteObject" + (this.name() != null ? " - " + this.name() : "");
87 },
88
89 //-------------------------------------------------------------------------
90
91 'name': function () {
92 return this._name;
93 },
94
95 //-------------------------------------------------------------------------
96
97 'reference': function () {
98 return this._reference;
99 },
100
101 'setReference': function (aValue) {
102 this._reference = aValue;
103
104 return this._reference;
105 },
106
107 //-------------------------------------------------------------------------
108
109 'transientState': function () {
110 if (this._transientState == null) {
111 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.transientState [2]'}*/);
112 }
113
114 return this._transientState;
115 },
116
117 'resetTransientState': function (isCommitting) {
118 if (this._transientState != null) {
119 this._transientState.removeAllData();
120 }
121
122 this._transientState = null;
123 },
124
125 //-------------------------------------------------------------------------
126
127 'isBrandNew': function () {
128 return this._isBrandNew;
129 },
130
131 //-------------------------------------------------------------------------
132
133 'getKey': function () {
134 var deferredResult;
135 var deferredLock;
136
137 deferredLock = this.getDeferredLockForKey('key');
138
139 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getKey", {trace:false});
140 deferredResult.acquireLock(deferredLock);
141 deferredResult.addMethod(
142 this.decryptedDataStore(),
143 'deferredGetOrSet',
144 'decryptionKey',
145 MochiKit.Base.partial(this.retrieveKeyFunction(), this.reference())
146 );
147 deferredResult.releaseLock(deferredLock);
148 deferredResult.callback();
149
150 return deferredResult;
151 },
152
153 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
154
155 'retrieveKeyFunction': function () {
156 return this._retrieveKeyFunction;
157 },
158
159 'setRetrieveKeyFunction': function (aFunction) {
160 this._retrieveKeyFunction = aFunction;
161 },
162
163 //-------------------------------------------------------------------------
164
165 'hasLoadedRemoteData': function () {
166 return (this._remoteData != null);
167 },
168
169 'getRemoteData': function () {
170 var deferredResult;
171 vardeferredLock;
172
173 deferredLock = this.getDeferredLockForKey('remoteData');
174
175 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObjects.getRemoteData", {trace:false});
176 deferredResult.acquireLock(deferredLock);
177 deferredResult.addCallback(MochiKit.Base.bind(function () {
178 var innerDeferredResult;
179
180 if (this._remoteData != null) {
181 innerDeferredResult = MochiKit.Async.succeed(this._remoteData);
182 } else {
183 innerDeferredResult = Clipperz.Async.callbacks("EncryptedRemoteObjects.getRemoteData <inner deferred>", [
184 MochiKit.Base.partial(this.retrieveRemoteDataFunction(), this.reference()),
185 MochiKit.Base.method(this, 'unpackRemoteData'),
186 MochiKit.Base.bind(function (someData) {
187 this._remoteData = someData;
188 return this._remoteData;
189 }, this)
190 ], {trace:false});
191 }
192
193 return innerDeferredResult;
194 }, this))
195 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
196 deferredResult.releaseLock(deferredLock);
197
198 deferredResult.callback();
199
200 return deferredResult;
201 },
202
203 //-------------------------------------------------------------------------
204
205 'unpackRemoteData': function (someData) {
206 return MochiKit.Async.succeed(someData);
207 },
208
209 //.........................................................................
210
211 'packRemoteData': function (someData) {
212 var result;
213
214 result = {
215 'reference':this.reference(),
216 'data': someData,
217 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
218 };
219
220 return MochiKit.Async.succeed(result);
221 },
222
223 //-------------------------------------------------------------------------
224
225 'retrieveRemoteDataFunction': function () {
226 return this._retrieveRemoteDataFunction;
227 },
228
229 'setRetrieveRemoteDataFunction': function (aFunction) {
230 this._retrieveRemoteDataFunction = aFunction;
231 },
232
233 //-------------------------------------------------------------------------
234
235 'decryptedDataStore': function () {
236 if (this._decryptedDataStore == null) {
237 this._decryptedDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.decryptedDataStore [3]'}*/);
238 };
239
240 return this._decryptedDataStore;
241 },
242
243 //.........................................................................
244
245 'getDecryptedData': function () {
246 var deferredResult;
247 var deferredLock;
248
249 deferredLock = this.getDeferredLockForKey('decryptedData');
250
251 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData", {trace:false});
252 deferredResult.acquireLock(deferredLock);
253 deferredResult.addMethod(this, 'decryptedDataStore');
254 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredGetOrSet', 'decryptedData', MochiKit.Base.bind(function () {
255 varinnerDeferredResult;
256
257 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.getDecryptedData <inner deferred>", {trace:false});
258
259 innerDeferredResult.addMethod(this, 'getRemoteData');
260 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
261 innerDeferredResult.collectResults({
262 'key': MochiKit.Base.method(this, 'getKey'),
263 'value':MochiKit.Base.itemgetter(this._encryptedDataKeypath),
264 'version':MochiKit.Base.itemgetter(this._encryptedVersionKeypath)
265 });
266
267 innerDeferredResult.addCallback(Clipperz.PM.Crypto.deferredDecrypt);
268 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
269 innerDeferredResult.addMethod(this, 'unpackData');
270 innerDeferredResult.callback();
271
272 return innerDeferredResult;
273 }, this)));
274 deferredResult.releaseLock(deferredLock);
275 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
276 deferredResult.callback();
277
278 return deferredResult;
279 },
280
281 //-------------------------------------------------------------------------
282
283 'setValue': function(aKey, aValue) {
284 var deferredResult;
285
286 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.setValue", {trace:false});
287 deferredResult.addMethod(this, '_getObjectDataStore');
288 deferredResult.addCallback(MochiKit.Base.methodcaller('setValue', aKey, aValue));
289 deferredResult.callback();
290
291 return deferredResult;
292 },
293
294 //.........................................................................
295
296 'getValue': function (aKey) {
297 return Clipperz.Async.callbacks("EncryptedRemoteObject.getValue", [
298 MochiKit.Base.method(this, '_getObjectDataStore'),
299 MochiKit.Base.methodcaller('getValue', aKey)
300 ], {trace:false});
301 },
302
303 //.........................................................................
304
305 'removeValue': function (aKey) {
306 return Clipperz.Async.callbacks("EncryptedRemoteObject.removeValue", [
307 MochiKit.Base.method(this, '_getObjectDataStore'),
308 MochiKit.Base.methodcaller('removeValue', aKey)
309 ], {trace:false});
310 },
311
312 //.........................................................................
313
314 'values': function () {
315 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
316 MochiKit.Base.method(this, '_getObjectDataStore'),
317 MochiKit.Base.methodcaller('values')
318 ], {trace:false});
319 },
320
321 'setValues': function (someValues) {
322 return Clipperz.Async.callbacks("EncryptedRemoteObject.values", [
323 MochiKit.Base.method(this, '_getObjectDataStore'),
324 MochiKit.Base.methodcaller('setValues', someValues)
325 ], {trace:false});
326 },
327
328 //.........................................................................
329
330 '_getObjectDataStore': function () {
331 var deferredResult;
332 var deferredLock;
333
334 deferredLock = this.getDeferredLockForKey('objectDataStore');
335
336 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore", {trace:false});
337 deferredResult.acquireLock(deferredLock);
338 deferredResult.addCallback(MochiKit.Base.bind(function () {
339 var innerDeferredResult;
340
341 if (this._objectDataStore == null) {
342 this._objectDataStore = new Clipperz.KeyValueObjectStore(/*{'name':'EncryptedRemoteObject.objectDataStore [4]'}*/);
343
344 innerDeferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject._getObjectDataStore <inner deferred>", {trace:false});
345 innerDeferredResult.addMethod(this, 'getDecryptedData');
346 innerDeferredResult.addMethod(this._objectDataStore, 'initWithValues');
347 innerDeferredResult.callback();
348 } else {
349 innerDeferredResult = MochiKit.Async.succeed(this._objectDataStore);
350 }
351
352 return innerDeferredResult;
353 }, this));
354 deferredResult.releaseLock(deferredLock);
355 deferredResult.callback();
356
357 return deferredResult;
358 },
359
360 'hasInitiatedObjectDataStore': function () {
361 return (this._objectDataStore != null);
362 },
363
364 //-------------------------------------------------------------------------
365
366 'getDeferredLockForKey': function (aKey) {
367 var result;
368
369 result = this._deferredLocks[aKey];
370
371 if (typeof(result) == 'undefined') {
372 result = new MochiKit.Async.DeferredLock();
373 this._deferredLocks[aKey] = result;
374 }
375
376 return result;
377 },
378
379 //-------------------------------------------------------------------------
380
381 'unpackData': function (someData) { //++
382 return someData;
383 },
384
385 'packData': function (someData) { //++
386 return someData;
387 },
388
389 //-------------------------------------------------------------------------
390
391 'hasPendingChanges': function () {
392 var deferredResult;
393 var tempObj = this;
394
395 if (this.isBrandNew()) {
396 // deferredResult = MochiKit.Async.succeed(true);
397 deferredResult = this.hasPendingChangesWhenBrandNew();
398 } else if (this.hasInitiatedObjectDataStore()) {
399 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.hasPendingChanges", {trace:false});
400 deferredResult.collectResults({
401 'decryptedData': [
402 MochiKit.Base.method(this, 'getDecryptedData'),
403 Clipperz.Base.serializeJSON
404 ],
405 'objectData': [
406 MochiKit.Base.method(this, '_getObjectDataStore'),
407 MochiKit.Base.methodcaller('values'),
408 Clipperz.Base.serializeJSON
409 ]
410 });
411 deferredResult.addCallback(function (someValues) {
412 return (someValues['decryptedData'] != someValues['objectData']);
413 });
414 deferredResult.callback();
415 } else {
416 deferredResult = MochiKit.Async.succeed(false);
417 }
418
419 return deferredResult;
420 },
421
422 'hasPendingChangesWhenBrandNew': function () {
423 return MochiKit.Async.succeed(true);
424 },
425
426 //-------------------------------------------------------------------------
427
428 'commitTransientState': function () {
429 var deferredResult;
430
431 // if (this.transientState().getValue('__prepareRemoteData') == true) {
432 if (this.transientState().getValue('packedRemoteData') != null) {
433 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - prepareRemoteData", [
434 MochiKit.Base.bind(function (someData) {
435 this._remoteData = this.transientState().getValue('packedRemoteData');
436 }, this),
437
438 MochiKit.Base.method(this, '_getObjectDataStore'),
439 MochiKit.Base.methodcaller('values'),
440 Clipperz.Base.deepClone,
441 MochiKit.Base.method(this.decryptedDataStore(), 'setValue', 'decryptedData'),
442
443 MochiKit.Base.method(this, 'resetTransientState', true)
444 ], {trace:false});
445
446 } else {
447 deferredResult = Clipperz.Async.callbacks("EncryptedRemoteObject.commitTransientState - NO prepareRemoteData", [
448 MochiKit.Base.method(this, 'resetTransientState', true)
449 ], {trace:false});
450 }
451
452 this._isBrandNew = false;
453
454 return deferredResult;
455 },
456
457 //-------------------------------------------------------------------------
458
459 'revertChanges': function () {
460 if (this.hasInitiatedObjectDataStore()) {
461 this._objectDataStore.removeAllData();
462 this._objectDataStore = null;
463 }
464 this.resetTransientState(false);
465
466 return MochiKit.Async.succeed();
467 },
468
469 //-------------------------------------------------------------------------
470
471 'deleteAllCleanTextData': function () {
472 var deferredResult;
473
474 deferredResult = new Clipperz.Async.Deferred("EncryptedRemoteObject.deleteAllCleanTextData", {trace:false});
475
476 deferredResult.addMethod(this, 'resetTransientState', false);
477
478 deferredResult.acquireLock(this.getDeferredLockForKey('decryptedData'));
479 deferredResult.addCallback(MochiKit.Base.bind(function () {
480 if (this._decryptedDataStore != null) {
481 this._decryptedDataStore.removeAllData();
482 }
483 }, this));
484 deferredResult.releaseLock(this.getDeferredLockForKey('decryptedData'));
485
486 deferredResult.acquireLock(this.getDeferredLockForKey('objectDataStore'));
487 deferredResult.addCallback(MochiKit.Base.bind(function () {
488 if (this._objectDataStore != null) {
489 this._objectDataStore.removeAllData();
490 this._objectDataStore = null;
491 }
492 }, this));
493 deferredResult.releaseLock(this.getDeferredLockForKey('objectDataStore'));
494
495 deferredResult.callback();
496
497 return deferredResult;
498 },
499
500 //.........................................................................
501
502 'hasAnyCleanTextData': function () {
503 var result;
504
505 result = false;
506
507 result = result || (! this.decryptedDataStore().isEmpty());
508 result = result || (! this.transientState().isEmpty());
509 if (this.hasInitiatedObjectDataStore()) {
510 result = result || (! this._objectDataStore.isEmpty());
511 }
512
513 return MochiKit.Async.succeed(result);
514 },
515
516 //-------------------------------------------------------------------------
517
518 'prepareRemoteDataWithKey': function (aKey) {
519 return Clipperz.Async.callbacks("EncryptedRemoteObject.prepareRemoteDataWithKey", [
520 // MochiKit.Base.method(this.transientState(), 'setValue', '__prepareRemoteData', true),
521 MochiKit.Base.method(this, '_getObjectDataStore'),
522 MochiKit.Base.methodcaller('values'),
523 MochiKit.Base.method(this, 'packData'),
524 function (someData) {
525 return Clipperz.PM.Crypto.deferredEncrypt({
526 'key': aKey,
527 'value':someData,
528 'version':Clipperz.PM.Crypto.encryptingFunctions.currentVersion
529 })
530 },
531 MochiKit.Base.method(this, 'packRemoteData'),
532 MochiKit.Base.method(this.transientState(), 'setValue', 'packedRemoteData'),
533 function (someData) {
534 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'advanceProgress');
535 return someData;
536 }
537 ], {trace:false});
538 },
539
540 //-------------------------------------------------------------------------
541 __syntaxFix__: "syntax fix"
542});
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js b/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js
new file mode 100644
index 0000000..fbca1ff
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/OneTimePassword.js
@@ -0,0 +1,350 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28
29//#############################################################################
30
31Clipperz.PM.DataModel.OneTimePassword = function(args) {
32 args = args || {};
33
34 //this._user = args['user'];
35 this._reference = args['reference']|| Clipperz.PM.Crypto.randomKey();
36 this._password = args['password'];
37 this._passwordValue = Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword(args['password']);
38 this._creationDate = args['created'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['created']) : new Date();
39 this._usageDate = args['used'] ? Clipperz.PM.Date.parseDateWithUTCFormat(args['used']) : null;
40
41 this._status = args['status'] || 'ACTIVE'; //'REQUESTED', 'USED', 'DISABLED'
42 this._connectionInfo= null;
43
44 this._key = null;
45 this._keyChecksum= null;
46
47 return this;
48}
49
50Clipperz.PM.DataModel.OneTimePassword.prototype = MochiKit.Base.update(null, {
51
52 'toString': function() {
53 return "Clipperz.PM.DataModel.OneTimePassword";
54 },
55/*
56 //-------------------------------------------------------------------------
57
58 'user': function() {
59 return this._user;
60 },
61
62 //-------------------------------------------------------------------------
63
64 'password': function() {
65 return this._password;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'passwordValue': function() {
71 return this._passwordValue;
72 },
73
74 //-------------------------------------------------------------------------
75
76 'creationDate': function() {
77 return this._creationDate;
78 },
79
80 //-------------------------------------------------------------------------
81
82 'reference': function() {
83 return this._reference;
84 },
85
86 //-------------------------------------------------------------------------
87
88 'key': function() {
89 if (this._key == null) {
90 this._key = Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword(this.user().username(), this.passwordValue());
91 }
92
93 return this._key;
94 },
95
96 //-------------------------------------------------------------------------
97
98 'keyChecksum': function() {
99 if (this._keyChecksum == null) {
100 this._keyChecksum = Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword(this.user().username(), this.passwordValue());
101 }
102
103 return this._keyChecksum;
104 },
105*/
106 //-------------------------------------------------------------------------
107
108 'status': function() {
109 return this._status;
110 },
111
112 'setStatus': function(aValue) {
113 this._status = aValue;
114 },
115
116 //-------------------------------------------------------------------------
117/*
118 'serializedData': function() {
119 var result;
120
121 result = {
122 'password': this.password(),
123 'created': this.creationDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.creationDate()) : null,
124 'used': this.usageDate() ? Clipperz.PM.Date.formatDateWithUTCFormat(this.usageDate()) : null,
125 'status': this.status()
126 };
127
128 return result;
129 },
130
131 //-------------------------------------------------------------------------
132
133 'packedPassphrase': function() {
134 var result;
135 var packedPassphrase;
136 var encodedPassphrase;
137 varprefixPadding;
138 var suffixPadding;
139 var getRandomBytes;
140
141 getRandomBytes = MochiKit.Base.method(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes');
142
143 encodedPassphrase = new Clipperz.ByteArray(this.user().passphrase()).toBase64String();
144//Clipperz.logDebug("--- encodedPassphrase.length: " + encodedPassphrase.length);
145 prefixPadding = getRandomBytes(getRandomBytes(1).byteAtIndex(0)).toBase64String();
146//Clipperz.logDebug("--- prefixPadding.length: " + prefixPadding.length);
147 suffixPadding = getRandomBytes((500 - prefixPadding.length - encodedPassphrase.length) * 6 / 8).toBase64String();
148//Clipperz.logDebug("--- suffixPadding.length: " + suffixPadding.length);
149//Clipperz.logDebug("--- total.length: " + (prefixPadding.length + encodedPassphrase.length + suffixPadding.length));
150
151 packedPassphrase = {
152 'prefix': prefixPadding,
153 'passphrase': encodedPassphrase,
154 'suffix': suffixPadding
155 };
156
157 // result = Clipperz.Base.serializeJSON(packedPassphrase);
158 result = packedPassphrase;
159//Clipperz.logDebug("===== OTP packedPassprase: [" + result.length + "]" + result);
160//Clipperz.logDebug("<<< OneTimePassword.packedPassphrase");
161
162 return result;
163 },
164
165 //-------------------------------------------------------------------------
166
167 'encryptedPackedPassphrase': function() {
168 return Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion(this.passwordValue(), this.packedPassphrase())
169 },
170
171 //-------------------------------------------------------------------------
172
173 'encryptedData': function() {
174 var deferredResult;
175 varresult;
176
177//Clipperz.logDebug(">>> OneTimePassword.encryptedData");
178//Clipperz.logDebug("--- OneTimePassword.encryptedData - id: " + this.reference());
179 result = {
180 'reference': this.reference(),
181 'key': this.key(),
182 'keyChecksum': this.keyChecksum(),
183 'data': "",
184 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion
185 }
186//Clipperz.logDebug("--- OneTimePassword.encryptedData - 2: " + Clipperz.Base.serializeJSON(result));
187 deferredResult = new MochiKit.Async.Deferred();
188//Clipperz.logDebug("--- OneTimePassword.encryptedData - 3");
189//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 1: " + res); return res;});
190 //# deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncryptWithCurrentVersion, this.passwordValue(), this.packedPassphrase());
191 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedPackedPassphrase'));
192//Clipperz.logDebug("--- OneTimePassword.encryptedData - 4");
193//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 2: [" + res.length + "]" + res); return res;});
194 deferredResult.addCallback(function(aResult, res) {
195 aResult['data'] = res;
196 return aResult;
197 }, result);
198//Clipperz.logDebug("--- OneTimePassword.encryptedData - 5");
199//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.encryptedData - 3: " + Clipperz.Base.serializeJSON(res)); return res;});
200 deferredResult.callback();
201//Clipperz.logDebug("--- OneTimePassword.encryptedData - 6");
202
203 return deferredResult;
204 },
205
206 //-------------------------------------------------------------------------
207
208 'saveChanges': function() {
209 var deferredResult;
210 varresult;
211
212//Clipperz.logDebug(">>> OneTimePassword.saveChanges");
213 result = {};
214 deferredResult = new MochiKit.Async.Deferred();
215
216 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptUserData');
217 deferredResult.addCallback(MochiKit.Base.method(this.user(), 'encryptedData'));
218 deferredResult.addCallback(function(aResult, res) {
219 aResult['user'] = res;
220 return aResult;
221 }, result);
222
223 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_encryptOTPData');
224 deferredResult.addCallback(MochiKit.Base.method(this, 'encryptedData'));
225 deferredResult.addCallback(function(aResult, res) {
226 aResult['oneTimePassword'] = res;
227 return aResult;
228 }, result);
229
230 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_sendingData');
231//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 1: " + Clipperz.Base.serializeJSON(res)); return res;});
232 deferredResult.addCallback(MochiKit.Base.method(this.user().connection(), 'message'), 'addNewOneTimePassword');
233
234 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'updatedProgressState', 'saveOTP_updatingInterface');
235//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
236 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'notify', 'OTPUpdated');
237 deferredResult.addCallback(Clipperz.NotificationCenter.deferredNotification, this, 'oneTimePassword_saveChanges_done', null);
238//deferredResult.addBoth(function(res) {Clipperz.logDebug("OneTimePassword.saveChanges - 2: " + res); return res;});
239 deferredResult.callback();
240//Clipperz.logDebug("<<< OneTimePassword.saveChanges");
241
242 return deferredResult;
243 },
244
245 //-------------------------------------------------------------------------
246
247 'usageDate': function() {
248 return this._usageDate;
249 },
250
251 'setUsageDate': function(aValue) {
252 this._usageDate = aValue;
253 },
254
255 //-------------------------------------------------------------------------
256
257 'connectionInfo': function() {
258 return this._connectionInfo;
259 },
260
261 'setConnectionInfo': function(aValue) {
262 this._connectionInfo = aValue;
263 },
264
265 //-------------------------------------------------------------------------
266
267 'isExpired': function() {
268 return (this.usageDate() != null);
269 },
270
271 //-------------------------------------------------------------------------
272
273 'updateStatusWithValues': function(someValues) {
274 var result;
275
276 result = false;
277
278 if (someValues['status'] != this.status()) {
279 result = true;
280 }
281
282 this.setStatus(someValues['status']);
283 this.setUsageDate(Clipperz.PM.Date.parseDateWithUTCFormat(someValues['requestDate']));
284 this.setConnectionInfo(someValues['connection']);
285
286 return result;
287 },
288 */
289 //-------------------------------------------------------------------------
290 __syntaxFix__: "syntax fix"
291});
292
293//#############################################################################
294
295Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) {
296 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2);
297}
298
299Clipperz.PM.DataModel.OneTimePassword.computeKeyChecksumWithUsernameAndPassword = function(anUsername, aPassword) {
300 return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(anUsername + aPassword)).toHexString().substring(2);
301}
302
303//=============================================================================
304
305Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue = function(aPassword) {
306 var result;
307
308 //"yaxx k7ww - f8y6 tqz5 - 58b6 th44 - 9cwv q0fg"
309 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
310 try {
311 var passwordByteArray;
312
313 passwordByteArray = new Clipperz.ByteArray();
314 passwordByteArray.appendBase32String(aPassword);
315
316 result = true;
317 } catch(exception) {
318 result = false;
319 }
320 } else {
321 result = false;
322 }
323
324 return result;
325}
326
327//=============================================================================
328
329Clipperz.PM.DataModel.OneTimePassword.normalizedOneTimePassword = function(aPassword) {
330 varresult;
331
332 if (aPassword.replace(/[\s\-]/g, '').length == 32) {
333 try {
334 var passwordByteArray;
335
336 passwordByteArray = new Clipperz.ByteArray();
337 passwordByteArray.appendBase32String(aPassword);
338
339 result = passwordByteArray.toBase64String();
340 } catch(exception) {
341 result = aPassword;
342 }
343 } else {
344 result = aPassword;
345 }
346
347 return result;
348}
349
350//#############################################################################
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js
new file mode 100644
index 0000000..01e7196
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.Field.js
@@ -0,0 +1,186 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.Record.Version) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.Record.Version.Field depends on Clipperz.PM.DataModel.Record.Version!";
26}
27
28Clipperz.PM.DataModel.Record.Version.Field = function(args) {
29 Clipperz.PM.DataModel.Record.Version.Field.superclass.constructor.apply(this, arguments);
30
31 this._recordVersion = args.recordVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
32 this._reference = args.reference || Clipperz.PM.Crypto.randomKey();
33
34 return this;
35}
36
37
38Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version.Field, Object, {
39
40 'toString': function() {
41 return "Record.Version.Field (" + this.reference() + ")";
42 },
43
44 //-------------------------------------------------------------------------
45
46 'recordVersion': function () {
47 return this._recordVersion;
48 },
49
50 //-------------------------------------------------------------------------
51
52 'reference': function () {
53 return this._reference;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'getItem': function (aKey) {
59 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
60 MochiKit.Base.method(this, 'recordVersion'),
61 MochiKit.Base.methodcaller('getValue', 'fields' + '.' + this.reference() + '.' + aKey)
62 ], {trace:false});
63 },
64
65 'setItem': function (aKey, aValue) {
66 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.getItem", [
67 MochiKit.Base.method(this, 'recordVersion'),
68 MochiKit.Base.methodcaller('setValue', 'fields' + '.' + this.reference() + '.' + aKey, aValue)
69 ], {trace:false});
70 },
71
72 //-------------------------------------------------------------------------
73
74 'label': function () {
75 return this.getItem('label');
76 },
77
78 'setLabel': function (aValue) {
79 return this.setItem('label', aValue);
80 },
81
82 //-------------------------------------------------------------------------
83
84 'value': function () {
85 return this.getItem('value');
86 },
87
88 'setValue': function (aValue) {
89 return this.setItem('value', aValue);
90 },
91
92 //-------------------------------------------------------------------------
93
94 'actionType': function () {
95 return Clipperz.Async.callbacks("Clipperz.PM.DataModel.Record.Version.Field.actionType", [
96 Clipperz.Async.collectResults("Clipperz.PM.DataModel.Record.Version.Field.actionType [collect results]", {
97 'isHidden':MochiKit.Base.method(this, 'isHidden'),
98 'value':MochiKit.Base.method(this, 'value')
99 }, {trace:false}),
100 function (someValues) {
101 var result; //'NONE', 'URL', 'EMAIL', 'PASSWORD'
102
103 result = 'NONE';
104
105 if (someValues['isHidden']) {
106 result = 'PASSWORD';
107 } else if (Clipperz.Base.isUrl(someValues['value'])) {
108 result = 'URL'
109 } else if (Clipperz.Base.isEmail(someValues['value'])) {
110 result = 'EMAIL'
111 };
112
113 return result;
114 }
115 ], {trace:false});
116 },
117
118 //-------------------------------------------------------------------------
119
120 'isHidden': function () {
121 return this.getItem('hidden');
122 },
123
124 'setIsHidden': function (aValue) {
125 return this.setItem('hidden', aValue);
126 },
127
128 //-------------------------------------------------------------------------
129
130 'isEmpty': function () {
131 var deferredResult;
132
133 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.Field.isEmpty", {trace:false});
134
135 deferredResult.collectResults({
136 'label': [
137 MochiKit.Base.method(this, 'label'),
138 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
139 ],
140 'value': [
141 MochiKit.Base.method(this, 'value'),
142 MochiKit.Base.partial(MochiKit.Base.operator.eq, '')
143 ],
144 'isHidden': [
145 MochiKit.Base.method(this, 'isHidden'),
146 MochiKit.Base.partial(MochiKit.Base.operator.eq, false)
147 ]
148 });
149 deferredResult.addCallback(MochiKit.Base.values);
150 deferredResult.addCallback(function(someValues) {
151 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
152 });
153 deferredResult.callback();
154
155 return deferredResult;
156 },
157
158 //-------------------------------------------------------------------------
159
160 'content': function () {
161 var deferredResult;
162 varfieldValues;
163
164 fieldValues = {};
165 deferredResult = new Clipperz.Async.Deferred("Record.Version.Field.content", {trace:false});
166 deferredResult.addMethod(this, 'reference');
167 deferredResult.addCallback(function (aValue) { fieldValues['reference'] = aValue; });
168 deferredResult.addMethod(this, 'label');
169 deferredResult.addCallback(function (aValue) { fieldValues['label'] = aValue; });
170 deferredResult.addMethod(this, 'value');
171 deferredResult.addCallback(function (aValue) { fieldValues['value'] = aValue; });
172 deferredResult.addMethod(this, 'actionType');
173 deferredResult.addCallback(function (aValue) { fieldValues['actionType'] = aValue; });
174 deferredResult.addMethod(this, 'isHidden');
175 deferredResult.addCallback(function (aValue) { fieldValues['isHidden'] = aValue; });
176 deferredResult.addCallback(function () { return fieldValues; });
177 deferredResult.callback();
178
179 return deferredResult;
180 },
181
182 //-------------------------------------------------------------------------
183 __syntaxFix__: "syntax fix"
184});
185
186
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js
new file mode 100644
index 0000000..87b319c
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.Version.js
@@ -0,0 +1,328 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!";
26}
27
28Clipperz.PM.DataModel.Record.Version = function(args) {
29 Clipperz.PM.DataModel.Record.Version.superclass.constructor.apply(this, arguments);
30
31 this._getVersionFunction = args.getVersion|| Clipperz.Base.exception.raise('MandatoryParameter');
32 this._fields = null;
33
34 return this;
35}
36
37
38Clipperz.Base.extend(Clipperz.PM.DataModel.Record.Version, Clipperz.PM.DataModel.EncryptedRemoteObject, {
39
40 'toString': function() {
41 return "Record.Version (" + this.reference() + ")";
42 },
43
44 //-------------------------------------------------------------------------
45
46 'reference': function () {
47 return this._reference;
48 },
49
50 //-------------------------------------------------------------------------
51/*
52 'hasPendingChanges': function () {
53 var deferredResult;
54
55 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChanges", {trace:false});
56 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.hasPendingChanges, this));
57 deferredResult.callback();
58
59 return deferredResult;
60 },
61*/
62 //-------------------------------------------------------------------------
63
64
65 'hasPendingChangesWhenBrandNew': function () {
66 var deferredResult;
67
68 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.hasPendingChangesWhenBrandNew", {trace:false});
69 deferredResult.addMethod(this, 'fields');
70 deferredResult.addCallback(MochiKit.Base.values);
71 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('isEmpty'))
72 deferredResult.addCallback(Clipperz.Async.collectAll);
73 deferredResult.addCallback(function(someValues) {
74 return MochiKit.Iter.every(someValues, MochiKit.Base.operator.identity);
75 });
76 deferredResult.addCallback(MochiKit.Base.operator.lognot)
77 deferredResult.callback();
78
79 return deferredResult;
80 },
81
82 //=========================================================================
83
84 'commitTransientState': function () {
85 var deferredResult;
86
87 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.Version.commitTransientState", {trace:false});
88 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.Version.superclass.commitTransientState, this));
89 deferredResult.callback();
90
91 return deferredResult;
92 },
93
94 //=========================================================================
95
96 'unpackData': function (someData) { //++
97 varresult;
98
99 result = someData;
100 if ((someData['fields'] != null) && (someData['fields'] instanceof Array)) {
101 varfields;
102 var i,c;
103
104 fields = someData['fields'];
105 delete someData['fields'];
106
107 someData['fields'] = {};
108 c = fields.length;
109 for (i=0; i<c; i++) {
110 someData['fields'][i] = fields[i];
111 }
112 }
113
114
115
116 return result;
117 },
118
119 //=========================================================================
120
121 'fields': function () {
122 vardeferredResult;
123 var deferredLock;
124
125 deferredLock = this.getDeferredLockForKey('fields');
126
127 deferredResult = new Clipperz.Async.Deferred("Record.Version.fields", {trace:false});
128 deferredResult.acquireLock(deferredLock);
129 deferredResult.addCallback(MochiKit.Base.bind(function () {
130 var innerDeferredResult;
131
132 if (this._fields == null) {
133 innerDeferredResult = new Clipperz.Async.Deferred("Record.Version.fields <inner deferred>", {trace:false});
134 innerDeferredResult.addMethod(this, 'getValue', 'fields');
135 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
136 var reference;
137
138 this._fields = {};
139
140 for (reference in someObjectData) {
141 varrecordVersionField;
142
143 recordVersionField = new Clipperz.PM.DataModel.Record.Version.Field({
144 'recordVersion':this,
145 'reference': reference
146 });
147
148 this._fields[reference] = recordVersionField;
149 }
150
151 return this._fields;
152 }, this));
153 innerDeferredResult.callback();
154 } else {
155 innerDeferredResult = MochiKit.Async.succeed(this._fields);
156 }
157
158 return innerDeferredResult;
159 }, this));
160 deferredResult.releaseLock(deferredLock);
161 deferredResult.callback();
162
163 return deferredResult;
164 },
165
166 //-------------------------------------------------------------------------
167
168 'getFieldsValues': function () {
169 return this.getValue('fields');
170 },
171
172 //-------------------------------------------------------------------------
173
174 'addField': function (someParameters) {
175 varnewField;
176
177 newField = new Clipperz.PM.DataModel.Record.Version.Field({recordVersion:this});
178
179 return Clipperz.Async.callbacks("Record.Version.addField", [
180 MochiKit.Base.method(this, 'fields'),
181
182 MochiKit.Base.method(this, '_getObjectDataStore'),
183 MochiKit.Base.methodcaller('values'),
184 Clipperz.Base.serializeJSON,
185
186 MochiKit.Base.bind(function () { this._fields[newField.reference()] = newField; }, this),
187 MochiKit.Base.method(newField, 'setLabel', someParameters['label']),
188 MochiKit.Base.method(newField, 'setValue', someParameters['value']),
189 MochiKit.Base.method(newField, 'setIsHidden',someParameters['isHidden']),
190
191 MochiKit.Base.method(this, '_getObjectDataStore'),
192 MochiKit.Base.methodcaller('values'),
193 Clipperz.Base.serializeJSON,
194
195 MochiKit.Base.partial(MochiKit.Async.succeed, newField)
196 ], {trace:false});
197 },
198
199 //-------------------------------------------------------------------------
200
201 'removeField': function (aField) {
202 return Clipperz.Async.callbacks("Record.Version.removeField", [
203 MochiKit.Base.method(this, 'fields'),
204 MochiKit.Base.bind(function () { delete this._fields[aField.reference()]; }, this),
205 MochiKit.Base.method(this, 'removeValue', 'fields' + '.' + aField.reference())
206 ], {trace:false});
207 },
208
209 //-------------------------------------------------------------------------
210/*
211 'sortFieldReference': function (someSortedFieldReferences) {
212
213
214
215 },
216*/
217 //=========================================================================
218/*
219 'directLogins': function () {
220 return MochiKit.Base.values(this._directLogins);
221 },
222
223 'addDirectLogin': function (aDirectLogin) {
224 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
225 },
226*/
227
228 //=========================================================================
229/*
230 'updateValues': function (anotherVersion) {
231 return Clipperz.Async.callbacks("Record.Version.updateValue", [
232 MochiKit.Base.partial(MochiKit.Async.succeed, this)
233 ], {trace:false});
234 },
235*/
236 //=========================================================================
237
238 'setRemoteData': function (aValue) {
239 this._remoteData = aValue;
240
241 return aValue;
242 },
243
244 //=========================================================================
245
246 'getVersionFunction': function () {
247 return this._getVersionFunction;
248 },
249
250 'previousVersion': function () {
251 return Clipperz.Async.callbacks("Record.Versions.previousVersion", [
252 MochiKit.Base.method(this, 'previousVersionReference'),
253 this.getVersionFunction()
254 ], {trace:false});
255 },
256
257 'previousVersionReference': function () {
258 return this.getValue('previousVersionReference');
259 },
260
261 'previousVersionKey': function () {
262 //TODO: this value i encrypted on its own. So it can not be saved in the main objectStore!!!
263 return this.getValue('previousVersionKey');
264 },
265
266 //-------------------------------------------------------------------------
267
268 'setPreviousVersionReferenceAndKey': function (aVersionObjectAndKey) {
269 // this._previousVersion = anotherVersion;
270 return Clipperz.Async.callbacks("Record.Version.setPreviousVersion", [
271 MochiKit.Base.method(this, 'setValue', 'previousVersionReference',aVersionObjectAndKey['reference']),
272 MochiKit.Base.method(this, 'setValue', 'previousVersionKey', aVersionObjectAndKey['key'])
273 ], {trace:false});
274 },
275
276 //=========================================================================
277
278 'revertChanges': function () {
279 this.setReference(this.transientState()['originalReference']);
280 Clipperz.PM.DataModel.Record.Version.superclass.revertChanges.apply(this, arguments);
281 },
282
283 //-------------------------------------------------------------------------
284
285 'prepareRemoteDataWithKey': function (aKey) {
286 var deferredResult;
287 var result;
288
289 result = {};
290
291 deferredResult = new Clipperz.Async.Deferred("Record.Version.prepareRemoteDataWithKey", {trace:false});
292 if (this.isBrandNew() == false) {
293 this.transientState()['originalReference'] = this.reference();
294
295 deferredResult.collectResults({
296 'key':MochiKit.Base.partial(MochiKit.Async.succeed, aKey),
297 'value': MochiKit.Base.method(this, 'getKey'),
298 'version': MochiKit.Base.partial(MochiKit.Async.succeed, Clipperz.PM.Crypto.encryptingFunctions.currentVersion)
299 });
300 deferredResult.addCallback(Clipperz.PM.Crypto.deferredEncrypt);
301 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey');
302 } else {
303 deferredResult.addCallback(Clipperz.Async.setItem, result, 'previousVersionKey', Clipperz.PM.Crypto.nullValue);
304 }
305 deferredResult.addCallback(MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey));
306 deferredResult.addCallback(MochiKit.Base.update, result);
307 deferredResult.addMethod(this, 'setRemoteData');
308
309 deferredResult.callback();
310
311 return deferredResult;
312 },
313
314 //=========================================================================
315/*
316 'deleteAllCleanTextData': function () {
317 return Clipperz.PM.DataModel.Record.Version.superclass.deleteAllCleanTextData.apply(this, arguments);
318 },
319
320 'hasAnyCleanTextData': function () {
321 return Clipperz.PM.DataModel.Record.Version.superclass.hasAnyCleanTextData.apply(this, arguments);
322 },
323*/
324 //=========================================================================
325 __syntaxFix__: "syntax fix"
326});
327
328
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/Record.js b/frontend/delta/js/Clipperz/PM/DataModel/Record.js
new file mode 100644
index 0000000..379872a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/Record.js
@@ -0,0 +1,891 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28
29Clipperz.PM.DataModel.Record = function(args) {
30 Clipperz.PM.DataModel.Record.superclass.constructor.apply(this, arguments);
31
32 this._updateDate = (args.updateDate ? Clipperz.PM.Date.parse(args.updateDate) : Clipperz.Base.exception.raise('MandatoryParameter'));
33
34 this._retrieveIndexDataFunction = args.retrieveIndexDataFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
35 this._updateIndexDataFunction = args.updateIndexDataFunction || Clipperz.Base.exception.raise('MandatoryParameter');
36
37 this._retrieveDirectLoginIndexDataFunction = args.retrieveDirectLoginIndexDataFunction|| null;
38 this._setDirectLoginIndexDataFunction = args.setDirectLoginIndexDataFunction || null;
39 this._removeDirectLoginIndexDataFunction = args.removeDirectLoginIndexDataFunction|| null;
40
41 this._createNewDirectLoginFunction = args.createNewDirectLoginFunction || null;
42
43 this._directLogins = {};
44
45 this._versions = {};
46
47 this._currentRecordVersion = null;
48 if (this.isBrandNew()) {
49 var newVersion;
50
51 this.setNotes('');
52 newVersion = new Clipperz.PM.DataModel.Record.Version({
53 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
54 'getVersion': MochiKit.Base.method(this, 'getVersion')
55
56 });
57 this._versions[newVersion.reference()] = newVersion;
58 this._currentVersionReference = newVersion.reference();
59 // this.setLabel('');
60 }
61
62 return this;
63}
64
65
66Clipperz.Base.extend(Clipperz.PM.DataModel.Record, Clipperz.PM.DataModel.EncryptedRemoteObject, {
67
68 'toString': function() {
69 return "Record (" + this.reference() + ")";
70 },
71
72 //-------------------------------------------------------------------------
73
74 'reference': function () {
75 return this._reference;
76 },
77
78 //=========================================================================
79
80 'getIndexData': function () {
81 return this._retrieveIndexDataFunction(this.reference());
82 },
83
84 //.........................................................................
85
86 'getIndexDataForKey': function (aKey) {
87 return Clipperz.Async.callbacks("Record.getIndexDataForKey", [
88 MochiKit.Base.method(this, 'getIndexData'),
89 MochiKit.Base.itemgetter(aKey)
90 ], {trace:false});
91 },
92
93 //-------------------------------------------------------------------------
94
95 'setIndexDataForKey': function (aKey, aValue) {
96 // return this._updateIndexDataFunction(this.reference(), aKey, aValue);
97
98 var deferredResult;
99
100 deferredResult = new Clipperz.Async.Deferred("Record.setIndexDataForKey", {trace:false});
101 deferredResult.addMethod(this, 'getIndexDataForKey', aKey);
102 deferredResult.addCallback(MochiKit.Base.bind(function (aCurrentValue) {
103 var result;
104 var originalValue;
105
106 originalValue = this.transientState().getValue('originalValues.indexData.' + aKey);
107 if (originalValue == null) {
108 originalValue = this.transientState().setValue('originalValues.indexData.' + aKey, aCurrentValue);
109 }
110
111 if (aCurrentValue != aValue) {
112 if (originalValue != aValue) {
113 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, true);
114 } else {
115 this.transientState().setValue('hasPendingChanges.indexData.' + aKey, false);
116 }
117
118 result = this._updateIndexDataFunction(this.reference(), aKey, aValue);
119 } else {
120 result = MochiKit.Async.succeed(aValue);
121 }
122
123 return result;
124 }, this));
125
126 deferredResult.callback();
127
128 return deferredResult;
129 },
130
131 //=========================================================================
132/*
133 'key': function () {
134 return this.getIndexDataForKey('key');
135 },
136*/
137 //=========================================================================
138
139 'label': function () {
140 return this.getIndexDataForKey('label');
141 },
142
143 //.........................................................................
144
145 'setLabel': function (aValue) {
146 return this.setIndexDataForKey('label', aValue);
147 },
148
149 //=========================================================================
150
151 'headerNotes': function () {
152 return this.getIndexDataForKey('notes');
153 },
154
155 //-------------------------------------------------------------------------
156
157 'notes': function () {
158 return Clipperz.Async.callbacks("Record.notes", [
159 MochiKit.Base.method(this, 'headerNotes'),
160 MochiKit.Base.bind(function (someHeaderNotes) {
161 var result;
162
163 if ((someHeaderNotes == null) || (typeof(someHeaderNotes) == 'undefined')) {
164 result = this.getValue('notes');
165 } else {
166 result = MochiKit.Async.succeed(someHeaderNotes);
167 }
168
169 return result;
170 }, this)
171 ], {trace:false});
172 },
173
174 //.........................................................................
175
176 'setNotes': function (aValue) {
177 return this.setValue('notes', aValue);
178 },
179
180 //=========================================================================
181
182 'updateDate': function () {
183 return MochiKit.Async.succeed(this._updateDate);
184 },
185
186 //=========================================================================
187
188 'favicon': function () {
189 var result;
190 var directLogins;
191
192 directLogins = MochiKit.Base.values(this.directLogins());
193 if (directLogins.length > 0) {
194 result = directLogins[0].favicon();
195 // } else if (/* is there an URL to use for searching a favicon */){
196 } else {
197 result = null; //MochiKit.Async.succeed(Clipperz.PM.Strings['defaultFaviconUrl']);
198 }
199
200 return result;
201 },
202
203 //-------------------------------------------------------------------------
204
205 'searchableContent': function () {
206 var deferredResult;
207
208 deferredResult = new Clipperz.Async.Deferred("Record.searchableContent", {trace:false});
209
210 deferredResult.collectResults({
211 'recordLabel': MochiKit.Base.method(this, 'label'),
212 'directLoginLabels': [
213 MochiKit.Base.method(this, 'directLoginReferences'),
214 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.itemgetter('label'))
215 ]
216 })
217 deferredResult.addCallback(function (someValues) {
218 return someValues['recordLabel'] + ' ' + someValues['directLoginLabels'].join(' ');
219 });
220 deferredResult.callback();
221
222 return deferredResult;
223 },
224
225 //-------------------------------------------------------------------------
226
227 'isMatching': function (aRegExp) {
228 return Clipperz.Async.callbacks("deferredFilterFunction", [
229 MochiKit.Base.method(this, 'searchableContent'),
230 MochiKit.Base.method(aRegExp, 'test'),
231 function (doesItMatch) {
232 var result;
233
234 if (doesItMatch) {
235 result = MochiKit.Async.succeed('match');
236 } else {
237 result = MochiKit.Async.fail('miss');
238 }
239
240 return result;
241 }
242 ], {trace:false});
243 },
244
245 //=========================================================================
246
247 'content': function () {
248 var deferredResult;
249 varresult;
250
251 result = {
252 'fields': [],
253 'directLogins': []
254 };
255
256 deferredResult = new Clipperz.Async.Deferred("Record.content", {trace:false});
257 deferredResult.addMethod(this, 'reference');
258 deferredResult.addCallback(function (aValue) { result['reference'] = aValue; });
259 deferredResult.addMethod(this, 'label');
260 deferredResult.addCallback(function (aValue) { result['title'] = aValue; });
261 deferredResult.addMethod(this, 'notes');
262 deferredResult.addCallback(function (aValue) { result['notes'] = aValue; });
263
264 deferredResult.addMethod(this, 'fields');
265 deferredResult.addCallback(MochiKit.Base.values);
266 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('content'));
267 deferredResult.addCallback(Clipperz.Async.collectAll);
268 deferredResult.addCallback(MochiKit.Base.map, function (aValue) { result['fields'].push(aValue); });
269
270 deferredResult.addMethod(this, 'directLogins');
271 deferredResult.addCallback(MochiKit.Base.values);
272 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.methodcaller('content'));
273 deferredResult.addCallback(Clipperz.Async.collectAll);
274 deferredResult.addCallback(MochiKit.Base.map, function (aValue) { result['directLogins'].push(aValue); });
275 deferredResult.addCallback(function () { return result; });
276
277 deferredResult.callback();
278
279 return deferredResult;
280 },
281
282 //=========================================================================
283
284 'directLogins': function () {
285 return this._directLogins;
286 },
287
288 'addDirectLogin': function (aDirectLogin) {
289 this._directLogins[aDirectLogin.reference()] = aDirectLogin;
290 },
291
292 'directLoginWithReference': function (aDirectLoginReference) {
293 return this._directLogins[aDirectLoginReference];
294 },
295
296 'createNewDirectLoginFunction': function () {
297 return this._createNewDirectLoginFunction;
298 },
299
300 'saveOriginalDirectLoginStatusToTransientState': function () {
301 if (this.transientState().getValue('directLogins') == null) {
302 // this.transientState().setValue('directLogins', this._directLogins)
303 MochiKit.Iter.forEach(MochiKit.Base.keys(this._directLogins), MochiKit.Base.bind(function(aKey) {
304 this.transientState().setValue('directLogins' + '.' + aKey, this._directLogins[aKey])
305 }, this))
306 }
307 },
308
309 'createNewDirectLogin': function () {
310 this.saveOriginalDirectLoginStatusToTransientState();
311
312 return this.createNewDirectLoginFunction()(this);
313 },
314
315 'removeDirectLogin': function(aDirectLogin) {
316 this.saveOriginalDirectLoginStatusToTransientState();
317
318 return Clipperz.Async.callbacks("Record.removeDirectLogin", [
319 MochiKit.Base.method(this, 'removeValue', 'directLogins' + '.' + aDirectLogin.reference()),
320 MochiKit.Base.bind(function () {
321 delete this._directLogins[aDirectLogin.reference()]
322 }, this)
323 ], {trace:false});
324
325 },
326
327 'directLoginReferences': function () {
328 var result;
329
330 result = Clipperz.Async.callbacks("Record.directLoginReferences", [
331 MochiKit.Base.method(this, 'directLogins'),
332 MochiKit.Base.values,
333 function (someDirectLogins) {
334 var result;
335 var i,c;
336
337 result = [];
338 c = someDirectLogins.length;
339 for (i=0; i<c; i++) {
340 result.push(Clipperz.Async.collectResults("Record.directLoginReferences - collectResults", {
341 '_rowObject': MochiKit.Async.succeed,
342 '_reference': MochiKit.Base.methodcaller('reference'),
343 'label': MochiKit.Base.methodcaller('label'),
344 'favicon': MochiKit.Base.methodcaller('favicon')
345 }, {trace:false})(someDirectLogins[i]));
346 };
347
348 return result;
349 },
350 Clipperz.Async.collectAll
351 ], {trace:false});
352
353 return result;
354 },
355
356 //=========================================================================
357
358 'unpackRemoteData': function (someData) {
359 var result;
360
361/*
362 this._currentRecordVersion = new Clipperz.PM.DataModel.Record.Version({
363 'reference': someData['currentVersion']['reference'],
364 'retrieveKeyFunction': MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
365 'remoteData': someData['currentVersion'],
366 });
367*/
368 var versionKey;
369
370 for (versionKey in someData['versions']) {
371 this._versions[versionKey] = new Clipperz.PM.DataModel.Record.Version({
372 'reference': versionKey,
373 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
374 'remoteData': someData['versions'][versionKey],
375 'getVersion': MochiKit.Base.method(this, 'getVersion')
376 })
377 }
378
379 // this._currentVersionReference = someData['currentVersion']['reference'];
380 this._currentVersionReference = someData['currentVersion'];
381
382 result = Clipperz.PM.DataModel.Record.superclass.unpackRemoteData.apply(this, arguments);
383
384 return result;
385 },
386
387 //-------------------------------------------------------------------------
388
389 'unpackData': function (someData) {
390 var result;
391
392 result = Clipperz.PM.DataModel.Record.superclass.unpackData.apply(this, arguments);
393
394 if (MochiKit.Base.isUndefinedOrNull(result['notes'])) {
395 result['notes'] = ''
396 }
397
398 return result;
399 },
400
401 //-------------------------------------------------------------------------
402
403 'prepareRemoteDataWithKey': function (aKey) {
404 var deferredResult;
405 varnewVersionKey;
406 var result;
407
408 newVersionKey = Clipperz.PM.Crypto.randomKey();
409 result = {};
410
411 deferredResult = new Clipperz.Async.Deferred("Record.prepareRemoteDataWithKey", {trace:false});
412 deferredResult.addCallbackList([
413 Clipperz.Async.collectResults("Record.prepareRemoteDataWithKey - collect results", {
414 'isBrandNew': MochiKit.Base.method(this, 'isBrandNew'),
415 'versionHasPendingChanges':[
416 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
417 // MochiKit.Base.methodcaller('hasPendingChanges')
418 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
419 ]
420 }),
421 Clipperz.Async.or,
422
423 Clipperz.Async.deferredIf("Current Version has pending changes", [
424 MochiKit.Base.method(this, 'createNewRecordVersion'),
425 MochiKit.Base.methodcaller('prepareRemoteDataWithKey', newVersionKey),
426 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'currentRecordVersion'),
427 MochiKit.Base.method(this, 'setCurrentRecordVersionKey', newVersionKey)
428 ], []),
429
430 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.prepareRemoteDataWithKey, this, aKey),
431 MochiKit.Base.partial(Clipperz.Async.setItem, result, 'record'),
432
433 MochiKit.Base.partial(MochiKit.Async.succeed, result)
434 ]);
435
436 deferredResult.callback();
437
438 return deferredResult;
439 },
440
441 //=========================================================================
442
443 'fields': function () {
444 return this.invokeCurrentRecordVersionMethod('fields');
445 },
446
447 'addField': function (someParameters) {
448 return this.invokeCurrentRecordVersionMethod('addField', someParameters);
449 },
450
451 'removeField': function (someParameters) {
452 return this.invokeCurrentRecordVersionMethod('removeField', someParameters);
453 },
454
455 //'sortFieldReference': function (someSortedFieldReferences) {
456 // return this.invokeCurrentRecordVersionMethod('sortFieldReference', someSortedFieldReferences);
457 //},
458
459 'getFieldsValues': function () {
460 return this.invokeCurrentRecordVersionMethod('getFieldsValues');
461 },
462
463 'fieldWithLabel': function (aLabel) {
464 return Clipperz.Async.callbacks("Record.fieldWithLabel", [
465 MochiKit.Base.method(this, 'fields'),
466 MochiKit.Base.values,
467 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aField) {
468 return Clipperz.Async.callbacks("Record.fieldWithLabel - check field label", [
469 MochiKit.Base.methodcaller('label'),
470 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
471 ], {trace:false}, aField);
472 }),
473 function (someFilteredResults) {
474 var result;
475
476 switch (someFilteredResults.length) {
477 case 0:
478 result = null;
479 break;
480 case 1:
481 result = someFilteredResults[0];
482 break;
483 default:
484 WTF = TODO;
485 break;
486 }
487
488 return result;
489 }
490 ], {trace:false});
491 },
492
493 //=========================================================================
494
495 'getVersion': function (aVersionReference) {
496 return Clipperz.Async.callbacks("Record.getVersion", [
497 MochiKit.Base.method(this, 'getVersions'),
498 MochiKit.Base.itemgetter(aVersionReference)
499 ], {trace:false});
500 },
501
502 //-------------------------------------------------------------------------
503
504 'getVersionKey': function (aVersionReference) {
505 vardeferredResult;
506 var transientStateKey;
507
508 transientStateKey = 'versionKeys' + '.' + aVersionReference;
509 if (this.transientState().getValue(transientStateKey) != null) {
510 deferredResult = MochiKit.Async.succeed(this.transientState().getValue(transientStateKey));
511 } else {
512 deferredResult = Clipperz.Async.callbacks("Record.getVersionKey", [
513 MochiKit.Base.method(this, 'getVersions'),
514 MochiKit.Base.partial(MochiKit.Base.operator.eq, aVersionReference, this.currentVersionReference()),
515 Clipperz.Async.deferredIf("getVersionKey for current version", [
516 MochiKit.Base.method(this, 'getCurrentRecordVersionKey'),
517 MochiKit.Base.method(this.transientState(), 'setValue', transientStateKey)
518 ],[
519 MochiKit.Async.fail
520 ])
521 ], {trace:false});
522 }
523
524 return deferredResult;
525 },
526
527 //-------------------------------------------------------------------------
528
529 'versions': function () {
530 return this._versions;
531 },
532
533 'getVersions': function () {
534 return Clipperz.Async.callbacks("Record.versions", [
535 MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
536 MochiKit.Base.bind(function () { return this._versions; }, this)
537 ], {trace:false});
538 },
539
540 //-------------------------------------------------------------------------
541
542 'getCurrentRecordVersion': function () {
543 return Clipperz.Async.callbacks("Record.getCurrentRecordVersion", [
544 // MochiKit.Base.method(this, 'getValue', 'fakeKey, just to trigger unpackRemoteData'),
545 // MochiKit.Base.bind(function () { return this._currentRecordVersion; }, this)
546
547 MochiKit.Base.method(this, 'versions'),
548 MochiKit.Base.itemgetter(this.currentVersionReference()),
549 Clipperz.Async.deferredIf("The current version is available", [
550 MochiKit.Async.succeed
551 ], [
552 MochiKit.Base.method(this, 'getVersions'),
553 MochiKit.Base.bind(function (someVersions) { return someVersions[this.currentVersionReference()]}, this)
554 ])
555 ], {trace:false});
556 },
557
558 'setCurrentRecordVersion': function (aRecordVersion) {
559 this._currentVersionReference = aRecordVersion.reference();
560 },
561
562 //.........................................................................
563
564 'currentVersionReference': function () {
565 return this._currentVersionReference;
566 },
567
568 //-------------------------------------------------------------------------
569
570 'createNewRecordVersion': function () {
571 var deferredResult;
572
573 if (this.isBrandNew()) {
574 deferredResult = this.getCurrentRecordVersion();
575 } else {
576 var newVersion;
577
578 newVersion = new Clipperz.PM.DataModel.Record.Version({
579 // 'reference': versionKey,
580 'retrieveKeyFunction':MochiKit.Base.method(this, 'getVersionKey'),
581 // 'remoteData': {},
582 'getVersion': MochiKit.Base.method(this, 'getVersion')
583 })
584 this._versions[newVersion.reference()] = newVersion;
585
586 deferredResult = Clipperz.Async.callbacks("Record.createNewRecordVersion", [
587 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
588 // MochiKit.Base.methodcaller('values'),
589 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'values'),
590 MochiKit.Base.method(newVersion, 'setValues'),
591
592 Clipperz.Async.collectResults("Record.createNewRecordVersion [collect results]", {
593 'reference':MochiKit.Base.method(this, 'currentVersionReference'),
594 'key': MochiKit.Base.method(this, 'getCurrentRecordVersionKey')
595 }, {trace:false}),
596 MochiKit.Base.method(newVersion, 'setPreviousVersionReferenceAndKey'),
597
598 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
599 // MochiKit.Base.method(this, 'revertChanges'),
600 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'revertChanges'),
601
602 MochiKit.Base.method(this, 'setCurrentRecordVersion', newVersion),
603 MochiKit.Base.partial(MochiKit.Async.succeed, newVersion)
604 ], {trace:false});
605 }
606
607 return deferredResult;
608 },
609
610 //-------------------------------------------------------------------------
611
612 'getCurrentRecordVersionKey': function () {
613 return Clipperz.Async.callbacks("Record.getCurrentRecordVersionKey", [
614 MochiKit.Base.method(this, 'getValue', 'currentVersionKey'),
615 Clipperz.Async.deferredIf("currentVersionKey is NOT null", [
616 MochiKit.Async.succeed
617 ], [
618 MochiKit.Base.method(this, 'getKey')
619 ])
620 ], {trace:false});
621 },
622
623 'setCurrentRecordVersionKey': function (aValue) {
624 //TODO: triple check this method!
625 return Clipperz.Async.callbacks("Record.setCurrentRecordVersionKey", [
626 MochiKit.Base.method(this, 'setValue', 'currentVersionKey', aValue)
627 ], {trace:false});
628 },
629
630 //-------------------------------------------------------------------------
631
632 'invokeCurrentRecordVersionMethod': function (aMethodName, someValues) {
633 return Clipperz.Async.callbacks("Record.invokeCurrentRecordVersionMethod", [
634 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
635 MochiKit.Base.methodcaller(aMethodName, someValues)
636 ], {trace:false});
637 },
638
639
640 'lazilyinvokeCurrentRecordVersionMethod': function (aMethodName, someValues, defaultResult) {
641 return Clipperz.Async.callbacks("Record.lazilyinvokeCurrentRecordVersionMethod", [
642 MochiKit.Base.method(this, 'currentVersionReference'),
643 Clipperz.Async.deferredIf("versions has been loaded", [
644 MochiKit.Base.method(this, 'getCurrentRecordVersion'),
645 MochiKit.Base.methodcaller(aMethodName, someValues),
646 ], [
647 MochiKit.Base.partial(MochiKit.Async.succeed, defaultResult),
648 ])
649 ], {trace:false});
650 },
651
652 //=========================================================================
653
654 'hasPendingChanges': function () {
655 var deferredResult;
656
657 if (this.hasInitiatedObjectDataStore()) {
658 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChanges", {trace:false});
659 deferredResult.collectResults({
660 'super': MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasPendingChanges, this),
661 'currentVersion': [
662 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
663 // MochiKit.Base.methodcaller('hasPendingChanges')
664 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'hasPendingChanges')
665 ],
666 'directLogins': [
667 MochiKit.Base.method(this, 'directLogins'),
668 MochiKit.Base.values,
669 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
670 Clipperz.Async.collectAll,
671 Clipperz.Async.or
672 // function(someValues) {
673 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
674 // }
675 ]
676 });
677 deferredResult.addCallback(MochiKit.Base.values);
678 deferredResult.addCallback(MochiKit.Base.bind(function(someValues) {
679 var result;
680 result = MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
681
682 if ((result == false) && (this.isBrandNew() == false)) {
683 result = MochiKit.Iter.some(MochiKit.Base.values(this.transientState().getValue('hasPendingChanges.indexData')), MochiKit.Base.operator.identity);
684 }
685
686 return result;
687 }, this));
688
689 deferredResult.callback();
690 } else {
691 deferredResult = Clipperz.Async.callbacks("Recrod.hasPendingChanges [hasInitiatedObjectDataStore == false]", [
692 MochiKit.Base.method(this, 'directLogins'),
693 MochiKit.Base.values,
694 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasPendingChanges')),
695 Clipperz.Async.collectAll,
696 Clipperz.Async.or
697 // function(someValues) {
698 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
699 // }
700 ], {trace:false})
701 }
702
703 return deferredResult;
704 },
705
706 //-------------------------------------------------------------------------
707
708 'hasPendingChangesWhenBrandNew': function () {
709 var deferredResult;
710
711 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.hasPendingChangesWhenBrandNew", {trace:false});
712 deferredResult.collectResults({
713 'label': [
714 MochiKit.Base.method(this, 'label'),
715 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
716 ],
717 'notes': [
718 MochiKit.Base.method(this, 'notes'),
719 MochiKit.Base.partial(MochiKit.Base.operator.ne, '')
720 ]
721 });
722 // deferredResult.addCallback(MochiKit.Base.values);
723 // deferredResult.addCallback(function(someValues) {
724 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
725 // });
726 deferredResult.addCallback(Clipperz.Async.or);
727
728 deferredResult.callback();
729
730 return deferredResult;
731 },
732
733 //-------------------------------------------------------------------------
734
735 'isBrandNewWithNoPendingChanges': function () {
736 vardeferredResult;
737
738 if (this.isBrandNew() == false) {
739 deferredResult = MochiKit.Async.succeed(false);
740 } else {
741 deferredResult = Clipperz.Async.callbacks("Record.isBrandNewWithNoPendingChanges", [
742 MochiKit.Base.method(this, 'hasPendingChanges'),
743 MochiKit.Base.operator.lognot
744 ], {trace:false});
745 }
746
747 return deferredResult;
748 },
749
750 //=========================================================================
751
752 'revertChanges': function () {
753 var deferredResult;
754
755 if (this.isBrandNew() == false) {
756 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.revertChanges", {trace:false});
757 deferredResult.addMethod(this, 'hasPendingChanges');
758 deferredResult.addIf([
759 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
760 // MochiKit.Base.methodcaller('revertChanges'),
761 MochiKit.Base.method(this,'invokeCurrentRecordVersionMethod', 'revertChanges'),
762
763 MochiKit.Base.method(this, 'directLogins'),
764 MochiKit.Base.values,
765 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('revertChanges')),
766
767 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.revertChanges, this)
768 ], [
769 MochiKit.Async.succeed
770 ]);
771 deferredResult.callback();
772 } else {
773 // this.deleteAllCleanTextData();
774 deferredResult = MochiKit.Async.succeed();
775 }
776
777 return deferredResult;
778 },
779
780 //-------------------------------------------------------------------------
781
782 'resetTransientState': function (isCommitting) {
783 // if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
784 // this._directLogins = this.transientState().getValue('directLogins');
785 // }
786
787 return Clipperz.Async.callbacks("Record.resetTransientState", [
788 //- MochiKit.Base.method(this, 'getCurrentRecordVersion'),
789 //- MochiKit.Base.methodcaller('resetTransientState'),
790 // MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'resetTransientState'),
791 MochiKit.Base.method(this, 'lazilyinvokeCurrentRecordVersionMethod', 'resetTransientState'),
792
793 MochiKit.Base.method(this, 'directLogins'),
794 MochiKit.Base.values,
795 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('resetTransientState')),
796
797 MochiKit.Base.bind(function () {
798 if ((isCommitting == false) && (this.transientState().getValue('directLogins') != null)) {
799 this._directLogins = this.transientState().getValue('directLogins');
800 }
801 }, this),
802
803 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.resetTransientState, this, isCommitting)
804 ], {trace:false})
805 },
806
807 //-------------------------------------------------------------------------
808
809 'commitTransientState': function () {
810 var deferredResult;
811
812 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.Record.commitTransientState", {trace:false});
813 deferredResult.addMethod(this, 'hasPendingChanges');
814 deferredResult.addIf([
815 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.commitTransientState, this),
816 // MochiKit.Base.method(this, 'getCurrentRecordVersion'),
817 // MochiKit.Base.methodcaller('commitTransientState'),
818 MochiKit.Base.method(this, 'invokeCurrentRecordVersionMethod', 'commitTransientState'),
819 MochiKit.Base.method(this, 'directLogins'),
820 MochiKit.Base.values,
821 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('commitTransientState'))
822 ], [
823 MochiKit.Async.succeed
824 ]);
825 deferredResult.callback();
826
827 return deferredResult;
828 },
829
830 //=========================================================================
831
832 'retrieveDirectLoginIndexDataFunction': function () {
833 return this._retrieveDirectLoginIndexDataFunction;
834 },
835
836 'setDirectLoginIndexDataFunction': function () {
837 return this._setDirectLoginIndexDataFunction;
838 },
839
840 'removeDirectLoginIndexDataFunction': function () {
841 return this._removeDirectLoginIndexDataFunction;
842 },
843
844 //=========================================================================
845
846 'deleteAllCleanTextData': function () {
847 // return Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData.apply(this, arguments);
848
849 return Clipperz.Async.callbacks("Record.deleteAllCleanTextData", [
850 MochiKit.Base.method(this, 'versions'),
851 MochiKit.Base.values,
852 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
853
854 MochiKit.Base.method(this, 'directLogins'),
855 MochiKit.Base.values,
856 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
857
858 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.deleteAllCleanTextData, this)
859 ], {trace:false});
860 },
861
862 'hasAnyCleanTextData': function () {
863 // return Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData.apply(this, arguments);
864
865 return Clipperz.Async.callbacks("Record.hasAnyCleanTextData", [
866 Clipperz.Async.collectResults("Record.hasAnyCleanTextData [collect results]", {
867 'versions':[
868 MochiKit.Base.method(this, 'versions'),
869 MochiKit.Base.values,
870 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
871 Clipperz.Async.collectAll
872 ],
873 'directLogins': [
874 MochiKit.Base.method(this, 'directLogins'),
875 MochiKit.Base.values,
876 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
877 Clipperz.Async.collectAll
878 ],
879 'super': [
880 MochiKit.Base.bind(Clipperz.PM.DataModel.Record.superclass.hasAnyCleanTextData, this)
881 ]
882 }, {trace:false}),
883 Clipperz.Async.or
884 ])
885 },
886
887 //=========================================================================
888 __syntaxFix__: "syntax fix"
889});
890
891
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js
new file mode 100644
index 0000000..cda5a41
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Legacy.js
@@ -0,0 +1,182 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!";
26}
27
28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
29
30Clipperz.PM.DataModel.User.Header.Legacy = function(args) {
31 //args = args || {};
32 Clipperz.PM.DataModel.User.Header.Legacy.superclass.constructor.apply(this, arguments);
33
34 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
35 this._records = null;
36 //this._directLogins = null;
37
38 return this;
39}
40
41
42Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Legacy, Clipperz.PM.DataModel.EncryptedRemoteObject, {
43
44 'toString': function() {
45 return "Clipperz.PM.DataModel.User.Header.Legacy";
46 },
47
48 //-------------------------------------------------------------------------
49
50 'retrieveRecordDetailFunction': function () {
51 return this._retrieveRecordDetailFunction;
52 },
53
54 //-------------------------------------------------------------------------
55
56 'getRecordKey': function (aRecordReference) {
57 var deferredResult;
58
59 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.getRecordKey", {trace:false});
60 deferredResult.addMethod(this, 'getRecordIndexData');
61 deferredResult.addCallback(MochiKit.Base.itemgetter('key'))
62 deferredResult.callback();
63
64 return deferredResult;
65 },
66
67 //=========================================================================
68
69 'getRecordIndexData': function (aRecordReference) {
70 return this.getValue('records.' + aRecordReference);
71 },
72
73 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
74 return this.setValue('records.' + aRecordReference + "." + aKey, aValue);
75 },
76
77 //-------------------------------------------------------------------------
78
79 'getDirectLoginIndexData': function (aDirectLoginReference) {
80 return this.getValue('directLogins.' + aDirectLoginReference);
81 },
82
83 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
84 return this.setValue('directLogins.' + aDirectLoginReference + '.' + aKey, aValue);
85 },
86
87 'removeDirectLoginIndexData': function (aDirectLoginReference) {
88 return this.removeValue('directLogins.' + aDirectLoginReference);
89 },
90
91 //=========================================================================
92
93 'records': function () {
94 vardeferredResult;
95 var deferredLock;
96
97 deferredLock = this.getDeferredLockForKey('records');
98
99 deferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records", {trace:false});
100 deferredResult.acquireLock(deferredLock);
101 deferredResult.addCallback(MochiKit.Base.bind(function () {
102 var innerDeferredResult;
103
104 if (this._records == null) {
105 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.Legacy.records <inner deferred>", {trace:false});
106 innerDeferredResult.collectResults({
107 'header': [
108 // MochiKit.Base.method(this, 'getObjectDataStore'),
109 // MochiKit.Base.methodcaller('values')
110 MochiKit.Base.method(this, 'values')
111 ],
112 'recordsStats': [
113 MochiKit.Base.method(this, 'getRemoteData'),
114 MochiKit.Base.itemgetter('recordsStats')
115 ]
116 });
117 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someObjectData) {
118 var reference;
119
120 this._records = {};
121 // this._directLogins = {};
122
123 for (reference in someObjectData['header']['records']) {
124 varrecord;
125
126 record = new Clipperz.PM.DataModel.Record({
127 'reference': reference,
128 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
129 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
130 // 'encryptedDataKeypath': 'data',
131 // 'encryptedVersionKeypath': 'version',
132
133 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
134 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
135 'updateDate': someObjectData['recordsStats'][reference]['updateDate'],
136
137 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
138 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
139 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData')
140 });
141
142 this._records[reference] = record;
143 }
144
145 for (reference in someObjectData['header']['directLogins']) {
146 vardirectLogin;
147 var record;
148
149 record = this._records[someObjectData['header']['directLogins'][reference]['record']];
150 if (record != null) {
151 directLogin = new Clipperz.PM.DataModel.DirectLogin({
152 'reference': reference,
153 'record': record//,
154 // 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
155 // 'setIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
156 // 'removeIndexDataFunction': MochiKit.Base.method(this, 'removeDirectLoginIndexData')
157 });
158 } else {
159Clipperz.log("WARNING: DIRECT LOGIN without a matching RECORD!!");
160 }
161 }
162
163 return this._records;
164 }, this));
165 innerDeferredResult.callback();
166 } else {
167 innerDeferredResult = MochiKit.Async.succeed(this._records);
168 }
169
170 return innerDeferredResult;
171 }, this));
172 deferredResult.releaseLock(deferredLock);
173 deferredResult.callback();
174
175 return deferredResult;
176 },
177
178 //=========================================================================
179 __syntaxFix__: "syntax fix"
180});
181
182
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
new file mode 100644
index 0000000..e82da47
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js
@@ -0,0 +1,117 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!";
26}
27if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
28
29//-----------------------------------------------------------------------------
30
31Clipperz.PM.DataModel.User.Header.OneTimePasswords = function(args) {
32 Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.constructor.apply(this, arguments);
33
34 this._oneTimePasswords = null;
35
36 return this;
37}
38
39//-----------------------------------------------------------------------------
40
41Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.OneTimePasswords, Clipperz.PM.DataModel.EncryptedRemoteObject, {
42
43 'toString': function() {
44 return "Clipperz.PM.DataModel.User.Header.OneTimePasswords";
45 },
46
47 //-------------------------------------------------------------------------
48/*
49 'packData': function (someData) { //++
50 var result;
51
52 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packData.apply(this, arguments);
53
54 return result;
55 },
56*/
57 //-------------------------------------------------------------------------
58/*
59 'packRemoteData': function (someData) {
60 var result;
61
62 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.packRemoteData.apply(this, arguments);
63
64 return result;
65 },
66*/
67 //-------------------------------------------------------------------------
68/*
69 'prepareRemoteDataWithKey': function (aKey) {
70 var result;
71
72 result = Clipperz.PM.DataModel.User.Header.OneTimePasswords.superclass.prepareRemoteDataWithKey.apply(this, arguments);
73
74 return result;
75 },
76*/
77 //=========================================================================
78
79 'oneTimePasswords': function () {
80 vardeferredResult;
81
82 deferredResult = new Clipperz.Async.Deferred("User.Header.OneTimePasswords.oneTimePasswords", {trace:false});
83 if (this._oneTimePasswords == null) {
84 deferredResult.addMethod(this, 'values')
85 deferredResult.addCallback(MochiKit.Base.bind(function (someData) {
86 varotpKey;
87
88 this._oneTimePasswords = {};
89
90 for (otpKey in someData) {
91 var otp;
92 var otpParameters;
93
94 otpParameters = Clipperz.Base.deepClone(someData[otpKey]);
95 otpParameters['reference'] = otpKey;
96
97 otp = new Clipperz.PM.DataModel.OneTimePassword(otpParameters);
98 this._oneTimePasswords[otpKey] = otp;
99 }
100
101 return this._oneTimePasswords;
102
103 }, this));
104 deferredResult.callback();
105 } else {
106 deferredResult = MochiKit.Async.succeed(this._oneTimePasswords);
107 }
108
109 return deferredResult;
110 },
111
112 //=========================================================================
113 __syntaxFix__: "syntax fix"
114});
115
116//-----------------------------------------------------------------------------
117
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js
new file mode 100644
index 0000000..f1f95e8
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.Preferences.js
@@ -0,0 +1,48 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!";
26}
27
28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
29
30Clipperz.PM.DataModel.User.Header.Preferences = function(args) {
31 Clipperz.PM.DataModel.User.Header.Preferences.superclass.constructor.apply(this, arguments);
32
33 return this;
34}
35
36
37Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.Preferences, Clipperz.PM.DataModel.EncryptedRemoteObject, {
38
39 'toString': function() {
40 return "Clipperz.PM.DataModel.User.Header.Preferences";
41 },
42
43 //-------------------------------------------------------------------------
44 //=========================================================================
45 __syntaxFix__: "syntax fix"
46});
47
48
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
new file mode 100644
index 0000000..5681f70
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Header.RecordIndex.js
@@ -0,0 +1,685 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!";
26}
27
28if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; }
29
30Clipperz.PM.DataModel.User.Header.RecordIndex = function(args) {
31 Clipperz.PM.DataModel.User.Header.RecordIndex.superclass.constructor.apply(this, arguments);
32
33 this._recordsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
34 'name':'recordsData',
35 'retrieveKeyFunction': args.retrieveKeyFunction,
36 'remoteData': {
37 'data': args.recordsData['data'],
38 'version': args.encryptedDataVersion,
39 'recordsStats': args.recordsStats
40 }//,
41 // 'encryptedDataKeypath': 'data',
42 // 'encryptedVersionKeypath': 'version'
43 });
44
45 this._directLoginsData = new Clipperz.PM.DataModel.EncryptedRemoteObject({
46 'name':'directLoginsData',
47 'retrieveKeyFunction': args.retrieveKeyFunction,
48 'remoteData': {
49 'data': args.directLoginsData['data'],
50 'version': args.encryptedDataVersion
51 }//,
52 // 'encryptedDataKeypath': 'data',
53 // 'encryptedVersionKeypath': 'version'
54 });
55
56 this._lock = new MochiKit.Async.DeferredLock();
57 this._transientState = null;
58
59 this._retrieveRecordDetailFunction = args.retrieveRecordDetailFunction|| Clipperz.Base.exception.raise('MandatoryParameter');
60 this._recordsIndex = args.recordsData['index'] || Clipperz.Base.exception.raise('MandatoryParameter');
61 this._directLoginsIndex = args.directLoginsData['index']|| Clipperz.Base.exception.raise('MandatoryParameter');
62
63 this._records = null;
64
65 return this;
66}
67
68
69Clipperz.Base.extend(Clipperz.PM.DataModel.User.Header.RecordIndex, Object, {
70
71 'toString': function() {
72 return "Clipperz.PM.DataModel.User.Header.RecordIndex";
73 },
74
75 //-------------------------------------------------------------------------
76
77 'retrieveRecordDetailFunction': function () {
78 return this._retrieveRecordDetailFunction;
79 },
80
81 //-------------------------------------------------------------------------
82
83 'recordsIndex': function () {
84 return this._recordsIndex;
85 },
86
87 'recordsData': function () {
88 return this._recordsData;
89 },
90
91 //-------------------------------------------------------------------------
92
93 'directLoginsIndex': function () {
94 return this._directLoginsIndex;
95 },
96
97 'directLoginsData': function () {
98 return this._directLoginsData;
99 },
100
101 //-------------------------------------------------------------------------
102
103 'lock': function () {
104 return this._lock;
105 },
106
107 //-------------------------------------------------------------------------
108
109 'transientState': function () {
110 if (this._transientState == null) {
111 this._transientState = new Clipperz.KeyValueObjectStore(/*{'name':'User.Header.RecordIndex.transientState [1]'}*/);
112 }
113
114 return this._transientState;
115 },
116
117 'resetTransientState': function (isCommitting) {
118 if (this._transientState != null) {
119 this._transientState.removeAllData();
120 }
121
122 this._transientState = null;
123 },
124
125 //-------------------------------------------------------------------------
126
127 'getRecordKey': function (aRecordReference) {
128 return Clipperz.Async.callbacks("User.Header.RecordIndex.getRecordKey", [
129 MochiKit.Base.method(this, 'getRecordIndexData', aRecordReference),
130 MochiKit.Base.itemgetter('key')
131 ], {trace:false});
132 },
133
134 'setRecordKey': function (aRecordReference, aValue) {
135 return this.updateRecordIndexData(aRecordReference, 'key', aValue);
136 },
137
138 //-------------------------------------------------------------------------
139
140 'getRecordIndexData': function (aRecordReference) {
141 return this.recordsData().getValue(this.recordsIndex()[aRecordReference]);
142 },
143
144 //.........................................................................
145
146 'updateRecordIndexData': function (aRecordReference, aKey, aValue) {
147 return this.recordsData().setValue(this.recordsIndex()[aRecordReference]+'.'+aKey, aValue);
148 },
149
150 //-------------------------------------------------------------------------
151
152 'getDirectLoginIndexData': function (aDirectLoginReference) {
153 return this.directLoginsData().getValue(this.directLoginsIndex()[aDirectLoginReference]);
154 },
155
156 'setDirectLoginIndexData': function (aDirectLoginReference, aKey, aValue) {
157//if (MochiKit.Base.isUndefinedOrNull(this.directLoginsIndex()[aDirectLoginReference])) {
158 //throw "PIPPO";
159//}
160 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference] + '.' + aKey, aValue);
161 },
162
163 'addDirectLoginIndexData': function (aDirectLoginReference) {
164 return this.directLoginsData().setValue(this.directLoginsIndex()[aDirectLoginReference], {});
165 },
166
167 'removeDirectLoginIndexData': function (aDirectLoginReference) {
168 return this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLoginReference])
169 },
170
171 //-------------------------------------------------------------------------
172
173 'records': function () {
174 vardeferredResult;
175
176 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records", {trace:false});
177 deferredResult.acquireLock(this.lock());
178 deferredResult.addCallback(MochiKit.Base.bind(function () {
179 var innerDeferredResult;
180
181 if (this._records == null) {
182 innerDeferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.records <inner deferred>", {trace:false});
183 innerDeferredResult.collectResults({
184 'records': [
185 // MochiKit.Base.method(this.recordsData(), 'getObjectDataStore'),
186 // MochiKit.Base.methodcaller('values')
187 MochiKit.Base.method(this.recordsData(), 'values')
188 ],
189 'recordsStats': [
190 MochiKit.Base.method(this.recordsData(), 'getRemoteData'),
191 MochiKit.Base.itemgetter('recordsStats')
192 ],
193 'directLogins': [
194 // MochiKit.Base.method(this.directLoginsData(), 'getObjectDataStore'),
195 // MochiKit.Base.methodcaller('values')
196 MochiKit.Base.method(this.directLoginsData(), 'values')
197 ]
198 })
199 innerDeferredResult.addCallback(MochiKit.Base.bind(function (someData) {
200 var indexReference;
201 var recordsInvertedIndex;
202 var directLoginsInvertedIndex;
203
204 recordsInvertedIndex = Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.recordsIndex());
205 directLoginsInvertedIndex= Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex(this.directLoginsIndex());
206
207 this._records = {};
208
209 for (indexReference in someData['records']) {
210 varrecord;
211 var reference;
212 var updateDate;
213
214 reference = recordsInvertedIndex[indexReference];
215
216 if (typeof(someData['recordsStats'][reference]) != 'undefined') {
217 updateDate = someData['recordsStats'][reference]['updateDate'];
218
219 record = new Clipperz.PM.DataModel.Record({
220 'reference': reference,
221 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
222 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
223
224 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
225 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
226 'updateDate': updateDate,
227
228 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
229 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
230 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
231
232 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
233 });
234
235 this._records[reference] = record;
236 } else {
237Clipperz.log("SKIPPING record " + reference + " as there are no stas associated - " + Clipperz.Base.serializeJSON(someData['records'][reference]));
238 //# skip the record, as it seems it is not present in the DB
239 //updateDate = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
240 }
241 }
242
243 for (indexReference in someData['directLogins']) {
244 // vardirectLogin;
245 var reference;
246 var record;
247
248 reference = directLoginsInvertedIndex[indexReference];
249 record = this._records[recordsInvertedIndex[someData['directLogins'][indexReference]['record']]];
250
251 if (record != null) {
252 // directLogin = new Clipperz.PM.DataModel.DirectLogin({
253 new Clipperz.PM.DataModel.DirectLogin({
254 'reference': reference,
255 'record': record
256 });
257 } else {
258 Clipperz.logWarning("WARNING: DIRECT LOGIN without a matching RECORD!!");
259 }
260 }
261
262 return this._records;
263 }, this));
264 innerDeferredResult.callback();
265 } else {
266 innerDeferredResult = MochiKit.Async.succeed(this._records);
267 }
268
269 return innerDeferredResult;
270 }, this));
271 deferredResult.releaseLock(this.lock());
272 deferredResult.callback();
273
274 return deferredResult;
275 },
276
277 //-------------------------------------------------------------------------
278
279 'updateRecordIndexForNewRecord': function (aNewRecord) {
280 var newRecordIndex;
281 var recordReference;
282
283 recordReference = aNewRecord.reference();
284 newRecordIndex = (MochiKit.Base.listMax(MochiKit.Base.map(MochiKit.Base.partial(MochiKit.Base.operator.mul, 1), MochiKit.Base.values(this.recordsIndex()))) + 1) + '';
285 this.recordsIndex()[recordReference] = newRecordIndex;
286
287 this.transientState().setValue('newlyCreatedRecordsIndex' + '.' + recordReference, newRecordIndex);
288 this.transientState().setValue('newlyCreatedRecordsReferences'+ '.' + recordReference, aNewRecord);
289 },
290
291 //.........................................................................
292
293 'createNewRecord': function () {
294 var deferredResult;
295 var newRecord;
296
297 newRecord = new Clipperz.PM.DataModel.Record({
298 'retrieveKeyFunction': MochiKit.Base.method(this, 'getRecordKey'),
299 'retrieveRemoteDataFunction':this.retrieveRecordDetailFunction(),
300
301 'retrieveIndexDataFunction':MochiKit.Base.method(this, 'getRecordIndexData'),
302 'updateIndexDataFunction': MochiKit.Base.method(this, 'updateRecordIndexData'),
303 'updateDate': Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
304
305 'retrieveDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'getDirectLoginIndexData'),
306 'setDirectLoginIndexDataFunction': MochiKit.Base.method(this, 'setDirectLoginIndexData'),
307 'removeDirectLoginIndexDataFunction':MochiKit.Base.method(this, 'removeDirectLoginIndexData'),
308
309 'createNewDirectLoginFunction': MochiKit.Base.method(this, 'createNewDirectLogin')
310 });
311
312 this.transientState().setValue('newRecordsReferences' + '.' + newRecord.reference(), newRecord);
313 this.updateRecordIndexForNewRecord(newRecord);
314
315 deferredResult = Clipperz.Async.callbacks("User.Header.RecordIndex.createNewRecord", [
316 MochiKit.Base.method(this, 'records'),
317 MochiKit.Base.partial(Clipperz.Async.setItemOnObject, newRecord.reference(), newRecord),
318 MochiKit.Base.method(this, 'setRecordKey', newRecord.reference(), Clipperz.PM.Crypto.randomKey()),
319 MochiKit.Base.method(newRecord, 'setLabel', ''),
320 MochiKit.Base.partial(MochiKit.Async.succeed, newRecord)
321 ], {trace:false});
322
323
324 return deferredResult;
325 },
326
327 //-------------------------------------------------------------------------
328
329 'deleteRecord': function (aRecord) {
330 var deferredResult;
331 var recordReference;
332
333 recordReference = aRecord.reference();
334
335 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.deleteRecord", {trace:false});
336
337 deferredResult.addMethod(aRecord, 'directLogins');
338 deferredResult.addCallback(MochiKit.Base.values);
339 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeDirectLogin'));
340
341 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
342 deferredResult.addCallback(MochiKit.Base.bind(function () {
343 this.transientState().setValue('deleteRecordsIndex' + '.' + recordReference, this.recordsIndex()[recordReference]);
344 delete this.recordsIndex()[recordReference];
345 }, this));
346
347 deferredResult.addMethod(this, 'records');
348 deferredResult.addCallback(MochiKit.Base.itemgetter(recordReference));
349 deferredResult.addMethod(this.transientState(), 'setValue', 'deleteRecordsReferences' + '.' + recordReference);
350
351 deferredResult.addMethod(this, 'records');
352 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
353 delete someRecords[recordReference];
354 }, this));
355 deferredResult.callback();
356
357 return deferredResult;
358 },
359
360 //=========================================================================
361
362 'removeDirectLogin': function (aDirectLogin) {
363 this.directLoginsData().removeValue(this.directLoginsIndex()[aDirectLogin.reference()]);
364 },
365
366 //-------------------------------------------------------------------------
367
368 'createNewDirectLogin': function (aRecord) {
369 var newDirectLogin;
370 varnewDirectLoginIndexValue;
371
372 newDirectLogin = new Clipperz.PM.DataModel.DirectLogin({record:aRecord});
373 newDirectLoginIndexValue = MochiKit.Base.listMax(MochiKit.Base.map(function (aValue) { return aValue * 1; }, MochiKit.Base.values(this.directLoginsIndex()))) + 1;
374
375 this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
376
377 this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
378 this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
379
380 return newDirectLogin;
381 },
382
383 //=========================================================================
384
385 'deleteAllCleanTextData': function () {
386 return Clipperz.Async.callbacks("User.Header.RecordIndex.deleteAllCleanTextData", [
387 // MochiKit.Base.method(this, 'records'),
388 // MochiKit.Base.values,
389 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('deleteAllCleanTextData')),
390
391 MochiKit.Base.method(this, 'recordsData'),
392 MochiKit.Base.methodcaller('deleteAllCleanTextData'),
393 MochiKit.Base.method(this, 'directLoginsData'),
394 MochiKit.Base.methodcaller('deleteAllCleanTextData')
395 ], {trace:false});
396 },
397
398 //-------------------------------------------------------------------------
399
400 'hasAnyCleanTextData': function () {
401 var deferredResult;
402
403 deferredResult = new Clipperz.Async.Deferred({trace:false});
404 deferredResult.collectResults({
405 'recordsData': [
406 MochiKit.Base.method(this, 'recordsData'),
407 MochiKit.Base.methodcaller('hasAnyCleanTextData')
408 ],
409 'directLoginsData':[
410 MochiKit.Base.method(this, 'directLoginsData'),
411 MochiKit.Base.methodcaller('hasAnyCleanTextData')
412 ],
413 // 'records': [
414 // MochiKit.Base.method(this, 'records'),
415 // MochiKit.Base.values,
416 // MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller('hasAnyCleanTextData')),
417 // Clipperz.Async.collectAll
418 // ]
419 });
420
421 // deferredResult.addCallback(MochiKit.Base.values);
422 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
423 // deferredResult.addCallback(function(someValues) {
424 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
425 // });
426 deferredResult.addCallback(Clipperz.Async.or);
427
428 deferredResult.callback();
429
430 return deferredResult;
431 },
432
433 //-------------------------------------------------------------------------
434
435 'hasPendingChanges': function () {
436 vardeferredResult;
437
438 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.hasPendingChanges", {trace:false});
439 deferredResult.collectResults({
440 'recordsData': [
441 MochiKit.Base.method(this, 'recordsData'),
442 MochiKit.Base.methodcaller('hasPendingChanges')
443 ],
444 'directLoginsData': [
445 MochiKit.Base.method(this, 'directLoginsData'),
446 MochiKit.Base.methodcaller('hasPendingChanges')
447 ]
448 });
449 deferredResult.addCallback(Clipperz.Async.or);
450 // deferredResult.addCallback(MochiKit.Base.values);
451 // deferredResult.addCallback(MochiKit.Base.flattenArguments);
452 // deferredResult.addCallback(function(someValues) {
453 // return MochiKit.Iter.some(someValues, MochiKit.Base.operator.identity);
454 // });
455 deferredResult.callback();
456
457 return deferredResult;
458 },
459
460 //-------------------------------------------------------------------------
461
462 'commitTransientState': function () {
463 var deferredResult;
464
465 deferredResut = Clipperz.Async.callbacks("User.Header.RecordIndex.commitTransientState", [
466 MochiKit.Base.method(this, 'recordsData'),
467 MochiKit.Base.methodcaller('commitTransientState'),
468
469 MochiKit.Base.method(this, 'directLoginsData'),
470 MochiKit.Base.methodcaller('commitTransientState'),
471
472 MochiKit.Base.method(this, 'resetTransientState', true)
473 ], {trace:false});
474
475 return deferredResult;
476 },
477
478 //-------------------------------------------------------------------------
479
480 'revertChanges': function () {
481 return Clipperz.Async.callbacks("User.Header.RecordIndex.revertChanges", [
482 MochiKit.Base.method(this, 'recordsData'),
483 MochiKit.Base.methodcaller('revertChanges'),
484
485 // MochiKit.Base.method(this, 'directLoginsData'),
486 // MochiKit.Base.methodcaller('revertChanges'),
487
488 MochiKit.Base.method(this, 'records'),
489 MochiKit.Base.bind(function (someRecords) {
490 varrecordReference;
491
492 for (recordReference in this.transientState().getValue('deleteRecordsReferences')) {
493 this.recordsIndex()[recordReference] = this.transientState().getValue('deleteRecordsIndex' + '.' + recordReference);
494 someRecords[recordReference] = this.transientState().getValue('deleteRecordsReferences' + '.' + recordReference);
495 }
496
497 for (recordReference in this.transientState().getValue('newRecordsReferences')) {
498 delete this.recordsIndex()[recordReference];
499 delete someRecords[recordReference];
500 }
501 }, this),
502
503 // MochiKit.Base.method(this, 'directLogins'),
504 MochiKit.Base.bind(function () {
505 vardirectLoginReference;
506
507 //this.transientState().setValue('newDirectLoginReferences' + '.' + newDirectLogin.reference(), newDirectLogin);
508//
509 //this.directLoginsIndex()[newDirectLogin.reference()] = newDirectLoginIndexValue;
510 //this.directLoginsData().setValue(this.directLoginsIndex()[newDirectLogin.reference()], {'record': this.recordsIndex()[aRecord.reference()]});
511
512
513 // for (directLoginReference in this.transientState().getValue('deleteDirectLoginReferences')) {
514 // someDirectLogins[directLoginReference] = this.transientState().getValue('deleteDirectLoginReferences' + '.' + recordReference);
515 // }
516
517 for (directLoginReference in this.transientState().getValue('newDirectLoginReferences')) {
518 // this.directLoginsData().removeValue(this.directLoginsIndex()[directLoginReference]);
519 delete this.directLoginsIndex()[directLoginReference];
520 }
521 }, this),
522
523 MochiKit.Base.method(this, 'directLoginsData'),
524 MochiKit.Base.methodcaller('revertChanges'),
525
526 MochiKit.Base.method(this, 'resetTransientState', false)
527 ], {trace:false});
528 },
529
530 //-------------------------------------------------------------------------
531
532 'prepareRemoteDataWithKey': function (aKey) {
533 // "records": {
534 // "index": {
535 // "eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5": "0",
536 // "13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551": "1",
537 // ...
538 // "465a067a0bd2b470fa834de5397e38494de0c7707938262fae3427932e219744": "18",
539 // "4fd1dc2ca860b7fb47cef10a84edb3270da05510b0a30a6b0b083898712d4b9e": "19"
540 // },
541 // "data": "n+AzGEEQXaSRSY4d ... BDypotrXgPo94uHfoXvGFzwCn8w="
542 // },
543 // "directLogins": {
544 // "index": {
545 // "61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0",
546 // "989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1",
547 // ...
548 // "cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17",
549 // "7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18"
550 // },
551 // "data":"5YG9KKU/OZ5guUgFlms6k1 ... ZG/5Fn0uN+LoAsNfHm+EE62x"
552 // },
553
554 var deferredResult;
555 var result;
556
557 result = {};
558
559 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataWithKey", {trace:false});
560 deferredResult.collectResults({
561 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.recordsIndex()),
562 'data': [
563 MochiKit.Base.method(this.recordsData(), 'prepareRemoteDataWithKey', aKey),
564 MochiKit.Base.itemgetter('data')
565 ]
566 });
567 deferredResult.addCallback(Clipperz.Async.setItem, result, 'records');
568
569 deferredResult.collectResults({
570 'index':MochiKit.Base.partial(MochiKit.Async.succeed, this.directLoginsIndex()),
571 'data': [
572 MochiKit.Base.method(this.directLoginsData(), 'prepareRemoteDataWithKey', aKey),
573 MochiKit.Base.itemgetter('data')
574 ]
575 });
576 deferredResult.addCallback(Clipperz.Async.setItem, result, 'directLogins');
577
578 deferredResult.addCallback(MochiKit.Async.succeed, result);
579
580 deferredResult.callback();
581
582 return deferredResult;
583 },
584
585 //-------------------------------------------------------------------------
586
587 'updateRecordKeyAndPrepareRemoteData': function (aRecord) {
588 varnewRecordKey;
589 var deferredResult;
590
591 newRecordKey = Clipperz.PM.Crypto.randomKey();
592
593 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.updateRecordKeyAndPrepareRemoteData", {trace:false});
594 deferredResult.addCallback(MochiKit.Base.method(aRecord, 'prepareRemoteDataWithKey', newRecordKey));
595 deferredResult.addCallbackPass(MochiKit.Base.method(this, 'setRecordKey', aRecord.reference(), newRecordKey));
596 deferredResult.callback();
597
598 return deferredResult;
599 },
600
601 //.........................................................................
602
603 'removeNewRecordWithNoChanges': function (aRecord) {
604 var deferredResult;
605 var recordReference;
606
607 recordReference = aRecord.reference();
608
609 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.removeNewRecordWithNoChanges", {trace:false});
610
611 deferredResult.addMethod(this.recordsData(), 'removeValue', this.recordsIndex()[recordReference]);
612 deferredResult.addCallback(MochiKit.Base.bind(function () {
613 delete this.recordsIndex()[recordReference];
614 }, this));
615
616 deferredResult.addMethod(this, 'records');
617 deferredResult.addCallback(MochiKit.Base.bind(function (someRecords) {
618 delete someRecords[recordReference];
619 }, this));
620 deferredResult.callback();
621
622 return deferredResult;
623 },
624
625 //.........................................................................
626
627 'prepareRemoteDataForChangedRecords': function () {
628 vardeferredResult;
629 varresult;
630
631 result = {};
632
633 deferredResult = new Clipperz.Async.Deferred("User.Header.RecordIndex.prepareRemoteDataForChangedRecords", {trace:false});
634
635 deferredResult.addMethod(this, 'records');
636 deferredResult.addCallback(MochiKit.Base.values);
637 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('isBrandNewWithNoPendingChanges'));
638 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'removeNewRecordWithNoChanges'));
639
640 deferredResult.addMethod(this, 'records');
641 deferredResult.addCallback(MochiKit.Base.values);
642 deferredResult.addCallback(Clipperz.Async.deferredFilter, MochiKit.Base.methodcaller('hasPendingChanges'));
643 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.method(this, 'updateRecordKeyAndPrepareRemoteData'));
644 deferredResult.addCallback(Clipperz.Async.collectAll);
645
646 deferredResult.addCallback(Clipperz.Async.deferredIf("updated records != null", [
647 MochiKit.Base.operator.identity
648 ], [
649 MochiKit.Base.partial(MochiKit.Async.succeed, [])
650 ]));
651 deferredResult.addCallback(Clipperz.Async.setItem, result, 'updated');
652
653 deferredResult.addMethod(this.transientState(), 'getValue', 'deleteRecordsReferences');
654 deferredResult.addCallback(MochiKit.Base.keys);
655 deferredResult.addCallback(Clipperz.Async.deferredIf("deleted records != null", [
656 MochiKit.Base.operator.identity
657 ], [
658 MochiKit.Base.partial(MochiKit.Async.succeed, [])
659 ]));
660 deferredResult.addCallback(Clipperz.Async.setItem, result, 'deleted');
661
662 deferredResult.addCallback(MochiKit.Async.succeed, result);
663 deferredResult.callback();
664
665 return deferredResult;
666 },
667
668 //-------------------------------------------------------------------------
669 __syntaxFix__: "syntax fix"
670});
671
672
673
674Clipperz.PM.DataModel.User.Header.RecordIndex.invertIndex = function (anIndex) {
675 var result;
676 var key;
677
678 result = {};
679
680 for (key in anIndex) {
681 result[anIndex[key]] = key;
682 }
683
684 return result;
685}; \ No newline at end of file
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js b/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js
new file mode 100644
index 0000000..341e9f3
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.Subscription.js
@@ -0,0 +1,53 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.DataModel.User.Subscription depends on Clipperz.PM.DataModel.User!";
26}
27
28Clipperz.PM.DataModel.User.Subscription = function(args) {
29 this._attributes = args;
30 return this;
31}
32
33
34Clipperz.Base.extend(Clipperz.PM.DataModel.User.Subscription, Object, {
35
36 'features': function () {
37 return this._attributes['features'];
38 },
39
40 'type': function () {
41 return this._attributes['type'];
42 },
43
44 'validity': function () {
45 return {
46 'from':this._attributes['fromDate'],
47 'to':this._attributes['toDate']
48 };
49 },
50
51 //=========================================================================
52 __syntaxFix__: "syntax fix"
53});
diff --git a/frontend/delta/js/Clipperz/PM/DataModel/User.js b/frontend/delta/js/Clipperz/PM/DataModel/User.js
new file mode 100644
index 0000000..1d90800
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/DataModel/User.js
@@ -0,0 +1,827 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; }
27
28
29//#############################################################################
30
31Clipperz.PM.DataModel.User = function (args) {
32 args = args || {};
33
34 Clipperz.PM.DataModel.User.superclass.constructor.apply(this, arguments);
35
36 this._username = args.username || null;
37 this._getPassphraseFunction = args.getPassphraseFunction || null;
38
39 this._data = null;
40
41 this._connection = null;
42 this._connectionVersion = 'current';
43
44 this._subscription = null;
45 this._serverData = null;
46 //this._serverLockValue = null;
47 this._transientState = null;
48
49 this._deferredLocks = {
50 'passphrase': new MochiKit.Async.DeferredLock(),
51 'serverData': new MochiKit.Async.DeferredLock(),
52 // 'recordsIndex': new MochiKit.Async.DeferredLock(),
53 // 'directLoginsIndex':new MochiKit.Async.DeferredLock()
54 // 'preferences': new MochiKit.Async.DeferredLock()
55 // 'oneTimePasswords': new MochiKit.Async.DeferredLock()
56 '__syntaxFix__': 'syntax fix'
57 };
58
59 return this;
60}
61
62Clipperz.Base.extend(Clipperz.PM.DataModel.User, Object, {
63
64 'toString': function () {
65 return "Clipperz.PM.DataModel.User - " + this.username();
66 },
67
68 //-------------------------------------------------------------------------
69
70 'username': function () {
71 return this._username;
72 },
73
74 'setUsername': function (aValue) {
75 this._username = aValue;
76 },
77
78 //-------------------------------------------------------------------------
79
80 //this.setSubscription(new Clipperz.PM.DataModel.User.Subscription(someServerData['subscription']));
81 'subscription': function () {
82 return this._subscription;
83 },
84
85 'setSubscription': function (aValue) {
86 this._subscription = aValue;
87 },
88
89 //-------------------------------------------------------------------------
90
91 'displayName': function() {
92 return "" + this.username() + "";
93 },
94
95 //-------------------------------------------------------------------------
96
97 'data': function () {
98 if (this._data == null) {
99 this._data = new Clipperz.KeyValueObjectStore(/*{'name':'User.data [1]'}*/);
100 };
101
102 return this._data;
103 },
104
105 //-------------------------------------------------------------------------
106/*
107 'serverLockValue': function () {
108 return this._serverLockValue;
109 },
110
111 'setServerLockValue': function (aValue) {
112 this._serverLockValue = aValue;
113 },
114*/
115 //-------------------------------------------------------------------------
116
117 'transientState': function () {
118 if (this._transientState == null) {
119 this._transientState = {}
120 }
121
122 return this._transientState;
123 },
124
125 'resetTransientState': function (isCommitting) {
126 this._transientState = null;
127 },
128
129 //-------------------------------------------------------------------------
130
131 'deferredLockForSection': function(aSectionName) {
132 return this._deferredLocks[aSectionName];
133 },
134
135 //-------------------------------------------------------------------------
136
137 'getPassphrase': function() {
138 var deferredResult;
139
140 deferredResult = new Clipperz.Async.Deferred("User.getPassphrase", {trace:false});
141 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
142 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', this.getPassphraseFunction());
143 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
144 deferredResult.callback();
145
146 return deferredResult;
147 },
148
149 'getPassphraseFunction': function () {
150 return this._getPassphraseFunction;
151 },
152
153 //-------------------------------------------------------------------------
154
155 'getCredentials': function () {
156 return Clipperz.Async.collectResults("User; get username and passphrase", {
157 'username': MochiKit.Base.method(this, 'username'),
158 'password': MochiKit.Base.method(this, 'getPassphrase')
159 }, {trace:false})();
160 },
161
162 //-------------------------------------------------------------------------
163
164 'changePassphrase': function (aNewValue) {
165 return this.updateCredentials(this.username(), aNewValue);
166 },
167
168 //.........................................................................
169
170 'updateCredentials': function (aUsername, aPassphrase) {
171 vardeferredResult;
172
173 deferredResult = new Clipperz.Async.Deferred("User.updateCredentials", {trace:false});
174 // deferredResult.addMethod(this, 'getPassphrase');
175 // deferredResult.setValue('currentPassphrase');
176 deferredResult.addMethod(this.connection(), 'ping');
177 deferredResult.addMethod(this, 'setUsername', aUsername)
178 deferredResult.acquireLock(this.deferredLockForSection('passphrase'));
179 deferredResult.addMethod(this.data(), 'deferredGetOrSet', 'passphrase', aPassphrase);
180 deferredResult.releaseLock(this.deferredLockForSection('passphrase'));
181 // deferredResult.getValue('currentPassphrase');
182 deferredResult.addMethod(this, 'prepareRemoteDataWithKey', aPassphrase);
183 deferredResult.addMethod(this.connection(), 'updateCredentials', aUsername, aPassphrase);
184 deferredResult.callback();
185
186 return deferredResult;
187 },
188
189 //-------------------------------------------------------------------------
190
191 'initialSetupWithNoData': function () {
192 this._serverData = {
193 'version': '0.1',
194 'statistics': "",
195 'header': {
196 'data': null,
197 'version': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
198
199 'recordsIndex': new Clipperz.PM.DataModel.User.Header.RecordIndex({
200 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
201 'recordsData': {'data':null, 'index':{}},
202 'recordsStats': null,
203 'directLoginsData': {'data':null, 'index':{}},
204 'encryptedDataVersion': Clipperz.PM.Crypto.encryptingFunctions.currentVersion,
205 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
206 }),
207 'preferences': new Clipperz.PM.DataModel.User.Header.Preferences({
208 'name':'preferences',
209 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
210 }),
211 'oneTimePasswords': new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
212 'name':'preferences',
213 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
214 })
215 }
216 };
217
218 // this._serverLockValue = Clipperz.PM.Crypto.randomKey();
219 },
220
221 //.........................................................................
222
223 'registerAsNewAccount': function () {
224 var deferredResult;
225
226 deferredResult = new Clipperz.Async.Deferred("User.registerAsNewAccount", {trace:false});
227 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
228 deferredResult.addMethod(this, 'initialSetupWithNoData')
229 deferredResult.addMethod(this, 'getPassphrase');
230 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
231 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
232 deferredResult.addMethod(this.connection(), 'register');
233 // deferredResult.addCallback(MochiKit.Base.itemgetter('lock'));
234 // deferredResult.addMethod(this, 'setServerLockValue');
235 // deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyRegistered');
236
237 // deferredResult.addErrback (MochiKit.Base.method(this, 'handleRegistrationFailure'));
238
239 deferredResult.callback();
240
241 return deferredResult;
242 },
243
244 //-------------------------------------------------------------------------
245
246 'login': function () {
247 var deferredResult;
248
249 deferredResult = new Clipperz.Async.Deferred("User.login", {trace:false});
250 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':3});
251 deferredResult.addMethod(this, 'getPassphrase');
252 deferredResult.addCallback(Clipperz.PM.DataModel.OneTimePassword.isValidOneTimePasswordValue);
253 deferredResult.addCallback(Clipperz.Async.deferredIf("Is the passphrase an OTP", [
254 // MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'updateProgress', {'extraSteps':1}),
255 MochiKit.Base.method(this, 'getCredentials'),
256 MochiKit.Base.method(this.connection(), 'redeemOneTimePassword'),
257 MochiKit.Base.method(this.data(), 'setValue', 'passphrase')
258 ], []));
259 deferredResult.addErrback(MochiKit.Base.method(this, 'getPassphrase'));
260 deferredResult.addMethod(this.connection(), 'login', false);
261 deferredResult.addMethod(this, 'setupConnectionInfo');
262 // deferredResult.addCallbackPass(MochiKit.Signal.signal,Clipperz.Signal.NotificationCenter, 'userSuccessfullyLoggedIn');
263 deferredResult.addErrback (MochiKit.Base.method(this, 'handleConnectionFallback'));
264
265 deferredResult.callback();
266
267 return deferredResult;
268 },
269
270 //.........................................................................
271
272 'handleConnectionFallback': function(aValue) {
273 var result;
274
275//console.log("USER - handleConnectionFallback", aValue, aValue['isPermanent']);
276 if (aValue instanceof MochiKit.Async.CancelledError) {
277 result = aValue;
278 } else if ((aValue['isPermanent'] === true) || (Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()] == null)) {
279 result = Clipperz.Async.callbacks("User.handleConnectionFallback - failed", [
280 MochiKit.Base.method(this.data(), 'removeValue', 'passphrase'),
281 MochiKit.Base.method(this, 'setConnectionVersion', 'current'),
282 // MochiKit.Base.partial(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userLoginFailed'),
283 // MochiKit.Base.partial(MochiKit.Async.fail, Clipperz.PM.DataModel.User.exception.LoginFailed)
284 MochiKit.Base.partial(MochiKit.Async.fail, aValue)
285 ], {trace:false});
286 } else {
287 this.setConnectionVersion(Clipperz.PM.Connection.communicationProtocol.fallbackVersions[this.connectionVersion()]);
288 result = new Clipperz.Async.Deferred("User.handleConnectionFallback - retry");
289 result.addMethod(this, 'login');
290 result.callback();
291 }
292
293 return result;
294 },
295
296 //-------------------------------------------------------------------------
297
298 'setupConnectionInfo': function (aValue) {
299 // this.setLoginInfo(aValue['loginInfo']);
300 this.setSubscription(new Clipperz.PM.DataModel.User.Subscription(aValue['subscription']));
301 },
302
303 //-------------------------------------------------------------------------
304
305 'lock': function () {
306 return Clipperz.Async.callbacks("User.lock", [
307 MochiKit.Base.method(this, 'deleteAllCleanTextData')
308 ], {trace:false});
309 },
310
311 //-------------------------------------------------------------------------
312
313 'logout': function () {
314 return Clipperz.Async.callbacks("User.logout", [
315 MochiKit.Base.method(this, 'deleteAllCleanTextData'),
316 MochiKit.Base.method(this.connection(), 'logout')
317 ], {trace:false});
318 },
319
320 //-------------------------------------------------------------------------
321
322 'headerFormatVersion': function(anHeader) {
323 var result;
324
325 if (anHeader.charAt(0) == '{') {
326 varheaderData;
327
328 headerData = Clipperz.Base.evalJSON(anHeader);
329 result = headerData['version'];
330 } else {
331 result = 'LEGACY';
332 }
333
334 return result;
335 },
336
337 //-------------------------------------------------------------------------
338
339 'unpackServerData': function (someServerData) {
340 var unpackedData;
341 var headerVersion;
342
343 varrecordsIndex;
344 var preferences;
345 var oneTimePasswords;
346
347 // this.setServerLockValue(someServerData['lock']);
348
349 headerVersion = this.headerFormatVersion(someServerData['header']);
350 switch (headerVersion) {
351 case 'LEGACY':
352 varlegacyHeader;
353
354 legacyHeader = new Clipperz.PM.DataModel.User.Header.Legacy({
355 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
356 'remoteData': {
357 'data': someServerData['header'],
358 'version': someServerData['version'],
359 'recordsStats': someServerData['recordsStats']
360 },
361 // 'encryptedDataKeypath': 'data',
362 // 'encryptedVersionKeypath': 'version',
363 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
364 });
365
366 recordsIndex = legacyHeader;
367 preferences = legacyHeader;
368 oneTimePasswords= legacyHeader;
369 break;
370 case '0.1':
371 varheaderData;
372
373 headerData = Clipperz.Base.evalJSON(someServerData['header']);
374
375 recordsIndex = new Clipperz.PM.DataModel.User.Header.RecordIndex({
376 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
377 'recordsData': headerData['records'],
378 'recordsStats': someServerData['recordsStats'],
379 'directLoginsData': headerData['directLogins'],
380 'encryptedDataVersion': someServerData['version'],
381 'retrieveRecordDetailFunction':MochiKit.Base.method(this, 'getRecordDetail')
382 });
383
384 //Still missing a test case that actually fais with the old version of the code, where the check for undefined was missing
385 if (typeof(headerData['preferences']) != 'undefined') {
386 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
387 'name':'preferences',
388 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
389 'remoteData': {
390 'data': headerData['preferences']['data'],
391 'version': someServerData['version']
392 }
393 });
394 } else {
395 preferences= new Clipperz.PM.DataModel.User.Header.Preferences({
396 'name':'preferences',
397 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
398 });
399 }
400
401 if (typeof(headerData['oneTimePasswords']) != 'undefined') {
402 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
403 'name':'preferences',
404 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase'),
405 'remoteData': {
406 'data': headerData['oneTimePasswords']['data'],
407 'version': someServerData['version']
408 }
409 });
410 } else {
411 oneTimePasswords = new Clipperz.PM.DataModel.User.Header.OneTimePasswords({
412 'name':'preferences',
413 'retrieveKeyFunction': MochiKit.Base.method(this, 'getPassphrase')
414 });
415 }
416
417 break;
418 }
419
420 unpackedData = {
421 'version': someServerData['version'],
422 'statistics': someServerData['statistics'],
423 'header': {
424 'data': someServerData['header'],
425 'version': headerVersion,
426
427 'recordsIndex': recordsIndex,
428 'preferences': preferences,
429 'oneTimePasswords': oneTimePasswords
430 }
431 };
432
433 this._serverData = unpackedData;
434
435 return this._serverData;
436 },
437
438 //-------------------------------------------------------------------------
439
440 'getServerData': function() {
441 var deferredResult;
442
443 deferredResult = new Clipperz.Async.Deferred("User.getServerData", {trace:false});
444 deferredResult.acquireLock(this.deferredLockForSection('serverData'));
445 deferredResult.addCallback(MochiKit.Base.bind(function(aResult) {
446 var innerDeferredResult;
447
448 innerDeferredResult = new Clipperz.Async.Deferred("User.getUserDetails.innerDeferred", {trace:false});
449 if (this._serverData == null) {
450 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadingUserDetails');
451 innerDeferredResult.addMethod(this.connection(), 'message', 'getUserDetails');
452 innerDeferredResult.addMethod(this, 'unpackServerData');
453 innerDeferredResult.addCallbackPass(MochiKit.Signal.signal, this, 'loadedUserDetails');
454 }
455
456 innerDeferredResult.addCallback(MochiKit.Base.bind(function () {
457 return this._serverData;
458 },this));
459 innerDeferredResult.callback();
460
461 return innerDeferredResult;
462 }, this));
463 deferredResult.releaseLock(this.deferredLockForSection('serverData'));
464 deferredResult.callback();
465
466 return deferredResult;
467 },
468
469 //-------------------------------------------------------------------------
470
471 'connectionVersion': function() {
472 return this._connectionVersion;
473 },
474
475 'setConnectionVersion': function(aValue) {
476 if (this._connectionVersion != aValue) {
477 this.resetConnection();
478 }
479 this._connectionVersion = aValue;
480 },
481
482 //-------------------------------------------------------------------------
483
484 'connection': function() {
485 if ((this._connection == null) && (this.connectionVersion() != null) ){
486 this._connection = new Clipperz.PM.Connection.communicationProtocol.versions[this.connectionVersion()]({
487 getCredentialsFunction: MochiKit.Base.method(this, 'getCredentials')
488 });
489 }
490
491 return this._connection;
492 },
493
494 'resetConnection': function(aValue) {
495 if (this._connection != null) {
496 this._connection.reset();
497 }
498
499 this._connection = null;
500 },
501
502 //=========================================================================
503
504 'getHeaderIndex': function (aKey) {
505 return Clipperz.Async.callbacks("User.getHeaderIndex", [
506 MochiKit.Base.method(this, 'getServerData'),
507 MochiKit.Base.itemgetter('header'),
508 MochiKit.Base.itemgetter(aKey)
509 ], {trace:false})
510 },
511
512 //=========================================================================
513
514 'getRecords': function () {
515 return Clipperz.Async.callbacks("User.getRecords", [
516 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
517 MochiKit.Base.methodcaller('records'),
518 MochiKit.Base.values
519 ], {trace:false});
520 },
521
522 'recordWithLabel': function (aLabel) {
523 return Clipperz.Async.callbacks("User.recordWithLabel", [
524 MochiKit.Base.method(this, 'getRecords'),
525 MochiKit.Base.partial(Clipperz.Async.deferredFilter, function (aRecord) {
526 return Clipperz.Async.callbacks("User.recordWithLabel - check record label", [
527 MochiKit.Base.methodcaller('label'),
528 MochiKit.Base.partial(MochiKit.Base.operator.eq, aLabel)
529 ], {trace:false}, aRecord);
530 }),
531 function (someFilteredResults) {
532 var result;
533
534 switch (someFilteredResults.length) {
535 case 0:
536 result = null;
537 break;
538 case 1:
539 result = someFilteredResults[0];
540 break;
541 default:
542 WTF = TODO;
543 break;
544 }
545
546 return result;
547 }
548 ], {trace:false});
549 },
550
551 //-------------------------------------------------------------------------
552
553 'getRecord': function (aRecordReference) {
554 return Clipperz.Async.callbacks("User.getRecord", [
555 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
556 MochiKit.Base.methodcaller('records'),
557 MochiKit.Base.itemgetter(aRecordReference),
558
559 Clipperz.Async.deferredIf("record != null", [
560 MochiKit.Base.operator.identity
561 ], [
562 function () { throw "Record does not exists"}
563 ])
564 ], {trace:false});
565 },
566
567 //-------------------------------------------------------------------------
568
569 'getRecordDetail': function (aRecordReference) {
570 return this.connection().message('getRecordDetail', {reference: aRecordReference});
571 },
572
573 //-------------------------------------------------------------------------
574
575 'deleteRecord': function (aRecord) {
576 return Clipperz.Async.callbacks("User.deleteRecord", [
577 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
578 MochiKit.Base.methodcaller('deleteRecord', aRecord)
579 ], {trace:false});
580 },
581
582 //-------------------------------------------------------------------------
583
584 'createNewRecord': function () {
585 return Clipperz.Async.callbacks("User.createNewRecord", [
586 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
587 MochiKit.Base.methodcaller('createNewRecord')
588 ], {trace:false});
589 },
590
591 //=========================================================================
592
593 'getDirectLogins': function() {
594 var deferredResult;
595
596 deferredResult = new Clipperz.Async.Deferred("User.getDirectLogins", {trace:false});
597 deferredResult.addMethod(this, 'getRecords');
598 deferredResult.addCallback(MochiKit.Base.map, MochiKit.Base.compose(MochiKit.Base.values, MochiKit.Base.methodcaller('directLogins')));
599 deferredResult.addCallback(MochiKit.Base.flattenArray);
600 deferredResult.callback();
601
602 return deferredResult;
603 },
604
605 //=========================================================================
606
607 'getOneTimePasswords': function () {
608 return Clipperz.Async.callbacks("User.getOneTimePasswords", [
609 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
610 MochiKit.Base.methodcaller('oneTimePasswords'),
611 MochiKit.Base.values
612 ], {trace:false});
613 },
614
615 //=========================================================================
616
617 'invokeMethodNamedOnHeader': function (aMethodName, aValue) {
618 return Clipperz.Async.collectResults("User.invokeMethodNamedOnHeader [" + aMethodName + "]", {
619 'recordIndex': [
620 MochiKit.Base.method(this, 'getHeaderIndex', 'recordsIndex'),
621 MochiKit.Base.methodcaller(aMethodName, aValue)
622 ],
623 'preferences': [
624 MochiKit.Base.method(this, 'getHeaderIndex', 'preferences'),
625 MochiKit.Base.methodcaller(aMethodName, aValue)
626 ],
627 'oneTimePasswords': [
628 MochiKit.Base.method(this, 'getHeaderIndex', 'oneTimePasswords'),
629 MochiKit.Base.methodcaller(aMethodName, aValue)
630 ]//,
631 // 'statistics': [
632 // MochiKit.Base.method(this, 'getStatistics'),
633 // MochiKit.Base.methodcaller(aMethodName, aValue)
634 // ]
635 }, {trace:false})();
636 },
637
638 //-------------------------------------------------------------------------
639
640 'invokeMethodNamedOnRecords': function (aMethodName, aValue) {
641 return Clipperz.Async.callbacks("User.invokeMethodNamedOnRecords[" + aMethodName + "]", [
642 MochiKit.Base.method(this, 'getRecords'),
643 MochiKit.Base.partial(MochiKit.Base.map, MochiKit.Base.methodcaller(aMethodName, aValue)),
644 Clipperz.Async.collectAll
645 ], {trace:false});
646 },
647
648 //=========================================================================
649
650 'hasPendingChanges': function () {
651 vardeferredResult;
652
653 deferredResult = new Clipperz.Async.Deferred("User.hasPendingChanges", {trace:false});
654 deferredResult.collectResults({
655 'header': [
656 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasPendingChanges'),
657 MochiKit.Base.values
658 ],
659 'records': MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasPendingChanges')
660 });
661 deferredResult.addCallback(Clipperz.Async.or);
662 deferredResult.callback();
663 // recordsIndex = legacyHeader;
664 // preferences = legacyHeader;
665 // oneTimePasswords= legacyHeader;
666
667 return deferredResult;
668 },
669
670 //=========================================================================
671
672 'commitTransientState': function () {
673 return Clipperz.Async.callbacks("User.commitTransientState", [
674 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'commitTransientState'),
675 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'commitTransientState'),
676
677 MochiKit.Base.method(this, 'transientState'),
678 // MochiKit.Base.itemgetter('lock'),
679 // MochiKit.Base.method(this, 'setServerLockValue'),
680 MochiKit.Base.method(this, 'resetTransientState', true)
681 ], {trace:false});
682 },
683
684 //-------------------------------------------------------------------------
685
686 'revertChanges': function () {
687 return Clipperz.Async.callbacks("User.revertChanges", [
688 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'revertChanges'),
689 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'revertChanges'),
690 MochiKit.Base.method(this, 'resetTransientState', false)
691 ], {trace:false});
692 },
693
694 //=========================================================================
695
696 'deleteAllCleanTextData': function () {
697 return Clipperz.Async.callbacks("User.deleteAllCleanTextData", [
698 MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'deleteAllCleanTextData'),
699 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'deleteAllCleanTextData'),
700
701 MochiKit.Base.method(this.data(), 'removeAllData'),
702 MochiKit.Base.method(this, 'resetTransientState', false)
703 ], {trace:false});
704 },
705
706 //-------------------------------------------------------------------------
707
708 'hasAnyCleanTextData': function () {
709 vardeferredResult;
710
711 deferredResult = new Clipperz.Async.Deferred("User.hasAnyCleanTextData", {trace:false});
712 deferredResult.collectResults({
713 'header':[
714 MochiKit.Base.method(this, 'invokeMethodNamedOnHeader', 'hasAnyCleanTextData'),
715 MochiKit.Base.values
716 ],
717 'records':MochiKit.Base.method(this, 'invokeMethodNamedOnRecords', 'hasAnyCleanTextData'),
718 'data': MochiKit.Base.bind(function () {
719 return MochiKit.Async.succeed(! this.data().isEmpty());
720 }, this),
721 'transientState':MochiKit.Base.bind(function () {
722 return MochiKit.Async.succeed(MochiKit.Base.keys(this.transientState()).length != 0);
723 }, this)
724 });
725 deferredResult.addCallback(Clipperz.Async.or);
726 deferredResult.callback();
727
728 return deferredResult;
729 },
730
731 //=========================================================================
732
733 'prepareRemoteDataWithKey': function (aKey /*, aCurrentKey*/) {
734 var deferredResult;
735 varresult;
736
737 result = {};
738 deferredResult = new Clipperz.Async.Deferred("User.prepareRemoteDataWithKey", {trace:false});
739 deferredResult.addMethod(this, 'invokeMethodNamedOnHeader', 'prepareRemoteDataWithKey', aKey /*, aCurrentKey*/);
740 deferredResult.addCallback(MochiKit.Base.bind(function (aResult, someHeaderPackedData) {
741 var header;
742
743 header = {};
744 header['records'] = someHeaderPackedData['recordIndex']['records'];
745 header['directLogins'] = someHeaderPackedData['recordIndex']['directLogins'];
746 header['preferences'] = {'data': someHeaderPackedData['preferences']['data']};
747 header['oneTimePasswords']= {'data': someHeaderPackedData['oneTimePasswords']['data']};
748 header['version'] = '0.1';
749
750 aResult['header'] = Clipperz.Base.serializeJSON(header);
751 aResult['statistics'] = this._serverData['statistics']; //"someHeaderPackedData['statistics']['data']";
752
753 return aResult;
754 }, this), result);
755 deferredResult.addCallback(Clipperz.Async.setItem, result, 'version', Clipperz.PM.Crypto.encryptingFunctions.currentVersion);
756 // deferredResult.addCallback(Clipperz.Async.setItem, result, 'lock', this.serverLockValue());
757 deferredResult.callback();
758
759 return deferredResult;
760 },
761
762 //=========================================================================
763
764 'saveChanges': function () {
765 vardeferredResult;
766 var messageParameters;
767
768 messageParameters = {};
769
770 deferredResult = new Clipperz.Async.Deferred("User.saveChangaes", {trace:false});
771
772 deferredResult.addMethod(this, 'getHeaderIndex', 'recordsIndex');
773 deferredResult.addCallback(MochiKit.Base.methodcaller('prepareRemoteDataForChangedRecords'));
774 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'records');
775 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
776
777 deferredResult.addMethod(this, 'getPassphrase');
778 deferredResult.addMethod(this, 'prepareRemoteDataWithKey');
779 deferredResult.addCallback(Clipperz.Async.setItem, messageParameters, 'user');
780 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
781
782 deferredResult.addCallback(MochiKit.Async.succeed, messageParameters);
783 deferredResult.addMethod(this.connection(), 'message', 'saveChanges');
784 deferredResult.addCallback(MochiKit.Base.update, this.transientState())
785 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
786
787 deferredResult.addMethod(this, 'commitTransientState');
788 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'advanceProgress');
789 // deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'userDataSuccessfullySaved');
790
791 deferredResult.addErrbackPass(MochiKit.Base.method(this, 'revertChanges'));
792 // deferredResult.addErrbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'failureWhileSavingUserData');
793
794 deferredResult.callback();
795
796 return deferredResult;
797 },
798
799 //=========================================================================
800 __syntaxFix__: "syntax fix"
801});
802
803//-----------------------------------------------------------------------------
804
805Clipperz.PM.DataModel.User.registerNewAccount = function (anUsername, aPassphraseFunction) {
806 vardeferredResult;
807 var user;
808
809 user = new Clipperz.PM.DataModel.User({'username':anUsername, 'getPassphraseFunction':aPassphraseFunction});
810
811 deferredResult = new Clipperz.Async.Deferred("Clipperz.PM.DataModel.User.registerNewAccount", {trace:false});
812 deferredResult.addMethod(user, 'registerAsNewAccount');
813 deferredResult.addMethod(user, 'login');
814 deferredResult.addCallback(MochiKit.Async.succeed, user);
815 deferredResult.callback();
816
817 return deferredResult;
818}
819
820//-----------------------------------------------------------------------------
821
822Clipperz.PM.DataModel.User.exception = {
823 LoginFailed: new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.LoginFailed"),
824 CredentialUpgradeFailed:new MochiKit.Base.NamedError("Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed")
825};
826
827//-----------------------------------------------------------------------------
diff --git a/frontend/delta/js/Clipperz/PM/Date.js b/frontend/delta/js/Clipperz/PM/Date.js
new file mode 100644
index 0000000..a62857e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Date.js
@@ -0,0 +1,196 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; }
27
28Clipperz.PM.Date.VERSION = "0.1";
29Clipperz.PM.Date.NAME = "Clipperz.PM.Date";
30
31MochiKit.Base.update(Clipperz.PM.Date, {
32
33 '__repr__': function () {
34 return "[" + this.NAME + " " + this.VERSION + "]";
35 },
36
37 //-------------------------------------------------------------------------
38
39 'toString': function () {
40 return this.__repr__();
41 },
42
43 //-------------------------------------------------------------------------
44
45 'locale': function() {
46 return {
47 'amDesignation':Clipperz.PM.Strings.getValue('calendarStrings.amDesignation'),
48 'pmDesignation':Clipperz.PM.Strings.getValue('calendarStrings.pmDesignation'),
49 'days': Clipperz.PM.Strings.getValue('calendarStrings.days'),
50 'shortDays': Clipperz.PM.Strings.getValue('calendarStrings.shortDays'),
51 'shortMonths': Clipperz.PM.Strings.getValue('calendarStrings.shortMonths'),
52 'months': Clipperz.PM.Strings.getValue('calendarStrings.months')
53 }
54 },
55
56 //=========================================================================
57/*
58 'formatDateWithPHPLikeTemplate': function(aDate, aTemplate) {
59 return Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
60 },
61
62 'parseDateWithPHPLikeTemplate': function(aDate, aTemplate) {
63 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
64 },
65
66 //=========================================================================
67
68 'formatDateWithJavaLikeTemplate': function(aDate, aTemplate) {
69 return Clipperz.Date.formatDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
70 },
71
72 'parseDateWithJavaLikeTemplate': function(aDate, aTemplate) {
73 return Clipperz.Date.parseDateWithJavaLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
74 },
75*/
76 //=========================================================================
77
78 'formatWithTemplate': function (aTemplate, aDate) {
79 return Clipperz.PM.Date.formatDateWithTemplate(aDate, aTemplate);
80 },
81
82 'formatDateWithTemplate': function(aDate, aTemplate) {
83 var result;
84
85 if (aDate == null) {
86 result = ""
87 } else {
88 result = Clipperz.Date.formatDateWithPHPLikeTemplateAndLocale(aDate, aTemplate, Clipperz.PM.Date.locale());
89 };
90
91 return result;
92 },
93
94 'parseDateWithTemplate': function(aValue, aTemplate) {
95 return Clipperz.Date.parseDateWithPHPTemplateAndLocale(aValue, aTemplate, Clipperz.PM.Date.locale());
96 },
97
98 //=========================================================================
99
100 'formatDateWithUTCFormat': function(aDate) {
101 return Clipperz.Date.formatDateWithUTCFormatAndLocale(aDate, Clipperz.PM.Date.locale());
102 },
103
104 'parseDateWithUTCFormat': function(aValue) {
105 var result;
106
107 if (aValue == null) {
108 result = null;
109 } else {
110 result = Clipperz.Date.parseDateWithUTCFormatAndLocale(aValue, Clipperz.PM.Date.locale());
111 }
112
113 return result;
114 },
115
116 //=========================================================================
117
118 'getElapsedTimeDescription': function(aDate) {
119 var result;
120
121 result = ""
122
123 if (aDate != null) {
124 var now;
125 var elapsedTime;
126
127 var millisencondsInAMinute;
128 var millisencondsInAnHour;
129 var millisencondsInADay;
130 var millisencondsInAWeek;
131 var millisencondsInAMonth;
132
133 now = new Date();
134 elapsedTime = now.getTime() - aDate.getTime();
135
136 millisencondsInAMinute = 60 * 1000;
137 millisencondsInAnHour = millisencondsInAMinute * 60;
138 millisencondsInADay = millisencondsInAnHour * 24;
139 millisencondsInAWeek = millisencondsInADay * 7;
140 millisencondsInAMonth = millisencondsInAWeek * 5;
141
142 if ((elapsedTime / millisencondsInAMonth) > 1) {
143 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_MONTH_AGO');
144 } else if ((elapsedTime / millisencondsInAWeek) > 1) {
145 var elapsedWeeks;
146
147 elapsedWeeks = Math.floor((elapsedTime / millisencondsInAWeek));
148 if (elapsedWeeks == 1) {
149 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_A_WEEK_AGO');
150 } else {
151 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.MORE_THAN_*_WEEKS_AGO').replace(/__elapsed__/, elapsedWeeks);
152 }
153 } else if ((elapsedTime / millisencondsInADay) > 1) {
154 var elapsedDays;
155
156 elapsedDays = Math.floor((elapsedTime / millisencondsInADay));
157 if (elapsedDays == 1) {
158 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.YESTERDAY');
159 } else {
160 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_DAYS_AGO').replace(/__elapsed__/, elapsedDays);
161 }
162 } else if ((elapsedTime / millisencondsInAnHour) > 1) {
163 var elapsedHours;
164
165 elapsedHours = Math.floor((elapsedTime / millisencondsInAnHour));
166 if (elapsedHours == 1) {
167 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_AN_HOUR_AGO');
168 } else {
169 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.*_HOURS_AGO').replace(/__elapsed__/, elapsedHours);
170 }
171 } else {
172 var elapsed10Minutes;
173
174 elapsed10Minutes = (Math.floor((elapsedTime / millisencondsInAMinute) / 10)) * 10;
175 if (elapsed10Minutes == 0) {
176 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.JUST_A_FEW_MINUTES_AGO');
177 } else {
178 result = Clipperz.PM.Strings.getValue('elapsedTimeDescriptions.ABOUT_*_MINUTES_AGO').replace(/__elapsed__/, elapsed10Minutes+"");
179 }
180 }
181 }
182
183 return result;
184 },
185
186 //-------------------------------------------------------------------------
187
188 'parse': function (aValue) {
189 return Clipperz.PM.Date.parseDateWithUTCFormat(aValue);
190 },
191
192 //-------------------------------------------------------------------------
193 __syntaxFix__: "syntax fix"
194
195});
196
diff --git a/frontend/delta/js/Clipperz/PM/PIN.js b/frontend/delta/js/Clipperz/PM/PIN.js
new file mode 100644
index 0000000..a32889a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/PIN.js
@@ -0,0 +1,132 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; }
27
28MochiKit.Base.update(Clipperz.PM.PIN, {
29
30 //-------------------------------------------------------------------------
31
32 '__repr__': function () {
33 return "[" + this.NAME + " " + this.VERSION + "]";
34 },
35
36 //-------------------------------------------------------------------------
37
38 'toString': function () {
39 return this.__repr__();
40 },
41
42 'CREDENTIALS': 'CLIPPERZ.CREDENTIALS',
43 'FAILURE_COUNT': 'CLIPPERZ.FAILED_LOGIN_COUNT',
44 'ALLOWED_RETRY': 3,
45
46 //-------------------------------------------------------------------------
47
48 'isSet': function () {
49 return (this.storedCredentials() != null);
50 },
51
52 'storedCredentials': function () {
53 return localStorage[this.CREDENTIALS];
54 },
55
56 //-------------------------------------------------------------------------
57
58 'recordFailedAttempt': function () {
59 varfailureCount;
60 varresult;
61
62 failureCount = localStorage[this.FAILURE_COUNT];
63
64 if (failureCount == null) {
65 failureCount = 0
66 }
67
68 failureCount ++;
69
70 if (failureCount < this.ALLOWED_RETRY) {
71 localStorage[this.FAILURE_COUNT] = failureCount;
72 result = failureCount;
73 } else {
74 this.removeLocalCredentials();
75 result = -1;
76 }
77
78 return result;
79 },
80
81 'resetFailedAttemptCount': function () {
82 localStorage.removeItem(this.FAILURE_COUNT);
83 },
84
85 'failureCount': function () {
86 return localStorage[this.FAILURE_COUNT];
87 },
88
89 //-------------------------------------------------------------------------
90
91 'deriveKeyFromPin': function (aPIN) {
92 return Clipperz.Crypto.SHA.sha256(new Clipperz.ByteArray(aPIN));
93 },
94
95 'credentialsWithPIN': function (aPIN) {
96 varbyteArrayValue;
97 var decryptedValue;
98 varresult;
99
100 byteArrayValue = (new Clipperz.ByteArray()).appendBase64String(localStorage[this.CREDENTIALS]);
101 decryptedValue = Clipperz.Crypto.AES.decrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).asString();
102 try {
103 result = Clipperz.Base.evalJSON(decryptedValue);
104 } catch (error) {
105 result = {'username':'fakeusername', 'passphrase':'fakepassphrase'};
106 }
107
108 return result;
109 },
110
111 'setCredentialsWithPIN': function (aPIN, someCredentials) {
112 varencodedValue;
113 varbyteArrayValue;
114 var encryptedValue;
115
116 encodedValue = Clipperz.Base.serializeJSON(someCredentials);
117 byteArrayValue = new Clipperz.ByteArray(encodedValue);
118 encryptedValue = Clipperz.Crypto.AES.encrypt(this.deriveKeyFromPin(aPIN), byteArrayValue).toBase64String();
119
120 localStorage[this.CREDENTIALS] = encryptedValue;
121 },
122
123 'removeLocalCredentials': function () {
124 localStorage.removeItem(this.CREDENTIALS);
125 localStorage.removeItem(this.FAILURE_COUNT);
126 },
127
128 //-------------------------------------------------------------------------
129 __syntaxFix__: "syntax fix"
130
131});
132
diff --git a/frontend/delta/js/Clipperz/PM/Proxy.js b/frontend/delta/js/Clipperz/PM/Proxy.js
new file mode 100644
index 0000000..2ac684a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy.js
@@ -0,0 +1,186 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26
27//=============================================================================
28
29Clipperz.PM.Proxy = function(args) {
30 args = args || {};
31
32 this._shouldPayTolls = args.shouldPayTolls || false;
33
34 this._tolls = {
35 'CONNECT':[],
36 'REGISTER':[],
37 'MESSAGE':[]
38 };
39
40 if (args.isDefault === true) {
41 Clipperz.PM.Proxy.defaultProxy = this;
42 }
43
44 return this;
45}
46
47Clipperz.PM.Proxy.prototype = MochiKit.Base.update(null, {
48
49 'toString': function() {
50 return "Clipperz.PM.Proxy";
51 },
52
53 //=========================================================================
54
55 'shouldPayTolls': function() {
56 return this._shouldPayTolls;
57 },
58
59 //-------------------------------------------------------------------------
60
61 'tolls': function() {
62 return this._tolls;
63 },
64
65 //-------------------------------------------------------------------------
66
67 'payToll': function(aRequestType, someParameters) {
68 vardeferredResult;
69
70 if (this.shouldPayTolls()) {
71 deferredResult = new Clipperz.Async.Deferred("Proxy.payToll", {trace:false});
72
73 if (this.tolls()[aRequestType].length == 0) {
74 deferredResult.addMethod(this, 'sendMessage', 'knock', {requestType:aRequestType});
75 deferredResult.addMethod(this, 'setTollCallback');
76 }
77 deferredResult.addMethod(this.tolls()[aRequestType], 'pop');
78 deferredResult.addCallback(MochiKit.Base.methodcaller('deferredPay'));
79 deferredResult.addCallback(function(aToll) {
80 var result;
81
82 result = {
83 parameters: someParameters,
84 toll: aToll
85 }
86
87 return result;
88 });
89
90 deferredResult.callback();
91 } else {
92 deferredResult = MochiKit.Async.succeed({parameters:someParameters});
93 }
94
95 return deferredResult;
96 },
97
98 //-------------------------------------------------------------------------
99
100 'addToll': function(aToll) {
101 this.tolls()[aToll.requestType()].push(aToll);
102 },
103
104 //=========================================================================
105
106 'setTollCallback': function(someParameters) {
107 if (typeof(someParameters['toll']) != 'undefined') {
108 this.addToll(new Clipperz.PM.Toll(someParameters['toll']));
109 }
110
111 return someParameters['result'];
112 },
113
114 //=========================================================================
115
116 'registration': function (someParameters) {
117 return this.processMessage('registration', someParameters, 'REGISTER');
118 },
119
120 'handshake': function (someParameters) {
121 return this.processMessage('handshake', someParameters, 'CONNECT');
122 },
123
124 'message': function (someParameters) {
125 return this.processMessage('message', someParameters, 'MESSAGE');
126 },
127
128 'logout': function (someParameters) {
129 return this.processMessage('logout', someParameters, 'MESSAGE');
130 },
131
132 //=========================================================================
133
134 'processMessage': function (aFunctionName, someParameters, aRequestType) {
135 vardeferredResult;
136
137 deferredResult = new Clipperz.Async.Deferred("Proxy.processMessage", {trace:false});
138 deferredResult.addMethod(this, 'payToll', aRequestType);
139 deferredResult.addMethod(this, 'sendMessage', aFunctionName);
140 deferredResult.addMethod(this, 'setTollCallback');
141 deferredResult.callback(someParameters);
142
143 return deferredResult;
144 },
145
146 //=========================================================================
147
148 '_sendMessage': function (aFunctionName, aVersion, someParameters) {
149 throw Clipperz.Base.exception.AbstractMethod;
150 },
151
152 'sendMessage': function (aFunctionName, someParameters) {
153 var deferredResult;
154
155 //TODO: read actual application version for a property set at build time
156 deferredResult = new Clipperz.Async.Deferred("Proxy.sendMessage", {trace:false});
157 deferredResult.addMethod(this, '_sendMessage', aFunctionName, 'fake-app-version');
158 deferredResult.addErrback(MochiKit.Base.method(this, 'handleError'));
159 deferredResult.callback(someParameters);
160
161 return deferredResult;
162 },
163
164 //-------------------------------------------------------------------------
165
166 'handleError': function (anError) {
167 if (anError['message'] == 'Wrong application version') {
168 anError['isPermanent'] = true;
169 }
170 return anError;
171 },
172
173 //=========================================================================
174
175 'isReadOnly': function () {
176 return false;
177 },
178
179 'canRegisterNewUsers': function () {
180 return true;
181 },
182
183 //=========================================================================
184 __syntaxFix__: "syntax fix"
185
186});
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js
new file mode 100755
index 0000000..1638d99
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.JSON.js
@@ -0,0 +1,86 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26
27//=============================================================================
28
29Clipperz.PM.Proxy.JSON = function(args) {
30 Clipperz.PM.Proxy.JSON.superclass.constructor.call(this, args);
31
32 this._url = args.url || Clipperz.Base.exception.raise('MandatoryParameter');
33
34 return this;
35}
36
37Clipperz.Base.extend(Clipperz.PM.Proxy.JSON, Clipperz.PM.Proxy, {
38
39 'toString': function() {
40 return "Clipperz.PM.Proxy.JSON";
41 },
42
43 //=========================================================================
44
45 'url': function () {
46 return this._url;
47 },
48
49 //=========================================================================
50
51 '_sendMessage': function(aFunctionName, aVersion, someParameters) {
52 vardeferredResult;
53 var parameters;
54
55 parameters = {
56 method: aFunctionName,
57 version: aVersion,
58 parameters: Clipperz.Base.serializeJSON(someParameters)
59 };
60
61 deferredResult = new Clipperz.Async.Deferred("Proxy.JSON.sendMessage", {trace:false});
62 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestSent');
63 deferredResult.addCallback(MochiKit.Async.doXHR, this.url(), {
64 method:'POST',
65 sendContent:MochiKit.Base.queryString(parameters),
66 headers:{"Content-Type":"application/x-www-form-urlencoded"}
67 });
68 deferredResult.addCallbackPass(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'remoteRequestReceived');
69 deferredResult.addCallback(MochiKit.Base.itemgetter('responseText'));
70 deferredResult.addCallback(Clipperz.Base.evalJSON);
71 deferredResult.addCallback(function (someValues) {
72 if (someValues['result'] == 'EXCEPTION') {
73 throw someValues['message'];
74 }
75
76 return someValues;
77 })
78 deferredResult.callback();
79
80 return deferredResult;
81 },
82
83 //=========================================================================
84 __syntaxFix__: "syntax fix"
85
86});
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
new file mode 100644
index 0000000..5711742
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js
@@ -0,0 +1,793 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!";
26}
27
28//=============================================================================
29
30Clipperz.PM.Proxy.Offline.DataStore = function(args) {
31 args = args || {};
32
33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
35 this._shouldPayTolls = args.shouldPayTolls || false;
36
37 this._tolls = {};
38 this._currentStaticConnection = null;
39
40 return this;
41}
42
43Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.DataStore, Object, {
44
45 //-------------------------------------------------------------------------
46
47 'isReadOnly': function () {
48 return this._isReadOnly;
49 },
50
51 'canRegisterNewUsers': function () {
52 return false;
53 },
54
55
56 //-------------------------------------------------------------------------
57
58 'shouldPayTolls': function() {
59 return this._shouldPayTolls;
60 },
61
62 //-------------------------------------------------------------------------
63
64 'data': function () {
65 return this._data;
66 },
67
68 //-------------------------------------------------------------------------
69
70 'tolls': function () {
71 return this._tolls;
72 },
73
74 //=========================================================================
75
76 'resetData': function() {
77 this._data = {
78 'users': {
79 'catchAllUser': {
80 __masterkey_test_value__: 'masterkey',
81 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
82 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
83 }
84 }
85 };
86 },
87
88 //-------------------------------------------------------------------------
89
90 'setupWithEncryptedData': function(someData) {
91 this._data = Clipperz.Base.deepClone(someData);
92 },
93
94 //-------------------------------------------------------------------------
95
96 'setupWithData': function(someData) {
97 var deferredResult;
98 var resultData;
99 var i, c;
100
101//Clipperz.log(">>> Proxy.Test.setupWithData");
102 resultData = this._data;
103
104 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
105 c = someData['users'].length;
106
107 for (i=0; i<c; i++) {
108 varnewConnection;
109 varrecordConfiguration;
110
111 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
112 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
113 resultData['users'][aUserSerializationContext['credentials']['C']] = {
114 's': aUserSerializationContext['credentials']['s'],
115 'v': aUserSerializationContext['credentials']['v'],
116 'version': aUserSerializationContext['data']['connectionVersion'],
117 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
118 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
119 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
120 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
121 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
122 }
123 }, this));
124 }
125
126 deferredResult.addCallback(MochiKit.Base.bind(function() {
127 this._data = resultData;
128 }, this));
129
130 deferredResult.callback();
131//Clipperz.log("<<< Proxy.Test.setupWithData");
132
133 return deferredResult;
134 },
135
136 //=========================================================================
137
138 'getTollForRequestType': function (aRequestType) {
139 varresult;
140 vartargetValue;
141 var cost;
142
143 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
144 switch (aRequestType) {
145 case 'REGISTER':
146 cost = 5;
147 break;
148 case 'CONNECT':
149 cost = 5;
150 break;
151 case 'MESSAGE':
152 cost = 2;
153 break;
154 }
155
156 result = {
157 requestType: aRequestType,
158 targetValue: targetValue,
159 cost: cost
160 }
161
162 if (this.shouldPayTolls()) {
163 this.tolls()[targetValue] = result;
164 }
165
166 return result;
167 },
168
169 //-------------------------------------------------------------------------
170
171 'checkToll': function (aFunctionName, someParameters) {
172 if (this.shouldPayTolls()) {
173 var localToll;
174 vartollParameters;
175
176 tollParameters = someParameters['toll'];
177 localToll = this.tolls()[tollParameters['targetValue']];
178
179 if (localToll != null) {
180 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
181 throw "Toll value too low.";
182 };
183 } else {
184 throw "Missing toll";
185 }
186 }
187 },
188
189 //=========================================================================
190
191 'currentStaticConnection': function () {
192 if (this._currentStaticConnection == null) {
193 this._currentStaticConnection = {};
194 }
195
196 return this._currentStaticConnection;
197 },
198
199 //-------------------------------------------------------------------------
200
201 'getConnectionForRequest': function (aFunctionName, someParameters) {
202 varresult;
203
204 if (this.shouldPayTolls()) {
205 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
206 result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
207 if (typeof(result) == 'undefined') {
208 result = {};
209 }
210 } else {
211 result = {};
212 }
213 } else {
214 result = this.currentStaticConnection();
215 }
216
217 return result;
218 },
219
220 //-------------------------------------------------------------------------
221
222 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
223 if (this.shouldPayTolls()) {
224 if ((typeof(aResponse['toll']) != 'undefined')
225 &&(typeof(aResponse['toll']['targetValue']) != 'undefined')
226 &&(typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined')
227 ) {
228 this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection;
229 }
230 }
231 },
232
233 //=========================================================================
234
235 'processMessage': function (aFunctionName, someParameters) {
236 var result;
237 varconnection;
238
239 connection = this.getConnectionForRequest(aFunctionName, someParameters);
240
241 switch(aFunctionName) {
242 case 'knock':
243 result = this._knock(connection, someParameters);
244 break;
245 case 'registration':
246 this.checkToll(aFunctionName, someParameters);
247 result = this._registration(connection, someParameters.parameters);
248 break;
249 case 'handshake':
250 this.checkToll(aFunctionName, someParameters);
251 result = this._handshake(connection, someParameters.parameters);
252 break;
253 case 'message':
254 this.checkToll(aFunctionName, someParameters);
255 result = this._message(connection, someParameters.parameters);
256 break;
257 case 'logout':
258 this._currentStaticConnection = null;
259 result = this._logout(connection, someParameters.parameters);
260 break;
261 }
262
263 this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
264
265 return MochiKit.Async.succeed(result);
266 },
267
268 //=========================================================================
269
270 '_knock': function(aConnection, someParameters) {
271 var result;
272
273 result = {
274 toll: this.getTollForRequestType(someParameters['requestType'])
275 }
276
277 return result;
278 },
279
280 //-------------------------------------------------------------------------
281
282 '_registration': function(aConnection, someParameters) {
283 if (this.isReadOnly() == false) {
284 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
285 this.data()['users'][someParameters['credentials']['C']] = {
286 's': someParameters['credentials']['s'],
287 'v': someParameters['credentials']['v'],
288 'version':someParameters['credentials']['version'],
289 // 'lock': Clipperz.Crypto.Base.generateRandomSeed(),
290 'userDetails': someParameters['user']['header'],
291 'statistics': someParameters['user']['statistics'],
292 'userDetailsVersion':someParameters['user']['version'],
293 'records':{}
294 }
295 } else {
296 throw "user already exists";
297 }
298 } else {
299 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
300 }
301
302 result = {
303 result: {
304 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
305 'result':'done'
306 },
307 toll: this.getTollForRequestType('CONNECT')
308 }
309
310 return result;
311 },
312
313 //-------------------------------------------------------------------------
314
315 '_handshake': function(aConnection, someParameters) {
316 var result;
317 varnextTollRequestType;
318
319 result = {};
320 if (someParameters.message == "connect") {
321 var userData;
322 var randomBytes;
323 var v;
324
325 userData = this.data()['users'][someParameters.parameters.C];
326
327 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
328 aConnection['userData'] = userData;
329 aConnection['C'] = someParameters.parameters.C;
330 } else {
331 aConnection['userData'] = this.data()['users']['catchAllUser'];
332 }
333
334 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
335 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
336 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
337 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
338
339 aConnection['A'] = someParameters.parameters.A;
340
341 result['s'] = aConnection['userData']['s'];
342 result['B'] = aConnection['B'].asString(16);
343
344 nextTollRequestType = 'CONNECT';
345 } else if (someParameters.message == "credentialCheck") {
346 var v, u, S, A, K, M1;
347
348 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
349 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
350 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
351 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
352
353 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
354
355 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
356 if (someParameters.parameters.M1 == M1) {
357 var M2;
358
359 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
360 result['M2'] = M2;
361 } else {
362 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
363 }
364
365 nextTollRequestType = 'MESSAGE';
366 } else if (someParameters.message == "oneTimePassword") {
367 var otpData;
368
369 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
370
371 try {
372 if (typeof(otpData) != 'undefined') {
373 if (otpData['status'] == 'ACTIVE') {
374 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
375 result = {
376 'data': otpData['data'],
377 'version':otpData['version']
378 }
379
380 otpData['status'] = 'REQUESTED';
381 } else {
382 otpData['status'] = 'DISABLED';
383 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
384 }
385 } else {
386 throw "The requested One Time Password was not active";
387 }
388 } else {
389 throw "The requested One Time Password has not been found"
390 }
391 } catch (exception) {
392 result = {
393 'data': Clipperz.PM.Crypto.randomKey(),
394 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
395 }
396 }
397 nextTollRequestType = 'CONNECT';
398 } else {
399 Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
400 }
401
402 result = {
403 result: result,
404 toll: this.getTollForRequestType(nextTollRequestType)
405 }
406
407 return result;
408 },
409
410 //-------------------------------------------------------------------------
411
412 '_message': function(aConnection, someParameters) {
413 var result;
414
415 result = {};
416
417 //=====================================================================
418 //
419 // R E A D - O N L Y M e t h o d s
420 //
421 //=====================================================================
422 if (someParameters.message == 'getUserDetails') {
423 var recordsStats;
424 var recordReference;
425
426 recordsStats = {};
427 for (recordReference in aConnection['userData']['records']) {
428 recordsStats[recordReference] = {
429 'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
430 }
431 }
432
433 result['header'] = this.userDetails(aConnection);
434 result['statistics'] = this.statistics(aConnection);
435 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
436 result['version'] = aConnection['userData']['userDetailsVersion'];
437 result['recordsStats'] = recordsStats;
438
439 if (this.isReadOnly() == false) {
440 varlock;
441
442 if (typeof(aConnection['userData']['lock']) == 'undefined') {
443 aConnection['userData']['lock'] = "<<LOCK>>";
444 }
445
446 result['lock'] = aConnection['userData']['lock'];
447 }
448
449 //=====================================================================
450 } else if (someParameters.message == 'getRecordDetail') {
451/*
452 varrecordData;
453 var currentVersionData;
454
455 recordData = this.userData()['records'][someParameters['parameters']['reference']];
456 result['reference'] = someParameters['parameters']['reference'];
457 result['data'] = recordData['data'];
458 result['version'] = recordData['version'];
459 result['creationData'] = recordData['creationDate'];
460 result['updateDate'] = recordData['updateDate'];
461 result['accessDate'] = recordData['accessDate'];
462
463 currentVersionData = recordData['versions'][recordData['currentVersion']];
464
465 result['currentVersion'] = {};
466 result['currentVersion']['reference'] = recordData['currentVersion'];
467 result['currentVersion']['version'] = currentVersionData['version'];
468 result['currentVersion']['header'] = currentVersionData['header'];
469 result['currentVersion']['data'] = currentVersionData['data'];
470 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
471 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
472 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
473 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
474 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
475 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
476 }
477*/
478 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
479 result['reference'] = someParameters['parameters']['reference'];
480
481 //=====================================================================
482 //
483 // R E A D - W R I T E M e t h o d s
484 //
485 //=====================================================================
486 } else if (someParameters.message == 'upgradeUserCredentials') {
487 if (this.isReadOnly() == false) {
488 var parameters;
489 var credentials;
490
491 parameters = someParameters['parameters'];
492 credentials = parameters['credentials'];
493
494 if ((credentials['C'] == null)
495 ||(credentials['s'] == null)
496 ||(credentials['v'] == null)
497 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
498 ) {
499 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
500 } else {
501 varoldCValue;
502 oldCValue = aConnection['C'];
503
504 this.data()['users'][credentials['C']] = aConnection['userData'];
505 aConnection['C'] = credentials['C'];
506
507 aConnection['userData']['s'] = credentials['s'];
508 aConnection['userData']['v'] = credentials['v'];
509 aConnection['userData']['version'] = credentials['version'];
510
511 aConnection['userData']['userDetails'] = parameters['user']['header'];
512 aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
513 aConnection['userData']['statistics'] = parameters['user']['statistics'];
514
515 aConnection['userData']['lock'] = parameters['user']['lock'];
516
517 delete this.data()['users'][oldCValue];
518
519 result = {result:"done", parameters:parameters};
520 }
521 } else {
522 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
523 }
524 //=====================================================================
525 /* } else if (someParameters.message == 'updateData') {
526 if (this.isReadOnly() == false) {
527 var i, c;
528
529 if (this.userData()['lock']!= someParameters['parameters']['user']['lock']) {
530 throw "the lock attribute is not processed correctly"
531 }
532
533 this.userData()['userDetails'] = someParameters['parameters']['user']['header'];
534 this.userData()['statistics'] = someParameters['parameters']['user']['statistics'];
535 this.userData()['userDetailsVersions']= someParameters['parameters']['user']['version'];
536
537 c = someParameters['parameters']['records'].length;
538 for (i=0; i<c; i++) {
539 var currentRecord;
540 var currentRecordData;
541
542 currentRecordData = someParameters['parameters']['records'][i];
543 currentRecord = this.userData()['records'][currentRecordData['record']['reference']];
544
545 if (currentRecord == null) {
546 }
547
548 currentRecord['data'] = currentRecordData['record']['data'];
549 currentRecord['version'] = currentRecordData['record']['version'];
550 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
551
552 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
553 'data': currentRecordData['currentRecordVersion']['data'],
554 'version': currentRecordData['currentRecordVersion']['version'],
555 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
556 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey']
557 }
558 }
559
560 this.userData()['lock'] = Clipperz.PM.Crypto.randomKey();
561 result['lock'] = this.userData()['lock'];
562 result['result'] = 'done';
563 } else {
564 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
565 }
566 */ //=====================================================================
567 } else if (someParameters.message == 'saveChanges') {
568 if (this.isReadOnly() == false) {
569 var i, c;
570
571 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) {
572 throw "the lock attribute is not processed correctly"
573 }
574
575 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
576 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
577 aConnection['userData']['userDetailsVersion']= someParameters['parameters']['user']['version'];
578
579 c = someParameters['parameters']['records']['updated'].length;
580 for (i=0; i<c; i++) {
581 var currentRecord;
582 var currentRecordData;
583
584 currentRecordData = someParameters['parameters']['records']['updated'][i];
585 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
586
587 if (
588 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
589 &&
590 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
591 ) {
592 throw "Record added without a recordVersion";
593 }
594
595 if (currentRecord == null) {
596 currentRecord = {};
597 currentRecord['versions'] = {};
598 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
599 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
600
601 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
602 }
603
604 currentRecord['data'] = currentRecordData['record']['data'];
605 currentRecord['version']= currentRecordData['record']['version'];
606 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
607
608 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
609 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
610 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
611 'data': currentRecordData['currentRecordVersion']['data'],
612 'version': currentRecordData['currentRecordVersion']['version'],
613 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
614 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
615 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
616 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
617 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
618 }
619 }
620 }
621
622 c = someParameters['parameters']['records']['deleted'].length;
623 for (i=0; i<c; i++) {
624 var currentRecordReference;
625
626 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
627 delete aConnection['userData']['records'][currentRecordReference];
628 }
629
630 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
631 result['lock'] = aConnection['userData']['lock'];
632 result['result'] = 'done';
633 } else {
634 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
635 }
636
637 //=====================================================================
638 //
639 // U N H A N D L E D M e t h o d
640 //
641 //=====================================================================
642 } else {
643 Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
644 }
645
646 result = {
647 result: result,
648 toll: this.getTollForRequestType('MESSAGE')
649 }
650
651 // return MochiKit.Async.succeed(result);
652 return result;
653 },
654
655 //-------------------------------------------------------------------------
656
657 '_logout': function(someParameters) {
658 // return MochiKit.Async.succeed({result: 'done'});
659 return {result: 'done'};
660 },
661
662 //=========================================================================
663 //#########################################################################
664
665 'isTestData': function(aConnection) {
666 return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined');
667 },
668
669 'userDetails': function(aConnection) {
670 var result;
671
672 if (this.isTestData(aConnection)) {
673 var serializedHeader;
674 var version;
675
676//Clipperz.logDebug("### test data");
677 version = aConnection['userData']['userDetailsVersion'];
678 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
679 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
680 } else {
681//Clipperz.logDebug("### NOT test data");
682 result = aConnection['userData']['userDetails'];
683 }
684
685 return result;
686 },
687
688 'statistics': function(aConnection) {
689 var result;
690
691 if (aConnection['userData']['statistics'] != null) {
692 if (this.isTestData(aConnection)) {
693 var serializedStatistics;
694 var version;
695
696 version = aConnection['userData']['userDetailsVersion'];
697 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
698 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
699 } else {
700 result = aConnection['userData']['statistics'];
701 }
702 } else {
703 result = null;
704 }
705
706 return result;
707 },
708
709/*
710 'userSerializedEncryptedData': function(someData) {
711 var deferredResult;
712 var deferredContext;
713
714 deferredContext = { 'data': someData };
715
716 deferredResult = new Clipperz.Async.Deferred('Proxy.Test.serializeUserEncryptedData', {trace:false});
717 deferredResult.addCallback(MochiKit.Base.bind(function(aDeferredContext) {
718 aDeferredContext['user'] = this.createUserUsingConfigurationData(aDeferredContext['data']);
719 return aDeferredContext;
720 }, this));
721 deferredResult.addCallback(function(aDeferredContext) {
722 // return aDeferredContext['user'].encryptedDataUsingVersion(aDeferredContext['data']['version']);
723 return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
724 });
725 deferredResult.addCallback(function(aUserEncryptedData) {
726 deferredContext['encryptedData'] = aUserEncryptedData;
727 return deferredContext;
728 });
729 deferredResult.addCallback(function(aDeferredContext) {
730 var connection;
731
732 connection = new Clipperz.PM.Connection.communicationProtocol.versions[aDeferredContext['data']['connectionVersion']]()
733 aDeferredContext['credentials'] = connection.serverSideUserCredentials(aDeferredContext['user'].username(),aDeferredContext['user'].passphrase());
734
735 return aDeferredContext;
736 });
737
738 // deferredResult.addCallback(function(aDeferredContext) {
739 // return aDeferredContext['user'].serializedDataUsingVersion(MochiKit.Base.values(aDeferredContext['user'].records()), aDeferredContext['data']['version']);
740 // }, deferredContext);
741 // deferredResult.addCallback(function(aUserSerializedData) {
742 // });
743//
744 // deferredResult.addCallback(MochiKit.Async.succeed, deferredContext);
745 deferredResult.callback(deferredContext);
746
747 return deferredResult;
748 },
749
750 'createUserUsingConfigurationData': function(someData) {
751 var result;
752 var user;
753 var recordLabel;
754
755 user = new Clipperz.PM.DataModel.User();
756 user.initForTests();
757 user.setUsername(someData['username']);
758 user.setPassphrase(someData['passphrase']);
759
760 for (recordLabel in someData['records']) {
761 var recordData;
762 var record;
763 var i, c;
764
765 recordData = someData['records'][recordLabel];
766 record = new Clipperz.PM.DataModel.Record({user:user, label:recordLabel});
767 record.setNotes(recordData['notes']);
768
769 c = recordData['fields'].length;
770 for (i=0; i<c; i++) {
771 var recordField;
772
773 recordField = new Clipperz.PM.DataModel.RecordField();
774 recordField.setLabel(recordData['fields'][i]['name']);
775 recordField.setValue(recordData['fields'][i]['value']);
776 recordField.setType(recordData['fields'][i]['type']);
777 record.addField(recordField);
778 }
779 user.addRecord(record, true);
780 }
781
782 result = user;
783
784 return result;
785 },
786*/
787 //=========================================================================
788 __syntaxFix__: "syntax fix"
789});
790
791Clipperz.PM.Proxy.Offline.DataStore['exception'] = {
792 'ReadOnly': new MochiKit.Base.NamedError("Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly")
793}; \ No newline at end of file
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js
new file mode 100644
index 0000000..a3c238c
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js
@@ -0,0 +1,420 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.Proxy.Offline.DataStore) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.Proxy.Offline.LocalStorageDataStore depends on Clipperz.PM.Proxy.Offline.DataStore!";
26}
27
28//=============================================================================
29
30Clipperz.PM.Proxy.Offline.LocalStorageDataStore = function(args) {
31 args = args || {};
32
33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
35 this._shouldPayTolls = args.shouldPayTolls || false;
36
37 this._tolls = {};
38 this._currentStaticConnection = null;
39
40 //Clipperz.PM.Proxy.Offline.LocalStorageDataStore.superclass.constructor.apply(this, arguments);
41
42 return this;
43}
44
45Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.LocalStorageDataStore, Clipperz.PM.Proxy.Offline.DataStore, {
46
47 //=========================================================================
48
49 '_knock': function(aConnection, someParameters) {
50 var result;
51
52 result = {
53 toll: this.getTollForRequestType(someParameters['requestType'])
54 }
55
56 return result;
57 },
58
59 //-------------------------------------------------------------------------
60
61 '_registration': function(aConnection, someParameters) {
62 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
63 },
64
65 //-------------------------------------------------------------------------
66
67 '_handshake': function(aConnection, someParameters) {
68 var result;
69 varnextTollRequestType;
70
71 result = {};
72 if (someParameters.message == "connect") {
73 var userData;
74 var randomBytes;
75 var v;
76
77 userData = this.data()['users'][someParameters.parameters.C];
78
79 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
80 aConnection['userData'] = userData;
81 aConnection['C'] = someParameters.parameters.C;
82 } else {
83 aConnection['userData'] = this.data()['users']['catchAllUser'];
84 }
85
86 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
87 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
88 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
89 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
90
91 aConnection['A'] = someParameters.parameters.A;
92
93 result['s'] = aConnection['userData']['s'];
94 result['B'] = aConnection['B'].asString(16);
95
96 nextTollRequestType = 'CONNECT';
97 } else if (someParameters.message == "credentialCheck") {
98 var v, u, S, A, K, M1;
99
100 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
101 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
102 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
103 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
104
105 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
106
107 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
108 if (someParameters.parameters.M1 == M1) {
109 var M2;
110
111 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
112 result['M2'] = M2;
113 } else {
114 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
115 }
116
117 nextTollRequestType = 'MESSAGE';
118 } else if (someParameters.message == "oneTimePassword") {
119 var otpData;
120
121 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
122
123 try {
124 if (typeof(otpData) != 'undefined') {
125 if (otpData['status'] == 'ACTIVE') {
126 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
127 result = {
128 'data': otpData['data'],
129 'version':otpData['version']
130 }
131
132 otpData['status'] = 'REQUESTED';
133 } else {
134 otpData['status'] = 'DISABLED';
135 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
136 }
137 } else {
138 throw "The requested One Time Password was not active";
139 }
140 } else {
141 throw "The requested One Time Password has not been found"
142 }
143 } catch (exception) {
144 result = {
145 'data': Clipperz.PM.Crypto.randomKey(),
146 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
147 }
148 }
149 nextTollRequestType = 'CONNECT';
150 } else {
151 Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
152 }
153
154 result = {
155 result: result,
156 toll: this.getTollForRequestType(nextTollRequestType)
157 }
158
159 return result;
160 },
161
162 //-------------------------------------------------------------------------
163
164 '_message': function(aConnection, someParameters) {
165 var result;
166
167 result = {};
168
169 //=====================================================================
170 //
171 // R E A D - O N L Y M e t h o d s
172 //
173 //=====================================================================
174 if (someParameters.message == 'getUserDetails') {
175 var recordsStats;
176 var recordReference;
177
178 recordsStats = {};
179 for (recordReference in aConnection['userData']['records']) {
180 recordsStats[recordReference] = {
181 'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
182 }
183 }
184
185 result['header'] = this.userDetails(aConnection);
186 result['statistics'] = this.statistics(aConnection);
187 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
188 result['version'] = aConnection['userData']['userDetailsVersion'];
189 result['recordsStats'] = recordsStats;
190
191 if (this.isReadOnly() == false) {
192 varlock;
193
194 if (typeof(aConnection['userData']['lock']) == 'undefined') {
195 aConnection['userData']['lock'] = "<<LOCK>>";
196 }
197
198 result['lock'] = aConnection['userData']['lock'];
199 }
200
201 //=====================================================================
202 } else if (someParameters.message == 'getRecordDetail') {
203/*
204 varrecordData;
205 var currentVersionData;
206
207 recordData = this.userData()['records'][someParameters['parameters']['reference']];
208 result['reference'] = someParameters['parameters']['reference'];
209 result['data'] = recordData['data'];
210 result['version'] = recordData['version'];
211 result['creationData'] = recordData['creationDate'];
212 result['updateDate'] = recordData['updateDate'];
213 result['accessDate'] = recordData['accessDate'];
214
215 currentVersionData = recordData['versions'][recordData['currentVersion']];
216
217 result['currentVersion'] = {};
218 result['currentVersion']['reference'] = recordData['currentVersion'];
219 result['currentVersion']['version'] = currentVersionData['version'];
220 result['currentVersion']['header'] = currentVersionData['header'];
221 result['currentVersion']['data'] = currentVersionData['data'];
222 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
223 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
224 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
225 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
226 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
227 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
228 }
229*/
230 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
231 result['reference'] = someParameters['parameters']['reference'];
232
233 //=====================================================================
234 //
235 // R E A D - W R I T E M e t h o d s
236 //
237 //=====================================================================
238 } else if (someParameters.message == 'upgradeUserCredentials') {
239 if (this.isReadOnly() == false) {
240 var parameters;
241 var credentials;
242
243 parameters = someParameters['parameters'];
244 credentials = parameters['credentials'];
245
246 if ((credentials['C'] == null)
247 ||(credentials['s'] == null)
248 ||(credentials['v'] == null)
249 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
250 ) {
251 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
252 } else {
253 varoldCValue;
254 oldCValue = aConnection['C'];
255
256 this.data()['users'][credentials['C']] = aConnection['userData'];
257 aConnection['C'] = credentials['C'];
258
259 aConnection['userData']['s'] = credentials['s'];
260 aConnection['userData']['v'] = credentials['v'];
261 aConnection['userData']['version'] = credentials['version'];
262
263 aConnection['userData']['userDetails'] = parameters['user']['header'];
264 aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
265 aConnection['userData']['statistics'] = parameters['user']['statistics'];
266
267 aConnection['userData']['lock'] = parameters['user']['lock'];
268
269 delete this.data()['users'][oldCValue];
270
271 result = {result:"done", parameters:parameters};
272 }
273 } else {
274 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
275 }
276
277 //=====================================================================
278
279 } else if (someParameters.message == 'saveChanges') {
280 if (this.isReadOnly() == false) {
281 var i, c;
282
283 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) {
284 throw "the lock attribute is not processed correctly"
285 }
286
287 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
288 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
289 aConnection['userData']['userDetailsVersion']= someParameters['parameters']['user']['version'];
290
291 c = someParameters['parameters']['records']['updated'].length;
292 for (i=0; i<c; i++) {
293 var currentRecord;
294 var currentRecordData;
295
296 currentRecordData = someParameters['parameters']['records']['updated'][i];
297 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
298
299 if (
300 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
301 &&
302 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
303 ) {
304 throw "Record added without a recordVersion";
305 }
306
307 if (currentRecord == null) {
308 currentRecord = {};
309 currentRecord['versions'] = {};
310 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
311 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
312
313 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
314 }
315
316 currentRecord['data'] = currentRecordData['record']['data'];
317 currentRecord['version']= currentRecordData['record']['version'];
318 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
319
320 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
321 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
322 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
323 'data': currentRecordData['currentRecordVersion']['data'],
324 'version': currentRecordData['currentRecordVersion']['version'],
325 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
326 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
327 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
328 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
329 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
330 }
331 }
332 }
333
334 c = someParameters['parameters']['records']['deleted'].length;
335 for (i=0; i<c; i++) {
336 var currentRecordReference;
337
338 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
339 delete aConnection['userData']['records'][currentRecordReference];
340 }
341
342 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
343 result['lock'] = aConnection['userData']['lock'];
344 result['result'] = 'done';
345 } else {
346 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
347 }
348
349 //=====================================================================
350 //
351 // U N H A N D L E D M e t h o d
352 //
353 //=====================================================================
354 } else {
355 Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
356 }
357
358 result = {
359 result: result,
360 toll: this.getTollForRequestType('MESSAGE')
361 }
362
363 // return MochiKit.Async.succeed(result);
364 return result;
365 },
366
367 //-------------------------------------------------------------------------
368
369 '_logout': function(someParameters) {
370 // return MochiKit.Async.succeed({result: 'done'});
371 return {result: 'done'};
372 },
373
374 //=========================================================================
375 //#########################################################################
376/*
377 'userDetails': function(aConnection) {
378 var result;
379
380 if (this.isTestData(aConnection)) {
381 var serializedHeader;
382 var version;
383
384//Clipperz.logDebug("### test data");
385 version = aConnection['userData']['userDetailsVersion'];
386 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
387 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
388 } else {
389//Clipperz.logDebug("### NOT test data");
390 result = aConnection['userData']['userDetails'];
391 }
392
393 return result;
394 },
395
396 'statistics': function(aConnection) {
397 var result;
398
399 if (aConnection['userData']['statistics'] != null) {
400 if (this.isTestData(aConnection)) {
401 var serializedStatistics;
402 var version;
403
404 version = aConnection['userData']['userDetailsVersion'];
405 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
406 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
407 } else {
408 result = aConnection['userData']['statistics'];
409 }
410 } else {
411 result = null;
412 }
413
414 return result;
415 },
416*/
417 //=========================================================================
418 __syntaxFix__: "syntax fix"
419});
420
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js
new file mode 100644
index 0000000..ecc4408
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js
@@ -0,0 +1,643 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24try { if (typeof(Clipperz.PM.Proxy.Offline.DataStore) == 'undefined') { throw ""; }} catch (e) {
25 throw "Clipperz.PM.Proxy.Offline.MemoryDataStore depends on Clipperz.PM.Proxy.Offline.DataStore!";
26}
27
28//=============================================================================
29
30Clipperz.PM.Proxy.Offline.MemoryDataStore = function(args) {
31 args = args || {};
32
33 this._data = args.data || (typeof(_clipperz_dump_data_) != 'undefined' ? _clipperz_dump_data_ : null);
34 this._isReadOnly = (typeof(args.readOnly) == 'undefined' ? true : args.readOnly);
35 this._shouldPayTolls = args.shouldPayTolls || false;
36
37 this._tolls = {};
38 this._currentStaticConnection = null;
39
40 return this;
41}
42
43Clipperz.Base.extend(Clipperz.PM.Proxy.Offline.MemoryDataStore, Clipperz.PM.Proxy.Offline.DataStore, {
44
45 //=========================================================================
46
47 'resetData': function() {
48 this._data = {
49 'users': {
50 'catchAllUser': {
51 __masterkey_test_value__: 'masterkey',
52 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
53 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
54 }
55 }
56 };
57 },
58
59 //-------------------------------------------------------------------------
60
61 'setupWithEncryptedData': function(someData) {
62 this._data = Clipperz.Base.deepClone(someData);
63 },
64
65 //-------------------------------------------------------------------------
66
67 'setupWithData': function(someData) {
68 var deferredResult;
69 var resultData;
70 var i, c;
71
72//Clipperz.log(">>> Proxy.Test.setupWithData");
73 resultData = this._data;
74
75 deferredResult = new Clipperz.Async.Deferred("Proxy.Test.seupWithData", {trace:false});
76 c = someData['users'].length;
77
78 for (i=0; i<c; i++) {
79 varnewConnection;
80 varrecordConfiguration;
81
82 deferredResult.addMethod(this, 'userSerializedEncryptedData', someData['users'][i]);
83 deferredResult.addCallback(MochiKit.Base.bind(function(aUserSerializationContext) {
84 resultData['users'][aUserSerializationContext['credentials']['C']] = {
85 's': aUserSerializationContext['credentials']['s'],
86 'v': aUserSerializationContext['credentials']['v'],
87 'version': aUserSerializationContext['data']['connectionVersion'],
88 'userDetails': aUserSerializationContext['encryptedData']['user']['header'],
89 'userDetailsVersion':aUserSerializationContext['encryptedData']['user']['version'],
90 'statistics': aUserSerializationContext['encryptedData']['user']['statistics'],
91 'lock': aUserSerializationContext['encryptedData']['user']['lock'],
92 'records': this.rearrangeRecordsData(aUserSerializationContext['encryptedData']['records'])
93 }
94 }, this));
95 }
96
97 deferredResult.addCallback(MochiKit.Base.bind(function() {
98 this._data = resultData;
99 }, this));
100
101 deferredResult.callback();
102//Clipperz.log("<<< Proxy.Test.setupWithData");
103
104 return deferredResult;
105 },
106
107 //=========================================================================
108
109 'getTollForRequestType': function (aRequestType) {
110 varresult;
111 vartargetValue;
112 var cost;
113
114 targetValue = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
115 switch (aRequestType) {
116 case 'REGISTER':
117 cost = 5;
118 break;
119 case 'CONNECT':
120 cost = 5;
121 break;
122 case 'MESSAGE':
123 cost = 2;
124 break;
125 }
126
127 result = {
128 requestType: aRequestType,
129 targetValue: targetValue,
130 cost: cost
131 }
132
133 if (this.shouldPayTolls()) {
134 this.tolls()[targetValue] = result;
135 }
136
137 return result;
138 },
139
140 //-------------------------------------------------------------------------
141
142 'checkToll': function (aFunctionName, someParameters) {
143 if (this.shouldPayTolls()) {
144 var localToll;
145 vartollParameters;
146
147 tollParameters = someParameters['toll'];
148 localToll = this.tolls()[tollParameters['targetValue']];
149
150 if (localToll != null) {
151 if (! Clipperz.PM.Toll.validate(tollParameters['targetValue'], tollParameters['toll'], localToll['cost'])) {
152 throw "Toll value too low.";
153 };
154 } else {
155 throw "Missing toll";
156 }
157 }
158 },
159
160 //=========================================================================
161
162 'currentStaticConnection': function () {
163 if (this._currentStaticConnection == null) {
164 this._currentStaticConnection = {};
165 }
166
167 return this._currentStaticConnection;
168 },
169
170 //-------------------------------------------------------------------------
171
172 'getConnectionForRequest': function (aFunctionName, someParameters) {
173 varresult;
174
175 if (this.shouldPayTolls()) {
176 if ((typeof(someParameters['toll']) != 'undefined') && (typeof(someParameters['toll']['targetValue']) != 'undefined')) {
177 result = this.tolls()[someParameters['toll']['targetValue']]['connection'];
178 if (typeof(result) == 'undefined') {
179 result = {};
180 }
181 } else {
182 result = {};
183 }
184 } else {
185 result = this.currentStaticConnection();
186 }
187
188 return result;
189 },
190
191 //-------------------------------------------------------------------------
192
193 'storeConnectionForRequestWithConnectionAndResponse': function (aFunctionName, someParameters, aConnection, aResponse) {
194 if (this.shouldPayTolls()) {
195 if ((typeof(aResponse['toll']) != 'undefined')
196 &&(typeof(aResponse['toll']['targetValue']) != 'undefined')
197 &&(typeof(this.tolls()[aResponse['toll']['targetValue']]) != 'undefined')
198 ) {
199 this.tolls()[aResponse['toll']['targetValue']]['connection'] = aConnection;
200 }
201 }
202 },
203
204 //=========================================================================
205
206 'processMessage': function (aFunctionName, someParameters) {
207 var result;
208 varconnection;
209
210 connection = this.getConnectionForRequest(aFunctionName, someParameters);
211
212 switch(aFunctionName) {
213 case 'knock':
214 result = this._knock(connection, someParameters);
215 break;
216 case 'registration':
217 this.checkToll(aFunctionName, someParameters);
218 result = this._registration(connection, someParameters.parameters);
219 break;
220 case 'handshake':
221 this.checkToll(aFunctionName, someParameters);
222 result = this._handshake(connection, someParameters.parameters);
223 break;
224 case 'message':
225 this.checkToll(aFunctionName, someParameters);
226 result = this._message(connection, someParameters.parameters);
227 break;
228 case 'logout':
229 this._currentStaticConnection = null;
230 result = this._logout(connection, someParameters.parameters);
231 break;
232 }
233
234 this.storeConnectionForRequestWithConnectionAndResponse(aFunctionName, someParameters, connection, result);
235
236 return MochiKit.Async.succeed(result);
237 },
238
239 //=========================================================================
240
241 '_knock': function(aConnection, someParameters) {
242 var result;
243
244 result = {
245 toll: this.getTollForRequestType(someParameters['requestType'])
246 }
247
248 return result;
249 },
250
251 //-------------------------------------------------------------------------
252
253 '_registration': function(aConnection, someParameters) {
254 if (this.isReadOnly() == false) {
255 if (typeof(this.data()['users'][someParameters['credentials']['C']]) == 'undefined') {
256 this.data()['users'][someParameters['credentials']['C']] = {
257 's': someParameters['credentials']['s'],
258 'v': someParameters['credentials']['v'],
259 'version':someParameters['credentials']['version'],
260 // 'lock': Clipperz.Crypto.Base.generateRandomSeed(),
261 'userDetails': someParameters['user']['header'],
262 'statistics': someParameters['user']['statistics'],
263 'userDetailsVersion':someParameters['user']['version'],
264 'records':{}
265 }
266 } else {
267 throw "user already exists";
268 }
269 } else {
270 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
271 }
272
273 result = {
274 result: {
275 'lock': this.data()['users'][someParameters['credentials']['C']]['lock'],
276 'result':'done'
277 },
278 toll: this.getTollForRequestType('CONNECT')
279 }
280
281 return result;
282 },
283
284 //-------------------------------------------------------------------------
285
286 '_handshake': function(aConnection, someParameters) {
287 var result;
288 varnextTollRequestType;
289
290 result = {};
291 if (someParameters.message == "connect") {
292 var userData;
293 var randomBytes;
294 var v;
295
296 userData = this.data()['users'][someParameters.parameters.C];
297
298 if ((typeof(userData) != 'undefined') && (userData['version'] == someParameters.version)) {
299 aConnection['userData'] = userData;
300 aConnection['C'] = someParameters.parameters.C;
301 } else {
302 aConnection['userData'] = this.data()['users']['catchAllUser'];
303 }
304
305 randomBytes = Clipperz.Crypto.Base.generateRandomSeed();
306 aConnection['b'] = new Clipperz.Crypto.BigInt(randomBytes, 16);
307 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
308 aConnection['B'] = v.add(Clipperz.Crypto.SRP.g().powerModule(aConnection['b'], Clipperz.Crypto.SRP.n()));
309
310 aConnection['A'] = someParameters.parameters.A;
311
312 result['s'] = aConnection['userData']['s'];
313 result['B'] = aConnection['B'].asString(16);
314
315 nextTollRequestType = 'CONNECT';
316 } else if (someParameters.message == "credentialCheck") {
317 var v, u, S, A, K, M1;
318
319 v = new Clipperz.Crypto.BigInt(aConnection['userData']['v'], 16);
320 u = new Clipperz.Crypto.BigInt(Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(aConnection['B'].asString(10))).toHexString(), 16);
321 A = new Clipperz.Crypto.BigInt(aConnection['A'], 16);
322 S = (A.multiply(v.powerModule(u, Clipperz.Crypto.SRP.n()))).powerModule(aConnection['b'], Clipperz.Crypto.SRP.n());
323
324 K = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(S.asString(10))).toHexString().slice(2);
325
326 M1 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + aConnection['B'].asString(10) + K)).toHexString().slice(2);
327 if (someParameters.parameters.M1 == M1) {
328 var M2;
329
330 M2 = Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters.version].hash(new Clipperz.ByteArray(A.asString(10) + someParameters.parameters.M1 + K)).toHexString().slice(2);
331 result['M2'] = M2;
332 } else {
333 throw new Error("Client checksum verification failed! Expected <" + M1 + ">, received <" + someParameters.parameters.M1 + ">.", "Error");
334 }
335
336 nextTollRequestType = 'MESSAGE';
337 } else if (someParameters.message == "oneTimePassword") {
338 var otpData;
339
340 otpData = this.data()['onetimePasswords'][someParameters.parameters.oneTimePasswordKey];
341
342 try {
343 if (typeof(otpData) != 'undefined') {
344 if (otpData['status'] == 'ACTIVE') {
345 if (otpData['key_checksum'] == someParameters.parameters.oneTimePasswordKeyChecksum) {
346 result = {
347 'data': otpData['data'],
348 'version':otpData['version']
349 }
350
351 otpData['status'] = 'REQUESTED';
352 } else {
353 otpData['status'] = 'DISABLED';
354 throw "The requested One Time Password has been disabled, due to a wrong keyChecksum";
355 }
356 } else {
357 throw "The requested One Time Password was not active";
358 }
359 } else {
360 throw "The requested One Time Password has not been found"
361 }
362 } catch (exception) {
363 result = {
364 'data': Clipperz.PM.Crypto.randomKey(),
365 'version':Clipperz.PM.Connection.communicationProtocol.currentVersion
366 }
367 }
368 nextTollRequestType = 'CONNECT';
369 } else {
370 Clipperz.logError("Clipperz.PM.Proxy.Test.handshake - unhandled message: " + someParameters.message);
371 }
372
373 result = {
374 result: result,
375 toll: this.getTollForRequestType(nextTollRequestType)
376 }
377
378 return result;
379 },
380
381 //-------------------------------------------------------------------------
382
383 '_message': function(aConnection, someParameters) {
384 var result;
385
386 result = {};
387
388 //=====================================================================
389 //
390 // R E A D - O N L Y M e t h o d s
391 //
392 //=====================================================================
393 if (someParameters.message == 'getUserDetails') {
394 var recordsStats;
395 var recordReference;
396
397 recordsStats = {};
398 for (recordReference in aConnection['userData']['records']) {
399 recordsStats[recordReference] = {
400 'updateDate': aConnection['userData']['records'][recordReference]['updateDate']
401 }
402 }
403
404 result['header'] = this.userDetails(aConnection);
405 result['statistics'] = this.statistics(aConnection);
406 result['maxNumberOfRecords'] = aConnection['userData']['maxNumberOfRecords'];
407 result['version'] = aConnection['userData']['userDetailsVersion'];
408 result['recordsStats'] = recordsStats;
409
410 if (this.isReadOnly() == false) {
411 varlock;
412
413 if (typeof(aConnection['userData']['lock']) == 'undefined') {
414 aConnection['userData']['lock'] = "<<LOCK>>";
415 }
416
417 result['lock'] = aConnection['userData']['lock'];
418 }
419
420 //=====================================================================
421 } else if (someParameters.message == 'getRecordDetail') {
422/*
423 varrecordData;
424 var currentVersionData;
425
426 recordData = this.userData()['records'][someParameters['parameters']['reference']];
427 result['reference'] = someParameters['parameters']['reference'];
428 result['data'] = recordData['data'];
429 result['version'] = recordData['version'];
430 result['creationData'] = recordData['creationDate'];
431 result['updateDate'] = recordData['updateDate'];
432 result['accessDate'] = recordData['accessDate'];
433
434 currentVersionData = recordData['versions'][recordData['currentVersion']];
435
436 result['currentVersion'] = {};
437 result['currentVersion']['reference'] = recordData['currentVersion'];
438 result['currentVersion']['version'] = currentVersionData['version'];
439 result['currentVersion']['header'] = currentVersionData['header'];
440 result['currentVersion']['data'] = currentVersionData['data'];
441 result['currentVersion']['creationData'] = currentVersionData['creationDate'];
442 result['currentVersion']['updateDate'] = currentVersionData['updateDate'];
443 result['currentVersion']['accessDate'] = currentVersionData['accessDate'];
444 if (typeof(currentVersionData['previousVersion']) != 'undefined') {
445 result['currentVersion']['previousVersionKey'] = currentVersionData['previousVersionKey'];
446 result['currentVersion']['previousVersion'] = currentVersionData['previousVersion'];
447 }
448*/
449 MochiKit.Base.update(result, aConnection['userData']['records'][someParameters['parameters']['reference']]);
450 result['reference'] = someParameters['parameters']['reference'];
451
452 //=====================================================================
453 //
454 // R E A D - W R I T E M e t h o d s
455 //
456 //=====================================================================
457 } else if (someParameters.message == 'upgradeUserCredentials') {
458 if (this.isReadOnly() == false) {
459 var parameters;
460 var credentials;
461
462 parameters = someParameters['parameters'];
463 credentials = parameters['credentials'];
464
465 if ((credentials['C'] == null)
466 ||(credentials['s'] == null)
467 ||(credentials['v'] == null)
468 ||(credentials['version'] != Clipperz.PM.Connection.communicationProtocol.currentVersion)
469 ) {
470 result = Clipperz.PM.DataModel.User.exception.CredentialUpgradeFailed;
471 } else {
472 varoldCValue;
473 oldCValue = aConnection['C'];
474
475 this.data()['users'][credentials['C']] = aConnection['userData'];
476 aConnection['C'] = credentials['C'];
477
478 aConnection['userData']['s'] = credentials['s'];
479 aConnection['userData']['v'] = credentials['v'];
480 aConnection['userData']['version'] = credentials['version'];
481
482 aConnection['userData']['userDetails'] = parameters['user']['header'];
483 aConnection['userData']['userDetailsVersion'] = parameters['user']['version'];
484 aConnection['userData']['statistics'] = parameters['user']['statistics'];
485
486 aConnection['userData']['lock'] = parameters['user']['lock'];
487
488 delete this.data()['users'][oldCValue];
489
490 result = {result:"done", parameters:parameters};
491 }
492 } else {
493 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
494 }
495
496 //=====================================================================
497
498 } else if (someParameters.message == 'saveChanges') {
499 if (this.isReadOnly() == false) {
500 var i, c;
501
502 if (aConnection['userData']['lock']!= someParameters['parameters']['user']['lock']) {
503 throw "the lock attribute is not processed correctly"
504 }
505
506 aConnection['userData']['userDetails'] = someParameters['parameters']['user']['header'];
507 aConnection['userData']['statistics'] = someParameters['parameters']['user']['statistics'];
508 aConnection['userData']['userDetailsVersion']= someParameters['parameters']['user']['version'];
509
510 c = someParameters['parameters']['records']['updated'].length;
511 for (i=0; i<c; i++) {
512 var currentRecord;
513 var currentRecordData;
514
515 currentRecordData = someParameters['parameters']['records']['updated'][i];
516 currentRecord = aConnection['userData']['records'][currentRecordData['record']['reference']];
517
518 if (
519 (typeof(aConnection['userData']['records'][currentRecordData['record']['reference']]) == 'undefined')
520 &&
521 (typeof(currentRecordData['currentRecordVersion']) == 'undefined')
522 ) {
523 throw "Record added without a recordVersion";
524 }
525
526 if (currentRecord == null) {
527 currentRecord = {};
528 currentRecord['versions'] = {};
529 currentRecord['creationDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
530 currentRecord['accessDate'] = Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
531
532 aConnection['userData']['records'][currentRecordData['record']['reference']] = currentRecord;
533 }
534
535 currentRecord['data'] = currentRecordData['record']['data'];
536 currentRecord['version']= currentRecordData['record']['version'];
537 currentRecord['updateDate']= Clipperz.PM.Date.formatDateWithUTCFormat(new Date());
538
539 if (typeof(currentRecordData['currentRecordVersion']) != 'undefined') {
540 currentRecord['currentVersion'] = currentRecordData['currentRecordVersion']['reference'];
541 currentRecord['versions'][currentRecordData['currentRecordVersion']['reference']] = {
542 'data': currentRecordData['currentRecordVersion']['data'],
543 'version': currentRecordData['currentRecordVersion']['version'],
544 'previousVersion': currentRecordData['currentRecordVersion']['previousVersion'],
545 'previousVersionKey':currentRecordData['currentRecordVersion']['previousVersionKey'],
546 'creationDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
547 'updateDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date()),
548 'accessDate':Clipperz.PM.Date.formatDateWithUTCFormat(new Date())
549 }
550 }
551 }
552
553 c = someParameters['parameters']['records']['deleted'].length;
554 for (i=0; i<c; i++) {
555 var currentRecordReference;
556
557 currentRecordReference = someParameters['parameters']['records']['deleted'][i];
558 delete aConnection['userData']['records'][currentRecordReference];
559 }
560
561 aConnection['userData']['lock'] = Clipperz.PM.Crypto.randomKey();
562 result['lock'] = aConnection['userData']['lock'];
563 result['result'] = 'done';
564 } else {
565 throw Clipperz.PM.Proxy.Offline.DataStore.exception.ReadOnly;
566 }
567
568 //=====================================================================
569 //
570 // U N H A N D L E D M e t h o d
571 //
572 //=====================================================================
573 } else {
574 Clipperz.logError("Clipperz.PM.Proxy.Test.message - unhandled message: " + someParameters.message);
575 }
576
577 result = {
578 result: result,
579 toll: this.getTollForRequestType('MESSAGE')
580 }
581
582 // return MochiKit.Async.succeed(result);
583 return result;
584 },
585
586 //-------------------------------------------------------------------------
587
588 '_logout': function(someParameters) {
589 // return MochiKit.Async.succeed({result: 'done'});
590 return {result: 'done'};
591 },
592
593 //=========================================================================
594 //#########################################################################
595
596 'isTestData': function(aConnection) {
597 return (typeof(aConnection['userData']['__masterkey_test_value__']) != 'undefined');
598 },
599
600 'userDetails': function(aConnection) {
601 var result;
602
603 if (this.isTestData(aConnection)) {
604 var serializedHeader;
605 var version;
606
607//Clipperz.logDebug("### test data");
608 version = aConnection['userData']['userDetailsVersion'];
609 serializedHeader = Clipperz.Base.serializeJSON(aConnection['userData']['userDetails']);
610 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedHeader);
611 } else {
612//Clipperz.logDebug("### NOT test data");
613 result = aConnection['userData']['userDetails'];
614 }
615
616 return result;
617 },
618
619 'statistics': function(aConnection) {
620 var result;
621
622 if (aConnection['userData']['statistics'] != null) {
623 if (this.isTestData(aConnection)) {
624 var serializedStatistics;
625 var version;
626
627 version = aConnection['userData']['userDetailsVersion'];
628 serializedStatistics = Clipperz.Base.serializeJSON(aConnection['userData']['statistics']);
629 result = Clipperz.PM.Crypto.encryptingFunctions.versions[version].encrypt(aConnection['userData']['__masterkey_test_value__'], serializedStatistics);
630 } else {
631 result = aConnection['userData']['statistics'];
632 }
633 } else {
634 result = null;
635 }
636
637 return result;
638 },
639
640 //=========================================================================
641 __syntaxFix__: "syntax fix"
642});
643
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js
new file mode 100644
index 0000000..6d6ee1e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Offline.js
@@ -0,0 +1,72 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26
27//=============================================================================
28
29Clipperz.PM.Proxy.Offline = function(args) {
30 args = args || {};
31
32 Clipperz.PM.Proxy.Offline.superclass.constructor.call(this, args);
33
34 this._dataStore = args.dataStore || new Clipperz.PM.Proxy.Offline.DataStore(args);
35
36 return this;
37}
38
39Clipperz.Base.extend(Clipperz.PM.Proxy.Offline, Clipperz.PM.Proxy, {
40
41 'toString': function () {
42 return "Clipperz.PM.Proxy.Offline";
43 },
44
45 //-------------------------------------------------------------------------
46
47 'dataStore': function () {
48 return this._dataStore;
49 },
50
51 //-------------------------------------------------------------------------
52
53 '_sendMessage': function(aFunctionName, aVersion, someParameters) {
54 return this.dataStore().processMessage(aFunctionName, someParameters);
55 },
56
57 //-------------------------------------------------------------------------
58
59 'isReadOnly': function () {
60 return this.dataStore().isReadOnly();
61 },
62
63 'canRegisterNewUsers': function () {
64 return this.dataStore().canRegisterNewUsers();
65 },
66
67 //-------------------------------------------------------------------------
68
69 __syntaxFix__: "syntax fix"
70
71});
72
diff --git a/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js
new file mode 100644
index 0000000..83d9244
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Proxy/Proxy.Test.js
@@ -0,0 +1,161 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; }
27
28//=============================================================================
29
30Clipperz.PM.Proxy.Test = function(args) {
31 Clipperz.PM.Proxy.Test.superclass.constructor.call(this, args);
32
33 args = args || {};
34
35 this._expectedRequests = (args.shouldCheckExpectedRequests === true) ? [] : null;
36 this._isExpectingRequests = true;
37 this._unexpectedRequests = [];
38
39 this.dataStore().resetData();
40
41 return this;
42}
43
44Clipperz.Base.extend(Clipperz.PM.Proxy.Test, Clipperz.PM.Proxy.Offline, {
45
46 'toString': function() {
47 return "Clipperz.PM.Proxy.Test";
48 },
49
50 //=========================================================================
51
52 'expectedRequests': function () {
53 return this._expectedRequests;
54 },
55
56 //-------------------------------------------------------------------------
57
58 'shouldCheckExpectedRequests': function () {
59 return (this._expectedRequests != null);
60 },
61
62 'setShouldCheckExpectedRequests': function(aValue) {
63 if (aValue) {
64 this._expectedRequests = aValue;
65 } else {
66 this._expectedRequests = null;
67 }
68 },
69
70 //-------------------------------------------------------------------------
71
72 'shouldNotReceiveAnyFurtherRequest': function () {
73 this._isExpectingRequests = false;
74 },
75
76 'mayReceiveMoreRequests': function () {
77 this._isExpectingRequests = true;
78 this.resetUnexpectedRequests();
79 },
80
81 'isExpectingRequests': function () {
82 return this._isExpectingRequests;
83 },
84
85 //-------------------------------------------------------------------------
86
87 'unexpectedRequests': function () {
88 return this._unexpectedRequests;
89 },
90
91 'resetUnexpectedRequests': function () {
92 this._unexpectedRequests = [];
93 },
94
95 //-------------------------------------------------------------------------
96
97 'testExpectedRequestParameters': function (aPath, anActualRequest, anExpectedRequest) {
98 var aKey;
99 for (aKey in anExpectedRequest) {
100 if (typeof(anActualRequest[aKey]) == 'undefined') {
101 throw "the expected paramter [" + aKey + "] is missing from the actual request";
102 }
103 if (typeof(anExpectedRequest[aKey]) == 'object') {
104 this.testExpectedRequestParameters(aPath + "." + aKey, anActualRequest[aKey], anExpectedRequest[aKey])
105 } else {
106 if (! anExpectedRequest[aKey](anActualRequest[aKey])) {
107 throw "wrong value for paramter [" + aKey + "]; got '" + anActualRequest[aKey] + "'";
108 }
109 }
110 }
111 },
112
113 //-------------------------------------------------------------------------
114
115 'checkRequest': function(aFunctionName, someParameters) {
116 if (this.shouldCheckExpectedRequests()) {
117 var expectedRequest;
118
119 expectedRequest = this.expectedRequests().pop();
120 if (expectedRequest == null) {
121 throw "Proxy.Test.sentMessage: no expected result specified. Got request '" + aFunctionName + "': " + someParameters;
122 }
123
124 try {
125 if (aFunctionName != expectedRequest.functionName) {
126 throw "wrong function name. Got '" + aFunctionName + "', expected '" + expectedRequest.request.functionName + "'";
127 }
128
129 this.testExpectedRequestParameters("parameters", someParameters, expectedRequest.parameters);
130 } catch(exception) {
131 throw "Proxy.Test.sentMessage[" + expectedRequest.name + "]: " + exception;
132 }
133 }
134 },
135
136 //=========================================================================
137
138 '_sendMessage': function(aFunctionName, aVersion, someParameters) {
139 var result;
140
141 if (this.isExpectingRequests() == false) {
142 // throw Clipperz.PM.Connection.exception.UnexpectedRequest;
143Clipperz.log("UNEXPECTED REQUEST " + aFunctionName /* + ": " + Clipperz.Base.serializeJSON(someParameters) */);
144 this.unexpectedRequests().push({'functionName':aFunctionName, 'someParameters': someParameters});
145 };
146//if (aFunctionName == 'knock') {
147 //console.log(">>> send message - " + aFunctionName, someParameters);
148//} else {
149 //console.log(">>> SEND MESSAGE - " + aFunctionName + " [" + someParameters['parameters']['message'] + "]", someParameters['parameters']['parameters']);
150//}
151 this.checkRequest(aFunctionName, someParameters);
152 result = Clipperz.PM.Proxy.Test.superclass._sendMessage.call(this, aFunctionName, aVersion, someParameters);
153
154 return result;
155 },
156
157 //=========================================================================
158 __syntaxFix__: "syntax fix"
159
160});
161
diff --git a/frontend/delta/js/Clipperz/PM/Strings.js b/frontend/delta/js/Clipperz/PM/Strings.js
new file mode 100644
index 0000000..7e855ff
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Strings.js
@@ -0,0 +1,285 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
27if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
28
29//-----------------------------------------------------------------------------
30/*
31Clipperz.PM.Strings.standardStrings = {
32 'loginPanelSwitchLanguageSelectOptions':[
33/ *
34 {tag:'option', html:"Arabic (Oman) (العربية)", value:'ar-OM', disabled:true},
35 {tag:'option', html:"Arabic (Syria) (العربية)", value:'ar-SY', disabled:true},
36 {tag:'option', html:"Bahasa Indonesia", value:'id-ID', disabled:true},
37 {tag:'option', html:"Bulgarian (Български)", value:'bg-BG', disabled:true},
38 {tag:'option', html:"Català", value:'ca-ES', disabled:true},
39 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN', disabled:true},
40 {tag:'option', html:"Chinese (Traditional) (正體中文)", value:'zh-TW', disabled:true},
41 {tag:'option', html:"Czech (Česky)", value:'cs-CZ', disabled:true},
42 {tag:'option', html:"Dansk", value:'da-DK', disabled:true},
43 {tag:'option', html:"Deutsch", value:'de-DE'/ *, disabled:true* /},
44 {tag:'option', html:"English (American)", value:'en-US'/ *, disabled:true* /},
45 {tag:'option', html:"English (British)", value:'en-GB'/ *, disabled:true* /},
46 {tag:'option', html:"English (Canadian)", value:'en-CA'/ *, disabled:true* /},
47 {tag:'option', html:"Español", value:'es-ES', disabled:true},
48 {tag:'option', html:"Eesti", value:'et-EE', disabled:true},
49 {tag:'option', html:"Français", value:'fr-FR', disabled:true},
50 {tag:'option', html:"Galego", value:'gl-ES', disabled:true},
51 {tag:'option', html:"Greek (Ελληνικά)", value:'el-GR', disabled:true},
52 {tag:'option', html:"Íslenska", value:'is-IS', disabled:true},
53 {tag:'option', html:"Italiano", value:'it-IT'/ *, disabled:true* /},
54 {tag:'option', html:"Japanese (日本語)", value:'ja-JP', disabled:true},
55 {tag:'option', html:"Korean (한국어)", value:'ko-KR', disabled:true},
56 {tag:'option', html:"Latviešu", value:'lv-LV', disabled:true},
57 {tag:'option', html:"Lietuvių", value:'lt-LT', disabled:true},
58 {tag:'option', html:"Macedonian (Македонски)", value:'mk-MK', disabled:true},
59 {tag:'option', html:"Magyar", value:'hu-HU', disabled:true},
60 {tag:'option', html:"Nederlands", value:'nl-NL', disabled:true},
61 {tag:'option', html:"Norsk bokmål", value:'nb-NO', disabled:true},
62 {tag:'option', html:"Norsk nynorsk", value:'nn-NO', disabled:true},
63 {tag:'option', html:"Persian (Western) (فارسى)", value:'fa-IR', disabled:true},
64 {tag:'option', html:"Polski", value:'pl-PL', disabled:true},
65 {tag:'option', html:"Português", value:'pt-PT'/ *, disabled:true* /},
66 {tag:'option', html:"Português Brasileiro", value:'pt-BR'/ *, disabled:true* /},
67 {tag:'option', html:"Românä", value:'ro-RO', disabled:true},
68 {tag:'option', html:"Russian (Русский)", value:'ru-RU', disabled:true},
69 {tag:'option', html:"Slovak (Slovenčina)", value:'sk-SK', disabled:true},
70 {tag:'option', html:"Slovenian (Slovenščina)", value:'sl-SI', disabled:true},
71 {tag:'option', html:"Suomi", value:'fi-FI', disabled:true},
72 {tag:'option', html:"Svenska", value:'sv-SE', disabled:true},
73 {tag:'option', html:"Thai (ไทย)", value:'th-TH', disabled:true},
74 {tag:'option', html:"Türkçe", value:'tr-TR', disabled:true},
75 {tag:'option', html:"Ukrainian (Українська)", value:'uk-UA', disabled:true}
76* /
77 {tag:'option', html:"Arabic (العربية)", value:"ar", disabled:true, cls:'disabledOption'},
78 // {tag:'option', html:"Chinese (中文)", value:"zh", disabled:true},
79 {tag:'option', html:"Chinese (Simplified) (简体中文)", value:'zh-CN'},
80 {tag:'option', html:"Dutch (Nederlands)", value:"nl-NL", disabled:true, cls:'disabledOption'},
81 {tag:'option', html:"English", value:"en-US"},
82 {tag:'option', html:"French (Français)", value:"fr-FR"},
83 {tag:'option', html:"German (Deutsch)", value:"de-DE", disabled:true, cls:'disabledOption'},
84 {tag:'option', html:"Greek (Ελληνικά)", value:"el-GR", disabled:true, cls:'disabledOption'},
85 {tag:'option', html:"Hebrew (עברית)", value:"he-IL", disabled:true, cls:'disabledOption'},
86 {tag:'option', html:"Italian (Italiano)", value:"it-IT"},
87 {tag:'option', html:"Japanese (日本語)", value:"ja-JP"},
88 {tag:'option', html:"Korean (한국어)", value:"ko-KR", disabled:true, cls:'disabledOption'},
89 {tag:'option', html:"Norwegian (Norsk)", value:"no", disabled:true, cls:'disabledOption'},
90 {tag:'option', html:"Persian (فارسی)", value:"fa-IR", disabled:true, cls:'disabledOption'},
91 {tag:'option', html:"Polish (Polski)", value:"pl-PL", disabled:true, cls:'disabledOption'},
92 {tag:'option', html:"Portuguese (Português)", value:"pt-BR"},
93 {tag:'option', html:"Russian (Русский)", value:"ru-RU", disabled:true, cls:'disabledOption'},
94 {tag:'option', html:"Spanish (Español)", value:"es-ES"},
95 {tag:'option', html:"Swedish (Svenska)", value:"sv-SE", disabled:true, cls:'disabledOption'},
96 {tag:'option', html:"Turkish (Türkçe)", value:"tr-TR", disabled:true, cls:'disabledOption'},
97 {tag:'option', html:"Vietnamese (Tiếng Việt)", value:"vi-VN", disabled:true, cls:'disabledOption'}
98 ]
99}
100*/
101
102Clipperz.PM.Strings.GeneralSettings = {
103 'defaults': {
104 // 'loginFormAarghThatsBadUrl':"http://www.clipperz.com/support/faq/account_faq",
105 // 'loginFormVerifyTheCodeUrl':"http://www.clipperz.com/learn_more/reviewing_the_code",
106
107 // 'donateHeaderLinkUrl': "http://www.clipperz.com/donations",
108 // 'creditsHeaderLinkUrl': "http://www.clipperz.com/credits",
109 // 'feedbackHeaderLinkUrl': "http://www.clipperz.com/contact",
110 // 'helpHeaderLinkUrl': "http://www.clipperz.com/support/user_guide",
111 // 'forumHeaderLinkUrl': "http://www.clipperz.com/forum",
112
113 // 'httpAuthBookmarkletConfiguration':{tag:'textarea', id:'httpAuthDefaultConfiguration', html:"" +
114 // "{ \"page\":{\"title\":\"HTTP authentication\"}," + "\n" +
115 // " \"form\":{\"attributes\": {" + "\n" +
116 // " \"action\":\"\"," + "\n" +
117 // " \"type\":\"http_auth\"" + "\n" +
118 // " }, \"inputs\": [" + "\n" +
119 // " {\"type\":\"text\",\"name\":\"url\",\"value\":\"\"}," + "\n" +
120 // " {\"type\":\"text\",\"name\":\"username\",\"value\":\"\"}," + "\n" +
121 // " {\"type\":\"password\",\"name\":\"password\",\"value\":\"\"}" + "\n" +
122 // " ]}, \"version\":\"0.2.3\"}"
123 // },
124
125 'directLoginJumpPageUrl':"",
126 'defaultFaviconUrl': "data:application/octet-stream;charset=utf-8;base64,AAABAAEAFxcAAAEAGAD8BgAAFgAAACgAAAAXAAAALgAAAAEAGAAAAAAAAAAAABIXAAASFwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////9zAC////////////////////////////////////////////////////////////////////////////////////////////9pAG////////////////////////////////////////////////////////////////////////////////////////////9rAC////////////////////////////////////////////////////////////////////////////////////////////9yAHP////////////////////////IyMizs7O6urrq6ur////////////Ozs6zs7Ozs7Pq6ur///////////////////////8AAAD////////////////////V1dWXl5eXl5eXl5elpaX4+Pj////Ozs6Xl5eXl5eXl5eenp7///////////////////////8AAAD////////////////////Ozs6Xl5eXl5eXl5eXl5fBwcHq6uqenp6Xl5eXl5eXl5eXl5f///////////////////////8AAAD////////////////////j4+OXl5eXl5eXl5eXl5eXl5elpaWXl5eXl5eXl5eXl5ezs7P///////////////////////8AAAD////////////////////////IyMiXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eenp7x8fH////////////////////////////////////////////////////4+PilpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5fOzs7////////////////////////////////////////////////////////q6uq6urqXl5eXl5eXl5eXl5eXl5eXl5eenp7V1dX4+Pj///////////////////////8AAAD////////////4+PjOzs6lpaWXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e6urrj4+P///////////////8AAAD////////////BwcGXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fx8fH///////////8AAAD///////////+zs7OXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5fj4+P///////////8AAAD////////////IyMiXl5eXl5eXl5eXl5e6urqXl5eXl5eXl5eXl5esrKylpaWXl5eXl5eXl5eenp7x8fH///////////8AAAD////////////////Ozs7Ozs7V1dX4+Pj///+Xl5eXl5eXl5eXl5fOzs7////q6urOzs7Ozs7q6ur///////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD///////////////////////////////////+Xl5eXl5eXl5eXl5fOzs7///////////////////////////////////8AAAD////////////////////////////////////IyMiXl5eXl5eenp7x8fH///////////////////////////////////8AAAD////////////////////////////////////////j4+Pj4+Px8fH///////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAD///////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo=",
127 'defaultFaviconUrl_IE': "https://www.clipperz.com/images/icons/misc/favicon.ico",
128
129 // 'icons_baseUrl':"https://www.clipperz.com/images/icons",
130
131 // 'passwordGeneratorLowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
132 // 'passwordGeneratorUppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
133 // 'passwordGeneratorNumberCharset': "0123456789",
134 // 'passwordGeneratorSymbolCharset': "!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
135
136 // 'passwordGenerator': {
137 // 'lowercaseCharset':"abcdefghijklmnopqrstuvwxyz",
138 // 'uppercaseCharset':"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
139 // 'numberCharset':"0123456789",
140 // 'symbolCharset':"!@#$%^&*+?[]{}/|\\<>,.;:~=-_",
141 // },
142
143 '_': ""
144 }
145}
146
147Clipperz.PM.Strings.defaultLanguages = {
148 'default':"en-us",
149
150 // 'de':"de-de",
151 // 'el':"el-gr",
152 // 'he':"he-il",
153 // 'ru':"ru-ru",
154
155 'fr':"fr-fr",
156 'es':"es-es",
157 'zh':"zh-cn",
158 'ja':"ja-jp",
159 'pt':"pt-br",
160 'it':"it-it",
161 'en': "en-us"
162}
163
164Clipperz.PM.Strings.inputTypeToRecordFieldType = {
165 'text': 'TXT',
166 'password': 'PWD',
167 'checkbox': 'CHECK',
168 'radio': 'RADIO',
169 'select': 'SELECT'
170};
171
172//-----------------------------------------------------------------------------
173
174Clipperz.PM.Strings.translateBookmarklet = function (aBookmarkletString) {
175 var result;
176
177 result = aBookmarkletString;
178
179 result = result.replace(/@BOOKMARKLET_NO_EXCEPTION_MESSAGE@/,Clipperz.PM.Strings.getValue('bookmarkletCopy.noExceptionMessage'));
180 result = result.replace(/@BOOKMARKLET_EXCEPTION_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.exceptionMessage'));
181 result = result.replace(/@BOOKMARKLET_COPY@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.copy'));
182 result = result.replace(/@BOOKMARKLET_SUCCESSFUL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.successfulMessage'));
183 result = result.replace(/@BOOKMARKLET_FAIL_MESSAGE@/, Clipperz.PM.Strings.getValue('bookmarkletCopy.failMessage'));
184
185 return result;
186}
187
188//-----------------------------------------------------------------------------
189
190Clipperz.PM.Strings.Languages.setSelectedLanguage = function(aLanguage) {
191 var language;
192 varselectedLanguage;
193
194 language = (aLanguage || Clipperz.PM.Strings.preferredLanguage || 'default').toLowerCase();
195 if (typeof(Clipperz.PM.Strings.defaultLanguages[language]) != 'undefined') {
196 language = Clipperz.PM.Strings.defaultLanguages[language];
197 }
198
199 if (typeof(Clipperz.PM.Strings.Languages[language]) != 'undefined') {
200 selectedLanguage = language;
201 } else if (typeof(Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)]) != 'undefined') {
202 selectedLanguage = Clipperz.PM.Strings.defaultLanguages[language.substr(0,2)];
203 } else {
204 selectedLanguage = Clipperz.PM.Strings.defaultLanguages['default'];
205 }
206
207 if (selectedLanguage != Clipperz.PM.Strings.selectedLanguage) {
208 vartranslations;
209
210 Clipperz.PM.Strings.selectedLanguage = selectedLanguage;
211
212 translations = {};
213 // MochiKit.Base.update(translations, Clipperz.PM.Strings.standardStrings)
214
215 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages['defaults']);
216 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings['defaults']);
217
218 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[Clipperz.PM.Strings.defaultLanguages['default']]);
219 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[Clipperz.PM.Strings.defaultLanguages['default']]);
220
221 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.Languages[selectedLanguage]);
222 MochiKit.Base.updatetree(translations, Clipperz.PM.Strings.GeneralSettings[selectedLanguage]);
223
224 Clipperz.PM.Strings.stringsObjectStore = new Clipperz.KeyValueObjectStore(/*{'name':'String.stringsObjectStore [1]'}*/);
225 Clipperz.PM.Strings.stringsObjectStore.initWithValues(translations);
226
227 if (typeof(bookmarklet) != 'undefined') {
228 Clipperz.PM.Strings.stringsObjectStore.setValue('bookmarklet', Clipperz.PM.Strings.translateBookmarklet(bookmarklet));
229 }
230
231 MochiKit.Signal.signal(Clipperz.PM.Strings.Languages, 'switchLanguage', selectedLanguage);
232 }
233}
234
235//-----------------------------------------------------------------------------
236
237Clipperz.PM.Strings.getValue = function (aKeyPath, someKeyValues) {
238 varresult;
239
240 result = Clipperz.PM.Strings.stringsObjectStore.getValue(aKeyPath);
241
242 if (typeof(result) == 'string') {
243 if (typeof (someKeyValues) != 'undefined') {
244 varkey;
245
246 for (key in someKeyValues) {
247 result = result.replace( new RegExp(key), someKeyValues[key]);
248 }
249 }
250
251 result = result.replace(new RegExp('\n'), '<br>');
252 }
253
254 return result;
255}
256
257Clipperz.PM.Strings.errorDescriptionForException = function (anException) {
258 var result;
259
260 result = Clipperz.PM.Strings.getValue('exceptionsMessages' + '.' + anException.name);
261
262 if (result == null) {
263 result = anException.message;
264 }
265
266 return result;
267},
268
269//-----------------------------------------------------------------------------
270
271Clipperz.PM.Strings.Languages.initSetup = function() {
272 varlanguage;
273 varlanguageParser;
274
275 language = navigator.language || navigator.userLanguage; //en, en-US, .... "de", "nb-no"
276 languageParser = new RegExp("language=([a-z]{2}(?:\-[a-z]{2})?)(\&|$)", "i");
277 if (languageParser.test(window.location.search)) {
278 language = RegExp.$1;
279 }
280
281 Clipperz.PM.Strings.preferredLanguage = language.toLowerCase();
282 Clipperz.PM.Strings.Languages.setSelectedLanguage(Clipperz.PM.Strings.preferredLanguage);
283}
284
285//-----------------------------------------------------------------------------
diff --git a/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js b/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
new file mode 100644
index 0000000..7565d2d
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Strings/MessagePanelConfigurations.js
@@ -0,0 +1,384 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
27
28Clipperz.PM.Strings.messagePanelConfigurations = {
29
30
31 //-------------------------------------------------------------------------
32 //
33 // Registration - connection
34 //
35 'registration_verify': function() {
36 return {
37 'title': null,
38 'text': Clipperz.PM.Strings['connectionRegistrationSendingRequestMessageText']
39 }
40 },
41
42 'registration_sendingCredentials': function() {
43 return {
44 'title': null,
45 'text': Clipperz.PM.Strings['connectionRegistrationSendingCredentialsMessageText']
46 }
47 },
48
49 //-------------------------------------------------------------------------
50 //
51 // One Time Password login message panel
52 //
53
54 'OTP_login_start': function() {
55 return {
56 'title': Clipperz.PM.Strings['OTPloginMessagePanelInitialTitle'],
57 'text': Clipperz.PM.Strings['OTPloginMessagePanelInitialText'],
58 'steps': '+3',
59 'buttons': {}
60 }
61 },
62
63 'OTP_login_loadingOTP': function() {
64 return {
65 'title': Clipperz.PM.Strings['OTPloginMessagePanelLoadingTitle'],
66 'text': Clipperz.PM.Strings['OTPloginMessagePanelLoadingText']
67 }
68 },
69
70 'OTP_login_extractingPassphrase': function() {
71 return {
72 'title': Clipperz.PM.Strings['OTPloginMessagePanelProcessingTitle'],
73 'text': Clipperz.PM.Strings['OTPloginMessagePanelProcessingText']
74 }
75 },
76
77
78 //-------------------------------------------------------------------------
79 //
80 // Login message panel
81 //
82 'login_start': function() {
83 return {
84 'title': Clipperz.PM.Strings['loginMessagePanelInitialTitle'],
85 'text': Clipperz.PM.Strings['loginMessagePanelInitialText'],
86 'steps': '+7',
87 'buttons': {
88 'ok': Clipperz.PM.Strings['loginMessagePanelInitialButtonLabel']
89 }
90 }
91 },
92
93 'login_connected': function() {
94 return {
95 'title': Clipperz.PM.Strings['loginMessagePanelConnectedTitle'],
96 'text': Clipperz.PM.Strings['loginMessagePanelConnectedText'],
97 'buttons': {}
98 }
99 },
100
101 'login_failed':function() {
102 return {
103 'title': Clipperz.PM.Strings['loginMessagePanelFailureTitle'],
104 'text': Clipperz.PM.Strings['loginMessagePanelFailureText'],
105 'button': Clipperz.PM.Strings['loginMessagePanelFailureButtonLabel']
106 }
107 },
108
109 //-------------------------------------------------------------------------
110 //
111 // Login message panel - connection
112 //
113 'connection_sendingCredentials': function() {
114 return {
115 'title': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageTitle'],
116 'text': Clipperz.PM.Strings['connectionLoginSendingCredentialsMessageText']
117 }
118 },
119
120 'connection_credentialVerification': function() {
121 return {
122 'title': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageTitle'],
123 'text': Clipperz.PM.Strings['connectionLoginCredentialsVerificationMessageText']
124 }
125 },
126
127 'connection_loggedIn': function() {
128 return {
129 'title': Clipperz.PM.Strings['connectionLoginDoneMessageTitle'],
130 'text': Clipperz.PM.Strings['connectionLoginDoneMessageText']
131 }
132 },
133
134 //-------------------------------------------------------------------------
135 //
136 //Login message panel - user
137 //
138 'connection_upgrading': function() {
139 return {
140 'title': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageTitle'],
141 'text': Clipperz.PM.Strings['userLoginPanelUpgradingUserCredentialsMessageText'],
142 'steps': '+1'
143 }
144 },
145
146 'connection_done': function() {
147 return {
148 'title': Clipperz.PM.Strings['userLoginPanelConnectedMessageTitle'],
149 'text': Clipperz.PM.Strings['userLoginPanelConnectedMessageText']
150 }
151 },
152
153 'connection_tryOlderSchema': function() {
154 return {
155 'title': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageTitle'],
156 'text': Clipperz.PM.Strings['userLoginPanelTryingAnOlderConnectionSchemaMessageText'],
157 'steps': '+4'
158 }
159 },
160
161 'connection_loadingUserData': function() {
162 return {
163 'title': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageTitle'],
164 'text': Clipperz.PM.Strings['userLoginPanelLoadingUserDataMessageText']
165 }
166 },
167
168 'connection_decryptingUserData': function() {
169 return {
170 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageTitle'],
171 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserDataMessageText'],
172 'steps': '+1'
173 }
174 },
175
176 'connection_decryptingUserStatistics': function() {
177 return {
178 'title': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageTitle'],
179 'text': Clipperz.PM.Strings['userLoginPanelDecryptingUserStatisticsMessageText']
180 }
181 },
182
183 'collectingEntropy': function() {
184 return {
185 'text': Clipperz.PM.Strings['panelCollectingEntryopyMessageText'],
186 'steps': '+1'
187 }
188 },
189
190 //-------------------------------------------------------------------------
191 //
192 // Cards block - delete card panel
193 //
194 'deleteRecord_collectData': function() {
195 return {
196 'title': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageTitle'],
197 'text': Clipperz.PM.Strings['deleteRecordPanelCollectRecordDataMessageText']
198 }
199 },
200
201 'deleteRecord_encryptData': function() {
202 return {
203 'title': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageTitle'],
204 'text': Clipperz.PM.Strings['deleteRecordPanelEncryptUserDataMessageText']
205 }
206 },
207
208 'deleteRecord_sendingData': function() {
209 return {
210 'title': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageTitle'],
211 'text': Clipperz.PM.Strings['deleteRecordPanelSendingDataToTheServerMessageText']
212 }
213 },
214
215 'deleteRecord_updatingInterface': function() {
216 return {
217 'title': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageTitle'],
218 'text': Clipperz.PM.Strings['deleteRecordPanelUpdatingTheInterfaceMessageText']
219 }
220 },
221
222
223 //-------------------------------------------------------------------------
224 //
225 //Cards block - save card panel
226 //
227 'saveCard_collectRecordInfo': function() {
228 return {
229 'title': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageTitle'],
230 'text': Clipperz.PM.Strings['recordSaveChangesPanelCollectRecordInfoMessageText']
231 }
232 },
233
234 'saveCard_encryptUserData': function() {
235 return {
236 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageTitle'],
237 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptUserDataMessageText']
238 }
239 },
240
241 'saveCard_encryptRecordData': function() {
242 return {
243 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageTitle'],
244 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordDataMessageText']
245 }
246 },
247
248 'saveCard_encryptRecordVersions': function() {
249 return {
250 'title': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageTitle'],
251 'text': Clipperz.PM.Strings['recordSaveChangesPanelEncryptRecordVersionDataMessageText']
252 }
253 },
254
255 'saveCard_sendingData': function() {
256 return {
257 'title': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageTitle'],
258 'text': Clipperz.PM.Strings['recordSaveChangesPanelSendingDataToTheServerMessageText']
259 }
260 },
261
262 'saveCard_updatingInterface': function() {
263 return {
264 'title': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageTitle'],
265 'text': Clipperz.PM.Strings['recordSaveChangesPanelUpdatingTheInterfaceMessageText']
266 }
267 },
268
269 //-------------------------------------------------------------------------
270 //
271 //Account panel - user preferences
272 //
273 'account_savingPreferences_1': function() {
274 return {
275 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step1'],
276 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step1'],
277 'steps': '+3'
278 }
279 },
280
281 'account_savingPreferences_2': function() {
282 return {
283 'title': Clipperz.PM.Strings['accountPreferencesSavingPanelTitle_Step2'],
284 'text': Clipperz.PM.Strings['accountPreferencesSavingPanelText_Step2']
285 }
286 },
287
288
289 //-------------------------------------------------------------------------
290 //
291 //Account panel - change credentials
292 //
293 'changeCredentials_encryptingData': function() {
294 return {
295 'title': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageTitle'],
296 'text': Clipperz.PM.Strings['changeCredentialsPanelEncryptingDataMessageText']
297 }
298 },
299
300 'changeCredentials_creatingNewCredentials': function() {
301 return {
302 'title': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageTitle'],
303 'text': Clipperz.PM.Strings['changeCredentialsPanelCreatingNewCredentialsMessageText']
304 }
305 },
306
307 'changeCredentials_sendingCredentials': function() {
308 return {
309 'title': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle'],
310 'text': Clipperz.PM.Strings['changeCredentialsPanelSendingNewCredentialsToTheServerMessageText']
311 }
312 },
313
314 'changeCredentials_done': function() {
315 return {
316 'title': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageTitle'],
317 'text': Clipperz.PM.Strings['changeCredentialsPanelDoneMessageText']
318 }
319 },
320
321
322 //-------------------------------------------------------------------------
323 //
324 //Account panel - change credentials
325 //
326 'saveOTP_encryptUserData': function() {
327 return {
328 'title': Clipperz.PM.Strings['saveOTP_encryptUserDataTitle'],
329 'text': Clipperz.PM.Strings['saveOTP_encryptUserDataText'],
330 'steps': '+4'
331 }
332 },
333
334 'saveOTP_encryptOTPData': function() {
335 return {
336 'title': Clipperz.PM.Strings['saveOTP_encryptOTPDataTitle'],
337 'text': Clipperz.PM.Strings['saveOTP_encryptOTPDataText']
338 }
339 },
340
341 'saveOTP_sendingData': function() {
342 return {
343 'title': Clipperz.PM.Strings['saveOTP_sendingDataTitle'],
344 'text': Clipperz.PM.Strings['saveOTP_sendingDataText']
345 }
346 },
347
348 'saveOTP_updatingInterface': function() {
349 return {
350 'title': Clipperz.PM.Strings['saveOTP_updatingInterfaceTitle'],
351 'text': Clipperz.PM.Strings['saveOTP_updatingInterfaceText']
352 }
353 },
354
355
356 //-------------------------------------------------------------------------
357 //
358 //Data panel - processingImportData
359 //
360 'parseImportData': function() {
361 return {
362 'title': Clipperz.PM.Strings['importData_parsingDataTitle'],
363 'text': Clipperz.PM.Strings['importData_parsingDataText']
364 }
365 },
366
367 'previewImportData': function() {
368 return {
369 'title': Clipperz.PM.Strings['importData_previewingDataTitle'],
370 'text': Clipperz.PM.Strings['importData_previewingDataText']
371 }
372 },
373
374 'processingImportData': function() {
375 return {
376 'title': Clipperz.PM.Strings['importData_processingDataTitle'],
377 'text': Clipperz.PM.Strings['importData_processingDataText']
378 }
379 },
380
381 //-------------------------------------------------------------------------
382 __syntaxFix__: "syntax fix"
383
384}
diff --git a/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js b/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js
new file mode 100644
index 0000000..aefd94a
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Strings/Strings_defaults.js
@@ -0,0 +1,385 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; }
27if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; }
28
29//=============================================================================
30//
31 // D E F A U L T S ( defaults )
32//
33//=============================================================================
34
35Clipperz.PM.Strings.Languages['defaults'] = {
36
37'elapsedTimeDescriptions': {
38 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
39 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
40 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
41 'YESTERDAY': "yesterday",
42 '*_DAYS_AGO': "__elapsed__ days ago",
43 'ABOUT_AN_HOUR_AGO': "about an hour ago",
44 '*_HOURS_AGO': "__elapsed__ hours ago",
45 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
46 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
47},
48/*
49 'unknown_ip': "unknown",
50
51'countries': {
52 '--': "unknown",
53 'AD': "Andorra",
54 'AE': "United Arab Emirates",
55 'AF': "Afghanistan",
56 'AG': "Antigua and Barbuda",
57 'AI': "Anguilla",
58 'AL': "Albania",
59 'AM': "Armenia",
60 'AN': "Netherlands Antilles",
61 'AO': "Angola",
62 'AP': "Non-Spec Asia Pas Location",
63 'AR': "Argentina",
64 'AS': "American Samoa",
65 'AT': "Austria",
66 'AU': "Australia",
67 'AW': "Aruba",
68 'AX': "Aland Islands",
69 'AZ': "Azerbaijan",
70 'BA': "Bosnia and Herzegowina",
71 'BB': "Barbados",
72 'BD': "Bangladesh",
73 'BE': "Belgium",
74 'BF': "Burkina Faso",
75 'BG': "Bulgaria",
76 'BH': "Bahrain",
77 'BI': "Burundi",
78 'BJ': "Benin",
79 'BM': "Bermuda",
80 'BN': "Brunei Darussalam",
81 'BO': "Bolivia",
82 'BR': "Brazil",
83 'BS': "Bahamas",
84 'BT': "Bhutan",
85 'BW': "Botswana",
86 'BY': "Belarus",
87 'BZ': "Belize",
88 'CA': "Canada",
89 'CD': "Congo the Democratic Republic of the",
90 'CF': "Central African Republic",
91 'CH': "Switzerland",
92 'CI': "Cote D'ivoire",
93 'CK': "Cook Islands",
94 'CL': "Chile",
95 'CM': "Cameroon",
96 'CN': "China",
97 'CO': "Colombia",
98 'CR': "Costa Rica",
99 'CS': "Serbia and Montenegro",
100 'CU': "Cuba",
101 'CY': "Cyprus",
102 'CZ': "Czech Republic",
103 'DE': "Germany",
104 'DJ': "Djibouti",
105 'DK': "Denmark",
106 'DO': "Dominican Republic",
107 'DZ': "Algeria",
108 'EC': "Ecuador",
109 'EE': "Estonia",
110 'EG': "Egypt",
111 'ER': "Eritrea",
112 'ES': "Spain",
113 'ET': "Ethiopia",
114 'EU': "European Union",
115 'FI': "Finland",
116 'FJ': "Fiji",
117 'FM': "Micronesia Federated States of",
118 'FO': "Faroe Islands",
119 'FR': "France",
120 'GA': "Gabon",
121 'GB': "United Kingdom",
122 'GD': "Grenada",
123 'GE': "Georgia",
124 'GF': "French Guiana",
125 'GG': "Guernsey",
126 'GH': "Ghana",
127 'GI': "Gibraltar",
128 'GL': "Greenland",
129 'GM': "Gambia",
130 'GP': "Guadeloupe",
131 'GR': "Greece",
132 'GT': "Guatemala",
133 'GU': "Guam",
134 'GW': "Guinea-Bissau",
135 'GY': "Guyana",
136 'HK': "Hong Kong",
137 'HN': "Honduras",
138 'HR': "Croatia (Local Name: Hrvatska)",
139 'HT': "Haiti",
140 'HU': "Hungary",
141 'ID': "Indonesia",
142 'IE': "Ireland",
143 'IL': "Israel",
144 'IM': "Isle of Man",
145 'IN': "India",
146 'IO': "British Indian Ocean Territory",
147 'IQ': "Iraq",
148 'IR': "Iran (Islamic Republic of)",
149 'IS': "Iceland",
150 'IT': "Italy",
151 'JE': "Jersey",
152 'JM': "Jamaica",
153 'JO': "Jordan",
154 'JP': "Japan",
155 'KE': "Kenya",
156 'KG': "Kyrgyzstan",
157 'KH': "Cambodia",
158 'KI': "Kiribati",
159 'KN': "Saint Kitts and Nevis",
160 'KR': "Korea Republic of",
161 'KW': "Kuwait",
162 'KY': "Cayman Islands",
163 'KZ': "Kazakhstan",
164 'LA': "Lao People's Democratic Republic",
165 'LB': "Lebanon",
166 'LC': "Saint Lucia",
167 'LI': "Liechtenstein",
168 'LK': "Sri Lanka",
169 'LR': "Liberia",
170 'LS': "Lesotho",
171 'LT': "Lithuania",
172 'LU': "Luxembourg",
173 'LV': "Latvia",
174 'LY': "Libyan Arab Jamahiriya",
175 'MA': "Morocco",
176 'MC': "Monaco",
177 'MD': "Moldova Republic of",
178 'MG': "Madagascar",
179 'MH': "Marshall Islands",
180 'MK': "Macedonia the Former Yugoslav Republic of",
181 'ML': "Mali",
182 'MM': "Myanmar",
183 'MN': "Mongolia",
184 'MO': "Macau",
185 'MP': "Northern Mariana Islands",
186 'MR': "Mauritania",
187 'MS': "Montserrat",
188 'MT': "Malta",
189 'MU': "Mauritius",
190 'MV': "Maldives",
191 'MW': "Malawi",
192 'MX': "Mexico",
193 'MY': "Malaysia",
194 'MZ': "Mozambique",
195 'NA': "Namibia",
196 'NC': "New Caledonia",
197 'NF': "Norfolk Island",
198 'NG': "Nigeria",
199 'NI': "Nicaragua",
200 'NL': "Netherlands",
201 'NO': "Norway",
202 'NP': "Nepal",
203 'NR': "Nauru",
204 'NU': "Niue",
205 'NZ': "New Zealand",
206 'OM': "Oman",
207 'PA': "Panama",
208 'PE': "Peru",
209 'PF': "French Polynesia",
210 'PG': "Papua New Guinea",
211 'PH': "Philippines",
212 'PK': "Pakistan",
213 'PL': "Poland",
214 'PR': "Puerto Rico",
215 'PS': "Palestinian Territory Occupied",
216 'PT': "Portugal",
217 'PW': "Palau",
218 'PY': "Paraguay",
219 'QA': "Qatar",
220 'RO': "Romania",
221 'RS': "Serbia",
222 'RU': "Russian Federation",
223 'RW': "Rwanda",
224 'SA': "Saudi Arabia",
225 'SB': "Solomon Islands",
226 'SC': "Seychelles",
227 'SD': "Sudan",
228 'SE': "Sweden",
229 'SG': "Singapore",
230 'SI': "Slovenia",
231 'SK': "Slovakia (Slovak Republic)",
232 'SL': "Sierra Leone",
233 'SM': "San Marino",
234 'SN': "Senegal",
235 'SR': "Suriname",
236 'SV': "El Salvador",
237 'SY': "Syrian Arab Republic",
238 'SZ': "Swaziland",
239 'TC': "Turks and Caicos Islands",
240 'TG': "Togo",
241 'TH': "Thailand",
242 'TJ': "Tajikistan",
243 'TM': "Turkmenistan",
244 'TN': "Tunisia",
245 'TO': "Tonga",
246 'TR': "Turkey",
247 'TT': "Trinidad and Tobago",
248 'TV': "Tuvalu",
249 'TW': "Taiwan Province of China",
250 'TZ': "Tanzania United Republic of",
251 'UA': "Ukraine",
252 'UG': "Uganda",
253 'US': "United States",
254 'UY': "Uruguay",
255 'UZ': "Uzbekistan",
256 'VA': "Holy See (Vatican City State)",
257 'VE': "Venezuela",
258 'VG': "Virgin Islands (British)",
259 'VI': "Virgin Islands (U.S.)",
260 'VN': "Viet Nam",
261 'VU': "Vanuatu",
262 'WF': "Wallis and Futuna Islands",
263 'WS': "Samoa",
264 'YE': "Yemen",
265 'ZA': "South Africa",
266 'ZM': "Zambia",
267 'ZW': "Zimbabwe",
268 'ZZ': "Reserved"
269},
270
271'browsers': {
272 'UNKNOWN': "Unknown",
273 'MSIE': "Internet Explorer",
274 'FIREFOX': "Firefox",
275 'OPERA': "Opera",
276 'SAFARI': "Safari",
277 'OMNIWEB': "OmniWeb",
278 'CAMINO': "Camino",
279 'CHROME': "Chrome"
280},
281
282'operatingSystems': {
283 'UNKNOWN': "Unknown",
284 'WINDOWS': "Windows",
285 'MAC': "Mac",
286 'LINUX': "Linux",
287 'IPHONE': "iPhone",
288 'MOBILE': "Mobile",
289 'OPENBSD': "OpenBSD",
290 'FREEBSD': "FreeBSD",
291 'NETBSD': "NetBSD"
292},
293*/
294
295 //Calendar texts
296'calendarStrings': {
297 'months': {
298 '0':"January",
299 '1':"February",
300 '2':"March",
301 '3':"April",
302 '4':"May",
303 '5':"June",
304 '6':"July",
305 '7':"August",
306 '8':"September",
307 '9':"October",
308 '10':"November",
309 '11':"December"
310 },
311 'shortMonths':{
312 '0':"Jan",
313 '1':"Feb",
314 '2':"Mar",
315 '3':"Apr",
316 '4':"May",
317 '5':"Jun",
318 '6':"Jul",
319 '7':"Aug",
320 '8':"Sep",
321 '9':"Oct",
322 '10':"Nov",
323 '11':"Dec"
324 },
325
326 'days':{
327 '0':"Sunday",
328 '1':"Monday",
329 '2':"Tuesday",
330 '3':"Wednesday",
331 '4':"Thursday",
332 '5':"Friday",
333 '6':"Saturday"
334 },
335
336 'shortDays':{
337 '0':"Sun",
338 '1':"Mon",
339 '2':"Tue",
340 '3':"Wed",
341 '4':"Thu",
342 '5':"Fri",
343 '6':"Sat"
344 },
345
346 'veryShortDays':{
347 '0':"Su",
348 '1':"Mo",
349 '2':"Tu",
350 '3':"We",
351 '4':"Th",
352 '5':"Fr",
353 '6':"Sa"
354 },
355
356 'amDesignation':"am",
357 'pmDesignation':"pm"
358
359},
360
361// Date format
362 'fullDate_format':"l, F d, Y H:i:s",
363
364//################################################################################
365
366'pageHeader': {
367 'donation':"donate",
368 'forum':"forum",
369 'credits':"credits",
370 'feedback':"feedback",
371 'help': "help"
372},
373
374'bookmarkletCopy': {
375 'noExceptionMessage':"The direct login configuration has been collected.",
376 'exceptionMessage': "Sorry! There was an error while processing the page.",
377 'copy': "copy",
378 'successfulMessage':"DONE!",
379 'failMessage': "Failed! :("
380},
381
382//################################################################################
383
384__syntaxFix__: "syntax fix"
385}
diff --git a/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js
new file mode 100644
index 0000000..72460ba
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Strings/Strings_en-US.js
@@ -0,0 +1,1336 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24//=============================================================================
25//
26 // E N G L I S H A M E R I C A N ( en_US )
27//
28//=============================================================================
29
30Clipperz.PM.Strings.Languages['en-us'] = {
31/*
32 //Login page - description
33'clipperzServiceDescription': "\
34 <!-- FIX CSS DONE -->\
35 <h2>Keep it to yourself!</h2>\
36 <ul>\
37 <li>\
38 <h3>Clipperz is:</h3>\
39 <ul>\
40 <li><p>a secure and simple password manager</p></li>\
41 <li><p>an effective single sign-on solution</p></li>\
42 <li><p>a digital vault for your personal data</p></li>\
43 </ul>\
44 </li>\
45 <li>\
46 <h3>With Clipperz you can:</h3>\
47 <ul>\
48 <li><p>store and manage your passwords and online credentials</p></li>\
49 <li><p>login to your web services without entering any username or password</p></li>\
50 <li><p>protect all your sensitive data: codes for burglar alarms, PINs, credit card numbers, …</p></li>\
51 <li><p>share secrets with family members and associates (coming soon)</p></li>\
52 </ul>\
53 </li>\
54 <li>\
55 <h3>Clipperz benefits:</h3>\
56 <ul>\
57 <li><p>free and completely anonymous</p></li>\
58 <li><p>access it any time from any computer</p></li>\
59 <li><p>no software to download and nothing to install</p></li>\
60 <li><p>avoid keeping secrets on your PC or on paper</p></li>\
61 </ul>\
62 </li>\
63 <li>\
64 <h3>Clipperz security:</h3>\
65 <ul>\
66 <li><p>your secrets are locally encrypted by your browser before being uploaded to Clipperz</p></li>\
67 <li><p>the encryption key is a passphrase known only to you</p></li>\
68 <li><p>Clipperz hosts your sensitive data in encrypted form and could never actually access the data in its plain form</p></li>\
69 <li><p>Clipperz is built upon standard encryption schemes, nothing fancies or homemade</p></li>\
70 <li><p>you can review the source code anytime you like, but you need to know nothing about cryptography to be an happy user!</p></li>\
71 </ul>\
72 </li>\
73 <li>\
74 <a href=\"http://www.clipperz.com\" target=\"_blank\">Learn more</a>\
75 </li>\
76 </ul>",
77
78
79 'loginFormTitle': "login with your Clipperz account",
80 'loginFormUsernameLabel': "username",
81 'loginFormPassphraseLabel': "passphrase",
82 'loginFormDontHaveAnAccountLabel': "don\'t have an account?",
83 'loginFormCreateOneLabel': "create one",
84 'loginFormForgotYourCredentialsLabel': "forgot your credentials?",
85 'loginFormAarghThatsBadLabel': "aargh! that\'s bad!",
86 'loginFormAfraidOfMaliciousScriptsLabel': "afraid of malicious scripts?",
87 'loginFormVerifyTheCodeLabel': "verify the code",
88 'loginFormButtonLabel': "Login",
89 'loginFormOneTimePasswordCheckboxLabel': "use a one-time passphrase",
90'loginFormOneTimePasswordCheckboxDescription': "",
91
92// Login page - language selection
93 'loginPanelSwithLanguageDescription': "<h5>Switch to your preferred language</h5>",
94
95// Login page - browser compatibility
96 'browserCompatibilityDescription': "<p>Have a better and safer Clipperz experience with Firefox. However Clipperz works just fine also with Opera, Safari and MS Internet Explorer!</p>",
97
98// Login with OTP - message panel
99 'OTPloginMessagePanelInitialTitle': "Logging in using a one-time passphrase",
100 'OTPloginMessagePanelInitialText': "Sending OTP credentials …",
101 'OTPloginMessagePanelLoadingTitle': "Logging in using a one-time passphrase",
102 'OTPloginMessagePanelLoadingText': "Fetching encrypted authentication data from the server …",
103 'OTPloginMessagePanelProcessingTitle': "Logging in using a one-time passphrase",
104 'OTPloginMessagePanelProcessingText': "Local decryption of authentication data",
105
106// Regular login - message panel
107 'loginMessagePanelInitialTitle': "Logging in …",
108 'loginMessagePanelInitialText': "---",
109 'loginMessagePanelInitialButtonLabel': "Cancel",
110 'loginMessagePanelConnectedTitle': "Connected",
111 'loginMessagePanelConnectedText': "Done",
112 'loginMessagePanelFailureTitle': "Error",
113 'loginMessagePanelFailureText': "Login failed",
114 'loginMessagePanelFailureButtonLabel': "Close",
115
116// Regular login - message panel - connection
117 'connectionLoginSendingCredentialsMessageTitle': "Verifying credentials",
118 'connectionLoginSendingCredentialsMessageText': "Sending credentials",
119 'connectionLoginCredentialsVerificationMessageTitle':"Verifying credentials",
120 'connectionLoginCredentialsVerificationMessageText':"Performing SRP authentication",
121 'connectionLoginDoneMessageTitle': "Verifying credentials",
122 'connectionLoginDoneMessageText': "Connected",
123
124 //Regular login - message panel - user
125 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials",
126 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema",
127 'userLoginPanelConnectedMessageTitle': "User authenticated",
128 'userLoginPanelConnectedMessageText': "Successfully logged in",
129 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials",
130 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema",
131 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated",
132 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz",
133 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated",
134 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers",
135 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated",
136 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics",
137
138 //Registration page - splash alert
139 'splashAlertTitle':"Welcome to Clipperz!",
140'splashAlertText': "\
141 <!-- FIX CSS DONE! -->\
142 <p>Some security advice</p>\
143 <ul>\
144 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\
145 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\
146 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\
147 </ul>\
148 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>",
149 'splashAlertCloseButtonLabel':"Ok",
150
151 // Registration page - form
152 'registrationFormTitle': "create your account",
153 'registrationFormUsernameLabel': "username",
154 'registrationFormPassphraseLabel': "passphrase",
155 'registrationFormRetypePassphraseLabel': "re-enter passphrase",
156 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.",
157 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>.",
158 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?",
159 'registrationFormSimplyLoginLabel': "simply login",
160 'registrationFormButtonLabel': "Register",
161
162// Registration page - warning messages
163 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.",
164 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.",
165 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.",
166
167 // Registration page - message panel
168 'registrationMessagePanelInitialTitle': "Creating account …",
169 'registrationMessagePanelInitialText': "---",
170 'registrationMessagePanelInitialButtonLabel': "Cancel",
171 'registrationMessagePanelRegistrationDoneTitle': "Registration",
172 'registrationMessagePanelRegistrationDoneText': "Done",
173 'registrationMessagePanelFailureTitle': "Registration failed",
174 'registrationMessagePanelFailureButtonLabel': "Close",
175
176// Registration page - message panel - connection
177 'connectionRegistrationSendingRequestMessageText': "Verifying credentials",
178 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials",
179
180// Registration page - splash panel
181 'registrationSplashPanelTitle': "Security advice",
182 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>",
183 'registrationSplashPanelUsernameLabel': "username",
184 'registrationSplashPanelPassphraseLabel':"passphrase",
185
186 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase",
187
188 //Header links
189 'donateHeaderLinkLabel': "donate",
190 'creditsHeaderLinkLabel': "credits",
191 'feedbackHeaderLinkLabel': "feedback",
192 'helpHeaderLinkLabel': "help",
193 'forumHeaderLinkLabel': "forum",
194
195 //Menu labels
196 'recordMenuLabel': "cards",
197 'accountMenuLabel': "account",
198 'dataMenuLabel': "data",
199 'contactsMenuLabel': "contacts",
200 'toolsMenuLabel': "tools",
201 'logoutMenuLabel': "logout",
202 'lockMenuLabel': "lock",
203
204 //Lock dialog
205 'lockTitle': "The account is locked",
206 'lockDescription': "<p>To unlock your account, please enter your passphrase.</p>",
207 'unlockButtonLabel': "Unlock",
208
209 //Account panel - change passphrase
210 'changePasswordTabLabel': "Change your passphrase",
211 'changePasswordTabTitle': "Change your passphrase",
212
213 'changePasswordFormUsernameLabel': "username",
214 'changePasswordFormOldPassphraseLabel': "old passphrase",
215 'changePasswordFormNewPassphraseLabel': "new passphrase",
216 'changePasswordFormRetypePassphraseLabel':"re-enter new passphrase",
217 'changePasswordFormSafetyCheckboxLabel':"I understand that Clipperz will not be able to recover a lost passphrase.",
218 'changePasswordFormSubmitLabel': "Change passphrase",
219
220 //Account panel - change passphrase - warning messages
221 'changePasswordFormWrongUsernameWarning': "Wrong username",
222 'changePasswordFormWrongPassphraseWarning': "Wrong passphrase",
223 'changePasswordFormWrongRetypePassphraseWarning':"Your passphrases don't match, please re-type them.",
224 'changePasswordFormSafetyCheckWarning': "Please read and check the box below.",
225
226 //Account panel - change passphrase - progress dialog
227 'changePasswordFormProgressDialogTitle': "Changing user credentials",
228 'changePasswordFormProgressDialogEmptyText': "---",
229 'changePasswordFormProgressDialogConnectedMessageTitle': "Connected",
230 'changePasswordFormProgressDialogConnectedMessageText': "Done",
231 'changePasswordFormProgressDialogErrorMessageTitle': "Error",
232 'changePasswordFormProgressDialogErrorMessageText': "Credentials change failed!",
233
234 'changeCredentialsPanelEncryptingDataMessageTitle': "Changing your passphrase",
235 'changeCredentialsPanelEncryptingDataMessageText': "Local encryption of card headers",
236 'changeCredentialsPanelCreatingNewCredentialsMessageTitle': "Changing your passphrase",
237 'changeCredentialsPanelCreatingNewCredentialsMessageText': "Updating your credentials",
238 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageTitle':"Changing your passphrase",
239 'changeCredentialsPanelSendingNewCredentialsToTheServerMessageText':"Uploading your encrypted credentials to Clipperz",
240 'changeCredentialsPanelDoneMessageTitle': "Changing your passphrase",
241 'changeCredentialsPanelDoneMessageText': "Done",
242
243 //Account panel - OTP
244 'manageOTPTabLabel': "Manage your one-time passphrases",
245 'manageOTPTabTitle': "Manage your one-time passphrases",
246
247 'manageOTPTabDescription':"\
248 <p>A one-time passphrase works like your regular passphrase, but can be used only once.</p>\
249 <p>If the same passphrase is used again at a later stage in a login attempt it will be rejected and the login process will fail.</p>\
250 <p>Immediately after a successful login, your one-time passphrase will be deleted preventing any fraudulent access.</p>\
251 <p>One-time passphrases are an excellent choice if one is concerned about keyloggers or spyware infections that may be collecting data from compromised machines.</p>\
252 <p><b>It's strongly advisable to use one-time passphrases when accessing Clipperz from public terminals, such as Internet cafes and libraries.</b></p>",
253
254 //Account panel - OTP - OTP table
255'oneTimePasswordReadOnlyMessage': "\
256 <h6>Sorry!</h6>\
257 <p>You cannot manage your one-time passphrases when using the offline version of Clipperz.</p>",
258
259 'oneTimePasswordLoadingMessage':"\
260 <h6>Loading data</h6>\
261 <p>Please wait …</p>",
262
263 'oneTimePasswordNoPasswordAvailable':"\
264 <h6>No one-time passphrase available</h6>\
265 <p>Click the “New” button above to add one-time passphrases to your account.</p>",
266
267 'createNewOTPButtonLabel': "New",
268 'deleteOTPButtonLabel': "Delete",
269 'printOTPButtonLabel': "Print",
270
271 'disabledOneTimePassword_warning': "disabled",
272
273 'oneTimePasswordSelectionLink_selectLabel':"Select:",
274 'oneTimePasswordSelectionLink_all': "all",
275 'oneTimePasswordSelectionLink_none': "none",
276 'oneTimePasswordSelectionLink_used': "used",
277 'oneTimePasswordSelectionLink_unused': "unused",
278
279//Account panel - OTP - saving new OTP dialog
280 'saveOTP_encryptUserDataTitle': "Saving one-time passphrase",
281 'saveOTP_encryptUserDataText': "Processing new OTP credentials …",
282 'saveOTP_encryptOTPDataTitle': "Saving one-time passphrase",
283 'saveOTP_encryptOTPDataText': "Local encryption of authentication data …",
284 'saveOTP_sendingDataTitle': "Saving one-time passphrase",
285 'saveOTP_sendingDataText': "Sending authentication data to the server …",
286 'saveOTP_updatingInterfaceTitle': "Saving one-time passphrase",
287 'saveOTP_updatingInterfaceText': "Updating interface",
288
289// Account panel - preferences
290 'accountPreferencesLabel': "Preferences",
291 'accountPreferencesTabTitle': "Preferences",
292
293 'accountPreferencesLanguageTitle': "Language",
294 'accountPreferencesLanguageDescription':"<p>Choose your preferred language from the list below.</p>",
295
296 'showDonationReminderPanelTitle': "Donation reminders",
297 'showDonationReminderPanelDescription': "<p>Show donation reminders</p>",
298
299 'saveUserPreferencesFormSubmitLabel': "Save",
300 'cancelUserPreferencesFormSubmitLabel': "Cancel",
301
302// Account panel - preferences - saving dialog
303 'accountPreferencesSavingPanelTitle_Step1': "Saving preferences",
304 'accountPreferencesSavingPanelText_Step1': "Local encryption of your preferences",
305 'accountPreferencesSavingPanelTitle_Step2': "Saving preferences",
306 'accountPreferencesSavingPanelText_Step2': "Sending encrypted preferences to Clipperz",
307
308 //Account panel - login history
309 'accountLoginHistoryLabel': "Login history",
310 'loginHistoryTabTitle': "Login history",
311
312 'loginHistoryReadOnlyMessage': "\
313 <h6>Sorry!</h6>\
314 <p>The login history is not available while using the offline version of Clipperz.</p>",
315
316 'loginHistoryLoadingMessage': "\
317 <h6>Loading data</h6>\
318 <p>Please wait …</p>",
319
320 'loginHistoryLoadedMessage': "\
321 <h6>Your latest 10 logins</h6>\
322 <p></p>",
323
324 'loginHistoryIPLabel': "IP",
325 'loginHistoryTimeLabel': "date",
326 'loginHistoryCurrentSessionText': "current session",
327 'loginHistoryReloadButtonLabel': "Reload login history",
328
329 //Account panel - delete account
330 'deleteAccountTabLabel': "Delete your account",
331 'deleteAccountTabTitle': "Delete your account",
332
333 'deleteAccountFormUsernameLabel': "username",
334 'deleteAccountFormPassphraseLabel': "passphrase",
335 'deleteAccountFormSafetyCheckboxLabel': "I understand that all my data will be deleted and that this action is irreversible.",
336 'deleteAccountFormSubmitLabel': "Delete my account",
337
338//Account panel - delete account - warnings
339 'deleteAccountFormWrongUsernameWarning':"Wrong username",
340 'deleteAccountFormWrongPassphraseWarning':"Wrong passphrase",
341 'deleteAccountFormSafetyCheckWarning': "Please read and check the box below.",
342
343//Account panel - delete account - confirmation
344 'accountPanelDeletingAccountPanelConfirmationTitle':"ATTENTION",
345 'accountPanelDeleteAccountPanelConfirmationText': "Are your sure you want to delete your account?",
346 'accountPanelDeleteAccountPanelConfirmButtonLabel': "Yes",
347 'accountPanelDeleteAccountPanelDenyButtonLabel': "No",
348
349//Account panel - delete account - confirmation
350 'accountPanelDeletingAccountPanelProgressTitle': "Deleting the account data",
351 'accountPanelDeletingAccountPanelProgressText': "The operation could take long, please be patient.",
352
353//Data panel - offline copy
354 'offlineCopyTabLabel': "Offline copy",
355 'offlineCopyTabTitle': "Offline copy",
356
357'offlineCopyTabDescription': "\
358 <!-- FIX CSS DONE! -->\
359 <p>With just one click you can dump all your encrypted data from Clipperz servers to your hard disk and create a read-only offline version of Clipperz to be used when you are not connected to the Internet.</p>\
360 <p>The read-only version is as secure as the read-and-write one and will not expose your data to higher risks since they both share the same code and security architecture.</p>\
361 <ol>\
362 <li><p>Click the link below to start the download.</p></li>\
363 <li><p>The browser will ask you what to do with the “Clipperz_YYYYMMDD.html” file. Save it on your hard disk.</p></li>\
364 <li><p>Double click on the downloaded file to launch the offline version in your browser.</p></li>\
365 <li><p>Enter the usual username and passphrase.</p></li>\
366 </ol>",
367
368 'offlineCopyDownloadLinkLabel': "Download",
369
370 //Data panel - offline copy - not updated
371 'offlineCopyDownloadWarning': "\
372 <!-- FIX CSS DONE! -->\
373 <h4><a href=\"#\" id=\"offlineCopyDownloadWarningLink\">Update your “offline copy”!</a></h4>\
374 <p>You have recently created or modified one or more cards, it would be wise to download a new copy of the offline version.</p>",
375
376 'offlineCopyDownloadOk': "",
377
378 //Data panel - sharing
379 'sharingTabLabel': "Sharing",
380 'sharingTabTitle': "Sharing",
381
382 'sharingTabDescription': "\
383 <p>Quite often a confidential piece of information needs to be shared with one or more persons.</p>\
384 <p>This could be as simple as giving your colleague the access code of your voice mailbox when you are out of the office, or as complicated as enabling the entitled heirs to access your safe deposit box at the local bank when you pass on.</p>\
385 <p>Clipperz can make sharing your secrets a secure and straightforward process.</p>\
386 <p></p>\
387 <p><b>Coming soon …</b></p>",
388
389 // Data panel - import
390 'importTabLabel': "Import",
391 'importTabTitle': "Import",
392
393 'importTabDescription': "<p>You can bulk import data to your Clipperz account from several file formats.</p>",
394
395 //Data panel - export
396 'printingTabLabel': "Export",
397 'printingTabTitle': "Export",
398
399 'printingTabDescription': "\
400 <h5>Printing</h5>\
401 <p>Click on the link below to open a new window displaying all your cards in a printable format.</p>\
402 <p>If you are going to print for backup purposes, please consider the safer option provided by the “offline copy”.</p>",
403
404 'printingLinkLabel': "Printable version",
405
406 'exportTabDescription': "\
407 <h5>Exporting to JSON</h5>\
408 <p>JSON enables a “lossless” export of your cards. All the information will be preserved, including direct login configurations.</p>\
409 <p>This custom format it’s quite convenient if you need to move some of all of your cards to a different Clipperz account. Or if you want to restore a card that has been accidentally deleted.</p>\
410 <p>Click on the link below to start the export process.</p>",
411
412 'exportLinkLabel': "Export to JSON",
413
414 'exportDataInProgressDescription':"<h4>Exporting, please wait while your data are being processed …</h4>",
415
416 'exportDataDescription': "\
417 <h4>Instructions</h4>\
418 <p>Copy the text below to your favorite editor and save it. (e.g. “clipperz_export_20071217.json”)</p>",
419
420 //Contacts panel
421 'contactsTabLabel': "Contacts",
422 'contactsTabTitle': "Contacts",
423
424//Tools panel - password generator
425 'passwordGeneratorTabLabel': "Password generator",
426 'bookmarkletTabLabel': "Bookmarklet",
427 'compactTabLabel': "Compact edition",
428 'httpAuthTabLabel': "HTTP authentication",
429
430 'passwordGeneratorTabTitle': "Password generator",
431 'bookmarkletTabTitle': "Bookmarklet",
432 'compactTabTitle': "Compact edition",
433 'httpAuthTabTitle': "HTTP authentication",
434
435
436 //Tools panel - password generator - description
437 'paswordGeneratorTabDescription':"<p></p>",
438 'passwordGeneratorTabButtonLabel':"Generate password",
439
440 //Tools panel - bookmarklet
441 'bookmarkletTabLabel': "Bookmarklet",
442 'bookmarkletTabTitle': "Bookmarklet",
443
444 'bookmarkletTabDescription': "\
445 <!-- FIX CSS DONE! -->\
446 <p>A bookmarklet is a simple “one-click” tool that can perform very useful tasks. It can be saved and used like a normal web page bookmark.</p>\
447 <p>The Clipperz bookmarklet will help you to quickly create new cards and new “direct logins” within existing cards.</p>\
448 <p><b>Please note that the bookmarklet does not include any information related to your account (e.g. your username or passphrase), the bookmarklet is a general tool containing the same code for every Clipperz user.</b></p>\
449 <h3>How to install the bookmarklet</h3>\
450 <h>Firefox, Camino, Opera, Safari</h5>\
451 <ol>\
452 <li><p>Make sure that the “Bookmarks Bar” is displayed by selecting “View > Toolbars > Bookmarks”, or similar menu items, from the browser menu.</p></li>\
453 <li><p>Drag and drop the “Add to Clipperz” link below to the bookmark bar.</p></li>\
454 </ol>\
455 \
456 <h5>Internet Explorer</h5>\
457 <ol>\
458 <li><p>Make sure that the “Links” toolbar is displayed by selecting “View > Toolbars > Links” from the browser menu.</p></li>\
459 <li><p>Right-click on the “Add to Clipperz” link below.</p></li>\
460 <li><p>Select “Add to favorites” from the contextual menu.</p></li>\
461 <li><p>Click “Yes” for any security message that pops up.</p></li>\
462 <li><p>Open the “Links” folder and click “OK”</p></li>\
463 </ol>",
464
465 'bookmarkletTabBookmarkletTitle':"Add to Clipperz",
466
467 //Tools panel - bookmarklet - instructions
468 'bookmarkletTabInstructions': "\
469 <!-- FIX CSS DONE! -->\
470 <h3>How to create a new card inclusive of a “direct login” link to an online service</h3>\
471 <ol>\
472 <li><p>Open the web page where the login form is hosted. (this is the page where you usually enter your sign-in credentials)</p></li>\
473 <li><p>Launch the bookmarklet by clicking on it: a pop-up window will appear over the web page.</p></li>\
474 <li><p>Copy to the clipboard the content of the large text area within the pop-up. (ctrl-C)</p></li>\
475 <li><p>Enter your Clipperz account and click on the <b>Add new card</b> button.</p></li>\
476 <li><p>Select the “Direct login” template and paste the content of the clipboard to the large text area in the form. (ctrl-V)</p></li>\
477 <li><p>Press the <b>Create</b> button, complete and review the details, then click <b>Save</b>.</p></li>\
478 </ol>\
479 \
480 <h3>How to add a “direct login” link to an existing card</h3>\
481 <ol>\
482 <li><p>Same as above.</p></li>\
483 <li><p>Same as above.</p></li>\
484 <li><p>Same as above.</p></li>\
485 <li><p>Enter your Clipperz account and select the card containing the credentials for the web service you just visited and click the <b>Edit</b> button.</p></li>\
486 <li><p>Paste the content of the clipboard to the large text area in the “Direct logins” section. (ctrl-V)</p></li>\
487 <li><p>Press the <b>Add direct login</b> button, review the details and then click <b>Save</b>.</p></li>\
488 </ol>\
489 \
490 <p></p>\
491 <p>Further information about the bookmarklet are <a href=\"http://www.clipperz.com/support/user_guide/bookmarklet\" target=\"_blank\">available here</a>.</p>",
492
493 //Tools panel - Compact - instructions
494 'compactTabDescription': "\
495 <!-- FIX CSS DONE! -->\
496 <p>Clipperz Compact is a special version of Clipperz designed to be opened in the Firefox sidebar.</p>\
497 <p>Its purpose is to keep your collection of “direct logins” always at hand. Read more <a href=\"http://www.clipperz.com/support/user_guide/clipperz_compact\", target=\"blank\">here</a></p>\
498 \
499 <h3>How to launch Clipperz Compact in the sidebar</h3>\
500 <ol>\
501 <li><p>Get Firefox! Sidebars are only available in Firefox and you need to switch to Firefox in order to enjoy the convenience of Clipperz Compact.</p></li>\
502 <li>\
503 <p>Add the following URL to Firefox bookmarks, or even better, drag it to the bookmark bar.</p>\
504 <div id=\"compactLinkBox\"><a href=\"https://www.clipperz.com/beta/index.html?compact\" target=\"_search\">Clipperz Compact</a></div>\
505 </li>\
506 <li><p>Change the properties of the bookmark so that “load this bookmark in the sidebar” is checked.</p></li>\
507 </ol>\
508 \
509 <h5>Added bonus: Clipperz Compact works also in Opera’s panel.</h5>",
510
511 //Tools panel - HTTP authentication - instructions
512 'httpAuthTabDescription': "\
513 <!-- FIX CSS DONE! -->\
514 <p>HTTP authentication is a method designed to allow a web browser to provide credentials – in the form of a username and password – including them in a website address (HTTP or HTTPS URL).</p>\
515 <p>Nowadays it is rarely used, but it can still be found on small, private websites. You can tell that a website is protected by HTTP authentication when the browser displays a pop-up window to enter username and password.</p>\
516 <p>Unfortunately the Clipperz bookmarklet does not work on websites that use HTTP authentication. However you can still create a “direct login”.</p>\
517 \
518 <h3>How to create a “direct login” for a website that uses HTTP authentication</h3>\
519 <ol>\
520 <li><p>Store website URL, username and password in a new card.</p></li>\
521 <li><p>Copy the configuration below and paste it to the large text area in the “Direct logins” section of the new card.</p></li>\
522 <li><p>Press the <b>Add direct login</b> button, bind URL, username and password fields and then click <b>Save</b>.</p></li>\
523 </ol>\
524 \
525 <h5><a href=\"http://support.microsoft.com/kb/834489\" target=\"_blank\">Warning: Internet Explorer does not support HTTP authentication.</a></h5>",
526
527// Direct logins block
528 'mainPanelDirectLoginBlockLabel': "Direct logins",
529 'directLinkReferenceShowButtonLabel': "show",
530
531// Direct logins - blank slate
532 'mainPanelDirectLoginBlockDescription': "\
533 <!-- FIX CSS DONE! -->\
534 <p>Add “direct logins” to sign in to your web accounts without typing usernames and passwords!</p>\
535 <p>“Direct logins” greatly enhance your password security since you can:</p>\
536 <ul>\
537 <li><p>conveniently adopt and enter complex passwords;</p></li>\
538 <li><p>never re-use the same and easy-to-guess password.</p></li>\
539 </ul>\
540 <p>Simple and quick configuration with the <b>Clipperz bookmarklet</b>.</p>\
541 <a href=\"http://www.clipperz.com/support/user_guide/direct_logins\" target=\"_blank\">Learn more about “direct logins”</a>",
542
543 // Cards block
544 'mainPanelRecordsBlockLabel': "Cards",
545 'mainPanelAddRecordButtonLabel': "Add new card",
546 'mainPanelRemoveRecordButtonLabel': "Delete card",
547
548// Cards block - filter tabs
549 'mainPanelRecordFilterBlockAllLabel': "all",
550 'mainPanelRecordFilterBlockTagsLabel': "tags",
551 'mainPanelRecordFilterBlockSearchLabel':"search",
552
553// Cards block - blank slate
554 'recordDetailNoRecordAtAllTitle': "Welcome to Clipperz!",
555 'recordDetailNoRecordAtAllDescription': "\
556 <h5>Get started by adding cards to your account.</h5>\
557 <p>Cards are simple and flexible forms where you can store your passwords and any other confidential data.</p>\
558 <p>Cards could contain credentials for accessing a web site, the combination of your bicycle lock, details of your credit card, …</p>\
559 \
560 <h5>Don't forget the Clipperz bookmarklet!</h5>\
561 <p>Before you start, install the “Add to Clipperz” bookmarklet: it will make creating cards easier and more fun.</p>\
562 <p>Go to the “Tools” tab to discover how to install it and how it use it.</p>\
563 <p></p>\
564 <p>Then simply click the <b>\"Add new card\"</b> button and enjoy your Clipperz account.</p>\
565 <p></p>\
566 <a href=\"http://www.clipperz.com/support/user_guide/managing_cards\" target=\"_blank\">Learn more about creating and managing cards</a>",
567
568// Cards block - new card wizard - bookmarklet configuration
569 'newRecordWizardTitleBox': "\
570 <h5>Please select a template</h5>\
571 <p>Cards are simple and flexible forms where you can store passwords or any other confidential data.</p>\
572 <p>Start choosing one of the templates below. You can always customize your cards later by adding or removing fields.</p>",
573
574 'newRecordWizardBookmarkletConfigurationTitle': "Direct login",
575 'newRecordWizardBookmarkletConfigurationDescription':"\
576 <p>Paste below the configuration code generated by the Clipperz bookmarklet.</p>\
577 <p>A new card complete with a direct login to your web account will be created.</p>",
578
579 'newRecordWizardCreateButtonLabel': "Create",
580 'newRecordWizardCancelButtonLabel': "Cancel",
581
582 //Create new card - Donation splash
583 'donateSplashPanelTitle': "Support Clipperz, make a donation today!",
584 'donateSplashPanelDescription': "\
585 <!-- FIX CSS DONE! -->\
586 <p>A few good reasons to make a donation:</p>\
587 <ul>\
588 <li><p>support the development of new features</p></li>\
589 <li><p>keep Clipperz free</p></li>\
590 <li><p>show appreciation for our hard work</p></li>\
591 </ul>\
592 <p>For any further information, please visit our <a href=\"http://www.clipperz.com/donations\" target=\"_blank\">Donations page</a>.</p>\
593 <p><b>Ready to donate?</b></p>",
594
595 'donateCloseButtonLabel': "Not yet",
596 'donateDonateButtonLabel': "Yes",
597
598// Card templates
599'recordTemplates': {
600
601//Web password
602 'WebAccount': {
603 'title': "Web password",
604 'description':"<p>A simple card to store login credentials for your online services.</p>",
605 'fields': [
606 {label:"Web address", type:'URL'},
607 {label:"Username or email", type:'TXT'},
608 {label:"Password", type:'PWD'}
609 ]
610 },
611
612 //Bank account
613 'BankAccount': {
614 'title': "Bank account",
615 'description':"<p>Safely store your bank account number and online banking credentials.</p>",
616 'fields': [
617 {label:"Bank", type:'TXT'},
618 {label:"Account number", type:'TXT'},
619 {label:"Bank website", type:'URL'},
620 {label:"Online banking ID", type:'TXT'},
621 {label:"Online banking password", type:'PWD'}
622 ]
623 },
624
625 // Credit card
626 'CreditCard': {
627 'title': "Credit card",
628 'description':"<p>Card number, expire date, CVV2 and PIN always at hand with Clipperz.</p>",
629 'fields': [
630 {label:"Type (Visa, AmEx, …)", type:'TXT'},
631 {label:"Number", type:'TXT'},
632 {label:"Owner name", type:'TXT'},
633 {label:"Expiry date", type:'TXT'},
634 {label:"CVV2", type:'TXT'},
635 {label:"PIN", type:'PWD'},
636 {label:"Card website", type:'URL'},
637 {label:"Username", type:'TXT'},
638 {label:"Password", type:'PWD'}
639 ]
640 },
641
642 // Address book entry
643 'AddressBookEntry': {
644 'title': "Address book entry",
645 'description':"<p>Clipperz could also work as your new private address book. Use this template to easily add a new entry.</p>",
646 'fields': [
647 {label:"Name", type:'TXT'},
648 {label:"Email", type:'TXT'},
649 {label:"Phone", type:'TXT'},
650 {label:"Mobile", type:'TXT'},
651 {label:"Address", type:'ADDR'}
652 ]
653 },
654
655//Custom card
656 'Custom': {
657 'title': "Custom card",
658 'description':"<p>No matter which kind of confidential data you need to protect, create a custom card to match your needs.</p>",
659 'fields': [
660 {label:"Label 1", type:'TXT'},
661 {label:"Label 2", type:'TXT'},
662 {label:"Label 3", type:'TXT'}
663 ]
664 }
665},
666
667
668'recordFieldTypologies': {
669 'TXT': {
670 description: "simple text field",
671 shortDescription: "text"
672 },
673 'PWD': {
674 description: "simple text field, with default status set to hidden",
675 shortDescription: "password"
676 },
677 'URL': {
678 description: "simple text field in edit mode, that became an active url in view mode",
679 shortDescription: "web address"
680 },
681 'DATE': {
682 description: "a value set with a calendar helper",
683 shortDescription: "date"
684 },
685 'ADDR': {
686 description: "just like the URL, but the active link points to Google Maps (or similar service) passing the address value as argument",
687 shortDescription: "street address"
688 },
689 'CHECK': {
690 description: "check description",
691 shortDescription: "check"
692 },
693 'RADIO': {
694 description: "radio description",
695 shortDescription: "radio"
696 },
697 'SELECT': {
698 description: "select description",
699 shortDescription: "select"
700 }
701},
702
703// Cards block - new card - warnings
704 'newRecordPanelGeneralExceptionTitle': "Error",
705 'newRecordPanelGeneralExceptionMessage': "The configuration text is not valid. Make sure to get your text from the bookmarklet pop-up and retry.",
706 'newRecordPanelWrongBookmarkletVersionExceptionTitle': "Error",
707 'newRecordPanelWrongBookmarkletVersionExceptionMessage':"The configuration text has been generated by an old version of the bookmarklet. Please update your bookmarklet and retry.",
708 'newRecordPanelExceptionPanelCloseButtonLabel': "Cancel",
709
710// Cards block - delete card
711 'mainPanelDeletingRecordPanelConfirmationTitle': "Deleting selected card",
712 'mainPanelDeleteRecordPanelConfirmationText': "Do your really want to delete the selected card?",
713 'mainPanelDeleteRecordPanelConfirmButtonLabel': "Yes",
714 'mainPanelDeleteRecordPanelDenyButtonLabel': "No",
715 'mainPanelDeletingRecordPanelInitialTitle': "Deleting selected card",
716 'mainPanelDeletingRecordPanelInitialText': "---",
717 'mainPanelDeletingRecordPanelCompletedText': "Done",
718
719// Cards block - delete card panel
720 'deleteRecordPanelCollectRecordDataMessageTitle': "Delete card",
721 'deleteRecordPanelCollectRecordDataMessageText': "Updating card list",
722 'deleteRecordPanelEncryptUserDataMessageTitle': "Delete card",
723 'deleteRecordPanelEncryptUserDataMessageText': "Local encryption of card headers",
724 'deleteRecordPanelSendingDataToTheServerMessageTitle': "Delete card",
725 'deleteRecordPanelSendingDataToTheServerMessageText': "Uploading encrypted card headers to Clipperz",
726 'deleteRecordPanelUpdatingTheInterfaceMessageTitle': "Delete card",
727 'deleteRecordPanelUpdatingTheInterfaceMessageText': "Updating the interface",
728
729// Cards block - no record selected
730 'recordDetailNoRecordSelectedTitle': "No card selected",
731 'recordDetailNoRecordSelectedDescription': "<p>Please select a card from the list on the left.</p>",
732
733 // Cards block - loading messages
734 'recordDetailLoadingRecordMessage': "Downloading encrypted card from Clipperz",
735 'recordDetailDecryptingRecordMessage': "Local decryption of card\'s data",
736 'recordDetailLoadingRecordVersionMessage': "Downloading latest card version",
737 'recordDetailDecryptingRecordVersionMessage': "Local decryption of latest version",
738 'recordDetailLoadingErrorMessageTitle': "Error while downloading the card",
739
740// Cards block - card details
741 'recordDetailNotesLabel': "Notes",
742 'recordDetailLabelFieldColumnLabel': "Field label",
743 'recordDetailDataFieldColumnLabel': "Field data",
744 'recordDetailTypeFieldColumnLabel': "Type",
745
746 'recordDetailSavingChangesMessagePanelInitialTitle': "Saving card",
747 'recordDetailSavingChangesMessagePanelInitialText': "---",
748
749 'recordDetailRemoveFieldButtonLabel': "-",
750 'recordDetailAddFieldButtonLabel': "Add new field",
751 'recordDetailPasswordFieldHelpLabel': "click the stars to select the password and then Ctrl-C to copy",
752
753 'recordDetailPasswordFieldScrambleLabel': "scramble",
754 'recordDetailPasswordFieldUnscrambleLabel': "unscramble",
755
756 'recordDetailDirectLoginBlockTitle': "Direct logins",
757 'recordDetailNewDirectLoginDescription': "<p>Direct login configuration</p>",
758
759 'recordDetailDirectLoginBlockNoDirectLoginConfiguredDescription':"\
760 <p>Does this card contain credentials to access an online service?</p>\
761 <p>Use the bookmarklet to configure a “direct login” from Clipperz with just one click!</p>",
762
763 'recordDetailDeleteDirectLoginButtonLabel': "-",
764 'recordDetailAddNewDirectLoginButtonLabel': "Add new direct login",
765
766 'recordDetailEditButtonLabel': "Edit",
767 'recordDetailSaveButtonLabel': "Save",
768 'recordDetailCancelButtonLabel': "Cancel",
769
770 'newRecordTitleLabel': "_new card_",
771 'newDirectLoginLabelSuffix': "",
772
773// Cards block - save card panel
774 'recordSaveChangesPanelCollectRecordInfoMessageTitle': "Save card",
775 'recordSaveChangesPanelCollectRecordInfoMessageText': "Updating card headers",
776 'recordSaveChangesPanelEncryptUserDataMessageTitle': "Save card",
777 'recordSaveChangesPanelEncryptUserDataMessageText': "Local encryption of card headers",
778 'recordSaveChangesPanelEncryptRecordDataMessageTitle': "Save card",
779 'recordSaveChangesPanelEncryptRecordDataMessageText': "Local encryption of card's data",
780 'recordSaveChangesPanelEncryptRecordVersionDataMessageTitle':"Save card",
781 'recordSaveChangesPanelEncryptRecordVersionDataMessageText':"Local encryption of card's version data",
782 'recordSaveChangesPanelSendingDataToTheServerMessageTitle': "Save card",
783 'recordSaveChangesPanelSendingDataToTheServerMessageText': "Uploading encrypted card's header to Clipperz",
784 'recordSaveChangesPanelUpdatingTheInterfaceMessageTitle': "Save card",
785 'recordSaveChangesPanelUpdatingTheInterfaceMessageText': "Updating the interface",
786
787 //Password Generator strings
788 'passwordGeneratorPanelTitle': "Password generator",
789 'passwordGeneratorPanelOkLabel': "Ok",
790 'passwordGeneratorPanelCancelLabel': "Cancel",
791
792 'passwordGeneratorLowercaseLabel': "abc",
793 'passwordGeneratorUppercaseLabel': "ABC",
794 'passwordGeneratorNumberLabel': "012",
795 'passwordGeneratorSymbolLabel': "@#$",
796
797 'passwordGeneratorLengthLabel': "length:",
798
799
800 //Miscellaneous strings
801
802 'comingSoon': "coming soon …",
803 'panelCollectingEntryopyMessageText': "Collecting entropy",
804 'directLoginConfigurationCheckBoxFieldSelectedValue': "Yes",
805 'directLoginConfigurationCheckBoxFieldNotSelectedValue': "No",
806
807
808
809// NEW - Import panel
810 'importFormats':{
811 'CSV': {
812 'label': "CSV",
813 'description':"<p>A widely recognized file format that stores tabular data. Several password managers can export data to this format.</p>"
814 },
815 'Excel': {
816 'label': "Excel",
817 'description':"<p>The popular spreadsheet from Microsoft. Storing passwords in Excel files is very common but not advisable.</p>"
818 },
819 'KeePass': {
820 'label': "KeePass",
821 'description':"<p>The custom TXT file created by KeePass password manager.</p>"
822 },
823 'PasswordPlus': {
824 'label': "Password Plus",
825 'description':"<p>The custom CSV format produced by Password Plus, a password manager mostly used on mobile devices.</p>"
826 },
827 'Roboform': {
828 'label': "RoboForm",
829 'description':"<p>The special HTML file created by Roboform password manager when displaying Passcard and Safenotes for printing.</p>"
830 },
831 'ClipperzExport': {
832 'label': "JSON",
833 'description':"<p>The file created by Clipperz itself in JSON format. It preserves all information contained in your cards, even direct login configurations.</p>"
834 }
835},
836
837 //JSON
838 'Clipperz_ImportWizard_Title': "JSON import",
839 'importOptions_clipperz_description': "<p>Open the JSON file exported from Clipperz in a text editor. Then copy and paste its content to the text area below.</p>",
840
841 //CSV
842 'CSV_ImportWizard_Title': "CSV import",
843 'importOptions_csv_description_': "\
844 <p>Open the CSV file in a text editor. Then copy and paste its content to the text area below.</p>\
845 <p>Please select the special characters used within your file.</p>",
846
847 //Excel
848 'Excel_ImportWizard_Title': "Excel import",
849 'importOptions_excel_description_': "<p>Open the Excel file and select the cells you want to import. Then copy and paste them to the text area below.</p>",
850
851 //KeePass
852 'KeePass_ImportWizard_Title': "KeePass import",
853 'importOptions_keePass_description_': "<p>Open the TXT file created by Keepass in a text editor. Then copy and paste its content to the text area below.</p>",
854
855 //PasswordPlus
856 'PasswordPlus_ImportWizard_Title': "Password Plus import",
857 'importOptions_passwordPlus_description':"<p>Open the CSV file created by PasswordPlus in a text editor. Then copy and paste its content to the text area below.</p>",
858
859 //RoboForm
860 'RoboForm_ImportWizard_Title': "RoboForm import",
861 'importOptions_roboForm_description': "<p>Open the HTML file created by RoboForm in a text editor. Then copy and paste its content to the text area below.</p>",
862
863
864 'importData_parsingDataTitle': "Import",
865 'importData_parsingDataText': "Parsing data …",
866
867 'importData_previewingDataTitle': "Import",
868 'importData_previewingDataText': "Processing data …",
869
870 'importData_processingDataTitle': "Import",
871 'importData_processingDataText': "Creating new cards …",
872
873'ImportWizard': {
874 'EDIT': "edit",
875 'PREVIEW': "preview",
876 'IMPORT': "import",
877
878 'KEEPASS_SETTINGS': "settings",
879
880 'CSV_EDIT': "paste",
881 'CSV_COLUMNS': "columns",
882 'CSV_HEADER': "labels",
883 'CSV_TITLE': "titles",
884 'CSV_NOTES': "notes",
885 'CSV_FIELDS': "types",
886
887 'EXCEL_EDIT': "edit"
888},
889
890 'CSV_ImportWizard_Columns': "<p>Select the columns you want to import.</p>",
891 'CSV_ImportWizard_Header': "<p>If the first row of the CSV file contains field labels, tick off the checkbox below.</p>",
892 'CSV_ImportWizard_Header_Settings_firstRowHeaderLabel':"Use the first row as labels?",
893 'CSV_ImportWizard_Title': "<p>Select the column that contains titles of the cards you are importing. (mandatory)</p>",
894 'CSV_ImportWizard_Notes': "<p>Select the column that represents a \"notes\" field. (optional)</p>",
895 'CSV_ImportWizard_Notes_Settings_noSelectionLabel': "\"notes\" field not present",
896 'CSV_ImportWizard_Fields': "<p>Select the correct type for each column from the drop down lists.</p>",
897 'CSV_ImportWizard_Fields_MissingLabelWarning': "Missing label",
898
899 'importData_importConfirmation_title': "Import",
900 'importData_importConfirmation_text': "Do you want to import __numberOfRecords__ cards?",
901
902
903 //Vulnerability warning
904 'VulnerabilityWarning_Panel_title': "Vulnerability warning",
905 'VulnerabilityWarning_Panel_message': "The action as been aborted due to a catched vulnerability",
906 'VulnerabilityWarning_Panel_buttonLabel':"Close",
907
908
909
910 //All the loginInfo panel infos
911
912 'WELCOME_BACK': "Welcome back!",
913
914 'currentConnectionText': "You are connected from ip&nbsp;__ip__, apparently from __country__, using __browser__ on __operatingSystem__.",
915 'latestConnectionText': "Your latest connection was __elapsedTimeDescription__ (__time__) from ip&nbsp;__ip__, apparently from __country__, using __browser__ on __operatingSystem__.",
916
917 'fullLoginHistoryLinkLabel': "show login history",
918
919'elapsedTimeDescriptions': {
920 'MORE_THAN_A_MONTH_AGO': "more than a month ago",
921 'MORE_THAN_A_WEEK_AGO': "more than a week ago",
922 'MORE_THAN_*_WEEKS_AGO': "more than __elapsed__ weeks ago",
923 'YESTERDAY': "yesterday",
924 '*_DAYS_AGO': "__elapsed__ days ago",
925 'ABOUT_AN_HOUR_AGO': "about an hour ago",
926 '*_HOURS_AGO': "__elapsed__ hours ago",
927 'JUST_A_FEW_MINUTES_AGO': "just a few minutes ago",
928 'ABOUT_*_MINUTES_AGO': "about __elapsed__ minutes ago"
929},
930
931 'unknown_ip': "unknown",
932
933'countries': {
934 '--': "unknown",
935 'AD': "Andorra",
936 'AE': "United Arab Emirates",
937 'AF': "Afghanistan",
938 'AG': "Antigua and Barbuda",
939 'AI': "Anguilla",
940 'AL': "Albania",
941 'AM': "Armenia",
942 'AN': "Netherlands Antilles",
943 'AO': "Angola",
944 'AP': "Non-Spec Asia Pas Location",
945 'AR': "Argentina",
946 'AS': "American Samoa",
947 'AT': "Austria",
948 'AU': "Australia",
949 'AW': "Aruba",
950 'AX': "Aland Islands",
951 'AZ': "Azerbaijan",
952 'BA': "Bosnia and Herzegowina",
953 'BB': "Barbados",
954 'BD': "Bangladesh",
955 'BE': "Belgium",
956 'BF': "Burkina Faso",
957 'BG': "Bulgaria",
958 'BH': "Bahrain",
959 'BI': "Burundi",
960 'BJ': "Benin",
961 'BM': "Bermuda",
962 'BN': "Brunei Darussalam",
963 'BO': "Bolivia",
964 'BR': "Brazil",
965 'BS': "Bahamas",
966 'BT': "Bhutan",
967 'BW': "Botswana",
968 'BY': "Belarus",
969 'BZ': "Belize",
970 'CA': "Canada",
971 'CD': "Congo the Democratic Republic of the",
972 'CF': "Central African Republic",
973 'CH': "Switzerland",
974 'CI': "Cote D'ivoire",
975 'CK': "Cook Islands",
976 'CL': "Chile",
977 'CM': "Cameroon",
978 'CN': "China",
979 'CO': "Colombia",
980 'CR': "Costa Rica",
981 'CS': "Serbia and Montenegro",
982 'CU': "Cuba",
983 'CY': "Cyprus",
984 'CZ': "Czech Republic",
985 'DE': "Germany",
986 'DJ': "Djibouti",
987 'DK': "Denmark",
988 'DO': "Dominican Republic",
989 'DZ': "Algeria",
990 'EC': "Ecuador",
991 'EE': "Estonia",
992 'EG': "Egypt",
993 'ER': "Eritrea",
994 'ES': "Spain",
995 'ET': "Ethiopia",
996 'EU': "European Union",
997 'FI': "Finland",
998 'FJ': "Fiji",
999 'FM': "Micronesia Federated States of",
1000 'FO': "Faroe Islands",
1001 'FR': "France",
1002 'GA': "Gabon",
1003 'GB': "United Kingdom",
1004 'GD': "Grenada",
1005 'GE': "Georgia",
1006 'GF': "French Guiana",
1007 'GG': "Guernsey",
1008 'GH': "Ghana",
1009 'GI': "Gibraltar",
1010 'GL': "Greenland",
1011 'GM': "Gambia",
1012 'GP': "Guadeloupe",
1013 'GR': "Greece",
1014 'GT': "Guatemala",
1015 'GU': "Guam",
1016 'GW': "Guinea-Bissau",
1017 'GY': "Guyana",
1018 'HK': "Hong Kong",
1019 'HN': "Honduras",
1020 'HR': "Croatia (Local Name: Hrvatska)",
1021 'HT': "Haiti",
1022 'HU': "Hungary",
1023 'ID': "Indonesia",
1024 'IE': "Ireland",
1025 'IL': "Israel",
1026 'IM': "Isle of Man",
1027 'IN': "India",
1028 'IO': "British Indian Ocean Territory",
1029 'IQ': "Iraq",
1030 'IR': "Iran (Islamic Republic of)",
1031 'IS': "Iceland",
1032 'IT': "Italy",
1033 'JE': "Jersey",
1034 'JM': "Jamaica",
1035 'JO': "Jordan",
1036 'JP': "Japan",
1037 'KE': "Kenya",
1038 'KG': "Kyrgyzstan",
1039 'KH': "Cambodia",
1040 'KI': "Kiribati",
1041 'KN': "Saint Kitts and Nevis",
1042 'KR': "Korea Republic of",
1043 'KW': "Kuwait",
1044 'KY': "Cayman Islands",
1045 'KZ': "Kazakhstan",
1046 'LA': "Lao People's Democratic Republic",
1047 'LB': "Lebanon",
1048 'LC': "Saint Lucia",
1049 'LI': "Liechtenstein",
1050 'LK': "Sri Lanka",
1051 'LR': "Liberia",
1052 'LS': "Lesotho",
1053 'LT': "Lithuania",
1054 'LU': "Luxembourg",
1055 'LV': "Latvia",
1056 'LY': "Libyan Arab Jamahiriya",
1057 'MA': "Morocco",
1058 'MC': "Monaco",
1059 'MD': "Moldova Republic of",
1060 'MG': "Madagascar",
1061 'MH': "Marshall Islands",
1062 'MK': "Macedonia the Former Yugoslav Republic of",
1063 'ML': "Mali",
1064 'MM': "Myanmar",
1065 'MN': "Mongolia",
1066 'MO': "Macau",
1067 'MP': "Northern Mariana Islands",
1068 'MR': "Mauritania",
1069 'MS': "Montserrat",
1070 'MT': "Malta",
1071 'MU': "Mauritius",
1072 'MV': "Maldives",
1073 'MW': "Malawi",
1074 'MX': "Mexico",
1075 'MY': "Malaysia",
1076 'MZ': "Mozambique",
1077 'NA': "Namibia",
1078 'NC': "New Caledonia",
1079 'NF': "Norfolk Island",
1080 'NG': "Nigeria",
1081 'NI': "Nicaragua",
1082 'NL': "Netherlands",
1083 'NO': "Norway",
1084 'NP': "Nepal",
1085 'NR': "Nauru",
1086 'NU': "Niue",
1087 'NZ': "New Zealand",
1088 'OM': "Oman",
1089 'PA': "Panama",
1090 'PE': "Peru",
1091 'PF': "French Polynesia",
1092 'PG': "Papua New Guinea",
1093 'PH': "Philippines",
1094 'PK': "Pakistan",
1095 'PL': "Poland",
1096 'PR': "Puerto Rico",
1097 'PS': "Palestinian Territory Occupied",
1098 'PT': "Portugal",
1099 'PW': "Palau",
1100 'PY': "Paraguay",
1101 'QA': "Qatar",
1102 'RO': "Romania",
1103 'RS': "Serbia",
1104 'RU': "Russian Federation",
1105 'RW': "Rwanda",
1106 'SA': "Saudi Arabia",
1107 'SB': "Solomon Islands",
1108 'SC': "Seychelles",
1109 'SD': "Sudan",
1110 'SE': "Sweden",
1111 'SG': "Singapore",
1112 'SI': "Slovenia",
1113 'SK': "Slovakia (Slovak Republic)",
1114 'SL': "Sierra Leone",
1115 'SM': "San Marino",
1116 'SN': "Senegal",
1117 'SR': "Suriname",
1118 'SV': "El Salvador",
1119 'SY': "Syrian Arab Republic",
1120 'SZ': "Swaziland",
1121 'TC': "Turks and Caicos Islands",
1122 'TG': "Togo",
1123 'TH': "Thailand",
1124 'TJ': "Tajikistan",
1125 'TM': "Turkmenistan",
1126 'TN': "Tunisia",
1127 'TO': "Tonga",
1128 'TR': "Turkey",
1129 'TT': "Trinidad and Tobago",
1130 'TV': "Tuvalu",
1131 'TW': "Taiwan Province of China",
1132 'TZ': "Tanzania United Republic of",
1133 'UA': "Ukraine",
1134 'UG': "Uganda",
1135 'US': "United States",
1136 'UY': "Uruguay",
1137 'UZ': "Uzbekistan",
1138 'VA': "Holy See (Vatican City State)",
1139 'VE': "Venezuela",
1140 'VG': "Virgin Islands (British)",
1141 'VI': "Virgin Islands (U.S.)",
1142 'VN': "Viet Nam",
1143 'VU': "Vanuatu",
1144 'WF': "Wallis and Futuna Islands",
1145 'WS': "Samoa",
1146 'YE': "Yemen",
1147 'ZA': "South Africa",
1148 'ZM': "Zambia",
1149 'ZW': "Zimbabwe",
1150 'ZZ': "Reserved"
1151},
1152
1153'browsers': {
1154 'UNKNOWN': "Unknown",
1155 'MSIE': "Internet Explorer",
1156 'FIREFOX': "Firefox",
1157 'OPERA': "Opera",
1158 'SAFARI': "Safari",
1159 'OMNIWEB': "OmniWeb",
1160 'CAMINO': "Camino",
1161 'CHROME': "Chrome"
1162},
1163
1164'operatingSystems': {
1165 'UNKNOWN': "Unknown",
1166 'WINDOWS': "Windows",
1167 'MAC': "Mac",
1168 'LINUX': "Linux",
1169 'IPHONE': "iPhone",
1170 'MOBILE': "Mobile",
1171 'OPENBSD': "OpenBSD",
1172 'FREEBSD': "FreeBSD",
1173 'NETBSD': "NetBSD"
1174},
1175
1176
1177 //Calendar texts
1178'calendarStrings': {
1179 'months': {
1180 '0':"January",
1181 '1':"February",
1182 '2':"March",
1183 '3':"April",
1184 '4':"May",
1185 '5':"June",
1186 '6':"July",
1187 '7':"August",
1188 '8':"September",
1189 '9':"October",
1190 '10':"November",
1191 '11':"December"
1192 },
1193 'shortMonths':{
1194 '0':"Jan",
1195 '1':"Feb",
1196 '2':"Mar",
1197 '3':"Apr",
1198 '4':"May",
1199 '5':"Jun",
1200 '6':"Jul",
1201 '7':"Aug",
1202 '8':"Sep",
1203 '9':"Oct",
1204 '10':"Nov",
1205 '11':"Dec"
1206 },
1207
1208 'days':{
1209 '0':"Sunday",
1210 '1':"Monday",
1211 '2':"Tuesday",
1212 '3':"Wednesday",
1213 '4':"Thursday",
1214 '5':"Friday",
1215 '6':"Saturday"
1216 },
1217
1218 'shortDays':{
1219 '0':"Sun",
1220 '1':"Mon",
1221 '2':"Tue",
1222 '3':"Wed",
1223 '4':"Thu",
1224 '5':"Fri",
1225 '6':"Sat"
1226 },
1227
1228 'veryShortDays':{
1229 '0':"Su",
1230 '1':"Mo",
1231 '2':"Tu",
1232 '3':"We",
1233 '4':"Th",
1234 '5':"Fr",
1235 '6':"Sa"
1236 },
1237
1238 'amDesignation':"am",
1239 'pmDesignation':"pm"
1240
1241},
1242
1243// Date format
1244 'fullDate_format':"l, F d, Y H:i:s",
1245*/
1246//################################################################################
1247/*
1248'pageHeader': {
1249 'donation':"donAte",
1250 'forum':"foRum",
1251 'credits':"creDits",
1252 'feedback':"feeDback",
1253 'help': "hElp"
1254},
1255
1256
1257'bookmarkletCopy': {
1258 'noExceptionMessage':"The direct login configuration has been collected.",
1259 'exceptionMessage': "Sorry! There was an error while processing the page.",
1260 'copy': "copy",
1261 'successfulMessage':"DONE!",
1262 'failMessage': "Failed! :("
1263},
1264*/
1265//################################################################################
1266
1267'Wizards': {
1268 'DirectLoginWizard': {
1269 'LABEL': {
1270 'name': "label",
1271 'description': "Enter a name for your new direct login."
1272 },
1273 'TYPE': {
1274 'name': "type",
1275 'description': "short description of the different types of direct login available"
1276 },
1277 'CONFIGURATION': {
1278 'name': "config", //"bookmarklet config",
1279 'description': "Paste the code collected by the bookmarklet. (To install the bookmarklet drag the link below to the bookmark bar of your browser.)"
1280 },
1281 'BINDINGS': {
1282 'name': "bindings",
1283 'description': "Select the right value for each field from the drop down menus."
1284 },
1285 'FAVICON': {
1286 'name': "favicon",
1287 'description': "If you are not satisfied with the small icon for this direct login, enter the URL of a new image file (.ico, .png, .jpg)."
1288 },
1289 'DONE': {
1290 'name': "done",
1291 'description': "Congratulations! You have created a new direct login using credentials contained in your '__cardName__' card.\nEnjoy 1-clik access to '__directLoginName__'!"
1292 }
1293 },
1294 'NewUserWizard': {
1295 'CREDENTIALS': {
1296 'name': "credentials",
1297 'description': "[choose you credentials]"
1298 },
1299 'CHECK_CREDENTIALS': {
1300 'name': "check credentials",
1301 'description': "[check credentials]"
1302 },
1303 'TERMS_OF_SERVICE': {
1304 'name': "terms of service",
1305 'description': "[terms of service]"
1306 },
1307 'CREATE_USER': {
1308 'name': "login",
1309 'description': "[create user]"
1310 }//,
1311/*
1312 'LOGIN': {
1313 'name': "login",
1314 'description': "[enjoy Clipperz]"
1315 },
1316*/
1317 }
1318},
1319
1320
1321'exceptionsMessages': {
1322 'Clipperz': {
1323 'Crypto': {
1324 'Base': {
1325 'exception': {
1326 'CorruptedMessage': "Corrupted message"
1327 }
1328 }
1329 }
1330 }
1331},
1332
1333
1334__syntaxFix__: "syntax fix"
1335
1336}
diff --git a/frontend/delta/js/Clipperz/PM/Toll.js b/frontend/delta/js/Clipperz/PM/Toll.js
new file mode 100644
index 0000000..e9c3092
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/Toll.js
@@ -0,0 +1,189 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
26
27//=============================================================================
28
29Clipperz.PM.Toll = function(args) {
30 args = args || {};
31
32 this._requestType = args.requestType;
33 this._targetValue = args.targetValue;
34 this._cost = args.cost;
35 this._toll = null;
36
37 return this;
38}
39
40Clipperz.PM.Toll.prototype = MochiKit.Base.update(null, {
41
42 'toString': function() {
43 return "Clipperz.PM.Toll (" + this.requestType() + ": " + this.cost() + " - " + ((this.toll() == null)? 'UNPAID' : 'PAID') + ")";
44 },
45
46 //-------------------------------------------------------------------------
47
48 'requestType': function() {
49 return this._requestType;
50 },
51
52 //-------------------------------------------------------------------------
53
54 'targetValue': function() {
55 return this._targetValue;
56 },
57
58 //-------------------------------------------------------------------------
59
60 'cost': function() {
61 return this._cost;
62 },
63
64 //-------------------------------------------------------------------------
65
66 'toll': function() {
67 return this._toll;
68 },
69
70 //-------------------------------------------------------------------------
71/*
72 '__pay': function() {
73 varresult;
74 vartargetData;
75 vartargetMatchSize;
76 var prefixMatchingBits;
77 varpayment;
78 var i;
79
80 if (this.toll() == null) {
81 i = 0;
82 targetData = new Clipperz.ByteArray("0x" + this.targetValue());
83 targetMatchSize = this.cost();
84
85 payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
86
87 do {
88 varpaymentData;
89
90 //payment = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32);
91 payment.increment();
92 paymentData = Clipperz.Crypto.SHA.sha256(payment);
93 // prefixMatchingBits = this.prefixMatchingBits(targetData, paymentData);
94 prefixMatchingBits = Clipperz.ByteArray.prefixMatchingBits(targetData, paymentData);
95 i++;
96 } while (prefixMatchingBits < targetMatchSize);
97
98 this._toll = payment.toHexString().substring(2)
99 }
100
101 return this;
102 },
103 */
104 //-------------------------------------------------------------------------
105
106 'innerDeferredPay': function (aTargetValue, aCost, aPayment) {
107 var deferredResult;
108 var result;
109 var payment;
110 var i;
111
112 result = null;
113 payment = aPayment;
114 i = 0;
115
116 while ((result == null) && (i < Clipperz.PM.Toll.numberOfCloseLoopIterations)) {
117 if (Clipperz.ByteArray.prefixMatchingBits(aTargetValue, Clipperz.Crypto.SHA.sha256(payment)) > aCost) {
118 result = payment;
119 } else {
120 payment.increment();
121 }
122
123 i ++;
124 }
125
126 if (result == null) {
127 deferredResult = MochiKit.Async.callLater(Clipperz.PM.Toll.pauseBetweenEachCloseLoop, MochiKit.Base.method(this, 'innerDeferredPay', aTargetValue, aCost, aPayment));
128 } else {
129 deferredResult = MochiKit.Async.succeed(result);
130 }
131
132 return deferredResult;
133 },
134
135 'deferredPay': function () {
136 vardeferredResult;
137 vartoll;
138
139 toll = this;
140 deferredResult = new Clipperz.Async.Deferred("Toll.deferredPay");
141//deferredResult.addLog("--->>> deferredPay - " + this.cost());
142 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'getRandomBytes', 32);
143 deferredResult.addMethod(toll, 'innerDeferredPay', new Clipperz.ByteArray("0x" + this.targetValue()), this.cost());
144 deferredResult.addCallback(MochiKit.Base.bind(function(aPayment) {
145 var result;
146
147 result = {
148 targetValue: this.targetValue(),
149 toll: aPayment.toHexString().substr(2)
150 };
151
152 return result;
153 }, this));
154//deferredResult.addLog("<<<--- deferredPay - " + this.cost());
155 deferredResult.callback();
156
157 return deferredResult;
158 },
159
160 //=========================================================================
161 __syntaxFix__: "syntax fix"
162
163});
164
165
166Clipperz.PM.Toll.validate = function(aTargetValue, aToll, aCost) {
167 var result;
168 vartollValue;
169 var targetValue;
170 var hashedTollValue;
171 var payedToll;
172
173 tollValue = new Clipperz.ByteArray("0x" + aToll);
174 targetValue = new Clipperz.ByteArray("0x" + aTargetValue);
175 hashedTollValue = Clipperz.Crypto.SHA.sha256(tollValue);
176
177 payedToll = Clipperz.ByteArray.prefixMatchingBits(targetValue, hashedTollValue);
178
179 if (payedToll < aCost) {
180 result = false;
181 } else {
182 result = true;
183 }
184
185 return result;
186};
187
188Clipperz.PM.Toll.numberOfCloseLoopIterations = 50;
189Clipperz.PM.Toll.pauseBetweenEachCloseLoop = 0.5; \ No newline at end of file
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js b/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js
new file mode 100644
index 0000000..df514a2
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/CardDetail.js
@@ -0,0 +1,142 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.CardDetail = React.createClass({
25
26 getDefaultProps: function () {
27 return {
28 // searchDelay: 0.3
29 }
30 },
31
32 propTypes: {
33 card: React.PropTypes.object.isRequired
34 },
35
36 getInitialState: function () {
37 return {
38 // showSearch: false,
39 // searchTimer: null,
40 starred: false
41 };
42 },
43
44 handleDirectLoginClick: function (aDirectLoginReference, anEvent) {
45 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'runDirectLogin', {record:this.props.card['reference'], directLogin:aDirectLoginReference});
46 },
47
48 //=========================================================================
49
50 normalizeFieldValue: function (aValue) {
51 varresult = [];
52 varrows = aValue.split('\n');
53
54 for (var i = 0; i < rows.length; i++) {
55 if (i > 0) {
56 result.push(React.DOM.br());
57 }
58 result.push(rows[i].replace(/[\s]/g, '\u00A0'));
59 }
60
61 return result;
62 },
63
64 renderField: function (aField) {
65//console.log("FIELD", aField);
66 varactionLabel;
67
68 if (aField['actionType'] == 'URL') {
69 actionLabel = "go";
70 } else if (aField['actionType'] == 'PASSWORD') {
71 actionLabel = "locked";
72 } else if (aField['actionType'] == 'EMAIL') {
73 actionLabel = "email";
74 } else {
75 actionLabel = "";
76 }
77
78 returnReact.DOM.div({className:'listItem ' + aField['actionType']}, [
79 React.DOM.div({className:'fieldWrapper'}, [
80 React.DOM.div({className:'fieldInnerWrapper'}, [
81 React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aField['label'])),
82 React.DOM.div({className:'valueWrapper'}, React.DOM.span({className:'value ' + aField['actionType']}, this.normalizeFieldValue(aField['value'])))
83 ])
84 ]),
85 React.DOM.div({className:'actionWrapper'}, [
86 React.DOM.div({className:aField['actionType']}, actionLabel)
87 ])
88 ]);
89 },
90
91 renderDirectLogin: function (aDirectLogin) {
92//console.log("DIRECT LOGIN", aDirectLogin);
93 returnReact.DOM.div({className:'listItem', onClick:MochiKit.Base.method(this, 'handleDirectLoginClick', aDirectLogin['reference'])}, [
94 React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aDirectLogin['label'])),
95 React.DOM.div({className:'faviconWrapper'}, React.DOM.img({className:'favicon', src:aDirectLogin['favicon']})),
96 React.DOM.div({className:'directLoginLinkWrapper'}, React.DOM.span({className:'directLoginLink'}, "go"))
97 ]);
98 },
99
100 handleBackClick: function (anEvent) {
101 window.history.back();
102 },
103
104 handleStarClick: function (anEvent) {
105 this.setState({starred: !this.state['starred']});
106 },
107
108 //=========================================================================
109
110 render: function () {
111 var card = this.props.card;
112 var starredStatus = (this.state['starred'] ? "starred" : "unstarred");
113
114 if ((typeof(card['fields']) != 'undefined') && (card['notes'] != '')) {
115 card['fields'].push({ 'actionType': 'NOTES', 'isHidden': false, 'label': "notes", 'reference': "notes", 'value': card['notes'] })
116 }
117
118 returnReact.DOM.div({className:'cardDetail'}, [
119 React.DOM.div({className:'header'}, [
120 React.DOM.div({className:'titleWrapper'}, React.DOM.div({className:'title'}, card.title)),
121 // React.DOM.div({className:'titleWrapper'}, React.DOM.div({className:'title'}, card.title + ' ' + card.title + ' ' + card.title + ' ' + card.title)),
122 React.DOM.div({className:'backWrapper'}, React.DOM.a({className:'button back', onClick:this.handleBackClick}, "back")),
123 React.DOM.div({className:'starWrapper'}, React.DOM.a({className:'star', onClick:this.handleStarClick}, starredStatus))
124 ]),
125 React.DOM.div({className:'content'}, [
126 card.fields ? React.DOM.div({className:'fields'}, MochiKit.Base.map(this.renderField, card.fields)) : null,
127 card.directLogins ? React.DOM.div({className:'directLogins'}, MochiKit.Base.map(this.renderDirectLogin,card.directLogins)): null
128 ]),
129 React.DOM.div({className:'footer'}, [
130 /*
131 // React.DOM.a({className:'cancel'}, "cancel"),
132 // React.DOM.a({className:'save'}, "save")
133
134 React.DOM.a({className:'cancel button'}, "failed"),
135 React.DOM.a({className:'save button'}, "done")
136*/
137 ])
138 ]);
139 }
140
141 //=========================================================================
142});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js b/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js
new file mode 100644
index 0000000..66d20f1
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/CardList.js
@@ -0,0 +1,161 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.CardList = React.createClass({
25
26 getDefaultProps: function () {
27 return {
28 selectedCard: null,
29 searchDelay: 0.3
30 }
31 },
32
33 propTypes: {
34 searchDelay: React.PropTypes.number
35 },
36
37 getInitialState: function () {
38 return {
39 showSearch: false,
40 searchTimer: null,
41 searchText: '',
42 // passphrase: '',
43 // pin: ''
44 };
45 },
46
47 //=========================================================================
48
49 toggleSearch: function (anEvent) {
50 varshowSearchBox;
51
52 showSearchBox = !this.state.showSearch;
53
54 this.setState({showSearch: showSearchBox});
55
56 if (showSearchBox) {
57 MochiKit.Async.callLater(0.1, MochiKit.Base.method(this, 'focusOnSearchField'));
58 }
59 },
60
61 updateSearchText: function (anEvent) {
62 varsearchText;
63
64 searchText = anEvent.target.value;
65//console.log(">>> updateSearchText", searchText);
66
67 if ((this.state['searchTimer'] != null) && (searchText != this.state['searchText'])) {
68 this.state['searchTimer'].cancel();
69 }
70
71 if (searchText != this.state['searchText']) {
72 this.state['searchText'] = searchText;
73 this.state['searchTimer'] = MochiKit.Async.callLater(this.props['searchDelay'], MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'searchCards', searchText);
74 }
75 },
76
77 focusOnSearchField: function () {
78console.log("focusOnSearchField", this.refs['searchField']);
79 this.refs['searchField'].getDOMNode.focus();
80 },
81
82 searchBox: function () {
83 var result;
84
85 if (this.state.showSearch) {
86 result =React.DOM.div({className:'searchBox'}, [
87 React.DOM.div(null, [
88 React.DOM.input({type:'search', placeholder:"search", ref:'searchField', onChange:this.updateSearchText})
89 ])
90 ]);
91 } else {
92 result = null;
93 }
94
95 return result;
96 },
97
98 //=========================================================================
99
100 cardItem: function (aRecordReference) {
101 varreference = aRecordReference['_reference'];
102 varselectedCard = (reference == this.props.selectedCard);
103
104 returnReact.DOM.div({className:'listItem', onClick:MochiKit.Base.method(this, 'handleClickOnCardDetail', reference)}, [
105 React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aRecordReference.label)),
106 // React.DOM.div({className:'labelWrapper'}, React.DOM.span({className:'label'}, aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label + ' ' + aRecordReference.label)),
107 React.DOM.div({className:'faviconWrapper'}, aRecordReference.favicon ? React.DOM.img({className:'favicon', src:aRecordReference.favicon}) : React.DOM.div({className:'favicon'}, '\u00A0')),
108 React.DOM.div({className:'detailLinkWrapper'}, React.DOM.span({className:'detailLink ' + (selectedCard ? 'icon-spin' : '')}, (selectedCard ? "loading" : "detail")))
109 ]);
110 },
111
112 handleClickOnCardDetail: function (aRecordReference, anEvent) {
113 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'showRecord', aRecordReference);
114 },
115
116 cardListItems: function () {
117 varlist;
118 varresult;
119
120 list = this.props['cardList'];
121
122 if (typeof(list) != 'undefined') {
123 result = MochiKit.Base.map(MochiKit.Base.method(this, 'cardItem'), list);
124 } else {
125 result = null;
126 }
127
128 return result;
129 },
130
131 //=========================================================================
132
133 handleChange: function (anEvent) {
134 // varrefs = this.refs;
135 // var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
136 // var newState = {};
137//
138 // newState[refName] = event.target.value;
139 // this.setState(newState);
140 },
141
142 //=========================================================================
143
144 render: function() {
145 returnReact.DOM.div(null, [
146 React.DOM.div({className:'header'}, [
147 React.DOM.a({className:'account'}, 'clipperz'),
148 React.DOM.div({className:'features'}, [
149 React.DOM.a({className:'addCard'}, 'add'),
150 React.DOM.a({className:'search ' + (this.state.showSearch ? 'selected' : ''), onClick:this.toggleSearch}, 'search'),
151 React.DOM.a({className:'settings'}, 'settings')
152 ]),
153 // this.searchBox()
154 ]),
155 this.searchBox(),
156 React.DOM.div({className:'content cardList'}, this.cardListItems()),
157 ]);
158 }
159
160 //=========================================================================
161});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js b/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js
new file mode 100644
index 0000000..a1979ec
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/ErrorPage.js
@@ -0,0 +1,46 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.ErrorPage = React.createClass({
25
26 getDefaultProps: function () {
27 return {
28 template: Clipperz.PM.UI.Components.PageTemplate
29 }
30 },
31
32 'propTypes': {
33 // type: React.PropTypes.oneOf(['PERMANENT', 'TEMPORARY']),
34 message:React.PropTypes.string.isRequired,
35 template:React.PropTypes.func
36 },
37
38
39 _render: function () {
40 returnReact.DOM.div({className:'error-message'}, this.props.message);
41 },
42
43 render: function () {
44 returnnew this.props.template({'innerComponent': this._render()});
45 }
46});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js b/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js
new file mode 100644
index 0000000..2b5b4a4
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/LoginForm.js
@@ -0,0 +1,150 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.LoginForm = React.createClass({
25
26 getDefaultProps: function () {
27 return {
28 mode: 'CREDENTIALS',
29 isNewUserRegistrationAvailable: false,
30 disabled: false,
31 template: Clipperz.PM.UI.Components.PageTemplate
32 }
33 },
34
35 propTypes: {
36 mode: React.PropTypes.oneOf(['CREDENTIALS','PIN']),
37 isNewUserRegistrationAvailable:React.PropTypes.bool,
38 disabled: React.PropTypes.bool,
39 template: React.PropTypes.func
40 },
41
42 getInitialState: function () {
43 return {
44 username: '',
45 passphrase: '',
46 pin: ''
47 };
48 },
49
50 //=========================================================================
51
52 handleChange: function (anEvent) {
53 varrefs = this.refs;
54 var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
55 var newState = {};
56
57 newState[refName] = event.target.value;
58 this.setState(newState);
59 },
60
61 //=========================================================================
62
63 handleCredentialSubmit: function (event) {
64 event.preventDefault();
65
66 this.refs['passphrase'].getDOMNode().blur();
67
68 var credentials = {
69 'username': this.refs['username'].getDOMNode().value,
70 'passphrase': this.refs['passphrase'].getDOMNode().value
71 }
72 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials);
73 },
74
75 handleRegistrationLinkClick: function (event) {
76 event.preventDefault();
77 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'showRegistrationForm');
78 },
79
80 //-------------------------------------------------------------------------
81
82 shouldEnableLoginButton: function () {
83 var result;
84
85 return(
86 ((this.state['username'] != '') && (this.state['passphrase'] != ''))
87 ||
88 (this.state['pin'] != '')
89 ) && !this.props['disabled'];
90 },
91
92
93 loginForm: function () {
94 registrationLink =React.DOM.div({'className':'registrationLink'}, [
95 React.DOM.a({'onClick':this.handleRegistrationLinkClick}, "Need an account")
96 ]);
97 returnReact.DOM.div({'className':'loginForm credentials'},[
98 React.DOM.form({onChange: this.handleChange, onSubmit:this.handleCredentialSubmit}, [
99 React.DOM.div(null,[
100 React.DOM.label({'for':'name'}, "username"),
101 React.DOM.input({'type':'text', 'name':'name', 'ref':'username', 'placeholder':"username", 'key':'username', 'autoCapitalize':'none'}),
102 React.DOM.label({'for':'passphrase'}, "passphrase"),
103 React.DOM.input({'type':'password', 'name':'passphrase', 'ref':'passphrase', 'placeholder':"passphrase", 'key':'passphrase'})
104 ]),
105 React.DOM.button({'type':'submit', 'disabled':!this.shouldEnableLoginButton(), 'className':'button'}, "login")
106 ]),
107 this.props.isNewUserRegistrationAvailable ? registrationLink : null
108 ]);
109 },
110
111 handlePINSubmit: function (event) {
112 event.preventDefault();
113
114 this.refs['pin'].getDOMNode().blur();
115
116 var credentials = {
117 pin: this.refs['pin'].getDOMNode().value
118 }
119
120 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', credentials);
121 },
122
123 pinForm: function () {
124 returnReact.DOM.div({'className':'loginForm pin'},[
125 React.DOM.form({onChange: this.handleChange, onSubmit:this.handlePINSubmit}, [
126 React.DOM.div(null,[
127 React.DOM.label({'for':'pin'}, "pin"),
128 React.DOM.input({'type':'text', 'name':'pin', 'ref':'pin', placeholder:"PIN", 'key':'pin', 'autocapitalize':'none'})
129 ]),
130 React.DOM.button({'type':'submit', 'disabled':this.props.disabled, 'className':'button'}, "login")
131 ])
132 ]);
133 },
134
135 setInitialFocus: function () {
136 if (this.props.mode == 'PIN') {
137 this.refs['pin'].getDOMNode().select();
138 } else {
139 if (this.refs['username'].getDOMNode().value == '') {
140 this.refs['username'].getDOMNode().focus();
141 } else{
142 this.refs['passphrase'].getDOMNode().select();
143 }
144 }
145 },
146
147 render: function() {
148 returnnew this.props.template({'innerComponent': this.props.mode == 'PIN' ? this.pinForm() : this.loginForm()});
149 }
150});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js b/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js
new file mode 100644
index 0000000..cc4a06c
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/Overlay.js
@@ -0,0 +1,122 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.Base.module('Clipperz.PM.UI.Components');
25
26Clipperz.PM.UI.Components.Overlay = function(args) {
27 args = args || {};
28
29 this._defaultDelay = 2;
30 this._element = MochiKit.DOM.getElement('overlay');
31
32 return this;
33}
34
35//=============================================================================
36
37Clipperz.Base.extend(Clipperz.PM.UI.Components.Overlay, Object, {
38
39 //-------------------------------------------------------------------------
40
41 'toString': function () {
42 return "Clipperz.PM.UI.Components.Overlay component";
43 },
44
45 'element': function () {
46 // return MochiKit.DOM.getElement('overlay');
47 return this._element;
48 },
49
50 'getElement': function (aClass) {
51 return MochiKit.Selector.findChildElements(this.element(), ['.'+aClass])[0];
52 },
53
54 //-------------------------------------------------------------------------
55
56 'show': function (aMessage) {
57 this.resetStatus();
58 this.setMessage(aMessage);
59 MochiKit.DOM.removeElementClass(this.element(), 'ios-overlay-hide');
60 MochiKit.DOM.addElementClass(this.element(), 'ios-overlay-show');
61 },
62
63 'done': function (aMessage, aDelayBeforeHiding) {
64 this.completed(this.showDoneIcon, aMessage, aDelayBeforeHiding);
65 },
66
67 'failed': function (aMessage, aDelayBeforeHiding) {
68 this.completed(this.showFailIcon, aMessage, aDelayBeforeHiding);
69 },
70
71 //-------------------------------------------------------------------------
72
73 'resetStatus': function () {
74 MochiKit.Style.showElement(this.element());
75 MochiKit.Style.showElement(this.getElement('spinner'));
76 MochiKit.Style.hideElement(this.getElement('done'));
77 MochiKit.Style.hideElement(this.getElement('failed'));
78 },
79
80 'setMessage': function (aMessage) {
81 if (typeof(aMessage) != 'undefined') {
82 this.getElement('title').innerHTML = aMessage;
83 }
84 },
85
86 'completed': function (aFunctionToShowResult, aMessage, aDelayBeforeHiding) {
87 var delay = aDelayBeforeHiding || this.defaultDelay();
88
89 this.hideSpinner();
90 MochiKit.Base.bind(aFunctionToShowResult, this)();
91 this.setMessage(aMessage);
92
93 MochiKit.Async.callLater(delay, MochiKit.Base.bind(this.hide, this))
94 },
95
96 'hide': function () {
97 MochiKit.DOM.removeElementClass(this.element(), 'ios-overlay-show');
98 MochiKit.DOM.addElementClass(this.element(), 'ios-overlay-hide');
99 MochiKit.Async.callLater(1, MochiKit.Style.hideElement, this.element());
100 },
101
102 'hideSpinner': function () {
103 MochiKit.Style.hideElement(this.getElement('spinner'));
104 },
105
106 'showDoneIcon': function () {
107 MochiKit.Style.showElement(this.getElement('done'));
108 },
109
110 'showFailIcon': function () {
111 MochiKit.Style.showElement(this.getElement('failed'));
112 },
113
114 //-------------------------------------------------------------------------
115
116 'defaultDelay': function () {
117 return this._defaultDelay;
118 },
119
120 //-------------------------------------------------------------------------
121 __syntaxFix__: "syntax fix"
122});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js b/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js
new file mode 100644
index 0000000..9b7c748
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/PageTemplate.js
@@ -0,0 +1,33 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.PageTemplate = React.createClass({
25 render: function() {
26 returnReact.DOM.div(null, [
27 React.DOM.div({'className': 'header'}, [
28 React.DOM.h1(null, "clipperz")
29 ]),
30 React.DOM.div({'className': 'content'}, this.props.innerComponent)
31 ])
32 }
33});
diff --git a/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js b/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js
new file mode 100644
index 0000000..051dcc5
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/Components/RegistrationWizard.js
@@ -0,0 +1,240 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.UI.Components.RegistrationWizard = React.createClass({
25
26 getDefaultProps: function () {
27 return {
28 steps: [
29 {name:'CREDENTIALS', label:'registration', _label:'credentials',description:"Choose your credentails"},
30 {name:'PASSWORD_VERIFICATION', label:'registration', _label:'verify', description:"Verify your passphrase"},
31 {name:'TERMS_OF_SERVICE', label:'registration', _label:'terms', description:"Check our terms of service"}
32 ],
33 disabled: false,
34 template: Clipperz.PM.UI.Components.PageTemplate
35 }
36 },
37
38 getInitialState: function () {
39 return {
40 currentStep: this.props['steps'][0]['name'],
41 username: '',
42 passphrase: '',
43 verify_passphrase: '',
44 no_password_recovery: false,
45 agree_terms_of_service: false
46 };
47 },
48
49 'propTypes': {
50 // steps: React.PropTypes.array,
51 disabled:React.PropTypes.bool,
52 template:React.PropTypes.func
53 },
54
55 //=========================================================================
56
57 currentStepIndex: function () {
58 return this.indexOfStepNamed(this.state['currentStep']);
59 },
60
61 indexOfStepNamed: function (aStepName) {
62 var stepConfiguration;
63 varresult;
64
65 stepConfiguration = this.props['steps'].filter(function (aConfig) { return aConfig['name'] == aStepName})[0];
66 result = this.props['steps'].indexOf(stepConfiguration);
67 return result;
68 },
69
70 //=========================================================================
71
72 statusClassForStep: function (aStep) {
73 varcurrentStepIndex = this.currentStepIndex();
74 var stepIndex = this.indexOfStepNamed(aStep['name']);
75 varresult;
76
77 if (stepIndex < currentStepIndex) {
78 result = 'left';
79 } else if (stepIndex == currentStepIndex) {
80 result = 'center';
81 } else {
82 result = 'right';
83 }
84
85 return result;
86 },
87
88 //=========================================================================
89
90 handleBackClick: function (anEvent) {
91 var nextStep;
92 anEvent.preventDefault();
93
94 if (this.currentStepIndex() > 0) {
95 nextStep = this.props['steps'][this.currentStepIndex() - 1];
96 this.setState({currentStep: nextStep['name']});
97 } else {
98 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'goBack');
99 }
100 },
101
102 handleForwardClick: function (anEvent) {
103 var nextStep;
104 anEvent.preventDefault();
105
106 if (this.canMoveForward()) {
107
108 if (this.currentStepIndex() < this.props['steps'].length - 1) {
109 nextStep = this.props['steps'][this.currentStepIndex() + 1];
110 this.setState({currentStep: nextStep['name']});
111 } else {
112 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'registerNewUser', {
113 username: this.state['username'],
114 passphrase: this.state['passphrase']
115 })
116 }
117 }
118 },
119
120 //-------------------------------------------------------------------------
121
122 canMoveForward: function () {
123 var result;
124 var currentStep;
125
126 result = false;
127 currentStep = this.state['currentStep'];
128 if (currentStep == 'CREDENTIALS') {
129 result = ((this.state['username'] != '') && (this.state['passphrase'] != ''));
130 } else if (currentStep == 'PASSWORD_VERIFICATION') {
131 result = (this.state['passphrase'] == this.state['verify_passphrase']);
132 } else if (currentStep == 'TERMS_OF_SERVICE') {
133 result = (this.state['no_password_recovery'] && this.state['agree_terms_of_service']);
134 }
135
136 return result && !this.props['disabled'];
137 },
138
139 //=========================================================================
140
141 handleChange: function (anEvent) {
142 varrefs = this.refs;
143 var refName = MochiKit.Base.filter(function (aRefName) { return refs[aRefName].getDOMNode() == anEvent.target}, MochiKit.Base.keys(this.refs))[0];
144 var newState = {};
145
146 if ((event.target.type == 'checkbox') || (event.target.type == 'radio')) {
147 newState[refName] = event.target.checked;
148 } else {
149 newState[refName] = event.target.value;
150 }
151 this.setState(newState);
152 },
153
154 //=========================================================================
155
156 renderIndexStep: function (aStep) {
157 returnReact.DOM.div({'className':'stepIndexItem ' + this.statusClassForStep(aStep)}, '.');
158 },
159
160 renderButtons: function () {
161 return [
162 React.DOM.a({className:'back button step_' + (this.currentStepIndex() - 1), onClick:this.handleBackClick}, '<<'),
163 React.DOM.a({className:'forward button step_' + (this.currentStepIndex() + 1) + ' ' + (this.canMoveForward() ? 'enabled' : 'disabled'), onClick:this.handleForwardClick}, '>>')
164 ];
165 },
166
167 render_CREDENTIALS: function () {
168 returnReact.DOM.div(null,[
169 React.DOM.label({'for':'name'}, "username"),
170 React.DOM.input({'type':'text', 'name':'name', 'ref':'username', 'placeholder':"username", 'key':'username', 'autoCapitalize':'none'/*, value:this.state.username*/}),
171 React.DOM.label({'for':'passphrase'}, "passphrase"),
172 React.DOM.input({'type':'password', 'name':'passphrase', 'ref':'passphrase', 'placeholder':"passphrase", 'key':'passphrase'/*, value:this.state.passphrase*/})
173 ]);
174 },
175
176 render_PASSWORD_VERIFICATION: function () {
177 returnReact.DOM.div(null,[
178 React.DOM.label({'for':'verify_passphrase'}, "passphrase"),
179 React.DOM.input({'type':'password', 'name':'verify_passphrase', 'ref':'verify_passphrase', 'placeholder':"verify passphrase", 'key':'verify_passphrase'})
180 ]);
181 },
182
183 render_TERMS_OF_SERVICE: function () {
184 returnReact.DOM.div(null, [
185 React.DOM.div({className:'checkboxBlock'}, [
186 React.DOM.label({'for':'no_password_recovery'}, "I understand that Clipperz will not be able to recover a lost passphrase."),
187 React.DOM.input({'type':'checkbox', 'name':'no_password_recovery', 'ref':'no_password_recovery', 'key':'no_password_recovery'}),
188 React.DOM.p(null, "I understand that Clipperz will not be able to recover a lost passphrase.")
189 ]),
190 React.DOM.div({className:'checkboxBlock'}, [
191 React.DOM.label({'for':'agree_terms_of_service'}, "I have read and agreed to the Terms of Service."),
192 React.DOM.input({'type':'checkbox', 'name':'agree_terms_of_service', 'ref':'agree_terms_of_service', 'key':'agree_terms_of_service'}),
193 React.DOM.p(null, [
194 "I have read and agreed to the ",
195 React.DOM.a({href:'https://clipperz.com/terms_service/', target:'_blank'}, "Terms of Service.")
196 ])
197 ])
198 ]);
199 },
200
201 renderStep: function (aStep) {
202 returnReact.DOM.div({'className':'step' + ' ' + aStep['name'] + ' ' + this.statusClassForStep(aStep) + ' step_' + this.currentStepIndex()}, [
203 React.DOM.h1(null, aStep['label']),
204 React.DOM.p(null, aStep['description']),
205 this['render_' + aStep['name']].apply(),
206 React.DOM.div({'className':'stepIndex'}, MochiKit.Base.map(this.renderIndexStep, this.props['steps'])),
207 React.DOM.div({'className':'buttons'}, this.renderButtons())
208 ]);
209 },
210
211 _render: function () {
212 returnReact.DOM.div({'className':'registrationForm'},[
213 React.DOM.form({onChange: this.handleChange}, [
214 React.DOM.div({'className':'steps'}, MochiKit.Base.map(this.renderStep, this.props['steps']))
215 ])
216 ]);
217 },
218
219 render: function () {
220 returnnew this.props.template({'innerComponent': this._render()});
221 },
222
223 //=========================================================================
224
225 setInitialFocus: function () {
226 this.refs['username'].getDOMNode().focus();
227 },
228
229 componentDidUpdate: function (prevProps, prevState, rootNode) {
230 if (prevState['currentStep'] != this.state['currentStep']) {
231 if (this.state['currentStep'] == 'CREDENTIALS') {
232 this.refs['passphrase'].getDOMNode().select();
233 } else if (this.state['currentStep'] == 'PASSWORD_VERIFICATION') {
234 this.refs['verify_passphrase'].getDOMNode().select();
235 }
236 }
237 }
238
239 //=========================================================================
240});
diff --git a/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js b/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js
new file mode 100644
index 0000000..d9dfe6d
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/DirectLoginController.js
@@ -0,0 +1,256 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.Base.module('Clipperz.PM.UI');
25
26Clipperz.PM.UI.DirectLoginRunner = function(args) {
27 this._directLogin = args['directLogin'] || Clipperz.Base.exception.raise('MandatoryParameter');
28 this._target = Clipperz.PM.Crypto.randomKey();
29
30 return this;
31}
32
33MochiKit.Base.update(Clipperz.PM.UI.DirectLoginRunner.prototype, {
34
35 'toString': function() {
36 return "Clipperz.PM.UI.DirectLoginRunner";
37 },
38
39 //-----------------------------------------------------------------------------
40
41 'directLogin': function () {
42 return this._directLogin;
43 },
44
45 //-----------------------------------------------------------------------------
46
47 'target': function () {
48 return this._target;
49 },
50
51 //=============================================================================
52
53 'setWindowTitle': function (aWindow, aTitle) {
54 aWindow.document.title = aTitle;
55 },
56
57 'setWindowBody': function (aWindow, anHTML) {
58 aWindow.document.body.innerHTML = anHTML;
59 },
60
61 //=============================================================================
62
63 'initialWindowSetup': function (aWindow) {
64 this.setWindowTitle(aWindow, "Loading Clipperz Direct Login");
65 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3("Loading Clipperz Direct Login ...")));
66 },
67
68 //-----------------------------------------------------------------------------
69
70 'updateWindowWithDirectLoginLabel': function (aWindow, aLabel) {
71 var titleText;
72 var bodyText;
73
74 titleText = "Loading '__label__' Direct Login".replace(/__label__/, aLabel)
75 bodyText = "Loading '__label__' Direct Login... ".replace(/__label__/, aLabel)
76
77 this.setWindowTitle(aWindow, titleText);
78 this.setWindowBody (aWindow, MochiKit.DOM.toHTML(MochiKit.DOM.H3(bodyText)));
79 },
80
81 //-----------------------------------------------------------------------------
82
83 'updateWindowWithHTMLContent': function (aWindow, anHtml) {
84 this.setWindowBody(aWindow, anHtml);
85 },
86
87 //=============================================================================
88
89 'submitLoginForm': function(aWindow, aSubmitFunction) {
90 MochiKit.DOM.withWindow(aWindow, MochiKit.Base.bind(function () {
91 var formElement;
92 var submitButtons;
93
94 formElement = MochiKit.DOM.getElement('directLoginForm');
95
96 submitButtons = MochiKit.Base.filter(function(anInputElement) {
97 return ((anInputElement.tagName.toLowerCase() == 'input') && (anInputElement.getAttribute('type').toLowerCase() == 'submit'));
98 }, formElement.elements);
99
100 if (submitButtons.length == 0) {
101 if (typeof(formElement.submit) == 'function') {
102 formElement.submit();
103 } else {
104 aSubmitFunction.apply(formElement);
105 }
106/*
107 varformSubmitFunction;
108
109 formSubmitFunction = MochiKit.Base.method(formElement, 'submit');
110 if (Clipperz_IEisBroken == true) {
111 formElement.submit();
112 } else {
113 formSubmitFunction();
114 }
115*/
116 } else {
117 submitButtons[0].click();
118 }
119 }, this));
120 },
121
122 //-------------------------------------------------------------------------
123
124 'runSubmitFormDirectLogin': function (aWindow, someAttributes) {
125 var html;
126 var formElement;
127 var submitFunction;
128
129 formElement = MochiKit.DOM.FORM({
130 'id':'directLoginForm',
131 'method':someAttributes['formAttributes']['method'],
132 'action':someAttributes['formAttributes']['action']
133 });
134
135 submitFunction = formElement.submit;
136
137 MochiKit.DOM.appendChildNodes(formElement, MochiKit.Base.map(function (anInputAttributes) {
138 return MochiKit.DOM.INPUT({'type':'hidden', 'name':anInputAttributes[0], 'value':anInputAttributes[1]});
139 }, MochiKit.Base.items(someAttributes['inputValues'])));
140
141 html ='';
142 html += '<h3>Loading ' + someAttributes['label'] + ' ...</h3>';
143 html +=MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV(), MochiKit.DOM.appendChildNodes(MochiKit.DOM.DIV({style:'display:none; visibility:hidden;'}), formElement)).innerHTML;
144
145 this.updateWindowWithHTMLContent(aWindow, html);
146 this.submitLoginForm(aWindow, submitFunction);
147 },
148
149 //-------------------------------------------------------------------------
150
151 'runHttpAuthDirectLogin': function(aWindow, someAttributes) {
152 var completeUrl;
153 var url;
154
155 url = someAttributes['inputValues']['url'];
156
157 if (/^https?\:\/\//.test(url) == false) {
158 url = 'http://' + url;
159 }
160
161 if (Clipperz_IEisBroken === true) {
162 completeUrl = url;
163 } else {
164 var username;
165 var password;
166
167 username = someAttributes['inputValues']['username'];
168 password = someAttributes['inputValues']['password'];
169 /(^https?\:\/\/)?(.*)/.test(url);
170
171 completeUrl = RegExp.$1 + username + ':' + password + '@' + RegExp.$2;
172 }
173
174 window.open(completeUrl, this.target());
175 },
176
177 //=============================================================================
178
179 'runDirectLogin': function (aWindow) {
180 var deferredResult;
181
182 deferredResult = new Clipperz.Async.Deferred("DirectLoginRunner.openDirectLogin", {trace:false});
183 deferredResult.addMethod(this, 'initialWindowSetup', aWindow);
184 deferredResult.addMethod(this.directLogin(), 'label');
185 deferredResult.addMethod(this, 'updateWindowWithDirectLoginLabel', aWindow);
186 deferredResult.collectResults({
187 'type': MochiKit.Base.method(this.directLogin(), 'type'),
188 'label': MochiKit.Base.method(this.directLogin(), 'label'),
189 'formAttributes':MochiKit.Base.method(this.directLogin(), 'formAttributes'),
190 'inputValues': MochiKit.Base.method(this.directLogin(), 'inputValues')
191 });
192 deferredResult.addCallback(MochiKit.Base.bind(function (someAttributes) {
193 switch (someAttributes['type']) {
194 case 'http_auth':
195 this.runHttpAuthDirectLogin(aWindow, someAttributes);
196 break;
197 case 'simple_url':
198 this.runSimpleUrlDirectLogin(aWindow, someAttributes);
199 break;
200 default:
201 this.runSubmitFormDirectLogin(aWindow, someAttributes);
202 break;
203 }
204 }, this));
205 deferredResult.callback();
206
207 return deferredResult;
208 },
209
210 //=============================================================================
211
212 'run': function () {
213 var newWindow;
214
215 newWindow = window.open(Clipperz.PM.Strings.getValue('directLoginJumpPageUrl'), this.target());
216
217 return this.runDirectLogin(newWindow);
218 },
219
220 //=============================================================================
221
222 'test': function () {
223 var iFrame;
224 var newWindow;
225
226 iFrame = MochiKit.DOM.createDOM('iframe');
227 MochiKit.DOM.appendChildNodes(MochiKit.DOM.currentDocument().body, iFrame);
228
229 newWindow = iFrame.contentWindow;
230
231 return this.runDirectLogin(newWindow);
232 },
233
234 //=============================================================================
235 __syntaxFix__: "syntax fix"
236});
237
238//-----------------------------------------------------------------------------
239
240Clipperz.PM.UI.DirectLoginRunner.openDirectLogin = function (aDirectLogin) {
241 varrunner;
242
243 runner = new Clipperz.PM.UI.DirectLoginRunner({directLogin:aDirectLogin});
244 return runner.run();
245};
246
247//-----------------------------------------------------------------------------
248
249Clipperz.PM.UI.DirectLoginRunner.testDirectLogin = function (aDirectLogin) {
250 varrunner;
251
252 runner = new Clipperz.PM.UI.DirectLoginRunner({directLogin:aDirectLogin});
253 return runner.test();
254};
255
256//-----------------------------------------------------------------------------
diff --git a/frontend/delta/js/Clipperz/PM/UI/MainController.js b/frontend/delta/js/Clipperz/PM/UI/MainController.js
new file mode 100644
index 0000000..da7540e
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/PM/UI/MainController.js
@@ -0,0 +1,491 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.Base.module('Clipperz.PM.UI');
25
26Clipperz.PM.UI.MainController = function() {
27 var pages;
28
29 this._proxy = null;
30 this._user = null;
31 this._filter= '';
32
33 //this._currentPage = 'loadingPage';
34
35 this._pageStack = ['loadingPage'];
36 this._overlay = new Clipperz.PM.UI.Components.Overlay();
37 pages = {
38 'loginPage': new Clipperz.PM.UI.Components.LoginForm(),
39 'registrationPage':new Clipperz.PM.UI.Components.RegistrationWizard(),
40 'cardListPage': new Clipperz.PM.UI.Components.CardList(),
41 'cardDetailPage':new Clipperz.PM.UI.Components.CardDetail({card: {}}),
42 'errorPage': new Clipperz.PM.UI.Components.ErrorPage({message:''})
43 };
44
45 MochiKit.Base.map(function (anId) {React.renderComponent(pages[anId], MochiKit.DOM.getElement(anId))}, MochiKit.Base.keys(pages));
46 this._pages = pages;
47 this.registerForNotificationCenterEvents();
48
49 return this;
50}
51
52MochiKit.Base.update(Clipperz.PM.UI.MainController.prototype, {
53
54 toString: function () {
55 return "Clipperz.PM.UI.MainController";
56 },
57
58 //=========================================================================
59
60 overlay: function () {
61 return this._overlay;
62 },
63
64 loginForm: function () {
65 return this._loginForm;
66 },
67
68 registrationWizard: function () {
69 return this._registrationWizard;
70 },
71
72 //=========================================================================
73
74 isOnline: function() {
75 return navigator.onLine;
76 },
77
78 hasLocalData: function() {
79 return false;
80 },
81
82 loginMode: function () {
83 //PIN is set using this command:
84 //Clipperz.PM.PIN.setCredentialsWithPIN('1234', {'username':'joe', 'passphrase':'clipperz'});
85
86 return Clipperz.PM.PIN.isSet() ? 'PIN' : 'CREDENTIALS';
87 },
88
89 //=========================================================================
90
91 pages: function () {
92 return this._pages;
93 },
94
95 pageStack: function () {
96 return this._pageStack;
97 },
98
99 //=========================================================================
100
101 selectInitialProxy: function () {
102 if (this.isOnline()) {
103 this._proxy = Clipperz.PM.Proxy.defaultProxy;
104 } else {
105 if (this.hasLocalData()) {
106 this._proxy = new Clipperz.PM.Proxy.Offline({dataStore: new Clipperz.PM.Proxy.Offline.LocalStorageDataStore(), shouldPayTolls:false});
107 } else {
108 this.showOfflineError();
109 }
110 }
111 },
112
113 proxy: function () {
114 return this._proxy;
115 },
116
117 //=========================================================================
118
119 registerForNotificationCenterEvents: function () {
120 var events= ['doLogin', 'registerNewUser', 'showRegistrationForm', 'goBack', 'showRecord', 'searchCards', 'runDirectLogin'];
121 var self= this;
122
123 MochiKit.Base.map(function (anEvent) {
124 MochiKit.Signal.connect(Clipperz.Signal.NotificationCenter, anEvent, MochiKit.Base.method(self, anEvent));
125 }, events);
126
127 // MochiKit.Signal.connect(window, 'onpopstate', MochiKit.Base.method(this, 'historyGoBack'));
128 MochiKit.Signal.connect(window, 'onbeforeunload',MochiKit.Base.method(this, 'shouldExitApp'));
129 },
130
131 //-------------------------------------------------------------------------
132
133 run: function (parameters) {
134 var shouldShowRegistrationForm;
135
136 this.selectInitialProxy();
137 shouldShowRegistrationForm = parameters['shouldShowRegistrationForm'] && this.proxy().canRegisterNewUsers();
138 this.pages()['loginPage'].setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()});
139
140 if (shouldShowRegistrationForm) {
141 this.showRegistrationForm();
142 } else {
143 this.showLoginForm();
144 }
145 this.overlay().done("", 0.5);
146 },
147
148 //-------------------------------------------------------------------------
149
150 showLoginForm: function () {
151 varloginFormPage;
152
153 loginFormPage = this.pages()['loginPage'];
154 loginFormPage.setProps({'mode':this.loginMode(), 'isNewUserRegistrationAvailable': this.proxy().canRegisterNewUsers()});
155 this.moveInPage(this.currentPage(), 'loginPage');
156 MochiKit.Async.callLater(0.5, MochiKit.Base.method(loginFormPage, 'setInitialFocus'));
157 },
158
159 showRegistrationForm: function () {
160 var currentPage;
161 varregistrationPage;
162
163 currentPage = this.currentPage();
164 registrationPage = this.pages()['registrationPage'];
165 this.setCurrentPage('loginPage');
166 registrationPage.setProps({});
167 this.moveInPage(currentPage, 'registrationPage');
168 MochiKit.Async.callLater(0.5, MochiKit.Base.method(registrationPage, 'setInitialFocus'));
169 },
170
171 //=========================================================================
172
173 doLogin: function (event) {
174 varcredentials;
175 var getPassphraseDelegate;
176 varuser;
177
178 user = null;
179
180 this.overlay().show("logging in");
181 this.pages()['loginPage'].setProps({disabled:true});
182
183 if ('pin' in event) {
184 credentials = Clipperz.PM.PIN.credentialsWithPIN(event['pin']);
185 } else {
186 credentials = event;
187 }
188 getPassphraseDelegate = MochiKit.Base.partial(MochiKit.Async.succeed, credentials.passphrase);
189 user = new Clipperz.PM.DataModel.User({'username':credentials.username, 'getPassphraseFunction':getPassphraseDelegate});
190
191 deferredResult = new Clipperz.Async.Deferred('MainController.doLogin', {trace:false});
192 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
193 deferredResult.addMethod(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'deferredEntropyCollection');
194 deferredResult.addMethod(user, 'login');
195 deferredResult.addMethod(Clipperz.PM.PIN, 'resetFailedAttemptCount');
196 deferredResult.addMethod(this, 'setUser', user);
197
198 // deferredResult.addMethod(this, 'setupApplication');
199 deferredResult.addMethod(this, 'runApplication');
200 deferredResult.addMethod(this.overlay(), 'done', "", 1);
201 deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event));
202 deferredResult.addErrback(MochiKit.Base.bind(function (anEvent, anError) {
203 if (anError['isPermanent'] != true) {
204 this.pages()['loginPage'].setProps({disabled:false, 'mode':this.loginMode()});
205 this.pages()['loginPage'].setInitialFocus();
206 }
207 return anError;
208 }, this, event))
209 deferredResult.callback();
210
211 return deferredResult;
212 },
213
214 //-------------------------------------------------------------------------
215
216 registerNewUser: function (credentials) {
217 vardeferredResult;
218
219 this.overlay().show("creating user");
220
221 this.pages()['registrationPage'].setProps({disabled:true});
222 deferredResult = new Clipperz.Async.Deferred('MainController.registerNewUser', {trace:false});
223 deferredResult.addCallback(Clipperz.PM.DataModel.User.registerNewAccount,
224 credentials['username'],
225 MochiKit.Base.partial(MochiKit.Async.succeed, credentials['passphrase'])
226 );
227 deferredResult.addMethod(this, 'doLogin', credentials);
228 deferredResult.addErrback(MochiKit.Base.method(this, 'genericErrorHandler', event));
229 deferredResult.addErrback(MochiKit.Base.bind(function (anError) {
230 if (anError['isPermanent'] != true) {
231 this.pages()['registrationPage'].setProps({disabled:false});
232 this.pages()['registrationPage'].setInitialFocus();
233 }
234 return anError;
235 }, this));
236
237 deferredResult.callback();
238
239 return deferredResult;
240
241 },
242
243 //-------------------------------------------------------------------------
244
245 user: function () {
246 return this._user;
247 },
248
249 setUser: function (aUser) {
250 this._user = aUser;
251 return this._user;
252 },
253
254 //=========================================================================
255
256 allCardInfo: function () {
257 var deferredResult;
258 varcardInfo;
259
260 cardInfo = {
261 '_rowObject': MochiKit.Async.succeed,
262 '_reference': MochiKit.Base.methodcaller('reference'),
263 '_searchableContent':MochiKit.Base.methodcaller('searchableContent'),
264 'label': MochiKit.Base.methodcaller('label'),
265 'favicon': MochiKit.Base.methodcaller('favicon')
266 };
267
268 deferredResult = new Clipperz.Async.Deferred('MainController.allCardInfo', {trace:false});
269 deferredResult.addMethod(this.user(), 'getRecords');
270 deferredResult.addCallback(MochiKit.Base.map, Clipperz.Async.collectResults("CardList.value - collectResults", cardInfo, {trace:false}));
271 deferredResult.addCallback(Clipperz.Async.collectAll);
272 deferredResult.callback();
273
274 return deferredResult;
275 },
276
277 filterCards: function (someCardInfo) {
278 var filter;
279 varfilterRegExp;
280 varresult;
281
282 filter = this.filter().replace(/[^A-Za-z0-9]/g, "\\$&");
283 filterRegExp = new RegExp(filter, "i");
284 result = MochiKit.Base.filter(function (aCardInfo) { return filterRegExp.test(aCardInfo['_searchableContent'])}, someCardInfo);
285
286 return result;
287 },
288
289 sortCards: function (someCardInfo) {
290 return someCardInfo.sort(Clipperz.Base.caseInsensitiveKeyComparator('label'));
291 },
292
293 showRecordList: function () {
294 var deferredResult;
295
296 deferredResult = new Clipperz.Async.Deferred('MainController.showRecordList', {trace:false});
297 deferredResult.addMethod(this, 'allCardInfo');
298 deferredResult.addMethod(this, 'filterCards');
299 deferredResult.addMethod(this, 'sortCards');
300 deferredResult.addCallback(MochiKit.Base.bind(function (someRecordInfo) {
301 this.pages()['cardListPage'].setProps({cardList: someRecordInfo});
302 }, this));
303 deferredResult.callback();
304
305 return deferredResult;
306 },
307
308 filter: function (){
309 return this._filter;
310 },
311
312 setFilter: function (aValue) {
313 this._filter = aValue;
314 },
315
316 searchCards: function (someParameters) {
317//console.log("SEARCH CARDS", someParameters);
318 this.setFilter(someParameters);
319 this.showRecordList();
320 },
321
322 //=========================================================================
323
324 runApplication: function () {
325 MochiKit.Signal.connect(window, 'onpopstate',MochiKit.Base.method(this, 'historyGoBack'));
326 this.moveInPage(this.currentPage(), 'cardListPage');
327 return this.showRecordList();
328 },
329
330 showRecord: function (aRecordReference) {
331//console.log("Show Record", aRecordReference);
332 vardeferredResult;
333
334 this.pages()['cardListPage'].setProps({selectedCard:aRecordReference});
335 deferredResult = new Clipperz.Async.Deferred('MainController.runApplication', {trace:false});
336 // deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']);
337 deferredResult.addMethod(this.user(), 'getRecord', aRecordReference);
338 deferredResult.addMethodcaller('content');
339 deferredResult.addCallback(MochiKit.Base.bind(function (aCard) {
340//console.log("CARD DETAILS", aCard);
341 this.pages()['cardDetailPage'].setProps({card: aCard});
342 this.pages()['cardListPage'].setProps({selectedCard: null});
343 }, this));
344 deferredResult.addMethod(this, 'moveInPage', this.currentPage(), 'cardDetailPage', true);
345 deferredResult.callback();
346
347 return deferredResult;
348 },
349
350 runDirectLogin: function (someParameters) {
351console.log("RUN DIRECT LOGIN", someParameters);
352 vardeferredResult;
353
354 // this.pages()['cardListPage'].setProps({selectedCard:aRecordReference});
355 deferredResult = new Clipperz.Async.Deferred('MainController.runDirectLogin', {trace:false});
356 // deferredResult.addMethod(this.user(), 'getRecord', aRecordReference['_reference']);
357 deferredResult.addMethod(this.user(), 'getRecord', someParameters['record']);
358 deferredResult.addMethodcaller('directLoginWithReference', someParameters['directLogin']);
359 deferredResult.addCallback(Clipperz.PM.UI.DirectLoginRunner.openDirectLogin);
360 deferredResult.callback();
361
362 return deferredResult;
363 },
364
365 shouldExitApp: function (anEvent) {
366console.log("SHOULD EXIT APP");
367 anEvent.preventDefault();
368 anEvent.stopPropagation();
369 },
370
371 //=========================================================================
372
373 genericErrorHandler: function (anEvent, anError) {
374 var errorMessage;
375 varresult;
376
377 result = anError;
378 errorMessage = "login failed";
379
380 if (anError['isPermanent'] === true) {
381 this.pages()['errorPage'].setProps({message:anError.message});
382 this.moveInPage(this.currentPage(), 'errorPage');
383 errorMessage = "failure";
384 } else {
385 if ('pin' in anEvent) {
386 errorCount = Clipperz.PM.PIN.recordFailedAttempt();
387 if (errorCount == -1) {
388 errorMessage = "PIN resetted";
389 }
390 }
391 }
392 this.overlay().failed(errorMessage, 1);
393
394 return result;
395 },
396
397 //=========================================================================
398
399 slidePage: function (fromPage, toPage, direction) {
400 varfromPosition;
401 var toPosition;
402
403 if (direction == "LEFT") {
404 fromPosition = 'right';
405 toPosition = 'left'
406 } else {
407 fromPosition = 'left';
408 toPosition = 'right'
409 }
410
411 MochiKit.DOM.addElementClass(fromPage, toPosition + ' transition');
412
413 MochiKit.DOM.addElementClass(toPage, fromPosition);
414 MochiKit.DOM.removeElementClass(toPage, toPosition);
415 MochiKit.DOM.addElementClass(toPage, 'transition');
416 MochiKit.Async.callLater(0.1, function () {
417 MochiKit.DOM.removeElementClass(toPage, fromPosition);
418 })
419
420 MochiKit.Async.callLater(0.5, function () {
421 MochiKit.DOM.removeElementClass(fromPage, 'transition');
422 MochiKit.DOM.removeElementClass(toPage, 'transition');
423 })
424 },
425
426 rotateInPage: function (fromPage, toPage) {
427 //Broken! :(
428 MochiKit.DOM.addElementClass(MochiKit.DOM.getElement('mainDiv'), 'show-right');
429 },
430
431 //.........................................................................
432
433 goBack: function () {
434 varfromPage;
435 var toPage;
436
437 fromPage = this.pageStack().shift();
438 toPage = this.currentPage();
439 this.pages()[toPage].setProps({});
440 this.moveOutPage(fromPage, toPage);
441 },
442
443 historyGoBack: function (anEvent) {
444 anEvent.preventDefault();
445 anEvent.stopPropagation();
446 this.goBack();
447 },
448
449 currentPage: function () {
450 return this.pageStack()[0];
451 },
452
453 setCurrentPage: function (aPage) {
454 this.pageStack().unshift(aPage);
455 },
456
457 moveInPage: function (fromPage, toPage, addToHistory) {
458 varshouldAddItemToHistory;
459
460 shouldAddItemToHistory = typeof(addToHistory) == 'undefined' ? false : addToHistory;
461
462 this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'LEFT');
463 this.setCurrentPage(toPage);
464
465 if (shouldAddItemToHistory) {
466//console.log("ADD ITEM TO HISTORY");
467//console.log("ADD ITEM TO HISTORY - window", window);
468//console.log("ADD ITEM TO HISTORY - window.history", window.history);
469 window.history.pushState({'fromPage': fromPage, 'toPage': toPage});
470 //# window.history.pushState();
471//console.log("ADDED ITEM TO HISTORY");
472 } else {
473//console.log("Skip HISTORY");
474 }
475 },
476
477 moveOutPage: function (fromPage, toPage) {
478 this.slidePage(MochiKit.DOM.getElement(fromPage), MochiKit.DOM.getElement(toPage), 'RIGHT');
479 this.setCurrentPage(toPage);
480 },
481
482 //=========================================================================
483/*
484 wrongAppVersion: function (anError) {
485 // this.pages()['errorPage'].setProps({message:anError.message});
486 // this.moveInPage('errorPage', this.currentPage());
487 },
488*/
489 //=========================================================================
490 __syntaxFix__: "syntax fix"
491});
diff --git a/frontend/delta/js/Clipperz/Set.js b/frontend/delta/js/Clipperz/Set.js
new file mode 100644
index 0000000..b3831a4
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Set.js
@@ -0,0 +1,162 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24
25if (typeof(Clipperz) == 'undefined') {
26 Clipperz = {};
27}
28
29//#############################################################################
30
31Clipperz.Set = function(args) {
32 args = args || {};
33 //MochiKit.Base.bindMethods(this);
34
35 if (args.items != null) {
36 this._items = args.items.slice();
37 } else {
38 this._items = [];
39 }
40
41 return this;
42}
43
44//=============================================================================
45
46Clipperz.Set.prototype = MochiKit.Base.update(null, {
47
48 //-------------------------------------------------------------------------
49
50 'toString': function() {
51 return "Clipperz.Set";
52 },
53
54 //-------------------------------------------------------------------------
55
56 'items': function() {
57 return this._items;
58 },
59
60 //-------------------------------------------------------------------------
61
62 'popAnItem': function() {
63 var result;
64
65 if (this.size() > 0) {
66 result = this.items().pop();
67 } else {
68 result = null;
69 }
70
71 return result;
72 },
73
74 //-------------------------------------------------------------------------
75
76 'allItems': function() {
77 return this.items();
78 },
79
80 //-------------------------------------------------------------------------
81
82 'contains': function(anItem) {
83 return (this.indexOf(anItem) != -1);
84 },
85
86 //-------------------------------------------------------------------------
87
88 'indexOf': function(anItem) {
89 varresult;
90 vari, c;
91
92 result = -1;
93
94 c = this.items().length;
95 for (i=0; (i<c) && (result == -1); i++) {
96 if (this.items()[i] === anItem) {
97 result = i;
98 }
99 }
100
101 return result;
102 },
103
104 //-------------------------------------------------------------------------
105
106 'add': function(anItem) {
107 if (anItem.constructor == Array) {
108 MochiKit.Base.map(MochiKit.Base.bind(this,add, this), anItem);
109 } else {
110 if (! this.contains(anItem)) {
111 this.items().push(anItem);
112 }
113 }
114 },
115
116 //-------------------------------------------------------------------------
117
118 'debug': function() {
119 vari, c;
120
121 result = -1;
122
123 c = this.items().length;
124 for (i=0; i<c; i++) {
125 alert("[" + i + "] " + this.items()[i].label);
126 }
127 },
128
129 //-------------------------------------------------------------------------
130
131 'remove': function(anItem) {
132 if (anItem.constructor == Array) {
133 MochiKit.Base.map(MochiKit.Base.bind(this.remove, this), anItem);
134 } else {
135 varitemIndex;
136
137 itemIndex = this.indexOf(anItem);
138 if (itemIndex != -1) {
139 this.items().splice(itemIndex, 1);
140 }
141 }
142 },
143
144 //-------------------------------------------------------------------------
145
146 'size': function() {
147 return this.items().length;
148 },
149
150 //-------------------------------------------------------------------------
151
152 'empty': function() {
153 this.items().splice(0, this.items().length);
154 },
155
156 //-------------------------------------------------------------------------
157
158 __syntaxFix__: "syntax fix"
159
160 //-------------------------------------------------------------------------
161});
162
diff --git a/frontend/delta/js/Clipperz/Signal.js b/frontend/delta/js/Clipperz/Signal.js
new file mode 100644
index 0000000..f9b74c9
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Signal.js
@@ -0,0 +1,66 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; }
26
27Clipperz.Signal.VERSION = "0.1";
28Clipperz.Signal.NAME = "Clipperz.Signal";
29
30MochiKit.Base.update(Clipperz.Signal, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'fireNativeEvent': function(element, eventName) {
47 if (element.fireEvent) {
48 // MSIE
49 element.fireEvent(eventName);
50 } else {
51 // W3C
52 var event;
53
54 event = document.createEvent("HTMLEvents");
55 event.initEvent(eventName.replace(/^on/, ""), true, true);
56 element.dispatchEvent(event);
57 }
58 },
59
60 //-------------------------------------------------------------------------
61 __syntaxFix__: "syntax fix"
62
63});
64
65Clipperz.Signal.NotificationCenter = {};
66
diff --git a/frontend/delta/js/Clipperz/Style.js b/frontend/delta/js/Clipperz/Style.js
new file mode 100644
index 0000000..acbe71b
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Style.js
@@ -0,0 +1,89 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; }
26
27Clipperz.Style.VERSION = "0.1";
28Clipperz.Style.NAME = "Clipperz.DOM";
29
30MochiKit.Base.update(Clipperz.Style, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'applyZebraStylesToTable': function(aTable) {
47 var tbody;
48 var tbodyRows;
49 var i,c;
50
51 tbody = MochiKit.DOM.getFirstElementByTagAndClassName('tbody', null, aTable);
52 tbodyRows = tbody.childNodes;
53 // tbodyRows = MochiKit.DOM.getElementsByTagAndClassName('tr', null, tbody)
54 c = tbodyRows.length;
55 for (i=0; i<c; i++) {
56 var element;
57
58 element = YAHOO.Element.get(tbodyRows[i]);
59 element.addClass(((i%2 == 0) ? "zebra_odd": "zebra_even"));
60 element.removeClass(((i%2 == 1) ? "zebra_odd": "zebra_even"));
61 }
62 },
63
64 //-------------------------------------------------------------------------
65
66 'getSizeAndPosition': function (anElement) {
67 var result;
68
69 if (anElement != null) {
70 result ={ dimensions:MochiKit.Style.getElementDimensions(anElement), position:MochiKit.Style.getElementPosition(anElement)};
71 } else {
72 result ={ dimensions:MochiKit.Style.getViewportDimensions(), position:MochiKit.Style.getViewportPosition()};
73 }
74
75 return result;
76 },
77
78 'setBackgroundGradient': function (anElement, someParameters) {
79 // background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ff9955), to(#ff6622), color-stop(1,#333333));
80 // background: -moz-linear-gradient(0% 100% 90deg,#ff6622, #ff9955);
81 MochiKit.Style.setStyle(anElement, {'background': '-webkit-gradient(linear, 0% 0%, 0% 100%, from(' + someParameters['from'] + '), to(' + someParameters['to'] + '), color-stop(1,#333333))'});
82 MochiKit.Style.setStyle(anElement, {'background': '-moz-linear-gradient(0% 100% 90deg,' + someParameters['to'] + ', ' + someParameters['from'] + ')'});
83 },
84
85 //-------------------------------------------------------------------------
86 __syntaxFix__: "syntax fix"
87
88});
89
diff --git a/frontend/delta/js/Clipperz/Visual.js b/frontend/delta/js/Clipperz/Visual.js
new file mode 100644
index 0000000..93ed725
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/Visual.js
@@ -0,0 +1,363 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; }
26
27Clipperz.Visual.VERSION = "0.1";
28Clipperz.Visual.NAME = "Clipperz.Visual";
29
30MochiKit.Base.update(Clipperz.Visual, {
31
32 //-------------------------------------------------------------------------
33
34 '__repr__': function () {
35 return "[" + this.NAME + " " + this.VERSION + "]";
36 },
37
38 //-------------------------------------------------------------------------
39
40 'toString': function () {
41 return this.__repr__();
42 },
43
44 //-------------------------------------------------------------------------
45
46 'deferredResize': function (anElement, someOptions) {
47 var deferredResult;
48 var moveTransition;
49 var scaleTransition;
50 var duration;
51
52 duration = someOptions.duration || 0.5;
53
54 deferredResult = new Clipperz.Async.Deferred("Visual.deferredResize", {trace:false});
55 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
56
57 moveTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
58 scaleTransition = MochiKit.Visual.Transitions.linear;//MochiKit.Visual.Transitions.sinoidal;
59
60 MochiKit.Style.setElementPosition(anElement, {x:someOptions.from.position.x, y:someOptions.from.position.y }, 'px');
61
62 new MochiKit.Visual.Parallel([
63 new MochiKit.Visual.Move(anElement, {x:someOptions.to.position.x, y:someOptions.to.position.y, mode:'absolute', transition:moveTransition, sync:true}),
64 new Clipperz.Visual.Resize(anElement, {fromSize:{h:someOptions.from.dimensions.h, w:someOptions.from.dimensions.w}, toSize:{h:someOptions.to.dimensions.h, w:someOptions.to.dimensions.w}, transition:scaleTransition, scaleContent:false, scaleFromCenter:false, restoreAfterFinish:true, sync:true})
65 ], {duration:duration, afterFinish:MochiKit.Base.method(deferredResult, 'callback')})
66
67 return deferredResult;
68 },
69
70 //-------------------------------------------------------------------------
71
72 'deferredAnimation': function (anAnimation, someParameters, someOptions) {
73 vardeferredResult;
74 var afterFinishCallback;
75 var options;
76
77 deferredResult = new Clipperz.Async.Deferred("Clipperz.Visual.deferredAnimation", {trace:false});
78 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
79
80 if (MochiKit.Base.isUndefinedOrNull(someOptions)) {
81 options = {}
82 } else {
83 options = someOptions;
84 }
85
86 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
87 options['afterFinish'] = MochiKit.Base.noop;
88 }
89
90 MochiKit.Base.update(options, {
91 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
92 });
93
94 new anAnimation(someParameters, options);
95
96 return deferredResult;
97 },
98
99 //-------------------------------------------------------------------------
100
101 'deferredAnimations': function (aSinchronizationType, someAnimations, someOptions) {
102 var deferredResult;
103 varoptions;
104
105 deferredResult = new Clipperz.Async.Deferred("Visual.deferredParallelAnimations", {trace:false});
106 deferredResult.addCallback(MochiKit.Async.succeed, arguments[arguments.length - 1]);
107
108 options = someOptions;
109 if (MochiKit.Base.isUndefinedOrNull(someOptions['afterFinish'])) {
110 options['afterFinish'] = MochiKit.Base.noop;
111 }
112 MochiKit.Base.update(options, {
113 'afterFinish': MochiKit.Base.compose(options['afterFinish'], MochiKit.Base.method(deferredResult, 'callback'))
114 });
115
116 new aSinchronizationType(someAnimations, options)
117
118 return deferredResult;
119 },
120
121 //-------------------------------------------------------------------------
122 __syntaxFix__: "syntax fix"
123
124});
125
126//#############################################################################
127
128/** @id Clipperz.Visual.Resize */
129Clipperz.Visual.Resize = function (element, percent, options) {
130 var cls = arguments.callee;
131 if (!(this instanceof cls)) {
132 return new cls(element, percent, options);
133 }
134 this.__init__(element, percent, options);
135};
136
137Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base();
138
139MochiKit.Base.update(Clipperz.Visual.Resize.prototype, {
140 __class__ : Clipperz.Visual.Resize,
141
142 __init__: function (element, options) {
143 this.element = MochiKit.DOM.getElement(element);
144 options = MochiKit.Base.update({
145 scaleX: true,
146 scaleY: true,
147 scaleContent: true,
148 scaleFromCenter: false,
149 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
150 syntax_fix: 'syntax fix'
151 }, options);
152
153 this.start(options);
154 },
155
156 setup: function () {
157 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
158 this.elementPositioning = MochiKit.Style.getStyle(this.element, 'position');
159
160 var ma = MochiKit.Base.map;
161 var b = MochiKit.Base.bind;
162 this.originalStyle = {};
163 ma(b(function (k) { this.originalStyle[k] = this.element.style[k]; }, this), ['top', 'left', 'width', 'height', 'fontSize']);
164
165 this.originalTop = this.element.offsetTop;
166 this.originalLeft = this.element.offsetLeft;
167
168 var fontSize = MochiKit.Style.getStyle(this.element, 'font-size') || '100%';
169 ma(b(function (fontSizeType) {
170 if (fontSize.indexOf(fontSizeType) > 0) {
171 this.fontSize = parseFloat(fontSize);
172 this.fontSizeType = fontSizeType;
173 }
174 }, this), ['em', 'px', '%']);
175
176 this.factor = 1;
177
178 this.dims = [this.options.fromSize.h, this.options.fromSize.w];
179 },
180
181 update: function (position) {
182 this.setDimensions((this.options.toSize.h - this.options.fromSize.h) * position + this.options.fromSize.h,
183 (this.options.toSize.w - this.options.fromSize.w) * position + this.options.fromSize.w);
184 },
185
186 finish: function () {
187 if (this.restoreAfterFinish) {
188 MochiKit.Style.setStyle(this.element, this.originalStyle);
189 }
190 },
191
192 setDimensions: function (height, width) {
193 var d = {};
194 var r = Math.round;
195 if (/MSIE/.test(navigator.userAgent)) {
196 r = Math.ceil;
197 }
198 if (this.options.scaleX) {
199 d.width = r(width) + 'px';
200 }
201 if (this.options.scaleY) {
202 d.height = r(height) + 'px';
203 }
204 if (this.options.scaleFromCenter) {
205 var topd = (height - this.dims[0])/2;
206 var leftd = (width - this.dims[1])/2;
207 if (this.elementPositioning == 'absolute') {
208 if (this.options.scaleY) {
209 d.top = this.originalTop - topd + 'px';
210 }
211 if (this.options.scaleX) {
212 d.left = this.originalLeft - leftd + 'px';
213 }
214 } else {
215 if (this.options.scaleY) {
216 d.top = -topd + 'px';
217 }
218 if (this.options.scaleX) {
219 d.left = -leftd + 'px';
220 }
221 }
222 }
223 MochiKit.Style.setStyle(this.element, d);
224 }
225});
226
227//=============================================================================
228
229Clipperz.Visual.squize = function (element, /* optional */ options) {
230 var d = MochiKit.DOM;
231 var v = MochiKit.Visual;
232 var s = MochiKit.Style;
233
234 element = d.getElement(element);
235 options = MochiKit.Base.update({
236 moveTransition: v.Transitions.sinoidal,
237 scaleTransition: v.Transitions.sinoidal,
238 opacityTransition: v.Transitions.none,
239 scaleContent: true,
240 scaleFromCenter: false,
241 scaleX: true,
242 scaleY: true
243 }, options);
244 var oldStyle = {
245 top: element.style.top,
246 left: element.style.left,
247 height: element.style.height,
248 width: element.style.width,
249 opacity: s.getStyle(element, 'opacity')
250 };
251
252 var dims = s.getElementDimensions(element, true);
253 var moveX, moveY;
254
255 moveX = options.scaleX ? dims.w/2 : 0;
256 moveY = options.scaleY ? dims.h/2 : 0;
257
258 var elemClip;
259
260 var optionsParallel = MochiKit.Base.update({
261 beforeStartInternal: function (effect) {
262 s.makePositioned(effect.effects[0].element);
263 elemClip = s.makeClipping(effect.effects[0].element);
264 },
265 afterFinishInternal: function (effect) {
266 s.hideElement(effect.effects[0].element);
267 s.undoClipping(effect.effects[0].element, elemClip);
268 s.undoPositioned(effect.effects[0].element);
269 s.setStyle(effect.effects[0].element, oldStyle);
270 }
271 }, options);
272
273 return new v.Parallel(
274 [new v.Opacity(element, {
275 sync: true, to: 0.0, from: 1.0,
276 transition: options.opacityTransition
277 }),
278 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
279 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
280 sync: true, transition: options.scaleTransition,
281 scaleContent: options.scaleContent,
282 scaleFromCenter: options.scaleFromCenter,
283 restoreAfterFinish: true,
284 scaleX: options.scaleX,
285 scaleY: options.scaleY
286 }),
287 new v.Move(element, {
288 x: moveX, y: moveY, sync: true, transition: options.moveTransition
289 })
290 ], optionsParallel
291 );
292};
293
294//-----------------------------------------------------------------------------
295
296Clipperz.Visual.expand = function (element, /* optional */ options) {
297 var d = MochiKit.DOM;
298 var v = MochiKit.Visual;
299 var s = MochiKit.Style;
300
301 element = d.getElement(element);
302 options = MochiKit.Base.update({
303 // direction: 'center',
304 moveTransition: v.Transitions.sinoidal,
305 scaleTransition: v.Transitions.sinoidal,
306 opacityTransition: v.Transitions.none,
307 scaleContent: true,
308 scaleFromCenter: false,
309 scaleX: true,
310 scaleY: true
311 }, options);
312 var oldStyle = {
313 top: element.style.top,
314 left: element.style.left,
315 height: element.style.height,
316 width: element.style.width,
317 opacity: s.getStyle(element, 'opacity')
318 };
319
320 var dims = s.getElementDimensions(element, true);
321 var moveX, moveY;
322
323 moveX = options.scaleX ? dims.w/2 : 0;
324 moveY = options.scaleY ? dims.h/2 : 0;
325
326 var elemClip;
327
328 var optionsParallel = MochiKit.Base.update({
329 beforeStartInternal: function (effect) {
330 s.makePositioned(effect.effects[0].element);
331 elemClip = s.makeClipping(effect.effects[0].element);
332 },
333 afterFinishInternal: function (effect) {
334 s.hideElement(effect.effects[0].element);
335 s.undoClipping(effect.effects[0].element, elemClip);
336 s.undoPositioned(effect.effects[0].element);
337 s.setStyle(effect.effects[0].element, oldStyle);
338 }
339 }, options);
340
341 return new v.Parallel(
342 [new v.Opacity(element, {
343 sync: true, to: 0.0, from: 1.0,
344 transition: options.opacityTransition
345 }),
346 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
347 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
348 sync: true, transition: options.scaleTransition,
349 scaleContent: options.scaleContent,
350 scaleFromCenter: options.scaleFromCenter,
351 restoreAfterFinish: true,
352 scaleX: options.scaleX,
353 scaleY: options.scaleY
354 }),
355 new v.Move(element, {
356 x: moveX, y: moveY, sync: true, transition: options.moveTransition
357 })
358 ], optionsParallel
359 );
360};
361
362//=============================================================================
363
diff --git a/frontend/delta/js/Clipperz/YUI/DomHelper.js b/frontend/delta/js/Clipperz/YUI/DomHelper.js
new file mode 100644
index 0000000..0a1f9fe
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/YUI/DomHelper.js
@@ -0,0 +1,471 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
26
27
28/**
29 * @class Clipperz.ext.DomHelper
30 * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM.
31 * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
32 * @singleton
33 */
34Clipperz.YUI.DomHelper = new function(){
35 /**@private*/
36 var d = document;
37 var tempTableEl = null;
38 /** True to force the use of DOM instead of html fragments @type Boolean */
39 this.useDom = false;
40 var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;
41 /**
42 * Applies a style specification to an element
43 * @param {String/HTMLElement} el The element to apply styles to
44 * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
45 * a function which returns such a specification.
46 */
47 this.applyStyles = function(el, styles){
48 if(styles){
49 var D = YAHOO.util.Dom;
50 if (typeof styles == "string"){
51 var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
52 var matches;
53 while ((matches = re.exec(styles)) != null){
54 D.setStyle(el, matches[1], matches[2]);
55 }
56 }else if (typeof styles == "object"){
57 for (var style in styles){
58 D.setStyle(el, style, styles[style]);
59 }
60 }else if (typeof styles == "function"){
61 Clipperz.YUI.DomHelper.applyStyles(el, styles.call());
62 }
63 }
64 };
65
66 // build as innerHTML where available
67 /** @ignore */
68 var createHtml = function(o){
69 var b = '';
70
71 if(typeof(o['html']) != 'undefined') {
72 o['html'] = Clipperz.Base.sanitizeString(o['html']);
73 } else if (typeof(o['htmlString']) != 'undefined') {
74 o['html'] = o['htmlString'];
75 delete o.htmlString;
76 }
77
78 if (MochiKit.Base.isArrayLike(o)) {
79 for (var i = 0, l = o.length; i < l; i++) {
80 b += createHtml(o[i]);
81 }
82 return b;
83 }
84
85 b += '<' + o.tag;
86 for(var attr in o){
87 if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
88 if(attr == 'style'){
89 var s = o['style'];
90 if(typeof s == 'function'){
91 s = s.call();
92 }
93 if(typeof s == 'string'){
94 b += ' style="' + s + '"';
95 }else if(typeof s == 'object'){
96 b += ' style="';
97 for(var key in s){
98 if(typeof s[key] != 'function'){
99 b += key + ':' + s[key] + ';';
100 }
101 }
102 b += '"';
103 }
104 }else{
105 if(attr == 'cls'){
106 b += ' class="' + o['cls'] + '"';
107 }else if(attr == 'htmlFor'){
108 b += ' for="' + o['htmlFor'] + '"';
109 }else{
110 b += ' ' + attr + '="' + o[attr] + '"';
111 }
112 }
113 }
114 if(emptyTags.test(o.tag)){
115 b += ' />';
116 }else{
117 b += '>';
118 if(o.children){
119 for(var i = 0, len = o.children.length; i < len; i++) {
120 b += createHtml(o.children[i], b);
121 }
122 }
123 if(o.html){
124 b += o.html;
125 }
126 b += '</' + o.tag + '>';
127 }
128 return b;
129 }
130
131 // build as dom
132 /** @ignore */
133 var createDom = function(o, parentNode){
134 var el = d.createElement(o.tag);
135 var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute
136 for(var attr in o){
137 if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue;
138 if(attr=='cls'){
139 el.className = o['cls'];
140 }else{
141 if(useSet) el.setAttribute(attr, o[attr]);
142 else el[attr] = o[attr];
143 }
144 }
145 Clipperz.YUI.DomHelper.applyStyles(el, o.style);
146 if(o.children){
147 for(var i = 0, len = o.children.length; i < len; i++) {
148 createDom(o.children[i], el);
149 }
150 }
151 if(o.html){
152 el.innerHTML = o.html;
153 }
154 if(parentNode){
155 parentNode.appendChild(el);
156 }
157 return el;
158 };
159
160 /**
161 * @ignore
162 * Nasty code for IE's broken table implementation
163 */
164 var insertIntoTable = function(tag, where, el, html){
165 if(!tempTableEl){
166 tempTableEl = document.createElement('div');
167 }
168 var nodes;
169 if(tag == 'table' || tag == 'tbody'){
170 tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>';
171 nodes = tempTableEl.firstChild.firstChild.childNodes;
172 }else{
173 tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>';
174 nodes = tempTableEl.firstChild.firstChild.firstChild.childNodes;
175 }
176 if (where == 'beforebegin') {
177 nodes.reverse();
178 // el.parentNode.insertBefore(node, el);
179 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el)}, nodes);
180 } else if (where == 'afterbegin') {
181 nodes.reverse();
182 // el.insertBefore(node, el.firstChild);
183 MochiKit.Base.map(function(aNode) {el.insertBefore(aNode, el.firstChild)}, nodes);
184 } else if (where == 'beforeend') {
185 // el.appendChild(node);
186 MochiKit.Base.map(function(aNode) {el.appendChild(aNode)}, nodes);
187 } else if (where == 'afterend') {
188 // el.parentNode.insertBefore(node, el.nextSibling);
189 MochiKit.Base.map(function(aNode) {el.parentNode.insertBefore(aNode, el.nextSibling)}, nodes);
190 }
191
192 return nodes;
193 }
194
195 /**
196 * Inserts an HTML fragment into the Dom
197 * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
198 * @param {HTMLElement} el The context element
199 * @param {String} html The HTML fragmenet
200 * @return {HTMLElement} The new node
201 */
202 this.insertHtml = function(where, el, html){
203 where = where.toLowerCase();
204 // if(el.insertAdjacentHTML){
205 if(Clipperz_IEisBroken){
206 var tag = el.tagName.toLowerCase();
207 if(tag == 'table' || tag == 'tbody' || tag == 'tr'){
208 return insertIntoTable(tag, where, el, html);
209 }
210 switch(where){
211 case 'beforebegin':
212 el.insertAdjacentHTML(where, html);
213 return el.previousSibling;
214 case 'afterbegin':
215 el.insertAdjacentHTML(where, html);
216 return el.firstChild;
217 case 'beforeend':
218 el.insertAdjacentHTML(where, html);
219 return el.lastChild;
220 case 'afterend':
221 el.insertAdjacentHTML(where, html);
222 return el.nextSibling;
223 }
224 throw 'Illegal insertion point -> "' + where + '"';
225 }
226 var range = el.ownerDocument.createRange();
227 var frag;
228 switch(where){
229 case 'beforebegin':
230 range.setStartBefore(el);
231 frag = range.createContextualFragment(html);
232 el.parentNode.insertBefore(frag, el);
233 return el.previousSibling;
234 case 'afterbegin':
235 if(el.firstChild){ // faster
236 range.setStartBefore(el.firstChild);
237 }else{
238 range.selectNodeContents(el);
239 range.collapse(true);
240 }
241 frag = range.createContextualFragment(html);
242 el.insertBefore(frag, el.firstChild);
243 return el.firstChild;
244 case 'beforeend':
245 if(el.lastChild){
246 range.setStartAfter(el.lastChild); // faster
247 }else{
248 range.selectNodeContents(el);
249 range.collapse(false);
250 }
251 frag = range.createContextualFragment(html);
252 el.appendChild(frag);
253 return el.lastChild;
254 case 'afterend':
255 range.setStartAfter(el);
256 frag = range.createContextualFragment(html);
257 el.parentNode.insertBefore(frag, el.nextSibling);
258 return el.nextSibling;
259 }
260 throw 'Illegal insertion point -> "' + where + '"';
261 };
262
263 /**
264 * Creates new Dom element(s) and inserts them before el
265 * @param {String/HTMLElement/Element} el The context element
266 * @param {Object} o The Dom object spec (and children)
267 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
268 * @return {HTMLElement} The new node
269 */
270 this.insertBefore = function(el, o, returnElement){
271 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
272 var newNode;
273 if(this.useDom){
274 newNode = createDom(o, null);
275 el.parentNode.insertBefore(newNode, el);
276 }else{
277 var html = createHtml(o);
278 newNode = this.insertHtml('beforeBegin', el, html);
279 }
280 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
281 };
282
283 /**
284 * Creates new Dom element(s) and inserts them after el
285 * @param {String/HTMLElement/Element} el The context element
286 * @param {Object} o The Dom object spec (and children)
287 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
288 * @return {HTMLElement} The new node
289 */
290 this.insertAfter = function(el, o, returnElement){
291 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
292 var newNode;
293 if(this.useDom){
294 newNode = createDom(o, null);
295 el.parentNode.insertBefore(newNode, el.nextSibling);
296 }else{
297 var html = createHtml(o);
298 newNode = this.insertHtml('afterEnd', el, html);
299 }
300 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
301 };
302
303 /**
304 * Creates new Dom element(s) and appends them to el
305 * @param {String/HTMLElement/Element} el The context element
306 * @param {Object} o The Dom object spec (and children)
307 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
308 * @return {HTMLElement} The new node
309 */
310 this.append = function(el, o, returnElement){
311 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
312 var newNode;
313 if(this.useDom){
314 newNode = createDom(o, null);
315 el.appendChild(newNode);
316 }else{
317 var html = createHtml(o);
318 newNode = this.insertHtml('beforeEnd', el, html);
319 }
320 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
321 };
322
323 /**
324 * Creates new Dom element(s) and overwrites the contents of el with them
325 * @param {String/HTMLElement/Element} el The context element
326 * @param {Object} o The Dom object spec (and children)
327 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
328 * @return {HTMLElement} The new node
329 */
330 this.overwrite = function(el, o, returnElement){
331 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
332 el.innerHTML = createHtml(o);
333 return returnElement ? YAHOO.Element.get(el.firstChild, true) : el.firstChild;
334 };
335
336 /**
337 * Creates a new Clipperz.YUI.DomHelper.Template from the Dom object spec
338 * @param {Object} o The Dom object spec (and children)
339 * @return {Clipperz.YUI.DomHelper.Template} The new template
340 */
341 this.createTemplate = function(o){
342 var html = createHtml(o);
343 return new Clipperz.YUI.DomHelper.Template(html);
344 };
345}();
346
347/**
348* @class Clipperz.YUI.DomHelper.Template
349* Represents an HTML fragment template.
350* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
351* <br>
352* <b>This class is also available as Clipperz.YUI.Template</b>.
353* @constructor
354* @param {String/Array} html The HTML fragment or an array of fragments to join('') or multiple arguments to join('')
355*/
356Clipperz.YUI.DomHelper.Template = function(html){
357 if(html instanceof Array){
358 html = html.join('');
359 }else if(arguments.length > 1){
360 html = Array.prototype.join.call(arguments, '');
361 }
362 /**@private*/
363 this.html = html;
364};
365Clipperz.YUI.DomHelper.Template.prototype = {
366 /**
367 * Returns an HTML fragment of this template with the specified values applied
368 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
369 * @return {String}
370 */
371 applyTemplate : function(values){
372 if(this.compiled){
373 return this.compiled(values);
374 }
375 var empty = '';
376 var fn = function(match, index){
377 if(typeof values[index] != 'undefined'){
378 return values[index];
379 }else{
380 return empty;
381 }
382 }
383 return this.html.replace(this.re, fn);
384 },
385
386 /**
387 * The regular expression used to match template variables
388 * @type RegExp
389 * @property
390 */
391 re : /\{([\w|-]+)\}/g,
392
393 /**
394 * Compiles the template into an internal function, eliminating the RegEx overhead
395 */
396 compile : function(){
397 var body = ["this.compiled = function(values){ return ['"];
398 body.push(this.html.replace(this.re, "', values['$1'], '"));
399 body.push("'].join('');};");
400 eval(body.join(''));
401 return this;
402 },
403
404 /**
405 * Applies the supplied values to the template and inserts the new node(s) before el
406 * @param {String/HTMLElement/Element} el The context element
407 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
408 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
409 * @return {HTMLElement} The new node
410 */
411 insertBefore: function(el, values, returnElement){
412 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
413 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values));
414 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
415 },
416
417 /**
418 * Applies the supplied values to the template and inserts the new node(s) after el
419 * @param {String/HTMLElement/Element} el The context element
420 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
421 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
422 * @return {HTMLElement} The new node
423 */
424 insertAfter : function(el, values, returnElement){
425 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
426 var newNode = Clipperz.YUI.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values));
427 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
428 },
429
430 /**
431 * Applies the supplied values to the template and append the new node(s) to el
432 * @param {String/HTMLElement/Element} el The context element
433 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
434 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
435 * @return {HTMLElement} The new node
436 */
437 append : function(el, values, returnElement){
438 var sanitizedValues;
439 var key;
440
441 sanitizedValues = {};
442 for (key in values) {
443 sanitizedValues[key] = Clipperz.Base.sanitizeString(values[key]);
444 }
445 el = (typeof el == 'string') ? YAHOO.util.Dom.get(el) : el;
446 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(sanitizedValues));
447
448 return newNode;
449 },
450
451 /**
452 * Applies the supplied values to the template and overwrites the content of el with the new node(s)
453 * @param {String/HTMLElement/Element} el The context element
454 * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
455 * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.Element
456 * @return {HTMLElement} The new node
457 */
458 overwrite : function(el, values, returnElement){
459 el = el.dom ? el.dom : YAHOO.util.Dom.get(el);
460 el.innerHTML = '';
461 var newNode = Clipperz.YUI.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
462 return returnElement ? YAHOO.Element.get(newNode, true) : newNode;
463 }
464};
465/**
466 * Alias for applyTemplate
467 * @method
468 */
469Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate;
470
471Clipperz.YUI.Template = Clipperz.YUI.DomHelper.Template;
diff --git a/frontend/delta/js/Clipperz/YUI/DomQuery.js b/frontend/delta/js/Clipperz/YUI/DomQuery.js
new file mode 100644
index 0000000..c1af0ca
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/YUI/DomQuery.js
@@ -0,0 +1,709 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
25if (typeof(Clipperz.YUI) == 'undefined') { Clipperz.YUI = {}; }
26
27
28/*
29 * yui-ext 0.40
30 * Copyright(c) 2006, Jack Slocum.
31 */
32
33/**
34 * @class Clipperz.YUI.DomQuery
35 * Provides high performance selector/xpath processing by compiling queries into reusable functions.
36 * New pseudo classes and matchers can be plugged. It works on HTML and XML documents (if a content node is passed in).
37 * @singleton
38 */
39Clipperz.YUI.DomQuery = function(){
40 var cache = {}, simpleCache = {}, valueCache = {};
41 var nonSpace = /\S/;
42 var trimRe = /^\s*(.*?)\s*$/;
43 var tplRe = /\{(\d+)\}/g;
44 var modeRe = /^(\s?[\/>]\s?|\s|$)/;
45 var clsRes = {};
46
47 function child(p, index){
48 var i = 0;
49 var n = p.firstChild;
50 while(n){
51 if(n.nodeType == 1){
52 i++;
53 if(i == index){
54 return n;
55 }
56 }
57 n = n.nextSibling;
58 }
59 return null;
60 };
61
62 function next(d){
63 var n = d.nextSibling;
64 while(n && n.nodeType != 1){
65 n = n.nextSibling;
66 }
67 return n;
68 };
69
70 function prev(d){
71 var n = d.previousSibling;
72 while(n && n.nodeType != 1){
73 n = n.previousSibling;
74 }
75 return n;
76 };
77
78 function clean(d){
79 var n = d.firstChild, ni = -1;
80 while(n){
81 var nx = n.nextSibling;
82 if(n.nodeType == 3 && !nonSpace.test(n.nodeValue)){
83 d.removeChild(n);
84 }else{
85 n.nodeIndex = ++ni;
86 }
87 n = nx;
88 }
89 return this;
90 };
91
92 function byClassName(c, a, v){
93 if(!v){
94 return c;
95 }
96 var re = clsRes[v];
97 if(!re){
98 re = new RegExp('(?:^|\\s)(?:' + v + ')(?:\\s|$)');
99 clsRes[v] = re;
100 }
101 var r = [];
102 for(var i = 0, ci; ci = c[i]; i++){
103 if(re.test(ci.className)){
104 r[r.length] = ci;
105 }
106 }
107 return r;
108 };
109
110 function convert(c){
111 if(c.slice){
112 return c;
113 }
114 var r = [];
115 for(var i = 0, l = c.length; i < l; i++){
116 r[r.length] = c[i];
117 }
118 return r;
119 };
120
121 function attrValue(n, attr){
122 if(!n.tagName && typeof n.length != 'undefined'){
123 n = n[0];
124 }
125 if(!n){
126 return null;
127 }
128 if(attr == 'for'){
129 return n.htmlFor;
130 }
131 if(attr == 'class' || attr == 'className'){
132 return n.className;
133 }
134 return n.getAttribute(attr) || n[attr];
135
136 };
137
138 function getNodes(ns, mode, tagName){
139 var result = [], cs;
140 if(!ns){
141 return result;
142 }
143 mode = mode ? mode.replace(trimRe, '$1') : '';
144 tagName = tagName || '*';
145 if(ns.tagName || ns == document){
146 ns = [ns];
147 }
148 if(mode != '/' && mode != '>'){
149 for(var i = 0, ni; ni = ns[i]; i++){
150 cs = ni.getElementsByTagName(tagName);
151 result = concat(result, cs);
152 }
153 }else{
154 for(var i = 0, ni; ni = ns[i]; i++){
155 var cn = ni.getElementsByTagName(tagName);
156 for(var j = 0, cj; cj = cn[j]; j++){
157 if(cj.parentNode == ni){
158 result[result.length] = cj;
159 }
160 }
161 }
162
163 }
164 return result;
165 };
166
167 function concat(a, b){
168 if(b.slice){
169 return a.concat(b);
170 }
171 for(var i = 0, l = b.length; i < l; i++){
172 a[a.length] = b[i];
173 }
174 return a;
175 }
176
177 function byTag(cs, tagName){
178 if(cs.tagName || cs == document){
179 cs = [cs];
180 }
181 if(!tagName){
182 return cs;
183 }
184 var r = []; tagName = tagName.toLowerCase();
185 for(var i = 0, ci; ci = cs[i]; i++){
186 if(ci.nodeType == 1 && ci.tagName.toLowerCase()==tagName){
187 r[r.length] = ci;
188 }
189 }
190 return r;
191 };
192
193 function byId(cs, attr, id){
194 if(cs.tagName || cs == document){
195 cs = [cs];
196 }
197 if(!id){
198 return cs;
199 }
200 var r = [];
201 for(var i = 0, l = cs.length; i < l; i++){
202 var ci = cs[i];
203 if(ci && ci.id == id){
204 r[r.length] = ci;
205 }
206 }
207 return r;
208 };
209
210 function byAttribute(cs, attr, value, op, custom){
211 var r = [], st = custom=='{';
212 var f = Clipperz.YUI.DomQuery.operators[op];
213 for(var i = 0, l = cs.length; i < l; i++){
214 var a;
215 if(st){
216 a = Clipperz.YUI.DomQuery.getStyle(cs[i], attr);
217 }
218 else if(attr == 'class' || attr == 'className'){
219 a = cs[i].className;
220 }else if(attr == 'for'){
221 a = cs[i].htmlFor;
222 }else{
223 a = cs[i].getAttribute(attr);
224 }
225 if((f && f(a, value)) || (!f && a)){
226 r[r.length] = cs[i];
227 }
228 }
229 return r;
230 };
231
232 function byPseudo(cs, name, value){
233 return Clipperz.YUI.DomQuery.pseudos[name](cs, value);
234 };
235
236 // This is for IE MSXML which does not support expandos.
237 // IE runs the same speed using setAttribute, however FF slows way down
238 // and Safari completely fails so they need to continue to use expandos.
239 // Branched at load time for faster execution.
240 var isIE = window.ActiveXObject;
241 var addAttr = isIE ?
242 function(n, a, v){
243 n.setAttribute(a, v);
244 } :
245 function(n, a, v){
246 n[a] = v;
247 };
248 var getAttr = isIE ?
249 function(n, a){
250 return n.getAttribute(a);
251 } :
252 function(n, a){
253 return n[a];
254 };
255 var clearAttr = isIE ?
256 function(n, a){
257 n.removeAttribute(a);
258 } :
259 function(n, a, v){
260 delete n[a];
261 };
262
263 function nodup(cs){
264 if(!cs.length){
265 return cs;
266 }
267 addAttr(cs[0], '_nodup', true);
268 var r = [cs[0]];
269 for(var i = 1, len = cs.length; i < len; i++){
270 var c = cs[i];
271 if(!getAttr(c, '_nodup')){
272 addAttr(c, '_nodup', true);
273 r[r.length] = c;
274 }
275 }
276 for(var i = 0, len = cs.length; i < len; i++){
277 clearAttr(cs[i], '_nodup');
278 }
279 return r;
280 }
281
282 function quickDiff(c1, c2){
283 if(!c1.length){
284 return c2;
285 }
286 for(var i = 0, len = c1.length; i < len; i++){
287 addAttr(c1[i], '_qdiff', true);
288 }
289 var r = [];
290 for(var i = 0, len = c2.length; i < len; i++){
291 if(!getAttr(c2[i], '_qdiff')){
292 r[r.length] = c2[i];
293 }
294 }
295 for(var i = 0, len = c1.length; i < len; i++){
296 clearAttr(c1[i], '_qdiff');
297 }
298 return r;
299 }
300
301 function quickId(ns, mode, root, id){
302 if(ns == root){
303 var d = root.ownerDocument || root;
304 return d.getElementById(id);
305 }
306 ns = getNodes(ns, mode, '*');
307 return byId(ns, null, id);
308 }
309
310 return {
311 getStyle : function(el, name){
312 return YAHOO.util.Dom.getStyle(el, name);
313 },
314 /**
315 * Compiles a selector/xpath query into a reusable function. The returned function
316 * takes one parameter "root" (optional), which is the context node from where the query should start.
317 * @param {String} selector The selector/xpath query
318 * @param {String} type (optional) Either 'select' (the default) or 'simple' for a simple selector match
319 * @return {Function}
320 */
321 compile : function(path, type){
322 // strip leading slashes
323 while(path.substr(0, 1)=='/'){
324 path = path.substr(1);
325 }
326 type = type || 'select';
327
328 var fn = ['var f = function(root){\n var mode; var n = root || document;\n'];
329 var q = path, mode, lq;
330 var tk = Clipperz.YUI.DomQuery.matchers;
331 var tklen = tk.length;
332 var mm;
333 while(q && lq != q){
334 lq = q;
335 var tm = q.match(/^(#)?([\w-\*]+)/);
336 if(type == 'select'){
337 if(tm){
338 if(tm[1] == '#'){
339 fn[fn.length] = 'n = quickId(n, mode, root, "'+tm[2]+'");';
340 }else{
341 fn[fn.length] = 'n = getNodes(n, mode, "'+tm[2]+'");';
342 }
343 q = q.replace(tm[0], '');
344 }else{
345 fn[fn.length] = 'n = getNodes(n, mode, "*");';
346 }
347 }else{
348 if(tm){
349 if(tm[1] == '#'){
350 fn[fn.length] = 'n = byId(n, null, "'+tm[2]+'");';
351 }else{
352 fn[fn.length] = 'n = byTag(n, "'+tm[2]+'");';
353 }
354 q = q.replace(tm[0], '');
355 }
356 }
357 while(!(mm = q.match(modeRe))){
358 var matched = false;
359 for(var j = 0; j < tklen; j++){
360 var t = tk[j];
361 var m = q.match(t.re);
362 if(m){
363 fn[fn.length] = t.select.replace(tplRe, function(x, i){
364 return m[i];
365 });
366 q = q.replace(m[0], '');
367 matched = true;
368 break;
369 }
370 }
371 // prevent infinite loop on bad selector
372 if(!matched){
373 throw 'Error parsing selector, parsing failed at "' + q + '"';
374 }
375 }
376 if(mm[1]){
377 fn[fn.length] = 'mode="'+mm[1]+'";';
378 q = q.replace(mm[1], '');
379 }
380 }
381 fn[fn.length] = 'return nodup(n);\n}';
382 eval(fn.join(''));
383 return f;
384 },
385
386 /**
387 * Selects a group of elements.
388 * @param {String} selector The selector/xpath query
389 * @param {Node} root (optional) The start of the query (defaults to document).
390 * @return {Array}
391 */
392 select : function(path, root, type){
393 if(!root || root == document){
394 root = document;
395 }
396 if(typeof root == 'string'){
397 root = document.getElementById(root);
398 }
399 var paths = path.split(',');
400 var results = [];
401 for(var i = 0, len = paths.length; i < len; i++){
402 var p = paths[i].replace(trimRe, '$1');
403 if(!cache[p]){
404 cache[p] = Clipperz.YUI.DomQuery.compile(p);
405 if(!cache[p]){
406 throw p + ' is not a valid selector';
407 }
408 }
409 var result = cache[p](root);
410 if(result && result != document){
411 results = results.concat(result);
412 }
413 }
414 return results;
415 },
416
417 /**
418 * Selects a single element.
419 * @param {String} selector The selector/xpath query
420 * @param {Node} root (optional) The start of the query (defaults to document).
421 * @return {Element}
422 */
423 selectNode : function(path, root){
424 return Clipperz.YUI.DomQuery.select(path, root)[0];
425 },
426
427 /**
428 * Selects the value of a node, optionally replacing null with the defaultValue.
429 * @param {String} selector The selector/xpath query
430 * @param {Node} root (optional) The start of the query (defaults to document).
431 * @param {String} defaultValue
432 */
433 selectValue : function(path, root, defaultValue){
434 path = path.replace(trimRe, '$1');
435 if(!valueCache[path]){
436 valueCache[path] = Clipperz.YUI.DomQuery.compile(path, 'simple');
437 }
438 var n = valueCache[path](root);
439 n = n[0] ? n[0] : n;
440 var v = (n && n.firstChild ? n.firstChild.nodeValue : null);
441 return (v === null ? defaultValue : v);
442 },
443
444 /**
445 * Selects the value of a node, parsing integers and floats.
446 * @param {String} selector The selector/xpath query
447 * @param {Node} root (optional) The start of the query (defaults to document).
448 * @param {Number} defaultValue
449 * @return {Number}
450 */
451 selectNumber : function(path, root, defaultValue){
452 var v = Clipperz.YUI.DomQuery.selectValue(path, root, defaultValue || 0);
453 return parseFloat(v);
454 },
455
456 /**
457 * Returns true if the passed element(s) match the passed simple selector (e.g. div.some-class or span:first-child)
458 * @param {String/HTMLElement/Array} el An element id, element or array of elements
459 * @param {String} selector The simple selector to test
460 * @return {Boolean}
461 */
462 is : function(el, ss){
463 if(typeof el == 'string'){
464 el = document.getElementById(el);
465 }
466 var isArray = (el instanceof Array);
467 var result = Clipperz.YUI.DomQuery.filter(isArray ? el : [el], ss);
468 return isArray ? (result.length == el.length) : (result.length > 0);
469 },
470
471 /**
472 * Filters an array of elements to only include matches of a simple selector (e.g. div.some-class or span:first-child)
473 * @param {Array} el An array of elements to filter
474 * @param {String} selector The simple selector to test
475 * @param {Boolean} nonMatches If true, it returns the elements that DON'T match
476 * the selector instead of the ones that match
477 * @return {Array}
478 */
479 filter : function(els, ss, nonMatches){
480 ss = ss.replace(trimRe, '$1');
481 if(!simpleCache[ss]){
482 simpleCache[ss] = Clipperz.YUI.DomQuery.compile(ss, 'simple');
483 }
484 var result = simpleCache[ss](els);
485 return nonMatches ? quickDiff(result, els) : result;
486 },
487
488 /**
489 * Collection of matching regular expressions and code snippets.
490 */
491 matchers : [{
492 re: /^\.([\w-]+)/,
493 select: 'n = byClassName(n, null, "{1}");'
494 }, {
495 re: /^\:([\w-]+)(?:\(((?:[^\s>\/]*|.*?))\))?/,
496 select: 'n = byPseudo(n, "{1}", "{2}");'
497 },{
498 re: /^(?:([\[\{])(?:@)?([\w-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]\}])/,
499 select: 'n = byAttribute(n, "{2}", "{4}", "{3}", "{1}");'
500 }, {
501 re: /^#([\w-]+)/,
502 select: 'n = byId(n, null, "{1}");'
503 },{
504 re: /^@([\w-]+)/,
505 select: 'return {firstChild:{nodeValue:attrValue(n, "{1}")}};'
506 }
507 ],
508
509 /**
510 * Collection of operator comparison functions. The default operators are =, !=, ^=, $=, *= and %=.
511 * New operators can be added as long as the match the format <i>c</i>= where <i>c<i> is any character other than space, &gt; &lt;.
512 */
513 operators : {
514 '=' : function(a, v){
515 return a == v;
516 },
517 '!=' : function(a, v){
518 return a != v;
519 },
520 '^=' : function(a, v){
521 return a && a.substr(0, v.length) == v;
522 },
523 '$=' : function(a, v){
524 return a && a.substr(a.length-v.length) == v;
525 },
526 '*=' : function(a, v){
527 return a && a.indexOf(v) !== -1;
528 },
529 '%=' : function(a, v){
530 return (a % v) == 0;
531 }
532 },
533
534 /**
535 * Collection of "pseudo class" processors. Each processor is passed the current nodeset (array)
536 * and the argument (if any) supplied in the selector.
537 */
538 pseudos : {
539 'first-child' : function(c){
540 var r = [];
541 for(var i = 0, l = c.length; i < l; i++){
542 var ci = c[i];
543 if(!prev(ci)){
544 r[r.length] = ci;
545 }
546 }
547 return r;
548 },
549
550 'last-child' : function(c){
551 var r = [];
552 for(var i = 0, l = c.length; i < l; i++){
553 var ci = c[i];
554 if(!next(ci)){
555 r[r.length] = ci;
556 }
557 }
558 return r;
559 },
560
561 'nth-child' : function(c, a){
562 var r = [];
563 if(a != 'odd' && a != 'even'){
564 for(var i = 0, ci; ci = c[i]; i++){
565 var m = child(ci.parentNode, a);
566 if(m == ci){
567 r[r.length] = m;
568 }
569 }
570 return r;
571 }
572 var p;
573 // first let's clean up the parent nodes
574 for(var i = 0, l = c.length; i < l; i++){
575 var cp = c[i].parentNode;
576 if(cp != p){
577 clean(cp);
578 p = cp;
579 }
580 }
581 // then lets see if we match
582 for(var i = 0, l = c.length; i < l; i++){
583 var ci = c[i], m = false;
584 if(a == 'odd'){
585 m = ((ci.nodeIndex+1) % 2 == 1);
586 }else if(a == 'even'){
587 m = ((ci.nodeIndex+1) % 2 == 0);
588 }
589 if(m){
590 r[r.length] = ci;
591 }
592 }
593 return r;
594 },
595
596 'only-child' : function(c){
597 var r = [];
598 for(var i = 0, l = c.length; i < l; i++){
599 var ci = c[i];
600 if(!prev(ci) && !next(ci)){
601 r[r.length] = ci;
602 }
603 }
604 return r;
605 },
606
607 'empty' : function(c){
608 var r = [];
609 for(var i = 0, l = c.length; i < l; i++){
610 var ci = c[i];
611 if(!ci.firstChild){
612 r[r.length] = ci;
613 }
614 }
615 return r;
616 },
617
618 'contains' : function(c, v){
619 var r = [];
620 for(var i = 0, l = c.length; i < l; i++){
621 var ci = c[i];
622 if(ci.innerHTML.indexOf(v) !== -1){
623 r[r.length] = ci;
624 }
625 }
626 return r;
627 },
628
629 'checked' : function(c){
630 var r = [];
631 for(var i = 0, l = c.length; i < l; i++){
632 if(c[i].checked == 'checked'){
633 r[r.length] = c[i];
634 }
635 }
636 return r;
637 },
638
639 'not' : function(c, ss){
640 return Clipperz.YUI.DomQuery.filter(c, ss, true);
641 },
642
643 'odd' : function(c){
644 return this['nth-child'](c, 'odd');
645 },
646
647 'even' : function(c){
648 return this['nth-child'](c, 'even');
649 },
650
651 'nth' : function(c, a){
652 return c[a-1];
653 },
654
655 'first' : function(c){
656 return c[0];
657 },
658
659 'last' : function(c){
660 return c[c.length-1];
661 },
662
663 'has' : function(c, ss){
664 var s = Clipperz.YUI.DomQuery.select;
665 var r = [];
666 for(var i = 0, ci; ci = c[i]; i++){
667 if(s(ss, ci).length > 0){
668 r[r.length] = ci;
669 }
670 }
671 return r;
672 },
673
674 'next' : function(c, ss){
675 var is = Clipperz.YUI.DomQuery.is;
676 var r = [];
677 for(var i = 0, ci; ci = c[i]; i++){
678 var n = next(ci);
679 if(n && is(n, ss)){
680 r[r.length] = ci;
681 }
682 }
683 return r;
684 },
685
686 'prev' : function(c, ss){
687 var is = Clipperz.YUI.DomQuery.is;
688 var r = [];
689 for(var i = 0, ci; ci = c[i]; i++){
690 var n = prev(ci);
691 if(n && is(n, ss)){
692 r[r.length] = ci;
693 }
694 }
695 return r;
696 }
697 }
698 };
699}();
700
701/**
702 * Selects an array of DOM nodes by CSS/XPath selector. Shorthand of {@link Clipperz.YUI.DomQuery#select}
703 * @param {String} path The selector/xpath query
704 * @param {Node} root (optional) The start of the query (defaults to document).
705 * @return {Array}
706 * @member Ext
707 * @method query
708 */
709Clipperz.YUI.query = Clipperz.YUI.DomQuery.select;
diff --git a/frontend/delta/js/Clipperz/YUI/Utils.js b/frontend/delta/js/Clipperz/YUI/Utils.js
new file mode 100644
index 0000000..4def842
--- a/dev/null
+++ b/frontend/delta/js/Clipperz/YUI/Utils.js
@@ -0,0 +1,93 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24if (typeof YAHOO == 'undefined') { YAHOO = {}; };
25if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; };
26if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; };
27
28YAHOO.extend = function(subc, superc, overrides) {
29 var F = function() {};
30 F.prototype=superc.prototype;
31 subc.prototype=new F();
32 subc.prototype.constructor=subc;
33 subc.superclass=superc.prototype;
34 if (superc.prototype.constructor == Object.prototype.constructor) {
35 superc.prototype.constructor=superc;
36 }
37
38 if (overrides) {
39 for (var i in overrides) {
40 subc.prototype[i]=overrides[i];
41 }
42 }
43};
44
45YAHOO.override = function(origclass, overrides){
46 if(overrides){
47 var p = origclass.prototype;
48 for(var method in overrides){
49 p[method] = overrides[method];
50 }
51 }
52};
53
54YAHOO.extendX = function(subclass, superclass, overrides){
55 YAHOO.extend(subclass, superclass);
56 subclass.override = function(o){
57 YAHOO.override(subclass, o);
58 };
59 if(!subclass.prototype.override){
60 subclass.prototype.override = function(o){
61 for(var method in o){
62 this[method] = o[method];
63 }
64 };
65 }
66 if(overrides){
67 subclass.override(overrides);
68 };
69
70};
71
72YAHOO.util.Dom.get = function(el) {
73 if (!el) { return null; } // nothing to work with
74
75 if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is
76 return el;
77 }
78
79 if (typeof el == 'string') { // ID
80 return document.getElementById(el);
81 }
82 else { // array of ID's and/or elements
83 var collection = [];
84 for (var i = 0, len = el.length; i < len; ++i) {
85 collection[collection.length] = YAHOO.util.Dom.get(el[i]);
86 }
87
88 return collection;
89 }
90
91 return null; // safety, should never happen
92};
93
diff --git a/frontend/delta/js/Cubiq/add2home.js b/frontend/delta/js/Cubiq/add2home.js
new file mode 100644
index 0000000..7ecb3c0
--- a/dev/null
+++ b/frontend/delta/js/Cubiq/add2home.js
@@ -0,0 +1,365 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/*!
25 * Add to Homescreen v2.0.8 ~ Copyright (c) 2013 Matteo Spinelli, http://cubiq.org
26 * Released under MIT license, http://cubiq.org/license
27 */
28var addToHome = (function (w) {
29 var nav = w.navigator,
30 isIDevice = 'platform' in nav && (/iphone|ipod|ipad/gi).test(nav.platform),
31 isIPad,
32 isRetina,
33 isSafari,
34 isStandalone,
35 OSVersion,
36 startX = 0,
37 startY = 0,
38 lastVisit = 0,
39 isExpired,
40 isSessionActive,
41 isReturningVisitor,
42 balloon,
43 overrideChecks,
44
45 positionInterval,
46 closeTimeout,
47
48 options = {
49 autostart: true, // Automatically open the balloon
50 returningVisitor: false,// Show the balloon to returning visitors only (setting this to true is highly recommended)
51 animationIn: 'drop', // drop || bubble || fade
52 animationOut: 'fade', // drop || bubble || fade
53 startDelay: 2000, // 2 seconds from page load before the balloon appears
54 lifespan: 15000, // 15 seconds before it is automatically destroyed
55 bottomOffset: 14, // Distance of the balloon from bottom
56 expire: 0, // Minutes to wait before showing the popup again (0 = always displayed)
57 message: '', // Customize your message or force a language ('' = automatic)
58 touchIcon: false, // Display the touch icon
59 arrow: true, // Display the balloon arrow
60 hookOnLoad: true, // Should we hook to onload event? (really advanced usage)
61 closeButton: true, // Let the user close the balloon
62 iterations: 100 // Internal/debug use
63 },
64
65 intl = {
66 ar: '<span dir="rtl">قم بتثبيت هذا التطبيق على <span dir="ltr">%device:</span>انقر<span dir="ltr">%icon</span> ،<strong>ثم اضفه الى الشاشة الرئيسية.</strong></span>',
67 ca_es: 'Per instal·lar aquesta aplicació al vostre %device premeu %icon i llavors <strong>Afegir a pantalla d\'inici</strong>.',
68 cs_cz: 'Pro instalaci aplikace na Váš %device, stiskněte %icon a v nabídce <strong>Přidat na plochu</strong>.',
69 da_dk: 'Tilføj denne side til din %device: tryk på %icon og derefter <strong>Føj til hjemmeskærm</strong>.',
70 de_de: 'Installieren Sie diese App auf Ihrem %device: %icon antippen und dann <strong>Zum Home-Bildschirm</strong>.',
71 el_gr: 'Εγκαταστήσετε αυτήν την Εφαρμογή στήν συσκευή σας %device: %icon μετά πατάτε <strong>Προσθήκη σε Αφετηρία</strong>.',
72 en_us: 'Install this web app on your %device: tap %icon and then <strong>Add to Home Screen</strong>.',
73 es_es: 'Para instalar esta app en su %device, pulse %icon y seleccione <strong>Añadir a pantalla de inicio</strong>.',
74 fi_fi: 'Asenna tämä web-sovellus laitteeseesi %device: paina %icon ja sen jälkeen valitse <strong>Lisää Koti-valikkoon</strong>.',
75 fr_fr: 'Ajoutez cette application sur votre %device en cliquant sur %icon, puis <strong>Ajouter à l\'écran d\'accueil</strong>.',
76 he_il: '<span dir="rtl">התקן אפליקציה זו על ה-%device שלך: הקש %icon ואז <strong>הוסף למסך הבית</strong>.</span>',
77 hr_hr: 'Instaliraj ovu aplikaciju na svoj %device: klikni na %icon i odaberi <strong>Dodaj u početni zaslon</strong>.',
78 hu_hu: 'Telepítse ezt a web-alkalmazást az Ön %device-jára: nyomjon a %icon-ra majd a <strong>Főképernyőhöz adás</strong> gombra.',
79 it_it: 'Installa questa applicazione sul tuo %device: premi su %icon e poi <strong>Aggiungi a Home</strong>.',
80 ja_jp: 'このウェブアプリをあなたの%deviceにインストールするには%iconをタップして<strong>ホーム画面に追加</strong>を選んでください。',
81 ko_kr: '%device에 웹앱을 설치하려면 %icon을 터치 후 "홈화면에 추가"를 선택하세요',
82 nb_no: 'Installer denne appen på din %device: trykk på %icon og deretter <strong>Legg til på Hjem-skjerm</strong>',
83 nl_nl: 'Installeer deze webapp op uw %device: tik %icon en dan <strong>Voeg toe aan beginscherm</strong>.',
84 pl_pl: 'Aby zainstalować tę aplikacje na %device: naciśnij %icon a następnie <strong>Dodaj jako ikonę</strong>.',
85 pt_br: 'Instale este aplicativo em seu %device: aperte %icon e selecione <strong>Adicionar à Tela Inicio</strong>.',
86 pt_pt: 'Para instalar esta aplicação no seu %device, prima o %icon e depois em <strong>Adicionar ao ecrã principal</strong>.',
87 ru_ru: 'Установите это веб-приложение на ваш %device: нажмите %icon, затем <strong>Добавить в «Домой»</strong>.',
88 sv_se: 'Lägg till denna webbapplikation på din %device: tryck på %icon och därefter <strong>Lägg till på hemskärmen</strong>.',
89 th_th: 'ติดตั้งเว็บแอพฯ นี้บน %device ของคุณ: แตะ %icon และ <strong>เพิ่มที่หน้าจอโฮม</strong>',
90 tr_tr: 'Bu uygulamayı %device\'a eklemek için %icon simgesine sonrasında <strong>Ana Ekrana Ekle</strong> düğmesine basın.',
91 uk_ua: 'Встановіть цей веб сайт на Ваш %device: натисніть %icon, а потім <strong>На початковий екран</strong>.',
92 zh_cn: '您可以将此应用程式安装到您的 %device 上。请按 %icon 然后点选<strong>添加至主屏幕</strong>。',
93 zh_tw: '您可以將此應用程式安裝到您的 %device 上。請按 %icon 然後點選<strong>加入主畫面螢幕</strong>。'
94 };
95
96 function init () {
97 // Preliminary check, all further checks are performed on iDevices only
98 if ( !isIDevice ) return;
99
100 var now = Date.now(),
101 i;
102
103 // Merge local with global options
104 if ( w.addToHomeConfig ) {
105 for ( i in w.addToHomeConfig ) {
106 options[i] = w.addToHomeConfig[i];
107 }
108 }
109 if ( !options.autostart ) options.hookOnLoad = false;
110
111 isIPad = (/ipad/gi).test(nav.platform);
112 isRetina = w.devicePixelRatio && w.devicePixelRatio > 1;
113 isSafari = (/Safari/i).test(nav.appVersion) && !(/CriOS/i).test(nav.appVersion);
114 isStandalone = nav.standalone;
115 OSVersion = nav.appVersion.match(/OS (\d+_\d+)/i);
116 OSVersion = OSVersion && OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0;
117
118 lastVisit = +w.localStorage.getItem('addToHome');
119
120 isSessionActive = w.sessionStorage.getItem('addToHomeSession');
121 isReturningVisitor = options.returningVisitor ? lastVisit && lastVisit + 28*24*60*60*1000 > now : true;
122
123 if ( !lastVisit ) lastVisit = now;
124
125 // If it is expired we need to reissue a new balloon
126 isExpired = isReturningVisitor && lastVisit <= now;
127
128 if ( options.hookOnLoad ) w.addEventListener('load', loaded, false);
129 else if ( !options.hookOnLoad && options.autostart ) loaded();
130 }
131
132 function loaded () {
133 w.removeEventListener('load', loaded, false);
134
135 if ( !isReturningVisitor ) w.localStorage.setItem('addToHome', Date.now());
136 else if ( options.expire && isExpired ) w.localStorage.setItem('addToHome', Date.now() + options.expire * 60000);
137
138 if ( !overrideChecks && ( !isSafari || !isExpired || isSessionActive || isStandalone || !isReturningVisitor ) ) return;
139
140 var touchIcon = '',
141 platform = nav.platform.split(' ')[0],
142 language = nav.language.replace('-', '_');
143
144 balloon = document.createElement('div');
145 balloon.id = 'addToHomeScreen';
146 balloon.style.cssText += 'left:-9999px;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0;-webkit-transform:translate3d(0,0,0);position:' + (OSVersion < 5 ? 'absolute' : 'fixed');
147
148 // Localize message
149 if ( options.message in intl ) { // You may force a language despite the user's locale
150 language = options.message;
151 options.message = '';
152 }
153 if ( options.message === '' ) { // We look for a suitable language (defaulted to en_us)
154 options.message = language in intl ? intl[language] : intl['en_us'];
155 }
156
157 if ( options.touchIcon ) {
158 touchIcon = isRetina ?
159 document.querySelector('head link[rel^=apple-touch-icon][sizes="114x114"],head link[rel^=apple-touch-icon][sizes="144x144"],head link[rel^=apple-touch-icon]') :
160 document.querySelector('head link[rel^=apple-touch-icon][sizes="57x57"],head link[rel^=apple-touch-icon]');
161
162 if ( touchIcon ) {
163 touchIcon = '<span style="background-image:url(' + touchIcon.href + ')" class="addToHomeTouchIcon"></span>';
164 }
165 }
166
167 balloon.className = (isIPad ? 'addToHomeIpad' : 'addToHomeIphone') + (touchIcon ? ' addToHomeWide' : '');
168 balloon.innerHTML = touchIcon +
169 options.message.replace('%device', platform).replace('%icon', OSVersion >= 4.2 ? '<span class="addToHomeShare' + (OSVersion >= 7 ? ' addToHomeShareOS7' : '') + '"></span>' : '<span class="addToHomePlus">+</span>') +
170 (options.arrow ? '<span class="addToHomeArrow"></span>' : '') +
171 (options.closeButton ? '<span class="addToHomeClose">\u00D7</span>' : '');
172
173 document.body.appendChild(balloon);
174
175 // Add the close action
176 if ( options.closeButton ) balloon.addEventListener('click', clicked, false);
177
178 if ( !isIPad && OSVersion >= 6 ) window.addEventListener('orientationchange', orientationCheck, false);
179
180 setTimeout(show, options.startDelay);
181 }
182
183 function show () {
184 var duration,
185 iPadXShift = 208;
186
187 // Set the initial position
188 if ( isIPad ) {
189 if ( OSVersion < 5 ) {
190 startY = w.scrollY;
191 startX = w.scrollX;
192 } else if ( OSVersion < 6 ) {
193 iPadXShift = 160;
194 }
195
196 balloon.style.top = startY + options.bottomOffset + 'px';
197 balloon.style.left = startX + iPadXShift - Math.round(balloon.offsetWidth / 2) + 'px';
198
199 switch ( options.animationIn ) {
200 case 'drop':
201 duration = '0.6s';
202 balloon.style.webkitTransform = 'translate3d(0,' + -(w.scrollY + options.bottomOffset + balloon.offsetHeight) + 'px,0)';
203 break;
204 case 'bubble':
205 duration = '0.6s';
206 balloon.style.opacity = '0';
207 balloon.style.webkitTransform = 'translate3d(0,' + (startY + 50) + 'px,0)';
208 break;
209 default:
210 duration = '1s';
211 balloon.style.opacity = '0';
212 }
213 } else {
214 startY = w.innerHeight + w.scrollY;
215
216 if ( OSVersion < 5 ) {
217 startX = Math.round((w.innerWidth - balloon.offsetWidth) / 2) + w.scrollX;
218 balloon.style.left = startX + 'px';
219 balloon.style.top = startY - balloon.offsetHeight - options.bottomOffset + 'px';
220 } else {
221 balloon.style.left = '50%';
222 balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px';
223 balloon.style.bottom = options.bottomOffset + 'px';
224 }
225
226 switch (options.animationIn) {
227 case 'drop':
228 duration = '1s';
229 balloon.style.webkitTransform = 'translate3d(0,' + -(startY + options.bottomOffset) + 'px,0)';
230 break;
231 case 'bubble':
232 duration = '0.6s';
233 balloon.style.webkitTransform = 'translate3d(0,' + (balloon.offsetHeight + options.bottomOffset + 50) + 'px,0)';
234 break;
235 default:
236 duration = '1s';
237 balloon.style.opacity = '0';
238 }
239 }
240
241 balloon.offsetHeight;// repaint trick
242 balloon.style.webkitTransitionDuration = duration;
243 balloon.style.opacity = '1';
244 balloon.style.webkitTransform = 'translate3d(0,0,0)';
245 balloon.addEventListener('webkitTransitionEnd', transitionEnd, false);
246
247 closeTimeout = setTimeout(close, options.lifespan);
248 }
249
250 function manualShow (override) {
251 if ( !isIDevice || balloon ) return;
252
253 overrideChecks = override;
254 loaded();
255 }
256
257 function close () {
258 clearInterval( positionInterval );
259 clearTimeout( closeTimeout );
260 closeTimeout = null;
261
262 // check if the popup is displayed and prevent errors
263 if ( !balloon ) return;
264
265 var posY = 0,
266 posX = 0,
267 opacity = '1',
268 duration = '0';
269
270 if ( options.closeButton ) balloon.removeEventListener('click', clicked, false);
271 if ( !isIPad && OSVersion >= 6 ) window.removeEventListener('orientationchange', orientationCheck, false);
272
273 if ( OSVersion < 5 ) {
274 posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY;
275 posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth)/2) - startX;
276 }
277
278 balloon.style.webkitTransitionProperty = '-webkit-transform,opacity';
279
280 switch ( options.animationOut ) {
281 case 'drop':
282 if ( isIPad ) {
283 duration = '0.4s';
284 opacity = '0';
285 posY += 50;
286 } else {
287 duration = '0.6s';
288 posY += balloon.offsetHeight + options.bottomOffset + 50;
289 }
290 break;
291 case 'bubble':
292 if ( isIPad ) {
293 duration = '0.8s';
294 posY -= balloon.offsetHeight + options.bottomOffset + 50;
295 } else {
296 duration = '0.4s';
297 opacity = '0';
298 posY -= 50;
299 }
300 break;
301 default:
302 duration = '0.8s';
303 opacity = '0';
304 }
305
306 balloon.addEventListener('webkitTransitionEnd', transitionEnd, false);
307 balloon.style.opacity = opacity;
308 balloon.style.webkitTransitionDuration = duration;
309 balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';
310 }
311
312
313 function clicked () {
314 w.sessionStorage.setItem('addToHomeSession', '1');
315 isSessionActive = true;
316 close();
317 }
318
319 function transitionEnd () {
320 balloon.removeEventListener('webkitTransitionEnd', transitionEnd, false);
321
322 balloon.style.webkitTransitionProperty = '-webkit-transform';
323 balloon.style.webkitTransitionDuration = '0.2s';
324
325 // We reached the end!
326 if ( !closeTimeout ) {
327 balloon.parentNode.removeChild(balloon);
328 balloon = null;
329 return;
330 }
331
332 // On iOS 4 we start checking the element position
333 if ( OSVersion < 5 && closeTimeout ) positionInterval = setInterval(setPosition, options.iterations);
334 }
335
336 function setPosition () {
337 var matrix = new WebKitCSSMatrix(w.getComputedStyle(balloon, null).webkitTransform),
338 posY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY,
339 posX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth) / 2) - startX;
340
341 // Screen didn't move
342 if ( posY == matrix.m42 && posX == matrix.m41 ) return;
343
344 balloon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';
345 }
346
347 // Clear local and session storages (this is useful primarily in development)
348 function reset () {
349 w.localStorage.removeItem('addToHome');
350 w.sessionStorage.removeItem('addToHomeSession');
351 }
352
353 function orientationCheck () {
354 balloon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 ? 40 : 0 ) + 'px';
355 }
356
357 // Bootstrap!
358 init();
359
360 return {
361 show: manualShow,
362 close: close,
363 reset: reset
364 };
365})(window);
diff --git a/frontend/delta/js/MochiKit/Async.js b/frontend/delta/js/MochiKit/Async.js
new file mode 100644
index 0000000..a76aaa2
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Async.js
@@ -0,0 +1,733 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Async 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Async', '1.5', ['Base']);
35
36/** @id MochiKit.Async.Deferred */
37MochiKit.Async.Deferred = function (/* optional */ canceller) {
38 this.chain = [];
39 this.id = this._nextId();
40 this.fired = -1;
41 this.paused = 0;
42 this.results = [null, null];
43 this.canceller = canceller;
44 this.silentlyCancelled = false;
45 this.chained = false;
46 this.finalized = false;
47};
48
49MochiKit.Async.Deferred.prototype = {
50 /** @id MochiKit.Async.Deferred.prototype.repr */
51 repr: function () {
52 return 'Deferred(' + this.id + ', ' + this.state() + ')';
53 },
54
55 toString: MochiKit.Base.forwardCall("repr"),
56
57 _nextId: MochiKit.Base.counter(),
58
59 /** @id MochiKit.Async.Deferred.prototype.state */
60 state: function () {
61 if (this.fired == -1) {
62 return 'unfired';
63 } else if (this.fired === 0) {
64 return 'success';
65 } else {
66 return 'error';
67 }
68 },
69
70 /** @id MochiKit.Async.Deferred.prototype.cancel */
71 cancel: function (e) {
72 var self = MochiKit.Async;
73 if (this.fired == -1) {
74 if (this.canceller) {
75 this.canceller(this);
76 } else {
77 this.silentlyCancelled = true;
78 }
79 if (this.fired == -1) {
80 if (typeof(e) === 'string') {
81 e = new self.GenericError(e);
82 } else if (!(e instanceof Error)) {
83 e = new self.CancelledError(this);
84 }
85 this.errback(e);
86 }
87 } else if ((this.fired === 0) && (this.results[0] instanceof self.Deferred)) {
88 this.results[0].cancel(e);
89 }
90 },
91
92 _resback: function (res) {
93 /***
94
95 The primitive that means either callback or errback
96
97 ***/
98 this.fired = ((res instanceof Error) ? 1 : 0);
99 this.results[this.fired] = res;
100 if (this.paused === 0) {
101 this._fire();
102 }
103 },
104
105 _check: function () {
106 if (this.fired != -1) {
107 if (!this.silentlyCancelled) {
108 throw new MochiKit.Async.AlreadyCalledError(this);
109 }
110 this.silentlyCancelled = false;
111 return;
112 }
113 },
114
115 /** @id MochiKit.Async.Deferred.prototype.callback */
116 callback: function (res) {
117 this._check();
118 if (res instanceof MochiKit.Async.Deferred) {
119 throw new Error("Deferred instances can only be chained if they are the result of a callback");
120 }
121 this._resback(res);
122 },
123
124 /** @id MochiKit.Async.Deferred.prototype.errback */
125 errback: function (res) {
126 this._check();
127 var self = MochiKit.Async;
128 if (res instanceof self.Deferred) {
129 throw new Error("Deferred instances can only be chained if they are the result of a callback");
130 }
131 if (!(res instanceof Error)) {
132 res = new self.GenericError(res);
133 }
134 this._resback(res);
135 },
136
137 /** @id MochiKit.Async.Deferred.prototype.addBoth */
138 addBoth: function (fn) {
139 if (arguments.length > 1) {
140 fn = MochiKit.Base.partial.apply(null, arguments);
141 }
142 return this.addCallbacks(fn, fn);
143 },
144
145 /** @id MochiKit.Async.Deferred.prototype.addCallback */
146 addCallback: function (fn) {
147 if (arguments.length > 1) {
148 fn = MochiKit.Base.partial.apply(null, arguments);
149 }
150 return this.addCallbacks(fn, null);
151 },
152
153 /** @id MochiKit.Async.Deferred.prototype.addErrback */
154 addErrback: function (fn) {
155 if (arguments.length > 1) {
156 fn = MochiKit.Base.partial.apply(null, arguments);
157 }
158 return this.addCallbacks(null, fn);
159 },
160
161 /** @id MochiKit.Async.Deferred.prototype.addCallbacks */
162 addCallbacks: function (cb, eb) {
163 if (this.chained) {
164 throw new Error("Chained Deferreds can not be re-used");
165 }
166 if (this.finalized) {
167 throw new Error("Finalized Deferreds can not be re-used");
168 }
169 this.chain.push([cb, eb]);
170 if (this.fired >= 0) {
171 this._fire();
172 }
173 return this;
174 },
175
176 /** @id MochiKit.Async.Deferred.prototype.setFinalizer */
177 setFinalizer: function (fn) {
178 if (this.chained) {
179 throw new Error("Chained Deferreds can not be re-used");
180 }
181 if (this.finalized) {
182 throw new Error("Finalized Deferreds can not be re-used");
183 }
184 if (arguments.length > 1) {
185 fn = MochiKit.Base.partial.apply(null, arguments);
186 }
187 this._finalizer = fn;
188 if (this.fired >= 0) {
189 this._fire();
190 }
191 return this;
192 },
193
194 _fire: function () {
195 /***
196
197 Used internally to exhaust the callback sequence when a result
198 is available.
199
200 ***/
201 var chain = this.chain;
202 var fired = this.fired;
203 var res = this.results[fired];
204 var self = this;
205 var cb = null;
206 while (chain.length > 0 && this.paused === 0) {
207 // Array
208 var pair = chain.shift();
209 var f = pair[fired];
210 if (f === null) {
211 continue;
212 }
213 try {
214 res = f(res);
215 fired = ((res instanceof Error) ? 1 : 0);
216 if (res instanceof MochiKit.Async.Deferred) {
217 cb = function (res) {
218 self.paused--;
219 self._resback(res);
220 };
221 this.paused++;
222 }
223 } catch (err) {
224 fired = 1;
225 if (!(err instanceof Error)) {
226 err = new MochiKit.Async.GenericError(err);
227 }
228 res = err;
229 }
230 }
231 this.fired = fired;
232 this.results[fired] = res;
233 if (this.chain.length == 0 && this.paused === 0 && this._finalizer) {
234 this.finalized = true;
235 this._finalizer(res);
236 }
237 if (cb && this.paused) {
238 // this is for "tail recursion" in case the dependent deferred
239 // is already fired
240 res.addBoth(cb);
241 res.chained = true;
242 }
243 }
244};
245
246MochiKit.Base.update(MochiKit.Async, {
247 /** @id MochiKit.Async.evalJSONRequest */
248 evalJSONRequest: function (req) {
249 return MochiKit.Base.evalJSON(req.responseText);
250 },
251
252 /** @id MochiKit.Async.succeed */
253 succeed: function (/* optional */result) {
254 var d = new MochiKit.Async.Deferred();
255 d.callback.apply(d, arguments);
256 return d;
257 },
258
259 /** @id MochiKit.Async.fail */
260 fail: function (/* optional */result) {
261 var d = new MochiKit.Async.Deferred();
262 d.errback.apply(d, arguments);
263 return d;
264 },
265
266 /** @id MochiKit.Async.getXMLHttpRequest */
267 getXMLHttpRequest: function () {
268 var self = arguments.callee;
269 if (!self.XMLHttpRequest) {
270 var tryThese = [
271 function () { return new XMLHttpRequest(); },
272 function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
273 function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
274 function () { return new ActiveXObject('Msxml2.XMLHTTP.4.0'); },
275 function () {
276 throw new MochiKit.Async.BrowserComplianceError("Browser does not support XMLHttpRequest");
277 }
278 ];
279 for (var i = 0; i < tryThese.length; i++) {
280 var func = tryThese[i];
281 try {
282 self.XMLHttpRequest = func;
283 return func();
284 } catch (e) {
285 // pass
286 }
287 }
288 }
289 return self.XMLHttpRequest();
290 },
291
292 _xhr_onreadystatechange: function (d) {
293 // MochiKit.Logging.logDebug('this.readyState', this.readyState);
294 var m = MochiKit.Base;
295 if (this.readyState == 4) {
296 // IE SUCKS
297 try {
298 this.onreadystatechange = null;
299 } catch (e) {
300 try {
301 this.onreadystatechange = m.noop;
302 } catch (e) {
303 }
304 }
305 var status = null;
306 try {
307 status = this.status;
308 if (!status && (this.response || m.isNotEmpty(this.responseText))) {
309 // 0 or undefined seems to mean cached or local
310 status = 304;
311 }
312 } catch (e) {
313 // pass
314 // MochiKit.Logging.logDebug('error getting status?', repr(items(e)));
315 }
316 // 200 is OK, 201 is CREATED, 204 is NO CONTENT
317 // 304 is NOT MODIFIED, 1223 is apparently a bug in IE
318 if (status == 200 || status == 201 || status == 204 ||
319 status == 304 || status == 1223) {
320 d.callback(this);
321 } else {
322 var err = new MochiKit.Async.XMLHttpRequestError(this, "Request failed");
323 if (err.number) {
324 // XXX: This seems to happen on page change
325 d.errback(err);
326 } else {
327 // XXX: this seems to happen when the server is unreachable
328 d.errback(err);
329 }
330 }
331 }
332 },
333
334 _xhr_canceller: function (req) {
335 // IE SUCKS
336 try {
337 req.onreadystatechange = null;
338 } catch (e) {
339 try {
340 req.onreadystatechange = MochiKit.Base.noop;
341 } catch (e) {
342 }
343 }
344 req.abort();
345 },
346
347
348 /** @id MochiKit.Async.sendXMLHttpRequest */
349 sendXMLHttpRequest: function (req, /* optional */ sendContent) {
350 if (typeof(sendContent) == "undefined" || sendContent === null) {
351 sendContent = "";
352 }
353
354 var m = MochiKit.Base;
355 var self = MochiKit.Async;
356 var d = new self.Deferred(m.partial(self._xhr_canceller, req));
357
358 try {
359 req.onreadystatechange = m.bind(self._xhr_onreadystatechange,
360 req, d);
361 req.send(sendContent);
362 } catch (e) {
363 try {
364 req.onreadystatechange = null;
365 } catch (ignore) {
366 // pass
367 }
368 d.errback(e);
369 }
370
371 return d;
372
373 },
374
375 /** @id MochiKit.Async.doXHR */
376 doXHR: function (url, opts) {
377 /*
378 Work around a Firefox bug by dealing with XHR during
379 the next event loop iteration. Maybe it's this one:
380 https://bugzilla.mozilla.org/show_bug.cgi?id=249843
381 */
382 var self = MochiKit.Async;
383 return self.callLater(0, self._doXHR, url, opts);
384 },
385
386 _doXHR: function (url, opts) {
387 var m = MochiKit.Base;
388 opts = m.update({
389 method: 'GET',
390 sendContent: ''
391 /*
392 queryString: undefined,
393 username: undefined,
394 password: undefined,
395 headers: undefined,
396 mimeType: undefined,
397 responseType: undefined,
398 withCredentials: undefined
399 */
400 }, opts);
401 var self = MochiKit.Async;
402 var req = self.getXMLHttpRequest();
403 if (opts.queryString) {
404 var qs = m.queryString(opts.queryString);
405 if (qs) {
406 url += "?" + qs;
407 }
408 }
409 // Safari will send undefined:undefined, so we have to check.
410 // We can't use apply, since the function is native.
411 if ('username' in opts) {
412 req.open(opts.method, url, true, opts.username, opts.password);
413 } else {
414 req.open(opts.method, url, true);
415 }
416 if (req.overrideMimeType && opts.mimeType) {
417 req.overrideMimeType(opts.mimeType);
418 }
419 req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
420 if (opts.headers) {
421 var headers = opts.headers;
422 if (!m.isArrayLike(headers)) {
423 headers = m.items(headers);
424 }
425 for (var i = 0; i < headers.length; i++) {
426 var header = headers[i];
427 var name = header[0];
428 var value = header[1];
429 req.setRequestHeader(name, value);
430 }
431 }
432 if ("responseType" in opts && "responseType" in req) {
433 req.responseType = opts.responseType;
434 }
435 if (opts.withCredentials) {
436 req.withCredentials = 'true';
437 }
438 return self.sendXMLHttpRequest(req, opts.sendContent);
439 },
440
441 _buildURL: function (url/*, ...*/) {
442 if (arguments.length > 1) {
443 var m = MochiKit.Base;
444 var qs = m.queryString.apply(null, m.extend(null, arguments, 1));
445 if (qs) {
446 return url + "?" + qs;
447 }
448 }
449 return url;
450 },
451
452 /** @id MochiKit.Async.doSimpleXMLHttpRequest */
453 doSimpleXMLHttpRequest: function (url/*, ...*/) {
454 var self = MochiKit.Async;
455 url = self._buildURL.apply(self, arguments);
456 return self.doXHR(url);
457 },
458
459 /** @id MochiKit.Async.loadJSONDoc */
460 loadJSONDoc: function (url/*, ...*/) {
461 var self = MochiKit.Async;
462 url = self._buildURL.apply(self, arguments);
463 var d = self.doXHR(url, {
464 'mimeType': 'text/plain',
465 'headers': [['Accept', 'application/json']]
466 });
467 d = d.addCallback(self.evalJSONRequest);
468 return d;
469 },
470
471 /** @id MochiKit.Async.loadScript */
472 loadScript: function (url) {
473 var d = new MochiKit.Async.Deferred();
474 var script = document.createElement("script");
475 script.type = "text/javascript";
476 script.src = url;
477 script.onload = function () {
478 script.onload = null;
479 script.onerror = null;
480 script.onreadystatechange = null;
481 script = null;
482 d.callback();
483 };
484 script.onerror = function (msg) {
485 script.onload = null;
486 script.onerror = null;
487 script.onreadystatechange = null;
488 script = null;
489 msg = "Failed to load script at " + url + ": " + msg;
490 d.errback(new URIError(msg, url));
491 }
492 script.onreadystatechange = function () {
493 if (script.readyState == "loaded" || script.readyState == "complete") {
494 script.onload();
495 } else {
496 // IE doesn't bother to report errors...
497 MochiKit.Async.callLater(10, script.onerror, "Script loading timed out")
498 }
499 };
500 document.getElementsByTagName("head")[0].appendChild(script);
501 return d;
502 },
503
504 /** @id MochiKit.Async.wait */
505 wait: function (seconds, /* optional */value) {
506 var d = new MochiKit.Async.Deferred();
507 var cb = MochiKit.Base.bind("callback", d, value);
508 var timeout = setTimeout(cb, Math.floor(seconds * 1000));
509 d.canceller = function () {
510 try {
511 clearTimeout(timeout);
512 } catch (e) {
513 // pass
514 }
515 };
516 return d;
517 },
518
519 /** @id MochiKit.Async.callLater */
520 callLater: function (seconds, func) {
521 var m = MochiKit.Base;
522 var pfunc = m.partial.apply(m, m.extend(null, arguments, 1));
523 return MochiKit.Async.wait(seconds).addCallback(
524 function (res) { return pfunc(); }
525 );
526 }
527});
528
529
530/** @id MochiKit.Async.DeferredLock */
531MochiKit.Async.DeferredLock = function () {
532 this.waiting = [];
533 this.locked = false;
534 this.id = this._nextId();
535};
536
537MochiKit.Async.DeferredLock.prototype = {
538 __class__: MochiKit.Async.DeferredLock,
539 /** @id MochiKit.Async.DeferredLock.prototype.acquire */
540 acquire: function () {
541 var d = new MochiKit.Async.Deferred();
542 if (this.locked) {
543 this.waiting.push(d);
544 } else {
545 this.locked = true;
546 d.callback(this);
547 }
548 return d;
549 },
550 /** @id MochiKit.Async.DeferredLock.prototype.release */
551 release: function () {
552 if (!this.locked) {
553 throw TypeError("Tried to release an unlocked DeferredLock");
554 }
555 this.locked = false;
556 if (this.waiting.length > 0) {
557 this.locked = true;
558 this.waiting.shift().callback(this);
559 }
560 },
561 _nextId: MochiKit.Base.counter(),
562 repr: function () {
563 var state;
564 if (this.locked) {
565 state = 'locked, ' + this.waiting.length + ' waiting';
566 } else {
567 state = 'unlocked';
568 }
569 return 'DeferredLock(' + this.id + ', ' + state + ')';
570 },
571 toString: MochiKit.Base.forwardCall("repr")
572
573};
574
575/** @id MochiKit.Async.DeferredList */
576MochiKit.Async.DeferredList = function (list, /* optional */fireOnOneCallback, fireOnOneErrback, consumeErrors, canceller) {
577
578 // call parent constructor
579 MochiKit.Async.Deferred.apply(this, [canceller]);
580
581 this.list = list;
582 var resultList = [];
583 this.resultList = resultList;
584
585 this.finishedCount = 0;
586 this.fireOnOneCallback = fireOnOneCallback;
587 this.fireOnOneErrback = fireOnOneErrback;
588 this.consumeErrors = consumeErrors;
589
590 var cb = MochiKit.Base.bind(this._cbDeferred, this);
591 for (var i = 0; i < list.length; i++) {
592 var d = list[i];
593 resultList.push(undefined);
594 d.addCallback(cb, i, true);
595 d.addErrback(cb, i, false);
596 }
597
598 if (list.length === 0 && !fireOnOneCallback) {
599 this.callback(this.resultList);
600 }
601
602};
603
604MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred();
605MochiKit.Async.DeferredList.prototype.constructor = MochiKit.Async.DeferredList;
606
607MochiKit.Async.DeferredList.prototype._cbDeferred = function (index, succeeded, result) {
608 this.resultList[index] = [succeeded, result];
609 this.finishedCount += 1;
610 if (this.fired == -1) {
611 if (succeeded && this.fireOnOneCallback) {
612 this.callback([index, result]);
613 } else if (!succeeded && this.fireOnOneErrback) {
614 this.errback(result);
615 } else if (this.finishedCount == this.list.length) {
616 this.callback(this.resultList);
617 }
618 }
619 if (!succeeded && this.consumeErrors) {
620 result = null;
621 }
622 return result;
623};
624
625/** @id MochiKit.Async.gatherResults */
626MochiKit.Async.gatherResults = function (deferredList) {
627 var d = new MochiKit.Async.DeferredList(deferredList, false, true, false);
628 d.addCallback(function (results) {
629 var ret = [];
630 for (var i = 0; i < results.length; i++) {
631 ret.push(results[i][1]);
632 }
633 return ret;
634 });
635 return d;
636};
637
638/** @id MochiKit.Async.maybeDeferred */
639MochiKit.Async.maybeDeferred = function (func) {
640 var self = MochiKit.Async;
641 var result;
642 try {
643 var r = func.apply(null, MochiKit.Base.extend([], arguments, 1));
644 if (r instanceof self.Deferred) {
645 result = r;
646 } else if (r instanceof Error) {
647 result = self.fail(r);
648 } else {
649 result = self.succeed(r);
650 }
651 } catch (e) {
652 result = self.fail(e);
653 }
654 return result;
655};
656
657
658MochiKit.Async.__new__ = function () {
659 var m = MochiKit.Base;
660 var ne = m.partial(m._newNamedError, this);
661
662 ne("AlreadyCalledError",
663 /** @id MochiKit.Async.AlreadyCalledError */
664 function (deferred) {
665 /***
666
667 Raised by the Deferred if callback or errback happens
668 after it was already fired.
669
670 ***/
671 this.deferred = deferred;
672 }
673 );
674
675 ne("CancelledError",
676 /** @id MochiKit.Async.CancelledError */
677 function (deferred) {
678 /***
679
680 Raised by the Deferred cancellation mechanism.
681
682 ***/
683 this.deferred = deferred;
684 }
685 );
686
687 ne("BrowserComplianceError",
688 /** @id MochiKit.Async.BrowserComplianceError */
689 function (msg) {
690 /***
691
692 Raised when the JavaScript runtime is not capable of performing
693 the given function. Technically, this should really never be
694 raised because a non-conforming JavaScript runtime probably
695 isn't going to support exceptions in the first place.
696
697 ***/
698 this.message = msg;
699 }
700 );
701
702 ne("GenericError",
703 /** @id MochiKit.Async.GenericError */
704 function (msg) {
705 this.message = msg;
706 }
707 );
708
709 ne("XMLHttpRequestError",
710 /** @id MochiKit.Async.XMLHttpRequestError */
711 function (req, msg) {
712 /***
713
714 Raised when an XMLHttpRequest does not complete for any reason.
715
716 ***/
717 this.req = req;
718 this.message = msg;
719 try {
720 // Strange but true that this can raise in some cases.
721 this.number = req.status;
722 } catch (e) {
723 // pass
724 }
725 }
726 );
727
728 m.nameFunctions(this);
729};
730
731MochiKit.Async.__new__();
732
733MochiKit.Base._exportSymbols(this, MochiKit.Async);
diff --git a/frontend/delta/js/MochiKit/Base.js b/frontend/delta/js/MochiKit/Base.js
new file mode 100644
index 0000000..c55f5c3
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Base.js
@@ -0,0 +1,1523 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Base 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34
35// MochiKit module (namespace)
36var MochiKit = MochiKit || {};
37if (typeof(MochiKit.__export__) == "undefined") {
38 MochiKit.__export__ = true;
39}
40MochiKit.NAME = "MochiKit";
41MochiKit.VERSION = "1.5";
42MochiKit.__repr__ = function () {
43 return "[" + this.NAME + " " + this.VERSION + "]";
44};
45MochiKit.toString = function () {
46 return this.__repr__();
47};
48
49
50// MochiKit.Base module
51MochiKit.Base = MochiKit.Base || {};
52
53/**
54 * Creates a new module in a parent namespace. This function will
55 * create a new empty module object with "NAME", "VERSION",
56 * "toString" and "__repr__" properties. This object will be inserted into the parent object
57 * using the specified name (i.e. parent[name] = module). It will
58 * also verify that all the dependency modules are defined in the
59 * parent, or an error will be thrown.
60 *
61 * @param {Object} parent the parent module (use "this" or "window" for
62 * a global module)
63 * @param {String} name the module name, e.g. "Base"
64 * @param {String} version the module version, e.g. "1.5"
65 * @param {Array} [deps] the array of module dependencies (as strings)
66 */
67MochiKit.Base.module = function (parent, name, version, deps) {
68 var module = parent[name] = parent[name] || {};
69 var prefix = (parent.NAME ? parent.NAME + "." : "");
70 module.NAME = prefix + name;
71 module.VERSION = version;
72 module.__repr__ = function () {
73 return "[" + this.NAME + " " + this.VERSION + "]";
74 };
75 module.toString = function () {
76 return this.__repr__();
77 };
78 for (var i = 0; deps != null && i < deps.length; i++) {
79 if (!(deps[i] in parent)) {
80 throw module.NAME + ' depends on ' + prefix + deps[i] + '!';
81 }
82 }
83 return module;
84};
85
86MochiKit.Base.module(MochiKit, "Base", "1.5", []);
87
88/** @id MochiKit.Base.update */
89MochiKit.Base.update = function (self, obj/*, ... */) {
90 if (self === null || self === undefined) {
91 self = {};
92 }
93 for (var i = 1; i < arguments.length; i++) {
94 var o = arguments[i];
95 if (typeof(o) != 'undefined' && o !== null) {
96 for (var k in o) {
97 self[k] = o[k];
98 }
99 }
100 }
101 return self;
102};
103
104MochiKit.Base.update(MochiKit.Base, {
105 /** @id MochiKit.Base.camelize */
106 camelize: function (selector) {
107 /* from dojo.style.toCamelCase */
108 var arr = selector.split('-');
109 var cc = arr[0];
110 for (var i = 1; i < arr.length; i++) {
111 cc += arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
112 }
113 return cc;
114 },
115
116 /** @id MochiKit.Base.counter */
117 counter: function (n/* = 1 */) {
118 if (arguments.length === 0) {
119 n = 1;
120 }
121 return function () {
122 return n++;
123 };
124 },
125
126 /** @id MochiKit.Base.clone */
127 clone: function (obj) {
128 var me = arguments.callee;
129 if (arguments.length == 1) {
130 me.prototype = obj;
131 return new me();
132 }
133 },
134
135 _flattenArray: function (res, lst) {
136 for (var i = 0; i < lst.length; i++) {
137 var o = lst[i];
138 if (o instanceof Array) {
139 arguments.callee(res, o);
140 } else {
141 res.push(o);
142 }
143 }
144 return res;
145 },
146
147 /** @id MochiKit.Base.flattenArray */
148 flattenArray: function (lst) {
149 return MochiKit.Base._flattenArray([], lst);
150 },
151
152 /** @id MochiKit.Base.flattenArguments */
153 flattenArguments: function (lst/* ...*/) {
154 var res = [];
155 var m = MochiKit.Base;
156 var args = m.extend(null, arguments);
157 while (args.length) {
158 var o = args.shift();
159 if (o && typeof(o) == "object" && typeof(o.length) == "number") {
160 for (var i = o.length - 1; i >= 0; i--) {
161 args.unshift(o[i]);
162 }
163 } else {
164 res.push(o);
165 }
166 }
167 return res;
168 },
169
170 /** @id MochiKit.Base.extend */
171 extend: function (self, obj, /* optional */skip) {
172 // Extend an array with an array-like object starting
173 // from the skip index
174 if (!skip) {
175 skip = 0;
176 }
177 if (obj) {
178 // allow iterable fall-through, but skip the full isArrayLike
179 // check for speed, this is called often.
180 var l = obj.length;
181 if (typeof(l) != 'number' /* !isArrayLike(obj) */) {
182 if (typeof(MochiKit.Iter) != "undefined") {
183 obj = MochiKit.Iter.list(obj);
184 l = obj.length;
185 } else {
186 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
187 }
188 }
189 if (!self) {
190 self = [];
191 }
192 for (var i = skip; i < l; i++) {
193 self.push(obj[i]);
194 }
195 }
196 // This mutates, but it's convenient to return because
197 // it's often used like a constructor when turning some
198 // ghetto array-like to a real array
199 return self;
200 },
201
202
203 /** @id MochiKit.Base.updatetree */
204 updatetree: function (self, obj/*, ...*/) {
205 if (self === null || self === undefined) {
206 self = {};
207 }
208 for (var i = 1; i < arguments.length; i++) {
209 var o = arguments[i];
210 if (typeof(o) != 'undefined' && o !== null) {
211 for (var k in o) {
212 var v = o[k];
213 if (typeof(self[k]) == 'object' && typeof(v) == 'object') {
214 arguments.callee(self[k], v);
215 } else {
216 self[k] = v;
217 }
218 }
219 }
220 }
221 return self;
222 },
223
224 /** @id MochiKit.Base.setdefault */
225 setdefault: function (self, obj/*, ...*/) {
226 if (self === null || self === undefined) {
227 self = {};
228 }
229 for (var i = 1; i < arguments.length; i++) {
230 var o = arguments[i];
231 for (var k in o) {
232 if (!(k in self)) {
233 self[k] = o[k];
234 }
235 }
236 }
237 return self;
238 },
239
240 /** @id MochiKit.Base.keys */
241 keys: function (obj) {
242 var rval = [];
243 for (var prop in obj) {
244 rval.push(prop);
245 }
246 return rval;
247 },
248
249 /** @id MochiKit.Base.values */
250 values: function (obj) {
251 var rval = [];
252 for (var prop in obj) {
253 rval.push(obj[prop]);
254 }
255 return rval;
256 },
257
258 /** @id MochiKit.Base.items */
259 items: function (obj) {
260 var rval = [];
261 var e;
262 for (var prop in obj) {
263 var v;
264 try {
265 v = obj[prop];
266 } catch (e) {
267 continue;
268 }
269 rval.push([prop, v]);
270 }
271 return rval;
272 },
273
274
275 _newNamedError: function (module, name, func) {
276 func.prototype = new MochiKit.Base.NamedError(module.NAME + "." + name);
277 func.prototype.constructor = func;
278 module[name] = func;
279 },
280
281
282 /** @id MochiKit.Base.operator */
283 operator: {
284 // unary logic operators
285 /** @id MochiKit.Base.truth */
286 truth: function (a) { return !!a; },
287 /** @id MochiKit.Base.lognot */
288 lognot: function (a) { return !a; },
289 /** @id MochiKit.Base.identity */
290 identity: function (a) { return a; },
291
292 // bitwise unary operators
293 /** @id MochiKit.Base.not */
294 not: function (a) { return ~a; },
295 /** @id MochiKit.Base.neg */
296 neg: function (a) { return -a; },
297
298 // binary operators
299 /** @id MochiKit.Base.add */
300 add: function (a, b) { return a + b; },
301 /** @id MochiKit.Base.sub */
302 sub: function (a, b) { return a - b; },
303 /** @id MochiKit.Base.div */
304 div: function (a, b) { return a / b; },
305 /** @id MochiKit.Base.mod */
306 mod: function (a, b) { return a % b; },
307 /** @id MochiKit.Base.mul */
308 mul: function (a, b) { return a * b; },
309
310 // bitwise binary operators
311 /** @id MochiKit.Base.and */
312 and: function (a, b) { return a & b; },
313 /** @id MochiKit.Base.or */
314 or: function (a, b) { return a | b; },
315 /** @id MochiKit.Base.xor */
316 xor: function (a, b) { return a ^ b; },
317 /** @id MochiKit.Base.lshift */
318 lshift: function (a, b) { return a << b; },
319 /** @id MochiKit.Base.rshift */
320 rshift: function (a, b) { return a >> b; },
321 /** @id MochiKit.Base.zrshift */
322 zrshift: function (a, b) { return a >>> b; },
323
324 // near-worthless built-in comparators
325 /** @id MochiKit.Base.eq */
326 eq: function (a, b) { return a == b; },
327 /** @id MochiKit.Base.ne */
328 ne: function (a, b) { return a != b; },
329 /** @id MochiKit.Base.gt */
330 gt: function (a, b) { return a > b; },
331 /** @id MochiKit.Base.ge */
332 ge: function (a, b) { return a >= b; },
333 /** @id MochiKit.Base.lt */
334 lt: function (a, b) { return a < b; },
335 /** @id MochiKit.Base.le */
336 le: function (a, b) { return a <= b; },
337
338 // strict built-in comparators
339 seq: function (a, b) { return a === b; },
340 sne: function (a, b) { return a !== b; },
341
342 // compare comparators
343 /** @id MochiKit.Base.ceq */
344 ceq: function (a, b) { return MochiKit.Base.compare(a, b) === 0; },
345 /** @id MochiKit.Base.cne */
346 cne: function (a, b) { return MochiKit.Base.compare(a, b) !== 0; },
347 /** @id MochiKit.Base.cgt */
348 cgt: function (a, b) { return MochiKit.Base.compare(a, b) == 1; },
349 /** @id MochiKit.Base.cge */
350 cge: function (a, b) { return MochiKit.Base.compare(a, b) != -1; },
351 /** @id MochiKit.Base.clt */
352 clt: function (a, b) { return MochiKit.Base.compare(a, b) == -1; },
353 /** @id MochiKit.Base.cle */
354 cle: function (a, b) { return MochiKit.Base.compare(a, b) != 1; },
355
356 // binary logical operators
357 /** @id MochiKit.Base.logand */
358 logand: function (a, b) { return a && b; },
359 /** @id MochiKit.Base.logor */
360 logor: function (a, b) { return a || b; },
361 /** @id MochiKit.Base.contains */
362 contains: function (a, b) { return b in a; }
363 },
364
365 /** @id MochiKit.Base.forwardCall */
366 forwardCall: function (func) {
367 return function () {
368 return this[func].apply(this, arguments);
369 };
370 },
371
372 /** @id MochiKit.Base.itemgetter */
373 itemgetter: function (func) {
374 return function (arg) {
375 return arg[func];
376 };
377 },
378
379 /** @id MochiKit.Base.bool */
380 bool: function (value) {
381 if (typeof(value) === "boolean" || value instanceof Boolean) {
382 return value.valueOf();
383 } else if (typeof(value) === "string" || value instanceof String) {
384 return value.length > 0 && value != "false" && value != "null" &&
385 value != "undefined" && value != "0";
386 } else if (typeof(value) === "number" || value instanceof Number) {
387 return !isNaN(value) && value != 0;
388 } else if (value != null && typeof(value.length) === "number") {
389 return value.length !== 0;
390 } else {
391 return value != null;
392 }
393 },
394
395 /** @id MochiKit.Base.typeMatcher */
396 typeMatcher: function (/* typ */) {
397 var types = {};
398 for (var i = 0; i < arguments.length; i++) {
399 var typ = arguments[i];
400 types[typ] = typ;
401 }
402 return function () {
403 for (var i = 0; i < arguments.length; i++) {
404 if (!(typeof(arguments[i]) in types)) {
405 return false;
406 }
407 }
408 return true;
409 };
410 },
411
412 /** @id MochiKit.Base.isNull */
413 isNull: function (/* ... */) {
414 for (var i = 0; i < arguments.length; i++) {
415 if (arguments[i] !== null) {
416 return false;
417 }
418 }
419 return true;
420 },
421
422 /** @id MochiKit.Base.isUndefinedOrNull */
423 isUndefinedOrNull: function (/* ... */) {
424 for (var i = 0; i < arguments.length; i++) {
425 var o = arguments[i];
426 if (!(typeof(o) == 'undefined' || o === null)) {
427 return false;
428 }
429 }
430 return true;
431 },
432
433 /** @id MochiKit.Base.isEmpty */
434 isEmpty: function (obj) {
435 return !MochiKit.Base.isNotEmpty.apply(this, arguments);
436 },
437
438 /** @id MochiKit.Base.isNotEmpty */
439 isNotEmpty: function (obj) {
440 for (var i = 0; i < arguments.length; i++) {
441 var o = arguments[i];
442 if (!(o && o.length)) {
443 return false;
444 }
445 }
446 return true;
447 },
448
449 /** @id MochiKit.Base.isArrayLike */
450 isArrayLike: function () {
451 for (var i = 0; i < arguments.length; i++) {
452 var o = arguments[i];
453 var typ = typeof(o);
454 if (
455 (typ != 'object' && !(typ == 'function' && typeof(o.item) == 'function')) ||
456 o === null ||
457 typeof(o.length) != 'number' ||
458 o.nodeType === 3 ||
459 o.nodeType === 4
460 ) {
461 return false;
462 }
463 }
464 return true;
465 },
466
467 /** @id MochiKit.Base.isDateLike */
468 isDateLike: function () {
469 for (var i = 0; i < arguments.length; i++) {
470 var o = arguments[i];
471 if (typeof(o) != "object" || o === null
472 || typeof(o.getTime) != 'function') {
473 return false;
474 }
475 }
476 return true;
477 },
478
479
480 /** @id MochiKit.Base.xmap */
481 xmap: function (fn/*, obj... */) {
482 if (fn === null) {
483 return MochiKit.Base.extend(null, arguments, 1);
484 }
485 var rval = [];
486 for (var i = 1; i < arguments.length; i++) {
487 rval.push(fn(arguments[i]));
488 }
489 return rval;
490 },
491
492 /** @id MochiKit.Base.map */
493 map: function (fn, lst/*, lst... */) {
494 var m = MochiKit.Base;
495 var itr = MochiKit.Iter;
496 var isArrayLike = m.isArrayLike;
497 if (arguments.length <= 2) {
498 // allow an iterable to be passed
499 if (!isArrayLike(lst)) {
500 if (itr) {
501 // fast path for map(null, iterable)
502 lst = itr.list(lst);
503 if (fn === null) {
504 return lst;
505 }
506 } else {
507 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
508 }
509 }
510 // fast path for map(null, lst)
511 if (fn === null) {
512 return m.extend(null, lst);
513 }
514 // disabled fast path for map(fn, lst)
515 /*
516 if (false && typeof(Array.prototype.map) == 'function') {
517 // Mozilla fast-path
518 return Array.prototype.map.call(lst, fn);
519 }
520 */
521 var rval = [];
522 for (var i = 0; i < lst.length; i++) {
523 rval.push(fn(lst[i]));
524 }
525 return rval;
526 } else {
527 // default for map(null, ...) is zip(...)
528 if (fn === null) {
529 fn = Array;
530 }
531 var length = null;
532 for (var i = 1; i < arguments.length; i++) {
533 // allow iterables to be passed
534 if (!isArrayLike(arguments[i])) {
535 if (itr) {
536 return itr.list(itr.imap.apply(null, arguments));
537 } else {
538 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
539 }
540 }
541 // find the minimum length
542 var l = arguments[i].length;
543 if (length === null || length > l) {
544 length = l;
545 }
546 }
547 rval = [];
548 for (var i = 0; i < length; i++) {
549 var args = [];
550 for (var j = 1; j < arguments.length; j++) {
551 args.push(arguments[j][i]);
552 }
553 rval.push(fn.apply(this, args));
554 }
555 return rval;
556 }
557 },
558
559 /** @id MochiKit.Base.xfilter */
560 xfilter: function (fn/*, obj... */) {
561 var rval = [];
562 if (fn === null) {
563 fn = MochiKit.Base.operator.truth;
564 }
565 for (var i = 1; i < arguments.length; i++) {
566 var o = arguments[i];
567 if (fn(o)) {
568 rval.push(o);
569 }
570 }
571 return rval;
572 },
573
574 /** @id MochiKit.Base.filter */
575 filter: function (fn, lst, self) {
576 var rval = [];
577 // allow an iterable to be passed
578 var m = MochiKit.Base;
579 if (!m.isArrayLike(lst)) {
580 if (MochiKit.Iter) {
581 lst = MochiKit.Iter.list(lst);
582 } else {
583 throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
584 }
585 }
586 if (fn === null) {
587 fn = m.operator.truth;
588 }
589 if (typeof(Array.prototype.filter) == 'function') {
590 // Mozilla fast-path
591 return Array.prototype.filter.call(lst, fn, self);
592 } else if (typeof(self) == 'undefined' || self === null) {
593 for (var i = 0; i < lst.length; i++) {
594 var o = lst[i];
595 if (fn(o)) {
596 rval.push(o);
597 }
598 }
599 } else {
600 for (var i = 0; i < lst.length; i++) {
601 o = lst[i];
602 if (fn.call(self, o)) {
603 rval.push(o);
604 }
605 }
606 }
607 return rval;
608 },
609
610
611 _wrapDumbFunction: function (func) {
612 return function () {
613 // fast path!
614 switch (arguments.length) {
615 case 0: return func();
616 case 1: return func(arguments[0]);
617 case 2: return func(arguments[0], arguments[1]);
618 case 3: return func(arguments[0], arguments[1], arguments[2]);
619 }
620 var args = [];
621 for (var i = 0; i < arguments.length; i++) {
622 args.push("arguments[" + i + "]");
623 }
624 return eval("(func(" + args.join(",") + "))");
625 };
626 },
627
628 /** @id MochiKit.Base.methodcaller */
629 methodcaller: function (func/*, args... */) {
630 var args = MochiKit.Base.extend(null, arguments, 1);
631 if (typeof(func) == "function") {
632 return function (obj) {
633 return func.apply(obj, args);
634 };
635 } else {
636 return function (obj) {
637 return obj[func].apply(obj, args);
638 };
639 }
640 },
641
642 /** @id MochiKit.Base.method */
643 method: function (self, func) {
644 var m = MochiKit.Base;
645 return m.bind.apply(this, m.extend([func, self], arguments, 2));
646 },
647
648 /** @id MochiKit.Base.compose */
649 compose: function (f1, f2/*, f3, ... fN */) {
650 var fnlist = [];
651 var m = MochiKit.Base;
652 if (arguments.length === 0) {
653 throw new TypeError("compose() requires at least one argument");
654 }
655 for (var i = 0; i < arguments.length; i++) {
656 var fn = arguments[i];
657 if (typeof(fn) != "function") {
658 throw new TypeError(m.repr(fn) + " is not a function");
659 }
660 fnlist.push(fn);
661 }
662 return function () {
663 var args = arguments;
664 for (var i = fnlist.length - 1; i >= 0; i--) {
665 args = [fnlist[i].apply(this, args)];
666 }
667 return args[0];
668 };
669 },
670
671 /** @id MochiKit.Base.bind */
672 bind: function (func, self/* args... */) {
673 if (typeof(func) == "string") {
674 func = self[func];
675 }
676 var im_func = func.im_func;
677 var im_preargs = func.im_preargs;
678 var im_self = func.im_self;
679 var m = MochiKit.Base;
680 if (typeof(func) == "function" && typeof(func.apply) == "undefined") {
681 // this is for cases where JavaScript sucks ass and gives you a
682 // really dumb built-in function like alert() that doesn't have
683 // an apply
684 func = m._wrapDumbFunction(func);
685 }
686 if (typeof(im_func) != 'function') {
687 im_func = func;
688 }
689 if (typeof(self) != 'undefined') {
690 im_self = self;
691 }
692 if (typeof(im_preargs) == 'undefined') {
693 im_preargs = [];
694 } else {
695 im_preargs = im_preargs.slice();
696 }
697 m.extend(im_preargs, arguments, 2);
698 var newfunc = function () {
699 var args = arguments;
700 var me = arguments.callee;
701 if (me.im_preargs.length > 0) {
702 args = m.concat(me.im_preargs, args);
703 }
704 var self = me.im_self;
705 if (!self) {
706 self = this;
707 }
708 return me.im_func.apply(self, args);
709 };
710 newfunc.im_self = im_self;
711 newfunc.im_func = im_func;
712 newfunc.im_preargs = im_preargs;
713 if (typeof(im_func.NAME) == 'string') {
714 newfunc.NAME = "bind(" + im_func.NAME + ",...)";
715 }
716 return newfunc;
717 },
718
719 /** @id MochiKit.Base.bindLate */
720 bindLate: function (func, self/* args... */) {
721 var m = MochiKit.Base;
722 var args = arguments;
723 if (typeof(func) === "string") {
724 args = m.extend([m.forwardCall(func)], arguments, 1);
725 return m.bind.apply(this, args);
726 }
727 return m.bind.apply(this, args);
728 },
729
730 /** @id MochiKit.Base.bindMethods */
731 bindMethods: function (self) {
732 var bind = MochiKit.Base.bind;
733 for (var k in self) {
734 var func = self[k];
735 if (typeof(func) == 'function') {
736 self[k] = bind(func, self);
737 }
738 }
739 },
740
741 /** @id MochiKit.Base.registerComparator */
742 registerComparator: function (name, check, comparator, /* optional */ override) {
743 MochiKit.Base.comparatorRegistry.register(name, check, comparator, override);
744 },
745
746 _primitives: {'boolean': true, 'string': true, 'number': true},
747
748 /** @id MochiKit.Base.compare */
749 compare: function (a, b) {
750 if (a == b) {
751 return 0;
752 }
753 var aIsNull = (typeof(a) == 'undefined' || a === null);
754 var bIsNull = (typeof(b) == 'undefined' || b === null);
755 if (aIsNull && bIsNull) {
756 return 0;
757 } else if (aIsNull) {
758 return -1;
759 } else if (bIsNull) {
760 return 1;
761 }
762 var m = MochiKit.Base;
763 // bool, number, string have meaningful comparisons
764 var prim = m._primitives;
765 if (!(typeof(a) in prim && typeof(b) in prim)) {
766 try {
767 return m.comparatorRegistry.match(a, b);
768 } catch (e) {
769 if (e != m.NotFound) {
770 throw e;
771 }
772 }
773 }
774 if (a < b) {
775 return -1;
776 } else if (a > b) {
777 return 1;
778 }
779 // These types can't be compared
780 var repr = m.repr;
781 throw new TypeError(repr(a) + " and " + repr(b) + " can not be compared");
782 },
783
784 /** @id MochiKit.Base.compareDateLike */
785 compareDateLike: function (a, b) {
786 return MochiKit.Base.compare(a.getTime(), b.getTime());
787 },
788
789 /** @id MochiKit.Base.compareArrayLike */
790 compareArrayLike: function (a, b) {
791 var compare = MochiKit.Base.compare;
792 var count = a.length;
793 var rval = 0;
794 if (count > b.length) {
795 rval = 1;
796 count = b.length;
797 } else if (count < b.length) {
798 rval = -1;
799 }
800 for (var i = 0; i < count; i++) {
801 var cmp = compare(a[i], b[i]);
802 if (cmp) {
803 return cmp;
804 }
805 }
806 return rval;
807 },
808
809 /** @id MochiKit.Base.registerRepr */
810 registerRepr: function (name, check, wrap, /* optional */override) {
811 MochiKit.Base.reprRegistry.register(name, check, wrap, override);
812 },
813
814 /** @id MochiKit.Base.repr */
815 repr: function (o) {
816 if (typeof(o) == "undefined") {
817 return "undefined";
818 } else if (o === null) {
819 return "null";
820 }
821 try {
822 if (typeof(o.__repr__) == 'function') {
823 return o.__repr__();
824 } else if (typeof(o.repr) == 'function' && o.repr != arguments.callee) {
825 return o.repr();
826 }
827 return MochiKit.Base.reprRegistry.match(o);
828 } catch (e) {
829 try {
830 if (typeof(o.NAME) == 'string' && (
831 o.toString == Function.prototype.toString ||
832 o.toString == Object.prototype.toString
833 )) {
834 return o.NAME;
835 }
836 } catch (ignore) {
837 }
838 }
839 try {
840 var ostring = (o + "");
841 } catch (e) {
842 return "[" + typeof(o) + "]";
843 }
844 if (typeof(o) == "function") {
845 ostring = ostring.replace(/^\s+/, "").replace(/\s+/g, " ");
846 ostring = ostring.replace(/,(\S)/, ", $1");
847 var idx = ostring.indexOf("{");
848 if (idx != -1) {
849 ostring = ostring.substr(0, idx) + "{...}";
850 }
851 }
852 return ostring;
853 },
854
855 /** @id MochiKit.Base.reprArrayLike */
856 reprArrayLike: function (o) {
857 var m = MochiKit.Base;
858 return "[" + m.map(m.repr, o).join(", ") + "]";
859 },
860
861 /** @id MochiKit.Base.reprString */
862 reprString: function (o) {
863 return ('"' + o.replace(/(["\\])/g, '\\$1') + '"'
864 ).replace(/[\f]/g, "\\f"
865 ).replace(/[\b]/g, "\\b"
866 ).replace(/[\n]/g, "\\n"
867 ).replace(/[\t]/g, "\\t"
868 ).replace(/[\v]/g, "\\v"
869 ).replace(/[\r]/g, "\\r");
870 },
871
872 /** @id MochiKit.Base.reprNumber */
873 reprNumber: function (o) {
874 return o + "";
875 },
876
877 /** @id MochiKit.Base.registerJSON */
878 registerJSON: function (name, check, wrap, /* optional */override) {
879 MochiKit.Base.jsonRegistry.register(name, check, wrap, override);
880 },
881
882
883 /** @id MochiKit.Base.evalJSON */
884 evalJSON: function (jsonText) {
885 return eval("(" + MochiKit.Base._filterJSON(jsonText) + ")");
886 },
887
888 _filterJSON: function (s) {
889 var m = s.match(/^\s*\/\*(.*)\*\/\s*$/);
890 return (m) ? m[1] : s;
891 },
892
893 /** @id MochiKit.Base.serializeJSON */
894 serializeJSON: function (o) {
895 var objtype = typeof(o);
896 if (objtype == "number" || objtype == "boolean") {
897 return o + "";
898 } else if (o === null) {
899 return "null";
900 } else if (objtype == "string") {
901 var res = "";
902 for (var i = 0; i < o.length; i++) {
903 var c = o.charAt(i);
904 if (c == '\"') {
905 res += '\\"';
906 } else if (c == '\\') {
907 res += '\\\\';
908 } else if (c == '\b') {
909 res += '\\b';
910 } else if (c == '\f') {
911 res += '\\f';
912 } else if (c == '\n') {
913 res += '\\n';
914 } else if (c == '\r') {
915 res += '\\r';
916 } else if (c == '\t') {
917 res += '\\t';
918 } else if (o.charCodeAt(i) <= 0x1F) {
919 var hex = o.charCodeAt(i).toString(16);
920 if (hex.length < 2) {
921 hex = '0' + hex;
922 }
923 res += '\\u00' + hex.toUpperCase();
924 } else {
925 res += c;
926 }
927 }
928 return '"' + res + '"';
929 }
930 // recurse
931 var me = arguments.callee;
932 // short-circuit for objects that support "json" serialization
933 // if they return "self" then just pass-through...
934 var newObj;
935 if (typeof(o.toJSON) == "function") {
936 newObj = o.toJSON();
937 if (o !== newObj) {
938 return me(newObj);
939 }
940 }
941 if (typeof(o.__json__) == "function") {
942 newObj = o.__json__();
943 if (o !== newObj) {
944 return me(newObj);
945 }
946 }
947 if (typeof(o.json) == "function") {
948 newObj = o.json();
949 if (o !== newObj) {
950 return me(newObj);
951 }
952 }
953 // array
954 if (objtype != "function" && typeof(o.length) == "number") {
955 var res = [];
956 for (var i = 0; i < o.length; i++) {
957 var val = me(o[i]);
958 if (typeof(val) != "string") {
959 // skip non-serializable values
960 continue;
961 }
962 res.push(val);
963 }
964 return "[" + res.join(", ") + "]";
965 }
966 // look in the registry
967 var m = MochiKit.Base;
968 try {
969 newObj = m.jsonRegistry.match(o);
970 if (o !== newObj) {
971 return me(newObj);
972 }
973 } catch (e) {
974 if (e != m.NotFound) {
975 // something really bad happened
976 throw e;
977 }
978 }
979 // undefined is outside of the spec
980 if (objtype == "undefined") {
981 throw new TypeError("undefined can not be serialized as JSON");
982 }
983 // it's a function with no adapter, bad
984 if (objtype == "function") {
985 return null;
986 }
987 // generic object code path
988 res = [];
989 for (var k in o) {
990 var useKey;
991 if (typeof(k) == "number") {
992 useKey = '"' + k + '"';
993 } else if (typeof(k) == "string") {
994 useKey = me(k);
995 } else {
996 // skip non-string or number keys
997 continue;
998 }
999 val = me(o[k]);
1000 if (typeof(val) != "string") {
1001 // skip non-serializable values
1002 continue;
1003 }
1004 res.push(useKey + ":" + val);
1005 }
1006 return "{" + res.join(", ") + "}";
1007 },
1008
1009
1010 /** @id MochiKit.Base.objEqual */
1011 objEqual: function (a, b) {
1012 return (MochiKit.Base.compare(a, b) === 0);
1013 },
1014
1015 /** @id MochiKit.Base.arrayEqual */
1016 arrayEqual: function (self, arr) {
1017 if (self.length != arr.length) {
1018 return false;
1019 }
1020 return (MochiKit.Base.compare(self, arr) === 0);
1021 },
1022
1023 /** @id MochiKit.Base.concat */
1024 concat: function (/* lst... */) {
1025 var rval = [];
1026 var extend = MochiKit.Base.extend;
1027 for (var i = 0; i < arguments.length; i++) {
1028 extend(rval, arguments[i]);
1029 }
1030 return rval;
1031 },
1032
1033 /** @id MochiKit.Base.keyComparator */
1034 keyComparator: function (key/* ... */) {
1035 // fast-path for single key comparisons
1036 var m = MochiKit.Base;
1037 var compare = m.compare;
1038 if (arguments.length == 1) {
1039 return function (a, b) {
1040 return compare(a[key], b[key]);
1041 };
1042 }
1043 var compareKeys = m.extend(null, arguments);
1044 return function (a, b) {
1045 var rval = 0;
1046 // keep comparing until something is inequal or we run out of
1047 // keys to compare
1048 for (var i = 0; (rval === 0) && (i < compareKeys.length); i++) {
1049 var key = compareKeys[i];
1050 rval = compare(a[key], b[key]);
1051 }
1052 return rval;
1053 };
1054 },
1055
1056 /** @id MochiKit.Base.reverseKeyComparator */
1057 reverseKeyComparator: function (key) {
1058 var comparator = MochiKit.Base.keyComparator.apply(this, arguments);
1059 return function (a, b) {
1060 return comparator(b, a);
1061 };
1062 },
1063
1064 /** @id MochiKit.Base.partial */
1065 partial: function (func) {
1066 var m = MochiKit.Base;
1067 return m.bind.apply(this, m.extend([func, undefined], arguments, 1));
1068 },
1069
1070 /** @id MochiKit.Base.listMinMax */
1071 listMinMax: function (which, lst) {
1072 if (lst.length === 0) {
1073 return null;
1074 }
1075 var cur = lst[0];
1076 var compare = MochiKit.Base.compare;
1077 for (var i = 1; i < lst.length; i++) {
1078 var o = lst[i];
1079 if (compare(o, cur) == which) {
1080 cur = o;
1081 }
1082 }
1083 return cur;
1084 },
1085
1086 /** @id MochiKit.Base.objMax */
1087 objMax: function (/* obj... */) {
1088 return MochiKit.Base.listMinMax(1, arguments);
1089 },
1090
1091 /** @id MochiKit.Base.objMin */
1092 objMin: function (/* obj... */) {
1093 return MochiKit.Base.listMinMax(-1, arguments);
1094 },
1095
1096 /** @id MochiKit.Base.findIdentical */
1097 findIdentical: function (lst, value, start/* = 0 */, /* optional */end) {
1098 if (typeof(end) == "undefined" || end === null) {
1099 end = lst.length;
1100 }
1101 if (typeof(start) == "undefined" || start === null) {
1102 start = 0;
1103 }
1104 for (var i = start; i < end; i++) {
1105 if (lst[i] === value) {
1106 return i;
1107 }
1108 }
1109 return -1;
1110 },
1111
1112 /** @id MochiKit.Base.mean */
1113 mean: function(/* lst... */) {
1114 /* http://www.nist.gov/dads/HTML/mean.html */
1115 var sum = 0;
1116
1117 var m = MochiKit.Base;
1118 var args = m.extend(null, arguments);
1119 var count = args.length;
1120
1121 while (args.length) {
1122 var o = args.shift();
1123 if (o && typeof(o) == "object" && typeof(o.length) == "number") {
1124 count += o.length - 1;
1125 for (var i = o.length - 1; i >= 0; i--) {
1126 sum += o[i];
1127 }
1128 } else {
1129 sum += o;
1130 }
1131 }
1132
1133 if (count <= 0) {
1134 throw new TypeError('mean() requires at least one argument');
1135 }
1136
1137 return sum/count;
1138 },
1139
1140 /** @id MochiKit.Base.median */
1141 median: function(/* lst... */) {
1142 /* http://www.nist.gov/dads/HTML/median.html */
1143 var data = MochiKit.Base.flattenArguments(arguments);
1144 if (data.length === 0) {
1145 throw new TypeError('median() requires at least one argument');
1146 }
1147 data.sort(MochiKit.Base.compare);
1148 if (data.length % 2 == 0) {
1149 var upper = data.length / 2;
1150 return (data[upper] + data[upper - 1]) / 2;
1151 } else {
1152 return data[(data.length - 1) / 2];
1153 }
1154 },
1155
1156 /** @id MochiKit.Base.findValue */
1157 findValue: function (lst, value, start/* = 0 */, /* optional */end) {
1158 if (typeof(end) == "undefined" || end === null) {
1159 end = lst.length;
1160 }
1161 if (typeof(start) == "undefined" || start === null) {
1162 start = 0;
1163 }
1164 var cmp = MochiKit.Base.compare;
1165 for (var i = start; i < end; i++) {
1166 if (cmp(lst[i], value) === 0) {
1167 return i;
1168 }
1169 }
1170 return -1;
1171 },
1172
1173 /** @id MochiKit.Base.nodeWalk */
1174 nodeWalk: function (node, visitor) {
1175 var nodes = [node];
1176 var extend = MochiKit.Base.extend;
1177 while (nodes.length) {
1178 var res = visitor(nodes.shift());
1179 if (res) {
1180 extend(nodes, res);
1181 }
1182 }
1183 },
1184
1185
1186 /** @id MochiKit.Base.nameFunctions */
1187 nameFunctions: function (namespace) {
1188 var base = namespace.NAME;
1189 if (typeof(base) == 'undefined') {
1190 base = '';
1191 } else {
1192 base = base + '.';
1193 }
1194 for (var name in namespace) {
1195 var o = namespace[name];
1196 if (typeof(o) == 'function' && typeof(o.NAME) == 'undefined') {
1197 try {
1198 o.NAME = base + name;
1199 } catch (e) {
1200 // pass
1201 }
1202 }
1203 }
1204 },
1205
1206
1207 /** @id MochiKit.Base.queryString */
1208 queryString: function (names, values) {
1209 // check to see if names is a string or a DOM element, and if
1210 // MochiKit.DOM is available. If so, drop it like it's a form
1211 // Ugliest conditional in MochiKit? Probably!
1212 if (typeof(MochiKit.DOM) != "undefined" && arguments.length == 1
1213 && (typeof(names) == "string" || (
1214 typeof(names.nodeType) != "undefined" && names.nodeType > 0
1215 ))
1216 ) {
1217 var kv = MochiKit.DOM.formContents(names);
1218 names = kv[0];
1219 values = kv[1];
1220 } else if (arguments.length == 1) {
1221 // Allow the return value of formContents to be passed directly
1222 if (typeof(names.length) == "number" && names.length == 2) {
1223 return arguments.callee(names[0], names[1]);
1224 }
1225 var o = names;
1226 names = [];
1227 values = [];
1228 for (var k in o) {
1229 var v = o[k];
1230 if (typeof(v) == "function") {
1231 continue;
1232 } else if (MochiKit.Base.isArrayLike(v)){
1233 for (var i = 0; i < v.length; i++) {
1234 names.push(k);
1235 values.push(v[i]);
1236 }
1237 } else {
1238 names.push(k);
1239 values.push(v);
1240 }
1241 }
1242 }
1243 var rval = [];
1244 var len = Math.min(names.length, values.length);
1245 var urlEncode = MochiKit.Base.urlEncode;
1246 for (var i = 0; i < len; i++) {
1247 v = values[i];
1248 if (typeof(v) != 'undefined' && v !== null) {
1249 rval.push(urlEncode(names[i]) + "=" + urlEncode(v));
1250 }
1251 }
1252 return rval.join("&");
1253 },
1254
1255
1256 /** @id MochiKit.Base.parseQueryString */
1257 parseQueryString: function (encodedString, useArrays) {
1258 // strip a leading '?' from the encoded string
1259 var qstr = (encodedString.charAt(0) == "?")
1260 ? encodedString.substring(1)
1261 : encodedString;
1262 var pairs = qstr.replace(/\+/g, "%20").split(/\&amp\;|\&\#38\;|\&#x26;|\&/);
1263 var o = {};
1264 var decode;
1265 if (typeof(decodeURIComponent) != "undefined") {
1266 decode = decodeURIComponent;
1267 } else {
1268 decode = unescape;
1269 }
1270 if (useArrays) {
1271 for (var i = 0; i < pairs.length; i++) {
1272 var pair = pairs[i].split("=");
1273 var name = decode(pair.shift());
1274 if (!name) {
1275 continue;
1276 }
1277 var arr = o[name];
1278 if (!(arr instanceof Array)) {
1279 arr = [];
1280 o[name] = arr;
1281 }
1282 arr.push(decode(pair.join("=")));
1283 }
1284 } else {
1285 for (var i = 0; i < pairs.length; i++) {
1286 pair = pairs[i].split("=");
1287 var name = pair.shift();
1288 if (!name) {
1289 continue;
1290 }
1291 o[decode(name)] = decode(pair.join("="));
1292 }
1293 }
1294 return o;
1295 }
1296});
1297
1298/** @id MochiKit.Base.AdapterRegistry */
1299MochiKit.Base.AdapterRegistry = function () {
1300 this.pairs = [];
1301};
1302
1303MochiKit.Base.AdapterRegistry.prototype = {
1304 /** @id MochiKit.Base.AdapterRegistry.prototype.register */
1305 register: function (name, check, wrap, /* optional */ override) {
1306 if (override) {
1307 this.pairs.unshift([name, check, wrap]);
1308 } else {
1309 this.pairs.push([name, check, wrap]);
1310 }
1311 },
1312
1313 /** @id MochiKit.Base.AdapterRegistry.prototype.match */
1314 match: function (/* ... */) {
1315 for (var i = 0; i < this.pairs.length; i++) {
1316 var pair = this.pairs[i];
1317 if (pair[1].apply(this, arguments)) {
1318 return pair[2].apply(this, arguments);
1319 }
1320 }
1321 throw MochiKit.Base.NotFound;
1322 },
1323
1324 /** @id MochiKit.Base.AdapterRegistry.prototype.unregister */
1325 unregister: function (name) {
1326 for (var i = 0; i < this.pairs.length; i++) {
1327 var pair = this.pairs[i];
1328 if (pair[0] == name) {
1329 this.pairs.splice(i, 1);
1330 return true;
1331 }
1332 }
1333 return false;
1334 }
1335};
1336
1337/**
1338 * Exports all symbols from one or more modules into the specified
1339 * namespace (or scope). This is similar to MochiKit.Base.update(),
1340 * except for special handling of the "__export__" flag, contained
1341 * sub-modules (exported recursively), and names starting with "_".
1342 *
1343 * @param {Object} namespace the object or scope to modify
1344 * @param {Object} module the module to export
1345 */
1346MochiKit.Base.moduleExport = function (namespace, module/*, ...*/) {
1347 var SKIP = { toString: true, NAME: true, VERSION: true };
1348 var mods = MochiKit.Base.extend([], arguments, 1);
1349 while ((module = mods.shift()) != null) {
1350 for (var k in module) {
1351 var v = module[k];
1352 if (v != null) {
1353 var flagSet = (typeof(v.__export__) == 'boolean');
1354 var nameValid = (k[0] !== "_" && !SKIP[k]);
1355 if (flagSet ? v.__export__ : nameValid) {
1356 if (typeof(v) == 'object' && v.NAME && v.VERSION) {
1357 mods.push(v);
1358 } else {
1359 namespace[k] = module[k];
1360 }
1361 }
1362 }
1363 }
1364 }
1365 return namespace;
1366};
1367
1368/**
1369 * Identical to moduleExport, but also considers the global and
1370 * module-specific "__export__" flag.
1371 */
1372MochiKit.Base._exportSymbols = function (namespace, module) {
1373 if (MochiKit.__export__ !== false && module.__export__ !== false) {
1374 MochiKit.Base.moduleExport(namespace, module);
1375 }
1376};
1377
1378/**
1379 * Creates a deprecated function alias in the specified module. The
1380 * deprecated function will forward all calls and arguments to a
1381 * target function, while also logging a debug message on the first
1382 * call (if MochiKit.Logging is loaded). The destination function may
1383 * be located in another module, which must be loaded, or an
1384 * exception will be thrown.
1385 *
1386 * @param {Object/String} module the source module or module name
1387 * (e.g. 'DOM' or 'MochiKit.DOM')
1388 * @param {String} name the deprecated function name (e.g. 'getStyle')
1389 * @param {String} target the fully qualified name of the target
1390 * function (e.g. 'MochiKit.Style.getStyle')
1391 * @param {String} version the first version when the source function
1392 * was deprecated (e.g. '1.4')
1393 * @param {Boolean} [exportable] the exportable function flag,
1394 * defaults to false
1395 */
1396MochiKit.Base._deprecated = function (module, name, target, version, exportable) {
1397 if (typeof(module) === 'string') {
1398 if (module.indexOf('MochiKit.') === 0) {
1399 module = module.substring(9);
1400 }
1401 module = MochiKit[module];
1402 }
1403 var targetModule = target.split('.')[1];
1404 var targetName = target.split('.')[2];
1405 var func = function () {
1406 var self = arguments.callee;
1407 var msg = module.NAME + '.' + name + ' is deprecated since version ' +
1408 version + '. Use ' + target + ' instead.';
1409 if (self.logged !== true) {
1410 self.logged = true;
1411 if (MochiKit.Logging) {
1412 MochiKit.Logging.logDebug(msg);
1413 } else if (console && console.log) {
1414 console.log(msg);
1415 }
1416 }
1417 if (!MochiKit[targetModule]) {
1418 throw new Error(msg);
1419 }
1420 return MochiKit[targetModule][targetName].apply(this, arguments);
1421 };
1422 func.__export__ = (exportable === true);
1423 module[name] = func;
1424};
1425
1426MochiKit.Base.__new__ = function () {
1427 var m = this;
1428
1429 /** @id MochiKit.Base.noop */
1430 m.noop = m.operator.identity;
1431
1432 // Backwards compat
1433 m._deprecated(m, 'forward', 'MochiKit.Base.forwardCall', '1.3');
1434 m._deprecated(m, 'find', 'MochiKit.Base.findValue', '1.3');
1435
1436 if (typeof(encodeURIComponent) != "undefined") {
1437 /** @id MochiKit.Base.urlEncode */
1438 m.urlEncode = function (unencoded) {
1439 return encodeURIComponent(unencoded).replace(/\'/g, '%27');
1440 };
1441 } else {
1442 m.urlEncode = function (unencoded) {
1443 return escape(unencoded
1444 ).replace(/\+/g, '%2B'
1445 ).replace(/\"/g,'%22'
1446 ).replace(/\'/g, '%27');
1447 };
1448 }
1449
1450 /** @id MochiKit.Base.NamedError */
1451 m.NamedError = function (name) {
1452 this.message = name;
1453 this.name = name;
1454 };
1455 m.NamedError.prototype = new Error();
1456 m.NamedError.prototype.constructor = m.NamedError;
1457 m.update(m.NamedError.prototype, {
1458 repr: function () {
1459 if (this.message && this.message != this.name) {
1460 return this.name + "(" + m.repr(this.message) + ")";
1461 } else {
1462 return this.name + "()";
1463 }
1464 },
1465 toString: m.forwardCall("repr")
1466 });
1467
1468 /** @id MochiKit.Base.NotFound */
1469 m.NotFound = new m.NamedError("MochiKit.Base.NotFound");
1470
1471
1472 /** @id MochiKit.Base.listMax */
1473 m.listMax = m.partial(m.listMinMax, 1);
1474 /** @id MochiKit.Base.listMin */
1475 m.listMin = m.partial(m.listMinMax, -1);
1476
1477 /** @id MochiKit.Base.isCallable */
1478 m.isCallable = m.typeMatcher('function');
1479 /** @id MochiKit.Base.isUndefined */
1480 m.isUndefined = m.typeMatcher('undefined');
1481 /** @id MochiKit.Base.isValue */
1482 m.isValue = m.typeMatcher('boolean', 'number', 'string');
1483
1484 /** @id MochiKit.Base.merge */
1485 m.merge = m.partial(m.update, null);
1486 /** @id MochiKit.Base.zip */
1487 m.zip = m.partial(m.map, null);
1488
1489 /** @id MochiKit.Base.average */
1490 m.average = m.mean;
1491
1492 /** @id MochiKit.Base.comparatorRegistry */
1493 m.comparatorRegistry = new m.AdapterRegistry();
1494 m.registerComparator("dateLike", m.isDateLike, m.compareDateLike);
1495 m.registerComparator("arrayLike", m.isArrayLike, m.compareArrayLike);
1496
1497 /** @id MochiKit.Base.reprRegistry */
1498 m.reprRegistry = new m.AdapterRegistry();
1499 m.registerRepr("arrayLike", m.isArrayLike, m.reprArrayLike);
1500 m.registerRepr("string", m.typeMatcher("string"), m.reprString);
1501 m.registerRepr("numbers", m.typeMatcher("number", "boolean"), m.reprNumber);
1502
1503 /** @id MochiKit.Base.jsonRegistry */
1504 m.jsonRegistry = new m.AdapterRegistry();
1505
1506 m.nameFunctions(this);
1507
1508};
1509
1510MochiKit.Base.__new__();
1511
1512//
1513// XXX: Internet Explorer blows
1514//
1515if (MochiKit.__export__) {
1516 compare = MochiKit.Base.compare;
1517 compose = MochiKit.Base.compose;
1518 serializeJSON = MochiKit.Base.serializeJSON;
1519 mean = MochiKit.Base.mean;
1520 median = MochiKit.Base.median;
1521}
1522
1523MochiKit.Base._exportSymbols(this, MochiKit.Base);
diff --git a/frontend/delta/js/MochiKit/Color.js b/frontend/delta/js/MochiKit/Color.js
new file mode 100644
index 0000000..f421737
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Color.js
@@ -0,0 +1,846 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Color 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito and others. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Color', '1.5', ['Base', 'DOM', 'Style']);
35
36/** @id MochiKit.Color.Color */
37MochiKit.Color.Color = function (red, green, blue, alpha) {
38 if (typeof(alpha) == 'undefined' || alpha === null) {
39 alpha = 1.0;
40 }
41 this.rgb = {
42 r: red,
43 g: green,
44 b: blue,
45 a: alpha
46 };
47};
48
49
50// Prototype methods
51
52MochiKit.Color.Color.prototype = {
53
54 __class__: MochiKit.Color.Color,
55
56 /** @id MochiKit.Color.Color.prototype.colorWithAlpha */
57 colorWithAlpha: function (alpha) {
58 var rgb = this.rgb;
59 var m = MochiKit.Color;
60 return m.Color.fromRGB(rgb.r, rgb.g, rgb.b, alpha);
61 },
62
63 /** @id MochiKit.Color.Color.prototype.colorWithHue */
64 colorWithHue: function (hue) {
65 // get an HSL model, and set the new hue...
66 var hsl = this.asHSL();
67 hsl.h = hue;
68 var m = MochiKit.Color;
69 // convert back to RGB...
70 return m.Color.fromHSL(hsl);
71 },
72
73 /** @id MochiKit.Color.Color.prototype.colorWithSaturation */
74 colorWithSaturation: function (saturation) {
75 // get an HSL model, and set the new hue...
76 var hsl = this.asHSL();
77 hsl.s = saturation;
78 var m = MochiKit.Color;
79 // convert back to RGB...
80 return m.Color.fromHSL(hsl);
81 },
82
83 /** @id MochiKit.Color.Color.prototype.colorWithLightness */
84 colorWithLightness: function (lightness) {
85 // get an HSL model, and set the new hue...
86 var hsl = this.asHSL();
87 hsl.l = lightness;
88 var m = MochiKit.Color;
89 // convert back to RGB...
90 return m.Color.fromHSL(hsl);
91 },
92
93 /** @id MochiKit.Color.Color.prototype.darkerColorWithLevel */
94 darkerColorWithLevel: function (level) {
95 var hsl = this.asHSL();
96 hsl.l = Math.max(hsl.l - level, 0);
97 var m = MochiKit.Color;
98 return m.Color.fromHSL(hsl);
99 },
100
101 /** @id MochiKit.Color.Color.prototype.lighterColorWithLevel */
102 lighterColorWithLevel: function (level) {
103 var hsl = this.asHSL();
104 hsl.l = Math.min(hsl.l + level, 1);
105 var m = MochiKit.Color;
106 return m.Color.fromHSL(hsl);
107 },
108
109 /** @id MochiKit.Color.Color.prototype.blendedColor */
110 blendedColor: function (other, /* optional */ fraction) {
111 if (typeof(fraction) == 'undefined' || fraction === null) {
112 fraction = 0.5;
113 }
114 var sf = 1.0 - fraction;
115 var s = this.rgb;
116 var d = other.rgb;
117 var df = fraction;
118 return MochiKit.Color.Color.fromRGB(
119 (s.r * sf) + (d.r * df),
120 (s.g * sf) + (d.g * df),
121 (s.b * sf) + (d.b * df),
122 (s.a * sf) + (d.a * df)
123 );
124 },
125
126 /** @id MochiKit.Color.Color.prototype.compareRGB */
127 compareRGB: function (other) {
128 var a = this.asRGB();
129 var b = other.asRGB();
130 return MochiKit.Base.compare(
131 [a.r, a.g, a.b, a.a],
132 [b.r, b.g, b.b, b.a]
133 );
134 },
135
136 /** @id MochiKit.Color.Color.prototype.isLight */
137 isLight: function () {
138 return this.asHSL().l > 0.5;
139 },
140
141 /** @id MochiKit.Color.Color.prototype.isDark */
142 isDark: function () {
143 return (!this.isLight());
144 },
145
146 /** @id MochiKit.Color.Color.prototype.toHSLString */
147 toHSLString: function () {
148 var c = this.asHSL();
149 var ccc = MochiKit.Color.clampColorComponent;
150 var rval = this._hslString;
151 if (!rval) {
152 var mid = (
153 ccc(c.h, 360).toFixed(0)
154 + "," + ccc(c.s, 100).toPrecision(4) + "%"
155 + "," + ccc(c.l, 100).toPrecision(4) + "%"
156 );
157 var a = c.a;
158 if (a >= 1) {
159 a = 1;
160 rval = "hsl(" + mid + ")";
161 } else {
162 if (a <= 0) {
163 a = 0;
164 }
165 rval = "hsla(" + mid + "," + a + ")";
166 }
167 this._hslString = rval;
168 }
169 return rval;
170 },
171
172 /** @id MochiKit.Color.Color.prototype.toRGBString */
173 toRGBString: function () {
174 var c = this.rgb;
175 var ccc = MochiKit.Color.clampColorComponent;
176 var rval = this._rgbString;
177 if (!rval) {
178 var mid = (
179 ccc(c.r, 255).toFixed(0)
180 + "," + ccc(c.g, 255).toFixed(0)
181 + "," + ccc(c.b, 255).toFixed(0)
182 );
183 if (c.a != 1) {
184 rval = "rgba(" + mid + "," + c.a + ")";
185 } else {
186 rval = "rgb(" + mid + ")";
187 }
188 this._rgbString = rval;
189 }
190 return rval;
191 },
192
193 /** @id MochiKit.Color.Color.prototype.asRGB */
194 asRGB: function () {
195 return MochiKit.Base.clone(this.rgb);
196 },
197
198 /** @id MochiKit.Color.Color.prototype.toHexString */
199 toHexString: function () {
200 var m = MochiKit.Color;
201 var c = this.rgb;
202 var ccc = MochiKit.Color.clampColorComponent;
203 var rval = this._hexString;
204 if (!rval) {
205 rval = ("#" +
206 m.toColorPart(ccc(c.r, 255)) +
207 m.toColorPart(ccc(c.g, 255)) +
208 m.toColorPart(ccc(c.b, 255))
209 );
210 this._hexString = rval;
211 }
212 return rval;
213 },
214
215 /** @id MochiKit.Color.Color.prototype.asHSV */
216 asHSV: function () {
217 var hsv = this.hsv;
218 var c = this.rgb;
219 if (typeof(hsv) == 'undefined' || hsv === null) {
220 hsv = MochiKit.Color.rgbToHSV(this.rgb);
221 this.hsv = hsv;
222 }
223 return MochiKit.Base.clone(hsv);
224 },
225
226 /** @id MochiKit.Color.Color.prototype.asHSL */
227 asHSL: function () {
228 var hsl = this.hsl;
229 var c = this.rgb;
230 if (typeof(hsl) == 'undefined' || hsl === null) {
231 hsl = MochiKit.Color.rgbToHSL(this.rgb);
232 this.hsl = hsl;
233 }
234 return MochiKit.Base.clone(hsl);
235 },
236
237 /** @id MochiKit.Color.Color.prototype.toString */
238 toString: function () {
239 return this.toRGBString();
240 },
241
242 /** @id MochiKit.Color.Color.prototype.repr */
243 repr: function () {
244 var c = this.rgb;
245 var col = [c.r, c.g, c.b, c.a];
246 return this.__class__.NAME + "(" + col.join(", ") + ")";
247 }
248
249};
250
251// Constructor methods
252
253MochiKit.Base.update(MochiKit.Color.Color, {
254 /** @id MochiKit.Color.Color.fromRGB */
255 fromRGB: function (red, green, blue, alpha) {
256 // designated initializer
257 var Color = MochiKit.Color.Color;
258 if (arguments.length == 1) {
259 var rgb = red;
260 red = rgb.r;
261 green = rgb.g;
262 blue = rgb.b;
263 if (typeof(rgb.a) == 'undefined') {
264 alpha = undefined;
265 } else {
266 alpha = rgb.a;
267 }
268 }
269 return new Color(red, green, blue, alpha);
270 },
271
272 /** @id MochiKit.Color.Color.fromHSL */
273 fromHSL: function (hue, saturation, lightness, alpha) {
274 var m = MochiKit.Color;
275 return m.Color.fromRGB(m.hslToRGB.apply(m, arguments));
276 },
277
278 /** @id MochiKit.Color.Color.fromHSV */
279 fromHSV: function (hue, saturation, value, alpha) {
280 var m = MochiKit.Color;
281 return m.Color.fromRGB(m.hsvToRGB.apply(m, arguments));
282 },
283
284 /** @id MochiKit.Color.Color.fromName */
285 fromName: function (name) {
286 var Color = MochiKit.Color.Color;
287 // Opera 9 seems to "quote" named colors(?!)
288 if (name.charAt(0) == '"') {
289 name = name.substr(1, name.length - 2);
290 }
291 var htmlColor = Color._namedColors[name.toLowerCase()];
292 if (typeof(htmlColor) == 'string') {
293 return Color.fromHexString(htmlColor);
294 } else if (name == "transparent") {
295 return Color.transparentColor();
296 }
297 return null;
298 },
299
300 /** @id MochiKit.Color.Color.fromString */
301 fromString: function (colorString) {
302 var self = MochiKit.Color.Color;
303 var three = colorString.substr(0, 3);
304 if (three == "rgb") {
305 return self.fromRGBString(colorString);
306 } else if (three == "hsl") {
307 return self.fromHSLString(colorString);
308 } else if (colorString.charAt(0) == "#") {
309 return self.fromHexString(colorString);
310 }
311 return self.fromName(colorString);
312 },
313
314
315 /** @id MochiKit.Color.Color.fromHexString */
316 fromHexString: function (hexCode) {
317 if (hexCode.charAt(0) == '#') {
318 hexCode = hexCode.substring(1);
319 }
320 var components = [];
321 var i, hex;
322 if (hexCode.length == 3) {
323 for (i = 0; i < 3; i++) {
324 hex = hexCode.substr(i, 1);
325 components.push(parseInt(hex + hex, 16) / 255.0);
326 }
327 } else {
328 for (i = 0; i < 6; i += 2) {
329 hex = hexCode.substr(i, 2);
330 components.push(parseInt(hex, 16) / 255.0);
331 }
332 }
333 var Color = MochiKit.Color.Color;
334 return Color.fromRGB.apply(Color, components);
335 },
336
337
338 _fromColorString: function (pre, method, scales, colorCode) {
339 // parses either HSL or RGB
340 if (colorCode.indexOf(pre) === 0) {
341 colorCode = colorCode.substring(colorCode.indexOf("(", 3) + 1, colorCode.length - 1);
342 }
343 var colorChunks = colorCode.split(/\s*,\s*/);
344 var colorFloats = [];
345 for (var i = 0; i < colorChunks.length; i++) {
346 var c = colorChunks[i];
347 var val;
348 var three = c.substring(c.length - 3);
349 if (c.charAt(c.length - 1) == '%') {
350 val = 0.01 * parseFloat(c.substring(0, c.length - 1));
351 } else if (three == "deg") {
352 val = parseFloat(c) / 360.0;
353 } else if (three == "rad") {
354 val = parseFloat(c) / (Math.PI * 2);
355 } else {
356 val = scales[i] * parseFloat(c);
357 }
358 colorFloats.push(val);
359 }
360 return this[method].apply(this, colorFloats);
361 },
362
363 /** @id MochiKit.Color.Color.fromComputedStyle */
364 fromComputedStyle: function (elem, style) {
365 var d = MochiKit.DOM;
366 var cls = MochiKit.Color.Color;
367 for (elem = d.getElement(elem); elem; elem = elem.parentNode) {
368 var actualColor = MochiKit.Style.getStyle.apply(d, arguments);
369 if (!actualColor) {
370 continue;
371 }
372 var color = cls.fromString(actualColor);
373 if (!color) {
374 break;
375 }
376 if (color.asRGB().a > 0) {
377 return color;
378 }
379 }
380 return null;
381 },
382
383 /** @id MochiKit.Color.Color.fromBackground */
384 fromBackground: function (elem) {
385 var cls = MochiKit.Color.Color;
386 return cls.fromComputedStyle(
387 elem, "backgroundColor", "background-color") || cls.whiteColor();
388 },
389
390 /** @id MochiKit.Color.Color.fromText */
391 fromText: function (elem) {
392 var cls = MochiKit.Color.Color;
393 return cls.fromComputedStyle(
394 elem, "color", "color") || cls.blackColor();
395 },
396
397 /** @id MochiKit.Color.Color.namedColors */
398 namedColors: function () {
399 return MochiKit.Base.clone(MochiKit.Color.Color._namedColors);
400 }
401});
402
403
404// Module level functions
405
406MochiKit.Base.update(MochiKit.Color, {
407 /** @id MochiKit.Color.clampColorComponent */
408 clampColorComponent: function (v, scale) {
409 v *= scale;
410 if (v < 0) {
411 return 0;
412 } else if (v > scale) {
413 return scale;
414 } else {
415 return v;
416 }
417 },
418
419 _hslValue: function (n1, n2, hue) {
420 if (hue > 6.0) {
421 hue -= 6.0;
422 } else if (hue < 0.0) {
423 hue += 6.0;
424 }
425 var val;
426 if (hue < 1.0) {
427 val = n1 + (n2 - n1) * hue;
428 } else if (hue < 3.0) {
429 val = n2;
430 } else if (hue < 4.0) {
431 val = n1 + (n2 - n1) * (4.0 - hue);
432 } else {
433 val = n1;
434 }
435 return val;
436 },
437
438 /** @id MochiKit.Color.hsvToRGB */
439 hsvToRGB: function (hue, saturation, value, alpha) {
440 if (arguments.length == 1) {
441 var hsv = hue;
442 hue = hsv.h;
443 saturation = hsv.s;
444 value = hsv.v;
445 alpha = hsv.a;
446 }
447 var red;
448 var green;
449 var blue;
450 if (saturation === 0) {
451 red = value;
452 green = value;
453 blue = value;
454 } else {
455 var i = Math.floor(hue * 6);
456 var f = (hue * 6) - i;
457 var p = value * (1 - saturation);
458 var q = value * (1 - (saturation * f));
459 var t = value * (1 - (saturation * (1 - f)));
460 switch (i) {
461 case 1: red = q; green = value; blue = p; break;
462 case 2: red = p; green = value; blue = t; break;
463 case 3: red = p; green = q; blue = value; break;
464 case 4: red = t; green = p; blue = value; break;
465 case 5: red = value; green = p; blue = q; break;
466 case 6: // fall through
467 case 0: red = value; green = t; blue = p; break;
468 }
469 }
470 return {
471 r: red,
472 g: green,
473 b: blue,
474 a: alpha
475 };
476 },
477
478 /** @id MochiKit.Color.hslToRGB */
479 hslToRGB: function (hue, saturation, lightness, alpha) {
480 if (arguments.length == 1) {
481 var hsl = hue;
482 hue = hsl.h;
483 saturation = hsl.s;
484 lightness = hsl.l;
485 alpha = hsl.a;
486 }
487 var red;
488 var green;
489 var blue;
490 if (saturation === 0) {
491 red = lightness;
492 green = lightness;
493 blue = lightness;
494 } else {
495 var m2;
496 if (lightness <= 0.5) {
497 m2 = lightness * (1.0 + saturation);
498 } else {
499 m2 = lightness + saturation - (lightness * saturation);
500 }
501 var m1 = (2.0 * lightness) - m2;
502 var f = MochiKit.Color._hslValue;
503 var h6 = hue * 6.0;
504 red = f(m1, m2, h6 + 2);
505 green = f(m1, m2, h6);
506 blue = f(m1, m2, h6 - 2);
507 }
508 return {
509 r: red,
510 g: green,
511 b: blue,
512 a: alpha
513 };
514 },
515
516 /** @id MochiKit.Color.rgbToHSV */
517 rgbToHSV: function (red, green, blue, alpha) {
518 if (arguments.length == 1) {
519 var rgb = red;
520 red = rgb.r;
521 green = rgb.g;
522 blue = rgb.b;
523 alpha = rgb.a;
524 }
525 var max = Math.max(Math.max(red, green), blue);
526 var min = Math.min(Math.min(red, green), blue);
527 var hue;
528 var saturation;
529 var value = max;
530 if (min == max) {
531 hue = 0;
532 saturation = 0;
533 } else {
534 var delta = (max - min);
535 saturation = delta / max;
536
537 if (red == max) {
538 hue = (green - blue) / delta;
539 } else if (green == max) {
540 hue = 2 + ((blue - red) / delta);
541 } else {
542 hue = 4 + ((red - green) / delta);
543 }
544 hue /= 6;
545 if (hue < 0) {
546 hue += 1;
547 }
548 if (hue > 1) {
549 hue -= 1;
550 }
551 }
552 return {
553 h: hue,
554 s: saturation,
555 v: value,
556 a: alpha
557 };
558 },
559
560 /** @id MochiKit.Color.rgbToHSL */
561 rgbToHSL: function (red, green, blue, alpha) {
562 if (arguments.length == 1) {
563 var rgb = red;
564 red = rgb.r;
565 green = rgb.g;
566 blue = rgb.b;
567 alpha = rgb.a;
568 }
569 var max = Math.max(red, Math.max(green, blue));
570 var min = Math.min(red, Math.min(green, blue));
571 var hue;
572 var saturation;
573 var lightness = (max + min) / 2.0;
574 var delta = max - min;
575 if (delta === 0) {
576 hue = 0;
577 saturation = 0;
578 } else {
579 if (lightness <= 0.5) {
580 saturation = delta / (max + min);
581 } else {
582 saturation = delta / (2 - max - min);
583 }
584 if (red == max) {
585 hue = (green - blue) / delta;
586 } else if (green == max) {
587 hue = 2 + ((blue - red) / delta);
588 } else {
589 hue = 4 + ((red - green) / delta);
590 }
591 hue /= 6;
592 if (hue < 0) {
593 hue += 1;
594 }
595 if (hue > 1) {
596 hue -= 1;
597 }
598
599 }
600 return {
601 h: hue,
602 s: saturation,
603 l: lightness,
604 a: alpha
605 };
606 },
607
608 /** @id MochiKit.Color.toColorPart */
609 toColorPart: function (num) {
610 num = Math.round(num);
611 var digits = num.toString(16);
612 if (num < 16) {
613 return '0' + digits;
614 }
615 return digits;
616 },
617
618 __new__: function () {
619 var m = MochiKit.Base;
620 /** @id MochiKit.Color.Color.fromRGBString */
621 this.Color.fromRGBString = m.bind(
622 this.Color._fromColorString, this.Color, "rgb", "fromRGB",
623 [1.0/255.0, 1.0/255.0, 1.0/255.0, 1]
624 );
625 /** @id MochiKit.Color.Color.fromHSLString */
626 this.Color.fromHSLString = m.bind(
627 this.Color._fromColorString, this.Color, "hsl", "fromHSL",
628 [1.0/360.0, 0.01, 0.01, 1]
629 );
630
631 var third = 1.0 / 3.0;
632 /** @id MochiKit.Color.colors */
633 var colors = {
634 // NSColor colors plus transparent
635 /** @id MochiKit.Color.blackColor */
636 black: [0, 0, 0],
637 /** @id MochiKit.Color.blueColor */
638 blue: [0, 0, 1],
639 /** @id MochiKit.Color.brownColor */
640 brown: [0.6, 0.4, 0.2],
641 /** @id MochiKit.Color.cyanColor */
642 cyan: [0, 1, 1],
643 /** @id MochiKit.Color.darkGrayColor */
644 darkGray: [third, third, third],
645 /** @id MochiKit.Color.grayColor */
646 gray: [0.5, 0.5, 0.5],
647 /** @id MochiKit.Color.greenColor */
648 green: [0, 1, 0],
649 /** @id MochiKit.Color.lightGrayColor */
650 lightGray: [2 * third, 2 * third, 2 * third],
651 /** @id MochiKit.Color.magentaColor */
652 magenta: [1, 0, 1],
653 /** @id MochiKit.Color.orangeColor */
654 orange: [1, 0.5, 0],
655 /** @id MochiKit.Color.purpleColor */
656 purple: [0.5, 0, 0.5],
657 /** @id MochiKit.Color.redColor */
658 red: [1, 0, 0],
659 /** @id MochiKit.Color.transparentColor */
660 transparent: [0, 0, 0, 0],
661 /** @id MochiKit.Color.whiteColor */
662 white: [1, 1, 1],
663 /** @id MochiKit.Color.yellowColor */
664 yellow: [1, 1, 0]
665 };
666
667 for (var k in colors) {
668 var name = k + "Color";
669 var value = this.Color.fromRGB.apply(this.Color, colors[k]);
670 this.Color[name] = m.partial(m.operator.identity, value);
671 }
672
673 var isColor = function () {
674 for (var i = 0; i < arguments.length; i++) {
675 if (!(arguments[i] instanceof MochiKit.Color.Color)) {
676 return false;
677 }
678 }
679 return true;
680 };
681
682 var compareColor = function (a, b) {
683 return a.compareRGB(b);
684 };
685
686 m.nameFunctions(this);
687
688 m.registerComparator(this.Color.NAME, isColor, compareColor);
689 }
690});
691
692MochiKit.Color.__new__();
693
694// Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS>
695
696MochiKit.Color.Color._namedColors = {
697 aliceblue: "#f0f8ff",
698 antiquewhite: "#faebd7",
699 aqua: "#00ffff",
700 aquamarine: "#7fffd4",
701 azure: "#f0ffff",
702 beige: "#f5f5dc",
703 bisque: "#ffe4c4",
704 black: "#000000",
705 blanchedalmond: "#ffebcd",
706 blue: "#0000ff",
707 blueviolet: "#8a2be2",
708 brown: "#a52a2a",
709 burlywood: "#deb887",
710 cadetblue: "#5f9ea0",
711 chartreuse: "#7fff00",
712 chocolate: "#d2691e",
713 coral: "#ff7f50",
714 cornflowerblue: "#6495ed",
715 cornsilk: "#fff8dc",
716 crimson: "#dc143c",
717 cyan: "#00ffff",
718 darkblue: "#00008b",
719 darkcyan: "#008b8b",
720 darkgoldenrod: "#b8860b",
721 darkgray: "#a9a9a9",
722 darkgreen: "#006400",
723 darkgrey: "#a9a9a9",
724 darkkhaki: "#bdb76b",
725 darkmagenta: "#8b008b",
726 darkolivegreen: "#556b2f",
727 darkorange: "#ff8c00",
728 darkorchid: "#9932cc",
729 darkred: "#8b0000",
730 darksalmon: "#e9967a",
731 darkseagreen: "#8fbc8f",
732 darkslateblue: "#483d8b",
733 darkslategray: "#2f4f4f",
734 darkslategrey: "#2f4f4f",
735 darkturquoise: "#00ced1",
736 darkviolet: "#9400d3",
737 deeppink: "#ff1493",
738 deepskyblue: "#00bfff",
739 dimgray: "#696969",
740 dimgrey: "#696969",
741 dodgerblue: "#1e90ff",
742 firebrick: "#b22222",
743 floralwhite: "#fffaf0",
744 forestgreen: "#228b22",
745 fuchsia: "#ff00ff",
746 gainsboro: "#dcdcdc",
747 ghostwhite: "#f8f8ff",
748 gold: "#ffd700",
749 goldenrod: "#daa520",
750 gray: "#808080",
751 green: "#008000",
752 greenyellow: "#adff2f",
753 grey: "#808080",
754 honeydew: "#f0fff0",
755 hotpink: "#ff69b4",
756 indianred: "#cd5c5c",
757 indigo: "#4b0082",
758 ivory: "#fffff0",
759 khaki: "#f0e68c",
760 lavender: "#e6e6fa",
761 lavenderblush: "#fff0f5",
762 lawngreen: "#7cfc00",
763 lemonchiffon: "#fffacd",
764 lightblue: "#add8e6",
765 lightcoral: "#f08080",
766 lightcyan: "#e0ffff",
767 lightgoldenrodyellow: "#fafad2",
768 lightgray: "#d3d3d3",
769 lightgreen: "#90ee90",
770 lightgrey: "#d3d3d3",
771 lightpink: "#ffb6c1",
772 lightsalmon: "#ffa07a",
773 lightseagreen: "#20b2aa",
774 lightskyblue: "#87cefa",
775 lightslategray: "#778899",
776 lightslategrey: "#778899",
777 lightsteelblue: "#b0c4de",
778 lightyellow: "#ffffe0",
779 lime: "#00ff00",
780 limegreen: "#32cd32",
781 linen: "#faf0e6",
782 magenta: "#ff00ff",
783 maroon: "#800000",
784 mediumaquamarine: "#66cdaa",
785 mediumblue: "#0000cd",
786 mediumorchid: "#ba55d3",
787 mediumpurple: "#9370db",
788 mediumseagreen: "#3cb371",
789 mediumslateblue: "#7b68ee",
790 mediumspringgreen: "#00fa9a",
791 mediumturquoise: "#48d1cc",
792 mediumvioletred: "#c71585",
793 midnightblue: "#191970",
794 mintcream: "#f5fffa",
795 mistyrose: "#ffe4e1",
796 moccasin: "#ffe4b5",
797 navajowhite: "#ffdead",
798 navy: "#000080",
799 oldlace: "#fdf5e6",
800 olive: "#808000",
801 olivedrab: "#6b8e23",
802 orange: "#ffa500",
803 orangered: "#ff4500",
804 orchid: "#da70d6",
805 palegoldenrod: "#eee8aa",
806 palegreen: "#98fb98",
807 paleturquoise: "#afeeee",
808 palevioletred: "#db7093",
809 papayawhip: "#ffefd5",
810 peachpuff: "#ffdab9",
811 peru: "#cd853f",
812 pink: "#ffc0cb",
813 plum: "#dda0dd",
814 powderblue: "#b0e0e6",
815 purple: "#800080",
816 red: "#ff0000",
817 rosybrown: "#bc8f8f",
818 royalblue: "#4169e1",
819 saddlebrown: "#8b4513",
820 salmon: "#fa8072",
821 sandybrown: "#f4a460",
822 seagreen: "#2e8b57",
823 seashell: "#fff5ee",
824 sienna: "#a0522d",
825 silver: "#c0c0c0",
826 skyblue: "#87ceeb",
827 slateblue: "#6a5acd",
828 slategray: "#708090",
829 slategrey: "#708090",
830 snow: "#fffafa",
831 springgreen: "#00ff7f",
832 steelblue: "#4682b4",
833 tan: "#d2b48c",
834 teal: "#008080",
835 thistle: "#d8bfd8",
836 tomato: "#ff6347",
837 turquoise: "#40e0d0",
838 violet: "#ee82ee",
839 wheat: "#f5deb3",
840 white: "#ffffff",
841 whitesmoke: "#f5f5f5",
842 yellow: "#ffff00",
843 yellowgreen: "#9acd32"
844};
845
846MochiKit.Base._exportSymbols(this, MochiKit.Color);
diff --git a/frontend/delta/js/MochiKit/DOM.js b/frontend/delta/js/MochiKit/DOM.js
new file mode 100644
index 0000000..23d996b
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/DOM.js
@@ -0,0 +1,1202 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.DOM 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'DOM', '1.5', ['Base']);
35
36MochiKit.Base.update(MochiKit.DOM, {
37
38 /** @id MochiKit.DOM.currentWindow */
39 currentWindow: function () {
40 return MochiKit.DOM._window;
41 },
42
43 /** @id MochiKit.DOM.currentDocument */
44 currentDocument: function () {
45 return MochiKit.DOM._document;
46 },
47
48 /** @id MochiKit.DOM.withWindow */
49 withWindow: function (win, func) {
50 var self = MochiKit.DOM;
51 var oldDoc = self._document;
52 var oldWin = self._window;
53 var rval;
54 try {
55 self._window = win;
56 self._document = win.document;
57 rval = func();
58 } catch (e) {
59 self._window = oldWin;
60 self._document = oldDoc;
61 throw e;
62 }
63 self._window = oldWin;
64 self._document = oldDoc;
65 return rval;
66 },
67
68 /** @id MochiKit.DOM.formContents */
69 formContents: function (elem/* = document.body */) {
70 var names = [];
71 var values = [];
72 var m = MochiKit.Base;
73 var self = MochiKit.DOM;
74 if (typeof(elem) == "undefined" || elem === null) {
75 elem = self._document.body;
76 } else {
77 elem = self.getElement(elem);
78 }
79 m.nodeWalk(elem, function (elem) {
80 var name = elem.name;
81 if (m.isNotEmpty(name)) {
82 var tagName = elem.tagName.toUpperCase();
83 if (tagName === "INPUT"
84 && (elem.type == "radio" || elem.type == "checkbox")
85 && !elem.checked
86 ) {
87 return null;
88 }
89 if (tagName === "SELECT") {
90 if (elem.type == "select-one") {
91 if (elem.selectedIndex >= 0) {
92 var opt = elem.options[elem.selectedIndex];
93 var v = opt.value;
94 if (!v) {
95 var h = opt.outerHTML;
96 // internet explorer sure does suck.
97 if (h && !h.match(/^[^>]+\svalue\s*=/i)) {
98 v = opt.text;
99 }
100 }
101 names.push(name);
102 values.push(v);
103 return null;
104 }
105 // no form elements?
106 names.push(name);
107 values.push("");
108 return null;
109 } else {
110 var opts = elem.options;
111 if (!opts.length) {
112 names.push(name);
113 values.push("");
114 return null;
115 }
116 for (var i = 0; i < opts.length; i++) {
117 var opt = opts[i];
118 if (!opt.selected) {
119 continue;
120 }
121 var v = opt.value;
122 if (!v) {
123 var h = opt.outerHTML;
124 // internet explorer sure does suck.
125 if (h && !h.match(/^[^>]+\svalue\s*=/i)) {
126 v = opt.text;
127 }
128 }
129 names.push(name);
130 values.push(v);
131 }
132 return null;
133 }
134 }
135 if (tagName === "FORM" || tagName === "P" || tagName === "SPAN"
136 || tagName === "DIV"
137 ) {
138 return elem.childNodes;
139 }
140 names.push(name);
141 values.push(elem.value || '');
142 return null;
143 }
144 return elem.childNodes;
145 });
146 return [names, values];
147 },
148
149 /** @id MochiKit.DOM.withDocument */
150 withDocument: function (doc, func) {
151 var self = MochiKit.DOM;
152 var oldDoc = self._document;
153 var rval;
154 try {
155 self._document = doc;
156 rval = func();
157 } catch (e) {
158 self._document = oldDoc;
159 throw e;
160 }
161 self._document = oldDoc;
162 return rval;
163 },
164
165 /** @id MochiKit.DOM.registerDOMConverter */
166 registerDOMConverter: function (name, check, wrap, /* optional */override) {
167 MochiKit.DOM.domConverters.register(name, check, wrap, override);
168 },
169
170 /** @id MochiKit.DOM.coerceToDOM */
171 coerceToDOM: function (node, ctx) {
172 var m = MochiKit.Base;
173 var im = MochiKit.Iter;
174 var self = MochiKit.DOM;
175 if (im) {
176 var iter = im.iter;
177 var repeat = im.repeat;
178 }
179 var map = m.map;
180 var domConverters = self.domConverters;
181 var coerceToDOM = arguments.callee;
182 var NotFound = m.NotFound;
183 while (true) {
184 if (typeof(node) == 'undefined' || node === null) {
185 return null;
186 }
187 // this is a safari childNodes object, avoiding crashes w/ attr
188 // lookup
189 if (typeof(node) == "function" &&
190 typeof(node.length) == "number" &&
191 !(node instanceof Function)) {
192 node = im ? im.list(node) : m.extend(null, node);
193 }
194 if (typeof(node.nodeType) != 'undefined' && node.nodeType > 0) {
195 return node;
196 }
197 if (typeof(node) == 'number' || typeof(node) == 'boolean') {
198 node = node.toString();
199 // FALL THROUGH
200 }
201 if (typeof(node) == 'string') {
202 return self._document.createTextNode(node);
203 }
204 if (typeof(node.__dom__) == 'function') {
205 node = node.__dom__(ctx);
206 continue;
207 }
208 if (typeof(node.dom) == 'function') {
209 node = node.dom(ctx);
210 continue;
211 }
212 if (typeof(node) == 'function') {
213 node = node.apply(ctx, [ctx]);
214 continue;
215 }
216
217 if (im) {
218 // iterable
219 var iterNodes = null;
220 try {
221 iterNodes = iter(node);
222 } catch (e) {
223 // pass
224 }
225 if (iterNodes) {
226 return map(coerceToDOM, iterNodes, repeat(ctx));
227 }
228 } else if (m.isArrayLike(node)) {
229 var func = function (n) { return coerceToDOM(n, ctx); };
230 return map(func, node);
231 }
232
233 // adapter
234 try {
235 node = domConverters.match(node, ctx);
236 continue;
237 } catch (e) {
238 if (e != NotFound) {
239 throw e;
240 }
241 }
242
243 // fallback
244 return self._document.createTextNode(node.toString());
245 }
246 // mozilla warnings aren't too bright
247 return undefined;
248 },
249
250 /** @id MochiKit.DOM.isChildNode */
251 isChildNode: function (node, maybeparent) {
252 var self = MochiKit.DOM;
253 if (typeof(node) == "string") {
254 node = self.getElement(node);
255 }
256 if (typeof(maybeparent) == "string") {
257 maybeparent = self.getElement(maybeparent);
258 }
259 if (typeof(node) == 'undefined' || node === null) {
260 return false;
261 }
262 while (node != null && node !== self._document) {
263 if (node === maybeparent) {
264 return true;
265 }
266 node = node.parentNode;
267 }
268 return false;
269 },
270
271 /** @id MochiKit.DOM.setNodeAttribute */
272 setNodeAttribute: function (node, attr, value) {
273 var o = {};
274 o[attr] = value;
275 try {
276 return MochiKit.DOM.updateNodeAttributes(node, o);
277 } catch (e) {
278 // pass
279 }
280 return null;
281 },
282
283 /** @id MochiKit.DOM.getNodeAttribute */
284 getNodeAttribute: function (node, attr) {
285 var self = MochiKit.DOM;
286 var rename = self.attributeArray.renames[attr];
287 var ignoreValue = self.attributeArray.ignoreAttr[attr];
288 node = self.getElement(node);
289 try {
290 if (rename) {
291 return node[rename];
292 }
293 var value = node.getAttribute(attr);
294 if (value != ignoreValue) {
295 return value;
296 }
297 } catch (e) {
298 // pass
299 }
300 return null;
301 },
302
303 /** @id MochiKit.DOM.removeNodeAttribute */
304 removeNodeAttribute: function (node, attr) {
305 var self = MochiKit.DOM;
306 var rename = self.attributeArray.renames[attr];
307 node = self.getElement(node);
308 try {
309 if (rename) {
310 return node[rename];
311 }
312 return node.removeAttribute(attr);
313 } catch (e) {
314 // pass
315 }
316 return null;
317 },
318
319 /** @id MochiKit.DOM.updateNodeAttributes */
320 updateNodeAttributes: function (node, attrs) {
321 var elem = node;
322 var self = MochiKit.DOM;
323 var base = MochiKit.Base;
324 if (typeof(node) == 'string') {
325 elem = self.getElement(node);
326 }
327 if (attrs) {
328 if (self.attributeArray.compliant) {
329 // not IE, good.
330 for (var k in attrs) {
331 var v = attrs[k];
332 if (typeof(v) == 'object' && typeof(elem[k]) == 'object') {
333 if (k == "style" && MochiKit.Style) {
334 MochiKit.Style.setStyle(elem, v);
335 } else {
336 base.updatetree(elem[k], v);
337 }
338 } else if (k.substring(0, 2) == "on") {
339 if (typeof(v) == "string") {
340 v = new Function(v);
341 }
342 elem[k] = v;
343 } else {
344 elem.setAttribute(k, v);
345 }
346 if (base.isValue(elem[k]) && elem[k] != v) {
347 // Also set property for weird attributes (see #302 & #335)
348 elem[k] = v;
349 }
350 }
351 } else {
352 // IE is insane in the membrane
353 var renames = self.attributeArray.renames;
354 for (var k in attrs) {
355 v = attrs[k];
356 var renamed = renames[k];
357 if (k == "style" && typeof(v) == "string") {
358 elem.style.cssText = v;
359 } else if (typeof(renamed) == "string") {
360 elem[renamed] = v;
361 } else if (typeof(elem[k]) == 'object'
362 && typeof(v) == 'object') {
363 if (k == "style" && MochiKit.Style) {
364 MochiKit.Style.setStyle(elem, v);
365 } else {
366 base.updatetree(elem[k], v);
367 }
368 } else if (k.substring(0, 2) == "on") {
369 if (typeof(v) == "string") {
370 v = new Function(v);
371 }
372 elem[k] = v;
373 } else {
374 elem.setAttribute(k, v);
375 }
376 if (base.isValue(elem[k]) && elem[k] != v) {
377 // Also set property for weird attributes (see #302 & #335)
378 elem[k] = v;
379 }
380 }
381 }
382 }
383 return elem;
384 },
385
386 /** @id MochiKit.DOM.appendChildNodes */
387 appendChildNodes: function (node/*, nodes...*/) {
388 var elem = node;
389 var self = MochiKit.DOM;
390 if (typeof(node) == 'string') {
391 elem = self.getElement(node);
392 }
393 var nodeStack = [
394 self.coerceToDOM(
395 MochiKit.Base.extend(null, arguments, 1),
396 elem
397 )
398 ];
399 var concat = MochiKit.Base.concat;
400 while (nodeStack.length) {
401 var n = nodeStack.shift();
402 if (typeof(n) == 'undefined' || n === null) {
403 // pass
404 } else if (typeof(n.nodeType) == 'number') {
405 elem.appendChild(n);
406 } else {
407 nodeStack = concat(n, nodeStack);
408 }
409 }
410 return elem;
411 },
412
413
414 /** @id MochiKit.DOM.insertSiblingNodesBefore */
415 insertSiblingNodesBefore: function (node/*, nodes...*/) {
416 var elem = node;
417 var self = MochiKit.DOM;
418 if (typeof(node) == 'string') {
419 elem = self.getElement(node);
420 }
421 var nodeStack = [
422 self.coerceToDOM(
423 MochiKit.Base.extend(null, arguments, 1),
424 elem
425 )
426 ];
427 var parentnode = elem.parentNode;
428 var concat = MochiKit.Base.concat;
429 while (nodeStack.length) {
430 var n = nodeStack.shift();
431 if (typeof(n) == 'undefined' || n === null) {
432 // pass
433 } else if (typeof(n.nodeType) == 'number') {
434 parentnode.insertBefore(n, elem);
435 } else {
436 nodeStack = concat(n, nodeStack);
437 }
438 }
439 return parentnode;
440 },
441
442 /** @id MochiKit.DOM.insertSiblingNodesAfter */
443 insertSiblingNodesAfter: function (node/*, nodes...*/) {
444 var elem = node;
445 var self = MochiKit.DOM;
446
447 if (typeof(node) == 'string') {
448 elem = self.getElement(node);
449 }
450 var nodeStack = [
451 self.coerceToDOM(
452 MochiKit.Base.extend(null, arguments, 1),
453 elem
454 )
455 ];
456
457 if (elem.nextSibling) {
458 return self.insertSiblingNodesBefore(elem.nextSibling, nodeStack);
459 }
460 else {
461 return self.appendChildNodes(elem.parentNode, nodeStack);
462 }
463 },
464
465 /** @id MochiKit.DOM.replaceChildNodes */
466 replaceChildNodes: function (node/*, nodes...*/) {
467 var elem = node;
468 var self = MochiKit.DOM;
469 if (typeof(node) == 'string') {
470 elem = self.getElement(node);
471 arguments[0] = elem;
472 }
473 var child;
474 while ((child = elem.firstChild)) {
475 elem.removeChild(child);
476 }
477 if (arguments.length < 2) {
478 return elem;
479 } else {
480 return self.appendChildNodes.apply(this, arguments);
481 }
482 },
483
484 /** @id MochiKit.DOM.createDOM */
485 createDOM: function (name, attrs/*, nodes... */) {
486 var elem;
487 var self = MochiKit.DOM;
488 var m = MochiKit.Base;
489 if (typeof(attrs) == "string" || typeof(attrs) == "number") {
490 var args = m.extend([name, null], arguments, 1);
491 return arguments.callee.apply(this, args);
492 }
493 if (typeof(name) == 'string') {
494 // Internet Explorer is dumb
495 var xhtml = self._xhtml;
496 if (attrs && !self.attributeArray.compliant) {
497 // http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/name_2.asp
498 var contents = "";
499 if ('name' in attrs) {
500 contents += ' name="' + self.escapeHTML(attrs.name) + '"';
501 }
502 if (name == 'input' && 'type' in attrs) {
503 contents += ' type="' + self.escapeHTML(attrs.type) + '"';
504 }
505 if (contents) {
506 name = "<" + name + contents + ">";
507 xhtml = false;
508 }
509 }
510 var d = self._document;
511 if (xhtml && d === document) {
512 elem = d.createElementNS("http://www.w3.org/1999/xhtml", name);
513 } else {
514 elem = d.createElement(name);
515 }
516 } else {
517 elem = name;
518 }
519 if (attrs) {
520 self.updateNodeAttributes(elem, attrs);
521 }
522 if (arguments.length <= 2) {
523 return elem;
524 } else {
525 var args = m.extend([elem], arguments, 2);
526 return self.appendChildNodes.apply(this, args);
527 }
528 },
529
530 /** @id MochiKit.DOM.createDOMFunc */
531 createDOMFunc: function (/* tag, attrs, *nodes */) {
532 var m = MochiKit.Base;
533 return m.partial.apply(
534 this,
535 m.extend([MochiKit.DOM.createDOM], arguments)
536 );
537 },
538
539 /** @id MochiKit.DOM.removeElement */
540 removeElement: function (elem) {
541 var self = MochiKit.DOM;
542 if (typeof(elem) == "string") {
543 elem = self.getElement(elem);
544 }
545 var e = self.coerceToDOM(elem);
546 e.parentNode.removeChild(e);
547 return e;
548 },
549
550 /** @id MochiKit.DOM.swapDOM */
551 swapDOM: function (dest, src) {
552 var self = MochiKit.DOM;
553 dest = self.getElement(dest);
554 var parent = dest.parentNode;
555 if (src) {
556 if (typeof(src) == "string") {
557 src = self.getElement(src);
558 }
559 src = self.coerceToDOM(src, parent);
560 parent.replaceChild(src, dest);
561 } else {
562 parent.removeChild(dest);
563 }
564 return src;
565 },
566
567 /** @id MochiKit.DOM.getElement */
568 getElement: function (id) {
569 var self = MochiKit.DOM;
570 if (arguments.length == 1) {
571 return ((typeof(id) == "string") ?
572 self._document.getElementById(id) : id);
573 } else {
574 return MochiKit.Base.map(self.getElement, arguments);
575 }
576 },
577
578 /** @id MochiKit.DOM.getElementsByTagAndClassName */
579 getElementsByTagAndClassName: function (tagName, className,
580 /* optional */parent) {
581 var self = MochiKit.DOM;
582 if (typeof(tagName) == 'undefined' || tagName === null) {
583 tagName = '*';
584 }
585 if (typeof(parent) == 'undefined' || parent === null) {
586 parent = self._document;
587 }
588 parent = self.getElement(parent);
589 if (parent == null) {
590 return [];
591 }
592 var children = (parent.getElementsByTagName(tagName)
593 || self._document.all);
594 if (typeof(className) == 'undefined' || className === null) {
595 return MochiKit.Base.extend(null, children);
596 }
597
598 var elements = [];
599 for (var i = 0; i < children.length; i++) {
600 var child = children[i];
601 var cls = child.className;
602 if (typeof(cls) != "string") {
603 cls = child.getAttribute("class");
604 }
605 if (typeof(cls) == "string") {
606 var classNames = cls.split(' ');
607 for (var j = 0; j < classNames.length; j++) {
608 if (classNames[j] == className) {
609 elements.push(child);
610 break;
611 }
612 }
613 }
614 }
615
616 return elements;
617 },
618
619 _newCallStack: function (path, once) {
620 var rval = function () {
621 var callStack = arguments.callee.callStack;
622 for (var i = 0; i < callStack.length; i++) {
623 if (callStack[i].apply(this, arguments) === false) {
624 break;
625 }
626 }
627 if (once) {
628 try {
629 this[path] = null;
630 } catch (e) {
631 // pass
632 }
633 }
634 };
635 rval.callStack = [];
636 return rval;
637 },
638
639 /** @id MochiKit.DOM.addToCallStack */
640 addToCallStack: function (target, path, func, once) {
641 var self = MochiKit.DOM;
642 var existing = target[path];
643 var regfunc = existing;
644 if (!(typeof(existing) == 'function'
645 && typeof(existing.callStack) == "object"
646 && existing.callStack !== null)) {
647 regfunc = self._newCallStack(path, once);
648 if (typeof(existing) == 'function') {
649 regfunc.callStack.push(existing);
650 }
651 target[path] = regfunc;
652 }
653 regfunc.callStack.push(func);
654 },
655
656 /** @id MochiKit.DOM.addLoadEvent */
657 addLoadEvent: function (func) {
658 var self = MochiKit.DOM;
659 self.addToCallStack(self._window, "onload", func, true);
660
661 },
662
663 /** @id MochiKit.DOM.focusOnLoad */
664 focusOnLoad: function (element) {
665 var self = MochiKit.DOM;
666 self.addLoadEvent(function () {
667 element = self.getElement(element);
668 if (element) {
669 element.focus();
670 }
671 });
672 },
673
674 /** @id MochiKit.DOM.setElementClass */
675 setElementClass: function (element, className) {
676 var self = MochiKit.DOM;
677 var obj = self.getElement(element);
678 if (self.attributeArray.compliant) {
679 obj.setAttribute("class", className);
680 } else {
681 obj.setAttribute("className", className);
682 }
683 },
684
685 /** @id MochiKit.DOM.toggleElementClass */
686 toggleElementClass: function (className/*, element... */) {
687 var self = MochiKit.DOM;
688 for (var i = 1; i < arguments.length; i++) {
689 var obj = self.getElement(arguments[i]);
690 if (!self.addElementClass(obj, className)) {
691 self.removeElementClass(obj, className);
692 }
693 }
694 },
695
696 /** @id MochiKit.DOM.addElementClass */
697 addElementClass: function (element, className) {
698 var self = MochiKit.DOM;
699 var obj = self.getElement(element);
700 var cls = obj.className;
701 if (typeof(cls) != "string") {
702 cls = obj.getAttribute("class");
703 }
704 // trivial case, no className yet
705 if (typeof(cls) != "string" || cls.length === 0) {
706 self.setElementClass(obj, className);
707 return true;
708 }
709 // the other trivial case, already set as the only class
710 if (cls == className) {
711 return false;
712 }
713 var classes = cls.split(" ");
714 for (var i = 0; i < classes.length; i++) {
715 // already present
716 if (classes[i] == className) {
717 return false;
718 }
719 }
720 // append class
721 self.setElementClass(obj, cls + " " + className);
722 return true;
723 },
724
725 /** @id MochiKit.DOM.removeElementClass */
726 removeElementClass: function (element, className) {
727 var self = MochiKit.DOM;
728 var obj = self.getElement(element);
729 var cls = obj.className;
730 if (typeof(cls) != "string") {
731 cls = obj.getAttribute("class");
732 }
733 // trivial case, no className yet
734 if (typeof(cls) != "string" || cls.length === 0) {
735 return false;
736 }
737 // other trivial case, set only to className
738 if (cls == className) {
739 self.setElementClass(obj, "");
740 return true;
741 }
742 var classes = cls.split(" ");
743 for (var i = 0; i < classes.length; i++) {
744 // already present
745 if (classes[i] == className) {
746 // only check sane case where the class is used once
747 classes.splice(i, 1);
748 self.setElementClass(obj, classes.join(" "));
749 return true;
750 }
751 }
752 // not found
753 return false;
754 },
755
756 /** @id MochiKit.DOM.swapElementClass */
757 swapElementClass: function (element, fromClass, toClass) {
758 var obj = MochiKit.DOM.getElement(element);
759 var res = MochiKit.DOM.removeElementClass(obj, fromClass);
760 if (res) {
761 MochiKit.DOM.addElementClass(obj, toClass);
762 }
763 return res;
764 },
765
766 /** @id MochiKit.DOM.hasElementClass */
767 hasElementClass: function (element, className/*...*/) {
768 var obj = MochiKit.DOM.getElement(element);
769 if (obj == null) {
770 return false;
771 }
772 var cls = obj.className;
773 if (typeof(cls) != "string" && typeof(obj.getAttribute) == "function") {
774 cls = obj.getAttribute("class");
775 }
776 if (typeof(cls) != "string") {
777 return false;
778 }
779 var classes = cls.split(" ");
780 for (var i = 1; i < arguments.length; i++) {
781 var good = false;
782 for (var j = 0; j < classes.length; j++) {
783 if (classes[j] == arguments[i]) {
784 good = true;
785 break;
786 }
787 }
788 if (!good) {
789 return false;
790 }
791 }
792 return true;
793 },
794
795 /** @id MochiKit.DOM.escapeHTML */
796 escapeHTML: function (s) {
797 return s.replace(/&/g, "&amp;"
798 ).replace(/"/g, "&quot;"
799 ).replace(/</g, "&lt;"
800 ).replace(/>/g, "&gt;");
801 },
802
803 /** @id MochiKit.DOM.toHTML */
804 toHTML: function (dom) {
805 return MochiKit.DOM.emitHTML(dom).join("");
806 },
807
808 /** @id MochiKit.DOM.emitHTML */
809 emitHTML: function (dom, /* optional */lst) {
810 if (typeof(lst) == 'undefined' || lst === null) {
811 lst = [];
812 }
813 // queue is the call stack, we're doing this non-recursively
814 var queue = [dom];
815 var self = MochiKit.DOM;
816 var escapeHTML = self.escapeHTML;
817 var attributeArray = self.attributeArray;
818 while (queue.length) {
819 dom = queue.pop();
820 if (typeof(dom) == 'string') {
821 lst.push(dom);
822 } else if (dom.nodeType == 1) {
823 // we're not using higher order stuff here
824 // because safari has heisenbugs.. argh.
825 //
826 // I think it might have something to do with
827 // garbage collection and function calls.
828 lst.push('<' + dom.tagName.toLowerCase());
829 var attributes = [];
830 var domAttr = attributeArray(dom);
831 for (var i = 0; i < domAttr.length; i++) {
832 var a = domAttr[i];
833 attributes.push([
834 " ",
835 a.name,
836 '="',
837 escapeHTML(a.value),
838 '"'
839 ]);
840 }
841 attributes.sort();
842 for (i = 0; i < attributes.length; i++) {
843 var attrs = attributes[i];
844 for (var j = 0; j < attrs.length; j++) {
845 lst.push(attrs[j]);
846 }
847 }
848 if (dom.hasChildNodes()) {
849 lst.push(">");
850 // queue is the FILO call stack, so we put the close tag
851 // on first
852 queue.push("</" + dom.tagName.toLowerCase() + ">");
853 var cnodes = dom.childNodes;
854 for (i = cnodes.length - 1; i >= 0; i--) {
855 queue.push(cnodes[i]);
856 }
857 } else {
858 lst.push('/>');
859 }
860 } else if (dom.nodeType == 3) {
861 lst.push(escapeHTML(dom.nodeValue));
862 }
863 }
864 return lst;
865 },
866
867 /** @id MochiKit.DOM.scrapeText */
868 scrapeText: function (node, /* optional */asArray) {
869 var rval = [];
870 (function (node) {
871 var cn = node.childNodes;
872 if (cn) {
873 for (var i = 0; i < cn.length; i++) {
874 arguments.callee.call(this, cn[i]);
875 }
876 }
877 var nodeValue = node.nodeValue;
878 if (typeof(nodeValue) == 'string') {
879 rval.push(nodeValue);
880 }
881 })(MochiKit.DOM.getElement(node));
882 if (asArray) {
883 return rval;
884 } else {
885 return rval.join("");
886 }
887 },
888
889 /** @id MochiKit.DOM.removeEmptyTextNodes */
890 removeEmptyTextNodes: function (element) {
891 element = MochiKit.DOM.getElement(element);
892 for (var i = 0; i < element.childNodes.length; i++) {
893 var node = element.childNodes[i];
894 if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
895 node.parentNode.removeChild(node);
896 }
897 }
898 },
899
900 /** @id MochiKit.DOM.getFirstElementByTagAndClassName */
901 getFirstElementByTagAndClassName: function (tagName, className,
902 /* optional */parent) {
903 var self = MochiKit.DOM;
904 if (typeof(tagName) == 'undefined' || tagName === null) {
905 tagName = '*';
906 }
907 if (typeof(parent) == 'undefined' || parent === null) {
908 parent = self._document;
909 }
910 parent = self.getElement(parent);
911 if (parent == null) {
912 return null;
913 }
914 var children = (parent.getElementsByTagName(tagName)
915 || self._document.all);
916 if (children.length <= 0) {
917 return null;
918 } else if (typeof(className) == 'undefined' || className === null) {
919 return children[0];
920 }
921
922 for (var i = 0; i < children.length; i++) {
923 var child = children[i];
924 var cls = child.className;
925 if (typeof(cls) != "string") {
926 cls = child.getAttribute("class");
927 }
928 if (typeof(cls) == "string") {
929 var classNames = cls.split(' ');
930 for (var j = 0; j < classNames.length; j++) {
931 if (classNames[j] == className) {
932 return child;
933 }
934 }
935 }
936 }
937 return null;
938 },
939
940 /** @id MochiKit.DOM.getFirstParentByTagAndClassName */
941 getFirstParentByTagAndClassName: function (elem, tagName, className) {
942 var self = MochiKit.DOM;
943 elem = self.getElement(elem);
944 if (typeof(tagName) == 'undefined' || tagName === null) {
945 tagName = '*';
946 } else {
947 tagName = tagName.toUpperCase();
948 }
949 if (typeof(className) == 'undefined' || className === null) {
950 className = null;
951 }
952 if (elem) {
953 elem = elem.parentNode;
954 }
955 while (elem && elem.tagName) {
956 var curTagName = elem.tagName.toUpperCase();
957 if ((tagName === '*' || tagName == curTagName) &&
958 (className === null || self.hasElementClass(elem, className))) {
959 return elem;
960 }
961 elem = elem.parentNode;
962 }
963 return null;
964 },
965
966 __new__: function (win) {
967
968 var m = MochiKit.Base;
969 if (typeof(document) != "undefined") {
970 this._document = document;
971 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
972 this._xhtml = (document.documentElement &&
973 document.createElementNS &&
974 document.documentElement.namespaceURI === kXULNSURI);
975 } else if (MochiKit.MockDOM) {
976 this._document = MochiKit.MockDOM.document;
977 }
978 this._window = win;
979
980 this.domConverters = new m.AdapterRegistry();
981
982 var __tmpElement = this._document.createElement("span");
983 var attributeArray;
984 if (__tmpElement && __tmpElement.attributes &&
985 __tmpElement.attributes.length > 0) {
986 // for braindead browsers (IE) that insert extra junk
987 var filter = m.filter;
988 attributeArray = function (node) {
989 /***
990
991 Return an array of attributes for a given node,
992 filtering out attributes that don't belong for
993 that are inserted by "Certain Browsers".
994
995 ***/
996 return filter(attributeArray.ignoreAttrFilter, node.attributes);
997 };
998 attributeArray.ignoreAttr = {};
999 var attrs = __tmpElement.attributes;
1000 var ignoreAttr = attributeArray.ignoreAttr;
1001 for (var i = 0; i < attrs.length; i++) {
1002 var a = attrs[i];
1003 ignoreAttr[a.name] = a.value;
1004 }
1005 attributeArray.ignoreAttrFilter = function (a) {
1006 return (attributeArray.ignoreAttr[a.name] != a.value);
1007 };
1008 attributeArray.compliant = false;
1009 attributeArray.renames = {
1010 "class": "className",
1011 "checked": "defaultChecked",
1012 "usemap": "useMap",
1013 "for": "htmlFor",
1014 "readonly": "readOnly",
1015 "colspan": "colSpan",
1016 "rowspan": "rowSpan",
1017 "bgcolor": "bgColor",
1018 "cellspacing": "cellSpacing",
1019 "cellpadding": "cellPadding"
1020 };
1021 } else {
1022 attributeArray = function (node) {
1023 return node.attributes;
1024 };
1025 attributeArray.compliant = true;
1026 attributeArray.ignoreAttr = {};
1027 attributeArray.renames = {};
1028 }
1029 attributeArray.__export__ = false;
1030 this.attributeArray = attributeArray;
1031
1032 // Backwards compatibility aliases
1033 /** @id MochiKit.DOM.computedStyle */
1034 m._deprecated(this, 'computedStyle', 'MochiKit.Style.getStyle', '1.4', true);
1035 /** @id MochiKit.DOM.elementDimensions */
1036 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.4');
1037 /** @id MochiKit.DOM.elementPosition */
1038 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.4');
1039 /** @id MochiKit.DOM.getViewportDimensions */
1040 m._deprecated(this, 'getViewportDimensions', 'MochiKit.Style.getViewportDimensions', '1.4');
1041 /** @id MochiKit.DOM.hideElement */
1042 m._deprecated(this, 'hideElement', 'MochiKit.Style.hideElement', '1.4');
1043 /** @id MochiKit.DOM.makeClipping */
1044 m._deprecated(this, 'makeClipping', 'MochiKit.Style.makeClipping', '1.4.1');
1045 /** @id MochiKit.DOM.makePositioned */
1046 m._deprecated(this, 'makePositioned', 'MochiKit.Style.makePositioned', '1.4.1');
1047 /** @id MochiKit.DOM.setElementDimensions */
1048 m._deprecated(this, 'setElementDimensions', 'MochiKit.Style.setElementDimensions', '1.4');
1049 /** @id MochiKit.DOM.setElementPosition */
1050 m._deprecated(this, 'setElementPosition', 'MochiKit.Style.setElementPosition', '1.4');
1051 /** @id MochiKit.DOM.setDisplayForElement */
1052 m._deprecated(this, 'setDisplayForElement', 'MochiKit.Style.setDisplayForElement', '1.4');
1053 /** @id MochiKit.DOM.setOpacity */
1054 m._deprecated(this, 'setOpacity', 'MochiKit.Style.setOpacity', '1.4');
1055 /** @id MochiKit.DOM.showElement */
1056 m._deprecated(this, 'showElement', 'MochiKit.Style.showElement', '1.4');
1057 /** @id MochiKit.DOM.undoClipping */
1058 m._deprecated(this, 'undoClipping', 'MochiKit.Style.undoClipping', '1.4.1');
1059 /** @id MochiKit.DOM.undoPositioned */
1060 m._deprecated(this, 'undoPositioned', 'MochiKit.Style.undoPositioned', '1.4.1');
1061 /** @id MochiKit.DOM.Coordinates */
1062 m._deprecated(this, 'Coordinates', 'MochiKit.Style.Coordinates', '1.4');
1063 /** @id MochiKit.DOM.Dimensions */
1064 m._deprecated(this, 'Dimensions', 'MochiKit.Style.Dimensions', '1.4');
1065
1066 // shorthand for createDOM syntax
1067 var createDOMFunc = this.createDOMFunc;
1068 /** @id MochiKit.DOM.A */
1069 this.A = createDOMFunc("a");
1070 /** @id MochiKit.DOM.ARTICLE */
1071 this.ARTICLE = createDOMFunc("article");
1072 /** @id MochiKit.DOM.ASIDE */
1073 this.ASIDE = createDOMFunc("aside");
1074 /** @id MochiKit.DOM.BR */
1075 this.BR = createDOMFunc("br");
1076 /** @id MochiKit.DOM.BUTTON */
1077 this.BUTTON = createDOMFunc("button");
1078 /** @id MochiKit.DOM.CANVAS */
1079 this.CANVAS = createDOMFunc("canvas");
1080 /** @id MochiKit.DOM.CAPTION */
1081 this.CAPTION = createDOMFunc("caption");
1082 /** @id MochiKit.DOM.DD */
1083 this.DD = createDOMFunc("dd");
1084 /** @id MochiKit.DOM.DIV */
1085 this.DIV = createDOMFunc("div");
1086 /** @id MochiKit.DOM.DL */
1087 this.DL = createDOMFunc("dl");
1088 /** @id MochiKit.DOM.DT */
1089 this.DT = createDOMFunc("dt");
1090 /** @id MochiKit.DOM.FIELDSET */
1091 this.FIELDSET = createDOMFunc("fieldset");
1092 /** @id MochiKit.DOM.FIGURE */
1093 this.FIGURE = createDOMFunc("figure");
1094 /** @id MochiKit.DOM.FIGCAPTION */
1095 this.FIGCAPTION = createDOMFunc("figcaption");
1096 /** @id MochiKit.DOM.FOOTER */
1097 this.FOOTER = createDOMFunc("footer");
1098 /** @id MochiKit.DOM.FORM */
1099 this.FORM = createDOMFunc("form");
1100 /** @id MochiKit.DOM.H1 */
1101 this.H1 = createDOMFunc("h1");
1102 /** @id MochiKit.DOM.H2 */
1103 this.H2 = createDOMFunc("h2");
1104 /** @id MochiKit.DOM.H3 */
1105 this.H3 = createDOMFunc("h3");
1106 /** @id MochiKit.DOM.H4 */
1107 this.H4 = createDOMFunc("h4");
1108 /** @id MochiKit.DOM.H5 */
1109 this.H5 = createDOMFunc("h5");
1110 /** @id MochiKit.DOM.H6 */
1111 this.H6 = createDOMFunc("h6");
1112 /** @id MochiKit.DOM.HEADER */
1113 this.HEADER = createDOMFunc("header");
1114 /** @id MochiKit.DOM.HGROUP */
1115 this.HGROUP = createDOMFunc("hgroup");
1116 /** @id MochiKit.DOM.HR */
1117 this.HR = createDOMFunc("hr");
1118 /** @id MochiKit.DOM.IFRAME */
1119 this.IFRAME = createDOMFunc("iframe");
1120 /** @id MochiKit.DOM.IMG */
1121 this.IMG = createDOMFunc("img");
1122 /** @id MochiKit.DOM.INPUT */
1123 this.INPUT = createDOMFunc("input");
1124 /** @id MochiKit.DOM.LABEL */
1125 this.LABEL = createDOMFunc("label");
1126 /** @id MochiKit.DOM.LEGEND */
1127 this.LEGEND = createDOMFunc("legend");
1128 /** @id MochiKit.DOM.LI */
1129 this.LI = createDOMFunc("li");
1130 /** @id MochiKit.DOM.LINK */
1131 this.LINK = createDOMFunc("link");
1132 /** @id MochiKit.DOM.MARK */
1133 this.MARK = createDOMFunc("mark");
1134 /** @id MochiKit.DOM.METER */
1135 this.METER = createDOMFunc("meter");
1136 /** @id MochiKit.DOM.NAV */
1137 this.NAV = createDOMFunc("nav");
1138 /** @id MochiKit.DOM.OL */
1139 this.OL = createDOMFunc("ol");
1140 /** @id MochiKit.DOM.OPTGROUP */
1141 this.OPTGROUP = createDOMFunc("optgroup");
1142 /** @id MochiKit.DOM.OPTION */
1143 this.OPTION = createDOMFunc("option");
1144 /** @id MochiKit.DOM.P */
1145 this.P = createDOMFunc("p");
1146 /** @id MochiKit.DOM.PRE */
1147 this.PRE = createDOMFunc("pre");
1148 /** @id MochiKit.DOM.PROGRESS */
1149 this.PROGRESS = createDOMFunc("progress");
1150 /** @id MochiKit.DOM.SCRIPT */
1151 this.SCRIPT = createDOMFunc("script");
1152 /** @id MochiKit.DOM.SECTION */
1153 this.SECTION = createDOMFunc("section");
1154 /** @id MochiKit.DOM.SELECT */
1155 this.SELECT = createDOMFunc("select");
1156 /** @id MochiKit.DOM.SPAN */
1157 this.SPAN = createDOMFunc("span");
1158 /** @id MochiKit.DOM.STRONG */
1159 this.STRONG = createDOMFunc("strong");
1160 /** @id MochiKit.DOM.STYLE */
1161 this.STYLE = createDOMFunc("style");
1162 /** @id MochiKit.DOM.TABLE */
1163 this.TABLE = createDOMFunc("table");
1164 /** @id MochiKit.DOM.TBODY */
1165 this.TBODY = createDOMFunc("tbody");
1166 /** @id MochiKit.DOM.TD */
1167 this.TD = createDOMFunc("td");
1168 /** @id MochiKit.DOM.TEXTAREA */
1169 this.TEXTAREA = createDOMFunc("textarea");
1170 /** @id MochiKit.DOM.TFOOT */
1171 this.TFOOT = createDOMFunc("tfoot");
1172 /** @id MochiKit.DOM.TH */
1173 this.TH = createDOMFunc("th");
1174 /** @id MochiKit.DOM.THEAD */
1175 this.THEAD = createDOMFunc("thead");
1176 /** @id MochiKit.DOM.TR */
1177 this.TR = createDOMFunc("tr");
1178 /** @id MochiKit.DOM.TT */
1179 this.TT = createDOMFunc("tt");
1180 /** @id MochiKit.DOM.UL */
1181 this.UL = createDOMFunc("ul");
1182 /** @id MochiKit.DOM.NBSP */
1183 this.NBSP = "\u00a0";
1184 /** @id MochiKit.DOM.$ */
1185 this.$ = this.getElement;
1186
1187 m.nameFunctions(this);
1188 }
1189});
1190
1191
1192MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window));
1193
1194//
1195// XXX: Internet Explorer blows
1196//
1197if (MochiKit.__export__) {
1198 withWindow = MochiKit.DOM.withWindow;
1199 withDocument = MochiKit.DOM.withDocument;
1200}
1201
1202MochiKit.Base._exportSymbols(this, MochiKit.DOM);
diff --git a/frontend/delta/js/MochiKit/DateTime.js b/frontend/delta/js/MochiKit/DateTime.js
new file mode 100644
index 0000000..24ca087
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/DateTime.js
@@ -0,0 +1,199 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.DateTime 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'DateTime', '1.5', ['Base']);
35
36/** @id MochiKit.DateTime.isoDate */
37MochiKit.DateTime.isoDate = function (str) {
38 str = str + "";
39 if (typeof(str) != "string" || str.length === 0) {
40 return null;
41 }
42 var iso = str.split('-');
43 if (iso.length === 0) {
44 return null;
45 }
46 var date = new Date(parseInt(iso[0], 10), parseInt(iso[1], 10) - 1, parseInt(iso[2], 10));
47 date.setFullYear(iso[0]);
48 date.setMonth(iso[1] - 1);
49 date.setDate(iso[2]);
50 return date;
51};
52
53MochiKit.DateTime._isoRegexp = /(\d{4,})(?:-(\d{1,2})(?:-(\d{1,2})(?:[T ](\d{1,2}):(\d{1,2})(?::(\d{1,2})(?:\.(\d+))?)?(?:(Z)|([+-])(\d{1,2})(?::(\d{1,2}))?)?)?)?)?/;
54
55/** @id MochiKit.DateTime.isoTimestamp */
56MochiKit.DateTime.isoTimestamp = function (str) {
57 str = str + "";
58 if (typeof(str) != "string" || str.length === 0) {
59 return null;
60 }
61 var res = str.match(MochiKit.DateTime._isoRegexp);
62 if (typeof(res) == "undefined" || res === null) {
63 return null;
64 }
65 var year, month, day, hour, min, sec, msec;
66 year = parseInt(res[1], 10);
67 if (typeof(res[2]) == "undefined" || res[2] === '') {
68 return new Date(year);
69 }
70 month = parseInt(res[2], 10) - 1;
71 day = parseInt(res[3], 10);
72 if (typeof(res[4]) == "undefined" || res[4] === '') {
73 return new Date(year, month, day);
74 }
75 hour = parseInt(res[4], 10);
76 min = parseInt(res[5], 10);
77 sec = (typeof(res[6]) != "undefined" && res[6] !== '') ? parseInt(res[6], 10) : 0;
78 if (typeof(res[7]) != "undefined" && res[7] !== '') {
79 msec = Math.round(1000.0 * parseFloat("0." + res[7]));
80 } else {
81 msec = 0;
82 }
83 if ((typeof(res[8]) == "undefined" || res[8] === '') && (typeof(res[9]) == "undefined" || res[9] === '')) {
84 return new Date(year, month, day, hour, min, sec, msec);
85 }
86 var ofs;
87 if (typeof(res[9]) != "undefined" && res[9] !== '') {
88 ofs = parseInt(res[10], 10) * 3600000;
89 if (typeof(res[11]) != "undefined" && res[11] !== '') {
90 ofs += parseInt(res[11], 10) * 60000;
91 }
92 if (res[9] == "-") {
93 ofs = -ofs;
94 }
95 } else {
96 ofs = 0;
97 }
98 return new Date(Date.UTC(year, month, day, hour, min, sec, msec) - ofs);
99};
100
101/** @id MochiKit.DateTime.toISOTime */
102MochiKit.DateTime.toISOTime = function (date, realISO/* = false */) {
103 if (typeof(date) == "undefined" || date === null) {
104 return null;
105 }
106 var _padTwo = MochiKit.DateTime._padTwo;
107 if (realISO) {
108 // adjust date for UTC timezone
109 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
110 }
111 var lst = [
112 (realISO ? _padTwo(date.getHours()) : date.getHours()),
113 _padTwo(date.getMinutes()),
114 _padTwo(date.getSeconds())
115 ];
116 return lst.join(":") + (realISO ? "Z" : "");
117};
118
119/** @id MochiKit.DateTime.toISOTimeStamp */
120MochiKit.DateTime.toISOTimestamp = function (date, realISO/* = false*/) {
121 if (typeof(date) == "undefined" || date === null) {
122 return null;
123 }
124 var time = MochiKit.DateTime.toISOTime(date, realISO);
125 var sep = realISO ? "T" : " ";
126 if (realISO) {
127 // adjust date for UTC timezone
128 date = new Date(date.getTime() + (date.getTimezoneOffset() * 60000));
129 }
130 return MochiKit.DateTime.toISODate(date) + sep + time;
131};
132
133/** @id MochiKit.DateTime.toISODate */
134MochiKit.DateTime.toISODate = function (date) {
135 if (typeof(date) == "undefined" || date === null) {
136 return null;
137 }
138 var _padTwo = MochiKit.DateTime._padTwo;
139 var _padFour = MochiKit.DateTime._padFour;
140 return [
141 _padFour(date.getFullYear()),
142 _padTwo(date.getMonth() + 1),
143 _padTwo(date.getDate())
144 ].join("-");
145};
146
147/** @id MochiKit.DateTime.americanDate */
148MochiKit.DateTime.americanDate = function (d) {
149 d = d + "";
150 if (typeof(d) != "string" || d.length === 0) {
151 return null;
152 }
153 var a = d.split('/');
154 return new Date(a[2], a[0] - 1, a[1]);
155};
156
157MochiKit.DateTime._padTwo = function (n) {
158 return (n > 9) ? n : "0" + n;
159};
160
161MochiKit.DateTime._padFour = function(n) {
162 switch(n.toString().length) {
163 case 1: return "000" + n; break;
164 case 2: return "00" + n; break;
165 case 3: return "0" + n; break;
166 case 4:
167 default:
168 return n;
169 }
170};
171
172/** @id MochiKit.DateTime.toPaddedAmericanDate */
173MochiKit.DateTime.toPaddedAmericanDate = function (d) {
174 if (typeof(d) == "undefined" || d === null) {
175 return null;
176 }
177 var _padTwo = MochiKit.DateTime._padTwo;
178 return [
179 _padTwo(d.getMonth() + 1),
180 _padTwo(d.getDate()),
181 d.getFullYear()
182 ].join('/');
183};
184
185/** @id MochiKit.DateTime.toAmericanDate */
186MochiKit.DateTime.toAmericanDate = function (d) {
187 if (typeof(d) == "undefined" || d === null) {
188 return null;
189 }
190 return [d.getMonth() + 1, d.getDate(), d.getFullYear()].join('/');
191};
192
193MochiKit.DateTime.__new__ = function () {
194 MochiKit.Base.nameFunctions(this);
195};
196
197MochiKit.DateTime.__new__();
198
199MochiKit.Base._exportSymbols(this, MochiKit.DateTime);
diff --git a/frontend/delta/js/MochiKit/DragAndDrop.js b/frontend/delta/js/MochiKit/DragAndDrop.js
new file mode 100644
index 0000000..850e6bb
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/DragAndDrop.js
@@ -0,0 +1,789 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25MochiKit.DragAndDrop 1.5
26
27See <http://mochikit.com/> for documentation, downloads, license, etc.
28
29Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
30 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
31
32***/
33
34MochiKit.Base.module(MochiKit, 'DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']);
35
36MochiKit.DragAndDrop.Droppables = {
37 /***
38
39 Manage all droppables. Shouldn't be used, use the Droppable object instead.
40
41 ***/
42 drops: [],
43
44 remove: function (element) {
45 this.drops = MochiKit.Base.filter(function (d) {
46 return d.element != MochiKit.DOM.getElement(element);
47 }, this.drops);
48 },
49
50 register: function (drop) {
51 this.drops.push(drop);
52 },
53
54 unregister: function (drop) {
55 this.drops = MochiKit.Base.filter(function (d) {
56 return d != drop;
57 }, this.drops);
58 },
59
60 prepare: function (element) {
61 MochiKit.Base.map(function (drop) {
62 if (drop.isAccepted(element)) {
63 if (drop.options.activeclass) {
64 MochiKit.DOM.addElementClass(drop.element,
65 drop.options.activeclass);
66 }
67 drop.options.onactive(drop.element, element);
68 }
69 }, this.drops);
70 },
71
72 findDeepestChild: function (drops) {
73 var deepest = drops[0];
74
75 for (var i = 1; i < drops.length; ++i) {
76 if (MochiKit.DOM.isChildNode(drops[i].element, deepest.element)) {
77 deepest = drops[i];
78 }
79 }
80 return deepest;
81 },
82
83 show: function (point, element) {
84 if (!this.drops.length) {
85 return;
86 }
87 var affected = [];
88
89 if (this.last_active) {
90 this.last_active.deactivate();
91 }
92 MochiKit.Iter.forEach(this.drops, function (drop) {
93 if (drop.isAffected(point, element)) {
94 affected.push(drop);
95 }
96 });
97 if (affected.length > 0) {
98 var drop = this.findDeepestChild(affected);
99 MochiKit.Position.within(drop.element, point.page.x, point.page.y);
100 drop.options.onhover(element, drop.element,
101 MochiKit.Position.overlap(drop.options.overlap, drop.element));
102 drop.activate();
103 }
104 },
105
106 fire: function (event, element) {
107 if (!this.last_active) {
108 return;
109 }
110 MochiKit.Position.prepare();
111
112 if (this.last_active.isAffected(event.mouse(), element)) {
113 this.last_active.options.ondrop(element,
114 this.last_active.element, event);
115 }
116 },
117
118 reset: function (element) {
119 MochiKit.Base.map(function (drop) {
120 if (drop.options.activeclass) {
121 MochiKit.DOM.removeElementClass(drop.element,
122 drop.options.activeclass);
123 }
124 drop.options.ondesactive(drop.element, element);
125 }, this.drops);
126 if (this.last_active) {
127 this.last_active.deactivate();
128 }
129 }
130};
131
132/** @id MochiKit.DragAndDrop.Droppable */
133MochiKit.DragAndDrop.Droppable = function (element, options) {
134 var cls = arguments.callee;
135 if (!(this instanceof cls)) {
136 return new cls(element, options);
137 }
138 this.__init__(element, options);
139};
140
141MochiKit.DragAndDrop.Droppable.prototype = {
142 /***
143
144 A droppable object. Simple use is to create giving an element:
145
146 new MochiKit.DragAndDrop.Droppable('myelement');
147
148 Generally you'll want to define the 'ondrop' function and maybe the
149 'accept' option to filter draggables.
150
151 ***/
152 __class__: MochiKit.DragAndDrop.Droppable,
153
154 __init__: function (element, /* optional */options) {
155 var d = MochiKit.DOM;
156 var b = MochiKit.Base;
157 this.element = d.getElement(element);
158 this.options = b.update({
159
160 /** @id MochiKit.DragAndDrop.greedy */
161 greedy: true,
162
163 /** @id MochiKit.DragAndDrop.hoverclass */
164 hoverclass: null,
165
166 /** @id MochiKit.DragAndDrop.activeclass */
167 activeclass: null,
168
169 /** @id MochiKit.DragAndDrop.hoverfunc */
170 hoverfunc: b.noop,
171
172 /** @id MochiKit.DragAndDrop.accept */
173 accept: null,
174
175 /** @id MochiKit.DragAndDrop.onactive */
176 onactive: b.noop,
177
178 /** @id MochiKit.DragAndDrop.ondesactive */
179 ondesactive: b.noop,
180
181 /** @id MochiKit.DragAndDrop.onhover */
182 onhover: b.noop,
183
184 /** @id MochiKit.DragAndDrop.ondrop */
185 ondrop: b.noop,
186
187 /** @id MochiKit.DragAndDrop.containment */
188 containment: [],
189 tree: false
190 }, options);
191
192 // cache containers
193 this.options._containers = [];
194 b.map(MochiKit.Base.bind(function (c) {
195 this.options._containers.push(d.getElement(c));
196 }, this), this.options.containment);
197
198 MochiKit.Style.makePositioned(this.element); // fix IE
199
200 MochiKit.DragAndDrop.Droppables.register(this);
201 },
202
203 /** @id MochiKit.DragAndDrop.isContained */
204 isContained: function (element) {
205 if (this.options._containers.length) {
206 var containmentNode;
207 if (this.options.tree) {
208 containmentNode = element.treeNode;
209 } else {
210 containmentNode = element.parentNode;
211 }
212 return MochiKit.Iter.some(this.options._containers, function (c) {
213 return containmentNode == c;
214 });
215 } else {
216 return true;
217 }
218 },
219
220 /** @id MochiKit.DragAndDrop.isAccepted */
221 isAccepted: function (element) {
222 return ((!this.options.accept) || MochiKit.Iter.some(
223 this.options.accept, function (c) {
224 return MochiKit.DOM.hasElementClass(element, c);
225 }));
226 },
227
228 /** @id MochiKit.DragAndDrop.isAffected */
229 isAffected: function (point, element) {
230 return ((this.element != element) &&
231 this.isContained(element) &&
232 this.isAccepted(element) &&
233 MochiKit.Position.within(this.element, point.page.x,
234 point.page.y));
235 },
236
237 /** @id MochiKit.DragAndDrop.deactivate */
238 deactivate: function () {
239 /***
240
241 A droppable is deactivate when a draggable has been over it and left.
242
243 ***/
244 if (this.options.hoverclass) {
245 MochiKit.DOM.removeElementClass(this.element,
246 this.options.hoverclass);
247 }
248 this.options.hoverfunc(this.element, false);
249 MochiKit.DragAndDrop.Droppables.last_active = null;
250 },
251
252 /** @id MochiKit.DragAndDrop.activate */
253 activate: function () {
254 /***
255
256 A droppable is active when a draggable is over it.
257
258 ***/
259 if (this.options.hoverclass) {
260 MochiKit.DOM.addElementClass(this.element, this.options.hoverclass);
261 }
262 this.options.hoverfunc(this.element, true);
263 MochiKit.DragAndDrop.Droppables.last_active = this;
264 },
265
266 /** @id MochiKit.DragAndDrop.destroy */
267 destroy: function () {
268 /***
269
270 Delete this droppable.
271
272 ***/
273 MochiKit.DragAndDrop.Droppables.unregister(this);
274 },
275
276 /** @id MochiKit.DragAndDrop.repr */
277 repr: function () {
278 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]";
279 }
280};
281
282MochiKit.DragAndDrop.Draggables = {
283 /***
284
285 Manage draggables elements. Not intended to direct use.
286
287 ***/
288 drags: [],
289
290 register: function (draggable) {
291 if (this.drags.length === 0) {
292 var conn = MochiKit.Signal.connect;
293 this.eventMouseUp = conn(document, 'onmouseup', this, this.endDrag);
294 this.eventMouseMove = conn(document, 'onmousemove', this,
295 this.updateDrag);
296 this.eventKeypress = conn(document, 'onkeypress', this,
297 this.keyPress);
298 }
299 this.drags.push(draggable);
300 },
301
302 unregister: function (draggable) {
303 this.drags = MochiKit.Base.filter(function (d) {
304 return d != draggable;
305 }, this.drags);
306 if (this.drags.length === 0) {
307 var disc = MochiKit.Signal.disconnect;
308 disc(this.eventMouseUp);
309 disc(this.eventMouseMove);
310 disc(this.eventKeypress);
311 }
312 },
313
314 activate: function (draggable) {
315 // allows keypress events if window is not currently focused
316 // fails for Safari
317 window.focus();
318 this.activeDraggable = draggable;
319 },
320
321 deactivate: function () {
322 this.activeDraggable = null;
323 },
324
325 updateDrag: function (event) {
326 if (!this.activeDraggable) {
327 return;
328 }
329 var pointer = event.mouse();
330 // Mozilla-based browsers fire successive mousemove events with
331 // the same coordinates, prevent needless redrawing (moz bug?)
332 if (this._lastPointer &&
333 this._lastPointer.page.x == pointer.page.x &&
334 this._lastPointer.page.y == pointer.page.y) {
335 return;
336 }
337 this._lastPointer = pointer;
338 this.activeDraggable.updateDrag(event, pointer);
339 },
340
341 endDrag: function (event) {
342 if (!this.activeDraggable) {
343 return;
344 }
345 this._lastPointer = null;
346 this.activeDraggable.endDrag(event);
347 this.activeDraggable = null;
348 },
349
350 keyPress: function (event) {
351 if (this.activeDraggable) {
352 this.activeDraggable.keyPress(event);
353 }
354 },
355
356 notify: function (eventName, draggable, event) {
357 MochiKit.Signal.signal(this, eventName, draggable, event);
358 }
359};
360
361/** @id MochiKit.DragAndDrop.Draggable */
362MochiKit.DragAndDrop.Draggable = function (element, options) {
363 var cls = arguments.callee;
364 if (!(this instanceof cls)) {
365 return new cls(element, options);
366 }
367 this.__init__(element, options);
368};
369
370MochiKit.DragAndDrop.Draggable.prototype = {
371 /***
372
373 A draggable object. Simple instantiate :
374
375 new MochiKit.DragAndDrop.Draggable('myelement');
376
377 ***/
378 __class__ : MochiKit.DragAndDrop.Draggable,
379
380 __init__: function (element, /* optional */options) {
381 var v = MochiKit.Visual;
382 var b = MochiKit.Base;
383 options = b.update({
384
385 /** @id MochiKit.DragAndDrop.handle */
386 handle: false,
387
388 /** @id MochiKit.DragAndDrop.starteffect */
389 starteffect: function (innerelement) {
390 this._savedOpacity = MochiKit.Style.getStyle(innerelement, 'opacity') || 1.0;
391 new v.Opacity(innerelement, {duration:0.2, from:this._savedOpacity, to:0.7});
392 },
393 /** @id MochiKit.DragAndDrop.reverteffect */
394 reverteffect: function (innerelement, top_offset, left_offset) {
395 var dur = Math.sqrt(Math.abs(top_offset^2) +
396 Math.abs(left_offset^2))*0.02;
397 return new v.Move(innerelement,
398 {x: -left_offset, y: -top_offset, duration: dur});
399 },
400
401 /** @id MochiKit.DragAndDrop.endeffect */
402 endeffect: function (innerelement) {
403 new v.Opacity(innerelement, {duration:0.2, from:0.7, to:this._savedOpacity});
404 },
405
406 /** @id MochiKit.DragAndDrop.onchange */
407 onchange: b.noop,
408
409 /** @id MochiKit.DragAndDrop.zindex */
410 zindex: 1000,
411
412 /** @id MochiKit.DragAndDrop.revert */
413 revert: false,
414
415 /** @id MochiKit.DragAndDrop.scroll */
416 scroll: false,
417
418 /** @id MochiKit.DragAndDrop.scrollSensitivity */
419 scrollSensitivity: 20,
420
421 /** @id MochiKit.DragAndDrop.scrollSpeed */
422 scrollSpeed: 15,
423 // false, or xy or [x, y] or function (x, y){return [x, y];}
424
425 /** @id MochiKit.DragAndDrop.snap */
426 snap: false
427 }, options);
428
429 var d = MochiKit.DOM;
430 this.element = d.getElement(element);
431
432 if (options.handle && (typeof(options.handle) == 'string')) {
433 this.handle = d.getFirstElementByTagAndClassName(null,
434 options.handle, this.element);
435 }
436 if (!this.handle) {
437 this.handle = d.getElement(options.handle);
438 }
439 if (!this.handle) {
440 this.handle = this.element;
441 }
442
443 if (options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
444 options.scroll = d.getElement(options.scroll);
445 this._isScrollChild = MochiKit.DOM.isChildNode(this.element, options.scroll);
446 }
447
448 MochiKit.Style.makePositioned(this.element); // fix IE
449
450 this.delta = this.currentDelta();
451 this.options = options;
452 this.dragging = false;
453
454 this.eventMouseDown = MochiKit.Signal.connect(this.handle,
455 'onmousedown', this, this.initDrag);
456 MochiKit.DragAndDrop.Draggables.register(this);
457 },
458
459 /** @id MochiKit.DragAndDrop.destroy */
460 destroy: function () {
461 MochiKit.Signal.disconnect(this.eventMouseDown);
462 MochiKit.DragAndDrop.Draggables.unregister(this);
463 },
464
465 /** @id MochiKit.DragAndDrop.currentDelta */
466 currentDelta: function () {
467 var s = MochiKit.Style.getStyle;
468 return [
469 parseInt(s(this.element, 'left') || '0', 10),
470 parseInt(s(this.element, 'top') || '0', 10)];
471 },
472
473 /** @id MochiKit.DragAndDrop.initDrag */
474 initDrag: function (event) {
475 if (!event.mouse().button.left) {
476 return;
477 }
478 // abort on form elements, fixes a Firefox issue
479 var src = event.target();
480 var tagName = (src.tagName || '').toUpperCase();
481 if (tagName === 'INPUT' || tagName === 'SELECT' ||
482 tagName === 'OPTION' || tagName === 'BUTTON' ||
483 tagName === 'TEXTAREA') {
484 return;
485 }
486
487 if (this._revert) {
488 this._revert.cancel();
489 this._revert = null;
490 }
491
492 var pointer = event.mouse();
493 var pos = MochiKit.Position.cumulativeOffset(this.element);
494 this.offset = [pointer.page.x - pos.x, pointer.page.y - pos.y];
495
496 MochiKit.DragAndDrop.Draggables.activate(this);
497 event.stop();
498 },
499
500 /** @id MochiKit.DragAndDrop.startDrag */
501 startDrag: function (event) {
502 this.dragging = true;
503 if (this.options.selectclass) {
504 MochiKit.DOM.addElementClass(this.element,
505 this.options.selectclass);
506 }
507 if (this.options.zindex) {
508 this.originalZ = MochiKit.Style.getStyle(this.element, 'z-index');
509 this.element.style.zIndex = this.options.zindex;
510 }
511
512 if (this.options.ghosting) {
513 this._clone = this.element.cloneNode(true);
514 this.ghostPosition = MochiKit.Position.absolutize(this.element);
515 this.element.parentNode.insertBefore(this._clone, this.element);
516 }
517
518 if (this.options.scroll) {
519 if (this.options.scroll == window) {
520 var where = this._getWindowScroll(this.options.scroll);
521 this.originalScrollLeft = where.left;
522 this.originalScrollTop = where.top;
523 } else {
524 this.originalScrollLeft = this.options.scroll.scrollLeft;
525 this.originalScrollTop = this.options.scroll.scrollTop;
526 }
527 }
528
529 MochiKit.DragAndDrop.Droppables.prepare(this.element);
530 MochiKit.DragAndDrop.Draggables.notify('start', this, event);
531 if (this.options.starteffect) {
532 this.options.starteffect(this.element);
533 }
534 },
535
536 /** @id MochiKit.DragAndDrop.updateDrag */
537 updateDrag: function (event, pointer) {
538 if (!this.dragging) {
539 this.startDrag(event);
540 }
541 MochiKit.Position.prepare();
542 MochiKit.DragAndDrop.Droppables.show(pointer, this.element);
543 MochiKit.DragAndDrop.Draggables.notify('drag', this, event);
544 this.draw(pointer);
545 this.options.onchange(this);
546
547 if (this.options.scroll) {
548 this.stopScrolling();
549 var p, q;
550 if (this.options.scroll == window) {
551 var s = this._getWindowScroll(this.options.scroll);
552 p = new MochiKit.Style.Coordinates(s.left, s.top);
553 q = new MochiKit.Style.Coordinates(s.left + s.width,
554 s.top + s.height);
555 } else {
556 p = MochiKit.Position.page(this.options.scroll);
557 p.x += this.options.scroll.scrollLeft;
558 p.y += this.options.scroll.scrollTop;
559 p.x += (window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0);
560 p.y += (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0);
561 q = new MochiKit.Style.Coordinates(p.x + this.options.scroll.offsetWidth,
562 p.y + this.options.scroll.offsetHeight);
563 }
564 var speed = [0, 0];
565 if (pointer.page.x > (q.x - this.options.scrollSensitivity)) {
566 speed[0] = pointer.page.x - (q.x - this.options.scrollSensitivity);
567 } else if (pointer.page.x < (p.x + this.options.scrollSensitivity)) {
568 speed[0] = pointer.page.x - (p.x + this.options.scrollSensitivity);
569 }
570 if (pointer.page.y > (q.y - this.options.scrollSensitivity)) {
571 speed[1] = pointer.page.y - (q.y - this.options.scrollSensitivity);
572 } else if (pointer.page.y < (p.y + this.options.scrollSensitivity)) {
573 speed[1] = pointer.page.y - (p.y + this.options.scrollSensitivity);
574 }
575 this.startScrolling(speed);
576 }
577
578 // fix AppleWebKit rendering
579 if (/AppleWebKit/.test(navigator.appVersion)) {
580 window.scrollBy(0, 0);
581 }
582 event.stop();
583 },
584
585 /** @id MochiKit.DragAndDrop.finishDrag */
586 finishDrag: function (event, success) {
587 var dr = MochiKit.DragAndDrop;
588 this.dragging = false;
589 if (this.options.selectclass) {
590 MochiKit.DOM.removeElementClass(this.element,
591 this.options.selectclass);
592 }
593
594 if (this.options.ghosting) {
595 // XXX: from a user point of view, it would be better to remove
596 // the node only *after* the MochiKit.Visual.Move end when used
597 // with revert.
598 MochiKit.Position.relativize(this.element, this.ghostPosition);
599 MochiKit.DOM.removeElement(this._clone);
600 this._clone = null;
601 }
602
603 if (success) {
604 dr.Droppables.fire(event, this.element);
605 }
606 dr.Draggables.notify('end', this, event);
607
608 var revert = this.options.revert;
609 if (revert && typeof(revert) == 'function') {
610 revert = revert(this.element);
611 }
612
613 var d = this.currentDelta();
614 if (revert && this.options.reverteffect) {
615 this._revert = this.options.reverteffect(this.element,
616 d[1] - this.delta[1], d[0] - this.delta[0]);
617 } else {
618 this.delta = d;
619 }
620
621 if (this.options.zindex) {
622 this.element.style.zIndex = this.originalZ;
623 }
624
625 if (this.options.endeffect) {
626 this.options.endeffect(this.element);
627 }
628
629 dr.Draggables.deactivate();
630 dr.Droppables.reset(this.element);
631 },
632
633 /** @id MochiKit.DragAndDrop.keyPress */
634 keyPress: function (event) {
635 if (event.key().string != "KEY_ESCAPE") {
636 return;
637 }
638 this.finishDrag(event, false);
639 event.stop();
640 },
641
642 /** @id MochiKit.DragAndDrop.endDrag */
643 endDrag: function (event) {
644 if (!this.dragging) {
645 return;
646 }
647 this.stopScrolling();
648 this.finishDrag(event, true);
649 event.stop();
650 },
651
652 /** @id MochiKit.DragAndDrop.draw */
653 draw: function (point) {
654 var pos = MochiKit.Position.cumulativeOffset(this.element);
655 var d = this.currentDelta();
656 pos.x -= d[0];
657 pos.y -= d[1];
658
659 if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
660 pos.x -= this.options.scroll.scrollLeft - this.originalScrollLeft;
661 pos.y -= this.options.scroll.scrollTop - this.originalScrollTop;
662 }
663
664 var p = [point.page.x - pos.x - this.offset[0],
665 point.page.y - pos.y - this.offset[1]];
666
667 if (this.options.snap) {
668 if (typeof(this.options.snap) == 'function') {
669 p = this.options.snap(p[0], p[1]);
670 } else {
671 if (this.options.snap instanceof Array) {
672 var i = -1;
673 p = MochiKit.Base.map(MochiKit.Base.bind(function (v) {
674 i += 1;
675 return Math.round(v/this.options.snap[i]) *
676 this.options.snap[i];
677 }, this), p);
678 } else {
679 p = MochiKit.Base.map(MochiKit.Base.bind(function (v) {
680 return Math.round(v/this.options.snap) *
681 this.options.snap;
682 }, this), p);
683 }
684 }
685 }
686 var style = this.element.style;
687 if ((!this.options.constraint) ||
688 (this.options.constraint == 'horizontal')) {
689 style.left = p[0] + 'px';
690 }
691 if ((!this.options.constraint) ||
692 (this.options.constraint == 'vertical')) {
693 style.top = p[1] + 'px';
694 }
695 if (style.visibility == 'hidden') {
696 style.visibility = ''; // fix gecko rendering
697 }
698 },
699
700 /** @id MochiKit.DragAndDrop.stopScrolling */
701 stopScrolling: function () {
702 if (this.scrollInterval) {
703 clearInterval(this.scrollInterval);
704 this.scrollInterval = null;
705 MochiKit.DragAndDrop.Draggables._lastScrollPointer = null;
706 }
707 },
708
709 /** @id MochiKit.DragAndDrop.startScrolling */
710 startScrolling: function (speed) {
711 if (!speed[0] && !speed[1]) {
712 return;
713 }
714 this.scrollSpeed = [speed[0] * this.options.scrollSpeed,
715 speed[1] * this.options.scrollSpeed];
716 this.lastScrolled = new Date();
717 this.scrollInterval = setInterval(MochiKit.Base.bind(this.scroll, this), 10);
718 },
719
720 /** @id MochiKit.DragAndDrop.scroll */
721 scroll: function () {
722 var current = new Date();
723 var delta = current - this.lastScrolled;
724 this.lastScrolled = current;
725
726 if (this.options.scroll == window) {
727 var s = this._getWindowScroll(this.options.scroll);
728 if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
729 var dm = delta / 1000;
730 this.options.scroll.scrollTo(s.left + dm * this.scrollSpeed[0],
731 s.top + dm * this.scrollSpeed[1]);
732 }
733 } else {
734 this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
735 this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
736 }
737
738 var d = MochiKit.DragAndDrop;
739
740 MochiKit.Position.prepare();
741 d.Droppables.show(d.Draggables._lastPointer, this.element);
742 d.Draggables.notify('drag', this);
743 if (this._isScrollChild) {
744 d.Draggables._lastScrollPointer = d.Draggables._lastScrollPointer || d.Draggables._lastPointer;
745 d.Draggables._lastScrollPointer.x += this.scrollSpeed[0] * delta / 1000;
746 d.Draggables._lastScrollPointer.y += this.scrollSpeed[1] * delta / 1000;
747 if (d.Draggables._lastScrollPointer.x < 0) {
748 d.Draggables._lastScrollPointer.x = 0;
749 }
750 if (d.Draggables._lastScrollPointer.y < 0) {
751 d.Draggables._lastScrollPointer.y = 0;
752 }
753 this.draw(d.Draggables._lastScrollPointer);
754 }
755
756 this.options.onchange(this);
757 },
758
759 _getWindowScroll: function (win) {
760 var vp, w, h;
761 MochiKit.DOM.withWindow(win, function () {
762 vp = MochiKit.Style.getViewportPosition(win.document);
763 });
764 if (win.innerWidth) {
765 w = win.innerWidth;
766 h = win.innerHeight;
767 } else if (win.document.documentElement && win.document.documentElement.clientWidth) {
768 w = win.document.documentElement.clientWidth;
769 h = win.document.documentElement.clientHeight;
770 } else {
771 w = win.document.body.offsetWidth;
772 h = win.document.body.offsetHeight;
773 }
774 return {top: vp.y, left: vp.x, width: w, height: h};
775 },
776
777 /** @id MochiKit.DragAndDrop.repr */
778 repr: function () {
779 return '[' + this.__class__.NAME + ", options:" + MochiKit.Base.repr(this.options) + "]";
780 }
781};
782
783MochiKit.DragAndDrop.__new__ = function () {
784 MochiKit.Base.nameFunctions(this);
785};
786
787MochiKit.DragAndDrop.__new__();
788
789MochiKit.Base._exportSymbols(this, MochiKit.DragAndDrop);
diff --git a/frontend/delta/js/MochiKit/Format.js b/frontend/delta/js/MochiKit/Format.js
new file mode 100644
index 0000000..0e7af50
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Format.js
@@ -0,0 +1,332 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Format 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Format', '1.5', ['Base']);
35
36MochiKit.Format._numberFormatter = function (placeholder, header, footer, locale, isPercent, precision, leadingZeros, separatorAt, trailingZeros) {
37 return function (num) {
38 num = parseFloat(num);
39 if (typeof(num) == "undefined" || num === null || isNaN(num)) {
40 return placeholder;
41 }
42 var curheader = header;
43 var curfooter = footer;
44 if (num < 0) {
45 num = -num;
46 } else {
47 curheader = curheader.replace(/-/, "");
48 }
49 var me = arguments.callee;
50 var fmt = MochiKit.Format.formatLocale(locale);
51 if (isPercent) {
52 num = num * 100.0;
53 curfooter = fmt.percent + curfooter;
54 }
55 num = MochiKit.Format.roundToFixed(num, precision);
56 var parts = num.split(/\./);
57 var whole = parts[0];
58 var frac = (parts.length == 1) ? "" : parts[1];
59 var res = "";
60 while (whole.length < leadingZeros) {
61 whole = "0" + whole;
62 }
63 if (separatorAt) {
64 while (whole.length > separatorAt) {
65 var i = whole.length - separatorAt;
66 //res = res + fmt.separator + whole.substring(i, whole.length);
67 res = fmt.separator + whole.substring(i, whole.length) + res;
68 whole = whole.substring(0, i);
69 }
70 }
71 res = whole + res;
72 if (precision > 0) {
73 while (frac.length < trailingZeros) {
74 frac = frac + "0";
75 }
76 res = res + fmt.decimal + frac;
77 }
78 return curheader + res + curfooter;
79 };
80};
81
82/** @id MochiKit.Format.numberFormatter */
83MochiKit.Format.numberFormatter = function (pattern, placeholder/* = "" */, locale/* = "default" */) {
84 // http://java.sun.com/docs/books/tutorial/i18n/format/numberpattern.html
85 // | 0 | leading or trailing zeros
86 // | # | just the number
87 // | , | separator
88 // | . | decimal separator
89 // | % | Multiply by 100 and format as percent
90 if (typeof(placeholder) == "undefined") {
91 placeholder = "";
92 }
93 var match = pattern.match(/((?:[0#]+,)?[0#]+)(?:\.([0#]+))?(%)?/);
94 if (!match) {
95 throw TypeError("Invalid pattern");
96 }
97 var header = pattern.substr(0, match.index);
98 var footer = pattern.substr(match.index + match[0].length);
99 if (header.search(/-/) == -1) {
100 header = header + "-";
101 }
102 var whole = match[1];
103 var frac = (typeof(match[2]) == "string" && match[2] != "") ? match[2] : "";
104 var isPercent = (typeof(match[3]) == "string" && match[3] != "");
105 var tmp = whole.split(/,/);
106 var separatorAt;
107 if (typeof(locale) == "undefined") {
108 locale = "default";
109 }
110 if (tmp.length == 1) {
111 separatorAt = null;
112 } else {
113 separatorAt = tmp[1].length;
114 }
115 var leadingZeros = whole.length - whole.replace(/0/g, "").length;
116 var trailingZeros = frac.length - frac.replace(/0/g, "").length;
117 var precision = frac.length;
118 var rval = MochiKit.Format._numberFormatter(
119 placeholder, header, footer, locale, isPercent, precision,
120 leadingZeros, separatorAt, trailingZeros
121 );
122 var m = MochiKit.Base;
123 if (m) {
124 var fn = arguments.callee;
125 var args = m.concat(arguments);
126 rval.repr = function () {
127 return [
128 self.NAME,
129 "(",
130 m.map(m.repr, args).join(", "),
131 ")"
132 ].join("");
133 };
134 }
135 return rval;
136};
137
138/** @id MochiKit.Format.formatLocale */
139MochiKit.Format.formatLocale = function (locale) {
140 if (typeof(locale) == "undefined" || locale === null) {
141 locale = "default";
142 }
143 if (typeof(locale) == "string") {
144 var rval = MochiKit.Format.LOCALE[locale];
145 if (typeof(rval) == "string") {
146 rval = arguments.callee(rval);
147 MochiKit.Format.LOCALE[locale] = rval;
148 }
149 return rval;
150 } else {
151 return locale;
152 }
153};
154
155/** @id MochiKit.Format.twoDigitAverage */
156MochiKit.Format.twoDigitAverage = function (numerator, denominator) {
157 if (denominator) {
158 var res = numerator / denominator;
159 if (!isNaN(res)) {
160 return MochiKit.Format.twoDigitFloat(res);
161 }
162 }
163 return "0";
164};
165
166/** @id MochiKit.Format.twoDigitFloat */
167MochiKit.Format.twoDigitFloat = function (aNumber) {
168 var res = MochiKit.Format.roundToFixed(aNumber, 2);
169 if (res.indexOf(".00") > 0) {
170 return res.substring(0, res.length - 3);
171 } else if (res.charAt(res.length - 1) == "0") {
172 return res.substring(0, res.length - 1);
173 } else {
174 return res;
175 }
176};
177
178/** @id MochiKit.Format.lstrip */
179MochiKit.Format.lstrip = function (str, /* optional */chars) {
180 str = str + "";
181 if (typeof(str) != "string") {
182 return null;
183 }
184 if (!chars) {
185 return str.replace(/^\s+/, "");
186 } else {
187 return str.replace(new RegExp("^[" + chars + "]+"), "");
188 }
189};
190
191/** @id MochiKit.Format.rstrip */
192MochiKit.Format.rstrip = function (str, /* optional */chars) {
193 str = str + "";
194 if (typeof(str) != "string") {
195 return null;
196 }
197 if (!chars) {
198 return str.replace(/\s+$/, "");
199 } else {
200 return str.replace(new RegExp("[" + chars + "]+$"), "");
201 }
202};
203
204/** @id MochiKit.Format.strip */
205MochiKit.Format.strip = function (str, /* optional */chars) {
206 var self = MochiKit.Format;
207 return self.rstrip(self.lstrip(str, chars), chars);
208};
209
210/** @id MochiKit.Format.truncToFixed */
211MochiKit.Format.truncToFixed = function (aNumber, precision) {
212 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
213 var fracPos = fixed.indexOf(".");
214 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
215 fixed = fixed.substring(0, fracPos + precision + 1);
216 fixed = MochiKit.Format._shiftNumber(fixed, 0);
217 }
218 return fixed;
219};
220
221/** @id MochiKit.Format.roundToFixed */
222MochiKit.Format.roundToFixed = function (aNumber, precision) {
223 var fixed = MochiKit.Format._numberToFixed(aNumber, precision);
224 var fracPos = fixed.indexOf(".");
225 if (fracPos > 0 && fracPos + precision + 1 < fixed.length) {
226 var str = MochiKit.Format._shiftNumber(fixed, precision);
227 str = MochiKit.Format._numberToFixed(Math.round(parseFloat(str)), 0);
228 fixed = MochiKit.Format._shiftNumber(str, -precision);
229 }
230 return fixed;
231};
232
233/**
234 * Converts a number to a fixed format string. This function handles
235 * conversion of exponents by shifting the decimal point to the left
236 * or the right. It also guarantees a specified minimum number of
237 * fractional digits (but no maximum).
238 *
239 * @param {Number} aNumber the number to convert
240 * @param {Number} precision the minimum number of decimal digits
241 *
242 * @return {String} the fixed format number string
243 */
244MochiKit.Format._numberToFixed = function (aNumber, precision) {
245 var str = aNumber.toString();
246 var parts = str.split(/[eE]/);
247 var exp = (parts.length === 1) ? 0 : parseInt(parts[1], 10) || 0;
248 var fixed = MochiKit.Format._shiftNumber(parts[0], exp);
249 parts = fixed.split(/\./);
250 var whole = parts[0];
251 var frac = (parts.length === 1) ? "" : parts[1];
252 while (frac.length < precision) {
253 frac += "0";
254 }
255 if (frac.length > 0) {
256 return whole + "." + frac;
257 } else {
258 return whole;
259 }
260};
261
262/**
263 * Shifts the decimal dot location in a fixed format number string.
264 * This function handles negative values and will add and remove
265 * leading and trailing zeros as needed.
266 *
267 * @param {String} num the fixed format number string
268 * @param {Number} exp the base-10 exponent to apply
269 *
270 * @return {String} the new fixed format number string
271 */
272MochiKit.Format._shiftNumber = function (num, exp) {
273 var pos = num.indexOf(".");
274 if (pos < 0) {
275 pos = num.length;
276 } else {
277 num = num.substring(0, pos) + num.substring(pos + 1);
278 }
279 pos += exp;
280 while (pos <= 0 || (pos <= 1 && num.charAt(0) === "-")) {
281 if (num.charAt(0) === "-") {
282 num = "-0" + num.substring(1);
283 } else {
284 num = "0" + num;
285 }
286 pos++;
287 }
288 while (pos > num.length) {
289 num += "0";
290 }
291 if (pos < num.length) {
292 num = num.substring(0, pos) + "." + num.substring(pos);
293 }
294 while (/^0[^.]/.test(num)) {
295 num = num.substring(1);
296 }
297 while (/^-0[^.]/.test(num)) {
298 num = "-" + num.substring(2);
299 }
300 return num;
301};
302
303/** @id MochiKit.Format.percentFormat */
304MochiKit.Format.percentFormat = function (aNumber) {
305 return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%';
306};
307
308MochiKit.Format.LOCALE = {
309 en_US: {separator: ",", decimal: ".", percent: "%"},
310 de_DE: {separator: ".", decimal: ",", percent: "%"},
311 pt_BR: {separator: ".", decimal: ",", percent: "%"},
312 fr_FR: {separator: " ", decimal: ",", percent: "%"},
313 "default": "en_US",
314 __export__: false
315};
316
317MochiKit.Format.__new__ = function () {
318 MochiKit.Base.nameFunctions(this);
319 var base = this.NAME + ".";
320 var k, v, o;
321 for (k in this.LOCALE) {
322 o = this.LOCALE[k];
323 if (typeof(o) == "object") {
324 o.repr = function () { return this.NAME; };
325 o.NAME = base + "LOCALE." + k;
326 }
327 }
328};
329
330MochiKit.Format.__new__();
331
332MochiKit.Base._exportSymbols(this, MochiKit.Format);
diff --git a/frontend/delta/js/MochiKit/Iter.js b/frontend/delta/js/MochiKit/Iter.js
new file mode 100644
index 0000000..8f7ea3d
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Iter.js
@@ -0,0 +1,811 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Iter 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Iter', '1.5', ['Base']);
35
36MochiKit.Base.update(MochiKit.Iter, {
37 /** @id MochiKit.Iter.registerIteratorFactory */
38 registerIteratorFactory: function (name, check, iterfactory, /* optional */ override) {
39 MochiKit.Iter.iteratorRegistry.register(name, check, iterfactory, override);
40 },
41
42 /** @id MochiKit.Iter.isIterable */
43 isIterable: function(o) {
44 return o != null &&
45 (typeof(o.next) == "function" || typeof(o.iter) == "function");
46 },
47
48 /** @id MochiKit.Iter.iter */
49 iter: function (iterable, /* optional */ sentinel) {
50 var self = MochiKit.Iter;
51 if (arguments.length == 2) {
52 return self.takewhile(
53 function (a) { return a != sentinel; },
54 iterable
55 );
56 }
57 if (typeof(iterable.next) == 'function') {
58 return iterable;
59 } else if (typeof(iterable.iter) == 'function') {
60 return iterable.iter();
61 /*
62 } else if (typeof(iterable.__iterator__) == 'function') {
63 //
64 // XXX: We can't support JavaScript 1.7 __iterator__ directly
65 // because of Object.prototype.__iterator__
66 //
67 return iterable.__iterator__();
68 */
69 }
70
71 try {
72 return self.iteratorRegistry.match(iterable);
73 } catch (e) {
74 var m = MochiKit.Base;
75 if (e == m.NotFound) {
76 e = new TypeError(typeof(iterable) + ": " + m.repr(iterable) + " is not iterable");
77 }
78 throw e;
79 }
80 },
81
82 /** @id MochiKit.Iter.count */
83 count: function (n) {
84 if (!n) {
85 n = 0;
86 }
87 var m = MochiKit.Base;
88 return {
89 repr: function () { return "count(" + n + ")"; },
90 toString: m.forwardCall("repr"),
91 next: m.counter(n)
92 };
93 },
94
95 /** @id MochiKit.Iter.cycle */
96 cycle: function (p) {
97 var self = MochiKit.Iter;
98 var m = MochiKit.Base;
99 var lst = [];
100 var iterator = self.iter(p);
101 return {
102 repr: function () { return "cycle(...)"; },
103 toString: m.forwardCall("repr"),
104 next: function () {
105 try {
106 var rval = iterator.next();
107 lst.push(rval);
108 return rval;
109 } catch (e) {
110 if (e != self.StopIteration) {
111 throw e;
112 }
113 if (lst.length === 0) {
114 this.next = function () {
115 throw self.StopIteration;
116 };
117 } else {
118 var i = -1;
119 this.next = function () {
120 i = (i + 1) % lst.length;
121 return lst[i];
122 };
123 }
124 return this.next();
125 }
126 }
127 };
128 },
129
130 /** @id MochiKit.Iter.repeat */
131 repeat: function (elem, /* optional */n) {
132 var m = MochiKit.Base;
133 if (typeof(n) == 'undefined') {
134 return {
135 repr: function () {
136 return "repeat(" + m.repr(elem) + ")";
137 },
138 toString: m.forwardCall("repr"),
139 next: function () {
140 return elem;
141 }
142 };
143 }
144 return {
145 repr: function () {
146 return "repeat(" + m.repr(elem) + ", " + n + ")";
147 },
148 toString: m.forwardCall("repr"),
149 next: function () {
150 if (n <= 0) {
151 throw MochiKit.Iter.StopIteration;
152 }
153 n -= 1;
154 return elem;
155 }
156 };
157 },
158
159 /** @id MochiKit.Iter.next */
160 next: function (iterator) {
161 return iterator.next();
162 },
163
164 /** @id MochiKit.Iter.izip */
165 izip: function (p, q/*, ...*/) {
166 var m = MochiKit.Base;
167 var self = MochiKit.Iter;
168 var next = self.next;
169 var iterables = m.map(self.iter, arguments);
170 return {
171 repr: function () { return "izip(...)"; },
172 toString: m.forwardCall("repr"),
173 next: function () { return m.map(next, iterables); }
174 };
175 },
176
177 /** @id MochiKit.Iter.ifilter */
178 ifilter: function (pred, seq) {
179 var m = MochiKit.Base;
180 seq = MochiKit.Iter.iter(seq);
181 if (pred === null) {
182 pred = m.operator.truth;
183 }
184 return {
185 repr: function () { return "ifilter(...)"; },
186 toString: m.forwardCall("repr"),
187 next: function () {
188 while (true) {
189 var rval = seq.next();
190 if (pred(rval)) {
191 return rval;
192 }
193 }
194 // mozilla warnings aren't too bright
195 return undefined;
196 }
197 };
198 },
199
200 /** @id MochiKit.Iter.ifilterfalse */
201 ifilterfalse: function (pred, seq) {
202 var m = MochiKit.Base;
203 seq = MochiKit.Iter.iter(seq);
204 if (pred === null) {
205 pred = m.operator.truth;
206 }
207 return {
208 repr: function () { return "ifilterfalse(...)"; },
209 toString: m.forwardCall("repr"),
210 next: function () {
211 while (true) {
212 var rval = seq.next();
213 if (!pred(rval)) {
214 return rval;
215 }
216 }
217 // mozilla warnings aren't too bright
218 return undefined;
219 }
220 };
221 },
222
223 /** @id MochiKit.Iter.islice */
224 islice: function (seq/*, [start,] stop[, step] */) {
225 var self = MochiKit.Iter;
226 var m = MochiKit.Base;
227 seq = self.iter(seq);
228 var start = 0;
229 var stop = 0;
230 var step = 1;
231 var i = -1;
232 if (arguments.length == 2) {
233 stop = arguments[1];
234 } else if (arguments.length == 3) {
235 start = arguments[1];
236 stop = arguments[2];
237 } else {
238 start = arguments[1];
239 stop = arguments[2];
240 step = arguments[3];
241 }
242 return {
243 repr: function () {
244 return "islice(" + ["...", start, stop, step].join(", ") + ")";
245 },
246 toString: m.forwardCall("repr"),
247 next: function () {
248 if (start >= stop) {
249 throw self.StopIteration;
250 }
251
252 var rval;
253 while (i < start) {
254 rval = seq.next();
255 i++;
256 }
257 start += step;
258 return rval;
259 }
260 };
261 },
262
263 /** @id MochiKit.Iter.imap */
264 imap: function (fun, p, q/*, ...*/) {
265 var m = MochiKit.Base;
266 var self = MochiKit.Iter;
267 var iterables = m.map(self.iter, m.extend(null, arguments, 1));
268 var map = m.map;
269 var next = self.next;
270 return {
271 repr: function () { return "imap(...)"; },
272 toString: m.forwardCall("repr"),
273 next: function () {
274 return fun.apply(this, map(next, iterables));
275 }
276 };
277 },
278
279 /** @id MochiKit.Iter.applymap */
280 applymap: function (fun, seq, self) {
281 seq = MochiKit.Iter.iter(seq);
282 var m = MochiKit.Base;
283 return {
284 repr: function () { return "applymap(...)"; },
285 toString: m.forwardCall("repr"),
286 next: function () {
287 return fun.apply(self, seq.next());
288 }
289 };
290 },
291
292 /** @id MochiKit.Iter.chain */
293 chain: function (p, q/*, ...*/) {
294 // dumb fast path
295 var self = MochiKit.Iter;
296 var m = MochiKit.Base;
297 if (arguments.length == 1) {
298 return self.iter(arguments[0]);
299 }
300 var argiter = m.map(self.iter, arguments);
301 return {
302 repr: function () { return "chain(...)"; },
303 toString: m.forwardCall("repr"),
304 next: function () {
305 while (argiter.length > 1) {
306 try {
307 return argiter[0].next();
308 } catch (e) {
309 if (e != self.StopIteration) {
310 throw e;
311 }
312 argiter.shift();
313 }
314 }
315 if (argiter.length == 1) {
316 // optimize last element
317 var arg = argiter.shift();
318 this.next = m.bind("next", arg);
319 return this.next();
320 }
321 throw self.StopIteration;
322 }
323 };
324 },
325
326 /** @id MochiKit.Iter.takewhile */
327 takewhile: function (pred, seq) {
328 var self = MochiKit.Iter;
329 seq = self.iter(seq);
330 return {
331 repr: function () { return "takewhile(...)"; },
332 toString: MochiKit.Base.forwardCall("repr"),
333 next: function () {
334 var rval = seq.next();
335 if (!pred(rval)) {
336 this.next = function () {
337 throw self.StopIteration;
338 };
339 this.next();
340 }
341 return rval;
342 }
343 };
344 },
345
346 /** @id MochiKit.Iter.dropwhile */
347 dropwhile: function (pred, seq) {
348 seq = MochiKit.Iter.iter(seq);
349 var m = MochiKit.Base;
350 var bind = m.bind;
351 return {
352 "repr": function () { return "dropwhile(...)"; },
353 "toString": m.forwardCall("repr"),
354 "next": function () {
355 while (true) {
356 var rval = seq.next();
357 if (!pred(rval)) {
358 break;
359 }
360 }
361 this.next = bind("next", seq);
362 return rval;
363 }
364 };
365 },
366
367 _tee: function (ident, sync, iterable) {
368 sync.pos[ident] = -1;
369 var m = MochiKit.Base;
370 var listMin = m.listMin;
371 return {
372 repr: function () { return "tee(" + ident + ", ...)"; },
373 toString: m.forwardCall("repr"),
374 next: function () {
375 var rval;
376 var i = sync.pos[ident];
377
378 if (i == sync.max) {
379 rval = iterable.next();
380 sync.deque.push(rval);
381 sync.max += 1;
382 sync.pos[ident] += 1;
383 } else {
384 rval = sync.deque[i - sync.min];
385 sync.pos[ident] += 1;
386 if (i == sync.min && listMin(sync.pos) != sync.min) {
387 sync.min += 1;
388 sync.deque.shift();
389 }
390 }
391 return rval;
392 }
393 };
394 },
395
396 /** @id MochiKit.Iter.tee */
397 tee: function (iterable, n/* = 2 */) {
398 var rval = [];
399 var sync = {
400 "pos": [],
401 "deque": [],
402 "max": -1,
403 "min": -1
404 };
405 if (arguments.length == 1 || typeof(n) == "undefined" || n === null) {
406 n = 2;
407 }
408 var self = MochiKit.Iter;
409 iterable = self.iter(iterable);
410 var _tee = self._tee;
411 for (var i = 0; i < n; i++) {
412 rval.push(_tee(i, sync, iterable));
413 }
414 return rval;
415 },
416
417 /** @id MochiKit.Iter.list */
418 list: function (iterable) {
419 // Fast-path for Array and Array-like
420 var rval;
421 if (iterable instanceof Array) {
422 return iterable.slice();
423 }
424 // this is necessary to avoid a Safari crash
425 if (typeof(iterable) == "function" &&
426 !(iterable instanceof Function) &&
427 typeof(iterable.length) == 'number') {
428 rval = [];
429 for (var i = 0; i < iterable.length; i++) {
430 rval.push(iterable[i]);
431 }
432 return rval;
433 }
434
435 var self = MochiKit.Iter;
436 iterable = self.iter(iterable);
437 rval = [];
438 var a_val;
439 try {
440 while (true) {
441 a_val = iterable.next();
442 rval.push(a_val);
443 }
444 } catch (e) {
445 if (e != self.StopIteration) {
446 throw e;
447 }
448 return rval;
449 }
450 // mozilla warnings aren't too bright
451 return undefined;
452 },
453
454
455 /** @id MochiKit.Iter.reduce */
456 reduce: function (fn, iterable, /* optional */initial) {
457 var i = 0;
458 var x = initial;
459 var self = MochiKit.Iter;
460 iterable = self.iter(iterable);
461 if (arguments.length < 3) {
462 try {
463 x = iterable.next();
464 } catch (e) {
465 if (e == self.StopIteration) {
466 e = new TypeError("reduce() of empty sequence with no initial value");
467 }
468 throw e;
469 }
470 i++;
471 }
472 try {
473 while (true) {
474 x = fn(x, iterable.next());
475 }
476 } catch (e) {
477 if (e != self.StopIteration) {
478 throw e;
479 }
480 }
481 return x;
482 },
483
484 /** @id MochiKit.Iter.range */
485 range: function (/* [start,] stop[, step] */) {
486 var start = 0;
487 var stop = 0;
488 var step = 1;
489 if (arguments.length == 1) {
490 stop = arguments[0];
491 } else if (arguments.length == 2) {
492 start = arguments[0];
493 stop = arguments[1];
494 } else if (arguments.length == 3) {
495 start = arguments[0];
496 stop = arguments[1];
497 step = arguments[2];
498 } else {
499 throw new TypeError("range() takes 1, 2, or 3 arguments!");
500 }
501 if (step === 0) {
502 throw new TypeError("range() step must not be 0");
503 }
504 return {
505 next: function () {
506 if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
507 throw MochiKit.Iter.StopIteration;
508 }
509 var rval = start;
510 start += step;
511 return rval;
512 },
513 repr: function () {
514 return "range(" + [start, stop, step].join(", ") + ")";
515 },
516 toString: MochiKit.Base.forwardCall("repr")
517 };
518 },
519
520 /** @id MochiKit.Iter.sum */
521 sum: function (iterable, start/* = 0 */) {
522 if (typeof(start) == "undefined" || start === null) {
523 start = 0;
524 }
525 var x = start;
526 var self = MochiKit.Iter;
527 iterable = self.iter(iterable);
528 try {
529 while (true) {
530 x += iterable.next();
531 }
532 } catch (e) {
533 if (e != self.StopIteration) {
534 throw e;
535 }
536 }
537 return x;
538 },
539
540 /** @id MochiKit.Iter.exhaust */
541 exhaust: function (iterable) {
542 var self = MochiKit.Iter;
543 iterable = self.iter(iterable);
544 try {
545 while (true) {
546 iterable.next();
547 }
548 } catch (e) {
549 if (e != self.StopIteration) {
550 throw e;
551 }
552 }
553 },
554
555 /** @id MochiKit.Iter.forEach */
556 forEach: function (iterable, func, /* optional */obj) {
557 var m = MochiKit.Base;
558 var self = MochiKit.Iter;
559 if (arguments.length > 2) {
560 func = m.bind(func, obj);
561 }
562 // fast path for array
563 if (m.isArrayLike(iterable) && !self.isIterable(iterable)) {
564 try {
565 for (var i = 0; i < iterable.length; i++) {
566 func(iterable[i]);
567 }
568 } catch (e) {
569 if (e != self.StopIteration) {
570 throw e;
571 }
572 }
573 } else {
574 self.exhaust(self.imap(func, iterable));
575 }
576 },
577
578 /** @id MochiKit.Iter.every */
579 every: function (iterable, func) {
580 var self = MochiKit.Iter;
581 try {
582 self.ifilterfalse(func, iterable).next();
583 return false;
584 } catch (e) {
585 if (e != self.StopIteration) {
586 throw e;
587 }
588 return true;
589 }
590 },
591
592 /** @id MochiKit.Iter.sorted */
593 sorted: function (iterable, /* optional */cmp) {
594 var rval = MochiKit.Iter.list(iterable);
595 if (arguments.length == 1) {
596 cmp = MochiKit.Base.compare;
597 }
598 rval.sort(cmp);
599 return rval;
600 },
601
602 /** @id MochiKit.Iter.reversed */
603 reversed: function (iterable) {
604 var rval = MochiKit.Iter.list(iterable);
605 rval.reverse();
606 return rval;
607 },
608
609 /** @id MochiKit.Iter.some */
610 some: function (iterable, func) {
611 var self = MochiKit.Iter;
612 try {
613 self.ifilter(func, iterable).next();
614 return true;
615 } catch (e) {
616 if (e != self.StopIteration) {
617 throw e;
618 }
619 return false;
620 }
621 },
622
623 /** @id MochiKit.Iter.iextend */
624 iextend: function (lst, iterable) {
625 var m = MochiKit.Base;
626 var self = MochiKit.Iter;
627 if (m.isArrayLike(iterable) && !self.isIterable(iterable)) {
628 // fast-path for array-like
629 for (var i = 0; i < iterable.length; i++) {
630 lst.push(iterable[i]);
631 }
632 } else {
633 iterable = self.iter(iterable);
634 try {
635 while (true) {
636 lst.push(iterable.next());
637 }
638 } catch (e) {
639 if (e != self.StopIteration) {
640 throw e;
641 }
642 }
643 }
644 return lst;
645 },
646
647 /** @id MochiKit.Iter.groupby */
648 groupby: function(iterable, /* optional */ keyfunc) {
649 var m = MochiKit.Base;
650 var self = MochiKit.Iter;
651 if (arguments.length < 2) {
652 keyfunc = m.operator.identity;
653 }
654 iterable = self.iter(iterable);
655
656 // shared
657 var pk = undefined;
658 var k = undefined;
659 var v;
660
661 function fetch() {
662 v = iterable.next();
663 k = keyfunc(v);
664 };
665
666 function eat() {
667 var ret = v;
668 v = undefined;
669 return ret;
670 };
671
672 var first = true;
673 var compare = m.compare;
674 return {
675 repr: function () { return "groupby(...)"; },
676 next: function() {
677 // iterator-next
678
679 // iterate until meet next group
680 while (compare(k, pk) === 0) {
681 fetch();
682 if (first) {
683 first = false;
684 break;
685 }
686 }
687 pk = k;
688 return [k, {
689 next: function() {
690 // subiterator-next
691 if (v == undefined) { // Is there something to eat?
692 fetch();
693 }
694 if (compare(k, pk) !== 0) {
695 throw self.StopIteration;
696 }
697 return eat();
698 }
699 }];
700 }
701 };
702 },
703
704 /** @id MochiKit.Iter.groupby_as_array */
705 groupby_as_array: function (iterable, /* optional */ keyfunc) {
706 var m = MochiKit.Base;
707 var self = MochiKit.Iter;
708 if (arguments.length < 2) {
709 keyfunc = m.operator.identity;
710 }
711
712 iterable = self.iter(iterable);
713 var result = [];
714 var first = true;
715 var prev_key;
716 var compare = m.compare;
717 while (true) {
718 try {
719 var value = iterable.next();
720 var key = keyfunc(value);
721 } catch (e) {
722 if (e == self.StopIteration) {
723 break;
724 }
725 throw e;
726 }
727 if (first || compare(key, prev_key) !== 0) {
728 var values = [];
729 result.push([key, values]);
730 }
731 values.push(value);
732 first = false;
733 prev_key = key;
734 }
735 return result;
736 },
737
738 /** @id MochiKit.Iter.arrayLikeIter */
739 arrayLikeIter: function (iterable) {
740 var i = 0;
741 return {
742 repr: function () { return "arrayLikeIter(...)"; },
743 toString: MochiKit.Base.forwardCall("repr"),
744 next: function () {
745 if (i >= iterable.length) {
746 throw MochiKit.Iter.StopIteration;
747 }
748 return iterable[i++];
749 }
750 };
751 },
752
753 /** @id MochiKit.Iter.hasIterateNext */
754 hasIterateNext: function (iterable) {
755 return (iterable && typeof(iterable.iterateNext) == "function");
756 },
757
758 /** @id MochiKit.Iter.iterateNextIter */
759 iterateNextIter: function (iterable) {
760 return {
761 repr: function () { return "iterateNextIter(...)"; },
762 toString: MochiKit.Base.forwardCall("repr"),
763 next: function () {
764 var rval = iterable.iterateNext();
765 if (rval === null || rval === undefined) {
766 throw MochiKit.Iter.StopIteration;
767 }
768 return rval;
769 }
770 };
771 }
772});
773
774
775MochiKit.Iter.__new__ = function () {
776 var m = MochiKit.Base;
777 // Re-use StopIteration if exists (e.g. SpiderMonkey)
778 if (typeof(StopIteration) != "undefined") {
779 this.StopIteration = StopIteration;
780 } else {
781 /** @id MochiKit.Iter.StopIteration */
782 this.StopIteration = new m.NamedError("StopIteration");
783 }
784 this.iteratorRegistry = new m.AdapterRegistry();
785 // Register the iterator factory for arrays
786 this.registerIteratorFactory(
787 "arrayLike",
788 m.isArrayLike,
789 this.arrayLikeIter
790 );
791
792 this.registerIteratorFactory(
793 "iterateNext",
794 this.hasIterateNext,
795 this.iterateNextIter
796 );
797
798 m.nameFunctions(this);
799
800};
801
802MochiKit.Iter.__new__();
803
804//
805// XXX: Internet Explorer blows
806//
807if (MochiKit.__export__) {
808 reduce = MochiKit.Iter.reduce;
809}
810
811MochiKit.Base._exportSymbols(this, MochiKit.Iter);
diff --git a/frontend/delta/js/MochiKit/Logging.js b/frontend/delta/js/MochiKit/Logging.js
new file mode 100644
index 0000000..34070bc
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Logging.js
@@ -0,0 +1,285 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Logging 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Logging', '1.5', ['Base']);
35
36 /** @id MochiKit.Logging.LogMessage */
37MochiKit.Logging.LogMessage = function (num, level, info) {
38 this.num = num;
39 this.level = level;
40 this.info = info;
41 this.timestamp = new Date();
42};
43
44MochiKit.Logging.LogMessage.prototype = {
45 /** @id MochiKit.Logging.LogMessage.prototype.repr */
46 repr: function () {
47 var m = MochiKit.Base;
48 return 'LogMessage(' +
49 m.map(
50 m.repr,
51 [this.num, this.level, this.info]
52 ).join(', ') + ')';
53 },
54 /** @id MochiKit.Logging.LogMessage.prototype.toString */
55 toString: MochiKit.Base.forwardCall("repr")
56};
57
58MochiKit.Base.update(MochiKit.Logging, {
59 /** @id MochiKit.Logging.logLevelAtLeast */
60 logLevelAtLeast: function (minLevel) {
61 var self = MochiKit.Logging;
62 if (typeof(minLevel) == 'string') {
63 minLevel = self.LogLevel[minLevel];
64 }
65 return function (msg) {
66 var msgLevel = msg.level;
67 if (typeof(msgLevel) == 'string') {
68 msgLevel = self.LogLevel[msgLevel];
69 }
70 return msgLevel >= minLevel;
71 };
72 },
73
74 /** @id MochiKit.Logging.isLogMessage */
75 isLogMessage: function (/* ... */) {
76 var LogMessage = MochiKit.Logging.LogMessage;
77 for (var i = 0; i < arguments.length; i++) {
78 if (!(arguments[i] instanceof LogMessage)) {
79 return false;
80 }
81 }
82 return true;
83 },
84
85 /** @id MochiKit.Logging.compareLogMessage */
86 compareLogMessage: function (a, b) {
87 return MochiKit.Base.compare([a.level, a.info], [b.level, b.info]);
88 },
89
90 /** @id MochiKit.Logging.alertListener */
91 alertListener: function (msg) {
92 alert(
93 "num: " + msg.num +
94 "\nlevel: " + msg.level +
95 "\ninfo: " + msg.info.join(" ")
96 );
97 }
98
99});
100
101/** @id MochiKit.Logging.Logger */
102MochiKit.Logging.Logger = function (/* optional */maxSize) {
103 this.counter = 0;
104 if (typeof(maxSize) == 'undefined' || maxSize === null) {
105 maxSize = -1;
106 }
107 this.maxSize = maxSize;
108 this._messages = [];
109 this.listeners = {};
110 this.useNativeConsole = false;
111};
112
113MochiKit.Logging.Logger.prototype = {
114 /** @id MochiKit.Logging.Logger.prototype.clear */
115 clear: function () {
116 this._messages.splice(0, this._messages.length);
117 },
118
119 /** @id MochiKit.Logging.Logger.prototype.logToConsole */
120 logToConsole: function (msg) {
121 if (typeof(window) != "undefined" && window.console
122 && window.console.log) {
123 // Safari and FireBug 0.4
124 // Percent replacement is a workaround for cute Safari crashing bug
125 window.console.log(msg.replace(/%/g, '\uFF05'));
126 } else if (typeof(opera) != "undefined" && opera.postError) {
127 // Opera
128 opera.postError(msg);
129 } else if (typeof(Debug) != "undefined" && Debug.writeln) {
130 // IE Web Development Helper (?)
131 // http://www.nikhilk.net/Entry.aspx?id=93
132 Debug.writeln(msg);
133 } else if (typeof(debug) != "undefined" && debug.trace) {
134 // Atlas framework (?)
135 // http://www.nikhilk.net/Entry.aspx?id=93
136 debug.trace(msg);
137 }
138 },
139
140 /** @id MochiKit.Logging.Logger.prototype.dispatchListeners */
141 dispatchListeners: function (msg) {
142 for (var k in this.listeners) {
143 var pair = this.listeners[k];
144 if (pair.ident != k || (pair[0] && !pair[0](msg))) {
145 continue;
146 }
147 pair[1](msg);
148 }
149 },
150
151 /** @id MochiKit.Logging.Logger.prototype.addListener */
152 addListener: function (ident, filter, listener) {
153 if (typeof(filter) == 'string') {
154 filter = MochiKit.Logging.logLevelAtLeast(filter);
155 }
156 var entry = [filter, listener];
157 entry.ident = ident;
158 this.listeners[ident] = entry;
159 },
160
161 /** @id MochiKit.Logging.Logger.prototype.removeListener */
162 removeListener: function (ident) {
163 delete this.listeners[ident];
164 },
165
166 /** @id MochiKit.Logging.Logger.prototype.baseLog */
167 baseLog: function (level, message/*, ...*/) {
168 if (typeof(level) == "number") {
169 if (level >= MochiKit.Logging.LogLevel.FATAL) {
170 level = 'FATAL';
171 } else if (level >= MochiKit.Logging.LogLevel.ERROR) {
172 level = 'ERROR';
173 } else if (level >= MochiKit.Logging.LogLevel.WARNING) {
174 level = 'WARNING';
175 } else if (level >= MochiKit.Logging.LogLevel.INFO) {
176 level = 'INFO';
177 } else {
178 level = 'DEBUG';
179 }
180 }
181 var msg = new MochiKit.Logging.LogMessage(
182 this.counter,
183 level,
184 MochiKit.Base.extend(null, arguments, 1)
185 );
186 this._messages.push(msg);
187 this.dispatchListeners(msg);
188 if (this.useNativeConsole) {
189 this.logToConsole(msg.level + ": " + msg.info.join(" "));
190 }
191 this.counter += 1;
192 while (this.maxSize >= 0 && this._messages.length > this.maxSize) {
193 this._messages.shift();
194 }
195 },
196
197 /** @id MochiKit.Logging.Logger.prototype.getMessages */
198 getMessages: function (howMany) {
199 var firstMsg = 0;
200 if (!(typeof(howMany) == 'undefined' || howMany === null)) {
201 firstMsg = Math.max(0, this._messages.length - howMany);
202 }
203 return this._messages.slice(firstMsg);
204 },
205
206 /** @id MochiKit.Logging.Logger.prototype.getMessageText */
207 getMessageText: function (howMany) {
208 if (typeof(howMany) == 'undefined' || howMany === null) {
209 howMany = 30;
210 }
211 var messages = this.getMessages(howMany);
212 if (messages.length) {
213 var lst = MochiKit.Base.map(function (m) {
214 return '\n [' + m.num + '] ' + m.level + ': ' + m.info.join(' ');
215 }, messages);
216 lst.unshift('LAST ' + messages.length + ' MESSAGES:');
217 return lst.join('');
218 }
219 return '';
220 },
221
222 /** @id MochiKit.Logging.Logger.prototype.debuggingBookmarklet */
223 debuggingBookmarklet: function (inline) {
224 if (typeof(MochiKit.LoggingPane) == "undefined") {
225 alert(this.getMessageText());
226 } else {
227 MochiKit.LoggingPane.createLoggingPane(inline || false);
228 }
229 }
230};
231
232MochiKit.Logging.__new__ = function () {
233 this.LogLevel = {
234 ERROR: 40,
235 FATAL: 50,
236 WARNING: 30,
237 INFO: 20,
238 DEBUG: 10
239 };
240
241 var m = MochiKit.Base;
242 m.registerComparator("LogMessage",
243 this.isLogMessage,
244 this.compareLogMessage
245 );
246
247 var partial = m.partial;
248
249 var Logger = this.Logger;
250 var baseLog = Logger.prototype.baseLog;
251 m.update(this.Logger.prototype, {
252 debug: partial(baseLog, 'DEBUG'),
253 log: partial(baseLog, 'INFO'),
254 error: partial(baseLog, 'ERROR'),
255 fatal: partial(baseLog, 'FATAL'),
256 warning: partial(baseLog, 'WARNING')
257 });
258
259 // indirectly find logger so it can be replaced
260 var self = this;
261 var connectLog = function (name) {
262 return function () {
263 self.logger[name].apply(self.logger, arguments);
264 };
265 };
266
267 /** @id MochiKit.Logging.log */
268 this.log = connectLog('log');
269 /** @id MochiKit.Logging.logError */
270 this.logError = connectLog('error');
271 /** @id MochiKit.Logging.logDebug */
272 this.logDebug = connectLog('debug');
273 /** @id MochiKit.Logging.logFatal */
274 this.logFatal = connectLog('fatal');
275 /** @id MochiKit.Logging.logWarning */
276 this.logWarning = connectLog('warning');
277 this.logger = new Logger();
278 this.logger.useNativeConsole = true;
279
280 m.nameFunctions(this);
281};
282
283MochiKit.Logging.__new__();
284
285MochiKit.Base._exportSymbols(this, MochiKit.Logging);
diff --git a/frontend/delta/js/MochiKit/LoggingPane.js b/frontend/delta/js/MochiKit/LoggingPane.js
new file mode 100644
index 0000000..e35aee8
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/LoggingPane.js
@@ -0,0 +1,353 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.LoggingPane 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'LoggingPane', '1.5', ['Base', 'Logging']);
35
36/** @id MochiKit.LoggingPane.createLoggingPane */
37MochiKit.LoggingPane.createLoggingPane = function (inline/* = false */) {
38 var m = MochiKit.LoggingPane;
39 inline = !(!inline);
40 if (m._loggingPane && m._loggingPane.inline != inline) {
41 m._loggingPane.closePane();
42 m._loggingPane = null;
43 }
44 if (!m._loggingPane || m._loggingPane.closed) {
45 m._loggingPane = new m.LoggingPane(inline, MochiKit.Logging.logger);
46 }
47 return m._loggingPane;
48};
49
50/**
51 * @id MochiKit.LoggingPane.LoggingPane
52 * @constructor
53 */
54MochiKit.LoggingPane.LoggingPane = function (inline/* = false */, logger/* = MochiKit.Logging.logger */) {
55
56 /* Use a div if inline, pop up a window if not */
57 /* Create the elements */
58 if (typeof(logger) == "undefined" || logger === null) {
59 logger = MochiKit.Logging.logger;
60 }
61 this.logger = logger;
62 var update = MochiKit.Base.update;
63 var updatetree = MochiKit.Base.updatetree;
64 var bind = MochiKit.Base.bind;
65 var clone = MochiKit.Base.clone;
66 var win = window;
67 var uid = "_MochiKit_LoggingPane";
68 if (typeof(MochiKit.DOM) != "undefined") {
69 win = MochiKit.DOM.currentWindow();
70 }
71 if (!inline) {
72 // name the popup with the base URL for uniqueness
73 var url = win.location.href.split("?")[0].replace(/[#:\/.><&%-]/g, "_");
74 var name = uid + "_" + url;
75 var nwin = win.open("", name, "dependent,resizable,height=200");
76 if (!nwin) {
77 alert("Not able to open debugging window due to pop-up blocking.");
78 return undefined;
79 }
80 nwin.document.write(
81 '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" '
82 + '"http://www.w3.org/TR/html4/loose.dtd">'
83 + '<html><head><title>[MochiKit.LoggingPane]</title></head>'
84 + '<body></body></html>'
85 );
86 nwin.document.close();
87 nwin.document.title += ' ' + win.document.title;
88 win = nwin;
89 }
90 var doc = win.document;
91 this.doc = doc;
92
93 // Connect to the debug pane if it already exists (i.e. in a window orphaned by the page being refreshed)
94 var debugPane = doc.getElementById(uid);
95 var existing_pane = !!debugPane;
96 if (debugPane && typeof(debugPane.loggingPane) != "undefined") {
97 debugPane.loggingPane.logger = this.logger;
98 debugPane.loggingPane.buildAndApplyFilter();
99 return debugPane.loggingPane;
100 }
101
102 if (existing_pane) {
103 // clear any existing contents
104 var child;
105 while ((child = debugPane.firstChild)) {
106 debugPane.removeChild(child);
107 }
108 } else {
109 debugPane = doc.createElement("div");
110 debugPane.id = uid;
111 }
112 debugPane.loggingPane = this;
113 var levelFilterField = doc.createElement("input");
114 var infoFilterField = doc.createElement("input");
115 var filterButton = doc.createElement("button");
116 var loadButton = doc.createElement("button");
117 var clearButton = doc.createElement("button");
118 var closeButton = doc.createElement("button");
119 var logPaneArea = doc.createElement("div");
120 var logPane = doc.createElement("div");
121
122 /* Set up the functions */
123 var listenerId = uid + "_Listener";
124 this.colorTable = clone(this.colorTable);
125 var messages = [];
126 var messageFilter = null;
127
128 /** @id MochiKit.LoggingPane.messageLevel */
129 var messageLevel = function (msg) {
130 var level = msg.level;
131 if (typeof(level) == "number") {
132 level = MochiKit.Logging.LogLevel[level];
133 }
134 return level;
135 };
136
137 /** @id MochiKit.LoggingPane.messageText */
138 var messageText = function (msg) {
139 return msg.info.join(" ");
140 };
141
142 /** @id MochiKit.LoggingPane.addMessageText */
143 var addMessageText = bind(function (msg) {
144 var level = messageLevel(msg);
145 var text = messageText(msg);
146 var c = this.colorTable[level];
147 var p = doc.createElement("span");
148 p.className = "MochiKit-LogMessage MochiKit-LogLevel-" + level;
149 p.style.cssText = "margin: 0px; white-space: -moz-pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; white-space: pre-line; word-wrap: break-word; wrap-option: emergency; color: " + c;
150 p.appendChild(doc.createTextNode(level + ": " + text));
151 logPane.appendChild(p);
152 logPane.appendChild(doc.createElement("br"));
153 if (logPaneArea.offsetHeight > logPaneArea.scrollHeight) {
154 logPaneArea.scrollTop = 0;
155 } else {
156 logPaneArea.scrollTop = logPaneArea.scrollHeight;
157 }
158 }, this);
159
160 /** @id MochiKit.LoggingPane.addMessage */
161 var addMessage = function (msg) {
162 messages[messages.length] = msg;
163 addMessageText(msg);
164 };
165
166 /** @id MochiKit.LoggingPane.buildMessageFilter */
167 var buildMessageFilter = function () {
168 var levelre, infore;
169 try {
170 /* Catch any exceptions that might arise due to invalid regexes */
171 levelre = new RegExp(levelFilterField.value);
172 infore = new RegExp(infoFilterField.value);
173 } catch(e) {
174 /* If there was an error with the regexes, do no filtering */
175 MochiKit.Logging.logDebug("Error in filter regex: " + e.message);
176 return null;
177 }
178
179 return function (msg) {
180 return (
181 levelre.test(messageLevel(msg)) &&
182 infore.test(messageText(msg))
183 );
184 };
185 };
186
187 /** @id MochiKit.LoggingPane.clearMessagePane */
188 var clearMessagePane = function () {
189 while (logPane.firstChild) {
190 logPane.removeChild(logPane.firstChild);
191 }
192 };
193
194 /** @id MochiKit.LoggingPane.clearMessages */
195 var clearMessages = function () {
196 messages = [];
197 clearMessagePane();
198 };
199
200 /** @id MochiKit.LoggingPane.closePane */
201 var closePane = bind(function () {
202 if (this.closed) {
203 return;
204 }
205 this.closed = true;
206 if (MochiKit.LoggingPane._loggingPane == this) {
207 MochiKit.LoggingPane._loggingPane = null;
208 }
209 this.logger.removeListener(listenerId);
210 try {
211 try {
212 debugPane.loggingPane = null;
213 } catch(e) { MochiKit.Logging.logFatal("Bookmarklet was closed incorrectly."); }
214 if (inline) {
215 debugPane.parentNode.removeChild(debugPane);
216 } else {
217 this.win.close();
218 }
219 } catch(e) {}
220 }, this);
221
222 /** @id MochiKit.LoggingPane.filterMessages */
223 var filterMessages = function () {
224 clearMessagePane();
225
226 for (var i = 0; i < messages.length; i++) {
227 var msg = messages[i];
228 if (messageFilter === null || messageFilter(msg)) {
229 addMessageText(msg);
230 }
231 }
232 };
233
234 this.buildAndApplyFilter = function () {
235 messageFilter = buildMessageFilter();
236
237 filterMessages();
238
239 this.logger.removeListener(listenerId);
240 this.logger.addListener(listenerId, messageFilter, addMessage);
241 };
242
243
244 /** @id MochiKit.LoggingPane.loadMessages */
245 var loadMessages = bind(function () {
246 messages = this.logger.getMessages();
247 filterMessages();
248 }, this);
249
250 /** @id MochiKit.LoggingPane.filterOnEnter */
251 var filterOnEnter = bind(function (event) {
252 event = event || window.event;
253 var key = event.which || event.keyCode;
254 if (key == 13) {
255 this.buildAndApplyFilter();
256 }
257 }, this);
258
259 /* Create the debug pane */
260 var style = "display: block; z-index: 1000; left: 0px; bottom: 0px; position: fixed; width: 100%; background-color: white; font: " + this.logFont;
261 if (inline) {
262 style += "; height: 10em; border-top: 2px solid black";
263 } else {
264 style += "; height: 100%;";
265 }
266 debugPane.style.cssText = style;
267
268 if (!existing_pane) {
269 doc.body.appendChild(debugPane);
270 }
271
272 /* Create the filter fields */
273 style = {"cssText": "width: 33%; display: inline; font: " + this.logFont};
274
275 updatetree(levelFilterField, {
276 "value": "FATAL|ERROR|WARNING|INFO|DEBUG",
277 "onkeypress": filterOnEnter,
278 "style": style
279 });
280 debugPane.appendChild(levelFilterField);
281
282 updatetree(infoFilterField, {
283 "value": ".*",
284 "onkeypress": filterOnEnter,
285 "style": style
286 });
287 debugPane.appendChild(infoFilterField);
288
289 /* Create the buttons */
290 style = "width: 8%; display:inline; font: " + this.logFont;
291
292 filterButton.appendChild(doc.createTextNode("Filter"));
293 filterButton.onclick = bind("buildAndApplyFilter", this);
294 filterButton.style.cssText = style;
295 debugPane.appendChild(filterButton);
296
297 loadButton.appendChild(doc.createTextNode("Load"));
298 loadButton.onclick = loadMessages;
299 loadButton.style.cssText = style;
300 debugPane.appendChild(loadButton);
301
302 clearButton.appendChild(doc.createTextNode("Clear"));
303 clearButton.onclick = clearMessages;
304 clearButton.style.cssText = style;
305 debugPane.appendChild(clearButton);
306
307 closeButton.appendChild(doc.createTextNode("Close"));
308 closeButton.onclick = closePane;
309 closeButton.style.cssText = style;
310 debugPane.appendChild(closeButton);
311
312 /* Create the logging pane */
313 logPaneArea.style.cssText = "overflow: auto; width: 100%";
314 logPane.style.cssText = "width: 100%; height: " + (inline ? "8em" : "100%");
315
316 logPaneArea.appendChild(logPane);
317 debugPane.appendChild(logPaneArea);
318
319 this.buildAndApplyFilter();
320 loadMessages();
321
322 if (inline) {
323 this.win = undefined;
324 } else {
325 this.win = win;
326 }
327 this.inline = inline;
328 this.closePane = closePane;
329 this.closed = false;
330
331
332 return this;
333};
334
335MochiKit.LoggingPane.LoggingPane.prototype = {
336 "logFont": "8pt Verdana,sans-serif",
337 "colorTable": {
338 "ERROR": "red",
339 "FATAL": "darkred",
340 "WARNING": "blue",
341 "INFO": "black",
342 "DEBUG": "green"
343 }
344};
345
346MochiKit.LoggingPane.__new__ = function () {
347 MochiKit.Base.nameFunctions(this);
348 MochiKit.LoggingPane._loggingPane = null;
349};
350
351MochiKit.LoggingPane.__new__();
352
353MochiKit.Base._exportSymbols(this, MochiKit.LoggingPane);
diff --git a/frontend/delta/js/MochiKit/MochiKit.js b/frontend/delta/js/MochiKit/MochiKit.js
new file mode 100644
index 0000000..5fac077
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/MochiKit.js
@@ -0,0 +1,156 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.MochiKit 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34var MochiKit = MochiKit || {};
35
36/** @id MochiKit.MochiKit */
37MochiKit.MochiKit = MochiKit.MochiKit || {};
38
39MochiKit.MochiKit.NAME = "MochiKit.MochiKit";
40MochiKit.MochiKit.VERSION = "1.5";
41MochiKit.MochiKit.__export__ = false;
42MochiKit.MochiKit.__repr__ = function () {
43 return "[" + this.NAME + " " + this.VERSION + "]";
44};
45
46/** @id MochiKit.MochiKit.toString */
47MochiKit.MochiKit.toString = function () {
48 return this.__repr__();
49};
50
51/** @id MochiKit.MochiKit.SUBMODULES */
52MochiKit.MochiKit.SUBMODULES = [
53 "Base",
54 "Iter",
55 "Logging",
56 "DateTime",
57 "Format",
58 "Text",
59 "Async",
60 "DOM",
61 "Selector",
62 "Style",
63 "LoggingPane",
64 "Color",
65 "Signal",
66 "Position",
67 "Visual",
68 "DragAndDrop",
69 "Sortable"
70];
71
72(function () {
73 if (typeof(document) == "undefined") {
74 return;
75 }
76 var scripts = document.getElementsByTagName("script");
77 var kXHTMLNSURI = "http://www.w3.org/1999/xhtml";
78 var kSVGNSURI = "http://www.w3.org/2000/svg";
79 var kXLINKNSURI = "http://www.w3.org/1999/xlink";
80 var kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
81 var base = null;
82 var baseElem = null;
83 var allScripts = {};
84 var i;
85 var src;
86 for (i = 0; i < scripts.length; i++) {
87 src = null;
88 switch (scripts[i].namespaceURI) {
89 case kSVGNSURI:
90 src = scripts[i].getAttributeNS(kXLINKNSURI, "href");
91 break;
92 /*
93 case null: // HTML
94 case '': // HTML
95 case kXHTMLNSURI:
96 case kXULNSURI:
97 */
98 default:
99 src = scripts[i].getAttribute("src");
100 break;
101 }
102 if (!src) {
103 continue;
104 }
105 allScripts[src] = true;
106 if (src.match(/MochiKit.js(\?.*)?$/)) {
107 base = src.substring(0, src.lastIndexOf('MochiKit.js'));
108 baseElem = scripts[i];
109 }
110 }
111 if (base === null) {
112 return;
113 }
114 var modules = MochiKit.MochiKit.SUBMODULES;
115 for (var i = 0; i < modules.length; i++) {
116 if (MochiKit[modules[i]]) {
117 continue;
118 }
119 var uri = base + modules[i] + '.js';
120 if (uri in allScripts) {
121 continue;
122 }
123 if (baseElem.namespaceURI == kSVGNSURI ||
124 baseElem.namespaceURI == kXULNSURI) {
125 // SVG, XUL
126 /*
127 SVG does not support document.write, so if Safari wants to
128 support SVG tests it should fix its deferred loading bug
129 (see following below).
130 */
131 var s = document.createElementNS(baseElem.namespaceURI, 'script');
132 s.setAttribute("id", "MochiKit_" + base + modules[i]);
133 if (baseElem.namespaceURI == kSVGNSURI) {
134 s.setAttributeNS(kXLINKNSURI, 'href', uri);
135 } else {
136 s.setAttribute('src', uri);
137 }
138 s.setAttribute("type", "application/x-javascript");
139 baseElem.parentNode.appendChild(s);
140 } else {
141 // HTML, XHTML
142 /*
143 DOM can not be used here because Safari does
144 deferred loading of scripts unless they are
145 in the document or inserted with document.write
146
147 This is not XHTML compliant. If you want XHTML
148 compliance then you must use the packed version of MochiKit
149 or include each script individually (basically unroll
150 these document.write calls into your XHTML source)
151 */
152 document.write('<' + baseElem.nodeName + ' src="' + uri +
153 '" type="text/javascript"></script>');
154 }
155 };
156})();
diff --git a/frontend/delta/js/MochiKit/MockDOM.js b/frontend/delta/js/MochiKit/MockDOM.js
new file mode 100644
index 0000000..6df7922
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/MockDOM.js
@@ -0,0 +1,135 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.MockDOM 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34var MochiKit = MochiKit || {};
35
36MochiKit.MockDOM = MochiKit.MockDOM || {};
37
38MochiKit.MockDOM.NAME = "MochiKit.MockDOM";
39MochiKit.MockDOM.VERSION = "1.5";
40MochiKit.MockDOM.__export__ = false;
41
42MochiKit.MockDOM.__repr__ = function () {
43 return "[" + this.NAME + " " + this.VERSION + "]";
44};
45
46/** @id MochiKit.MockDOM.toString */
47MochiKit.MockDOM.toString = function () {
48 return this.__repr__();
49};
50
51/** @id MochiKit.MockDOM.createDocument */
52MochiKit.MockDOM.createDocument = function () {
53 var doc = new MochiKit.MockDOM.MockElement("DOCUMENT");
54 doc.body = doc.createElement("BODY");
55 doc.appendChild(doc.body);
56 return doc;
57};
58
59/** @id MochiKit.MockDOM.MockElement */
60MochiKit.MockDOM.MockElement = function (name, data, ownerDocument) {
61 this.tagName = this.nodeName = name.toUpperCase();
62 this.ownerDocument = ownerDocument || null;
63 if (name == "DOCUMENT") {
64 this.nodeType = 9;
65 this.childNodes = [];
66 } else if (typeof(data) == "string") {
67 this.nodeValue = data;
68 this.nodeType = 3;
69 } else {
70 this.nodeType = 1;
71 this.childNodes = [];
72 }
73 if (name.substring(0, 1) == "<") {
74 var nameattr = name.substring(
75 name.indexOf('"') + 1, name.lastIndexOf('"'));
76 name = name.substring(1, name.indexOf(" "));
77 this.tagName = this.nodeName = name.toUpperCase();
78 this.setAttribute("name", nameattr);
79 }
80};
81
82MochiKit.MockDOM.MockElement.prototype = {
83 /** @id MochiKit.MockDOM.MockElement.prototype.createElement */
84 createElement: function (tagName) {
85 return new MochiKit.MockDOM.MockElement(tagName, null, this.nodeType == 9 ? this : this.ownerDocument);
86 },
87 /** @id MochiKit.MockDOM.MockElement.prototype.createTextNode */
88 createTextNode: function (text) {
89 return new MochiKit.MockDOM.MockElement("text", text, this.nodeType == 9 ? this : this.ownerDocument);
90 },
91 /** @id MochiKit.MockDOM.MockElement.prototype.setAttribute */
92 setAttribute: function (name, value) {
93 this[name] = value;
94 },
95 /** @id MochiKit.MockDOM.MockElement.prototype.getAttribute */
96 getAttribute: function (name) {
97 return this[name];
98 },
99 /** @id MochiKit.MockDOM.MockElement.prototype.appendChild */
100 appendChild: function (child) {
101 this.childNodes.push(child);
102 },
103 /** @id MochiKit.MockDOM.MockElement.prototype.toString */
104 toString: function () {
105 return "MockElement(" + this.tagName + ")";
106 },
107 /** @id MochiKit.MockDOM.MockElement.prototype.getElementsByTagName */
108 getElementsByTagName: function (tagName) {
109 var foundElements = [];
110 MochiKit.Base.nodeWalk(this, function(node){
111 if (tagName == '*' || tagName == node.tagName) {
112 foundElements.push(node);
113 return node.childNodes;
114 }
115 });
116 return foundElements;
117 }
118};
119
120 /** @id MochiKit.MockDOM.EXPORT_OK */
121MochiKit.MockDOM.EXPORT_OK = [
122 "mockElement",
123 "createDocument"
124];
125
126 /** @id MochiKit.MockDOM.EXPORT */
127MochiKit.MockDOM.EXPORT = [
128 "document"
129];
130
131MochiKit.MockDOM.__new__ = function () {
132 this.document = this.createDocument();
133};
134
135MochiKit.MockDOM.__new__();
diff --git a/frontend/delta/js/MochiKit/Position.js b/frontend/delta/js/MochiKit/Position.js
new file mode 100644
index 0000000..e5f4543
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Position.js
@@ -0,0 +1,241 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Position 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005-2006 Bob Ippolito and others. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Position', '1.5', ['Base', 'DOM', 'Style']);
35
36MochiKit.Base.update(MochiKit.Position, {
37 // Don't export from this module
38 __export__: false,
39
40 // set to true if needed, warning: firefox performance problems
41 // NOT neeeded for page scrolling, only if draggable contained in
42 // scrollable elements
43 includeScrollOffsets: false,
44
45 /** @id MochiKit.Position.prepare */
46 prepare: function () {
47 var deltaX = window.pageXOffset
48 || document.documentElement.scrollLeft
49 || document.body.scrollLeft
50 || 0;
51 var deltaY = window.pageYOffset
52 || document.documentElement.scrollTop
53 || document.body.scrollTop
54 || 0;
55 this.windowOffset = new MochiKit.Style.Coordinates(deltaX, deltaY);
56 },
57
58 /** @id MochiKit.Position.cumulativeOffset */
59 cumulativeOffset: function (element) {
60 var valueT = 0;
61 var valueL = 0;
62 do {
63 valueT += element.offsetTop || 0;
64 valueL += element.offsetLeft || 0;
65 element = element.offsetParent;
66 } while (element);
67 return new MochiKit.Style.Coordinates(valueL, valueT);
68 },
69
70 /** @id MochiKit.Position.realOffset */
71 realOffset: function (element) {
72 var valueT = 0;
73 var valueL = 0;
74 do {
75 valueT += element.scrollTop || 0;
76 valueL += element.scrollLeft || 0;
77 element = element.parentNode;
78 } while (element);
79 return new MochiKit.Style.Coordinates(valueL, valueT);
80 },
81
82 /** @id MochiKit.Position.within */
83 within: function (element, x, y) {
84 if (this.includeScrollOffsets) {
85 return this.withinIncludingScrolloffsets(element, x, y);
86 }
87 this.xcomp = x;
88 this.ycomp = y;
89 this.offset = this.cumulativeOffset(element);
90 if (element.style.position == "fixed") {
91 this.offset.x += this.windowOffset.x;
92 this.offset.y += this.windowOffset.y;
93 }
94
95 return (y >= this.offset.y &&
96 y < this.offset.y + element.offsetHeight &&
97 x >= this.offset.x &&
98 x < this.offset.x + element.offsetWidth);
99 },
100
101 /** @id MochiKit.Position.withinIncludingScrolloffsets */
102 withinIncludingScrolloffsets: function (element, x, y) {
103 var offsetcache = this.realOffset(element);
104
105 this.xcomp = x + offsetcache.x - this.windowOffset.x;
106 this.ycomp = y + offsetcache.y - this.windowOffset.y;
107 this.offset = this.cumulativeOffset(element);
108
109 return (this.ycomp >= this.offset.y &&
110 this.ycomp < this.offset.y + element.offsetHeight &&
111 this.xcomp >= this.offset.x &&
112 this.xcomp < this.offset.x + element.offsetWidth);
113 },
114
115 // within must be called directly before
116 /** @id MochiKit.Position.overlap */
117 overlap: function (mode, element) {
118 if (!mode) {
119 return 0;
120 }
121 if (mode == 'vertical') {
122 return ((this.offset.y + element.offsetHeight) - this.ycomp) /
123 element.offsetHeight;
124 }
125 if (mode == 'horizontal') {
126 return ((this.offset.x + element.offsetWidth) - this.xcomp) /
127 element.offsetWidth;
128 }
129 },
130
131 /** @id MochiKit.Position.absolutize */
132 absolutize: function (element) {
133 element = MochiKit.DOM.getElement(element);
134 if (element.style.position == 'absolute') {
135 return;
136 }
137 MochiKit.Position.prepare();
138
139 var offsets = MochiKit.Position.positionedOffset(element);
140 var width = element.clientWidth;
141 var height = element.clientHeight;
142
143 var oldStyle = {
144 'position': element.style.position,
145 'left': offsets.x - parseFloat(element.style.left || 0),
146 'top': offsets.y - parseFloat(element.style.top || 0),
147 'width': element.style.width,
148 'height': element.style.height
149 };
150
151 element.style.position = 'absolute';
152 element.style.top = offsets.y + 'px';
153 element.style.left = offsets.x + 'px';
154 element.style.width = width + 'px';
155 element.style.height = height + 'px';
156
157 return oldStyle;
158 },
159
160 /** @id MochiKit.Position.positionedOffset */
161 positionedOffset: function (element) {
162 var valueT = 0, valueL = 0;
163 do {
164 valueT += element.offsetTop || 0;
165 valueL += element.offsetLeft || 0;
166 element = element.offsetParent;
167 if (element) {
168 var p = MochiKit.Style.getStyle(element, 'position');
169 if (p == 'relative' || p == 'absolute') {
170 break;
171 }
172 }
173 } while (element);
174 return new MochiKit.Style.Coordinates(valueL, valueT);
175 },
176
177 /** @id MochiKit.Position.relativize */
178 relativize: function (element, oldPos) {
179 element = MochiKit.DOM.getElement(element);
180 if (element.style.position == 'relative') {
181 return;
182 }
183 MochiKit.Position.prepare();
184
185 var top = parseFloat(element.style.top || 0) -
186 (oldPos['top'] || 0);
187 var left = parseFloat(element.style.left || 0) -
188 (oldPos['left'] || 0);
189
190 element.style.position = oldPos['position'];
191 element.style.top = top + 'px';
192 element.style.left = left + 'px';
193 element.style.width = oldPos['width'];
194 element.style.height = oldPos['height'];
195 },
196
197 /** @id MochiKit.Position.clone */
198 clone: function (source, target) {
199 source = MochiKit.DOM.getElement(source);
200 target = MochiKit.DOM.getElement(target);
201 target.style.position = 'absolute';
202 var offsets = this.cumulativeOffset(source);
203 target.style.top = offsets.y + 'px';
204 target.style.left = offsets.x + 'px';
205 target.style.width = source.offsetWidth + 'px';
206 target.style.height = source.offsetHeight + 'px';
207 },
208
209 /** @id MochiKit.Position.page */
210 page: function (forElement) {
211 var valueT = 0;
212 var valueL = 0;
213
214 var element = forElement;
215 do {
216 valueT += element.offsetTop || 0;
217 valueL += element.offsetLeft || 0;
218
219 // Safari fix
220 if (element.offsetParent == document.body && MochiKit.Style.getStyle(element, 'position') == 'absolute') {
221 break;
222 }
223 } while (element = element.offsetParent);
224
225 element = forElement;
226 do {
227 valueT -= element.scrollTop || 0;
228 valueL -= element.scrollLeft || 0;
229 } while (element = element.parentNode);
230
231 return new MochiKit.Style.Coordinates(valueL, valueT);
232 }
233});
234
235MochiKit.Position.__new__ = function (win) {
236 MochiKit.Base.nameFunctions(this);
237};
238
239MochiKit.Position.__new__(this);
240
241MochiKit.Base._exportSymbols(this, MochiKit.Position);
diff --git a/frontend/delta/js/MochiKit/Selector.js b/frontend/delta/js/MochiKit/Selector.js
new file mode 100644
index 0000000..2719b13
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Selector.js
@@ -0,0 +1,416 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Selector 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito and others. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Selector', '1.5', ['Base', 'DOM', 'Iter']);
35
36MochiKit.Selector.Selector = function (expression) {
37 this.params = {classNames: [], pseudoClassNames: []};
38 this.expression = expression.toString().replace(/(^\s+|\s+$)/g, '');
39 this.parseExpression();
40 this.compileMatcher();
41};
42
43MochiKit.Selector.Selector.prototype = {
44 /***
45
46 Selector class: convenient object to make CSS selections.
47
48 ***/
49 __class__: MochiKit.Selector.Selector,
50
51 /** @id MochiKit.Selector.Selector.prototype.parseExpression */
52 parseExpression: function () {
53 function abort(message) {
54 throw 'Parse error in selector: ' + message;
55 }
56
57 if (this.expression == '') {
58 abort('empty expression');
59 }
60
61 var repr = MochiKit.Base.repr;
62 var params = this.params;
63 var expr = this.expression;
64 var match, modifier, clause, rest;
65 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!^$*]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
66 params.attributes = params.attributes || [];
67 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
68 expr = match[1];
69 }
70
71 if (expr == '*') {
72 return this.params.wildcard = true;
73 }
74
75 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+(?:\([^)]*\))?)(.*)/i)) {
76 modifier = match[1];
77 clause = match[2];
78 rest = match[3];
79 switch (modifier) {
80 case '#':
81 params.id = clause;
82 break;
83 case '.':
84 params.classNames.push(clause);
85 break;
86 case ':':
87 params.pseudoClassNames.push(clause);
88 break;
89 case '':
90 case undefined:
91 params.tagName = clause.toUpperCase();
92 break;
93 default:
94 abort(repr(expr));
95 }
96 expr = rest;
97 }
98
99 if (expr.length > 0) {
100 abort(repr(expr));
101 }
102 },
103
104 /** @id MochiKit.Selector.Selector.prototype.buildMatchExpression */
105 buildMatchExpression: function () {
106 var repr = MochiKit.Base.repr;
107 var params = this.params;
108 var conditions = [];
109 var clause, i;
110
111 function childElements(element) {
112 return "MochiKit.Base.filter(function (node) { return node.nodeType == 1; }, " + element + ".childNodes)";
113 }
114
115 if (params.wildcard) {
116 conditions.push('true');
117 }
118 if (clause = params.id) {
119 conditions.push('element.id == ' + repr(clause));
120 }
121 if (clause = params.tagName) {
122 conditions.push('element.tagName.toUpperCase() == ' + repr(clause));
123 }
124 if ((clause = params.classNames).length > 0) {
125 for (i = 0; i < clause.length; i++) {
126 conditions.push('MochiKit.DOM.hasElementClass(element, ' + repr(clause[i]) + ')');
127 }
128 }
129 if ((clause = params.pseudoClassNames).length > 0) {
130 for (i = 0; i < clause.length; i++) {
131 var match = clause[i].match(/^([^(]+)(?:\((.*)\))?$/);
132 var pseudoClass = match[1];
133 var pseudoClassArgument = match[2];
134 switch (pseudoClass) {
135 case 'root':
136 conditions.push('element.nodeType == 9 || element === element.ownerDocument.documentElement'); break;
137 case 'nth-child':
138 case 'nth-last-child':
139 case 'nth-of-type':
140 case 'nth-last-of-type':
141 match = pseudoClassArgument.match(/^((?:(\d+)n\+)?(\d+)|odd|even)$/);
142 if (!match) {
143 throw "Invalid argument to pseudo element nth-child: " + pseudoClassArgument;
144 }
145 var a, b;
146 if (match[0] == 'odd') {
147 a = 2;
148 b = 1;
149 } else if (match[0] == 'even') {
150 a = 2;
151 b = 0;
152 } else {
153 a = match[2] && parseInt(match, 10) || null;
154 b = parseInt(match[3], 10);
155 }
156 conditions.push('this.nthChild(element,' + a + ',' + b
157 + ',' + !!pseudoClass.match('^nth-last') // Reverse
158 + ',' + !!pseudoClass.match('of-type$') // Restrict to same tagName
159 + ')');
160 break;
161 case 'first-child':
162 conditions.push('this.nthChild(element, null, 1)');
163 break;
164 case 'last-child':
165 conditions.push('this.nthChild(element, null, 1, true)');
166 break;
167 case 'first-of-type':
168 conditions.push('this.nthChild(element, null, 1, false, true)');
169 break;
170 case 'last-of-type':
171 conditions.push('this.nthChild(element, null, 1, true, true)');
172 break;
173 case 'only-child':
174 conditions.push(childElements('element.parentNode') + '.length == 1');
175 break;
176 case 'only-of-type':
177 conditions.push('MochiKit.Base.filter(function (node) { return node.tagName == element.tagName; }, ' + childElements('element.parentNode') + ').length == 1');
178 break;
179 case 'empty':
180 conditions.push('element.childNodes.length == 0');
181 break;
182 case 'enabled':
183 conditions.push('(this.isUIElement(element) && element.disabled === false)');
184 break;
185 case 'disabled':
186 conditions.push('(this.isUIElement(element) && element.disabled === true)');
187 break;
188 case 'checked':
189 conditions.push('(this.isUIElement(element) && element.checked === true)');
190 break;
191 case 'not':
192 var subselector = new MochiKit.Selector.Selector(pseudoClassArgument);
193 conditions.push('!( ' + subselector.buildMatchExpression() + ')');
194 break;
195 }
196 }
197 }
198 if (clause = params.attributes) {
199 MochiKit.Base.map(function (attribute) {
200 var value = 'MochiKit.DOM.getNodeAttribute(element, ' + repr(attribute.name) + ')';
201 var splitValueBy = function (delimiter) {
202 return value + '.split(' + repr(delimiter) + ')';
203 };
204 conditions.push(value + ' != null');
205 switch (attribute.operator) {
206 case '=':
207 conditions.push(value + ' == ' + repr(attribute.value));
208 break;
209 case '~=':
210 conditions.push('MochiKit.Base.findValue(' + splitValueBy(' ') + ', ' + repr(attribute.value) + ') > -1');
211 break;
212 case '^=':
213 conditions.push(value + '.substring(0, ' + attribute.value.length + ') == ' + repr(attribute.value));
214 break;
215 case '$=':
216 conditions.push(value + '.substring(' + value + '.length - ' + attribute.value.length + ') == ' + repr(attribute.value));
217 break;
218 case '*=':
219 conditions.push(value + '.match(' + repr(attribute.value) + ')');
220 break;
221 case '|=':
222 conditions.push(splitValueBy('-') + '[0].toUpperCase() == ' + repr(attribute.value.toUpperCase()));
223 break;
224 case '!=':
225 conditions.push(value + ' != ' + repr(attribute.value));
226 break;
227 case '':
228 case undefined:
229 // Condition already added above
230 break;
231 default:
232 throw 'Unknown operator ' + attribute.operator + ' in selector';
233 }
234 }, clause);
235 }
236
237 return conditions.join(' && ');
238 },
239
240 /** @id MochiKit.Selector.Selector.prototype.compileMatcher */
241 compileMatcher: function () {
242 var code = 'return (!element.tagName) ? false : ' +
243 this.buildMatchExpression() + ';';
244 this.match = new Function('element', code);
245 },
246
247 /** @id MochiKit.Selector.Selector.prototype.nthChild */
248 nthChild: function (element, a, b, reverse, sametag){
249 var siblings = MochiKit.Base.filter(function (node) {
250 return node.nodeType == 1;
251 }, element.parentNode.childNodes);
252 if (sametag) {
253 siblings = MochiKit.Base.filter(function (node) {
254 return node.tagName == element.tagName;
255 }, siblings);
256 }
257 if (reverse) {
258 siblings = MochiKit.Iter.reversed(siblings);
259 }
260 if (a) {
261 var actualIndex = MochiKit.Base.findIdentical(siblings, element);
262 return ((actualIndex + 1 - b) / a) % 1 == 0;
263 } else {
264 return b == MochiKit.Base.findIdentical(siblings, element) + 1;
265 }
266 },
267
268 /** @id MochiKit.Selector.Selector.prototype.isUIElement */
269 isUIElement: function (element) {
270 return MochiKit.Base.findValue(['input', 'button', 'select', 'option', 'textarea', 'object'],
271 element.tagName.toLowerCase()) > -1;
272 },
273
274 /** @id MochiKit.Selector.Selector.prototype.findElements */
275 findElements: function (scope, axis) {
276 var element;
277
278 if (axis == undefined) {
279 axis = "";
280 }
281
282 function inScope(element, scope) {
283 if (axis == "") {
284 return MochiKit.DOM.isChildNode(element, scope);
285 } else if (axis == ">") {
286 return element.parentNode === scope;
287 } else if (axis == "+") {
288 return element === nextSiblingElement(scope);
289 } else if (axis == "~") {
290 var sibling = scope;
291 while (sibling = nextSiblingElement(sibling)) {
292 if (element === sibling) {
293 return true;
294 }
295 }
296 return false;
297 } else {
298 throw "Invalid axis: " + axis;
299 }
300 }
301
302 if (element = MochiKit.DOM.getElement(this.params.id)) {
303 if (this.match(element)) {
304 if (!scope || inScope(element, scope)) {
305 return [element];
306 }
307 }
308 }
309
310 function nextSiblingElement(node) {
311 node = node.nextSibling;
312 while (node && node.nodeType != 1) {
313 node = node.nextSibling;
314 }
315 return node;
316 }
317
318 if (axis == "") {
319 scope = (scope || MochiKit.DOM.currentDocument()).getElementsByTagName(this.params.tagName || '*');
320 } else if (axis == ">") {
321 if (!scope) {
322 throw "> combinator not allowed without preceeding expression";
323 }
324 scope = MochiKit.Base.filter(function (node) {
325 return node.nodeType == 1;
326 }, scope.childNodes);
327 } else if (axis == "+") {
328 if (!scope) {
329 throw "+ combinator not allowed without preceeding expression";
330 }
331 scope = nextSiblingElement(scope) && [nextSiblingElement(scope)];
332 } else if (axis == "~") {
333 if (!scope) {
334 throw "~ combinator not allowed without preceeding expression";
335 }
336 var newscope = [];
337 while (nextSiblingElement(scope)) {
338 scope = nextSiblingElement(scope);
339 newscope.push(scope);
340 }
341 scope = newscope;
342 }
343
344 if (!scope) {
345 return [];
346 }
347
348 var results = MochiKit.Base.filter(MochiKit.Base.bind(function (scopeElt) {
349 return this.match(scopeElt);
350 }, this), scope);
351
352 return results;
353 },
354
355 /** @id MochiKit.Selector.Selector.prototype.repr */
356 repr: function () {
357 return 'Selector(' + this.expression + ')';
358 },
359
360 toString: MochiKit.Base.forwardCall("repr")
361};
362
363MochiKit.Base.update(MochiKit.Selector, {
364
365 /** @id MochiKit.Selector.findChildElements */
366 findChildElements: function (element, expressions) {
367 element = MochiKit.DOM.getElement(element);
368 var uniq = function(arr) {
369 var res = [];
370 for (var i = 0; i < arr.length; i++) {
371 if (MochiKit.Base.findIdentical(res, arr[i]) < 0) {
372 res.push(arr[i]);
373 }
374 }
375 return res;
376 };
377 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (expression) {
378 try {
379 var res = element.querySelectorAll(expression);
380 return Array.prototype.slice.call(res, 0);
381 } catch (ignore) {
382 // No querySelectorAll or extended expression syntax used
383 }
384 var nextScope = "";
385 var reducer = function (results, expr) {
386 var match = expr.match(/^[>+~]$/);
387 if (match) {
388 nextScope = match[0];
389 return results;
390 } else {
391 var selector = new MochiKit.Selector.Selector(expr);
392 var elements = MochiKit.Iter.reduce(function (elements, result) {
393 return MochiKit.Base.extend(elements, selector.findElements(result || element, nextScope));
394 }, results, []);
395 nextScope = "";
396 return elements;
397 }
398 };
399 var exprs = expression.replace(/(^\s+|\s+$)/g, '').split(/\s+/);
400 return uniq(MochiKit.Iter.reduce(reducer, exprs, [null]));
401 }, expressions));
402 },
403
404 findDocElements: function () {
405 return MochiKit.Selector.findChildElements(MochiKit.DOM.currentDocument(), arguments);
406 },
407
408 __new__: function () {
409 this.$$ = this.findDocElements;
410 MochiKit.Base.nameFunctions(this);
411 }
412});
413
414MochiKit.Selector.__new__();
415
416MochiKit.Base._exportSymbols(this, MochiKit.Selector);
diff --git a/frontend/delta/js/MochiKit/Signal.js b/frontend/delta/js/MochiKit/Signal.js
new file mode 100644
index 0000000..58d0363
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Signal.js
@@ -0,0 +1,924 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Signal 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Signal', '1.5', ['Base', 'DOM']);
35
36MochiKit.Signal._observers = [];
37
38/** @id MochiKit.Signal.Event */
39MochiKit.Signal.Event = function (src, e) {
40 this._event = e || window.event;
41 this._src = src;
42};
43MochiKit.Signal.Event.__export__ = false;
44
45MochiKit.Base.update(MochiKit.Signal.Event.prototype, {
46
47 __repr__: function () {
48 var repr = MochiKit.Base.repr;
49 var str = '{event(): ' + repr(this.event()) +
50 ', src(): ' + repr(this.src()) +
51 ', type(): ' + repr(this.type()) +
52 ', target(): ' + repr(this.target());
53
54 if (this.type() &&
55 this.type().indexOf('key') === 0 ||
56 this.type().indexOf('mouse') === 0 ||
57 this.type().indexOf('click') != -1 ||
58 this.type() == 'contextmenu') {
59 str += ', modifier(): ' + '{alt: ' + repr(this.modifier().alt) +
60 ', ctrl: ' + repr(this.modifier().ctrl) +
61 ', meta: ' + repr(this.modifier().meta) +
62 ', shift: ' + repr(this.modifier().shift) +
63 ', any: ' + repr(this.modifier().any) + '}';
64 }
65
66 if (this.type() && this.type().indexOf('key') === 0) {
67 str += ', key(): {code: ' + repr(this.key().code) +
68 ', string: ' + repr(this.key().string) + '}';
69 }
70
71 if (this.type() && (
72 this.type().indexOf('mouse') === 0 ||
73 this.type().indexOf('click') != -1 ||
74 this.type() == 'contextmenu')) {
75
76 str += ', mouse(): {page: ' + repr(this.mouse().page) +
77 ', client: ' + repr(this.mouse().client);
78
79 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
80 str += ', button: {left: ' + repr(this.mouse().button.left) +
81 ', middle: ' + repr(this.mouse().button.middle) +
82 ', right: ' + repr(this.mouse().button.right) + '}';
83 }
84 if (this.type() == 'mousewheel') {
85 str += ', wheel: ' + repr(this.mouse().wheel);
86 }
87 str += '}';
88 }
89 if (this.type() == 'mouseover' || this.type() == 'mouseout' ||
90 this.type() == 'mouseenter' || this.type() == 'mouseleave') {
91 str += ', relatedTarget(): ' + repr(this.relatedTarget());
92 }
93 str += '}';
94 return str;
95 },
96
97 /** @id MochiKit.Signal.Event.prototype.toString */
98 toString: function () {
99 return this.__repr__();
100 },
101
102 /** @id MochiKit.Signal.Event.prototype.src */
103 src: function () {
104 return this._src;
105 },
106
107 /** @id MochiKit.Signal.Event.prototype.event */
108 event: function () {
109 return this._event;
110 },
111
112 /** @id MochiKit.Signal.Event.prototype.type */
113 type: function () {
114 if (this._event.type === "DOMMouseScroll") {
115 return "mousewheel";
116 } else {
117 return this._event.type || undefined;
118 }
119 },
120
121 /** @id MochiKit.Signal.Event.prototype.target */
122 target: function () {
123 return this._event.target || this._event.srcElement;
124 },
125
126 _relatedTarget: null,
127 /** @id MochiKit.Signal.Event.prototype.relatedTarget */
128 relatedTarget: function () {
129 if (this._relatedTarget !== null) {
130 return this._relatedTarget;
131 }
132
133 var elem = null;
134 if (this.type() == 'mouseover' || this.type() == 'mouseenter') {
135 elem = (this._event.relatedTarget ||
136 this._event.fromElement);
137 } else if (this.type() == 'mouseout' || this.type() == 'mouseleave') {
138 elem = (this._event.relatedTarget ||
139 this._event.toElement);
140 }
141 try {
142 if (elem !== null && elem.nodeType !== null) {
143 this._relatedTarget = elem;
144 return elem;
145 }
146 } catch (ignore) {
147 // Firefox 3 throws a permission denied error when accessing
148 // any property on XUL elements (e.g. scrollbars)...
149 }
150
151 return undefined;
152 },
153
154 _modifier: null,
155 /** @id MochiKit.Signal.Event.prototype.modifier */
156 modifier: function () {
157 if (this._modifier !== null) {
158 return this._modifier;
159 }
160 var m = {};
161 m.alt = this._event.altKey;
162 m.ctrl = this._event.ctrlKey;
163 m.meta = this._event.metaKey || false; // IE and Opera punt here
164 m.shift = this._event.shiftKey;
165 m.any = m.alt || m.ctrl || m.shift || m.meta;
166 this._modifier = m;
167 return m;
168 },
169
170 _key: null,
171 /** @id MochiKit.Signal.Event.prototype.key */
172 key: function () {
173 if (this._key !== null) {
174 return this._key;
175 }
176 var k = {};
177 if (this.type() && this.type().indexOf('key') === 0) {
178
179 /*
180
181 If you're looking for a special key, look for it in keydown or
182 keyup, but never keypress. If you're looking for a Unicode
183 chracter, look for it with keypress, but never keyup or
184 keydown.
185
186 Notes:
187
188 FF key event behavior:
189 key event charCode keyCode
190 DOWN ku,kd 0 40
191 DOWN kp 0 40
192 ESC ku,kd 0 27
193 ESC kp 0 27
194 a ku,kd 0 65
195 a kp 97 0
196 shift+a ku,kd 0 65
197 shift+a kp 65 0
198 1 ku,kd 0 49
199 1 kp 49 0
200 shift+1 ku,kd 0 0
201 shift+1 kp 33 0
202
203 IE key event behavior:
204 (IE doesn't fire keypress events for special keys.)
205 key event keyCode
206 DOWN ku,kd 40
207 DOWN kp undefined
208 ESC ku,kd 27
209 ESC kp 27
210 a ku,kd 65
211 a kp 97
212 shift+a ku,kd 65
213 shift+a kp 65
214 1 ku,kd 49
215 1 kp 49
216 shift+1 ku,kd 49
217 shift+1 kp 33
218
219 Safari key event behavior:
220 (Safari sets charCode and keyCode to something crazy for
221 special keys.)
222 key event charCode keyCode
223 DOWN ku,kd 63233 40
224 DOWN kp 63233 63233
225 ESC ku,kd 27 27
226 ESC kp 27 27
227 a ku,kd 97 65
228 a kp 97 97
229 shift+a ku,kd 65 65
230 shift+a kp 65 65
231 1 ku,kd 49 49
232 1 kp 49 49
233 shift+1 ku,kd 33 49
234 shift+1 kp 33 33
235
236 */
237
238 /* look for special keys here */
239 if (this.type() == 'keydown' || this.type() == 'keyup') {
240 k.code = this._event.keyCode;
241 k.string = (MochiKit.Signal._specialKeys[k.code] ||
242 'KEY_UNKNOWN');
243 this._key = k;
244 return k;
245
246 /* look for characters here */
247 } else if (this.type() == 'keypress') {
248
249 /*
250
251 Special key behavior:
252
253 IE: does not fire keypress events for special keys
254 FF: sets charCode to 0, and sets the correct keyCode
255 Safari: sets keyCode and charCode to something stupid
256
257 */
258
259 k.code = 0;
260 k.string = '';
261
262 if (typeof(this._event.charCode) != 'undefined' &&
263 this._event.charCode !== 0 &&
264 !MochiKit.Signal._specialMacKeys[this._event.charCode]) {
265 k.code = this._event.charCode;
266 k.string = String.fromCharCode(k.code);
267 } else if (this._event.keyCode &&
268 typeof(this._event.charCode) == 'undefined') { // IE
269 k.code = this._event.keyCode;
270 k.string = String.fromCharCode(k.code);
271 }
272
273 this._key = k;
274 return k;
275 }
276 }
277 return undefined;
278 },
279
280 _mouse: null,
281 /** @id MochiKit.Signal.Event.prototype.mouse */
282 mouse: function () {
283 if (this._mouse !== null) {
284 return this._mouse;
285 }
286
287 var m = {};
288 var e = this._event;
289
290 if (this.type() && (
291 this.type().indexOf('mouse') === 0 ||
292 this.type().indexOf('drag') === 0 ||
293 this.type().indexOf('click') != -1 ||
294 this.type() == 'contextmenu')) {
295
296 m.client = { x: 0, y: 0 };
297 if (e.clientX || e.clientY) {
298 m.client.x = (!e.clientX || e.clientX < 0) ? 0 : e.clientX;
299 m.client.y = (!e.clientY || e.clientY < 0) ? 0 : e.clientY;
300 }
301
302 m.page = { x: 0, y: 0 };
303 if (e.pageX || e.pageY) {
304 m.page.x = (!e.pageX || e.pageX < 0) ? 0 : e.pageX;
305 m.page.y = (!e.pageY || e.pageY < 0) ? 0 : e.pageY;
306 } else {
307 /*
308
309 The IE shortcut can be off by two. We fix it. See:
310 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
311
312 This is similar to the method used in
313 MochiKit.Style.getElementPosition().
314
315 */
316 var de = MochiKit.DOM._document.documentElement;
317 var b = MochiKit.DOM._document.body;
318
319 m.page.x = e.clientX +
320 (de.scrollLeft || b.scrollLeft) -
321 (de.clientLeft || 0);
322
323 m.page.y = e.clientY +
324 (de.scrollTop || b.scrollTop) -
325 (de.clientTop || 0);
326
327 }
328 if (this.type() != 'mousemove' && this.type() != 'mousewheel') {
329 m.button = {};
330 m.button.left = false;
331 m.button.right = false;
332 m.button.middle = false;
333
334 /* we could check e.button, but which is more consistent */
335 if (e.which) {
336 m.button.left = (e.which == 1);
337 m.button.middle = (e.which == 2);
338 m.button.right = (e.which == 3);
339
340 /*
341
342 Mac browsers and right click:
343
344 - Safari doesn't fire any click events on a right
345 click:
346 http://bugs.webkit.org/show_bug.cgi?id=6595
347
348 - Firefox fires the event, and sets ctrlKey = true
349
350 - Opera fires the event, and sets metaKey = true
351
352 oncontextmenu is fired on right clicks between
353 browsers and across platforms.
354
355 */
356
357 } else {
358 m.button.left = !!(e.button & 1);
359 m.button.right = !!(e.button & 2);
360 m.button.middle = !!(e.button & 4);
361 }
362 }
363 if (this.type() == 'mousewheel') {
364 m.wheel = { x: 0, y: 0 };
365 if (e.wheelDeltaX || e.wheelDeltaY) {
366 m.wheel.x = e.wheelDeltaX / -40 || 0;
367 m.wheel.y = e.wheelDeltaY / -40 || 0;
368 } else if (e.wheelDelta) {
369 m.wheel.y = e.wheelDelta / -40;
370 } else {
371 m.wheel.y = e.detail || 0;
372 }
373 }
374 this._mouse = m;
375 return m;
376 }
377 return undefined;
378 },
379
380 /** @id MochiKit.Signal.Event.prototype.stop */
381 stop: function () {
382 this.stopPropagation();
383 this.preventDefault();
384 },
385
386 /** @id MochiKit.Signal.Event.prototype.stopPropagation */
387 stopPropagation: function () {
388 if (this._event.stopPropagation) {
389 this._event.stopPropagation();
390 } else {
391 this._event.cancelBubble = true;
392 }
393 },
394
395 /** @id MochiKit.Signal.Event.prototype.preventDefault */
396 preventDefault: function () {
397 if (this._event.preventDefault) {
398 this._event.preventDefault();
399 } else if (this._confirmUnload === null) {
400 this._event.returnValue = false;
401 }
402 },
403
404 _confirmUnload: null,
405
406 /** @id MochiKit.Signal.Event.prototype.confirmUnload */
407 confirmUnload: function (msg) {
408 if (this.type() == 'beforeunload') {
409 this._confirmUnload = msg;
410 this._event.returnValue = msg;
411 }
412 }
413});
414
415/* Safari sets keyCode to these special values onkeypress. */
416MochiKit.Signal._specialMacKeys = {
417 3: 'KEY_ENTER',
418 63289: 'KEY_NUM_PAD_CLEAR',
419 63276: 'KEY_PAGE_UP',
420 63277: 'KEY_PAGE_DOWN',
421 63275: 'KEY_END',
422 63273: 'KEY_HOME',
423 63234: 'KEY_ARROW_LEFT',
424 63232: 'KEY_ARROW_UP',
425 63235: 'KEY_ARROW_RIGHT',
426 63233: 'KEY_ARROW_DOWN',
427 63302: 'KEY_INSERT',
428 63272: 'KEY_DELETE'
429};
430
431/* for KEY_F1 - KEY_F12 */
432(function () {
433 var _specialMacKeys = MochiKit.Signal._specialMacKeys;
434 for (var i = 63236; i <= 63242; i++) {
435 // no F0
436 _specialMacKeys[i] = 'KEY_F' + (i - 63236 + 1);
437 }
438})();
439
440/* Standard keyboard key codes. */
441MochiKit.Signal._specialKeys = {
442 8: 'KEY_BACKSPACE',
443 9: 'KEY_TAB',
444 12: 'KEY_NUM_PAD_CLEAR', // weird, for Safari and Mac FF only
445 13: 'KEY_ENTER',
446 16: 'KEY_SHIFT',
447 17: 'KEY_CTRL',
448 18: 'KEY_ALT',
449 19: 'KEY_PAUSE',
450 20: 'KEY_CAPS_LOCK',
451 27: 'KEY_ESCAPE',
452 32: 'KEY_SPACEBAR',
453 33: 'KEY_PAGE_UP',
454 34: 'KEY_PAGE_DOWN',
455 35: 'KEY_END',
456 36: 'KEY_HOME',
457 37: 'KEY_ARROW_LEFT',
458 38: 'KEY_ARROW_UP',
459 39: 'KEY_ARROW_RIGHT',
460 40: 'KEY_ARROW_DOWN',
461 44: 'KEY_PRINT_SCREEN',
462 45: 'KEY_INSERT',
463 46: 'KEY_DELETE',
464 59: 'KEY_SEMICOLON', // weird, for Safari and IE only
465 91: 'KEY_WINDOWS_LEFT',
466 92: 'KEY_WINDOWS_RIGHT',
467 93: 'KEY_SELECT',
468 106: 'KEY_NUM_PAD_ASTERISK',
469 107: 'KEY_NUM_PAD_PLUS_SIGN',
470 109: 'KEY_NUM_PAD_HYPHEN-MINUS',
471 110: 'KEY_NUM_PAD_FULL_STOP',
472 111: 'KEY_NUM_PAD_SOLIDUS',
473 144: 'KEY_NUM_LOCK',
474 145: 'KEY_SCROLL_LOCK',
475 186: 'KEY_SEMICOLON',
476 187: 'KEY_EQUALS_SIGN',
477 188: 'KEY_COMMA',
478 189: 'KEY_HYPHEN-MINUS',
479 190: 'KEY_FULL_STOP',
480 191: 'KEY_SOLIDUS',
481 192: 'KEY_GRAVE_ACCENT',
482 219: 'KEY_LEFT_SQUARE_BRACKET',
483 220: 'KEY_REVERSE_SOLIDUS',
484 221: 'KEY_RIGHT_SQUARE_BRACKET',
485 222: 'KEY_APOSTROPHE'
486 // undefined: 'KEY_UNKNOWN'
487};
488
489(function () {
490 /* for KEY_0 - KEY_9 */
491 var _specialKeys = MochiKit.Signal._specialKeys;
492 for (var i = 48; i <= 57; i++) {
493 _specialKeys[i] = 'KEY_' + (i - 48);
494 }
495
496 /* for KEY_A - KEY_Z */
497 for (i = 65; i <= 90; i++) {
498 _specialKeys[i] = 'KEY_' + String.fromCharCode(i);
499 }
500
501 /* for KEY_NUM_PAD_0 - KEY_NUM_PAD_9 */
502 for (i = 96; i <= 105; i++) {
503 _specialKeys[i] = 'KEY_NUM_PAD_' + (i - 96);
504 }
505
506 /* for KEY_F1 - KEY_F12 */
507 for (i = 112; i <= 123; i++) {
508 // no F0
509 _specialKeys[i] = 'KEY_F' + (i - 112 + 1);
510 }
511})();
512
513/* Internal object to keep track of created signals. */
514MochiKit.Signal.Ident = function (ident) {
515 this.source = ident.source;
516 this.signal = ident.signal;
517 this.listener = ident.listener;
518 this.isDOM = ident.isDOM;
519 this.objOrFunc = ident.objOrFunc;
520 this.funcOrStr = ident.funcOrStr;
521 this.connected = ident.connected;
522};
523MochiKit.Signal.Ident.__export__ = false;
524MochiKit.Signal.Ident.prototype = {};
525
526MochiKit.Base.update(MochiKit.Signal, {
527
528 _unloadCache: function () {
529 var self = MochiKit.Signal;
530 var observers = self._observers;
531
532 for (var i = 0; i < observers.length; i++) {
533 if (observers[i].signal !== 'onload' && observers[i].signal !== 'onunload') {
534 self._disconnect(observers[i]);
535 }
536 }
537 },
538
539 _listener: function (src, sig, func, obj, isDOM) {
540 var self = MochiKit.Signal;
541 var E = self.Event;
542 if (!isDOM) {
543 /* We don't want to re-bind already bound methods */
544 if (typeof(func.im_self) == 'undefined') {
545 return MochiKit.Base.bindLate(func, obj);
546 } else {
547 return func;
548 }
549 }
550 obj = obj || src;
551 if (typeof(func) == "string") {
552 if (sig === 'onload' || sig === 'onunload') {
553 return function (nativeEvent) {
554 obj[func].apply(obj, [new E(src, nativeEvent)]);
555
556 var ident = new MochiKit.Signal.Ident({
557 source: src, signal: sig, objOrFunc: obj, funcOrStr: func});
558
559 MochiKit.Signal._disconnect(ident);
560 };
561 } else {
562 return function (nativeEvent) {
563 obj[func].apply(obj, [new E(src, nativeEvent)]);
564 };
565 }
566 } else {
567 if (sig === 'onload' || sig === 'onunload') {
568 return function (nativeEvent) {
569 func.apply(obj, [new E(src, nativeEvent)]);
570
571 var ident = new MochiKit.Signal.Ident({
572 source: src, signal: sig, objOrFunc: func});
573
574 MochiKit.Signal._disconnect(ident);
575 };
576 } else {
577 return function (nativeEvent) {
578 func.apply(obj, [new E(src, nativeEvent)]);
579 };
580 }
581 }
582 },
583
584 _browserAlreadyHasMouseEnterAndLeave: function () {
585 return /MSIE/.test(navigator.userAgent);
586 },
587
588 _browserLacksMouseWheelEvent: function () {
589 return /Gecko\//.test(navigator.userAgent);
590 },
591
592 _mouseEnterListener: function (src, sig, func, obj) {
593 var E = MochiKit.Signal.Event;
594 return function (nativeEvent) {
595 var e = new E(src, nativeEvent);
596 try {
597 e.relatedTarget().nodeName;
598 } catch (err) {
599 /* probably hit a permission denied error; possibly one of
600 * firefox's screwy anonymous DIVs inside an input element.
601 * Allow this event to propogate up.
602 */
603 return;
604 }
605 e.stop();
606 if (MochiKit.DOM.isChildNode(e.relatedTarget(), src)) {
607 /* We've moved between our node and a child. Ignore. */
608 return;
609 }
610 e.type = function () { return sig; };
611 if (typeof(func) == "string") {
612 return obj[func].apply(obj, [e]);
613 } else {
614 return func.apply(obj, [e]);
615 }
616 };
617 },
618
619 _getDestPair: function (objOrFunc, funcOrStr) {
620 var obj = null;
621 var func = null;
622 if (typeof(funcOrStr) != 'undefined') {
623 obj = objOrFunc;
624 func = funcOrStr;
625 if (typeof(funcOrStr) == 'string') {
626 if (typeof(objOrFunc[funcOrStr]) != "function") {
627 throw new Error("'funcOrStr' must be a function on 'objOrFunc'");
628 }
629 } else if (typeof(funcOrStr) != 'function') {
630 throw new Error("'funcOrStr' must be a function or string");
631 }
632 } else if (typeof(objOrFunc) != "function") {
633 throw new Error("'objOrFunc' must be a function if 'funcOrStr' is not given");
634 } else {
635 func = objOrFunc;
636 }
637 return [obj, func];
638 },
639
640 /** @id MochiKit.Signal.connect */
641 connect: function (src, sig, objOrFunc/* optional */, funcOrStr) {
642 if (typeof(src) == "string") {
643 src = MochiKit.DOM.getElement(src);
644 }
645 var self = MochiKit.Signal;
646
647 if (typeof(sig) != 'string') {
648 throw new Error("'sig' must be a string");
649 }
650
651 var destPair = self._getDestPair(objOrFunc, funcOrStr);
652 var obj = destPair[0];
653 var func = destPair[1];
654 if (typeof(obj) == 'undefined' || obj === null) {
655 obj = src;
656 }
657
658 var isDOM = !!(src.addEventListener || src.attachEvent);
659 if (isDOM && (sig === "onmouseenter" || sig === "onmouseleave")
660 && !self._browserAlreadyHasMouseEnterAndLeave()) {
661 var listener = self._mouseEnterListener(src, sig.substr(2), func, obj);
662 if (sig === "onmouseenter") {
663 sig = "onmouseover";
664 } else {
665 sig = "onmouseout";
666 }
667 } else if (isDOM && sig == "onmousewheel" && self._browserLacksMouseWheelEvent()) {
668 var listener = self._listener(src, sig, func, obj, isDOM);
669 sig = "onDOMMouseScroll";
670 } else {
671 var listener = self._listener(src, sig, func, obj, isDOM);
672 }
673
674 if (src.addEventListener) {
675 src.addEventListener(sig.substr(2), listener, false);
676 } else if (src.attachEvent) {
677 src.attachEvent(sig, listener); // useCapture unsupported
678 }
679
680 var ident = new MochiKit.Signal.Ident({
681 source: src,
682 signal: sig,
683 listener: listener,
684 isDOM: isDOM,
685 objOrFunc: objOrFunc,
686 funcOrStr: funcOrStr,
687 connected: true
688 });
689 self._observers.push(ident);
690
691 if (!isDOM && typeof(src.__connect__) == 'function') {
692 var args = MochiKit.Base.extend([ident], arguments, 1);
693 src.__connect__.apply(src, args);
694 }
695
696 return ident;
697 },
698
699 /** @id MochiKit.Signal.connectOnce */
700 connectOnce: function (src, sig, objOrFunc/* optional */, funcOrStr) {
701 var self = MochiKit.Signal;
702 var ident1 = self.connect(src, sig, objOrFunc, funcOrStr);
703 var ident2;
704 ident2 = self.connect(src, sig, function() {
705 self.disconnect(ident1);
706 self.disconnect(ident2);
707 });
708 return ident1;
709 },
710
711 _disconnect: function (ident) {
712 // already disconnected
713 if (!ident.connected) {
714 return;
715 }
716 ident.connected = false;
717 var src = ident.source;
718 var sig = ident.signal;
719 var listener = ident.listener;
720 // check isDOM
721 if (!ident.isDOM) {
722 if (typeof(src.__disconnect__) == 'function') {
723 src.__disconnect__(ident, sig, ident.objOrFunc, ident.funcOrStr);
724 }
725 return;
726 }
727 if (src.removeEventListener) {
728 src.removeEventListener(sig.substr(2), listener, false);
729 } else if (src.detachEvent) {
730 src.detachEvent(sig, listener); // useCapture unsupported
731 } else {
732 throw new Error("'src' must be a DOM element");
733 }
734 },
735
736 /** @id MochiKit.Signal.disconnect */
737 disconnect: function (ident) {
738 var self = MochiKit.Signal;
739 var observers = self._observers;
740 var m = MochiKit.Base;
741 if (arguments.length > 1) {
742 // compatibility API
743 var src = arguments[0];
744 if (typeof(src) == "string") {
745 src = MochiKit.DOM.getElement(src);
746 }
747 var sig = arguments[1];
748 var obj = arguments[2];
749 var func = arguments[3];
750 for (var i = observers.length - 1; i >= 0; i--) {
751 var o = observers[i];
752 if (o.source === src && o.signal === sig && o.objOrFunc === obj && o.funcOrStr === func) {
753 self._disconnect(o);
754 if (self._lock === 0) {
755 observers.splice(i, 1);
756 } else {
757 self._dirty = true;
758 }
759 return true;
760 }
761 }
762 } else {
763 var idx = m.findIdentical(observers, ident);
764 if (idx >= 0) {
765 self._disconnect(ident);
766 if (self._lock === 0) {
767 observers.splice(idx, 1);
768 } else {
769 self._dirty = true;
770 }
771 return true;
772 }
773 }
774 return false;
775 },
776
777 /** @id MochiKit.Signal.disconnectAllTo */
778 disconnectAllTo: function (objOrFunc, /* optional */funcOrStr) {
779 var self = MochiKit.Signal;
780 var observers = self._observers;
781 var disconnect = self._disconnect;
782 var lock = self._lock;
783 var dirty = self._dirty;
784 if (typeof(funcOrStr) === 'undefined') {
785 funcOrStr = null;
786 }
787 for (var i = observers.length - 1; i >= 0; i--) {
788 var ident = observers[i];
789 if (ident.objOrFunc === objOrFunc &&
790 (funcOrStr === null || ident.funcOrStr === funcOrStr)) {
791 disconnect(ident);
792 if (lock === 0) {
793 observers.splice(i, 1);
794 } else {
795 dirty = true;
796 }
797 }
798 }
799 self._dirty = dirty;
800 },
801
802 /** @id MochiKit.Signal.disconnectAll */
803 disconnectAll: function (src/* optional */, sig) {
804 if (typeof(src) == "string") {
805 src = MochiKit.DOM.getElement(src);
806 }
807 var m = MochiKit.Base;
808 var signals = m.flattenArguments(m.extend(null, arguments, 1));
809 var self = MochiKit.Signal;
810 var disconnect = self._disconnect;
811 var observers = self._observers;
812 var i, ident;
813 var lock = self._lock;
814 var dirty = self._dirty;
815 if (signals.length === 0) {
816 // disconnect all
817 for (i = observers.length - 1; i >= 0; i--) {
818 ident = observers[i];
819 if (ident.source === src) {
820 disconnect(ident);
821 if (lock === 0) {
822 observers.splice(i, 1);
823 } else {
824 dirty = true;
825 }
826 }
827 }
828 } else {
829 var sigs = {};
830 for (i = 0; i < signals.length; i++) {
831 sigs[signals[i]] = true;
832 }
833 for (i = observers.length - 1; i >= 0; i--) {
834 ident = observers[i];
835 if (ident.source === src && ident.signal in sigs) {
836 disconnect(ident);
837 if (lock === 0) {
838 observers.splice(i, 1);
839 } else {
840 dirty = true;
841 }
842 }
843 }
844 }
845 self._dirty = dirty;
846 },
847
848 /** @id MochiKit.Signal.signal */
849 signal: function (src, sig) {
850 var self = MochiKit.Signal;
851 var observers = self._observers;
852 if (typeof(src) == "string") {
853 src = MochiKit.DOM.getElement(src);
854 }
855 var args = MochiKit.Base.extend(null, arguments, 2);
856 var errors = [];
857 self._lock++;
858 for (var i = 0; i < observers.length; i++) {
859 var ident = observers[i];
860 if (ident.source === src && ident.signal === sig &&
861 ident.connected) {
862 try {
863 if (ident.isDOM && ident.funcOrStr != null) {
864 var obj = ident.objOrFunc;
865 obj[ident.funcOrStr].apply(obj, args);
866 } else if (ident.isDOM) {
867 ident.objOrFunc.apply(src, args);
868 } else {
869 ident.listener.apply(src, args);
870 }
871 } catch (e) {
872 errors.push(e);
873 }
874 }
875 }
876 self._lock--;
877 if (self._lock === 0 && self._dirty) {
878 self._dirty = false;
879 for (var i = observers.length - 1; i >= 0; i--) {
880 if (!observers[i].connected) {
881 observers.splice(i, 1);
882 }
883 }
884 }
885 if (errors.length == 1) {
886 throw errors[0];
887 } else if (errors.length > 1) {
888 var e = new Error("Multiple errors thrown in handling 'sig', see errors property");
889 e.errors = errors;
890 throw e;
891 }
892 }
893
894});
895
896MochiKit.Signal.__new__ = function (win) {
897 var m = MochiKit.Base;
898 this._document = document;
899 this._window = win;
900 this._lock = 0;
901 this._dirty = false;
902
903 try {
904 this.connect(window, 'onunload', this._unloadCache);
905 } catch (e) {
906 // pass: might not be a browser
907 }
908
909 m.nameFunctions(this);
910};
911
912MochiKit.Signal.__new__(this);
913
914//
915// XXX: Internet Explorer blows
916//
917if (MochiKit.__export__) {
918 connect = MochiKit.Signal.connect;
919 disconnect = MochiKit.Signal.disconnect;
920 disconnectAll = MochiKit.Signal.disconnectAll;
921 signal = MochiKit.Signal.signal;
922}
923
924MochiKit.Base._exportSymbols(this, MochiKit.Signal);
diff --git a/frontend/delta/js/MochiKit/Sortable.js b/frontend/delta/js/MochiKit/Sortable.js
new file mode 100644
index 0000000..49ea390
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Sortable.js
@@ -0,0 +1,592 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
26 Mochi-ized By Thomas Herve (_firstname_@nimail.org)
27
28See scriptaculous.js for full license.
29
30***/
31
32MochiKit.Base.module(MochiKit, 'Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']);
33
34MochiKit.Base.update(MochiKit.Sortable, {
35 __export__: false,
36
37 /***
38
39 Manage sortables. Mainly use the create function to add a sortable.
40
41 ***/
42 sortables: {},
43
44 _findRootElement: function (element) {
45 while (element.tagName.toUpperCase() != "BODY") {
46 if (element.id && MochiKit.Sortable.sortables[element.id]) {
47 return element;
48 }
49 element = element.parentNode;
50 }
51 },
52
53 _createElementId: function(element) {
54 if (element.id == null || element.id == "") {
55 var d = MochiKit.DOM;
56 var id;
57 var count = 1;
58 while (d.getElement(id = "sortable" + count) != null) {
59 count += 1;
60 }
61 d.setNodeAttribute(element, "id", id);
62 }
63 },
64
65 /** @id MochiKit.Sortable.options */
66 options: function (element) {
67 element = MochiKit.Sortable._findRootElement(MochiKit.DOM.getElement(element));
68 if (!element) {
69 return;
70 }
71 return MochiKit.Sortable.sortables[element.id];
72 },
73
74 /** @id MochiKit.Sortable.destroy */
75 destroy: function (element){
76 var s = MochiKit.Sortable.options(element);
77 var b = MochiKit.Base;
78 var d = MochiKit.DragAndDrop;
79
80 if (s) {
81 MochiKit.Signal.disconnect(s.startHandle);
82 MochiKit.Signal.disconnect(s.endHandle);
83 b.map(function (dr) {
84 d.Droppables.remove(dr);
85 }, s.droppables);
86 b.map(function (dr) {
87 dr.destroy();
88 }, s.draggables);
89
90 delete MochiKit.Sortable.sortables[s.element.id];
91 }
92 },
93
94 /** @id MochiKit.Sortable.create */
95 create: function (element, options) {
96 element = MochiKit.DOM.getElement(element);
97 var self = MochiKit.Sortable;
98 self._createElementId(element);
99
100 /** @id MochiKit.Sortable.options */
101 options = MochiKit.Base.update({
102
103 /** @id MochiKit.Sortable.element */
104 element: element,
105
106 /** @id MochiKit.Sortable.tag */
107 tag: 'li', // assumes li children, override with tag: 'tagname'
108
109 /** @id MochiKit.Sortable.dropOnEmpty */
110 dropOnEmpty: false,
111
112 /** @id MochiKit.Sortable.tree */
113 tree: false,
114
115 /** @id MochiKit.Sortable.treeTag */
116 treeTag: 'ul',
117
118 /** @id MochiKit.Sortable.overlap */
119 overlap: 'vertical', // one of 'vertical', 'horizontal'
120
121 /** @id MochiKit.Sortable.constraint */
122 constraint: 'vertical', // one of 'vertical', 'horizontal', false
123 // also takes array of elements (or ids); or false
124
125 /** @id MochiKit.Sortable.containment */
126 containment: [element],
127
128 /** @id MochiKit.Sortable.handle */
129 handle: false, // or a CSS class
130
131 /** @id MochiKit.Sortable.only */
132 only: false,
133
134 /** @id MochiKit.Sortable.hoverclass */
135 hoverclass: null,
136
137 /** @id MochiKit.Sortable.ghosting */
138 ghosting: false,
139
140 /** @id MochiKit.Sortable.scroll */
141 scroll: false,
142
143 /** @id MochiKit.Sortable.scrollSensitivity */
144 scrollSensitivity: 20,
145
146 /** @id MochiKit.Sortable.scrollSpeed */
147 scrollSpeed: 15,
148
149 /** @id MochiKit.Sortable.format */
150 format: /^[^_]*_(.*)$/,
151
152 /** @id MochiKit.Sortable.onChange */
153 onChange: MochiKit.Base.noop,
154
155 /** @id MochiKit.Sortable.onUpdate */
156 onUpdate: MochiKit.Base.noop,
157
158 /** @id MochiKit.Sortable.accept */
159 accept: null
160 }, options);
161
162 // clear any old sortable with same element
163 self.destroy(element);
164
165 // build options for the draggables
166 var options_for_draggable = {
167 revert: true,
168 ghosting: options.ghosting,
169 scroll: options.scroll,
170 scrollSensitivity: options.scrollSensitivity,
171 scrollSpeed: options.scrollSpeed,
172 constraint: options.constraint,
173 handle: options.handle
174 };
175
176 if (options.starteffect) {
177 options_for_draggable.starteffect = options.starteffect;
178 }
179
180 if (options.reverteffect) {
181 options_for_draggable.reverteffect = options.reverteffect;
182 } else if (options.ghosting) {
183 options_for_draggable.reverteffect = function (innerelement) {
184 innerelement.style.top = 0;
185 innerelement.style.left = 0;
186 };
187 }
188
189 if (options.endeffect) {
190 options_for_draggable.endeffect = options.endeffect;
191 }
192
193 if (options.zindex) {
194 options_for_draggable.zindex = options.zindex;
195 }
196
197 // build options for the droppables
198 var options_for_droppable = {
199 overlap: options.overlap,
200 containment: options.containment,
201 hoverclass: options.hoverclass,
202 onhover: self.onHover,
203 tree: options.tree,
204 accept: options.accept
205 };
206
207 var options_for_tree = {
208 onhover: self.onEmptyHover,
209 overlap: options.overlap,
210 containment: options.containment,
211 hoverclass: options.hoverclass,
212 accept: options.accept
213 };
214
215 // fix for gecko engine
216 MochiKit.DOM.removeEmptyTextNodes(element);
217
218 options.draggables = [];
219 options.droppables = [];
220
221 // drop on empty handling
222 if (options.dropOnEmpty || options.tree) {
223 new MochiKit.DragAndDrop.Droppable(element, options_for_tree);
224 options.droppables.push(element);
225 }
226 MochiKit.Base.map(function (e) {
227 // handles are per-draggable
228 var handle = options.handle ?
229 MochiKit.DOM.getFirstElementByTagAndClassName(null,
230 options.handle, e) : e;
231 options.draggables.push(
232 new MochiKit.DragAndDrop.Draggable(e,
233 MochiKit.Base.update(options_for_draggable,
234 {handle: handle})));
235 new MochiKit.DragAndDrop.Droppable(e, options_for_droppable);
236 if (options.tree) {
237 e.treeNode = element;
238 }
239 options.droppables.push(e);
240 }, (self.findElements(element, options) || []));
241
242 if (options.tree) {
243 MochiKit.Base.map(function (e) {
244 new MochiKit.DragAndDrop.Droppable(e, options_for_tree);
245 e.treeNode = element;
246 options.droppables.push(e);
247 }, (self.findTreeElements(element, options) || []));
248 }
249
250 // keep reference
251 self.sortables[element.id] = options;
252
253 options.lastValue = self.serialize(element);
254 options.startHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'start',
255 MochiKit.Base.partial(self.onStart, element));
256 options.endHandle = MochiKit.Signal.connect(MochiKit.DragAndDrop.Draggables, 'end',
257 MochiKit.Base.partial(self.onEnd, element));
258 },
259
260 /** @id MochiKit.Sortable.onStart */
261 onStart: function (element, draggable) {
262 var self = MochiKit.Sortable;
263 var options = self.options(element);
264 options.lastValue = self.serialize(options.element);
265 },
266
267 /** @id MochiKit.Sortable.onEnd */
268 onEnd: function (element, draggable) {
269 var self = MochiKit.Sortable;
270 self.unmark();
271 var options = self.options(element);
272 if (options.lastValue != self.serialize(options.element)) {
273 options.onUpdate(options.element);
274 }
275 },
276
277 // return all suitable-for-sortable elements in a guaranteed order
278
279 /** @id MochiKit.Sortable.findElements */
280 findElements: function (element, options) {
281 return MochiKit.Sortable.findChildren(element, options.only, options.tree, options.tag);
282 },
283
284 /** @id MochiKit.Sortable.findTreeElements */
285 findTreeElements: function (element, options) {
286 return MochiKit.Sortable.findChildren(
287 element, options.only, options.tree ? true : false, options.treeTag);
288 },
289
290 /** @id MochiKit.Sortable.findChildren */
291 findChildren: function (element, only, recursive, tagName) {
292 if (!element.hasChildNodes()) {
293 return null;
294 }
295 tagName = tagName.toUpperCase();
296 if (only) {
297 only = MochiKit.Base.flattenArray([only]);
298 }
299 var elements = [];
300 MochiKit.Base.map(function (e) {
301 if (e.tagName &&
302 e.tagName.toUpperCase() == tagName &&
303 (!only ||
304 MochiKit.Iter.some(only, function (c) {
305 return MochiKit.DOM.hasElementClass(e, c);
306 }))) {
307 elements.push(e);
308 }
309 if (recursive) {
310 var grandchildren = MochiKit.Sortable.findChildren(e, only, recursive, tagName);
311 if (grandchildren && grandchildren.length > 0) {
312 elements = elements.concat(grandchildren);
313 }
314 }
315 }, element.childNodes);
316 return elements;
317 },
318
319 /** @id MochiKit.Sortable.onHover */
320 onHover: function (element, dropon, overlap) {
321 if (MochiKit.DOM.isChildNode(dropon, element)) {
322 return;
323 }
324 var self = MochiKit.Sortable;
325
326 if (overlap > .33 && overlap < .66 && self.options(dropon).tree) {
327 return;
328 } else if (overlap > 0.5) {
329 self.mark(dropon, 'before');
330 if (dropon.previousSibling != element) {
331 var oldParentNode = element.parentNode;
332 element.style.visibility = 'hidden'; // fix gecko rendering
333 dropon.parentNode.insertBefore(element, dropon);
334 if (dropon.parentNode != oldParentNode) {
335 self.options(oldParentNode).onChange(element);
336 }
337 self.options(dropon.parentNode).onChange(element);
338 }
339 } else {
340 self.mark(dropon, 'after');
341 var nextElement = dropon.nextSibling || null;
342 if (nextElement != element) {
343 var oldParentNode = element.parentNode;
344 element.style.visibility = 'hidden'; // fix gecko rendering
345 dropon.parentNode.insertBefore(element, nextElement);
346 if (dropon.parentNode != oldParentNode) {
347 self.options(oldParentNode).onChange(element);
348 }
349 self.options(dropon.parentNode).onChange(element);
350 }
351 }
352 },
353
354 _offsetSize: function (element, type) {
355 if (type == 'vertical' || type == 'height') {
356 return element.offsetHeight;
357 } else {
358 return element.offsetWidth;
359 }
360 },
361
362 /** @id MochiKit.Sortable.onEmptyHover */
363 onEmptyHover: function (element, dropon, overlap) {
364 var oldParentNode = element.parentNode;
365 var self = MochiKit.Sortable;
366 var droponOptions = self.options(dropon);
367
368 if (!MochiKit.DOM.isChildNode(dropon, element)) {
369 var index;
370
371 var children = self.findElements(dropon, {tag: droponOptions.tag,
372 only: droponOptions.only});
373 var child = null;
374
375 if (children) {
376 var offset = self._offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
377
378 for (index = 0; index < children.length; index += 1) {
379 if (offset - self._offsetSize(children[index], droponOptions.overlap) >= 0) {
380 offset -= self._offsetSize(children[index], droponOptions.overlap);
381 } else if (offset - (self._offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
382 child = index + 1 < children.length ? children[index + 1] : null;
383 break;
384 } else {
385 child = children[index];
386 break;
387 }
388 }
389 }
390
391 dropon.insertBefore(element, child);
392
393 self.options(oldParentNode).onChange(element);
394 droponOptions.onChange(element);
395 }
396 },
397
398 /** @id MochiKit.Sortable.unmark */
399 unmark: function () {
400 var m = MochiKit.Sortable._marker;
401 if (m) {
402 MochiKit.Style.hideElement(m);
403 }
404 },
405
406 /** @id MochiKit.Sortable.mark */
407 mark: function (dropon, position) {
408 // mark on ghosting only
409 var d = MochiKit.DOM;
410 var self = MochiKit.Sortable;
411 var sortable = self.options(dropon.parentNode);
412 if (sortable && !sortable.ghosting) {
413 return;
414 }
415
416 if (!self._marker) {
417 self._marker = d.getElement('dropmarker') ||
418 document.createElement('DIV');
419 MochiKit.Style.hideElement(self._marker);
420 d.addElementClass(self._marker, 'dropmarker');
421 self._marker.style.position = 'absolute';
422 document.getElementsByTagName('body').item(0).appendChild(self._marker);
423 }
424 var offsets = MochiKit.Position.cumulativeOffset(dropon);
425 self._marker.style.left = offsets.x + 'px';
426 self._marker.style.top = offsets.y + 'px';
427
428 if (position == 'after') {
429 if (sortable.overlap == 'horizontal') {
430 self._marker.style.left = (offsets.x + dropon.clientWidth) + 'px';
431 } else {
432 self._marker.style.top = (offsets.y + dropon.clientHeight) + 'px';
433 }
434 }
435 MochiKit.Style.showElement(self._marker);
436 },
437
438 _tree: function (element, options, parent) {
439 var self = MochiKit.Sortable;
440 var children = self.findElements(element, options) || [];
441
442 for (var i = 0; i < children.length; ++i) {
443 var match = children[i].id.match(options.format);
444
445 if (!match) {
446 continue;
447 }
448
449 var child = {
450 id: encodeURIComponent(match ? match[1] : null),
451 element: element,
452 parent: parent,
453 children: [],
454 position: parent.children.length,
455 container: self._findChildrenElement(children[i], options.treeTag.toUpperCase())
456 };
457
458 /* Get the element containing the children and recurse over it */
459 if (child.container) {
460 self._tree(child.container, options, child);
461 }
462
463 parent.children.push (child);
464 }
465
466 return parent;
467 },
468
469 /* Finds the first element of the given tag type within a parent element.
470 Used for finding the first LI[ST] within a L[IST]I[TEM].*/
471 _findChildrenElement: function (element, containerTag) {
472 if (element && element.hasChildNodes) {
473 containerTag = containerTag.toUpperCase();
474 for (var i = 0; i < element.childNodes.length; ++i) {
475 if (element.childNodes[i].tagName.toUpperCase() == containerTag) {
476 return element.childNodes[i];
477 }
478 }
479 }
480 return null;
481 },
482
483 /** @id MochiKit.Sortable.tree */
484 tree: function (element, options) {
485 element = MochiKit.DOM.getElement(element);
486 var sortableOptions = MochiKit.Sortable.options(element);
487 options = MochiKit.Base.update({
488 tag: sortableOptions.tag,
489 treeTag: sortableOptions.treeTag,
490 only: sortableOptions.only,
491 name: element.id,
492 format: sortableOptions.format
493 }, options || {});
494
495 var root = {
496 id: null,
497 parent: null,
498 children: new Array,
499 container: element,
500 position: 0
501 };
502
503 return MochiKit.Sortable._tree(element, options, root);
504 },
505
506 /**
507 * Specifies the sequence for the Sortable.
508 * @param {Node} element Element to use as the Sortable.
509 * @param {Object} newSequence New sequence to use.
510 * @param {Object} options Options to use fro the Sortable.
511 */
512 setSequence: function (element, newSequence, options) {
513 var self = MochiKit.Sortable;
514 var b = MochiKit.Base;
515 element = MochiKit.DOM.getElement(element);
516 options = b.update(self.options(element), options || {});
517
518 var nodeMap = {};
519 b.map(function (n) {
520 var m = n.id.match(options.format);
521 if (m) {
522 nodeMap[m[1]] = [n, n.parentNode];
523 }
524 n.parentNode.removeChild(n);
525 }, self.findElements(element, options));
526
527 b.map(function (ident) {
528 var n = nodeMap[ident];
529 if (n) {
530 n[1].appendChild(n[0]);
531 delete nodeMap[ident];
532 }
533 }, newSequence);
534 },
535
536 /* Construct a [i] index for a particular node */
537 _constructIndex: function (node) {
538 var index = '';
539 do {
540 if (node.id) {
541 index = '[' + node.position + ']' + index;
542 }
543 } while ((node = node.parent) != null);
544 return index;
545 },
546
547 /** @id MochiKit.Sortable.sequence */
548 sequence: function (element, options) {
549 element = MochiKit.DOM.getElement(element);
550 var self = MochiKit.Sortable;
551 var options = MochiKit.Base.update(self.options(element), options || {});
552
553 return MochiKit.Base.map(function (item) {
554 return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
555 }, MochiKit.DOM.getElement(self.findElements(element, options) || []));
556 },
557
558 /**
559 * Serializes the content of a Sortable. Useful to send this content through a XMLHTTPRequest.
560 * These options override the Sortable options for the serialization only.
561 * @param {Node} element Element to serialize.
562 * @param {Object} options Serialization options.
563 */
564 serialize: function (element, options) {
565 element = MochiKit.DOM.getElement(element);
566 var self = MochiKit.Sortable;
567 options = MochiKit.Base.update(self.options(element), options || {});
568 var name = encodeURIComponent(options.name || element.id);
569
570 if (options.tree) {
571 return MochiKit.Base.flattenArray(MochiKit.Base.map(function (item) {
572 return [name + self._constructIndex(item) + "[id]=" +
573 encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
574 }, self.tree(element, options).children)).join('&');
575 } else {
576 return MochiKit.Base.map(function (item) {
577 return name + "[]=" + encodeURIComponent(item);
578 }, self.sequence(element, options)).join('&');
579 }
580 }
581});
582
583// trunk compatibility
584MochiKit.Sortable.Sortable = MochiKit.Sortable;
585
586MochiKit.Sortable.__new__ = function () {
587 MochiKit.Base.nameFunctions(this);
588};
589
590MochiKit.Sortable.__new__();
591
592MochiKit.Base._exportSymbols(this, MochiKit.Sortable);
diff --git a/frontend/delta/js/MochiKit/Style.js b/frontend/delta/js/MochiKit/Style.js
new file mode 100644
index 0000000..fa5edbf
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Style.js
@@ -0,0 +1,584 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Style 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved.
31
32The MochiKit.Style.getElementPosition function is adapted from
33YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc.
34
35***/
36
37MochiKit.Base.module(MochiKit, 'Style', '1.5', ['Base', 'DOM']);
38
39
40/** @id MochiKit.Style.Dimensions */
41MochiKit.Style.Dimensions = function (w, h) {
42 if (!(this instanceof MochiKit.Style.Dimensions)) {
43 return new MochiKit.Style.Dimensions(w, h);
44 }
45 this.w = w;
46 this.h = h;
47};
48
49MochiKit.Style.Dimensions.prototype.__repr__ = function () {
50 var repr = MochiKit.Base.repr;
51 return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}';
52};
53
54MochiKit.Style.Dimensions.prototype.toString = function () {
55 return this.__repr__();
56};
57
58
59/** @id MochiKit.Style.Coordinates */
60MochiKit.Style.Coordinates = function (x, y) {
61 if (!(this instanceof MochiKit.Style.Coordinates)) {
62 return new MochiKit.Style.Coordinates(x, y);
63 }
64 this.x = x;
65 this.y = y;
66};
67
68MochiKit.Style.Coordinates.prototype.__repr__ = function () {
69 var repr = MochiKit.Base.repr;
70 return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}';
71};
72
73MochiKit.Style.Coordinates.prototype.toString = function () {
74 return this.__repr__();
75};
76
77
78MochiKit.Base.update(MochiKit.Style, {
79
80 /** @id MochiKit.Style.getStyle */
81 getStyle: function (elem, cssProperty) {
82 var dom = MochiKit.DOM;
83 var d = dom._document;
84
85 elem = dom.getElement(elem);
86 cssProperty = MochiKit.Base.camelize(cssProperty);
87
88 if (!elem || elem == d) {
89 return undefined;
90 }
91 if (cssProperty == 'opacity' && typeof(elem.filters) != 'undefined') {
92 var opacity = (MochiKit.Style.getStyle(elem, 'filter') || '').match(/alpha\(opacity=(.*)\)/);
93 if (opacity && opacity[1]) {
94 return parseFloat(opacity[1]) / 100;
95 }
96 return 1.0;
97 }
98 if (cssProperty == 'float' || cssProperty == 'cssFloat' || cssProperty == 'styleFloat') {
99 if (elem.style["float"]) {
100 return elem.style["float"];
101 } else if (elem.style.cssFloat) {
102 return elem.style.cssFloat;
103 } else if (elem.style.styleFloat) {
104 return elem.style.styleFloat;
105 } else {
106 return "none";
107 }
108 }
109 var value = elem.style ? elem.style[cssProperty] : null;
110 if (!value) {
111 if (d.defaultView && d.defaultView.getComputedStyle) {
112 var css = d.defaultView.getComputedStyle(elem, null);
113 cssProperty = cssProperty.replace(/([A-Z])/g, '-$1'
114 ).toLowerCase(); // from dojo.style.toSelectorCase
115 value = css ? css.getPropertyValue(cssProperty) : null;
116 } else if (elem.currentStyle) {
117 value = elem.currentStyle[cssProperty];
118 if (/^\d/.test(value) && !/px$/.test(value) && cssProperty != 'fontWeight') {
119 /* Convert to px using an hack from Dean Edwards */
120 var left = elem.style.left;
121 var rsLeft = elem.runtimeStyle.left;
122 elem.runtimeStyle.left = elem.currentStyle.left;
123 elem.style.left = value || 0;
124 value = elem.style.pixelLeft + "px";
125 elem.style.left = left;
126 elem.runtimeStyle.left = rsLeft;
127 }
128 }
129 }
130 if (cssProperty == 'opacity') {
131 value = parseFloat(value);
132 }
133
134 if (/Opera/.test(navigator.userAgent) && (MochiKit.Base.findValue(['left', 'top', 'right', 'bottom'], cssProperty) != -1)) {
135 if (MochiKit.Style.getStyle(elem, 'position') == 'static') {
136 value = 'auto';
137 }
138 }
139
140 return value == 'auto' ? null : value;
141 },
142
143 /** @id MochiKit.Style.setStyle */
144 setStyle: function (elem, style) {
145 elem = MochiKit.DOM.getElement(elem);
146 for (var name in style) {
147 switch (name) {
148 case 'opacity':
149 MochiKit.Style.setOpacity(elem, style[name]);
150 break;
151 case 'float':
152 case 'cssFloat':
153 case 'styleFloat':
154 if (typeof(elem.style["float"]) != "undefined") {
155 elem.style["float"] = style[name];
156 } else if (typeof(elem.style.cssFloat) != "undefined") {
157 elem.style.cssFloat = style[name];
158 } else {
159 elem.style.styleFloat = style[name];
160 }
161 break;
162 default:
163 elem.style[MochiKit.Base.camelize(name)] = style[name];
164 }
165 }
166 },
167
168 /** @id MochiKit.Style.setOpacity */
169 setOpacity: function (elem, o) {
170 elem = MochiKit.DOM.getElement(elem);
171 var self = MochiKit.Style;
172 if (o == 1) {
173 var toSet = /Gecko/.test(navigator.userAgent) && !(/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent));
174 elem.style["opacity"] = toSet ? 0.999999 : 1.0;
175 if (/MSIE/.test(navigator.userAgent)) {
176 elem.style['filter'] =
177 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '');
178 }
179 } else {
180 if (o < 0.00001) {
181 o = 0;
182 }
183 elem.style["opacity"] = o;
184 if (/MSIE/.test(navigator.userAgent)) {
185 elem.style['filter'] =
186 self.getStyle(elem, 'filter').replace(/alpha\([^\)]*\)/gi, '') + 'alpha(opacity=' + o * 100 + ')';
187 }
188 }
189 },
190
191 /*
192
193 getElementPosition is adapted from YAHOO.util.Dom.getXY v0.9.0.
194 Copyright: Copyright (c) 2006, Yahoo! Inc. All rights reserved.
195 License: BSD, http://developer.yahoo.net/yui/license.txt
196
197 */
198
199 /** @id MochiKit.Style.getElementPosition */
200 getElementPosition: function (elem, /* optional */relativeTo) {
201 var self = MochiKit.Style;
202 var dom = MochiKit.DOM;
203 var isCoordinates = function (o) {
204 return o != null &&
205 o.nodeType == null &&
206 typeof(o.x) == "number" &&
207 typeof(o.y) == "number";
208 };
209
210 if (typeof(elem) == "string") {
211 elem = dom.getElement(elem);
212 }
213 if (elem == null ||
214 (!isCoordinates(elem) && self.getStyle(elem, 'display') == 'none')) {
215 return undefined;
216 }
217
218 var c = new self.Coordinates(0, 0);
219 var box = null;
220 var parent = null;
221
222 var d = MochiKit.DOM._document;
223 var de = d.documentElement;
224 var b = d.body;
225
226 if (isCoordinates(elem)) {
227 /* it's just a MochiKit.Style.Coordinates object */
228 c.x += elem.x || 0;
229 c.y += elem.y || 0;
230 } else if (elem.getBoundingClientRect) { // IE shortcut
231 /*
232
233 The IE shortcut can be off by two. We fix it. See:
234 http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/getboundingclientrect.asp
235
236 This is similar to the method used in
237 MochiKit.Signal.Event.mouse().
238
239 */
240 box = elem.getBoundingClientRect();
241
242 c.x += box.left +
243 (de.scrollLeft || b.scrollLeft) -
244 (de.clientLeft || 0);
245
246 c.y += box.top +
247 (de.scrollTop || b.scrollTop) -
248 (de.clientTop || 0);
249
250 } else if (elem.offsetParent) {
251 c.x += elem.offsetLeft;
252 c.y += elem.offsetTop;
253 parent = elem.offsetParent;
254
255 if (parent != elem) {
256 while (parent) {
257 c.x += parseInt(parent.style.borderLeftWidth, 10) || 0;
258 c.y += parseInt(parent.style.borderTopWidth, 10) || 0;
259 c.x += parent.offsetLeft;
260 c.y += parent.offsetTop;
261 parent = parent.offsetParent;
262 }
263 }
264
265 /*
266
267 Opera < 9 and old Safari (absolute) incorrectly account for
268 body offsetTop and offsetLeft.
269
270 */
271 var ua = navigator.userAgent.toLowerCase();
272 if ((typeof(opera) != 'undefined' &&
273 parseFloat(opera.version()) < 9) ||
274 (ua.indexOf('AppleWebKit') != -1 &&
275 self.getStyle(elem, 'position') == 'absolute')) {
276
277 c.x -= b.offsetLeft;
278 c.y -= b.offsetTop;
279
280 }
281
282 // Adjust position for strange Opera scroll bug
283 if (elem.parentNode) {
284 parent = elem.parentNode;
285 } else {
286 parent = null;
287 }
288 while (parent) {
289 var tagName = parent.tagName.toUpperCase();
290 if (tagName === 'BODY' || tagName === 'HTML') {
291 break;
292 }
293 var disp = self.getStyle(parent, 'display');
294 // Handle strange Opera bug for some display
295 if (disp.search(/^inline|table-row.*$/i)) {
296 c.x -= parent.scrollLeft;
297 c.y -= parent.scrollTop;
298 }
299 if (parent.parentNode) {
300 parent = parent.parentNode;
301 } else {
302 parent = null;
303 }
304 }
305 }
306
307 if (relativeTo) {
308 relativeTo = arguments.callee(relativeTo);
309 if (relativeTo) {
310 c.x -= (relativeTo.x || 0);
311 c.y -= (relativeTo.y || 0);
312 }
313 }
314
315 return c;
316 },
317
318 /** @id MochiKit.Style.setElementPosition */
319 setElementPosition: function (elem, newPos/* optional */, units) {
320 elem = MochiKit.DOM.getElement(elem);
321 if (typeof(units) == 'undefined') {
322 units = 'px';
323 }
324 var newStyle = {};
325 var isUndefNull = MochiKit.Base.isUndefinedOrNull;
326 if (!isUndefNull(newPos.x)) {
327 newStyle['left'] = newPos.x + units;
328 }
329 if (!isUndefNull(newPos.y)) {
330 newStyle['top'] = newPos.y + units;
331 }
332 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
333 },
334
335 /** @id MochiKit.Style.makePositioned */
336 makePositioned: function (element) {
337 element = MochiKit.DOM.getElement(element);
338 var pos = MochiKit.Style.getStyle(element, 'position');
339 if (pos == 'static' || !pos) {
340 element.style.position = 'relative';
341 // Opera returns the offset relative to the positioning context,
342 // when an element is position relative but top and left have
343 // not been defined
344 if (/Opera/.test(navigator.userAgent)) {
345 element.style.top = 0;
346 element.style.left = 0;
347 }
348 }
349 },
350
351 /** @id MochiKit.Style.undoPositioned */
352 undoPositioned: function (element) {
353 element = MochiKit.DOM.getElement(element);
354 if (element.style.position == 'relative') {
355 element.style.position = element.style.top = element.style.left = element.style.bottom = element.style.right = '';
356 }
357 },
358
359 /** @id MochiKit.Style.makeClipping */
360 makeClipping: function (element) {
361 element = MochiKit.DOM.getElement(element);
362 var s = element.style;
363 var oldOverflow = { 'overflow': s.overflow,
364 'overflow-x': s.overflowX,
365 'overflow-y': s.overflowY };
366 if ((MochiKit.Style.getStyle(element, 'overflow') || 'visible') != 'hidden') {
367 element.style.overflow = 'hidden';
368 element.style.overflowX = 'hidden';
369 element.style.overflowY = 'hidden';
370 }
371 return oldOverflow;
372 },
373
374 /** @id MochiKit.Style.undoClipping */
375 undoClipping: function (element, overflow) {
376 element = MochiKit.DOM.getElement(element);
377 if (typeof(overflow) == 'string') {
378 element.style.overflow = overflow;
379 } else if (overflow != null) {
380 element.style.overflow = overflow['overflow'];
381 element.style.overflowX = overflow['overflow-x'];
382 element.style.overflowY = overflow['overflow-y'];
383 }
384 },
385
386 /** @id MochiKit.Style.getElementDimensions */
387 getElementDimensions: function (elem, contentSize/*optional*/) {
388 var self = MochiKit.Style;
389 var dom = MochiKit.DOM;
390 if (typeof(elem.w) == 'number' || typeof(elem.h) == 'number') {
391 return new self.Dimensions(elem.w || 0, elem.h || 0);
392 }
393 elem = dom.getElement(elem);
394 if (!elem) {
395 return undefined;
396 }
397 var disp = self.getStyle(elem, 'display');
398 // display can be empty/undefined on WebKit/KHTML
399 if (disp == 'none' || disp == '' || typeof(disp) == 'undefined') {
400 var s = elem.style;
401 var originalVisibility = s.visibility;
402 var originalPosition = s.position;
403 var originalDisplay = s.display;
404 s.visibility = 'hidden';
405 s.position = 'absolute';
406 s.display = self._getDefaultDisplay(elem);
407 var originalWidth = elem.offsetWidth;
408 var originalHeight = elem.offsetHeight;
409 s.display = originalDisplay;
410 s.position = originalPosition;
411 s.visibility = originalVisibility;
412 } else {
413 originalWidth = elem.offsetWidth || 0;
414 originalHeight = elem.offsetHeight || 0;
415 }
416 if (contentSize) {
417 var tableCell = 'colSpan' in elem && 'rowSpan' in elem;
418 var collapse = (tableCell && elem.parentNode && self.getStyle(
419 elem.parentNode, 'borderCollapse') == 'collapse');
420 if (collapse) {
421 if (/MSIE/.test(navigator.userAgent)) {
422 var borderLeftQuota = elem.previousSibling? 0.5 : 1;
423 var borderRightQuota = elem.nextSibling? 0.5 : 1;
424 }
425 else {
426 var borderLeftQuota = 0.5;
427 var borderRightQuota = 0.5;
428 }
429 } else {
430 var borderLeftQuota = 1;
431 var borderRightQuota = 1;
432 }
433 originalWidth -= Math.round(
434 (parseFloat(self.getStyle(elem, 'paddingLeft')) || 0)
435 + (parseFloat(self.getStyle(elem, 'paddingRight')) || 0)
436 + borderLeftQuota *
437 (parseFloat(self.getStyle(elem, 'borderLeftWidth')) || 0)
438 + borderRightQuota *
439 (parseFloat(self.getStyle(elem, 'borderRightWidth')) || 0)
440 );
441 if (tableCell) {
442 if (/Gecko|Opera/.test(navigator.userAgent)
443 && !/Konqueror|AppleWebKit|KHTML/.test(navigator.userAgent)) {
444 var borderHeightQuota = 0;
445 } else if (/MSIE/.test(navigator.userAgent)) {
446 var borderHeightQuota = 1;
447 } else {
448 var borderHeightQuota = collapse? 0.5 : 1;
449 }
450 } else {
451 var borderHeightQuota = 1;
452 }
453 originalHeight -= Math.round(
454 (parseFloat(self.getStyle(elem, 'paddingTop')) || 0)
455 + (parseFloat(self.getStyle(elem, 'paddingBottom')) || 0)
456 + borderHeightQuota * (
457 (parseFloat(self.getStyle(elem, 'borderTopWidth')) || 0)
458 + (parseFloat(self.getStyle(elem, 'borderBottomWidth')) || 0))
459 );
460 }
461 return new self.Dimensions(originalWidth, originalHeight);
462 },
463
464 /** @id MochiKit.Style.setElementDimensions */
465 setElementDimensions: function (elem, newSize/* optional */, units) {
466 elem = MochiKit.DOM.getElement(elem);
467 if (typeof(units) == 'undefined') {
468 units = 'px';
469 }
470 var newStyle = {};
471 var isUndefNull = MochiKit.Base.isUndefinedOrNull;
472 if (!isUndefNull(newSize.w)) {
473 newStyle['width'] = newSize.w + units;
474 }
475 if (!isUndefNull(newSize.h)) {
476 newStyle['height'] = newSize.h + units;
477 }
478 MochiKit.DOM.updateNodeAttributes(elem, {'style': newStyle});
479 },
480
481 _getDefaultDisplay: function (elem) {
482 var self = MochiKit.Style;
483 var dom = MochiKit.DOM;
484 elem = dom.getElement(elem);
485 if (!elem) {
486 return undefined;
487 }
488 var tagName = elem.tagName.toUpperCase();
489 return self._defaultDisplay[tagName] || 'block';
490 },
491
492 /** @id MochiKit.Style.setDisplayForElement */
493 setDisplayForElement: function (display, element/*, ...*/) {
494 var elements = MochiKit.Base.extend(null, arguments, 1);
495 var getElement = MochiKit.DOM.getElement;
496 for (var i = 0; i < elements.length; i++) {
497 element = getElement(elements[i]);
498 if (element) {
499 element.style.display = display;
500 }
501 }
502 },
503
504 /** @id MochiKit.Style.getViewportDimensions */
505 getViewportDimensions: function () {
506 var d = new MochiKit.Style.Dimensions();
507 var w = MochiKit.DOM._window;
508 var b = MochiKit.DOM._document.body;
509 if (w.innerWidth) {
510 d.w = w.innerWidth;
511 d.h = w.innerHeight;
512 } else if (b && b.parentElement && b.parentElement.clientWidth) {
513 d.w = b.parentElement.clientWidth;
514 d.h = b.parentElement.clientHeight;
515 } else if (b && b.clientWidth) {
516 d.w = b.clientWidth;
517 d.h = b.clientHeight;
518 }
519 return d;
520 },
521
522 /** @id MochiKit.Style.getViewportPosition */
523 getViewportPosition: function () {
524 var c = new MochiKit.Style.Coordinates(0, 0);
525 var d = MochiKit.DOM._document;
526 var de = d.documentElement;
527 var db = d.body;
528 if (de && (de.scrollTop || de.scrollLeft)) {
529 c.x = de.scrollLeft;
530 c.y = de.scrollTop;
531 } else if (db) {
532 c.x = db.scrollLeft;
533 c.y = db.scrollTop;
534 }
535 return c;
536 },
537
538 __new__: function () {
539 var m = MochiKit.Base;
540
541 var inlines = ['A','ABBR','ACRONYM','B','BASEFONT','BDO','BIG','BR',
542 'CITE','CODE','DFN','EM','FONT','I','IMG','KBD','LABEL',
543 'Q','S','SAMP','SMALL','SPAN','STRIKE','STRONG','SUB',
544 'SUP','TEXTAREA','TT','U','VAR'];
545 this._defaultDisplay = { 'TABLE': 'table',
546 'THEAD': 'table-header-group',
547 'TBODY': 'table-row-group',
548 'TFOOT': 'table-footer-group',
549 'COLGROUP': 'table-column-group',
550 'COL': 'table-column',
551 'TR': 'table-row',
552 'TD': 'table-cell',
553 'TH': 'table-cell',
554 'CAPTION': 'table-caption',
555 'LI': 'list-item',
556 'INPUT': 'inline-block',
557 'SELECT': 'inline-block' };
558 // CSS 'display' support in IE6/7 is just broken...
559 if (/MSIE/.test(navigator.userAgent)) {
560 for (var k in this._defaultDisplay) {
561 var v = this._defaultDisplay[k];
562 if (v.indexOf('table') == 0) {
563 this._defaultDisplay[k] = 'block';
564 }
565 }
566 }
567 for (var i = 0; i < inlines.length; i++) {
568 this._defaultDisplay[inlines[i]] = 'inline';
569 }
570
571 // Backwards compatibility aliases
572 m._deprecated(this, 'elementPosition', 'MochiKit.Style.getElementPosition', '1.3', true);
573 m._deprecated(this, 'elementDimensions', 'MochiKit.Style.getElementDimensions', '1.3', true);
574
575 this.hideElement = m.partial(this.setDisplayForElement, 'none');
576 // TODO: showElement could be improved by using getDefaultDisplay.
577 this.showElement = m.partial(this.setDisplayForElement, 'block');
578
579 m.nameFunctions(this);
580 }
581});
582
583MochiKit.Style.__new__();
584MochiKit.Base._exportSymbols(this, MochiKit.Style);
diff --git a/frontend/delta/js/MochiKit/Test.js b/frontend/delta/js/MochiKit/Test.js
new file mode 100644
index 0000000..55d226c
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Test.js
@@ -0,0 +1,167 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Test 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Test', '1.5', ['Base']);
35
36MochiKit.Test.runTests = function (obj) {
37 if (typeof(obj) == "string") {
38 // TODO: Remove this temporary API change advertisement
39 throw new TypeError("Automatic module import not supported, call runTests() with proper object: " + obj);
40 }
41 var suite = new MochiKit.Test.Suite();
42 suite.run(obj);
43};
44
45MochiKit.Test.Suite = function () {
46 this.testIndex = 0;
47 MochiKit.Base.bindMethods(this);
48};
49
50MochiKit.Test.Suite.prototype = {
51 run: function (obj) {
52 try {
53 obj(this);
54 } catch (e) {
55 this.traceback(e);
56 }
57 },
58 traceback: function (e) {
59 var items = MochiKit.Iter.sorted(MochiKit.Base.items(e));
60 print("not ok " + this.testIndex + " - Error thrown");
61 for (var i = 0; i < items.length; i++) {
62 var kv = items[i];
63 if (kv[0] == "stack") {
64 kv[1] = kv[1].split(/\n/)[0];
65 }
66 this.print("# " + kv.join(": "));
67 }
68 },
69 print: function (s) {
70 print(s);
71 },
72 is: function (got, expected, /* optional */message) {
73 var res = 1;
74 var msg = null;
75 try {
76 res = MochiKit.Base.compare(got, expected);
77 } catch (e) {
78 msg = "Can not compare " + typeof(got) + ":" + typeof(expected);
79 }
80 if (res) {
81 msg = "Expected value did not compare equal";
82 }
83 if (!res) {
84 return this.testResult(true, message);
85 }
86 return this.testResult(false, message,
87 [[msg], ["got:", got], ["expected:", expected]]);
88 },
89
90 testResult: function (pass, msg, failures) {
91 this.testIndex += 1;
92 if (pass) {
93 this.print("ok " + this.testIndex + " - " + msg);
94 return;
95 }
96 this.print("not ok " + this.testIndex + " - " + msg);
97 if (failures) {
98 for (var i = 0; i < failures.length; i++) {
99 this.print("# " + failures[i].join(" "));
100 }
101 }
102 },
103
104 isDeeply: function (got, expected, /* optional */message) {
105 var m = MochiKit.Base;
106 var res = 1;
107 try {
108 res = m.compare(got, expected);
109 } catch (e) {
110 // pass
111 }
112 if (res === 0) {
113 return this.ok(true, message);
114 }
115 var gk = m.keys(got);
116 var ek = m.keys(expected);
117 gk.sort();
118 ek.sort();
119 if (m.compare(gk, ek)) {
120 // differing keys
121 var cmp = {};
122 var i;
123 for (i = 0; i < gk.length; i++) {
124 cmp[gk[i]] = "got";
125 }
126 for (i = 0; i < ek.length; i++) {
127 if (ek[i] in cmp) {
128 delete cmp[ek[i]];
129 } else {
130 cmp[ek[i]] = "expected";
131 }
132 }
133 var diffkeys = m.keys(cmp);
134 diffkeys.sort();
135 var gotkeys = [];
136 var expkeys = [];
137 while (diffkeys.length) {
138 var k = diffkeys.shift();
139 if (k in Object.prototype) {
140 continue;
141 }
142 (cmp[k] == "got" ? gotkeys : expkeys).push(k);
143 }
144
145
146 }
147
148 return this.testResult((!res), msg,
149 (msg ? [["got:", got], ["expected:", expected]] : undefined)
150 );
151 },
152
153 ok: function (res, message) {
154 return this.testResult(res, message);
155 }
156};
157
158MochiKit.Test.__new__ = function () {
159 var m = MochiKit.Base;
160 this.Suite.__export__ = false;
161 m.nameFunctions(this);
162
163};
164
165MochiKit.Test.__new__();
166
167MochiKit.Base._exportSymbols(this, MochiKit.Test);
diff --git a/frontend/delta/js/MochiKit/Text.js b/frontend/delta/js/MochiKit/Text.js
new file mode 100644
index 0000000..0c230fa
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Text.js
@@ -0,0 +1,569 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Text 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2008 Per Cederberg. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Text', '1.5', ['Base', 'Format']);
35
36/**
37 * Checks if a text string starts with the specified substring. If
38 * either of the two strings is null, false will be returned.
39 *
40 * @param {String} substr the substring to search for
41 * @param {String} str the string to search in
42 *
43 * @return {Boolean} true if the string starts with the substring, or
44 * false otherwise
45 */
46MochiKit.Text.startsWith = function (substr, str) {
47 return str != null && substr != null && str.indexOf(substr) == 0;
48};
49
50/**
51 * Checks if a text string ends with the specified substring. If
52 * either of the two strings is null, false will be returned.
53 *
54 * @param {String} substr the substring to search for
55 * @param {String} str the string to search in
56 *
57 * @return {Boolean} true if the string ends with the substring, or
58 * false otherwise
59 */
60MochiKit.Text.endsWith = function (substr, str) {
61 return str != null && substr != null &&
62 str.lastIndexOf(substr) == Math.max(str.length - substr.length, 0);
63};
64
65/**
66 * Checks if a text string contains the specified substring. If
67 * either of the two strings is null, false will be returned.
68 *
69 * @param {String} substr the substring to search for
70 * @param {String} str the string to search in
71 *
72 * @return {Boolean} true if the string contains the substring, or
73 * false otherwise
74 */
75MochiKit.Text.contains = function (substr, str) {
76 return str != null && substr != null && str.indexOf(substr) >= 0;
77};
78
79/**
80 * Adds a character to the left-hand side of a string until it
81 * reaches the specified minimum length.
82 *
83 * @param {String} str the string to process
84 * @param {Number} minLength the requested minimum length
85 * @param {String} fillChar the padding character to add, defaults
86 * to a space
87 *
88 * @return {String} the padded string
89 */
90MochiKit.Text.padLeft = function (str, minLength, fillChar) {
91 str = str || "";
92 fillChar = fillChar || " ";
93 while (str.length < minLength) {
94 str = fillChar + str;
95 }
96 return str;
97};
98
99/**
100 * Adds a character to the right-hand side of a string until it
101 * reaches the specified minimum length.
102 *
103 * @param {String} str the string to process
104 * @param {Number} minLength the requested minimum length
105 * @param {String} fillChar the padding character to add, defaults
106 * to a space
107 *
108 * @return {String} the padded string
109 */
110MochiKit.Text.padRight = function (str, minLength, fillChar) {
111 str = str || "";
112 fillChar = fillChar || " ";
113 while (str.length < minLength) {
114 str += fillChar;
115 }
116 return str;
117};
118
119/**
120 * Returns a truncated copy of a string. If the string is shorter
121 * than the specified maximum length, the object will be returned
122 * unmodified. If an optional tail string is specified, additional
123 * elements will be removed in order to accomodate the tail (that
124 * will be appended). This function also works on arrays.
125 *
126 * @param {String} str the string to truncate
127 * @param {Number} maxLength the maximum length
128 * @param {String} [tail] the tail to append on truncation
129 *
130 * @return {String} the truncated string
131 */
132MochiKit.Text.truncate = function (str, maxLength, tail) {
133 if (str == null || str.length <= maxLength || maxLength < 0) {
134 return str;
135 } else if (tail != null) {
136 str = str.slice(0, Math.max(0, maxLength - tail.length));
137 if (typeof(str) == "string") {
138 return str + tail;
139 } else {
140 return MochiKit.Base.extend(str, tail);
141 }
142 } else {
143 return str.slice(0, maxLength);
144 }
145};
146
147/**
148 * Splits a text string using separator as the split point
149 * If max is given, at most max splits are done, giving at most
150 * max + 1 elements in the returned list.
151 *
152 * @param {String} str the string to split
153 * @param {String/RegExp} [separator] the separator char or regexp to use,
154 * defaults to newline
155 * @param {Number} [max] the maximum number of parts to return
156 * @return {Array} an array of parts of the string
157 */
158MochiKit.Text.split = function (str, separator, max) {
159 if (str == null) {
160 return str;
161 }
162 separator = separator || '\n';
163 var bits = str.split(separator);
164 if ((typeof(max) == "undefined") || max >= bits.length - 1) {
165 return bits;
166 }
167 bits.splice(max, bits.length, bits.slice(max, bits.length).join(separator));
168 return bits;
169};
170
171/**
172 * Splits a text string using separator as the split point
173 * If max is given, at most max splits are done,
174 * using splits from the right
175 *
176 * @param {String} str the string to split
177 * @param {String/RegExp} [separator] the separator char or regexp to use,
178 * defaults to newline
179 * @param {Number} [max] the maximum number of parts to return
180 * @return {Array} an array of parts of the string
181 */
182MochiKit.Text.rsplit = function (str, separator, max) {
183 if (str == null) {
184 return str;
185 }
186 separator = separator || '\n';
187 var bits = str.split(separator);
188 if ((typeof(max) == "undefined") || max >= bits.length - 1){
189 return bits;
190 }
191 bits.splice(0, bits.length-max, bits.slice(0, bits.length-max).join(separator));
192 return bits;
193};
194
195/**
196 * Creates a formatter function for the specified formatter pattern
197 * and locale. The returned function takes as many arguments as the
198 * formatter pattern requires. See separate documentation for
199 * information about the formatter pattern syntax.
200 *
201 * @param {String} pattern the formatter pattern string
202 * @param {Object} [locale] the locale to use, defaults to
203 * LOCALE.en_US
204 *
205 * @return {Function} the formatter function created
206 *
207 * @throws FormatPatternError if the format pattern was invalid
208 */
209MochiKit.Text.formatter = function (pattern, locale) {
210 if (locale == null) {
211 locale = MochiKit.Format.formatLocale();
212 } else if (typeof(locale) == "string") {
213 locale = MochiKit.Format.formatLocale(locale);
214 }
215 var parts = MochiKit.Text._parsePattern(pattern);
216 return function() {
217 var values = MochiKit.Base.extend([], arguments);
218 var res = [];
219 for (var i = 0; i < parts.length; i++) {
220 if (typeof(parts[i]) == "string") {
221 res.push(parts[i]);
222 } else {
223 res.push(MochiKit.Text.formatValue(parts[i], values, locale));
224 }
225 }
226 return res.join("");
227 };
228};
229
230/**
231 * Formats the specified arguments according to a formatter pattern.
232 * See separate documentation for information about the formatter
233 * pattern syntax.
234 *
235 * @param {String} pattern the formatter pattern string
236 * @param {Object} [...] the optional values to format
237 *
238 * @return {String} the formatted output string
239 *
240 * @throws FormatPatternError if the format pattern was invalid
241 */
242MochiKit.Text.format = function (pattern/*, ...*/) {
243 var func = MochiKit.Text.formatter(pattern);
244 return func.apply(this, MochiKit.Base.extend([], arguments, 1));
245};
246
247/**
248 * Format a value with the specified format specifier.
249 *
250 * @param {String/Object} spec the format specifier string or parsed
251 * format specifier object
252 * @param {Object} value the value to format
253 * @param {Object} [locale] the locale to use, defaults to
254 * LOCALE.en_US
255 *
256 * @return {String} the formatted output string
257 *
258 * @throws FormatPatternError if the format specifier was invalid
259 */
260MochiKit.Text.formatValue = function (spec, value, locale) {
261 var self = MochiKit.Text;
262 if (typeof(spec) === "string") {
263 spec = self._parseFormatFlags(spec, 0, spec.length);
264 }
265 for (var i = 0; spec.path != null && i < spec.path.length; i++) {
266 if (value != null) {
267 value = value[spec.path[i]];
268 }
269 }
270 if (locale == null) {
271 locale = MochiKit.Format.formatLocale();
272 } else if (typeof(locale) == "string") {
273 locale = MochiKit.Format.formatLocale(locale);
274 }
275 var str = "";
276 if (spec.type == "number") {
277 if (value instanceof Number) {
278 value = value.valueOf();
279 }
280 if (typeof(value) != "number" || isNaN(value)) {
281 str = "";
282 } else if (value === Number.POSITIVE_INFINITY) {
283 str = "\u221e";
284 } else if (value === Number.NEGATIVE_INFINITY) {
285 str = "-\u221e";
286 } else {
287 var sign = (value < 0) ? "-" : spec.sign;
288 value = Math.abs(value);
289 if (spec.format === "%") {
290 str = self._truncToPercent(value, spec.precision);
291 } else if (spec.format === "d") {
292 str = MochiKit.Format.roundToFixed(value, 0);
293 } else if (spec.radix != 10) {
294 str = Math.floor(value).toString(spec.radix);
295 if (spec.format === "x") {
296 str = str.toLowerCase();
297 } else if (spec.format === "X") {
298 str = str.toUpperCase();
299 }
300 } else if (spec.precision >= 0) {
301 str = MochiKit.Format.roundToFixed(value, spec.precision);
302 } else {
303 str = value.toString();
304 }
305 if (spec.padding === "0" && spec.format === "%") {
306 str = self.padLeft(str, spec.width - sign.length - 1, "0");
307 } else if (spec.padding == "0") {
308 str = self.padLeft(str, spec.width - sign.length, "0");
309 }
310 str = self._localizeNumber(str, locale, spec.group);
311 str = sign + str;
312 }
313 if (str !== "" && spec.format === "%") {
314 str = str + locale.percent;
315 }
316 } else {
317 if (spec.format == "r") {
318 str = MochiKit.Base.repr(value);
319 } else {
320 str = (value == null) ? "" : value.toString();
321 }
322 str = self.truncate(str, spec.precision);
323 }
324 if (spec.align == "<") {
325 str = self.padRight(str, spec.width);
326 } else {
327 str = self.padLeft(str, spec.width);
328 }
329 return str;
330};
331
332/**
333 * Adjust an already formatted numeric string for locale-specific
334 * grouping and decimal separators. The grouping is optional and
335 * will attempt to keep the number string length intact by removing
336 * padded zeros (if possible).
337 *
338 * @param {String} num the formatted number string
339 * @param {Object} locale the formatting locale to use
340 * @param {Boolean} group the grouping flag
341 *
342 * @return {String} the localized number string
343 */
344MochiKit.Text._localizeNumber = function (num, locale, group) {
345 var parts = num.split(/\./);
346 var whole = parts[0];
347 var frac = (parts.length == 1) ? "" : parts[1];
348 var res = (frac.length > 0) ? locale.decimal : "";
349 while (group && frac.length > 3) {
350 res = res + frac.substring(0, 3) + locale.separator;
351 frac = frac.substring(3);
352 if (whole.charAt(0) == "0") {
353 whole = whole.substring(1);
354 }
355 }
356 if (frac.length > 0) {
357 res = res + frac;
358 }
359 while (group && whole.length > 3) {
360 var pos = whole.length - 3;
361 res = locale.separator + whole.substring(pos) + res;
362 whole = whole.substring((whole.charAt(0) == "0") ? 1 : 0, pos);
363 }
364 return whole + res;
365};
366
367/**
368 * Parses a format pattern and returns an array of constant strings
369 * and format info objects.
370 *
371 * @param {String} pattern the format pattern to analyze
372 *
373 * @return {Array} an array of strings and format info objects
374 *
375 * @throws FormatPatternError if the format pattern was invalid
376 */
377MochiKit.Text._parsePattern = function (pattern) {
378 var self = MochiKit.Text;
379 var parts = [];
380 var re = /{[^{}]*}|{{?|}}?/g;
381 var lastPos = re.lastIndex = 0;
382 var m;
383 while ((m = re.exec(pattern)) != null) {
384 if (lastPos < m.index) {
385 parts.push(pattern.substring(lastPos, m.index))
386 }
387 var str = m[0];
388 lastPos = m.index + str.length;
389 if (self.startsWith("{", str) && self.endsWith("}", str)) {
390 parts.push(self._parseFormat(pattern, m.index + 1, lastPos - 1));
391 } else if (self.startsWith("{{", str) || self.startsWith("}}", str)) {
392 parts.push(str.substring(1));
393 } else if (self.startsWith("{", str)) {
394 var msg = "unescaped { char, should be escaped as {{";
395 throw new self.FormatPatternError(pattern, m.index, msg);
396 } else if (self.startsWith("}", str)) {
397 var msg = "unescaped } char, should be escaped as }}";
398 throw new self.FormatPatternError(pattern, m.index, msg);
399 }
400 }
401 if (lastPos < pattern.length) {
402 parts.push(pattern.substring(lastPos));
403 }
404 return parts;
405};
406
407/**
408 * Parses a format instruction and returns a format info object.
409 *
410 * @param {String} pattern the format pattern string
411 * @param {Number} startPos the first index of the format instruction
412 * @param {Number} endPos the last index of the format instruction
413 *
414 * @return {Object} the format info object
415 *
416 * @throws FormatPatternError if the format pattern was invalid
417 */
418MochiKit.Text._parseFormat = function (pattern, startPos, endPos) {
419 var self = MochiKit.Text;
420 var text = pattern.substring(startPos, endPos);
421 var parts = self.split(text, ":", 1);
422 var path = parts[0];
423 var flagsPos = startPos + path.length + ((parts.length == 1) ? 0 : 1);
424 var info = self._parseFormatFlags(pattern, flagsPos, endPos);
425 info.path = (path == "") ? [] : path.split(".");
426 for (var i = 0; i < info.path.length; i++) {
427 var v = info.path[i];
428 // TODO: replace with MochiKit.Format.strip?
429 v = v.replace(/^\s+/, "").replace(/\s+$/, "");
430 if (v == "" && info.path.length == 1) {
431 v = 0;
432 } else if (v == "") {
433 var msg = "format value path contains blanks";
434 throw new self.FormatPatternError(pattern, startPos, msg);
435 } else if (/^\d+$/.test(v)) {
436 v = parseInt(v, 10);
437 }
438 info.path[i] = v;
439 }
440 if (info.path.length <= 0 || typeof(info.path[0]) != "number") {
441 info.path.unshift(0);
442 }
443 return info;
444};
445
446/**
447 * Parses a string with format flags and returns a format info object.
448 *
449 * @param {String} pattern the format pattern string
450 * @param {Number} startPos the first index of the format instruction
451 * @param {Number} endPos the last index of the format instruction
452 *
453 * @return {Object} the format info object
454 *
455 * @throws FormatPatternError if the format pattern was invalid
456 */
457MochiKit.Text._parseFormatFlags = function (pattern, startPos, endPos) {
458 var update = MochiKit.Base.update;
459 var info = { type: "string", format: "s", width: 0, precision: -1,
460 align: ">", sign: "", padding: " ", group: false };
461 // TODO: replace with MochiKit.Format.rstrip?
462 var text = pattern.substring(startPos, endPos).replace(/\s+$/, "");
463 var m = /^([<>+ 0,-]+)?(\d+)?(\.\d*)?([srbdoxXf%])?(.*)$/.exec(text);
464 var flags = m[1];
465 var width = m[2];
466 var precision = m[3];
467 var type = m[4];
468 var unmatched = m[5];
469 for (var i = 0; flags && i < flags.length; i++) {
470 var chr = flags.charAt(i);
471 if (chr == "<" || chr == ">") {
472 info.align = chr;
473 } else if (chr == "+" || chr == "-" || chr == " ") {
474 info.sign = (chr == "-") ? "" : chr;
475 } else if (chr == "0") {
476 info.padding = chr;
477 } else if (chr == ",") {
478 info.group = true;
479 }
480 }
481 if (width) {
482 info.width = parseInt(width, 10);
483 }
484 if (precision && precision.length > 1) {
485 info.precision = parseInt(precision.substring(1), 10);
486 }
487 if (type == "s" || type == "r") {
488 info.format = type;
489 } else if (type == "b") {
490 update(info, { type: "number", format: type, radix: 2 });
491 } else if (type == "o") {
492 update(info, { type: "number", format: type, radix: 8 });
493 } else if (type == "x" || type == "X") {
494 update(info, { type: "number", format: type, radix: 16 });
495 } else if (type == "d" || type == "f" || type == "%") {
496 update(info, { type: "number", format: type, radix: 10 });
497 }
498 if (unmatched) {
499 var msg = "unsupported format flag: " + unmatched.charAt(0);
500 throw new MochiKit.Text.FormatPatternError(pattern, startPos, msg);
501 }
502 return info;
503};
504
505/**
506 * Formats a value as a percentage. This method avoids multiplication
507 * by 100 since it leads to weird numeric rounding errors. Instead it
508 * just move the decimal separator in the text string. It is ugly,
509 * but works...
510 *
511 * @param {Number} value the value to format
512 * @param {Number} precision the number of precision digits
513 */
514MochiKit.Text._truncToPercent = function (value, precision) {
515 // TODO: This can be simplified by using MochiKit.Format._shiftNumber
516 // as roundToFixed does.
517 var str;
518 if (precision >= 0) {
519 str = MochiKit.Format.roundToFixed(value, precision + 2);
520 } else {
521 str = (value == null) ? "0" : value.toString();
522 }
523 var arr = MochiKit.Text.split(str, ".", 2);
524 var frac = MochiKit.Text.padRight(arr[1], 2, "0");
525 var whole = arr[0] + frac.substring(0, 2);
526 frac = frac.substring(2);
527 while (/^0[0-9]/.test(whole)) {
528 whole = whole.substring(1);
529 }
530 return (frac.length <= 0) ? whole : whole + "." + frac;
531};
532
533/**
534 * Creates a new format pattern error.
535 *
536 * @param {String} pattern the format pattern string
537 * @param {Number} pos the position of the error
538 * @param {String} message the error message text
539 *
540 * @return {Error} the format pattern error
541 *
542 * @class The format pattern error class. This error is thrown when
543 * a syntax error is encountered inside a format string.
544 * @property {String} pattern The format pattern string.
545 * @property {Number} pos The position of the error.
546 * @property {String} message The error message text.
547 * @extends MochiKit.Base.NamedError
548 */
549MochiKit.Text.FormatPatternError = function (pattern, pos, message) {
550 this.pattern = pattern;
551 this.pos = pos;
552 this.message = message;
553};
554
555MochiKit.Text.FormatPatternError.prototype = new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError");
556MochiKit.Text.FormatPatternError.constructor = MochiKit.Text.FormatPatternError;
557
558//
559//XXX: Internet Explorer export fix
560//
561if (MochiKit.__export__) {
562 formatter = MochiKit.Text.formatter;
563 format = MochiKit.Text.format;
564 formatValue = MochiKit.Text.formatValue;
565}
566
567
568MochiKit.Base.nameFunctions(MochiKit.Text);
569MochiKit.Base._exportSymbols(this, MochiKit.Text);
diff --git a/frontend/delta/js/MochiKit/Visual.js b/frontend/delta/js/MochiKit/Visual.js
new file mode 100644
index 0000000..9bcd805
--- a/dev/null
+++ b/frontend/delta/js/MochiKit/Visual.js
@@ -0,0 +1,1999 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/***
25
26MochiKit.Visual 1.5
27
28See <http://mochikit.com/> for documentation, downloads, license, etc.
29
30(c) 2005 Bob Ippolito and others. All rights Reserved.
31
32***/
33
34MochiKit.Base.module(MochiKit, 'Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']);
35
36MochiKit.Visual._RoundCorners = function (e, options) {
37 e = MochiKit.DOM.getElement(e);
38 this._setOptions(options);
39 if (this.options.__unstable__wrapElement) {
40 e = this._doWrap(e);
41 }
42
43 var color = this.options.color;
44 var C = MochiKit.Color.Color;
45 if (this.options.color === "fromElement") {
46 color = C.fromBackground(e);
47 } else if (!(color instanceof C)) {
48 color = C.fromString(color);
49 }
50 this.isTransparent = (color.asRGB().a <= 0);
51
52 var bgColor = this.options.bgColor;
53 if (this.options.bgColor === "fromParent") {
54 bgColor = C.fromBackground(e.offsetParent);
55 } else if (!(bgColor instanceof C)) {
56 bgColor = C.fromString(bgColor);
57 }
58
59 this._roundCornersImpl(e, color, bgColor);
60};
61
62MochiKit.Visual._RoundCorners.prototype = {
63 _doWrap: function (e) {
64 var parent = e.parentNode;
65 var doc = MochiKit.DOM.currentDocument();
66 if (typeof(doc.defaultView) === "undefined"
67 || doc.defaultView === null) {
68 return e;
69 }
70 var style = doc.defaultView.getComputedStyle(e, null);
71 if (typeof(style) === "undefined" || style === null) {
72 return e;
73 }
74 var wrapper = MochiKit.DOM.DIV({"style": {
75 display: "block",
76 // convert padding to margin
77 marginTop: style.getPropertyValue("padding-top"),
78 marginRight: style.getPropertyValue("padding-right"),
79 marginBottom: style.getPropertyValue("padding-bottom"),
80 marginLeft: style.getPropertyValue("padding-left"),
81 // remove padding so the rounding looks right
82 padding: "0px"
83 /*
84 paddingRight: "0px",
85 paddingLeft: "0px"
86 */
87 }});
88 wrapper.innerHTML = e.innerHTML;
89 e.innerHTML = "";
90 e.appendChild(wrapper);
91 return e;
92 },
93
94 _roundCornersImpl: function (e, color, bgColor) {
95 if (this.options.border) {
96 this._renderBorder(e, bgColor);
97 }
98 if (this._isTopRounded()) {
99 this._roundTopCorners(e, color, bgColor);
100 }
101 if (this._isBottomRounded()) {
102 this._roundBottomCorners(e, color, bgColor);
103 }
104 },
105
106 _renderBorder: function (el, bgColor) {
107 var borderValue = "1px solid " + this._borderColor(bgColor);
108 var borderL = "border-left: " + borderValue;
109 var borderR = "border-right: " + borderValue;
110 var style = "style='" + borderL + ";" + borderR + "'";
111 el.innerHTML = "<div " + style + ">" + el.innerHTML + "</div>";
112 },
113
114 _roundTopCorners: function (el, color, bgColor) {
115 var corner = this._createCorner(bgColor);
116 for (var i = 0; i < this.options.numSlices; i++) {
117 corner.appendChild(
118 this._createCornerSlice(color, bgColor, i, "top")
119 );
120 }
121 el.style.paddingTop = 0;
122 el.insertBefore(corner, el.firstChild);
123 },
124
125 _roundBottomCorners: function (el, color, bgColor) {
126 var corner = this._createCorner(bgColor);
127 for (var i = (this.options.numSlices - 1); i >= 0; i--) {
128 corner.appendChild(
129 this._createCornerSlice(color, bgColor, i, "bottom")
130 );
131 }
132 el.style.paddingBottom = 0;
133 el.appendChild(corner);
134 },
135
136 _createCorner: function (bgColor) {
137 var dom = MochiKit.DOM;
138 return dom.DIV({style: {backgroundColor: bgColor.toString()}});
139 },
140
141 _createCornerSlice: function (color, bgColor, n, position) {
142 var slice = MochiKit.DOM.SPAN();
143
144 var inStyle = slice.style;
145 inStyle.backgroundColor = color.toString();
146 inStyle.display = "block";
147 inStyle.height = "1px";
148 inStyle.overflow = "hidden";
149 inStyle.fontSize = "1px";
150
151 var borderColor = this._borderColor(color, bgColor);
152 if (this.options.border && n === 0) {
153 inStyle.borderTopStyle = "solid";
154 inStyle.borderTopWidth = "1px";
155 inStyle.borderLeftWidth = "0px";
156 inStyle.borderRightWidth = "0px";
157 inStyle.borderBottomWidth = "0px";
158 // assumes css compliant box model
159 inStyle.height = "0px";
160 inStyle.borderColor = borderColor.toString();
161 } else if (borderColor) {
162 inStyle.borderColor = borderColor.toString();
163 inStyle.borderStyle = "solid";
164 inStyle.borderWidth = "0px 1px";
165 }
166
167 if (!this.options.compact && (n == (this.options.numSlices - 1))) {
168 inStyle.height = "2px";
169 }
170
171 this._setMargin(slice, n, position);
172 this._setBorder(slice, n, position);
173
174 return slice;
175 },
176
177 _setOptions: function (options) {
178 this.options = {
179 corners: "all",
180 color: "fromElement",
181 bgColor: "fromParent",
182 blend: true,
183 border: false,
184 compact: false,
185 __unstable__wrapElement: false
186 };
187 MochiKit.Base.update(this.options, options);
188
189 this.options.numSlices = (this.options.compact ? 2 : 4);
190 },
191
192 _whichSideTop: function () {
193 var corners = this.options.corners;
194 if (this._hasString(corners, "all", "top")) {
195 return "";
196 }
197
198 var has_tl = (corners.indexOf("tl") != -1);
199 var has_tr = (corners.indexOf("tr") != -1);
200 if (has_tl && has_tr) {
201 return "";
202 }
203 if (has_tl) {
204 return "left";
205 }
206 if (has_tr) {
207 return "right";
208 }
209 return "";
210 },
211
212 _whichSideBottom: function () {
213 var corners = this.options.corners;
214 if (this._hasString(corners, "all", "bottom")) {
215 return "";
216 }
217
218 var has_bl = (corners.indexOf('bl') != -1);
219 var has_br = (corners.indexOf('br') != -1);
220 if (has_bl && has_br) {
221 return "";
222 }
223 if (has_bl) {
224 return "left";
225 }
226 if (has_br) {
227 return "right";
228 }
229 return "";
230 },
231
232 _borderColor: function (color, bgColor) {
233 if (color == "transparent") {
234 return bgColor;
235 } else if (this.options.border) {
236 return this.options.border;
237 } else if (this.options.blend) {
238 return bgColor.blendedColor(color);
239 }
240 return "";
241 },
242
243
244 _setMargin: function (el, n, corners) {
245 var marginSize = this._marginSize(n) + "px";
246 var whichSide = (
247 corners == "top" ? this._whichSideTop() : this._whichSideBottom()
248 );
249 var style = el.style;
250
251 if (whichSide == "left") {
252 style.marginLeft = marginSize;
253 style.marginRight = "0px";
254 } else if (whichSide == "right") {
255 style.marginRight = marginSize;
256 style.marginLeft = "0px";
257 } else {
258 style.marginLeft = marginSize;
259 style.marginRight = marginSize;
260 }
261 },
262
263 _setBorder: function (el, n, corners) {
264 var borderSize = this._borderSize(n) + "px";
265 var whichSide = (
266 corners == "top" ? this._whichSideTop() : this._whichSideBottom()
267 );
268
269 var style = el.style;
270 if (whichSide == "left") {
271 style.borderLeftWidth = borderSize;
272 style.borderRightWidth = "0px";
273 } else if (whichSide == "right") {
274 style.borderRightWidth = borderSize;
275 style.borderLeftWidth = "0px";
276 } else {
277 style.borderLeftWidth = borderSize;
278 style.borderRightWidth = borderSize;
279 }
280 },
281
282 _marginSize: function (n) {
283 if (this.isTransparent) {
284 return 0;
285 }
286
287 var o = this.options;
288 if (o.compact && o.blend) {
289 var smBlendedMarginSizes = [1, 0];
290 return smBlendedMarginSizes[n];
291 } else if (o.compact) {
292 var compactMarginSizes = [2, 1];
293 return compactMarginSizes[n];
294 } else if (o.blend) {
295 var blendedMarginSizes = [3, 2, 1, 0];
296 return blendedMarginSizes[n];
297 } else {
298 var marginSizes = [5, 3, 2, 1];
299 return marginSizes[n];
300 }
301 },
302
303 _borderSize: function (n) {
304 var o = this.options;
305 var borderSizes;
306 if (o.compact && (o.blend || this.isTransparent)) {
307 return 1;
308 } else if (o.compact) {
309 borderSizes = [1, 0];
310 } else if (o.blend) {
311 borderSizes = [2, 1, 1, 1];
312 } else if (o.border) {
313 borderSizes = [0, 2, 0, 0];
314 } else if (this.isTransparent) {
315 borderSizes = [5, 3, 2, 1];
316 } else {
317 return 0;
318 }
319 return borderSizes[n];
320 },
321
322 _hasString: function (str) {
323 for (var i = 1; i< arguments.length; i++) {
324 if (str.indexOf(arguments[i]) != -1) {
325 return true;
326 }
327 }
328 return false;
329 },
330
331 _isTopRounded: function () {
332 return this._hasString(this.options.corners,
333 "all", "top", "tl", "tr"
334 );
335 },
336
337 _isBottomRounded: function () {
338 return this._hasString(this.options.corners,
339 "all", "bottom", "bl", "br"
340 );
341 },
342
343 _hasSingleTextChild: function (el) {
344 return (el.childNodes.length == 1 && el.childNodes[0].nodeType == 3);
345 }
346};
347
348/** @id MochiKit.Visual.roundElement */
349MochiKit.Visual.roundElement = function (e, options) {
350 new MochiKit.Visual._RoundCorners(e, options);
351};
352
353/** @id MochiKit.Visual.roundClass */
354MochiKit.Visual.roundClass = function (tagName, className, options) {
355 var elements = MochiKit.DOM.getElementsByTagAndClassName(
356 tagName, className
357 );
358 for (var i = 0; i < elements.length; i++) {
359 MochiKit.Visual.roundElement(elements[i], options);
360 }
361};
362
363/** @id MochiKit.Visual.tagifyText */
364MochiKit.Visual.tagifyText = function (element, /* optional */tagifyStyle) {
365 /***
366
367 Change a node text to character in tags.
368
369 @param tagifyStyle: the style to apply to character nodes, default to
370 'position: relative'.
371
372 ***/
373 tagifyStyle = tagifyStyle || 'position:relative';
374 if (/MSIE/.test(navigator.userAgent)) {
375 tagifyStyle += ';zoom:1';
376 }
377 element = MochiKit.DOM.getElement(element);
378 var ma = MochiKit.Base.map;
379 ma(function (child) {
380 if (child.nodeType == 3) {
381 ma(function (character) {
382 element.insertBefore(
383 MochiKit.DOM.SPAN({style: tagifyStyle},
384 character == ' ' ? String.fromCharCode(160) : character), child);
385 }, child.nodeValue.split(''));
386 MochiKit.DOM.removeElement(child);
387 }
388 }, element.childNodes);
389};
390
391MochiKit.Visual._forceRerendering = function (element) {
392 try {
393 element = MochiKit.DOM.getElement(element);
394 var n = document.createTextNode(' ');
395 element.appendChild(n);
396 element.removeChild(n);
397 } catch(e) {
398 }
399};
400
401/** @id MochiKit.Visual.multiple */
402MochiKit.Visual.multiple = function (elements, effect, /* optional */options) {
403 /***
404
405 Launch the same effect subsequently on given elements.
406
407 ***/
408 options = MochiKit.Base.update({
409 speed: 0.1, delay: 0.0
410 }, options);
411 var masterDelay = options.delay;
412 var index = 0;
413 MochiKit.Base.map(function (innerelement) {
414 options.delay = index * options.speed + masterDelay;
415 new effect(innerelement, options);
416 index += 1;
417 }, elements);
418};
419
420MochiKit.Visual.PAIRS = {
421 'slide': ['slideDown', 'slideUp'],
422 'blind': ['blindDown', 'blindUp'],
423 'appear': ['appear', 'fade'],
424 'size': ['grow', 'shrink']
425};
426
427/** @id MochiKit.Visual.toggle */
428MochiKit.Visual.toggle = function (element, /* optional */effect, /* optional */options) {
429 /***
430
431 Toggle an item between two state depending of its visibility, making
432 a effect between these states. Default effect is 'appear', can be
433 'slide' or 'blind'.
434
435 ***/
436 element = MochiKit.DOM.getElement(element);
437 effect = (effect || 'appear').toLowerCase();
438 options = MochiKit.Base.update({
439 queue: {position: 'end', scope: (element.id || 'global'), limit: 1}
440 }, options);
441 var v = MochiKit.Visual;
442 v[MochiKit.Style.getStyle(element, 'display') != 'none' ?
443 v.PAIRS[effect][1] : v.PAIRS[effect][0]](element, options);
444};
445
446/***
447
448Transitions: define functions calculating variations depending of a position.
449
450***/
451
452MochiKit.Visual.Transitions = { __export__: false };
453
454/** @id MochiKit.Visual.Transitions.linear */
455MochiKit.Visual.Transitions.linear = function (pos) {
456 return pos;
457};
458
459/** @id MochiKit.Visual.Transitions.sinoidal */
460MochiKit.Visual.Transitions.sinoidal = function (pos) {
461 return 0.5 - Math.cos(pos*Math.PI)/2;
462};
463
464/** @id MochiKit.Visual.Transitions.reverse */
465MochiKit.Visual.Transitions.reverse = function (pos) {
466 return 1 - pos;
467};
468
469/** @id MochiKit.Visual.Transitions.flicker */
470MochiKit.Visual.Transitions.flicker = function (pos) {
471 return 0.25 - Math.cos(pos*Math.PI)/4 + Math.random()/2;
472};
473
474/** @id MochiKit.Visual.Transitions.wobble */
475MochiKit.Visual.Transitions.wobble = function (pos) {
476 return 0.5 - Math.cos(9*pos*Math.PI)/2;
477};
478
479/** @id MochiKit.Visual.Transitions.pulse */
480MochiKit.Visual.Transitions.pulse = function (pos, pulses) {
481 if (pulses) {
482 pos *= 2 * pulses;
483 } else {
484 pos *= 10;
485 }
486 var decimals = pos - Math.floor(pos);
487 return (Math.floor(pos) % 2 == 0) ? decimals : 1 - decimals;
488};
489
490/** @id MochiKit.Visual.Transitions.parabolic */
491MochiKit.Visual.Transitions.parabolic = function (pos) {
492 return pos * pos;
493};
494
495/** @id MochiKit.Visual.Transitions.spring */
496MochiKit.Visual.Transitions.spring = function (pos) {
497 return 1 - (Math.cos(pos * 2.5 * Math.PI) * Math.exp(-pos * 6));
498};
499
500/** @id MochiKit.Visual.Transitions.none */
501MochiKit.Visual.Transitions.none = function (pos) {
502 return 0;
503};
504
505/** @id MochiKit.Visual.Transitions.full */
506MochiKit.Visual.Transitions.full = function (pos) {
507 return 1;
508};
509
510/***
511
512Core effects
513
514***/
515
516MochiKit.Visual.ScopedQueue = function () {
517 var cls = arguments.callee;
518 if (!(this instanceof cls)) {
519 return new cls();
520 }
521 this.__init__();
522};
523MochiKit.Visual.ScopedQueue.__export__ = false;
524
525MochiKit.Base.update(MochiKit.Visual.ScopedQueue.prototype, {
526 __init__: function () {
527 this.effects = [];
528 this.interval = null;
529 },
530
531 /** @id MochiKit.Visual.ScopedQueue.prototype.add */
532 add: function (effect) {
533 var timestamp = new Date().getTime();
534
535 var position = (typeof(effect.options.queue) == 'string') ?
536 effect.options.queue : effect.options.queue.position;
537
538 var ma = MochiKit.Base.map;
539 switch (position) {
540 case 'front':
541 // move unstarted effects after this effect
542 ma(function (e) {
543 if (e.state == 'idle') {
544 e.startOn += effect.finishOn;
545 e.finishOn += effect.finishOn;
546 }
547 }, this.effects);
548 break;
549 case 'end':
550 var finish;
551 // start effect after last queued effect has finished
552 ma(function (e) {
553 var i = e.finishOn;
554 if (i >= (finish || i)) {
555 finish = i;
556 }
557 }, this.effects);
558 timestamp = finish || timestamp;
559 break;
560 case 'break':
561 ma(function (e) {
562 e.finalize();
563 }, this.effects);
564 break;
565 case 'replace':
566 ma(function (e) {
567 e.cancel();
568 }, this.effects);
569 break;
570 }
571
572 effect.startOn += timestamp;
573 effect.finishOn += timestamp;
574 if (!effect.options.queue.limit ||
575 this.effects.length < effect.options.queue.limit) {
576 this.effects.push(effect);
577 }
578
579 if (!this.interval) {
580 this.interval = this.startLoop(MochiKit.Base.bind(this.loop, this),
581 40);
582 }
583 },
584
585 /** @id MochiKit.Visual.ScopedQueue.prototype.startLoop */
586 startLoop: function (func, interval) {
587 return setInterval(func, interval);
588 },
589
590 /** @id MochiKit.Visual.ScopedQueue.prototype.remove */
591 remove: function (effect) {
592 this.effects = MochiKit.Base.filter(function (e) {
593 return e != effect;
594 }, this.effects);
595 if (!this.effects.length) {
596 this.stopLoop(this.interval);
597 this.interval = null;
598 }
599 },
600
601 /** @id MochiKit.Visual.ScopedQueue.prototype.stopLoop */
602 stopLoop: function (interval) {
603 clearInterval(interval);
604 },
605
606 /** @id MochiKit.Visual.ScopedQueue.prototype.loop */
607 loop: function () {
608 var timePos = new Date().getTime();
609 MochiKit.Base.map(function (effect) {
610 effect.loop(timePos);
611 }, this.effects);
612 }
613});
614
615MochiKit.Visual.Queues = {
616 __export__: false,
617 instances: {},
618 get: function (queueName) {
619 if (typeof(queueName) != 'string') {
620 return queueName;
621 }
622
623 if (!this.instances[queueName]) {
624 this.instances[queueName] = new MochiKit.Visual.ScopedQueue();
625 }
626 return this.instances[queueName];
627 }
628};
629
630MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global');
631MochiKit.Visual.Queue.__export__ = false;
632
633MochiKit.Visual.DefaultOptions = {
634 __export__: false,
635 transition: MochiKit.Visual.Transitions.sinoidal,
636 duration: 1.0, // seconds
637 fps: 25.0, // max. 25fps due to MochiKit.Visual.Queue implementation
638 sync: false, // true for combining
639 from: 0.0,
640 to: 1.0,
641 delay: 0.0,
642 queue: 'parallel'
643};
644
645MochiKit.Visual.Base = function () {};
646
647MochiKit.Visual.Base.prototype = {
648 /***
649
650 Basic class for all Effects. Define a looping mechanism called for each step
651 of an effect. Don't instantiate it, only subclass it.
652
653 ***/
654
655 __class__ : MochiKit.Visual.Base,
656
657 /** @id MochiKit.Visual.Base.prototype.start */
658 start: function (options) {
659 var v = MochiKit.Visual;
660 this.options = MochiKit.Base.setdefault(options,
661 v.DefaultOptions);
662 this.currentFrame = 0;
663 this.state = 'idle';
664 this.startOn = this.options.delay*1000;
665 this.finishOn = this.startOn + (this.options.duration*1000);
666 this.event('beforeStart');
667 if (!this.options.sync) {
668 v.Queues.get(typeof(this.options.queue) == 'string' ?
669 'global' : this.options.queue.scope).add(this);
670 }
671 },
672
673 /** @id MochiKit.Visual.Base.prototype.loop */
674 loop: function (timePos) {
675 if (timePos >= this.startOn) {
676 if (timePos >= this.finishOn) {
677 return this.finalize();
678 }
679 var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
680 var frame =
681 Math.round(pos * this.options.fps * this.options.duration);
682 if (frame > this.currentFrame) {
683 this.render(pos);
684 this.currentFrame = frame;
685 }
686 }
687 },
688
689 /** @id MochiKit.Visual.Base.prototype.render */
690 render: function (pos) {
691 if (this.state == 'idle') {
692 this.state = 'running';
693 this.event('beforeSetup');
694 this.setup();
695 this.event('afterSetup');
696 }
697 if (this.state == 'running') {
698 var trans = this.options.transition;
699 if (typeof(trans) == "string") {
700 trans = MochiKit.Visual.Transitions[trans];
701 }
702 if (typeof(trans) == "function") {
703 pos = trans(pos);
704 }
705 pos *= (this.options.to - this.options.from);
706 pos += this.options.from;
707 this.event('beforeUpdate');
708 this.update(pos);
709 this.event('afterUpdate');
710 }
711 },
712
713 /** @id MochiKit.Visual.Base.prototype.cancel */
714 cancel: function () {
715 if (!this.options.sync) {
716 MochiKit.Visual.Queues.get(typeof(this.options.queue) == 'string' ?
717 'global' : this.options.queue.scope).remove(this);
718 }
719 this.state = 'finished';
720 },
721
722 /** @id MochiKit.Visual.Base.prototype.finalize */
723 finalize: function () {
724 this.render(1.0);
725 this.cancel();
726 this.event('beforeFinish');
727 this.finish();
728 this.event('afterFinish');
729 },
730
731 setup: function () {
732 },
733
734 finish: function () {
735 },
736
737 update: function (position) {
738 },
739
740 /** @id MochiKit.Visual.Base.prototype.event */
741 event: function (eventName) {
742 if (this.options[eventName + 'Internal']) {
743 this.options[eventName + 'Internal'](this);
744 }
745 if (this.options[eventName]) {
746 this.options[eventName](this);
747 }
748 },
749
750 /** @id MochiKit.Visual.Base.prototype.repr */
751 repr: function () {
752 return '[' + this.__class__.NAME + ', options:' +
753 MochiKit.Base.repr(this.options) + ']';
754 }
755};
756
757/** @id MochiKit.Visual.Parallel */
758MochiKit.Visual.Parallel = function (effects, options) {
759 var cls = arguments.callee;
760 if (!(this instanceof cls)) {
761 return new cls(effects, options);
762 }
763
764 this.__init__(effects, options);
765};
766
767MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base();
768
769MochiKit.Base.update(MochiKit.Visual.Parallel.prototype, {
770 /***
771
772 Run multiple effects at the same time.
773
774 ***/
775
776 __class__ : MochiKit.Visual.Parallel,
777
778 __init__: function (effects, options) {
779 this.effects = effects || [];
780 this.start(options);
781 },
782
783 /** @id MochiKit.Visual.Parallel.prototype.update */
784 update: function (position) {
785 MochiKit.Base.map(function (effect) {
786 effect.render(position);
787 }, this.effects);
788 },
789
790 /** @id MochiKit.Visual.Parallel.prototype.finish */
791 finish: function () {
792 MochiKit.Base.map(function (effect) {
793 effect.finalize();
794 }, this.effects);
795 }
796});
797
798/** @id MochiKit.Visual.Sequence */
799MochiKit.Visual.Sequence = function (effects, options) {
800 var cls = arguments.callee;
801 if (!(this instanceof cls)) {
802 return new cls(effects, options);
803 }
804 this.__init__(effects, options);
805};
806
807MochiKit.Visual.Sequence.prototype = new MochiKit.Visual.Base();
808
809MochiKit.Base.update(MochiKit.Visual.Sequence.prototype, {
810
811 __class__ : MochiKit.Visual.Sequence,
812
813 __init__: function (effects, options) {
814 var defs = { transition: MochiKit.Visual.Transitions.linear,
815 duration: 0 };
816 this.effects = effects || [];
817 MochiKit.Base.map(function (effect) {
818 defs.duration += effect.options.duration;
819 }, this.effects);
820 MochiKit.Base.setdefault(options, defs);
821 this.start(options);
822 },
823
824 /** @id MochiKit.Visual.Sequence.prototype.update */
825 update: function (position) {
826 var time = position * this.options.duration;
827 for (var i = 0; i < this.effects.length; i++) {
828 var effect = this.effects[i];
829 if (time <= effect.options.duration) {
830 effect.render(time / effect.options.duration);
831 break;
832 } else {
833 time -= effect.options.duration;
834 }
835 }
836 },
837
838 /** @id MochiKit.Visual.Sequence.prototype.finish */
839 finish: function () {
840 MochiKit.Base.map(function (effect) {
841 effect.finalize();
842 }, this.effects);
843 }
844});
845
846/** @id MochiKit.Visual.Opacity */
847MochiKit.Visual.Opacity = function (element, options) {
848 var cls = arguments.callee;
849 if (!(this instanceof cls)) {
850 return new cls(element, options);
851 }
852 this.__init__(element, options);
853};
854
855MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base();
856
857MochiKit.Base.update(MochiKit.Visual.Opacity.prototype, {
858 /***
859
860 Change the opacity of an element.
861
862 @param options: 'from' and 'to' change the starting and ending opacities.
863 Must be between 0.0 and 1.0. Default to current opacity and 1.0.
864
865 ***/
866
867 __class__ : MochiKit.Visual.Opacity,
868
869 __init__: function (element, /* optional */options) {
870 var b = MochiKit.Base;
871 var s = MochiKit.Style;
872 this.element = MochiKit.DOM.getElement(element);
873 // make this work on IE on elements without 'layout'
874 if (this.element.currentStyle &&
875 (!this.element.currentStyle.hasLayout)) {
876 s.setStyle(this.element, {zoom: 1});
877 }
878 options = b.update({
879 from: s.getStyle(this.element, 'opacity') || 0.0,
880 to: 1.0
881 }, options);
882 this.start(options);
883 },
884
885 /** @id MochiKit.Visual.Opacity.prototype.update */
886 update: function (position) {
887 MochiKit.Style.setStyle(this.element, {'opacity': position});
888 }
889});
890
891/** @id MochiKit.Visual.Move.prototype */
892MochiKit.Visual.Move = function (element, options) {
893 var cls = arguments.callee;
894 if (!(this instanceof cls)) {
895 return new cls(element, options);
896 }
897 this.__init__(element, options);
898};
899
900MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base();
901
902MochiKit.Base.update(MochiKit.Visual.Move.prototype, {
903 /***
904
905 Move an element between its current position to a defined position
906
907 @param options: 'x' and 'y' for final positions, default to 0, 0.
908
909 ***/
910
911 __class__ : MochiKit.Visual.Move,
912
913 __init__: function (element, /* optional */options) {
914 this.element = MochiKit.DOM.getElement(element);
915 options = MochiKit.Base.update({
916 x: 0,
917 y: 0,
918 mode: 'relative'
919 }, options);
920 this.start(options);
921 },
922
923 /** @id MochiKit.Visual.Move.prototype.setup */
924 setup: function () {
925 // Bug in Opera: Opera returns the 'real' position of a static element
926 // or relative element that does not have top/left explicitly set.
927 // ==> Always set top and left for position relative elements in your
928 // stylesheets (to 0 if you do not need them)
929 MochiKit.Style.makePositioned(this.element);
930
931 var s = this.element.style;
932 var originalVisibility = s.visibility;
933 var originalDisplay = s.display;
934 if (originalDisplay == 'none') {
935 s.visibility = 'hidden';
936 s.display = '';
937 }
938
939 this.originalLeft = parseFloat(MochiKit.Style.getStyle(this.element, 'left') || '0');
940 this.originalTop = parseFloat(MochiKit.Style.getStyle(this.element, 'top') || '0');
941
942 if (this.options.mode == 'absolute') {
943 // absolute movement, so we need to calc deltaX and deltaY
944 this.options.x -= this.originalLeft;
945 this.options.y -= this.originalTop;
946 }
947 if (originalDisplay == 'none') {
948 s.visibility = originalVisibility;
949 s.display = originalDisplay;
950 }
951 },
952
953 /** @id MochiKit.Visual.Move.prototype.update */
954 update: function (position) {
955 MochiKit.Style.setStyle(this.element, {
956 left: Math.round(this.options.x * position + this.originalLeft) + 'px',
957 top: Math.round(this.options.y * position + this.originalTop) + 'px'
958 });
959 }
960});
961
962/** @id MochiKit.Visual.Scale */
963MochiKit.Visual.Scale = function (element, percent, options) {
964 var cls = arguments.callee;
965 if (!(this instanceof cls)) {
966 return new cls(element, percent, options);
967 }
968 this.__init__(element, percent, options);
969};
970
971MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base();
972
973MochiKit.Base.update(MochiKit.Visual.Scale.prototype, {
974 /***
975
976 Change the size of an element.
977
978 @param percent: final_size = percent*original_size
979
980 @param options: several options changing scale behaviour
981
982 ***/
983
984 __class__ : MochiKit.Visual.Scale,
985
986 __init__: function (element, percent, /* optional */options) {
987 this.element = MochiKit.DOM.getElement(element);
988 options = MochiKit.Base.update({
989 scaleX: true,
990 scaleY: true,
991 scaleContent: true,
992 scaleFromCenter: false,
993 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
994 scaleFrom: 100.0,
995 scaleTo: percent
996 }, options);
997 this.start(options);
998 },
999
1000 /** @id MochiKit.Visual.Scale.prototype.setup */
1001 setup: function () {
1002 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
1003 this.elementPositioning = MochiKit.Style.getStyle(this.element,
1004 'position');
1005
1006 var ma = MochiKit.Base.map;
1007 var b = MochiKit.Base.bind;
1008 this.originalStyle = {};
1009 ma(b(function (k) {
1010 this.originalStyle[k] = this.element.style[k];
1011 }, this), ['top', 'left', 'width', 'height', 'fontSize']);
1012
1013 this.originalTop = this.element.offsetTop;
1014 this.originalLeft = this.element.offsetLeft;
1015
1016 var fontSize = MochiKit.Style.getStyle(this.element,
1017 'font-size') || '100%';
1018 ma(b(function (fontSizeType) {
1019 if (fontSize.indexOf(fontSizeType) > 0) {
1020 this.fontSize = parseFloat(fontSize);
1021 this.fontSizeType = fontSizeType;
1022 }
1023 }, this), ['em', 'px', '%']);
1024
1025 this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
1026
1027 if (/^content/.test(this.options.scaleMode)) {
1028 this.dims = [this.element.scrollHeight, this.element.scrollWidth];
1029 } else if (this.options.scaleMode == 'box') {
1030 this.dims = [this.element.offsetHeight, this.element.offsetWidth];
1031 } else {
1032 this.dims = [this.options.scaleMode.originalHeight,
1033 this.options.scaleMode.originalWidth];
1034 }
1035 },
1036
1037 /** @id MochiKit.Visual.Scale.prototype.update */
1038 update: function (position) {
1039 var currentScale = (this.options.scaleFrom/100.0) +
1040 (this.factor * position);
1041 if (this.options.scaleContent && this.fontSize) {
1042 MochiKit.Style.setStyle(this.element, {
1043 fontSize: this.fontSize * currentScale + this.fontSizeType
1044 });
1045 }
1046 this.setDimensions(this.dims[0] * currentScale,
1047 this.dims[1] * currentScale);
1048 },
1049
1050 /** @id MochiKit.Visual.Scale.prototype.finish */
1051 finish: function () {
1052 if (this.restoreAfterFinish) {
1053 MochiKit.Style.setStyle(this.element, this.originalStyle);
1054 }
1055 },
1056
1057 /** @id MochiKit.Visual.Scale.prototype.setDimensions */
1058 setDimensions: function (height, width) {
1059 var d = {};
1060 var r = Math.round;
1061 if (/MSIE/.test(navigator.userAgent)) {
1062 r = Math.ceil;
1063 }
1064 if (this.options.scaleX) {
1065 d.width = r(width) + 'px';
1066 }
1067 if (this.options.scaleY) {
1068 d.height = r(height) + 'px';
1069 }
1070 if (this.options.scaleFromCenter) {
1071 var topd = (height - this.dims[0])/2;
1072 var leftd = (width - this.dims[1])/2;
1073 if (this.elementPositioning == 'absolute') {
1074 if (this.options.scaleY) {
1075 d.top = this.originalTop - topd + 'px';
1076 }
1077 if (this.options.scaleX) {
1078 d.left = this.originalLeft - leftd + 'px';
1079 }
1080 } else {
1081 if (this.options.scaleY) {
1082 d.top = -topd + 'px';
1083 }
1084 if (this.options.scaleX) {
1085 d.left = -leftd + 'px';
1086 }
1087 }
1088 }
1089 MochiKit.Style.setStyle(this.element, d);
1090 }
1091});
1092
1093/** @id MochiKit.Visual.Highlight */
1094MochiKit.Visual.Highlight = function (element, options) {
1095 var cls = arguments.callee;
1096 if (!(this instanceof cls)) {
1097 return new cls(element, options);
1098 }
1099 this.__init__(element, options);
1100};
1101
1102MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base();
1103
1104MochiKit.Base.update(MochiKit.Visual.Highlight.prototype, {
1105 /***
1106
1107 Highlight an item of the page.
1108
1109 @param options: 'startcolor' for choosing highlighting color, default
1110 to '#ffff99'.
1111
1112 ***/
1113
1114 __class__ : MochiKit.Visual.Highlight,
1115
1116 __init__: function (element, /* optional */options) {
1117 this.element = MochiKit.DOM.getElement(element);
1118 options = MochiKit.Base.update({
1119 startcolor: '#ffff99'
1120 }, options);
1121 this.start(options);
1122 },
1123
1124 /** @id MochiKit.Visual.Highlight.prototype.setup */
1125 setup: function () {
1126 var b = MochiKit.Base;
1127 var s = MochiKit.Style;
1128 // Prevent executing on elements not in the layout flow
1129 if (s.getStyle(this.element, 'display') == 'none') {
1130 this.cancel();
1131 return;
1132 }
1133 // Disable background image during the effect
1134 this.oldStyle = {
1135 backgroundImage: s.getStyle(this.element, 'background-image')
1136 };
1137 s.setStyle(this.element, {
1138 backgroundImage: 'none'
1139 });
1140
1141 if (!this.options.endcolor) {
1142 this.options.endcolor =
1143 MochiKit.Color.Color.fromBackground(this.element).toHexString();
1144 }
1145 if (b.isUndefinedOrNull(this.options.restorecolor)) {
1146 this.options.restorecolor = s.getStyle(this.element,
1147 'background-color');
1148 }
1149 // init color calculations
1150 this._base = b.map(b.bind(function (i) {
1151 return parseInt(
1152 this.options.startcolor.slice(i*2 + 1, i*2 + 3), 16);
1153 }, this), [0, 1, 2]);
1154 this._delta = b.map(b.bind(function (i) {
1155 return parseInt(this.options.endcolor.slice(i*2 + 1, i*2 + 3), 16)
1156 - this._base[i];
1157 }, this), [0, 1, 2]);
1158 },
1159
1160 /** @id MochiKit.Visual.Highlight.prototype.update */
1161 update: function (position) {
1162 var m = '#';
1163 MochiKit.Base.map(MochiKit.Base.bind(function (i) {
1164 m += MochiKit.Color.toColorPart(Math.round(this._base[i] +
1165 this._delta[i]*position));
1166 }, this), [0, 1, 2]);
1167 MochiKit.Style.setStyle(this.element, {
1168 backgroundColor: m
1169 });
1170 },
1171
1172 /** @id MochiKit.Visual.Highlight.prototype.finish */
1173 finish: function () {
1174 MochiKit.Style.setStyle(this.element,
1175 MochiKit.Base.update(this.oldStyle, {
1176 backgroundColor: this.options.restorecolor
1177 }));
1178 }
1179});
1180
1181/** @id MochiKit.Visual.ScrollTo */
1182MochiKit.Visual.ScrollTo = function (element, options) {
1183 var cls = arguments.callee;
1184 if (!(this instanceof cls)) {
1185 return new cls(element, options);
1186 }
1187 this.__init__(element, options);
1188};
1189
1190MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base();
1191
1192MochiKit.Base.update(MochiKit.Visual.ScrollTo.prototype, {
1193 /***
1194
1195 Scroll to an element in the page.
1196
1197 ***/
1198
1199 __class__ : MochiKit.Visual.ScrollTo,
1200
1201 __init__: function (element, /* optional */options) {
1202 this.element = MochiKit.DOM.getElement(element);
1203 this.start(options);
1204 },
1205
1206 /** @id MochiKit.Visual.ScrollTo.prototype.setup */
1207 setup: function () {
1208 var p = MochiKit.Position;
1209 p.prepare();
1210 var offsets = p.cumulativeOffset(this.element);
1211 if (this.options.offset) {
1212 offsets.y += this.options.offset;
1213 }
1214 var max;
1215 if (window.innerHeight) {
1216 max = window.innerHeight - window.height;
1217 } else if (document.documentElement &&
1218 document.documentElement.clientHeight) {
1219 max = document.documentElement.clientHeight -
1220 document.body.scrollHeight;
1221 } else if (document.body) {
1222 max = document.body.clientHeight - document.body.scrollHeight;
1223 }
1224 this.scrollStart = p.windowOffset.y;
1225 this.delta = (offsets.y > max ? max : offsets.y) - this.scrollStart;
1226 },
1227
1228 /** @id MochiKit.Visual.ScrollTo.prototype.update */
1229 update: function (position) {
1230 var p = MochiKit.Position;
1231 p.prepare();
1232 window.scrollTo(p.windowOffset.x, this.scrollStart + (position * this.delta));
1233 }
1234});
1235
1236MochiKit.Visual._CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
1237
1238MochiKit.Visual.Morph = function (element, options) {
1239 var cls = arguments.callee;
1240 if (!(this instanceof cls)) {
1241 return new cls(element, options);
1242 }
1243 this.__init__(element, options);
1244};
1245
1246MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base();
1247
1248MochiKit.Base.update(MochiKit.Visual.Morph.prototype, {
1249 /***
1250
1251 Morph effect: make a transformation from current style to the given style,
1252 automatically making a transition between the two.
1253
1254 ***/
1255
1256 __class__ : MochiKit.Visual.Morph,
1257
1258 __init__: function (element, /* optional */options) {
1259 this.element = MochiKit.DOM.getElement(element);
1260 this.start(options);
1261 },
1262
1263 /** @id MochiKit.Visual.Morph.prototype.setup */
1264 setup: function () {
1265 var b = MochiKit.Base;
1266 var style = this.options.style;
1267 this.styleStart = {};
1268 this.styleEnd = {};
1269 this.units = {};
1270 var value, unit;
1271 for (var s in style) {
1272 value = style[s];
1273 s = b.camelize(s);
1274 if (MochiKit.Visual._CSS_LENGTH.test(value)) {
1275 var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
1276 value = parseFloat(components[1]);
1277 unit = (components.length == 3) ? components[2] : null;
1278 this.styleEnd[s] = value;
1279 this.units[s] = unit;
1280 value = MochiKit.Style.getStyle(this.element, s);
1281 components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
1282 value = parseFloat(components[1]);
1283 this.styleStart[s] = value;
1284 } else if (/[Cc]olor$/.test(s)) {
1285 var c = MochiKit.Color.Color;
1286 value = c.fromString(value);
1287 if (value) {
1288 this.units[s] = "color";
1289 this.styleEnd[s] = value.toHexString();
1290 value = MochiKit.Style.getStyle(this.element, s);
1291 this.styleStart[s] = c.fromString(value).toHexString();
1292
1293 this.styleStart[s] = b.map(b.bind(function (i) {
1294 return parseInt(
1295 this.styleStart[s].slice(i*2 + 1, i*2 + 3), 16);
1296 }, this), [0, 1, 2]);
1297 this.styleEnd[s] = b.map(b.bind(function (i) {
1298 return parseInt(
1299 this.styleEnd[s].slice(i*2 + 1, i*2 + 3), 16);
1300 }, this), [0, 1, 2]);
1301 }
1302 } else {
1303 // For non-length & non-color properties, we just set the value
1304 this.element.style[s] = value;
1305 }
1306 }
1307 },
1308
1309 /** @id MochiKit.Visual.Morph.prototype.update */
1310 update: function (position) {
1311 var value;
1312 for (var s in this.styleStart) {
1313 if (this.units[s] == "color") {
1314 var m = '#';
1315 var start = this.styleStart[s];
1316 var end = this.styleEnd[s];
1317 MochiKit.Base.map(MochiKit.Base.bind(function (i) {
1318 m += MochiKit.Color.toColorPart(Math.round(start[i] +
1319 (end[i] - start[i])*position));
1320 }, this), [0, 1, 2]);
1321 this.element.style[s] = m;
1322 } else {
1323 value = this.styleStart[s] + Math.round((this.styleEnd[s] - this.styleStart[s]) * position * 1000) / 1000 + this.units[s];
1324 this.element.style[s] = value;
1325 }
1326 }
1327 }
1328});
1329
1330/***
1331
1332Combination effects.
1333
1334***/
1335
1336/** @id MochiKit.Visual.fade */
1337MochiKit.Visual.fade = function (element, /* optional */ options) {
1338 /***
1339
1340 Fade a given element: change its opacity and hide it in the end.
1341
1342 @param options: 'to' and 'from' to change opacity.
1343
1344 ***/
1345 var s = MochiKit.Style;
1346 var oldOpacity = s.getStyle(element, 'opacity');
1347 options = MochiKit.Base.update({
1348 from: s.getStyle(element, 'opacity') || 1.0,
1349 to: 0.0,
1350 afterFinishInternal: function (effect) {
1351 if (effect.options.to !== 0) {
1352 return;
1353 }
1354 s.hideElement(effect.element);
1355 s.setStyle(effect.element, {'opacity': oldOpacity});
1356 }
1357 }, options);
1358 return new MochiKit.Visual.Opacity(element, options);
1359};
1360
1361/** @id MochiKit.Visual.appear */
1362MochiKit.Visual.appear = function (element, /* optional */ options) {
1363 /***
1364
1365 Make an element appear.
1366
1367 @param options: 'to' and 'from' to change opacity.
1368
1369 ***/
1370 var s = MochiKit.Style;
1371 var v = MochiKit.Visual;
1372 options = MochiKit.Base.update({
1373 from: (s.getStyle(element, 'display') == 'none' ? 0.0 :
1374 s.getStyle(element, 'opacity') || 0.0),
1375 to: 1.0,
1376 // force Safari to render floated elements properly
1377 afterFinishInternal: function (effect) {
1378 v._forceRerendering(effect.element);
1379 },
1380 beforeSetupInternal: function (effect) {
1381 s.setStyle(effect.element, {'opacity': effect.options.from});
1382 s.showElement(effect.element);
1383 }
1384 }, options);
1385 return new v.Opacity(element, options);
1386};
1387
1388/** @id MochiKit.Visual.puff */
1389MochiKit.Visual.puff = function (element, /* optional */ options) {
1390 /***
1391
1392 'Puff' an element: grow it to double size, fading it and make it hidden.
1393
1394 ***/
1395 var s = MochiKit.Style;
1396 var v = MochiKit.Visual;
1397 element = MochiKit.DOM.getElement(element);
1398 var elementDimensions = MochiKit.Style.getElementDimensions(element, true);
1399 var oldStyle = {
1400 position: s.getStyle(element, 'position'),
1401 top: element.style.top,
1402 left: element.style.left,
1403 width: element.style.width,
1404 height: element.style.height,
1405 opacity: s.getStyle(element, 'opacity')
1406 };
1407 options = MochiKit.Base.update({
1408 beforeSetupInternal: function (effect) {
1409 MochiKit.Position.absolutize(effect.effects[0].element);
1410 },
1411 afterFinishInternal: function (effect) {
1412 s.hideElement(effect.effects[0].element);
1413 s.setStyle(effect.effects[0].element, oldStyle);
1414 },
1415 scaleContent: true,
1416 scaleFromCenter: true
1417 }, options);
1418 return new v.Parallel(
1419 [new v.Scale(element, 200,
1420 {sync: true, scaleFromCenter: options.scaleFromCenter,
1421 scaleMode: {originalHeight: elementDimensions.h,
1422 originalWidth: elementDimensions.w},
1423 scaleContent: options.scaleContent, restoreAfterFinish: true}),
1424 new v.Opacity(element, {sync: true, to: 0.0 })],
1425 options);
1426};
1427
1428/** @id MochiKit.Visual.blindUp */
1429MochiKit.Visual.blindUp = function (element, /* optional */ options) {
1430 /***
1431
1432 Blind an element up: change its vertical size to 0.
1433
1434 ***/
1435 var d = MochiKit.DOM;
1436 var s = MochiKit.Style;
1437 element = d.getElement(element);
1438 var elementDimensions = s.getElementDimensions(element, true);
1439 var elemClip = s.makeClipping(element);
1440 options = MochiKit.Base.update({
1441 scaleContent: false,
1442 scaleX: false,
1443 scaleMode: {originalHeight: elementDimensions.h,
1444 originalWidth: elementDimensions.w},
1445 restoreAfterFinish: true,
1446 afterFinishInternal: function (effect) {
1447 s.hideElement(effect.element);
1448 s.undoClipping(effect.element, elemClip);
1449 }
1450 }, options);
1451 return new MochiKit.Visual.Scale(element, 0, options);
1452};
1453
1454/** @id MochiKit.Visual.blindDown */
1455MochiKit.Visual.blindDown = function (element, /* optional */ options) {
1456 /***
1457
1458 Blind an element down: restore its vertical size.
1459
1460 ***/
1461 var d = MochiKit.DOM;
1462 var s = MochiKit.Style;
1463 element = d.getElement(element);
1464 var elementDimensions = s.getElementDimensions(element, true);
1465 var elemClip;
1466 options = MochiKit.Base.update({
1467 scaleContent: false,
1468 scaleX: false,
1469 scaleFrom: 0,
1470 scaleMode: {originalHeight: elementDimensions.h,
1471 originalWidth: elementDimensions.w},
1472 restoreAfterFinish: true,
1473 afterSetupInternal: function (effect) {
1474 elemClip = s.makeClipping(effect.element);
1475 s.setStyle(effect.element, {height: '0px'});
1476 s.showElement(effect.element);
1477 },
1478 afterFinishInternal: function (effect) {
1479 s.undoClipping(effect.element, elemClip);
1480 }
1481 }, options);
1482 return new MochiKit.Visual.Scale(element, 100, options);
1483};
1484
1485/** @id MochiKit.Visual.switchOff */
1486MochiKit.Visual.switchOff = function (element, /* optional */ options) {
1487 /***
1488
1489 Apply a switch-off-like effect.
1490
1491 ***/
1492 var d = MochiKit.DOM;
1493 var s = MochiKit.Style;
1494 element = d.getElement(element);
1495 var elementDimensions = s.getElementDimensions(element, true);
1496 var oldOpacity = s.getStyle(element, 'opacity');
1497 var elemClip;
1498 options = MochiKit.Base.update({
1499 duration: 0.7,
1500 restoreAfterFinish: true,
1501 beforeSetupInternal: function (effect) {
1502 s.makePositioned(element);
1503 elemClip = s.makeClipping(element);
1504 },
1505 afterFinishInternal: function (effect) {
1506 s.hideElement(element);
1507 s.undoClipping(element, elemClip);
1508 s.undoPositioned(element);
1509 s.setStyle(element, {'opacity': oldOpacity});
1510 }
1511 }, options);
1512 var v = MochiKit.Visual;
1513 return new v.Sequence(
1514 [new v.appear(element,
1515 { sync: true, duration: 0.57 * options.duration,
1516 from: 0, transition: v.Transitions.flicker }),
1517 new v.Scale(element, 1,
1518 { sync: true, duration: 0.43 * options.duration,
1519 scaleFromCenter: true, scaleX: false,
1520 scaleMode: {originalHeight: elementDimensions.h,
1521 originalWidth: elementDimensions.w},
1522 scaleContent: false, restoreAfterFinish: true })],
1523 options);
1524};
1525
1526/** @id MochiKit.Visual.dropOut */
1527MochiKit.Visual.dropOut = function (element, /* optional */ options) {
1528 /***
1529
1530 Make an element fall and disappear.
1531
1532 ***/
1533 var d = MochiKit.DOM;
1534 var s = MochiKit.Style;
1535 element = d.getElement(element);
1536 var oldStyle = {
1537 top: s.getStyle(element, 'top'),
1538 left: s.getStyle(element, 'left'),
1539 opacity: s.getStyle(element, 'opacity')
1540 };
1541
1542 options = MochiKit.Base.update({
1543 duration: 0.5,
1544 distance: 100,
1545 beforeSetupInternal: function (effect) {
1546 s.makePositioned(effect.effects[0].element);
1547 },
1548 afterFinishInternal: function (effect) {
1549 s.hideElement(effect.effects[0].element);
1550 s.undoPositioned(effect.effects[0].element);
1551 s.setStyle(effect.effects[0].element, oldStyle);
1552 }
1553 }, options);
1554 var v = MochiKit.Visual;
1555 return new v.Parallel(
1556 [new v.Move(element, {x: 0, y: options.distance, sync: true}),
1557 new v.Opacity(element, {sync: true, to: 0.0})],
1558 options);
1559};
1560
1561/** @id MochiKit.Visual.shake */
1562MochiKit.Visual.shake = function (element, /* optional */ options) {
1563 /***
1564
1565 Move an element from left to right several times.
1566
1567 ***/
1568 var d = MochiKit.DOM;
1569 var v = MochiKit.Visual;
1570 var s = MochiKit.Style;
1571 element = d.getElement(element);
1572 var oldStyle = {
1573 top: s.getStyle(element, 'top'),
1574 left: s.getStyle(element, 'left')
1575 };
1576 options = MochiKit.Base.update({
1577 duration: 0.5,
1578 afterFinishInternal: function (effect) {
1579 s.undoPositioned(element);
1580 s.setStyle(element, oldStyle);
1581 }
1582 }, options);
1583 return new v.Sequence(
1584 [new v.Move(element, { sync: true, duration: 0.1 * options.duration,
1585 x: 20, y: 0 }),
1586 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1587 x: -40, y: 0 }),
1588 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1589 x: 40, y: 0 }),
1590 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1591 x: -40, y: 0 }),
1592 new v.Move(element, { sync: true, duration: 0.2 * options.duration,
1593 x: 40, y: 0 }),
1594 new v.Move(element, { sync: true, duration: 0.1 * options.duration,
1595 x: -20, y: 0 })],
1596 options);
1597};
1598
1599/** @id MochiKit.Visual.slideDown */
1600MochiKit.Visual.slideDown = function (element, /* optional */ options) {
1601 /***
1602
1603 Slide an element down.
1604 It needs to have the content of the element wrapped in a container
1605 element with fixed height.
1606
1607 ***/
1608 var d = MochiKit.DOM;
1609 var b = MochiKit.Base;
1610 var s = MochiKit.Style;
1611 element = d.getElement(element);
1612 if (!element.firstChild) {
1613 throw new Error("MochiKit.Visual.slideDown must be used on a element with a child");
1614 }
1615 d.removeEmptyTextNodes(element);
1616 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom') || 0;
1617 var elementDimensions = s.getElementDimensions(element, true);
1618 var elemClip;
1619 options = b.update({
1620 scaleContent: false,
1621 scaleX: false,
1622 scaleFrom: 0,
1623 scaleMode: {originalHeight: elementDimensions.h,
1624 originalWidth: elementDimensions.w},
1625 restoreAfterFinish: true,
1626 afterSetupInternal: function (effect) {
1627 s.makePositioned(effect.element);
1628 s.makePositioned(effect.element.firstChild);
1629 if (/Opera/.test(navigator.userAgent)) {
1630 s.setStyle(effect.element, {top: ''});
1631 }
1632 elemClip = s.makeClipping(effect.element);
1633 s.setStyle(effect.element, {height: '0px'});
1634 s.showElement(effect.element);
1635 },
1636 afterUpdateInternal: function (effect) {
1637 var elementDimensions = s.getElementDimensions(effect.element, true);
1638 s.setStyle(effect.element.firstChild,
1639 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'});
1640 },
1641 afterFinishInternal: function (effect) {
1642 s.undoClipping(effect.element, elemClip);
1643 // IE will crash if child is undoPositioned first
1644 if (/MSIE/.test(navigator.userAgent)) {
1645 s.undoPositioned(effect.element);
1646 s.undoPositioned(effect.element.firstChild);
1647 } else {
1648 s.undoPositioned(effect.element.firstChild);
1649 s.undoPositioned(effect.element);
1650 }
1651 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom});
1652 }
1653 }, options);
1654
1655 return new MochiKit.Visual.Scale(element, 100, options);
1656};
1657
1658/** @id MochiKit.Visual.slideUp */
1659MochiKit.Visual.slideUp = function (element, /* optional */ options) {
1660 /***
1661
1662 Slide an element up.
1663 It needs to have the content of the element wrapped in a container
1664 element with fixed height.
1665
1666 ***/
1667 var d = MochiKit.DOM;
1668 var b = MochiKit.Base;
1669 var s = MochiKit.Style;
1670 element = d.getElement(element);
1671 if (!element.firstChild) {
1672 throw new Error("MochiKit.Visual.slideUp must be used on a element with a child");
1673 }
1674 d.removeEmptyTextNodes(element);
1675 var oldInnerBottom = s.getStyle(element.firstChild, 'bottom');
1676 var elementDimensions = s.getElementDimensions(element, true);
1677 var elemClip;
1678 options = b.update({
1679 scaleContent: false,
1680 scaleX: false,
1681 scaleMode: {originalHeight: elementDimensions.h,
1682 originalWidth: elementDimensions.w},
1683 scaleFrom: 100,
1684 restoreAfterFinish: true,
1685 beforeStartInternal: function (effect) {
1686 s.makePositioned(effect.element);
1687 s.makePositioned(effect.element.firstChild);
1688 if (/Opera/.test(navigator.userAgent)) {
1689 s.setStyle(effect.element, {top: ''});
1690 }
1691 elemClip = s.makeClipping(effect.element);
1692 s.showElement(effect.element);
1693 },
1694 afterUpdateInternal: function (effect) {
1695 var elementDimensions = s.getElementDimensions(effect.element, true);
1696 s.setStyle(effect.element.firstChild,
1697 {bottom: (effect.dims[0] - elementDimensions.h) + 'px'});
1698 },
1699 afterFinishInternal: function (effect) {
1700 s.hideElement(effect.element);
1701 s.undoClipping(effect.element, elemClip);
1702 s.undoPositioned(effect.element.firstChild);
1703 s.undoPositioned(effect.element);
1704 s.setStyle(effect.element.firstChild, {bottom: oldInnerBottom});
1705 }
1706 }, options);
1707 return new MochiKit.Visual.Scale(element, 0, options);
1708};
1709
1710// Bug in opera makes the TD containing this element expand for a instance
1711// after finish
1712/** @id MochiKit.Visual.squish */
1713MochiKit.Visual.squish = function (element, /* optional */ options) {
1714 /***
1715
1716 Reduce an element and make it disappear.
1717
1718 ***/
1719 var d = MochiKit.DOM;
1720 var b = MochiKit.Base;
1721 var s = MochiKit.Style;
1722 var elementDimensions = s.getElementDimensions(element, true);
1723 var elemClip;
1724 options = b.update({
1725 restoreAfterFinish: true,
1726 scaleMode: {originalHeight: elementDimensions.h,
1727 originalWidth: elementDimensions.w},
1728 beforeSetupInternal: function (effect) {
1729 elemClip = s.makeClipping(effect.element);
1730 },
1731 afterFinishInternal: function (effect) {
1732 s.hideElement(effect.element);
1733 s.undoClipping(effect.element, elemClip);
1734 }
1735 }, options);
1736
1737 return new MochiKit.Visual.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, options);
1738};
1739
1740/** @id MochiKit.Visual.grow */
1741MochiKit.Visual.grow = function (element, /* optional */ options) {
1742 /***
1743
1744 Grow an element to its original size. Make it zero-sized before
1745 if necessary.
1746
1747 ***/
1748 var d = MochiKit.DOM;
1749 var v = MochiKit.Visual;
1750 var s = MochiKit.Style;
1751 element = d.getElement(element);
1752 options = MochiKit.Base.update({
1753 direction: 'center',
1754 moveTransition: v.Transitions.sinoidal,
1755 scaleTransition: v.Transitions.sinoidal,
1756 opacityTransition: v.Transitions.full,
1757 scaleContent: true,
1758 scaleFromCenter: false
1759 }, options);
1760 var oldStyle = {
1761 top: element.style.top,
1762 left: element.style.left,
1763 height: element.style.height,
1764 width: element.style.width,
1765 opacity: s.getStyle(element, 'opacity')
1766 };
1767 var dims = s.getElementDimensions(element, true);
1768 var initialMoveX, initialMoveY;
1769 var moveX, moveY;
1770
1771 switch (options.direction) {
1772 case 'top-left':
1773 initialMoveX = initialMoveY = moveX = moveY = 0;
1774 break;
1775 case 'top-right':
1776 initialMoveX = dims.w;
1777 initialMoveY = moveY = 0;
1778 moveX = -dims.w;
1779 break;
1780 case 'bottom-left':
1781 initialMoveX = moveX = 0;
1782 initialMoveY = dims.h;
1783 moveY = -dims.h;
1784 break;
1785 case 'bottom-right':
1786 initialMoveX = dims.w;
1787 initialMoveY = dims.h;
1788 moveX = -dims.w;
1789 moveY = -dims.h;
1790 break;
1791 case 'center':
1792 initialMoveX = dims.w / 2;
1793 initialMoveY = dims.h / 2;
1794 moveX = -dims.w / 2;
1795 moveY = -dims.h / 2;
1796 break;
1797 }
1798
1799 var optionsParallel = MochiKit.Base.update({
1800 beforeSetupInternal: function (effect) {
1801 s.setStyle(effect.effects[0].element, {height: '0px'});
1802 s.showElement(effect.effects[0].element);
1803 },
1804 afterFinishInternal: function (effect) {
1805 s.undoClipping(effect.effects[0].element);
1806 s.undoPositioned(effect.effects[0].element);
1807 s.setStyle(effect.effects[0].element, oldStyle);
1808 }
1809 }, options);
1810
1811 return new v.Move(element, {
1812 x: initialMoveX,
1813 y: initialMoveY,
1814 duration: 0.01,
1815 beforeSetupInternal: function (effect) {
1816 s.hideElement(effect.element);
1817 s.makeClipping(effect.element);
1818 s.makePositioned(effect.element);
1819 },
1820 afterFinishInternal: function (effect) {
1821 new v.Parallel(
1822 [new v.Opacity(effect.element, {
1823 sync: true, to: 1.0, from: 0.0,
1824 transition: options.opacityTransition
1825 }),
1826 new v.Move(effect.element, {
1827 x: moveX, y: moveY, sync: true,
1828 transition: options.moveTransition
1829 }),
1830 new v.Scale(effect.element, 100, {
1831 scaleMode: {originalHeight: dims.h,
1832 originalWidth: dims.w},
1833 sync: true,
1834 scaleFrom: /Opera/.test(navigator.userAgent) ? 1 : 0,
1835 transition: options.scaleTransition,
1836 scaleContent: options.scaleContent,
1837 scaleFromCenter: options.scaleFromCenter,
1838 restoreAfterFinish: true
1839 })
1840 ], optionsParallel
1841 );
1842 }
1843 });
1844};
1845
1846/** @id MochiKit.Visual.shrink */
1847MochiKit.Visual.shrink = function (element, /* optional */ options) {
1848 /***
1849
1850 Shrink an element and make it disappear.
1851
1852 ***/
1853 var d = MochiKit.DOM;
1854 var v = MochiKit.Visual;
1855 var s = MochiKit.Style;
1856 element = d.getElement(element);
1857 options = MochiKit.Base.update({
1858 direction: 'center',
1859 moveTransition: v.Transitions.sinoidal,
1860 scaleTransition: v.Transitions.sinoidal,
1861 opacityTransition: v.Transitions.none,
1862 scaleContent: true,
1863 scaleFromCenter: false
1864 }, options);
1865 var oldStyle = {
1866 top: element.style.top,
1867 left: element.style.left,
1868 height: element.style.height,
1869 width: element.style.width,
1870 opacity: s.getStyle(element, 'opacity')
1871 };
1872
1873 var dims = s.getElementDimensions(element, true);
1874 var moveX, moveY;
1875
1876 switch (options.direction) {
1877 case 'top-left':
1878 moveX = moveY = 0;
1879 break;
1880 case 'top-right':
1881 moveX = dims.w;
1882 moveY = 0;
1883 break;
1884 case 'bottom-left':
1885 moveX = 0;
1886 moveY = dims.h;
1887 break;
1888 case 'bottom-right':
1889 moveX = dims.w;
1890 moveY = dims.h;
1891 break;
1892 case 'center':
1893 moveX = dims.w / 2;
1894 moveY = dims.h / 2;
1895 break;
1896 }
1897 var elemClip;
1898
1899 var optionsParallel = MochiKit.Base.update({
1900 beforeStartInternal: function (effect) {
1901 s.makePositioned(effect.effects[0].element);
1902 elemClip = s.makeClipping(effect.effects[0].element);
1903 },
1904 afterFinishInternal: function (effect) {
1905 s.hideElement(effect.effects[0].element);
1906 s.undoClipping(effect.effects[0].element, elemClip);
1907 s.undoPositioned(effect.effects[0].element);
1908 s.setStyle(effect.effects[0].element, oldStyle);
1909 }
1910 }, options);
1911
1912 return new v.Parallel(
1913 [new v.Opacity(element, {
1914 sync: true, to: 0.0, from: 1.0,
1915 transition: options.opacityTransition
1916 }),
1917 new v.Scale(element, /Opera/.test(navigator.userAgent) ? 1 : 0, {
1918 scaleMode: {originalHeight: dims.h, originalWidth: dims.w},
1919 sync: true, transition: options.scaleTransition,
1920 scaleContent: options.scaleContent,
1921 scaleFromCenter: options.scaleFromCenter,
1922 restoreAfterFinish: true
1923 }),
1924 new v.Move(element, {
1925 x: moveX, y: moveY, sync: true, transition: options.moveTransition
1926 })
1927 ], optionsParallel
1928 );
1929};
1930
1931/** @id MochiKit.Visual.pulsate */
1932MochiKit.Visual.pulsate = function (element, /* optional */ options) {
1933 /***
1934
1935 Pulse an element between appear/fade.
1936
1937 ***/
1938 var d = MochiKit.DOM;
1939 var v = MochiKit.Visual;
1940 var b = MochiKit.Base;
1941 var oldOpacity = MochiKit.Style.getStyle(element, 'opacity');
1942 options = b.update({
1943 duration: 3.0,
1944 from: 0,
1945 afterFinishInternal: function (effect) {
1946 MochiKit.Style.setStyle(effect.element, {'opacity': oldOpacity});
1947 }
1948 }, options);
1949 var transition = options.transition || v.Transitions.sinoidal;
1950 options.transition = function (pos) {
1951 return transition(1 - v.Transitions.pulse(pos, options.pulses));
1952 };
1953 return new v.Opacity(element, options);
1954};
1955
1956/** @id MochiKit.Visual.fold */
1957MochiKit.Visual.fold = function (element, /* optional */ options) {
1958 /***
1959
1960 Fold an element, first vertically, then horizontally.
1961
1962 ***/
1963 var d = MochiKit.DOM;
1964 var v = MochiKit.Visual;
1965 var s = MochiKit.Style;
1966 element = d.getElement(element);
1967 var elementDimensions = s.getElementDimensions(element, true);
1968 var oldStyle = {
1969 top: element.style.top,
1970 left: element.style.left,
1971 width: element.style.width,
1972 height: element.style.height
1973 };
1974 var elemClip = s.makeClipping(element);
1975 options = MochiKit.Base.update({
1976 scaleContent: false,
1977 scaleX: false,
1978 scaleMode: {originalHeight: elementDimensions.h,
1979 originalWidth: elementDimensions.w},
1980 afterFinishInternal: function (effect) {
1981 new v.Scale(element, 1, {
1982 scaleContent: false,
1983 scaleY: false,
1984 scaleMode: {originalHeight: elementDimensions.h,
1985 originalWidth: elementDimensions.w},
1986 afterFinishInternal: function (effect) {
1987 s.hideElement(effect.element);
1988 s.undoClipping(effect.element, elemClip);
1989 s.setStyle(effect.element, oldStyle);
1990 }
1991 });
1992 }
1993 }, options);
1994 return new v.Scale(element, 5, options);
1995};
1996
1997
1998MochiKit.Base.nameFunctions(MochiKit.Visual);
1999MochiKit.Base._exportSymbols(this, MochiKit.Visual);
diff --git a/frontend/delta/js/React/react-0.4.1.js b/frontend/delta/js/React/react-0.4.1.js
new file mode 100644
index 0000000..d029de2
--- a/dev/null
+++ b/frontend/delta/js/React/react-0.4.1.js
@@ -0,0 +1,11491 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24/**
25 * React v0.4.1
26 */
27(function(e){if("function"==typeof bootstrap)bootstrap("react",e);else if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else if("undefined"!=typeof ses){if(!ses.ok())return;ses.makeReact=e}else"undefined"!=typeof window?window.React=e():global.React=e()})(function(){var define,ses,bootstrap,module,exports;
28return (function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({1:[function(require,module,exports){
29/**
30 * Copyright 2013 Facebook, Inc.
31 *
32 * Licensed under the Apache License, Version 2.0 (the "License");
33 * you may not use this file except in compliance with the License.
34 * You may obtain a copy of the License at
35 *
36 * http://www.apache.org/licenses/LICENSE-2.0
37 *
38 * Unless required by applicable law or agreed to in writing, software
39 * distributed under the License is distributed on an "AS IS" BASIS,
40 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
41 * See the License for the specific language governing permissions and
42 * limitations under the License.
43 *
44 * @providesModule $
45 * @typechecks
46 */
47
48var ge = require("./ge");
49var ex = require("./ex");
50
51/**
52 * @param {string|DOMDocument|DOMElement|DOMTextNode} id
53 * @return {DOMDocument|DOMElement|DOMTextNode}
54 *
55 * Find a node by ID.
56 *
57 * If your application code depends on the existence of the element, use $,
58 * which will throw if the element doesn't exist.
59 *
60 * If you're not sure whether or not the element exists, use ge instead, and
61 * manually check for the element's existence in your application code.
62 */
63function $(id) {
64 var element = ge(id);
65 if (!element) {
66 throw new Error(ex(
67 'Tried to get element with id of "%s" but it is not present on the page.',
68 id
69 ));
70 }
71 return element;
72}
73
74module.exports = $;
75
76},{"./ex":68,"./ge":71}],2:[function(require,module,exports){
77/**
78 * Copyright 2013 Facebook, Inc.
79 *
80 * Licensed under the Apache License, Version 2.0 (the "License");
81 * you may not use this file except in compliance with the License.
82 * You may obtain a copy of the License at
83 *
84 * http://www.apache.org/licenses/LICENSE-2.0
85 *
86 * Unless required by applicable law or agreed to in writing, software
87 * distributed under the License is distributed on an "AS IS" BASIS,
88 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
89 * See the License for the specific language governing permissions and
90 * limitations under the License.
91 *
92 * @providesModule CSSProperty
93 */
94
95"use strict";
96
97/**
98 * CSS properties which accept numbers but are not in units of "px".
99 */
100var isUnitlessNumber = {
101 fillOpacity: true,
102 fontWeight: true,
103 opacity: true,
104 orphans: true,
105 zIndex: true,
106 zoom: true
107};
108
109/**
110 * Most style properties can be unset by doing .style[prop] = '' but IE8
111 * doesn't like doing that with shorthand properties so for the properties that
112 * IE8 breaks on, which are listed here, we instead unset each of the
113 * individual properties. See http://bugs.jquery.com/ticket/12385.
114 * The 4-value 'clock' properties like margin, padding, border-width seem to
115 * behave without any problems. Curiously, list-style works too without any
116 * special prodding.
117 */
118var shorthandPropertyExpansions = {
119 background: {
120 backgroundImage: true,
121 backgroundPosition: true,
122 backgroundRepeat: true,
123 backgroundColor: true
124 },
125 border: {
126 borderWidth: true,
127 borderStyle: true,
128 borderColor: true
129 },
130 borderBottom: {
131 borderBottomWidth: true,
132 borderBottomStyle: true,
133 borderBottomColor: true
134 },
135 borderLeft: {
136 borderLeftWidth: true,
137 borderLeftStyle: true,
138 borderLeftColor: true
139 },
140 borderRight: {
141 borderRightWidth: true,
142 borderRightStyle: true,
143 borderRightColor: true
144 },
145 borderTop: {
146 borderTopWidth: true,
147 borderTopStyle: true,
148 borderTopColor: true
149 },
150 font: {
151 fontStyle: true,
152 fontVariant: true,
153 fontWeight: true,
154 fontSize: true,
155 lineHeight: true,
156 fontFamily: true
157 }
158};
159
160var CSSProperty = {
161 isUnitlessNumber: isUnitlessNumber,
162 shorthandPropertyExpansions: shorthandPropertyExpansions
163};
164
165module.exports = CSSProperty;
166
167},{}],3:[function(require,module,exports){
168/**
169 * Copyright 2013 Facebook, Inc.
170 *
171 * Licensed under the Apache License, Version 2.0 (the "License");
172 * you may not use this file except in compliance with the License.
173 * You may obtain a copy of the License at
174 *
175 * http://www.apache.org/licenses/LICENSE-2.0
176 *
177 * Unless required by applicable law or agreed to in writing, software
178 * distributed under the License is distributed on an "AS IS" BASIS,
179 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
180 * See the License for the specific language governing permissions and
181 * limitations under the License.
182 *
183 * @providesModule CSSPropertyOperations
184 * @typechecks static-only
185 */
186
187"use strict";
188
189var CSSProperty = require("./CSSProperty");
190
191var dangerousStyleValue = require("./dangerousStyleValue");
192var escapeTextForBrowser = require("./escapeTextForBrowser");
193var hyphenate = require("./hyphenate");
194var memoizeStringOnly = require("./memoizeStringOnly");
195
196var processStyleName = memoizeStringOnly(function(styleName) {
197 return escapeTextForBrowser(hyphenate(styleName));
198});
199
200/**
201 * Operations for dealing with CSS properties.
202 */
203var CSSPropertyOperations = {
204
205 /**
206 * Serializes a mapping of style properties for use as inline styles:
207 *
208 * > createMarkupForStyles({width: '200px', height: 0})
209 * "width:200px;height:0;"
210 *
211 * Undefined values are ignored so that declarative programming is easier.
212 *
213 * @param {object} styles
214 * @return {?string}
215 */
216 createMarkupForStyles: function(styles) {
217 var serialized = '';
218 for (var styleName in styles) {
219 if (!styles.hasOwnProperty(styleName)) {
220 continue;
221 }
222 var styleValue = styles[styleName];
223 if (styleValue != null) {
224 serialized += processStyleName(styleName) + ':';
225 serialized += dangerousStyleValue(styleName, styleValue) + ';';
226 }
227 }
228 return serialized || null;
229 },
230
231 /**
232 * Sets the value for multiple styles on a node. If a value is specified as
233 * '' (empty string), the corresponding style property will be unset.
234 *
235 * @param {DOMElement} node
236 * @param {object} styles
237 */
238 setValueForStyles: function(node, styles) {
239 var style = node.style;
240 for (var styleName in styles) {
241 if (!styles.hasOwnProperty(styleName)) {
242 continue;
243 }
244 var styleValue = dangerousStyleValue(styleName, styles[styleName]);
245 if (styleValue) {
246 style[styleName] = styleValue;
247 } else {
248 var expansion = CSSProperty.shorthandPropertyExpansions[styleName];
249 if (expansion) {
250 // Shorthand property that IE8 won't like unsetting, so unset each
251 // component to placate it
252 for (var individualStyleName in expansion) {
253 style[individualStyleName] = '';
254 }
255 } else {
256 style[styleName] = '';
257 }
258 }
259 }
260 }
261
262};
263
264module.exports = CSSPropertyOperations;
265
266},{"./CSSProperty":2,"./dangerousStyleValue":65,"./escapeTextForBrowser":67,"./hyphenate":76,"./memoizeStringOnly":83}],4:[function(require,module,exports){
267/**
268 * Copyright 2013 Facebook, Inc.
269 *
270 * Licensed under the Apache License, Version 2.0 (the "License");
271 * you may not use this file except in compliance with the License.
272 * You may obtain a copy of the License at
273 *
274 * http://www.apache.org/licenses/LICENSE-2.0
275 *
276 * Unless required by applicable law or agreed to in writing, software
277 * distributed under the License is distributed on an "AS IS" BASIS,
278 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
279 * See the License for the specific language governing permissions and
280 * limitations under the License.
281 *
282 * @providesModule CallbackRegistry
283 * @typechecks static-only
284 */
285
286"use strict";
287
288var listenerBank = {};
289
290/**
291 * Stores "listeners" by `registrationName`/`id`. There should be at most one
292 * "listener" per `registrationName`/`id` in the `listenerBank`.
293 *
294 * Access listeners via `listenerBank[registrationName][id]`.
295 *
296 * @class CallbackRegistry
297 * @internal
298 */
299var CallbackRegistry = {
300
301 /**
302 * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.
303 *
304 * @param {string} id ID of the DOM element.
305 * @param {string} registrationName Name of listener (e.g. `onClick`).
306 * @param {?function} listener The callback to store.
307 */
308 putListener: function(id, registrationName, listener) {
309 var bankForRegistrationName =
310 listenerBank[registrationName] || (listenerBank[registrationName] = {});
311 bankForRegistrationName[id] = listener;
312 },
313
314 /**
315 * @param {string} id ID of the DOM element.
316 * @param {string} registrationName Name of listener (e.g. `onClick`).
317 * @return {?function} The stored callback.
318 */
319 getListener: function(id, registrationName) {
320 var bankForRegistrationName = listenerBank[registrationName];
321 return bankForRegistrationName && bankForRegistrationName[id];
322 },
323
324 /**
325 * Deletes a listener from the registration bank.
326 *
327 * @param {string} id ID of the DOM element.
328 * @param {string} registrationName Name of listener (e.g. `onClick`).
329 */
330 deleteListener: function(id, registrationName) {
331 var bankForRegistrationName = listenerBank[registrationName];
332 if (bankForRegistrationName) {
333 delete bankForRegistrationName[id];
334 }
335 },
336
337 /**
338 * Deletes all listeners for the DOM element with the supplied ID.
339 *
340 * @param {string} id ID of the DOM element.
341 */
342 deleteAllListeners: function(id) {
343 for (var registrationName in listenerBank) {
344 delete listenerBank[registrationName][id];
345 }
346 },
347
348 /**
349 * This is needed for tests only. Do not use!
350 */
351 __purge: function() {
352 listenerBank = {};
353 }
354
355};
356
357module.exports = CallbackRegistry;
358
359},{}],5:[function(require,module,exports){
360(function(){/**
361 * Copyright 2013 Facebook, Inc.
362 *
363 * Licensed under the Apache License, Version 2.0 (the "License");
364 * you may not use this file except in compliance with the License.
365 * You may obtain a copy of the License at
366 *
367 * http://www.apache.org/licenses/LICENSE-2.0
368 *
369 * Unless required by applicable law or agreed to in writing, software
370 * distributed under the License is distributed on an "AS IS" BASIS,
371 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
372 * See the License for the specific language governing permissions and
373 * limitations under the License.
374 *
375 * @providesModule ChangeEventPlugin
376 */
377
378"use strict";
379
380var EventConstants = require("./EventConstants");
381var EventPluginHub = require("./EventPluginHub");
382var EventPropagators = require("./EventPropagators");
383var ExecutionEnvironment = require("./ExecutionEnvironment");
384var SyntheticEvent = require("./SyntheticEvent");
385
386var isEventSupported = require("./isEventSupported");
387var keyOf = require("./keyOf");
388
389var topLevelTypes = EventConstants.topLevelTypes;
390
391var eventTypes = {
392 change: {
393 phasedRegistrationNames: {
394 bubbled: keyOf({onChange: null}),
395 captured: keyOf({onChangeCapture: null})
396 }
397 }
398};
399
400/**
401 * For IE shims
402 */
403var activeElement = null;
404var activeElementID = null;
405var activeElementValue = null;
406var activeElementValueProp = null;
407
408
409/**
410 * SECTION: handle `change` event
411 */
412function shouldUseChangeEvent(elem) {
413 return (
414 elem.nodeName === 'SELECT' ||
415 (elem.nodeName === 'INPUT' && elem.type === 'file')
416 );
417}
418
419var doesChangeEventBubble = false;
420if (ExecutionEnvironment.canUseDOM) {
421 // See `handleChange` comment below
422 doesChangeEventBubble = isEventSupported('change') && (
423 !('documentMode' in document) || document.documentMode > 8
424 );
425}
426
427function manualDispatchChangeEvent(nativeEvent) {
428 var event = SyntheticEvent.getPooled(
429 eventTypes.change,
430 activeElementID,
431 nativeEvent
432 );
433 EventPropagators.accumulateTwoPhaseDispatches(event);
434
435 // If change bubbled, we'd just bind to it like all the other events
436 // and have it go through ReactEventTopLevelCallback. Since it doesn't, we
437 // manually listen for the change event and so we have to enqueue and
438 // process the abstract event manually.
439 EventPluginHub.enqueueEvents(event);
440 EventPluginHub.processEventQueue();
441}
442
443function startWatchingForChangeEventIE8(target, targetID) {
444 activeElement = target;
445 activeElementID = targetID;
446 activeElement.attachEvent('onchange', manualDispatchChangeEvent);
447}
448
449function stopWatchingForChangeEventIE8() {
450 if (!activeElement) {
451 return;
452 }
453 activeElement.detachEvent('onchange', manualDispatchChangeEvent);
454 activeElement = null;
455 activeElementID = null;
456}
457
458function getTargetIDForChangeEvent(
459 topLevelType,
460 topLevelTarget,
461 topLevelTargetID) {
462 if (topLevelType === topLevelTypes.topChange) {
463 return topLevelTargetID;
464 }
465}
466function handleEventsForChangeEventIE8(
467 topLevelType,
468 topLevelTarget,
469 topLevelTargetID) {
470 if (topLevelType === topLevelTypes.topFocus) {
471 // stopWatching() should be a noop here but we call it just in case we
472 // missed a blur event somehow.
473 stopWatchingForChangeEventIE8();
474 startWatchingForChangeEventIE8(topLevelTarget, topLevelTargetID);
475 } else if (topLevelType === topLevelTypes.topBlur) {
476 stopWatchingForChangeEventIE8();
477 }
478}
479
480
481/**
482 * SECTION: handle `input` event
483 */
484var isInputEventSupported = false;
485if (ExecutionEnvironment.canUseDOM) {
486 // IE9 claims to support the input event but fails to trigger it when
487 // deleting text, so we ignore its input events
488 isInputEventSupported = isEventSupported('input') && (
489 !('documentMode' in document) || document.documentMode > 9
490 );
491}
492
493
494/**
495 * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
496 */
497var supportedInputTypes = {
498 'color': true,
499 'date': true,
500 'datetime': true,
501 'datetime-local': true,
502 'email': true,
503 'month': true,
504 'number': true,
505 'password': true,
506 'range': true,
507 'search': true,
508 'tel': true,
509 'text': true,
510 'time': true,
511 'url': true,
512 'week': true
513};
514
515function shouldUseInputEvent(elem) {
516 return (
517 (elem.nodeName === 'INPUT' && supportedInputTypes[elem.type]) ||
518 elem.nodeName === 'TEXTAREA'
519 );
520}
521
522/**
523 * (For old IE.) Replacement getter/setter for the `value` property that gets
524 * set on the active element.
525 */
526var newValueProp = {
527 get: function() {
528 return activeElementValueProp.get.call(this);
529 },
530 set: function(val) {
531 // Cast to a string so we can do equality checks.
532 activeElementValue = '' + val;
533 activeElementValueProp.set.call(this, val);
534 }
535};
536
537/**
538 * (For old IE.) Starts tracking propertychange events on the passed-in element
539 * and override the value property so that we can distinguish user events from
540 * value changes in JS.
541 */
542function startWatchingForValueChange(target, targetID) {
543 activeElement = target;
544 activeElementID = targetID;
545 activeElementValue = target.value;
546 activeElementValueProp = Object.getOwnPropertyDescriptor(
547 target.constructor.prototype,
548 'value'
549 );
550
551 Object.defineProperty(activeElement, 'value', newValueProp);
552 activeElement.attachEvent('onpropertychange', handlePropertyChange);
553}
554
555/**
556 * (For old IE.) Removes the event listeners from the currently-tracked element,
557 * if any exists.
558 */
559function stopWatchingForValueChange() {
560 if (!activeElement) {
561 return;
562 }
563
564 // delete restores the original property definition
565 delete activeElement.value;
566 activeElement.detachEvent('onpropertychange', handlePropertyChange);
567
568 activeElement = null;
569 activeElementID = null;
570 activeElementValue = null;
571 activeElementValueProp = null;
572}
573
574/**
575 * (For old IE.) Handles a propertychange event, sending a `change` event if
576 * the value of the active element has changed.
577 */
578function handlePropertyChange(nativeEvent) {
579 if (nativeEvent.propertyName !== 'value') {
580 return;
581 }
582 var value = nativeEvent.srcElement.value;
583 if (value === activeElementValue) {
584 return;
585 }
586 activeElementValue = value;
587
588 manualDispatchChangeEvent(nativeEvent);
589}
590
591/**
592 * If a `change` event should be fired, returns the target's ID.
593 */
594function getTargetIDForInputEvent(
595 topLevelType,
596 topLevelTarget,
597 topLevelTargetID) {
598 if (topLevelType === topLevelTypes.topInput) {
599 // In modern browsers (i.e., not IE8 or IE9), the input event is exactly
600 // what we want so fall through here and trigger an abstract event
601 return topLevelTargetID;
602 }
603}
604
605// For IE8 and IE9.
606function handleEventsForInputEventIE(
607 topLevelType,
608 topLevelTarget,
609 topLevelTargetID) {
610 if (topLevelType === topLevelTypes.topFocus) {
611 // In IE8, we can capture almost all .value changes by adding a
612 // propertychange handler and looking for events with propertyName
613 // equal to 'value'
614 // In IE9, propertychange fires for most input events but is buggy and
615 // doesn't fire when text is deleted, but conveniently, selectionchange
616 // appears to fire in all of the remaining cases so we catch those and
617 // forward the event if the value has changed
618 // In either case, we don't want to call the event handler if the value
619 // is changed from JS so we redefine a setter for `.value` that updates
620 // our activeElementValue variable, allowing us to ignore those changes
621 //
622 // stopWatching() should be a noop here but we call it just in case we
623 // missed a blur event somehow.
624 stopWatchingForValueChange();
625 startWatchingForValueChange(topLevelTarget, topLevelTargetID);
626 } else if (topLevelType === topLevelTypes.topBlur) {
627 stopWatchingForValueChange();
628 }
629}
630
631// For IE8 and IE9.
632function getTargetIDForInputEventIE(
633 topLevelType,
634 topLevelTarget,
635 topLevelTargetID) {
636 if (topLevelType === topLevelTypes.topSelectionChange ||
637 topLevelType === topLevelTypes.topKeyUp ||
638 topLevelType === topLevelTypes.topKeyDown) {
639 // On the selectionchange event, the target is just document which isn't
640 // helpful for us so just check activeElement instead.
641 //
642 // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
643 // propertychange on the first input event after setting `value` from a
644 // script and fires only keydown, keypress, keyup. Catching keyup usually
645 // gets it and catching keydown lets us fire an event for the first
646 // keystroke if user does a key repeat (it'll be a little delayed: right
647 // before the second keystroke). Other input methods (e.g., paste) seem to
648 // fire selectionchange normally.
649 if (activeElement && activeElement.value !== activeElementValue) {
650 activeElementValue = activeElement.value;
651 return activeElementID;
652 }
653 }
654}
655
656
657/**
658 * SECTION: handle `click` event
659 */
660function shouldUseClickEvent(elem) {
661 // Use the `click` event to detect changes to checkbox and radio inputs.
662 // This approach works across all browsers, whereas `change` does not fire
663 // until `blur` in IE8.
664 return (
665 elem.nodeName === 'INPUT' &&
666 (elem.type === 'checkbox' || elem.type === 'radio')
667 );
668}
669
670function getTargetIDForClickEvent(
671 topLevelType,
672 topLevelTarget,
673 topLevelTargetID) {
674 if (topLevelType === topLevelTypes.topClick) {
675 return topLevelTargetID;
676 }
677}
678
679/**
680 * This plugin creates an `onChange` event that normalizes change events
681 * across form elements. This event fires at a time when it's possible to
682 * change the element's value without seeing a flicker.
683 *
684 * Supported elements are:
685 * - input (see `supportedInputTypes`)
686 * - textarea
687 * - select
688 */
689var ChangeEventPlugin = {
690
691 eventTypes: eventTypes,
692
693 /**
694 * @param {string} topLevelType Record from `EventConstants`.
695 * @param {DOMEventTarget} topLevelTarget The listening component root node.
696 * @param {string} topLevelTargetID ID of `topLevelTarget`.
697 * @param {object} nativeEvent Native browser event.
698 * @return {*} An accumulation of synthetic events.
699 * @see {EventPluginHub.extractEvents}
700 */
701 extractEvents: function(
702 topLevelType,
703 topLevelTarget,
704 topLevelTargetID,
705 nativeEvent) {
706
707 var getTargetIDFunc, handleEventFunc;
708 if (shouldUseChangeEvent(topLevelTarget)) {
709 if (doesChangeEventBubble) {
710 getTargetIDFunc = getTargetIDForChangeEvent;
711 } else {
712 handleEventFunc = handleEventsForChangeEventIE8;
713 }
714 } else if (shouldUseInputEvent(topLevelTarget)) {
715 if (isInputEventSupported) {
716 getTargetIDFunc = getTargetIDForInputEvent;
717 } else {
718 getTargetIDFunc = getTargetIDForInputEventIE;
719 handleEventFunc = handleEventsForInputEventIE;
720 }
721 } else if (shouldUseClickEvent(topLevelTarget)) {
722 getTargetIDFunc = getTargetIDForClickEvent;
723 }
724
725 if (getTargetIDFunc) {
726 var targetID = getTargetIDFunc(
727 topLevelType,
728 topLevelTarget,
729 topLevelTargetID
730 );
731 if (targetID) {
732 var event = SyntheticEvent.getPooled(
733 eventTypes.change,
734 targetID,
735 nativeEvent
736 );
737 EventPropagators.accumulateTwoPhaseDispatches(event);
738 return event;
739 }
740 }
741
742 if (handleEventFunc) {
743 handleEventFunc(
744 topLevelType,
745 topLevelTarget,
746 topLevelTargetID
747 );
748 }
749 }
750
751};
752
753module.exports = ChangeEventPlugin;
754
755})()
756},{"./EventConstants":13,"./EventPluginHub":15,"./EventPropagators":18,"./ExecutionEnvironment":19,"./SyntheticEvent":51,"./isEventSupported":79,"./keyOf":82}],6:[function(require,module,exports){
757(function(){/**
758 * Copyright 2013 Facebook, Inc.
759 *
760 * Licensed under the Apache License, Version 2.0 (the "License");
761 * you may not use this file except in compliance with the License.
762 * You may obtain a copy of the License at
763 *
764 * http://www.apache.org/licenses/LICENSE-2.0
765 *
766 * Unless required by applicable law or agreed to in writing, software
767 * distributed under the License is distributed on an "AS IS" BASIS,
768 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
769 * See the License for the specific language governing permissions and
770 * limitations under the License.
771 *
772 * @providesModule DOMChildrenOperations
773 */
774
775// Empty blocks improve readability so disable that warning
776// jshint -W035
777
778"use strict";
779
780var Danger = require("./Danger");
781
782var insertNodeAt = require("./insertNodeAt");
783var keyOf = require("./keyOf");
784var throwIf = require("./throwIf");
785
786var NON_INCREASING_OPERATIONS;
787if (true) {
788 NON_INCREASING_OPERATIONS =
789 'DOM child management operations must be provided in order ' +
790 'of increasing destination index. This is likely an issue with ' +
791 'the core framework.';
792}
793
794var MOVE_NODE_AT_ORIG_INDEX = keyOf({moveFrom: null});
795var INSERT_MARKUP = keyOf({insertMarkup: null});
796var REMOVE_AT = keyOf({removeAt: null});
797
798/**
799 * In order to carry out movement of DOM nodes without knowing their IDs, we
800 * have to first store knowledge about nodes' original indices before beginning
801 * to carry out the sequence of operations. Once we begin the sequence, the DOM
802 * indices in future instructions are no longer valid.
803 *
804 * @param {Element} parent Parent DOM node.
805 * @param {Object} childOperations Description of child operations.
806 * @return {Array?} Sparse array containing elements by their current index in
807 * the DOM.
808 */
809var _getNodesByOriginalIndex = function(parent, childOperations) {
810 var nodesByOriginalIndex; // Sparse array.
811 var childOperation;
812 var origIndex;
813 for (var i = 0; i < childOperations.length; i++) {
814 childOperation = childOperations[i];
815 if (MOVE_NODE_AT_ORIG_INDEX in childOperation) {
816 nodesByOriginalIndex = nodesByOriginalIndex || [];
817 origIndex = childOperation.moveFrom;
818 nodesByOriginalIndex[origIndex] = parent.childNodes[origIndex];
819 } else if (REMOVE_AT in childOperation) {
820 nodesByOriginalIndex = nodesByOriginalIndex || [];
821 origIndex = childOperation.removeAt;
822 nodesByOriginalIndex[origIndex] = parent.childNodes[origIndex];
823 }
824 }
825 return nodesByOriginalIndex;
826};
827
828/**
829 * Removes DOM elements from their parent, or moved.
830 * @param {Element} parent Parent DOM node.
831 * @param {Array} nodesByOriginalIndex Child nodes by their original index
832 * (potentially sparse.)
833 */
834var _removeChildrenByOriginalIndex = function(parent, nodesByOriginalIndex) {
835 for (var j = 0; j < nodesByOriginalIndex.length; j++) {
836 var nodeToRemove = nodesByOriginalIndex[j];
837 if (nodeToRemove) { // We used a sparse array.
838 parent.removeChild(nodesByOriginalIndex[j]);
839 }
840 }
841};
842
843/**
844 * Once all nodes that will be removed or moved - are removed from the parent
845 * node, we can begin the process of placing nodes into their final locations.
846 * We must perform all operations in the order of the final DOM index -
847 * otherwise, we couldn't count on the fact that an insertion at index X, will
848 * remain at index X. This will iterate through the child operations, adding
849 * content where needed, skip over removals (they've already been removed) and
850 * insert "moved" Elements that were previously removed. The "moved" elements
851 * are only temporarily removed from the parent, so that index calculations can
852 * be manageable and perform well in the cases that matter.
853 */
854var _placeNodesAtDestination =
855 function(parent, childOperations, nodesByOriginalIndex) {
856 var origNode;
857 var finalIndex;
858 var lastFinalIndex = -1;
859 var childOperation;
860 for (var k = 0; k < childOperations.length; k++) {
861 childOperation = childOperations[k];
862 if (MOVE_NODE_AT_ORIG_INDEX in childOperation) {
863 origNode = nodesByOriginalIndex[childOperation.moveFrom];
864 finalIndex = childOperation.finalIndex;
865 insertNodeAt(parent, origNode, finalIndex);
866 if (true) {
867 throwIf(finalIndex <= lastFinalIndex, NON_INCREASING_OPERATIONS);
868 lastFinalIndex = finalIndex;
869 }
870 } else if (REMOVE_AT in childOperation) {
871 } else if (INSERT_MARKUP in childOperation) {
872 finalIndex = childOperation.finalIndex;
873 var markup = childOperation.insertMarkup;
874 Danger.dangerouslyInsertMarkupAt(parent, markup, finalIndex);
875 if (true) {
876 throwIf(finalIndex <= lastFinalIndex, NON_INCREASING_OPERATIONS);
877 lastFinalIndex = finalIndex;
878 }
879 }
880 }
881 };
882
883var manageChildren = function(parent, childOperations) {
884 var nodesByOriginalIndex = _getNodesByOriginalIndex(parent, childOperations);
885 if (nodesByOriginalIndex) {
886 _removeChildrenByOriginalIndex(parent, nodesByOriginalIndex);
887 }
888 _placeNodesAtDestination(parent, childOperations, nodesByOriginalIndex);
889};
890
891/**
892 * Also reexport all of the dangerous functions. It helps to have all dangerous
893 * functions located in a single module `Danger`.
894 */
895var DOMChildrenOperations = {
896 dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup,
897 manageChildren: manageChildren
898};
899
900module.exports = DOMChildrenOperations;
901
902})()
903},{"./Danger":9,"./insertNodeAt":77,"./keyOf":82,"./throwIf":89}],7:[function(require,module,exports){
904/**
905 * Copyright 2013 Facebook, Inc.
906 *
907 * Licensed under the Apache License, Version 2.0 (the "License");
908 * you may not use this file except in compliance with the License.
909 * You may obtain a copy of the License at
910 *
911 * http://www.apache.org/licenses/LICENSE-2.0
912 *
913 * Unless required by applicable law or agreed to in writing, software
914 * distributed under the License is distributed on an "AS IS" BASIS,
915 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
916 * See the License for the specific language governing permissions and
917 * limitations under the License.
918 *
919 * @providesModule DOMProperty
920 * @typechecks static-only
921 */
922
923/*jslint bitwise: true */
924
925"use strict";
926
927var invariant = require("./invariant");
928
929var DOMPropertyInjection = {
930 /**
931 * Mapping from normalized, camelcased property names to a configuration that
932 * specifies how the associated DOM property should be accessed or rendered.
933 */
934 MUST_USE_ATTRIBUTE: 0x1,
935 MUST_USE_PROPERTY: 0x2,
936 HAS_BOOLEAN_VALUE: 0x4,
937 HAS_SIDE_EFFECTS: 0x8,
938
939 /**
940 * Inject some specialized knowledge about the DOM. This takes a config object
941 * with the following properties:
942 *
943 * isCustomAttribute: function that given an attribute name will return true
944 * if it can be inserted into the DOM verbatim. Useful for data-* or aria-*
945 * attributes where it's impossible to enumerate all of the possible
946 * attribute names,
947 *
948 * Properties: object mapping DOM property name to one of the
949 * DOMPropertyInjection constants or null. If your attribute isn't in here,
950 * it won't get written to the DOM.
951 *
952 * DOMAttributeNames: object mapping React attribute name to the DOM
953 * attribute name. Attribute names not specified use the **lowercase**
954 * normalized name.
955 *
956 * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
957 * Property names not specified use the normalized name.
958 *
959 * DOMMutationMethods: Properties that require special mutation methods. If
960 * `value` is undefined, the mutation method should unset the property.
961 *
962 * @param {object} domPropertyConfig the config as described above.
963 */
964 injectDOMPropertyConfig: function(domPropertyConfig) {
965 var Properties = domPropertyConfig.Properties || {};
966 var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};
967 var DOMPropertyNames = domPropertyConfig.DOMPropertyNames || {};
968 var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};
969
970 if (domPropertyConfig.isCustomAttribute) {
971 DOMProperty._isCustomAttributeFunctions.push(
972 domPropertyConfig.isCustomAttribute
973 );
974 }
975
976 for (var propName in Properties) {
977 invariant(
978 !DOMProperty.isStandardName[propName],
979 'injectDOMPropertyConfig(...): You\'re trying to inject DOM property ' +
980 '\'%s\' which has already been injected. You may be accidentally ' +
981 'injecting the same DOM property config twice, or you may be ' +
982 'injecting two configs that have conflicting property names.',
983 propName
984 );
985
986 DOMProperty.isStandardName[propName] = true;
987
988 DOMProperty.getAttributeName[propName] =
989 DOMAttributeNames[propName] || propName.toLowerCase();
990
991 DOMProperty.getPropertyName[propName] =
992 DOMPropertyNames[propName] || propName;
993
994 var mutationMethod = DOMMutationMethods[propName];
995 if (mutationMethod) {
996 DOMProperty.getMutationMethod[propName] = mutationMethod;
997 }
998
999 var propConfig = Properties[propName];
1000 DOMProperty.mustUseAttribute[propName] =
1001 propConfig & DOMPropertyInjection.MUST_USE_ATTRIBUTE;
1002 DOMProperty.mustUseProperty[propName] =
1003 propConfig & DOMPropertyInjection.MUST_USE_PROPERTY;
1004 DOMProperty.hasBooleanValue[propName] =
1005 propConfig & DOMPropertyInjection.HAS_BOOLEAN_VALUE;
1006 DOMProperty.hasSideEffects[propName] =
1007 propConfig & DOMPropertyInjection.HAS_SIDE_EFFECTS;
1008
1009 invariant(
1010 !DOMProperty.mustUseAttribute[propName] ||
1011 !DOMProperty.mustUseProperty[propName],
1012 'DOMProperty: Cannot use require using both attribute and property: %s',
1013 propName
1014 );
1015 invariant(
1016 DOMProperty.mustUseProperty[propName] ||
1017 !DOMProperty.hasSideEffects[propName],
1018 'DOMProperty: Properties that have side effects must use property: %s',
1019 propName
1020 );
1021 }
1022 }
1023};
1024var defaultValueCache = {};
1025
1026/**
1027 * DOMProperty exports lookup objects that can be used like functions:
1028 *
1029 * > DOMProperty.isValid['id']
1030 * true
1031 * > DOMProperty.isValid['foobar']
1032 * undefined
1033 *
1034 * Although this may be confusing, it performs better in general.
1035 *
1036 * @see http://jsperf.com/key-exists
1037 * @see http://jsperf.com/key-missing
1038 */
1039var DOMProperty = {
1040
1041 /**
1042 * Checks whether a property name is a standard property.
1043 * @type {Object}
1044 */
1045 isStandardName: {},
1046
1047 /**
1048 * Mapping from normalized names to attribute names that differ. Attribute
1049 * names are used when rendering markup or with `*Attribute()`.
1050 * @type {Object}
1051 */
1052 getAttributeName: {},
1053
1054 /**
1055 * Mapping from normalized names to properties on DOM node instances.
1056 * (This includes properties that mutate due to external factors.)
1057 * @type {Object}
1058 */
1059 getPropertyName: {},
1060
1061 /**
1062 * Mapping from normalized names to mutation methods. This will only exist if
1063 * mutation cannot be set simply by the property or `setAttribute()`.
1064 * @type {Object}
1065 */
1066 getMutationMethod: {},
1067
1068 /**
1069 * Whether the property must be accessed and mutated as an object property.
1070 * @type {Object}
1071 */
1072 mustUseAttribute: {},
1073
1074 /**
1075 * Whether the property must be accessed and mutated using `*Attribute()`.
1076 * (This includes anything that fails `<propName> in <element>`.)
1077 * @type {Object}
1078 */
1079 mustUseProperty: {},
1080
1081 /**
1082 * Whether the property should be removed when set to a falsey value.
1083 * @type {Object}
1084 */
1085 hasBooleanValue: {},
1086
1087 /**
1088 * Whether or not setting a value causes side effects such as triggering
1089 * resources to be loaded or text selection changes. We must ensure that
1090 * the value is only set if it has changed.
1091 * @type {Object}
1092 */
1093 hasSideEffects: {},
1094
1095 /**
1096 * All of the isCustomAttribute() functions that have been injected.
1097 */
1098 _isCustomAttributeFunctions: [],
1099
1100 /**
1101 * Checks whether a property name is a custom attribute.
1102 * @method
1103 */
1104 isCustomAttribute: function(attributeName) {
1105 return DOMProperty._isCustomAttributeFunctions.some(
1106 function(isCustomAttributeFn) {
1107 return isCustomAttributeFn.call(null, attributeName);
1108 }
1109 );
1110 },
1111
1112 /**
1113 * Returns the default property value for a DOM property (i.e., not an
1114 * attribute). Most default values are '' or false, but not all. Worse yet,
1115 * some (in particular, `type`) vary depending on the type of element.
1116 *
1117 * TODO: Is it better to grab all the possible properties when creating an
1118 * element to avoid having to create the same element twice?
1119 */
1120 getDefaultValueForProperty: function(nodeName, prop) {
1121 var nodeDefaults = defaultValueCache[nodeName];
1122 var testElement;
1123 if (!nodeDefaults) {
1124 defaultValueCache[nodeName] = nodeDefaults = {};
1125 }
1126 if (!(prop in nodeDefaults)) {
1127 testElement = document.createElement(nodeName);
1128 nodeDefaults[prop] = testElement[prop];
1129 }
1130 return nodeDefaults[prop];
1131 },
1132
1133 injection: DOMPropertyInjection
1134};
1135
1136module.exports = DOMProperty;
1137
1138},{"./invariant":78}],8:[function(require,module,exports){
1139/**
1140 * Copyright 2013 Facebook, Inc.
1141 *
1142 * Licensed under the Apache License, Version 2.0 (the "License");
1143 * you may not use this file except in compliance with the License.
1144 * You may obtain a copy of the License at
1145 *
1146 * http://www.apache.org/licenses/LICENSE-2.0
1147 *
1148 * Unless required by applicable law or agreed to in writing, software
1149 * distributed under the License is distributed on an "AS IS" BASIS,
1150 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1151 * See the License for the specific language governing permissions and
1152 * limitations under the License.
1153 *
1154 * @providesModule DOMPropertyOperations
1155 * @typechecks static-only
1156 */
1157
1158"use strict";
1159
1160var DOMProperty = require("./DOMProperty");
1161
1162var escapeTextForBrowser = require("./escapeTextForBrowser");
1163var memoizeStringOnly = require("./memoizeStringOnly");
1164
1165var processAttributeNameAndPrefix = memoizeStringOnly(function(name) {
1166 return escapeTextForBrowser(name) + '="';
1167});
1168
1169/**
1170 * Operations for dealing with DOM properties.
1171 */
1172var DOMPropertyOperations = {
1173
1174 /**
1175 * Creates markup for a property.
1176 *
1177 * @param {string} name
1178 * @param {*} value
1179 * @return {?string} Markup string, or null if the property was invalid.
1180 */
1181 createMarkupForProperty: function(name, value) {
1182 if (DOMProperty.isStandardName[name]) {
1183 if (value == null || DOMProperty.hasBooleanValue[name] && !value) {
1184 return '';
1185 }
1186 var attributeName = DOMProperty.getAttributeName[name];
1187 return processAttributeNameAndPrefix(attributeName) +
1188 escapeTextForBrowser(value) + '"';
1189 } else if (DOMProperty.isCustomAttribute(name)) {
1190 if (value == null) {
1191 return '';
1192 }
1193 return processAttributeNameAndPrefix(name) +
1194 escapeTextForBrowser(value) + '"';
1195 } else {
1196 return null;
1197 }
1198 },
1199
1200 /**
1201 * Sets the value for a property on a node.
1202 *
1203 * @param {DOMElement} node
1204 * @param {string} name
1205 * @param {*} value
1206 */
1207 setValueForProperty: function(node, name, value) {
1208 if (DOMProperty.isStandardName[name]) {
1209 var mutationMethod = DOMProperty.getMutationMethod[name];
1210 if (mutationMethod) {
1211 mutationMethod(node, value);
1212 } else if (DOMProperty.mustUseAttribute[name]) {
1213 if (DOMProperty.hasBooleanValue[name] && !value) {
1214 node.removeAttribute(DOMProperty.getAttributeName[name]);
1215 } else {
1216 node.setAttribute(DOMProperty.getAttributeName[name], value);
1217 }
1218 } else {
1219 var propName = DOMProperty.getPropertyName[name];
1220 if (!DOMProperty.hasSideEffects[name] || node[propName] !== value) {
1221 node[propName] = value;
1222 }
1223 }
1224 } else if (DOMProperty.isCustomAttribute(name)) {
1225 node.setAttribute(name, value);
1226 }
1227 },
1228
1229 /**
1230 * Deletes the value for a property on a node.
1231 *
1232 * @param {DOMElement} node
1233 * @param {string} name
1234 */
1235 deleteValueForProperty: function(node, name) {
1236 if (DOMProperty.isStandardName[name]) {
1237 var mutationMethod = DOMProperty.getMutationMethod[name];
1238 if (mutationMethod) {
1239 mutationMethod(node, undefined);
1240 } else if (DOMProperty.mustUseAttribute[name]) {
1241 node.removeAttribute(DOMProperty.getAttributeName[name]);
1242 } else {
1243 var propName = DOMProperty.getPropertyName[name];
1244 node[propName] = DOMProperty.getDefaultValueForProperty(
1245 node.nodeName,
1246 name
1247 );
1248 }
1249 } else if (DOMProperty.isCustomAttribute(name)) {
1250 node.removeAttribute(name);
1251 }
1252 }
1253
1254};
1255
1256module.exports = DOMPropertyOperations;
1257
1258},{"./DOMProperty":7,"./escapeTextForBrowser":67,"./memoizeStringOnly":83}],9:[function(require,module,exports){
1259/**
1260 * Copyright 2013 Facebook, Inc.
1261 *
1262 * Licensed under the Apache License, Version 2.0 (the "License");
1263 * you may not use this file except in compliance with the License.
1264 * You may obtain a copy of the License at
1265 *
1266 * http://www.apache.org/licenses/LICENSE-2.0
1267 *
1268 * Unless required by applicable law or agreed to in writing, software
1269 * distributed under the License is distributed on an "AS IS" BASIS,
1270 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1271 * See the License for the specific language governing permissions and
1272 * limitations under the License.
1273 *
1274 * @providesModule Danger
1275 */
1276
1277/*jslint evil: true, sub: true */
1278
1279"use strict";
1280
1281var ExecutionEnvironment = require("./ExecutionEnvironment");
1282
1283var throwIf = require("./throwIf");
1284
1285var DOM_UNSUPPORTED;
1286var NO_MARKUP_PARENT;
1287var NO_MULTI_MARKUP;
1288if (true) {
1289 DOM_UNSUPPORTED =
1290 'You may not insert markup into the document while you are in a worker ' +
1291 'thread. It\'s not you, it\'s me. This is likely the fault of the ' +
1292 'framework. Please report this immediately.';
1293 NO_MARKUP_PARENT =
1294 'You have attempted to inject markup without a suitable parent. This is ' +
1295 'likely the fault of the framework - please report immediately.';
1296 NO_MULTI_MARKUP =
1297 'The framework has attempted to either insert zero or multiple markup ' +
1298 'roots into a single location when it should not. This is a serious ' +
1299 'error - a fault of the framework - please report immediately.';
1300}
1301
1302var validateMarkupParams;
1303if (true) {
1304 validateMarkupParams = function(parentNode, markup) {
1305 throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED);
1306 throwIf(!parentNode || !parentNode.tagName, NO_MARKUP_PARENT);
1307 throwIf(!markup, NO_MULTI_MARKUP);
1308 };
1309}
1310
1311/**
1312 * Dummy container used to render all markup.
1313 */
1314var dummyNode = ExecutionEnvironment.canUseDOM ?
1315 document.createElement('div') :
1316 null;
1317
1318/**
1319 * Some browsers cannot use `innerHTML` to render certain elements standalone,
1320 * so we wrap them, render the wrapped nodes, then extract the desired node.
1321 */
1322var markupWrap = {
1323 'option': [1, '<select multiple="true">', '</select>'],
1324 'legend': [1, '<fieldset>', '</fieldset>'],
1325 'area': [1, '<map>', '</map>'],
1326 'param': [1, '<object>', '</object>'],
1327 'thead': [1, '<table>', '</table>'],
1328 'tr': [2, '<table><tbody>', '</tbody></table>'],
1329 'col': [2, '<table><tbody></tbody><colgroup>', '</colgroup></table>'],
1330 'td': [3, '<table><tbody><tr>', '</tr></tbody></table>']
1331};
1332markupWrap['optgroup'] = markupWrap['option'];
1333markupWrap['tbody'] = markupWrap['thead'];
1334markupWrap['tfoot'] = markupWrap['thead'];
1335markupWrap['colgroup'] = markupWrap['thead'];
1336markupWrap['caption'] = markupWrap['thead'];
1337markupWrap['th'] = markupWrap['td'];
1338
1339/**
1340 * In IE8, certain elements cannot render alone, so wrap all elements.
1341 */
1342var defaultWrap = [1, '?<div>', '</div>'];
1343
1344/**
1345 * Feature detection, remove wraps that are unnecessary for the current browser.
1346 */
1347if (dummyNode) {
1348 for (var nodeName in markupWrap) {
1349 if (!markupWrap.hasOwnProperty(nodeName)) {
1350 continue;
1351 }
1352 dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>';
1353 if (dummyNode.firstChild) {
1354 markupWrap[nodeName] = null;
1355 }
1356 }
1357 dummyNode.innerHTML = '<link />';
1358 if (dummyNode.firstChild) {
1359 defaultWrap = null;
1360 }
1361}
1362
1363/**
1364 * Renders markup into nodes. The returned HTMLCollection is live and should be
1365 * used immediately (or at least before the next invocation to `renderMarkup`).
1366 *
1367 * NOTE: Extracting the `nodeName` does not require a regular expression match
1368 * because we make assumptions about React-generated markup (i.e. there are no
1369 * spaces surrounding the opening tag and there is at least one attribute).
1370 * @see http://jsperf.com/extract-nodename
1371 *
1372 * @param {string} markup
1373 * @return {*} An HTMLCollection.
1374 */
1375function renderMarkup(markup) {
1376 var node = dummyNode;
1377 var nodeName = markup.substring(1, markup.indexOf(' '));
1378
1379 var wrap = markupWrap[nodeName.toLowerCase()] || defaultWrap;
1380 if (wrap) {
1381 node.innerHTML = wrap[1] + markup + wrap[2];
1382
1383 var wrapDepth = wrap[0];
1384 while (wrapDepth--) {
1385 node = node.lastChild;
1386 }
1387 } else {
1388 node.innerHTML = markup;
1389 }
1390 return node.childNodes;
1391}
1392
1393/**
1394 * Inserts node after 'after'. If 'after' is null, inserts it after nothing,
1395 * which is inserting it at the beginning.
1396 *
1397 * @param {Element} elem Parent element.
1398 * @param {Element} insert Element to insert.
1399 * @param {Element} after Element to insert after.
1400 * @return {Element} Element that was inserted.
1401 */
1402function insertNodeAfterNode(elem, insert, after) {
1403 if (true) {
1404 throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED);
1405 }
1406 if (after) {
1407 if (after.nextSibling) {
1408 return elem.insertBefore(insert, after.nextSibling);
1409 } else {
1410 return elem.appendChild(insert);
1411 }
1412 } else {
1413 return elem.insertBefore(insert, elem.firstChild);
1414 }
1415}
1416
1417/**
1418 * Slow: Should only be used when it is known there are a few (or one) element
1419 * in the node list.
1420 * @param {Element} parentRootDomNode Parent element.
1421 * @param {HTMLCollection} htmlCollection HTMLCollection to insert.
1422 * @param {Element} after Element to insert the node list after.
1423 */
1424function inefficientlyInsertHTMLCollectionAfter(
1425 parentRootDomNode,
1426 htmlCollection,
1427 after) {
1428
1429 if (true) {
1430 throwIf(!ExecutionEnvironment.canUseDOM, DOM_UNSUPPORTED);
1431 }
1432 var ret;
1433 var originalLength = htmlCollection.length;
1434 // Access htmlCollection[0] because htmlCollection shrinks as we remove items.
1435 // `insertNodeAfterNode` will remove items from the htmlCollection.
1436 for (var i = 0; i < originalLength; i++) {
1437 ret =
1438 insertNodeAfterNode(parentRootDomNode, htmlCollection[0], ret || after);
1439 }
1440}
1441
1442/**
1443 * Super-dangerously inserts markup into existing DOM structure. Seriously, you
1444 * don't want to use this module unless you are building a framework. This
1445 * requires that the markup that you are inserting represents the root of a
1446 * tree. We do not support the case where there `markup` represents several
1447 * roots.
1448 *
1449 * @param {Element} parentNode Parent DOM element.
1450 * @param {string} markup Markup to dangerously insert.
1451 * @param {number} index Position to insert markup at.
1452 */
1453function dangerouslyInsertMarkupAt(parentNode, markup, index) {
1454 if (true) {
1455 validateMarkupParams(parentNode, markup);
1456 }
1457 var htmlCollection = renderMarkup(markup);
1458 var afterNode = index ? parentNode.childNodes[index - 1] : null;
1459 inefficientlyInsertHTMLCollectionAfter(parentNode, htmlCollection, afterNode);
1460}
1461
1462/**
1463 * Replaces a node with a string of markup at its current position within its
1464 * parent. `childNode` must be in the document (or at least within a parent
1465 * node). The string of markup must represent a tree of markup with a single
1466 * root.
1467 *
1468 * @param {Element} childNode Child node to replace.
1469 * @param {string} markup Markup to dangerously replace child with.
1470 */
1471function dangerouslyReplaceNodeWithMarkup(childNode, markup) {
1472 var parentNode = childNode.parentNode;
1473 if (true) {
1474 validateMarkupParams(parentNode, markup);
1475 }
1476 var htmlCollection = renderMarkup(markup);
1477 if (true) {
1478 throwIf(htmlCollection.length !== 1, NO_MULTI_MARKUP);
1479 }
1480 parentNode.replaceChild(htmlCollection[0], childNode);
1481}
1482
1483var Danger = {
1484 dangerouslyInsertMarkupAt: dangerouslyInsertMarkupAt,
1485 dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup
1486};
1487
1488module.exports = Danger;
1489
1490},{"./ExecutionEnvironment":19,"./throwIf":89}],10:[function(require,module,exports){
1491/**
1492 * Copyright 2013 Facebook, Inc.
1493 *
1494 * Licensed under the Apache License, Version 2.0 (the "License");
1495 * you may not use this file except in compliance with the License.
1496 * You may obtain a copy of the License at
1497 *
1498 * http://www.apache.org/licenses/LICENSE-2.0
1499 *
1500 * Unless required by applicable law or agreed to in writing, software
1501 * distributed under the License is distributed on an "AS IS" BASIS,
1502 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1503 * See the License for the specific language governing permissions and
1504 * limitations under the License.
1505 *
1506 * @providesModule DefaultDOMPropertyConfig
1507 */
1508
1509"use strict";
1510
1511var DOMProperty = require("./DOMProperty");
1512
1513var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE;
1514var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY;
1515var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE;
1516var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS;
1517
1518var DefaultDOMPropertyConfig = {
1519 isCustomAttribute: RegExp.prototype.test.bind(
1520 /^(data|aria)-[a-z_][a-z\d_.\-]*$/
1521 ),
1522 Properties: {
1523 /**
1524 * Standard Properties
1525 */
1526 accessKey: null,
1527 accept: null,
1528 action: null,
1529 ajaxify: MUST_USE_ATTRIBUTE,
1530 allowFullScreen: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
1531 allowTransparency: MUST_USE_ATTRIBUTE,
1532 alt: null,
1533 autoComplete: null,
1534 autoFocus: HAS_BOOLEAN_VALUE,
1535 autoPlay: HAS_BOOLEAN_VALUE,
1536 cellPadding: null,
1537 cellSpacing: null,
1538 checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1539 className: MUST_USE_PROPERTY,
1540 colSpan: null,
1541 contentEditable: null,
1542 contextMenu: MUST_USE_ATTRIBUTE,
1543 controls: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1544 data: null, // For `<object />` acts as `src`.
1545 dateTime: MUST_USE_ATTRIBUTE,
1546 dir: null,
1547 disabled: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1548 draggable: null,
1549 encType: null,
1550 frameBorder: MUST_USE_ATTRIBUTE,
1551 height: MUST_USE_ATTRIBUTE,
1552 hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
1553 href: null,
1554 htmlFor: null,
1555 icon: null,
1556 id: MUST_USE_PROPERTY,
1557 label: null,
1558 lang: null,
1559 list: null,
1560 max: null,
1561 maxLength: MUST_USE_ATTRIBUTE,
1562 method: null,
1563 min: null,
1564 multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1565 name: null,
1566 pattern: null,
1567 poster: null,
1568 preload: null,
1569 placeholder: null,
1570 radioGroup: null,
1571 rel: null,
1572 readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1573 required: HAS_BOOLEAN_VALUE,
1574 role: MUST_USE_ATTRIBUTE,
1575 scrollLeft: MUST_USE_PROPERTY,
1576 scrollTop: MUST_USE_PROPERTY,
1577 selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
1578 size: null,
1579 spellCheck: null,
1580 src: null,
1581 step: null,
1582 style: null,
1583 tabIndex: null,
1584 target: null,
1585 title: null,
1586 type: null,
1587 value: MUST_USE_PROPERTY | HAS_SIDE_EFFECTS,
1588 width: MUST_USE_ATTRIBUTE,
1589 wmode: MUST_USE_ATTRIBUTE,
1590 /**
1591 * SVG Properties
1592 */
1593 cx: MUST_USE_PROPERTY,
1594 cy: MUST_USE_PROPERTY,
1595 d: MUST_USE_PROPERTY,
1596 fill: MUST_USE_PROPERTY,
1597 fx: MUST_USE_PROPERTY,
1598 fy: MUST_USE_PROPERTY,
1599 points: MUST_USE_PROPERTY,
1600 r: MUST_USE_PROPERTY,
1601 stroke: MUST_USE_PROPERTY,
1602 strokeLinecap: MUST_USE_PROPERTY,
1603 strokeWidth: MUST_USE_PROPERTY,
1604 transform: MUST_USE_PROPERTY,
1605 x: MUST_USE_PROPERTY,
1606 x1: MUST_USE_PROPERTY,
1607 x2: MUST_USE_PROPERTY,
1608 version: MUST_USE_PROPERTY,
1609 viewBox: MUST_USE_PROPERTY,
1610 y: MUST_USE_PROPERTY,
1611 y1: MUST_USE_PROPERTY,
1612 y2: MUST_USE_PROPERTY,
1613 spreadMethod: MUST_USE_PROPERTY,
1614 offset: MUST_USE_PROPERTY,
1615 stopColor: MUST_USE_PROPERTY,
1616 stopOpacity: MUST_USE_PROPERTY,
1617 gradientUnits: MUST_USE_PROPERTY,
1618 gradientTransform: MUST_USE_PROPERTY
1619 },
1620 DOMAttributeNames: {
1621 className: 'class',
1622 htmlFor: 'for',
1623 strokeLinecap: 'stroke-linecap',
1624 strokeWidth: 'stroke-width',
1625 stopColor: 'stop-color',
1626 stopOpacity: 'stop-opacity'
1627 },
1628 DOMPropertyNames: {
1629 autoComplete: 'autocomplete',
1630 autoFocus: 'autofocus',
1631 autoPlay: 'autoplay',
1632 encType: 'enctype',
1633 radioGroup: 'radiogroup',
1634 spellCheck: 'spellcheck'
1635 },
1636 DOMMutationMethods: {
1637 /**
1638 * Setting `className` to null may cause it to be set to the string "null".
1639 *
1640 * @param {DOMElement} node
1641 * @param {*} value
1642 */
1643 className: function(node, value) {
1644 node.className = value || '';
1645 }
1646 }
1647};
1648
1649module.exports = DefaultDOMPropertyConfig;
1650
1651},{"./DOMProperty":7}],11:[function(require,module,exports){
1652/**
1653 * Copyright 2013 Facebook, Inc.
1654 *
1655 * Licensed under the Apache License, Version 2.0 (the "License");
1656 * you may not use this file except in compliance with the License.
1657 * You may obtain a copy of the License at
1658 *
1659 * http://www.apache.org/licenses/LICENSE-2.0
1660 *
1661 * Unless required by applicable law or agreed to in writing, software
1662 * distributed under the License is distributed on an "AS IS" BASIS,
1663 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1664 * See the License for the specific language governing permissions and
1665 * limitations under the License.
1666 *
1667 * @providesModule DefaultEventPluginOrder
1668 */
1669
1670"use strict";
1671
1672 var keyOf = require("./keyOf");
1673
1674/**
1675 * Module that is injectable into `EventPluginHub`, that specifies a
1676 * deterministic ordering of `EventPlugin`s. A convenient way to reason about
1677 * plugins, without having to package every one of them. This is better than
1678 * having plugins be ordered in the same order that they are injected because
1679 * that ordering would be influenced by the packaging order.
1680 * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
1681 * preventing default on events is convenient in `SimpleEventPlugin` handlers.
1682 */
1683var DefaultEventPluginOrder = [
1684 keyOf({ResponderEventPlugin: null}),
1685 keyOf({SimpleEventPlugin: null}),
1686 keyOf({TapEventPlugin: null}),
1687 keyOf({EnterLeaveEventPlugin: null}),
1688 keyOf({ChangeEventPlugin: null}),
1689 keyOf({AnalyticsEventPlugin: null}),
1690 keyOf({MobileSafariClickEventPlugin: null})
1691];
1692
1693module.exports = DefaultEventPluginOrder;
1694
1695},{"./keyOf":82}],12:[function(require,module,exports){
1696(function(){/**
1697 * Copyright 2013 Facebook, Inc.
1698 *
1699 * Licensed under the Apache License, Version 2.0 (the "License");
1700 * you may not use this file except in compliance with the License.
1701 * You may obtain a copy of the License at
1702 *
1703 * http://www.apache.org/licenses/LICENSE-2.0
1704 *
1705 * Unless required by applicable law or agreed to in writing, software
1706 * distributed under the License is distributed on an "AS IS" BASIS,
1707 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1708 * See the License for the specific language governing permissions and
1709 * limitations under the License.
1710 *
1711 * @providesModule EnterLeaveEventPlugin
1712 * @typechecks static-only
1713 */
1714
1715"use strict";
1716
1717var EventConstants = require("./EventConstants");
1718var EventPropagators = require("./EventPropagators");
1719var ExecutionEnvironment = require("./ExecutionEnvironment");
1720var SyntheticMouseEvent = require("./SyntheticMouseEvent");
1721
1722var ReactMount = require("./ReactMount");
1723var keyOf = require("./keyOf");
1724
1725var topLevelTypes = EventConstants.topLevelTypes;
1726var getFirstReactDOM = ReactMount.getFirstReactDOM;
1727
1728var eventTypes = {
1729 mouseEnter: {registrationName: keyOf({onMouseEnter: null})},
1730 mouseLeave: {registrationName: keyOf({onMouseLeave: null})}
1731};
1732
1733var EnterLeaveEventPlugin = {
1734
1735 eventTypes: eventTypes,
1736
1737 /**
1738 * For almost every interaction we care about, there will be both a top-level
1739 * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
1740 * we do not extract duplicate events. However, moving the mouse into the
1741 * browser from outside will not fire a `mouseout` event. In this case, we use
1742 * the `mouseover` top-level event.
1743 *
1744 * @param {string} topLevelType Record from `EventConstants`.
1745 * @param {DOMEventTarget} topLevelTarget The listening component root node.
1746 * @param {string} topLevelTargetID ID of `topLevelTarget`.
1747 * @param {object} nativeEvent Native browser event.
1748 * @return {*} An accumulation of synthetic events.
1749 * @see {EventPluginHub.extractEvents}
1750 */
1751 extractEvents: function(
1752 topLevelType,
1753 topLevelTarget,
1754 topLevelTargetID,
1755 nativeEvent) {
1756 if (topLevelType === topLevelTypes.topMouseOver &&
1757 (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
1758 return null;
1759 }
1760 if (topLevelType !== topLevelTypes.topMouseOut &&
1761 topLevelType !== topLevelTypes.topMouseOver) {
1762 // Must not be a mouse in or mouse out - ignoring.
1763 return null;
1764 }
1765
1766 var from, to;
1767 if (topLevelType === topLevelTypes.topMouseOut) {
1768 from = topLevelTarget;
1769 to =
1770 getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||
1771 ExecutionEnvironment.global;
1772 } else {
1773 from = ExecutionEnvironment.global;
1774 to = topLevelTarget;
1775 }
1776
1777 if (from === to) {
1778 // Nothing pertains to our managed components.
1779 return null;
1780 }
1781
1782 var fromID = from ? ReactMount.getID(from) : '';
1783 var toID = to ? ReactMount.getID(to) : '';
1784
1785 var leave = SyntheticMouseEvent.getPooled(
1786 eventTypes.mouseLeave,
1787 fromID,
1788 nativeEvent
1789 );
1790 var enter = SyntheticMouseEvent.getPooled(
1791 eventTypes.mouseEnter,
1792 toID,
1793 nativeEvent
1794 );
1795
1796 EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);
1797 return [leave, enter];
1798 }
1799
1800};
1801
1802module.exports = EnterLeaveEventPlugin;
1803
1804})()
1805},{"./EventConstants":13,"./EventPropagators":18,"./ExecutionEnvironment":19,"./ReactMount":39,"./SyntheticMouseEvent":54,"./keyOf":82}],13:[function(require,module,exports){
1806/**
1807 * Copyright 2013 Facebook, Inc.
1808 *
1809 * Licensed under the Apache License, Version 2.0 (the "License");
1810 * you may not use this file except in compliance with the License.
1811 * You may obtain a copy of the License at
1812 *
1813 * http://www.apache.org/licenses/LICENSE-2.0
1814 *
1815 * Unless required by applicable law or agreed to in writing, software
1816 * distributed under the License is distributed on an "AS IS" BASIS,
1817 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1818 * See the License for the specific language governing permissions and
1819 * limitations under the License.
1820 *
1821 * @providesModule EventConstants
1822 */
1823
1824"use strict";
1825
1826var keyMirror = require("./keyMirror");
1827
1828var PropagationPhases = keyMirror({bubbled: null, captured: null});
1829
1830/**
1831 * Types of raw signals from the browser caught at the top level.
1832 */
1833var topLevelTypes = keyMirror({
1834 topBlur: null,
1835 topChange: null,
1836 topClick: null,
1837 topDOMCharacterDataModified: null,
1838 topDoubleClick: null,
1839 topDrag: null,
1840 topDragEnd: null,
1841 topDragEnter: null,
1842 topDragExit: null,
1843 topDragLeave: null,
1844 topDragOver: null,
1845 topDragStart: null,
1846 topDrop: null,
1847 topFocus: null,
1848 topInput: null,
1849 topKeyDown: null,
1850 topKeyPress: null,
1851 topKeyUp: null,
1852 topMouseDown: null,
1853 topMouseMove: null,
1854 topMouseOut: null,
1855 topMouseOver: null,
1856 topMouseUp: null,
1857 topScroll: null,
1858 topSelectionChange: null,
1859 topSubmit: null,
1860 topTouchCancel: null,
1861 topTouchEnd: null,
1862 topTouchMove: null,
1863 topTouchStart: null,
1864 topWheel: null
1865});
1866
1867var EventConstants = {
1868 topLevelTypes: topLevelTypes,
1869 PropagationPhases: PropagationPhases
1870};
1871
1872module.exports = EventConstants;
1873
1874},{"./keyMirror":81}],14:[function(require,module,exports){
1875/**
1876 * Copyright 2013 Facebook, Inc.
1877 *
1878 * Licensed under the Apache License, Version 2.0 (the "License");
1879 * you may not use this file except in compliance with the License.
1880 * You may obtain a copy of the License at
1881 *
1882 * http://www.apache.org/licenses/LICENSE-2.0
1883 *
1884 * Unless required by applicable law or agreed to in writing, software
1885 * distributed under the License is distributed on an "AS IS" BASIS,
1886 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1887 * See the License for the specific language governing permissions and
1888 * limitations under the License.
1889 *
1890 * @providesModule EventListener
1891 */
1892
1893/**
1894 * Upstream version of event listener. Does not take into account specific
1895 * nature of platform.
1896 */
1897var EventListener = {
1898 /**
1899 * Listens to bubbled events on a DOM node.
1900 *
1901 * @param {Element} el DOM element to register listener on.
1902 * @param {string} handlerBaseName 'click'/'mouseover'
1903 * @param {Function!} cb Callback function
1904 */
1905 listen: function(el, handlerBaseName, cb) {
1906 if (el.addEventListener) {
1907 el.addEventListener(handlerBaseName, cb, false);
1908 } else if (el.attachEvent) {
1909 el.attachEvent('on' + handlerBaseName, cb);
1910 }
1911 },
1912
1913 /**
1914 * Listens to captured events on a DOM node.
1915 *
1916 * @see `EventListener.listen` for params.
1917 * @throws Exception if addEventListener is not supported.
1918 */
1919 capture: function(el, handlerBaseName, cb) {
1920 if (!el.addEventListener) {
1921 if (true) {
1922 console.error(
1923 'You are attempting to use addEventlistener ' +
1924 'in a browser that does not support it support it.' +
1925 'This likely means that you will not receive events that ' +
1926 'your application relies on (such as scroll).');
1927 }
1928 return;
1929 } else {
1930 el.addEventListener(handlerBaseName, cb, true);
1931 }
1932 }
1933};
1934
1935module.exports = EventListener;
1936
1937},{}],15:[function(require,module,exports){
1938/**
1939 * Copyright 2013 Facebook, Inc.
1940 *
1941 * Licensed under the Apache License, Version 2.0 (the "License");
1942 * you may not use this file except in compliance with the License.
1943 * You may obtain a copy of the License at
1944 *
1945 * http://www.apache.org/licenses/LICENSE-2.0
1946 *
1947 * Unless required by applicable law or agreed to in writing, software
1948 * distributed under the License is distributed on an "AS IS" BASIS,
1949 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1950 * See the License for the specific language governing permissions and
1951 * limitations under the License.
1952 *
1953 * @providesModule EventPluginHub
1954 */
1955
1956"use strict";
1957
1958var CallbackRegistry = require("./CallbackRegistry");
1959var EventPluginRegistry = require("./EventPluginRegistry");
1960var EventPluginUtils = require("./EventPluginUtils");
1961var EventPropagators = require("./EventPropagators");
1962var ExecutionEnvironment = require("./ExecutionEnvironment");
1963
1964var accumulate = require("./accumulate");
1965var forEachAccumulated = require("./forEachAccumulated");
1966var invariant = require("./invariant");
1967
1968/**
1969 * Internal queue of events that have accumulated their dispatches and are
1970 * waiting to have their dispatches executed.
1971 */
1972var eventQueue = null;
1973
1974/**
1975 * Dispatches an event and releases it back into the pool, unless persistent.
1976 *
1977 * @param {?object} event Synthetic event to be dispatched.
1978 * @private
1979 */
1980var executeDispatchesAndRelease = function(event) {
1981 if (event) {
1982 var executeDispatch = EventPluginUtils.executeDispatch;
1983 // Plugins can provide custom behavior when dispatching events.
1984 var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event);
1985 if (PluginModule && PluginModule.executeDispatch) {
1986 executeDispatch = PluginModule.executeDispatch;
1987 }
1988 EventPluginUtils.executeDispatchesInOrder(event, executeDispatch);
1989
1990 if (!event.isPersistent()) {
1991 event.constructor.release(event);
1992 }
1993 }
1994};
1995
1996/**
1997 * This is a unified interface for event plugins to be installed and configured.
1998 *
1999 * Event plugins can implement the following properties:
2000 *
2001 * `extractEvents` {function(string, DOMEventTarget, string, object): *}
2002 * Required. When a top-level event is fired, this method is expected to
2003 * extract synthetic events that will in turn be queued and dispatched.
2004 *
2005 * `eventTypes` {object}
2006 * Optional, plugins that fire events must publish a mapping of registration
2007 * names that are used to register listeners. Values of this mapping must
2008 * be objects that contain `registrationName` or `phasedRegistrationNames`.
2009 *
2010 * `executeDispatch` {function(object, function, string)}
2011 * Optional, allows plugins to override how an event gets dispatched. By
2012 * default, the listener is simply invoked.
2013 *
2014 * Each plugin that is injected into `EventsPluginHub` is immediately operable.
2015 *
2016 * @public
2017 */
2018var EventPluginHub = {
2019
2020 /**
2021 * Methods for injecting dependencies.
2022 */
2023 injection: {
2024
2025 /**
2026 * @param {object} InjectedInstanceHandle
2027 * @public
2028 */
2029 injectInstanceHandle: EventPropagators.injection.injectInstanceHandle,
2030
2031 /**
2032 * @param {array} InjectedEventPluginOrder
2033 * @public
2034 */
2035 injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,
2036
2037 /**
2038 * @param {object} injectedNamesToPlugins Map from names to plugin modules.
2039 */
2040 injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName
2041
2042 },
2043
2044 registrationNames: EventPluginRegistry.registrationNames,
2045
2046 putListener: CallbackRegistry.putListener,
2047
2048 getListener: CallbackRegistry.getListener,
2049
2050 deleteListener: CallbackRegistry.deleteListener,
2051
2052 deleteAllListeners: CallbackRegistry.deleteAllListeners,
2053
2054 /**
2055 * Allows registered plugins an opportunity to extract events from top-level
2056 * native browser events.
2057 *
2058 * @param {string} topLevelType Record from `EventConstants`.
2059 * @param {DOMEventTarget} topLevelTarget The listening component root node.
2060 * @param {string} topLevelTargetID ID of `topLevelTarget`.
2061 * @param {object} nativeEvent Native browser event.
2062 * @return {*} An accumulation of synthetic events.
2063 * @internal
2064 */
2065 extractEvents: function(
2066 topLevelType,
2067 topLevelTarget,
2068 topLevelTargetID,
2069 nativeEvent) {
2070 var events;
2071 var plugins = EventPluginRegistry.plugins;
2072 for (var i = 0, l = plugins.length; i < l; i++) {
2073 // Not every plugin in the ordering may be loaded at runtime.
2074 var possiblePlugin = plugins[i];
2075 if (possiblePlugin) {
2076 var extractedEvents = possiblePlugin.extractEvents(
2077 topLevelType,
2078 topLevelTarget,
2079 topLevelTargetID,
2080 nativeEvent
2081 );
2082 if (extractedEvents) {
2083 events = accumulate(events, extractedEvents);
2084 }
2085 }
2086 }
2087 return events;
2088 },
2089
2090 /**
2091 * Enqueues a synthetic event that should be dispatched when
2092 * `processEventQueue` is invoked.
2093 *
2094 * @param {*} events An accumulation of synthetic events.
2095 * @internal
2096 */
2097 enqueueEvents: function(events) {
2098 if (events) {
2099 eventQueue = accumulate(eventQueue, events);
2100 }
2101 },
2102
2103 /**
2104 * Dispatches all synthetic events on the event queue.
2105 *
2106 * @internal
2107 */
2108 processEventQueue: function() {
2109 // Set `eventQueue` to null before processing it so that we can tell if more
2110 // events get enqueued while processing.
2111 var processingEventQueue = eventQueue;
2112 eventQueue = null;
2113 forEachAccumulated(processingEventQueue, executeDispatchesAndRelease);
2114 invariant(
2115 !eventQueue,
2116 'processEventQueue(): Additional events were enqueued while processing ' +
2117 'an event queue. Support for this has not yet been implemented.'
2118 );
2119 }
2120
2121};
2122
2123if (ExecutionEnvironment.canUseDOM) {
2124 window.EventPluginHub = EventPluginHub;
2125}
2126
2127module.exports = EventPluginHub;
2128
2129},{"./CallbackRegistry":4,"./EventPluginRegistry":16,"./EventPluginUtils":17,"./EventPropagators":18,"./ExecutionEnvironment":19,"./accumulate":61,"./forEachAccumulated":70,"./invariant":78}],16:[function(require,module,exports){
2130/**
2131 * Copyright 2013 Facebook, Inc.
2132 *
2133 * Licensed under the Apache License, Version 2.0 (the "License");
2134 * you may not use this file except in compliance with the License.
2135 * You may obtain a copy of the License at
2136 *
2137 * http://www.apache.org/licenses/LICENSE-2.0
2138 *
2139 * Unless required by applicable law or agreed to in writing, software
2140 * distributed under the License is distributed on an "AS IS" BASIS,
2141 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2142 * See the License for the specific language governing permissions and
2143 * limitations under the License.
2144 *
2145 * @providesModule EventPluginRegistry
2146 * @typechecks static-only
2147 */
2148
2149"use strict";
2150
2151var invariant = require("./invariant");
2152
2153/**
2154 * Injectable ordering of event plugins.
2155 */
2156var EventPluginOrder = null;
2157
2158/**
2159 * Injectable mapping from names to event plugin modules.
2160 */
2161var namesToPlugins = {};
2162
2163/**
2164 * Recomputes the plugin list using the injected plugins and plugin ordering.
2165 *
2166 * @private
2167 */
2168function recomputePluginOrdering() {
2169 if (!EventPluginOrder) {
2170 // Wait until an `EventPluginOrder` is injected.
2171 return;
2172 }
2173 for (var pluginName in namesToPlugins) {
2174 var PluginModule = namesToPlugins[pluginName];
2175 var pluginIndex = EventPluginOrder.indexOf(pluginName);
2176 invariant(
2177 pluginIndex > -1,
2178 'EventPluginRegistry: Cannot inject event plugins that do not exist in ' +
2179 'the plugin ordering, `%s`.',
2180 pluginName
2181 );
2182 if (EventPluginRegistry.plugins[pluginIndex]) {
2183 continue;
2184 }
2185 invariant(
2186 PluginModule.extractEvents,
2187 'EventPluginRegistry: Event plugins must implement an `extractEvents` ' +
2188 'method, but `%s` does not.',
2189 pluginName
2190 );
2191 EventPluginRegistry.plugins[pluginIndex] = PluginModule;
2192 var publishedEvents = PluginModule.eventTypes;
2193 for (var eventName in publishedEvents) {
2194 invariant(
2195 publishEventForPlugin(publishedEvents[eventName], PluginModule),
2196 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.',
2197 eventName,
2198 pluginName
2199 );
2200 }
2201 }
2202}
2203
2204/**
2205 * Publishes an event so that it can be dispatched by the supplied plugin.
2206 *
2207 * @param {object} dispatchConfig Dispatch configuration for the event.
2208 * @param {object} PluginModule Plugin publishing the event.
2209 * @return {boolean} True if the event was successfully published.
2210 * @private
2211 */
2212function publishEventForPlugin(dispatchConfig, PluginModule) {
2213 var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;
2214 if (phasedRegistrationNames) {
2215 for (var phaseName in phasedRegistrationNames) {
2216 if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
2217 var phasedRegistrationName = phasedRegistrationNames[phaseName];
2218 publishRegistrationName(phasedRegistrationName, PluginModule);
2219 }
2220 }
2221 return true;
2222 } else if (dispatchConfig.registrationName) {
2223 publishRegistrationName(dispatchConfig.registrationName, PluginModule);
2224 return true;
2225 }
2226 return false;
2227}
2228
2229/**
2230 * Publishes a registration name that is used to identify dispatched events and
2231 * can be used with `EventPluginHub.putListener` to register listeners.
2232 *
2233 * @param {string} registrationName Registration name to add.
2234 * @param {object} PluginModule Plugin publishing the event.
2235 * @private
2236 */
2237function publishRegistrationName(registrationName, PluginModule) {
2238 invariant(
2239 !EventPluginRegistry.registrationNames[registrationName],
2240 'EventPluginHub: More than one plugin attempted to publish the same ' +
2241 'registration name, `%s`.',
2242 registrationName
2243 );
2244 EventPluginRegistry.registrationNames[registrationName] = PluginModule;
2245 EventPluginRegistry.registrationNamesKeys.push(registrationName);
2246}
2247
2248/**
2249 * Registers plugins so that they can extract and dispatch events.
2250 *
2251 * @see {EventPluginHub}
2252 */
2253var EventPluginRegistry = {
2254
2255 /**
2256 * Ordered list of injected plugins.
2257 */
2258 plugins: [],
2259
2260 /**
2261 * Mapping from registration names to plugin modules.
2262 */
2263 registrationNames: {},
2264
2265 /**
2266 * The keys of `registrationNames`.
2267 */
2268 registrationNamesKeys: [],
2269
2270 /**
2271 * Injects an ordering of plugins (by plugin name). This allows the ordering
2272 * to be decoupled from injection of the actual plugins so that ordering is
2273 * always deterministic regardless of packaging, on-the-fly injection, etc.
2274 *
2275 * @param {array} InjectedEventPluginOrder
2276 * @internal
2277 * @see {EventPluginHub.injection.injectEventPluginOrder}
2278 */
2279 injectEventPluginOrder: function(InjectedEventPluginOrder) {
2280 invariant(
2281 !EventPluginOrder,
2282 'EventPluginRegistry: Cannot inject event plugin ordering more than once.'
2283 );
2284 // Clone the ordering so it cannot be dynamically mutated.
2285 EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);
2286 recomputePluginOrdering();
2287 },
2288
2289 /**
2290 * Injects plugins to be used by `EventPluginHub`. The plugin names must be
2291 * in the ordering injected by `injectEventPluginOrder`.
2292 *
2293 * Plugins can be injected as part of page initialization or on-the-fly.
2294 *
2295 * @param {object} injectedNamesToPlugins Map from names to plugin modules.
2296 * @internal
2297 * @see {EventPluginHub.injection.injectEventPluginsByName}
2298 */
2299 injectEventPluginsByName: function(injectedNamesToPlugins) {
2300 var isOrderingDirty = false;
2301 for (var pluginName in injectedNamesToPlugins) {
2302 if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
2303 continue;
2304 }
2305 var PluginModule = injectedNamesToPlugins[pluginName];
2306 if (namesToPlugins[pluginName] !== PluginModule) {
2307 invariant(
2308 !namesToPlugins[pluginName],
2309 'EventPluginRegistry: Cannot inject two different event plugins ' +
2310 'using the same name, `%s`.',
2311 pluginName
2312 );
2313 namesToPlugins[pluginName] = PluginModule;
2314 isOrderingDirty = true;
2315 }
2316 }
2317 if (isOrderingDirty) {
2318 recomputePluginOrdering();
2319 }
2320 },
2321
2322 /**
2323 * Looks up the plugin for the supplied event.
2324 *
2325 * @param {object} event A synthetic event.
2326 * @return {?object} The plugin that created the supplied event.
2327 * @internal
2328 */
2329 getPluginModuleForEvent: function(event) {
2330 var dispatchConfig = event.dispatchConfig;
2331 if (dispatchConfig.registrationName) {
2332 return EventPluginRegistry.registrationNames[
2333 dispatchConfig.registrationName
2334 ] || null;
2335 }
2336 for (var phase in dispatchConfig.phasedRegistrationNames) {
2337 if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {
2338 continue;
2339 }
2340 var PluginModule = EventPluginRegistry.registrationNames[
2341 dispatchConfig.phasedRegistrationNames[phase]
2342 ];
2343 if (PluginModule) {
2344 return PluginModule;
2345 }
2346 }
2347 return null;
2348 },
2349
2350 /**
2351 * Exposed for unit testing.
2352 * @private
2353 */
2354 _resetEventPlugins: function() {
2355 EventPluginOrder = null;
2356 for (var pluginName in namesToPlugins) {
2357 if (namesToPlugins.hasOwnProperty(pluginName)) {
2358 delete namesToPlugins[pluginName];
2359 }
2360 }
2361 EventPluginRegistry.plugins.length = 0;
2362 var registrationNames = EventPluginRegistry.registrationNames;
2363 for (var registrationName in registrationNames) {
2364 if (registrationNames.hasOwnProperty(registrationName)) {
2365 delete registrationNames[registrationName];
2366 }
2367 }
2368 EventPluginRegistry.registrationNamesKeys.length = 0;
2369 }
2370
2371};
2372
2373module.exports = EventPluginRegistry;
2374
2375},{"./invariant":78}],17:[function(require,module,exports){
2376/**
2377 * Copyright 2013 Facebook, Inc.
2378 *
2379 * Licensed under the Apache License, Version 2.0 (the "License");
2380 * you may not use this file except in compliance with the License.
2381 * You may obtain a copy of the License at
2382 *
2383 * http://www.apache.org/licenses/LICENSE-2.0
2384 *
2385 * Unless required by applicable law or agreed to in writing, software
2386 * distributed under the License is distributed on an "AS IS" BASIS,
2387 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2388 * See the License for the specific language governing permissions and
2389 * limitations under the License.
2390 *
2391 * @providesModule EventPluginUtils
2392 */
2393
2394"use strict";
2395
2396var EventConstants = require("./EventConstants");
2397
2398var invariant = require("./invariant");
2399
2400var topLevelTypes = EventConstants.topLevelTypes;
2401
2402function isEndish(topLevelType) {
2403 return topLevelType === topLevelTypes.topMouseUp ||
2404 topLevelType === topLevelTypes.topTouchEnd ||
2405 topLevelType === topLevelTypes.topTouchCancel;
2406}
2407
2408function isMoveish(topLevelType) {
2409 return topLevelType === topLevelTypes.topMouseMove ||
2410 topLevelType === topLevelTypes.topTouchMove;
2411}
2412function isStartish(topLevelType) {
2413 return topLevelType === topLevelTypes.topMouseDown ||
2414 topLevelType === topLevelTypes.topTouchStart;
2415}
2416
2417var validateEventDispatches;
2418if (true) {
2419 validateEventDispatches = function(event) {
2420 var dispatchListeners = event._dispatchListeners;
2421 var dispatchIDs = event._dispatchIDs;
2422
2423 var listenersIsArr = Array.isArray(dispatchListeners);
2424 var idsIsArr = Array.isArray(dispatchIDs);
2425 var IDsLen = idsIsArr ? dispatchIDs.length : dispatchIDs ? 1 : 0;
2426 var listenersLen = listenersIsArr ?
2427 dispatchListeners.length :
2428 dispatchListeners ? 1 : 0;
2429
2430 invariant(
2431 idsIsArr === listenersIsArr && IDsLen === listenersLen,
2432 'EventPluginUtils: Invalid `event`.'
2433 );
2434 };
2435}
2436
2437/**
2438 * Invokes `cb(event, listener, id)`. Avoids using call if no scope is
2439 * provided. The `(listener,id)` pair effectively forms the "dispatch" but are
2440 * kept separate to conserve memory.
2441 */
2442function forEachEventDispatch(event, cb) {
2443 var dispatchListeners = event._dispatchListeners;
2444 var dispatchIDs = event._dispatchIDs;
2445 if (true) {
2446 validateEventDispatches(event);
2447 }
2448 if (Array.isArray(dispatchListeners)) {
2449 for (var i = 0; i < dispatchListeners.length; i++) {
2450 if (event.isPropagationStopped()) {
2451 break;
2452 }
2453 // Listeners and IDs are two parallel arrays that are always in sync.
2454 cb(event, dispatchListeners[i], dispatchIDs[i]);
2455 }
2456 } else if (dispatchListeners) {
2457 cb(event, dispatchListeners, dispatchIDs);
2458 }
2459}
2460
2461/**
2462 * Default implementation of PluginModule.executeDispatch().
2463 * @param {SyntheticEvent} SyntheticEvent to handle
2464 * @param {function} Application-level callback
2465 * @param {string} domID DOM id to pass to the callback.
2466 */
2467function executeDispatch(event, listener, domID) {
2468 listener(event, domID);
2469}
2470
2471/**
2472 * Standard/simple iteration through an event's collected dispatches.
2473 */
2474function executeDispatchesInOrder(event, executeDispatch) {
2475 forEachEventDispatch(event, executeDispatch);
2476 event._dispatchListeners = null;
2477 event._dispatchIDs = null;
2478}
2479
2480/**
2481 * Standard/simple iteration through an event's collected dispatches, but stops
2482 * at the first dispatch execution returning true, and returns that id.
2483 *
2484 * @return id of the first dispatch execution who's listener returns true, or
2485 * null if no listener returned true.
2486 */
2487function executeDispatchesInOrderStopAtTrue(event) {
2488 var dispatchListeners = event._dispatchListeners;
2489 var dispatchIDs = event._dispatchIDs;
2490 if (true) {
2491 validateEventDispatches(event);
2492 }
2493 if (Array.isArray(dispatchListeners)) {
2494 for (var i = 0; i < dispatchListeners.length; i++) {
2495 if (event.isPropagationStopped()) {
2496 break;
2497 }
2498 // Listeners and IDs are two parallel arrays that are always in sync.
2499 if (dispatchListeners[i](event, dispatchIDs[i])) {
2500 return dispatchIDs[i];
2501 }
2502 }
2503 } else if (dispatchListeners) {
2504 if (dispatchListeners(event, dispatchIDs)) {
2505 return dispatchIDs;
2506 }
2507 }
2508 return null;
2509}
2510
2511/**
2512 * Execution of a "direct" dispatch - there must be at most one dispatch
2513 * accumulated on the event or it is considered an error. It doesn't really make
2514 * sense for an event with multiple dispatches (bubbled) to keep track of the
2515 * return values at each dispatch execution, but it does tend to make sense when
2516 * dealing with "direct" dispatches.
2517 *
2518 * @return The return value of executing the single dispatch.
2519 */
2520function executeDirectDispatch(event) {
2521 if (true) {
2522 validateEventDispatches(event);
2523 }
2524 var dispatchListener = event._dispatchListeners;
2525 var dispatchID = event._dispatchIDs;
2526 invariant(
2527 !Array.isArray(dispatchListener),
2528 'executeDirectDispatch(...): Invalid `event`.'
2529 );
2530 var res = dispatchListener ?
2531 dispatchListener(event, dispatchID) :
2532 null;
2533 event._dispatchListeners = null;
2534 event._dispatchIDs = null;
2535 return res;
2536}
2537
2538/**
2539 * @param {SyntheticEvent} event
2540 * @return {bool} True iff number of dispatches accumulated is greater than 0.
2541 */
2542function hasDispatches(event) {
2543 return !!event._dispatchListeners;
2544}
2545
2546/**
2547 * General utilities that are useful in creating custom Event Plugins.
2548 */
2549var EventPluginUtils = {
2550 isEndish: isEndish,
2551 isMoveish: isMoveish,
2552 isStartish: isStartish,
2553 executeDispatchesInOrder: executeDispatchesInOrder,
2554 executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue,
2555 executeDirectDispatch: executeDirectDispatch,
2556 hasDispatches: hasDispatches,
2557 executeDispatch: executeDispatch
2558};
2559
2560module.exports = EventPluginUtils;
2561
2562},{"./EventConstants":13,"./invariant":78}],18:[function(require,module,exports){
2563/**
2564 * Copyright 2013 Facebook, Inc.
2565 *
2566 * Licensed under the Apache License, Version 2.0 (the "License");
2567 * you may not use this file except in compliance with the License.
2568 * You may obtain a copy of the License at
2569 *
2570 * http://www.apache.org/licenses/LICENSE-2.0
2571 *
2572 * Unless required by applicable law or agreed to in writing, software
2573 * distributed under the License is distributed on an "AS IS" BASIS,
2574 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2575 * See the License for the specific language governing permissions and
2576 * limitations under the License.
2577 *
2578 * @providesModule EventPropagators
2579 */
2580
2581"use strict";
2582
2583var CallbackRegistry = require("./CallbackRegistry");
2584var EventConstants = require("./EventConstants");
2585
2586var accumulate = require("./accumulate");
2587var forEachAccumulated = require("./forEachAccumulated");
2588var getListener = CallbackRegistry.getListener;
2589var PropagationPhases = EventConstants.PropagationPhases;
2590
2591/**
2592 * Injected dependencies:
2593 */
2594
2595/**
2596 * - `InstanceHandle`: [required] Module that performs logical traversals of DOM
2597 * hierarchy given ids of the logical DOM elements involved.
2598 */
2599var injection = {
2600 InstanceHandle: null,
2601 injectInstanceHandle: function(InjectedInstanceHandle) {
2602 injection.InstanceHandle = InjectedInstanceHandle;
2603 if (true) {
2604 injection.validate();
2605 }
2606 },
2607 validate: function() {
2608 var invalid = !injection.InstanceHandle||
2609 !injection.InstanceHandle.traverseTwoPhase ||
2610 !injection.InstanceHandle.traverseEnterLeave;
2611 if (invalid) {
2612 throw new Error('InstanceHandle not injected before use!');
2613 }
2614 }
2615};
2616
2617/**
2618 * Some event types have a notion of different registration names for different
2619 * "phases" of propagation. This finds listeners by a given phase.
2620 */
2621function listenerAtPhase(id, event, propagationPhase) {
2622 var registrationName =
2623 event.dispatchConfig.phasedRegistrationNames[propagationPhase];
2624 return getListener(id, registrationName);
2625}
2626
2627/**
2628 * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
2629 * here, allows us to not have to bind or create functions for each event.
2630 * Mutating the event's members allows us to not have to create a wrapping
2631 * "dispatch" object that pairs the event with the listener.
2632 */
2633function accumulateDirectionalDispatches(domID, upwards, event) {
2634 if (true) {
2635 if (!domID) {
2636 throw new Error('Dispatching id must not be null');
2637 }
2638 injection.validate();
2639 }
2640 var phase = upwards ? PropagationPhases.bubbled : PropagationPhases.captured;
2641 var listener = listenerAtPhase(domID, event, phase);
2642 if (listener) {
2643 event._dispatchListeners = accumulate(event._dispatchListeners, listener);
2644 event._dispatchIDs = accumulate(event._dispatchIDs, domID);
2645 }
2646}
2647
2648/**
2649 * Collect dispatches (must be entirely collected before dispatching - see unit
2650 * tests). Lazily allocate the array to conserve memory. We must loop through
2651 * each event and perform the traversal for each one. We can not perform a
2652 * single traversal for the entire collection of events because each event may
2653 * have a different target.
2654 */
2655function accumulateTwoPhaseDispatchesSingle(event) {
2656 if (event && event.dispatchConfig.phasedRegistrationNames) {
2657 injection.InstanceHandle.traverseTwoPhase(
2658 event.dispatchMarker,
2659 accumulateDirectionalDispatches,
2660 event
2661 );
2662 }
2663}
2664
2665
2666/**
2667 * Accumulates without regard to direction, does not look for phased
2668 * registration names. Same as `accumulateDirectDispatchesSingle` but without
2669 * requiring that the `dispatchMarker` be the same as the dispatched ID.
2670 */
2671function accumulateDispatches(id, ignoredDirection, event) {
2672 if (event && event.dispatchConfig.registrationName) {
2673 var registrationName = event.dispatchConfig.registrationName;
2674 var listener = getListener(id, registrationName);
2675 if (listener) {
2676 event._dispatchListeners = accumulate(event._dispatchListeners, listener);
2677 event._dispatchIDs = accumulate(event._dispatchIDs, id);
2678 }
2679 }
2680}
2681
2682/**
2683 * Accumulates dispatches on an `SyntheticEvent`, but only for the
2684 * `dispatchMarker`.
2685 * @param {SyntheticEvent} event
2686 */
2687function accumulateDirectDispatchesSingle(event) {
2688 if (event && event.dispatchConfig.registrationName) {
2689 accumulateDispatches(event.dispatchMarker, null, event);
2690 }
2691}
2692
2693function accumulateTwoPhaseDispatches(events) {
2694 if (true) {
2695 injection.validate();
2696 }
2697 forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
2698}
2699
2700function accumulateEnterLeaveDispatches(leave, enter, fromID, toID) {
2701 if (true) {
2702 injection.validate();
2703 }
2704 injection.InstanceHandle.traverseEnterLeave(
2705 fromID,
2706 toID,
2707 accumulateDispatches,
2708 leave,
2709 enter
2710 );
2711}
2712
2713
2714function accumulateDirectDispatches(events) {
2715 if (true) {
2716 injection.validate();
2717 }
2718 forEachAccumulated(events, accumulateDirectDispatchesSingle);
2719}
2720
2721
2722
2723/**
2724 * A small set of propagation patterns, each of which will accept a small amount
2725 * of information, and generate a set of "dispatch ready event objects" - which
2726 * are sets of events that have already been annotated with a set of dispatched
2727 * listener functions/ids. The API is designed this way to discourage these
2728 * propagation strategies from actually executing the dispatches, since we
2729 * always want to collect the entire set of dispatches before executing event a
2730 * single one.
2731 *
2732 * @constructor EventPropagators
2733 */
2734var EventPropagators = {
2735 accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
2736 accumulateDirectDispatches: accumulateDirectDispatches,
2737 accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches,
2738 injection: injection
2739};
2740
2741module.exports = EventPropagators;
2742
2743},{"./CallbackRegistry":4,"./EventConstants":13,"./accumulate":61,"./forEachAccumulated":70}],19:[function(require,module,exports){
2744(function(){/**
2745 * Copyright 2013 Facebook, Inc.
2746 *
2747 * Licensed under the Apache License, Version 2.0 (the "License");
2748 * you may not use this file except in compliance with the License.
2749 * You may obtain a copy of the License at
2750 *
2751 * http://www.apache.org/licenses/LICENSE-2.0
2752 *
2753 * Unless required by applicable law or agreed to in writing, software
2754 * distributed under the License is distributed on an "AS IS" BASIS,
2755 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2756 * See the License for the specific language governing permissions and
2757 * limitations under the License.
2758 *
2759 * @providesModule ExecutionEnvironment
2760 */
2761
2762/*jslint evil: true */
2763
2764"use strict";
2765
2766var canUseDOM = typeof window !== 'undefined';
2767
2768/**
2769 * Simple, lightweight module assisting with the detection and context of
2770 * Worker. Helps avoid circular dependencies and allows code to reason about
2771 * whether or not they are in a Worker, even if they never include the main
2772 * `ReactWorker` dependency.
2773 */
2774var ExecutionEnvironment = {
2775
2776 canUseDOM: canUseDOM,
2777
2778 canUseWorkers: typeof Worker !== 'undefined',
2779
2780 isInWorker: !canUseDOM, // For now, this is true - might change in the future.
2781
2782 global: new Function('return this;')()
2783
2784};
2785
2786module.exports = ExecutionEnvironment;
2787
2788})()
2789},{}],20:[function(require,module,exports){
2790/**
2791 * Copyright 2013 Facebook, Inc.
2792 *
2793 * Licensed under the Apache License, Version 2.0 (the "License");
2794 * you may not use this file except in compliance with the License.
2795 * You may obtain a copy of the License at
2796 *
2797 * http://www.apache.org/licenses/LICENSE-2.0
2798 *
2799 * Unless required by applicable law or agreed to in writing, software
2800 * distributed under the License is distributed on an "AS IS" BASIS,
2801 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2802 * See the License for the specific language governing permissions and
2803 * limitations under the License.
2804 *
2805 * @providesModule MobileSafariClickEventPlugin
2806 * @typechecks static-only
2807 */
2808
2809"use strict";
2810
2811var EventConstants = require("./EventConstants");
2812
2813var emptyFunction = require("./emptyFunction");
2814
2815var topLevelTypes = EventConstants.topLevelTypes;
2816
2817/**
2818 * Mobile Safari does not fire properly bubble click events on non-interactive
2819 * elements, which means delegated click listeners do not fire. The workaround
2820 * for this bug involves attaching an empty click listener on the target node.
2821 *
2822 * This particular plugin works around the bug by attaching an empty click
2823 * listener on `touchstart` (which does fire on every element).
2824 */
2825var MobileSafariClickEventPlugin = {
2826
2827 eventTypes: null,
2828
2829 /**
2830 * @param {string} topLevelType Record from `EventConstants`.
2831 * @param {DOMEventTarget} topLevelTarget The listening component root node.
2832 * @param {string} topLevelTargetID ID of `topLevelTarget`.
2833 * @param {object} nativeEvent Native browser event.
2834 * @return {*} An accumulation of synthetic events.
2835 * @see {EventPluginHub.extractEvents}
2836 */
2837 extractEvents: function(
2838 topLevelType,
2839 topLevelTarget,
2840 topLevelTargetID,
2841 nativeEvent) {
2842 if (topLevelType === topLevelTypes.topTouchStart) {
2843 var target = nativeEvent.target;
2844 if (target && !target.onclick) {
2845 target.onclick = emptyFunction;
2846 }
2847 }
2848 }
2849
2850};
2851
2852module.exports = MobileSafariClickEventPlugin;
2853
2854},{"./EventConstants":13,"./emptyFunction":66}],21:[function(require,module,exports){
2855/**
2856 * Copyright 2013 Facebook, Inc.
2857 *
2858 * Licensed under the Apache License, Version 2.0 (the "License");
2859 * you may not use this file except in compliance with the License.
2860 * You may obtain a copy of the License at
2861 *
2862 * http://www.apache.org/licenses/LICENSE-2.0
2863 *
2864 * Unless required by applicable law or agreed to in writing, software
2865 * distributed under the License is distributed on an "AS IS" BASIS,
2866 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2867 * See the License for the specific language governing permissions and
2868 * limitations under the License.
2869 *
2870 * @providesModule PooledClass
2871 */
2872
2873"use strict";
2874
2875/**
2876 * Static poolers. Several custom versions for each potential number of
2877 * arguments. A completely generic pooler is easy to implement, but would
2878 * require accessing the `arguments` object. In each of these, `this` refers to
2879 * the Class itself, not an instance. If any others are needed, simply add them
2880 * here, or in their own files.
2881 */
2882var oneArgumentPooler = function(copyFieldsFrom) {
2883 var Klass = this;
2884 if (Klass.instancePool.length) {
2885 var instance = Klass.instancePool.pop();
2886 Klass.call(instance, copyFieldsFrom);
2887 return instance;
2888 } else {
2889 return new Klass(copyFieldsFrom);
2890 }
2891};
2892
2893var twoArgumentPooler = function(a1, a2) {
2894 var Klass = this;
2895 if (Klass.instancePool.length) {
2896 var instance = Klass.instancePool.pop();
2897 Klass.call(instance, a1, a2);
2898 return instance;
2899 } else {
2900 return new Klass(a1, a2);
2901 }
2902};
2903
2904var threeArgumentPooler = function(a1, a2, a3) {
2905 var Klass = this;
2906 if (Klass.instancePool.length) {
2907 var instance = Klass.instancePool.pop();
2908 Klass.call(instance, a1, a2, a3);
2909 return instance;
2910 } else {
2911 return new Klass(a1, a2, a3);
2912 }
2913};
2914
2915var fiveArgumentPooler = function(a1, a2, a3, a4, a5) {
2916 var Klass = this;
2917 if (Klass.instancePool.length) {
2918 var instance = Klass.instancePool.pop();
2919 Klass.call(instance, a1, a2, a3, a4, a5);
2920 return instance;
2921 } else {
2922 return new Klass(a1, a2, a3, a4, a5);
2923 }
2924};
2925
2926var standardReleaser = function(instance) {
2927 var Klass = this;
2928 if (instance.destructor) {
2929 instance.destructor();
2930 }
2931 if (Klass.instancePool.length < Klass.poolSize) {
2932 Klass.instancePool.push(instance);
2933 }
2934};
2935
2936var DEFAULT_POOL_SIZE = 10;
2937var DEFAULT_POOLER = oneArgumentPooler;
2938
2939/**
2940 * Augments `CopyConstructor` to be a poolable class, augmenting only the class
2941 * itself (statically) not adding any prototypical fields. Any CopyConstructor
2942 * you give this may have a `poolSize` property, and will look for a
2943 * prototypical `destructor` on instances (optional).
2944 *
2945 * @param {Function} CopyConstructor Constructor that can be used to reset.
2946 * @param {Function} pooler Customizable pooler.
2947 */
2948var addPoolingTo = function(CopyConstructor, pooler) {
2949 var NewKlass = CopyConstructor;
2950 NewKlass.instancePool = [];
2951 NewKlass.getPooled = pooler || DEFAULT_POOLER;
2952 if (!NewKlass.poolSize) {
2953 NewKlass.poolSize = DEFAULT_POOL_SIZE;
2954 }
2955 NewKlass.release = standardReleaser;
2956 return NewKlass;
2957};
2958
2959var PooledClass = {
2960 addPoolingTo: addPoolingTo,
2961 oneArgumentPooler: oneArgumentPooler,
2962 twoArgumentPooler: twoArgumentPooler,
2963 threeArgumentPooler: threeArgumentPooler,
2964 fiveArgumentPooler: fiveArgumentPooler
2965};
2966
2967module.exports = PooledClass;
2968
2969},{}],22:[function(require,module,exports){
2970/**
2971 * Copyright 2013 Facebook, Inc.
2972 *
2973 * Licensed under the Apache License, Version 2.0 (the "License");
2974 * you may not use this file except in compliance with the License.
2975 * You may obtain a copy of the License at
2976 *
2977 * http://www.apache.org/licenses/LICENSE-2.0
2978 *
2979 * Unless required by applicable law or agreed to in writing, software
2980 * distributed under the License is distributed on an "AS IS" BASIS,
2981 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2982 * See the License for the specific language governing permissions and
2983 * limitations under the License.
2984 *
2985 * @providesModule React
2986 */
2987
2988"use strict";
2989
2990var ReactCompositeComponent = require("./ReactCompositeComponent");
2991var ReactComponent = require("./ReactComponent");
2992var ReactDOM = require("./ReactDOM");
2993var ReactMount = require("./ReactMount");
2994var ReactPropTypes = require("./ReactPropTypes");
2995var ReactServerRendering = require("./ReactServerRendering");
2996
2997var ReactDefaultInjection = require("./ReactDefaultInjection");
2998
2999ReactDefaultInjection.inject();
3000
3001var React = {
3002 DOM: ReactDOM,
3003 PropTypes: ReactPropTypes,
3004 initializeTouchEvents: function(shouldUseTouch) {
3005 ReactMount.useTouchEvents = shouldUseTouch;
3006 },
3007 autoBind: ReactCompositeComponent.autoBind,
3008 createClass: ReactCompositeComponent.createClass,
3009 constructAndRenderComponent: ReactMount.constructAndRenderComponent,
3010 constructAndRenderComponentByID: ReactMount.constructAndRenderComponentByID,
3011 renderComponent: ReactMount.renderComponent,
3012 renderComponentToString: ReactServerRendering.renderComponentToString,
3013 unmountAndReleaseReactRootNode: ReactMount.unmountAndReleaseReactRootNode,
3014 isValidComponent: ReactComponent.isValidComponent
3015};
3016
3017module.exports = React;
3018
3019},{"./ReactComponent":23,"./ReactCompositeComponent":24,"./ReactDOM":26,"./ReactDefaultInjection":33,"./ReactMount":39,"./ReactPropTypes":45,"./ReactServerRendering":47}],23:[function(require,module,exports){
3020/**
3021 * Copyright 2013 Facebook, Inc.
3022 *
3023 * Licensed under the Apache License, Version 2.0 (the "License");
3024 * you may not use this file except in compliance with the License.
3025 * You may obtain a copy of the License at
3026 *
3027 * http://www.apache.org/licenses/LICENSE-2.0
3028 *
3029 * Unless required by applicable law or agreed to in writing, software
3030 * distributed under the License is distributed on an "AS IS" BASIS,
3031 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3032 * See the License for the specific language governing permissions and
3033 * limitations under the License.
3034 *
3035 * @providesModule ReactComponent
3036 */
3037
3038/*jslint evil: true */
3039
3040"use strict";
3041
3042var getReactRootElementInContainer = require("./getReactRootElementInContainer");
3043var ReactCurrentOwner = require("./ReactCurrentOwner");
3044var ReactDOMIDOperations = require("./ReactDOMIDOperations");
3045var ReactMarkupChecksum = require("./ReactMarkupChecksum");
3046var ReactMount = require("./ReactMount");
3047var ReactOwner = require("./ReactOwner");
3048var ReactReconcileTransaction = require("./ReactReconcileTransaction");
3049var ReactUpdates = require("./ReactUpdates");
3050
3051var invariant = require("./invariant");
3052var keyMirror = require("./keyMirror");
3053var merge = require("./merge");
3054
3055/**
3056 * Prop key that references a component's owner.
3057 * @private
3058 */
3059var OWNER = '{owner}';
3060
3061/**
3062 * Props key that determines if a component's key was already validated.
3063 * @private
3064 */
3065var IS_KEY_VALIDATED = '{is.key.validated}';
3066
3067/**
3068 * Every React component is in one of these life cycles.
3069 */
3070var ComponentLifeCycle = keyMirror({
3071 /**
3072 * Mounted components have a DOM node representation and are capable of
3073 * receiving new props.
3074 */
3075 MOUNTED: null,
3076 /**
3077 * Unmounted components are inactive and cannot receive new props.
3078 */
3079 UNMOUNTED: null
3080});
3081
3082/**
3083 * Warn if there's no key explicitly set on dynamic arrays of children.
3084 * This allows us to keep track of children between updates.
3085 */
3086
3087var ownerHasWarned = {};
3088
3089/**
3090 * Warn if the component doesn't have an explicit key assigned to it.
3091 * This component is in an array. The array could grow and shrink or be
3092 * reordered. All children, that hasn't already been validated, are required to
3093 * have a "key" property assigned to it.
3094 *
3095 * @internal
3096 * @param {ReactComponent} component Component that requires a key.
3097 */
3098function validateExplicitKey(component) {
3099 if (component[IS_KEY_VALIDATED] || component.props.key != null) {
3100 return;
3101 }
3102 component[IS_KEY_VALIDATED] = true;
3103
3104 // We can't provide friendly warnings for top level components.
3105 if (!ReactCurrentOwner.current) {
3106 return;
3107 }
3108
3109 // Name of the component whose render method tried to pass children.
3110 var currentName = ReactCurrentOwner.current.constructor.displayName;
3111 if (ownerHasWarned.hasOwnProperty(currentName)) {
3112 return;
3113 }
3114 ownerHasWarned[currentName] = true;
3115
3116 var message = 'Each child in an array should have a unique "key" prop. ' +
3117 'Check the render method of ' + currentName + '.';
3118 if (!component.isOwnedBy(ReactCurrentOwner.current)) {
3119 // Name of the component that originally created this child.
3120 var childOwnerName =
3121 component.props[OWNER] && component.props[OWNER].constructor.displayName;
3122
3123 // Usually the current owner is the offender, but if it accepts
3124 // children as a property, it may be the creator of the child that's
3125 // responsible for assigning it a key.
3126 message += ' It was passed a child from ' + childOwnerName + '.';
3127 }
3128
3129 console.warn(message);
3130}
3131
3132/**
3133 * Ensure that every component either is passed in a static location or, if
3134 * if it's passed in an array, has an explicit key property defined.
3135 *
3136 * @internal
3137 * @param {*} component Statically passed child of any type.
3138 * @return {boolean}
3139 */
3140function validateChildKeys(component) {
3141 if (Array.isArray(component)) {
3142 for (var i = 0; i < component.length; i++) {
3143 var child = component[i];
3144 if (ReactComponent.isValidComponent(child)) {
3145 validateExplicitKey(child);
3146 }
3147 }
3148 } else if (ReactComponent.isValidComponent(component)) {
3149 // This component was passed in a valid location.
3150 component[IS_KEY_VALIDATED] = true;
3151 }
3152}
3153
3154/**
3155 * Components are the basic units of composition in React.
3156 *
3157 * Every component accepts a set of keyed input parameters known as "props" that
3158 * are initialized by the constructor. Once a component is mounted, the props
3159 * can be mutated using `setProps` or `replaceProps`.
3160 *
3161 * Every component is capable of the following operations:
3162 *
3163 * `mountComponent`
3164 * Initializes the component, renders markup, and registers event listeners.
3165 *
3166 * `receiveProps`
3167 * Updates the rendered DOM nodes given a new set of props.
3168 *
3169 * `unmountComponent`
3170 * Releases any resources allocated by this component.
3171 *
3172 * Components can also be "owned" by other components. Being owned by another
3173 * component means being constructed by that component. This is different from
3174 * being the child of a component, which means having a DOM representation that
3175 * is a child of the DOM representation of that component.
3176 *
3177 * @class ReactComponent
3178 */
3179var ReactComponent = {
3180
3181 /**
3182 * @param {?object} object
3183 * @return {boolean} True if `object` is a valid component.
3184 * @final
3185 */
3186 isValidComponent: function(object) {
3187 return !!(
3188 object &&
3189 typeof object.mountComponentIntoNode === 'function' &&
3190 typeof object.receiveProps === 'function'
3191 );
3192 },
3193
3194 /**
3195 * Generate a key string that identifies a component within a set.
3196 *
3197 * @param {*} component A component that could contain a manual key.
3198 * @param {number} index Index that is used if a manual key is not provided.
3199 * @return {string}
3200 * @internal
3201 */
3202 getKey: function(component, index) {
3203 if (component && component.props && component.props.key != null) {
3204 // Explicit key
3205 return '' + component.props.key;
3206 }
3207 // Implicit key determined by the index in the set
3208 return '' + index;
3209 },
3210
3211 /**
3212 * @internal
3213 */
3214 LifeCycle: ComponentLifeCycle,
3215
3216 /**
3217 * React references `ReactDOMIDOperations` using this property in order to
3218 * allow dependency injection.
3219 *
3220 * @internal
3221 */
3222 DOMIDOperations: ReactDOMIDOperations,
3223
3224 /**
3225 * React references `ReactReconcileTransaction` using this property in order
3226 * to allow dependency injection.
3227 *
3228 * @internal
3229 */
3230 ReactReconcileTransaction: ReactReconcileTransaction,
3231
3232 /**
3233 * @param {object} DOMIDOperations
3234 * @final
3235 */
3236 setDOMOperations: function(DOMIDOperations) {
3237 ReactComponent.DOMIDOperations = DOMIDOperations;
3238 },
3239
3240 /**
3241 * @param {Transaction} ReactReconcileTransaction
3242 * @final
3243 */
3244 setReactReconcileTransaction: function(ReactReconcileTransaction) {
3245 ReactComponent.ReactReconcileTransaction = ReactReconcileTransaction;
3246 },
3247
3248 /**
3249 * Base functionality for every ReactComponent constructor.
3250 *
3251 * @lends {ReactComponent.prototype}
3252 */
3253 Mixin: {
3254
3255 /**
3256 * Checks whether or not this component is mounted.
3257 *
3258 * @return {boolean} True if mounted, false otherwise.
3259 * @final
3260 * @protected
3261 */
3262 isMounted: function() {
3263 return this._lifeCycleState === ComponentLifeCycle.MOUNTED;
3264 },
3265
3266 /**
3267 * Returns the DOM node rendered by this component.
3268 *
3269 * @return {DOMElement} The root node of this component.
3270 * @final
3271 * @protected
3272 */
3273 getDOMNode: function() {
3274 invariant(
3275 this.isMounted(),
3276 'getDOMNode(): A component must be mounted to have a DOM node.'
3277 );
3278 return ReactMount.getNode(this._rootNodeID);
3279 },
3280
3281 /**
3282 * Sets a subset of the props.
3283 *
3284 * @param {object} partialProps Subset of the next props.
3285 * @param {?function} callback Called after props are updated.
3286 * @final
3287 * @public
3288 */
3289 setProps: function(partialProps, callback) {
3290 // Merge with `_pendingProps` if it exists, otherwise with existing props.
3291 this.replaceProps(
3292 merge(this._pendingProps || this.props, partialProps),
3293 callback
3294 );
3295 },
3296
3297 /**
3298 * Replaces all of the props.
3299 *
3300 * @param {object} props New props.
3301 * @param {?function} callback Called after props are updated.
3302 * @final
3303 * @public
3304 */
3305 replaceProps: function(props, callback) {
3306 invariant(
3307 !this.props[OWNER],
3308 'replaceProps(...): You called `setProps` or `replaceProps` on a ' +
3309 'component with an owner. This is an anti-pattern since props will ' +
3310 'get reactively updated when rendered. Instead, change the owner\'s ' +
3311 '`render` method to pass the correct value as props to the component ' +
3312 'where it is created.'
3313 );
3314 this._pendingProps = props;
3315 ReactUpdates.enqueueUpdate(this, callback);
3316 },
3317
3318 /**
3319 * Base constructor for all React component.
3320 *
3321 * Subclasses that override this method should make sure to invoke
3322 * `ReactComponent.Mixin.construct.call(this, ...)`.
3323 *
3324 * @param {?object} initialProps
3325 * @param {*} children
3326 * @internal
3327 */
3328 construct: function(initialProps, children) {
3329 this.props = initialProps || {};
3330 // Record the component responsible for creating this component.
3331 this.props[OWNER] = ReactCurrentOwner.current;
3332 // All components start unmounted.
3333 this._lifeCycleState = ComponentLifeCycle.UNMOUNTED;
3334
3335 this._pendingProps = null;
3336 this._pendingCallbacks = null;
3337
3338 // Children can be more than one argument
3339 var childrenLength = arguments.length - 1;
3340 if (childrenLength === 1) {
3341 if (true) {
3342 validateChildKeys(children);
3343 }
3344 this.props.children = children;
3345 } else if (childrenLength > 1) {
3346 var childArray = Array(childrenLength);
3347 for (var i = 0; i < childrenLength; i++) {
3348 if (true) {
3349 validateChildKeys(arguments[i + 1]);
3350 }
3351 childArray[i] = arguments[i + 1];
3352 }
3353 this.props.children = childArray;
3354 }
3355 },
3356
3357 /**
3358 * Initializes the component, renders markup, and registers event listeners.
3359 *
3360 * NOTE: This does not insert any nodes into the DOM.
3361 *
3362 * Subclasses that override this method should make sure to invoke
3363 * `ReactComponent.Mixin.mountComponent.call(this, ...)`.
3364 *
3365 * @param {string} rootID DOM ID of the root node.
3366 * @param {ReactReconcileTransaction} transaction
3367 * @return {?string} Rendered markup to be inserted into the DOM.
3368 * @internal
3369 */
3370 mountComponent: function(rootID, transaction) {
3371 invariant(
3372 !this.isMounted(),
3373 'mountComponent(%s, ...): Can only mount an unmounted component.',
3374 rootID
3375 );
3376 var props = this.props;
3377 if (props.ref != null) {
3378 ReactOwner.addComponentAsRefTo(this, props.ref, props[OWNER]);
3379 }
3380 this._rootNodeID = rootID;
3381 this._lifeCycleState = ComponentLifeCycle.MOUNTED;
3382 // Effectively: return '';
3383 },
3384
3385 /**
3386 * Releases any resources allocated by `mountComponent`.
3387 *
3388 * NOTE: This does not remove any nodes from the DOM.
3389 *
3390 * Subclasses that override this method should make sure to invoke
3391 * `ReactComponent.Mixin.unmountComponent.call(this)`.
3392 *
3393 * @internal
3394 */
3395 unmountComponent: function() {
3396 invariant(
3397 this.isMounted(),
3398 'unmountComponent(): Can only unmount a mounted component.'
3399 );
3400 var props = this.props;
3401 if (props.ref != null) {
3402 ReactOwner.removeComponentAsRefFrom(this, props.ref, props[OWNER]);
3403 }
3404 ReactMount.purgeID(this._rootNodeID);
3405 this._rootNodeID = null;
3406 this._lifeCycleState = ComponentLifeCycle.UNMOUNTED;
3407 },
3408
3409 /**
3410 * Updates the rendered DOM nodes given a new set of props.
3411 *
3412 * Subclasses that override this method should make sure to invoke
3413 * `ReactComponent.Mixin.receiveProps.call(this, ...)`.
3414 *
3415 * @param {object} nextProps Next set of properties.
3416 * @param {ReactReconcileTransaction} transaction
3417 * @internal
3418 */
3419 receiveProps: function(nextProps, transaction) {
3420 invariant(
3421 this.isMounted(),
3422 'receiveProps(...): Can only update a mounted component.'
3423 );
3424 this._pendingProps = nextProps;
3425 this._performUpdateIfNecessary(transaction);
3426 },
3427
3428 /**
3429 * Call `_performUpdateIfNecessary` within a new transaction.
3430 *
3431 * @param {ReactReconcileTransaction} transaction
3432 * @internal
3433 */
3434 performUpdateIfNecessary: function() {
3435 var transaction = ReactComponent.ReactReconcileTransaction.getPooled();
3436 transaction.perform(this._performUpdateIfNecessary, this, transaction);
3437 ReactComponent.ReactReconcileTransaction.release(transaction);
3438 },
3439
3440 /**
3441 * If `_pendingProps` is set, update the component.
3442 *
3443 * @param {ReactReconcileTransaction} transaction
3444 * @internal
3445 */
3446 _performUpdateIfNecessary: function(transaction) {
3447 if (this._pendingProps == null) {
3448 return;
3449 }
3450 var prevProps = this.props;
3451 this.props = this._pendingProps;
3452 this._pendingProps = null;
3453 this.updateComponent(transaction, prevProps);
3454 },
3455
3456 /**
3457 * Updates the component's currently mounted representation.
3458 *
3459 * @param {ReactReconcileTransaction} transaction
3460 * @param {object} prevProps
3461 * @internal
3462 */
3463 updateComponent: function(transaction, prevProps) {
3464 var props = this.props;
3465 // If either the owner or a `ref` has changed, make sure the newest owner
3466 // has stored a reference to `this`, and the previous owner (if different)
3467 // has forgotten the reference to `this`.
3468 if (props[OWNER] !== prevProps[OWNER] || props.ref !== prevProps.ref) {
3469 if (prevProps.ref != null) {
3470 ReactOwner.removeComponentAsRefFrom(
3471 this, prevProps.ref, prevProps[OWNER]
3472 );
3473 }
3474 // Correct, even if the owner is the same, and only the ref has changed.
3475 if (props.ref != null) {
3476 ReactOwner.addComponentAsRefTo(this, props.ref, props[OWNER]);
3477 }
3478 }
3479 },
3480
3481 /**
3482 * Mounts this component and inserts it into the DOM.
3483 *
3484 * @param {string} rootID DOM ID of the root node.
3485 * @param {DOMElement} container DOM element to mount into.
3486 * @param {boolean} shouldReuseMarkup If true, do not insert markup
3487 * @final
3488 * @internal
3489 * @see {ReactMount.renderComponent}
3490 */
3491 mountComponentIntoNode: function(rootID, container, shouldReuseMarkup) {
3492 var transaction = ReactComponent.ReactReconcileTransaction.getPooled();
3493 transaction.perform(
3494 this._mountComponentIntoNode,
3495 this,
3496 rootID,
3497 container,
3498 transaction,
3499 shouldReuseMarkup
3500 );
3501 ReactComponent.ReactReconcileTransaction.release(transaction);
3502 },
3503
3504 /**
3505 * @param {string} rootID DOM ID of the root node.
3506 * @param {DOMElement} container DOM element to mount into.
3507 * @param {ReactReconcileTransaction} transaction
3508 * @param {boolean} shouldReuseMarkup If true, do not insert markup
3509 * @final
3510 * @private
3511 */
3512 _mountComponentIntoNode: function(
3513 rootID,
3514 container,
3515 transaction,
3516 shouldReuseMarkup) {
3517 invariant(
3518 container && container.nodeType === 1,
3519 'mountComponentIntoNode(...): Target container is not a DOM element.'
3520 );
3521 var markup = this.mountComponent(rootID, transaction);
3522
3523 if (shouldReuseMarkup) {
3524 if (ReactMarkupChecksum.canReuseMarkup(
3525 markup,
3526 getReactRootElementInContainer(container))) {
3527 return;
3528 } else {
3529 if (true) {
3530 console.warn(
3531 'React attempted to use reuse markup in a container but the ' +
3532 'checksum was invalid. This generally means that you are using ' +
3533 'server rendering and the markup generated on the server was ' +
3534 'not what the client was expecting. React injected new markup ' +
3535 'to compensate which works but you have lost many of the ' +
3536 'benefits of server rendering. Instead, figure out why the ' +
3537 'markup being generated is different on the client or server.'
3538 );
3539 }
3540 }
3541 }
3542
3543 // Asynchronously inject markup by ensuring that the container is not in
3544 // the document when settings its `innerHTML`.
3545 var parent = container.parentNode;
3546 if (parent) {
3547 var next = container.nextSibling;
3548 parent.removeChild(container);
3549 container.innerHTML = markup;
3550 if (next) {
3551 parent.insertBefore(container, next);
3552 } else {
3553 parent.appendChild(container);
3554 }
3555 } else {
3556 container.innerHTML = markup;
3557 }
3558 },
3559
3560 /**
3561 * Unmounts this component and removes it from the DOM.
3562 *
3563 * @param {DOMElement} container DOM element to unmount from.
3564 * @final
3565 * @internal
3566 * @see {ReactMount.unmountAndReleaseReactRootNode}
3567 */
3568 unmountComponentFromNode: function(container) {
3569 this.unmountComponent();
3570 // http://jsperf.com/emptying-a-node
3571 while (container.lastChild) {
3572 container.removeChild(container.lastChild);
3573 }
3574 },
3575
3576 /**
3577 * Checks if this component is owned by the supplied `owner` component.
3578 *
3579 * @param {ReactComponent} owner Component to check.
3580 * @return {boolean} True if `owners` owns this component.
3581 * @final
3582 * @internal
3583 */
3584 isOwnedBy: function(owner) {
3585 return this.props[OWNER] === owner;
3586 },
3587
3588 /**
3589 * Gets another component, that shares the same owner as this one, by ref.
3590 *
3591 * @param {string} ref of a sibling Component.
3592 * @return {?ReactComponent} the actual sibling Component.
3593 * @final
3594 * @internal
3595 */
3596 getSiblingByRef: function(ref) {
3597 var owner = this.props[OWNER];
3598 if (!owner || !owner.refs) {
3599 return null;
3600 }
3601 return owner.refs[ref];
3602 }
3603
3604 }
3605
3606};
3607
3608module.exports = ReactComponent;
3609
3610},{"./ReactCurrentOwner":25,"./ReactDOMIDOperations":28,"./ReactMarkupChecksum":38,"./ReactMount":39,"./ReactOwner":43,"./ReactReconcileTransaction":46,"./ReactUpdates":49,"./getReactRootElementInContainer":73,"./invariant":78,"./keyMirror":81,"./merge":84}],24:[function(require,module,exports){
3611(function(){/**
3612 * Copyright 2013 Facebook, Inc.
3613 *
3614 * Licensed under the Apache License, Version 2.0 (the "License");
3615 * you may not use this file except in compliance with the License.
3616 * You may obtain a copy of the License at
3617 *
3618 * http://www.apache.org/licenses/LICENSE-2.0
3619 *
3620 * Unless required by applicable law or agreed to in writing, software
3621 * distributed under the License is distributed on an "AS IS" BASIS,
3622 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
3623 * See the License for the specific language governing permissions and
3624 * limitations under the License.
3625 *
3626 * @providesModule ReactCompositeComponent
3627 */
3628
3629"use strict";
3630
3631var ReactComponent = require("./ReactComponent");
3632var ReactCurrentOwner = require("./ReactCurrentOwner");
3633var ReactOwner = require("./ReactOwner");
3634var ReactPropTransferer = require("./ReactPropTransferer");
3635var ReactUpdates = require("./ReactUpdates");
3636
3637var invariant = require("./invariant");
3638var keyMirror = require("./keyMirror");
3639var merge = require("./merge");
3640var mixInto = require("./mixInto");
3641
3642/**
3643 * Policies that describe methods in `ReactCompositeComponentInterface`.
3644 */
3645var SpecPolicy = keyMirror({
3646 /**
3647 * These methods may be defined only once by the class specification or mixin.
3648 */
3649 DEFINE_ONCE: null,
3650 /**
3651 * These methods may be defined by both the class specification and mixins.
3652 * Subsequent definitions will be chained. These methods must return void.
3653 */
3654 DEFINE_MANY: null,
3655 /**
3656 * These methods are overriding the base ReactCompositeComponent class.
3657 */
3658 OVERRIDE_BASE: null
3659});
3660
3661/**
3662 * Composite components are higher-level components that compose other composite
3663 * or native components.
3664 *
3665 * To create a new type of `ReactCompositeComponent`, pass a specification of
3666 * your new class to `React.createClass`. The only requirement of your class
3667 * specification is that you implement a `render` method.
3668 *
3669 * var MyComponent = React.createClass({
3670 * render: function() {
3671 * return <div>Hello World</div>;
3672 * }
3673 * });
3674 *
3675 * The class specification supports a specific protocol of methods that have
3676 * special meaning (e.g. `render`). See `ReactCompositeComponentInterface` for
3677 * more the comprehensive protocol. Any other properties and methods in the
3678 * class specification will available on the prototype.
3679 *
3680 * @interface ReactCompositeComponentInterface
3681 * @internal
3682 */
3683var ReactCompositeComponentInterface = {
3684
3685 /**
3686 * An array of Mixin objects to include when defining your component.
3687 *
3688 * @type {array}
3689 * @optional
3690 */
3691 mixins: SpecPolicy.DEFINE_MANY,
3692
3693 /**
3694 * Definition of prop types for this component.
3695 *
3696 * @type {object}
3697 * @optional
3698 */
3699 propTypes: SpecPolicy.DEFINE_ONCE,
3700
3701
3702
3703 // ==== Definition methods ====
3704
3705 /**
3706 * Invoked when the component is mounted. Values in the mapping will be set on
3707 * `this.props` if that prop is not specified (i.e. using an `in` check).
3708 *
3709 * This method is invoked before `getInitialState` and therefore cannot rely
3710 * on `this.state` or use `this.setState`.
3711 *
3712 * @return {object}
3713 * @optional
3714 */
3715 getDefaultProps: SpecPolicy.DEFINE_ONCE,
3716
3717 /**
3718 * Invoked once before the component is mounted. The return value will be used
3719 * as the initial value of `this.state`.
3720 *
3721 * getInitialState: function() {
3722 * return {
3723 * isOn: false,
3724 * fooBaz: new BazFoo()
3725 * }
3726 * }
3727 *
3728 * @return {object}
3729 * @optional
3730 */
3731 getInitialState: SpecPolicy.DEFINE_ONCE,
3732
3733 /**
3734 * Uses props from `this.props` and state from `this.state` to render the
3735 * structure of the component.
3736 *
3737 * No guarantees are made about when or how often this method is invoked, so
3738 * it must not have side effects.
3739 *
3740 * render: function() {
3741 * var name = this.props.name;
3742 * return <div>Hello, {name}!</div>;
3743 * }
3744 *
3745 * @return {ReactComponent}
3746 * @nosideeffects
3747 * @required
3748 */
3749 render: SpecPolicy.DEFINE_ONCE,
3750
3751
3752
3753 // ==== Delegate methods ====
3754
3755 /**
3756 * Invoked when the component is initially created and about to be mounted.
3757 * This may have side effects, but any external subscriptions or data created
3758 * by this method must be cleaned up in `componentWillUnmount`.
3759 *
3760 * @optional
3761 */
3762 componentWillMount: SpecPolicy.DEFINE_MANY,
3763
3764 /**
3765 * Invoked when the component has been mounted and has a DOM representation.
3766 * However, there is no guarantee that the DOM node is in the document.
3767 *
3768 * Use this as an opportunity to operate on the DOM when the component has
3769 * been mounted (initialized and rendered) for the first time.
3770 *
3771 * @param {DOMElement} rootNode DOM element representing the component.
3772 * @optional
3773 */
3774 componentDidMount: SpecPolicy.DEFINE_MANY,
3775
3776 /**
3777 * Invoked before the component receives new props.
3778 *
3779 * Use this as an opportunity to react to a prop transition by updating the
3780 * state using `this.setState`. Current props are accessed via `this.props`.
3781 *
3782 * componentWillReceiveProps: function(nextProps) {
3783 * this.setState({
3784 * likesIncreasing: nextProps.likeCount > this.props.likeCount
3785 * });
3786 * }
3787 *
3788 * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop
3789 * transition may cause a state change, but the opposite is not true. If you
3790 * need it, you are probably looking for `componentWillUpdate`.
3791 *
3792 * @param {object} nextProps
3793 * @optional
3794 */
3795 componentWillReceiveProps: SpecPolicy.DEFINE_MANY,
3796
3797 /**
3798 * Invoked while deciding if the component should be updated as a result of
3799 * receiving new props and state.
3800 *
3801 * Use this as an opportunity to `return false` when you're certain that the
3802 * transition to the new props and state will not require a component update.
3803 *
3804 * shouldComponentUpdate: function(nextProps, nextState) {
3805 * return !equal(nextProps, this.props) || !equal(nextState, this.state);
3806 * }
3807 *
3808 * @param {object} nextProps
3809 * @param {?object} nextState
3810 * @return {boolean} True if the component should update.
3811 * @optional
3812 */
3813 shouldComponentUpdate: SpecPolicy.DEFINE_ONCE,
3814
3815 /**
3816 * Invoked when the component is about to update due to a transition from
3817 * `this.props` and `this.state` to `nextProps` and `nextState`.
3818 *
3819 * Use this as an opportunity to perform preparation before an update occurs.
3820 *
3821 * NOTE: You **cannot** use `this.setState()` in this method.
3822 *
3823 * @param {object} nextProps
3824 * @param {?object} nextState
3825 * @param {ReactReconcileTransaction} transaction
3826 * @optional
3827 */
3828 componentWillUpdate: SpecPolicy.DEFINE_MANY,
3829
3830 /**
3831 * Invoked when the component's DOM representation has been updated.
3832 *
3833 * Use this as an opportunity to operate on the DOM when the component has
3834 * been updated.
3835 *
3836 * @param {object} prevProps
3837 * @param {?object} prevState
3838 * @param {DOMElement} rootNode DOM element representing the component.
3839 * @optional
3840 */
3841 componentDidUpdate: SpecPolicy.DEFINE_MANY,
3842
3843 /**
3844 * Invoked when the component is about to be removed from its parent and have
3845 * its DOM representation destroyed.
3846 *
3847 * Use this as an opportunity to deallocate any external resources.
3848 *
3849 * NOTE: There is no `componentDidUnmount` since your component will have been
3850 * destroyed by that point.
3851 *
3852 * @optional
3853 */
3854 componentWillUnmount: SpecPolicy.DEFINE_MANY,
3855
3856
3857
3858 // ==== Advanced methods ====
3859
3860 /**
3861 * Updates the component's currently mounted DOM representation.
3862 *
3863 * By default, this implements React's rendering and reconciliation algorithm.
3864 * Sophisticated clients may wish to override this.
3865 *
3866 * @param {ReactReconcileTransaction} transaction
3867 * @internal
3868 * @overridable
3869 */
3870 updateComponent: SpecPolicy.OVERRIDE_BASE
3871
3872};
3873
3874/**
3875 * Mapping from class specification keys to special processing functions.
3876 *
3877 * Although these are declared in the specification when defining classes
3878 * using `React.createClass`, they will not be on the component's prototype.
3879 */
3880var RESERVED_SPEC_KEYS = {
3881 displayName: function(Constructor, displayName) {
3882 Constructor.displayName = displayName;
3883 },
3884 mixins: function(Constructor, mixins) {
3885 if (mixins) {
3886 for (var i = 0; i < mixins.length; i++) {
3887 mixSpecIntoComponent(Constructor, mixins[i]);
3888 }
3889 }
3890 },
3891 propTypes: function(Constructor, propTypes) {
3892 Constructor.propTypes = propTypes;
3893 }
3894};
3895
3896function validateMethodOverride(proto, name) {
3897 var specPolicy = ReactCompositeComponentInterface[name];
3898
3899 // Disallow overriding of base class methods unless explicitly allowed.
3900 if (ReactCompositeComponentMixin.hasOwnProperty(name)) {
3901 invariant(
3902 specPolicy === SpecPolicy.OVERRIDE_BASE,
3903 'ReactCompositeComponentInterface: You are attempting to override ' +
3904 '`%s` from your class specification. Ensure that your method names ' +
3905 'do not overlap with React methods.',
3906 name
3907 );
3908 }
3909
3910 // Disallow defining methods more than once unless explicitly allowed.
3911 if (proto.hasOwnProperty(name)) {
3912 invariant(
3913 specPolicy === SpecPolicy.DEFINE_MANY,
3914 'ReactCompositeComponentInterface: You are attempting to define ' +
3915 '`%s` on your component more than once. This conflict may be due ' +
3916 'to a mixin.',
3917 name
3918 );
3919 }
3920}
3921
3922
3923function validateLifeCycleOnReplaceState(instance) {
3924 var compositeLifeCycleState = instance._compositeLifeCycleState;
3925 invariant(
3926 instance.isMounted() ||
3927 compositeLifeCycleState === CompositeLifeCycle.MOUNTING,
3928 'replaceState(...): Can only update a mounted or mounting component.'
3929 );
3930 invariant(
3931 compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE &&
3932 compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING,
3933 'replaceState(...): Cannot update while unmounting component or during ' +
3934 'an existing state transition (such as within `render`).'
3935 );
3936}
3937
3938/**
3939 * Custom version of `mixInto` which handles policy validation and reserved
3940 * specification keys when building `ReactCompositeComponent` classses.
3941 */
3942function mixSpecIntoComponent(Constructor, spec) {
3943 var proto = Constructor.prototype;
3944 for (var name in spec) {
3945 var property = spec[name];
3946 if (!spec.hasOwnProperty(name) || !property) {
3947 continue;
3948 }
3949 validateMethodOverride(proto, name);
3950
3951 if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) {
3952 RESERVED_SPEC_KEYS[name](Constructor, property);
3953 } else {
3954 // Setup methods on prototype:
3955 // The following member methods should not be automatically bound:
3956 // 1. Expected ReactCompositeComponent methods (in the "interface").
3957 // 2. Overridden methods (that were mixed in).
3958 var isCompositeComponentMethod = name in ReactCompositeComponentInterface;
3959 var isInherited = name in proto;
3960 var markedDontBind = property.__reactDontBind;
3961 var isFunction = typeof property === 'function';
3962 var shouldAutoBind =
3963 isFunction &&
3964 !isCompositeComponentMethod &&
3965 !isInherited &&
3966 !markedDontBind;
3967
3968 if (shouldAutoBind) {
3969 if (!proto.__reactAutoBindMap) {
3970 proto.__reactAutoBindMap = {};
3971 }
3972 proto.__reactAutoBindMap[name] = property;
3973 proto[name] = property;
3974 } else {
3975 if (isInherited) {
3976 // For methods which are defined more than once, call the existing
3977 // methods before calling the new property.
3978 proto[name] = createChainedFunction(proto[name], property);
3979 } else {
3980 proto[name] = property;
3981 }
3982 }
3983 }
3984 }
3985}
3986
3987/**
3988 * Creates a function that invokes two functions and ignores their return vales.
3989 *
3990 * @param {function} one Function to invoke first.
3991 * @param {function} two Function to invoke second.
3992 * @return {function} Function that invokes the two argument functions.
3993 * @private
3994 */
3995function createChainedFunction(one, two) {
3996 return function chainedFunction() {
3997 one.apply(this, arguments);
3998 two.apply(this, arguments);
3999 };
4000}
4001
4002/**
4003 * `ReactCompositeComponent` maintains an auxiliary life cycle state in
4004 * `this._compositeLifeCycleState` (which can be null).
4005 *
4006 * This is different from the life cycle state maintained by `ReactComponent` in
4007 * `this._lifeCycleState`. The following diagram shows how the states overlap in
4008 * time. There are times when the CompositeLifeCycle is null - at those times it
4009 * is only meaningful to look at ComponentLifeCycle alone.
4010 *
4011 * Top Row: ReactComponent.ComponentLifeCycle
4012 * Low Row: ReactComponent.CompositeLifeCycle
4013 *
4014 * +-------+------------------------------------------------------+--------+
4015 * | UN | MOUNTED | UN |
4016 * |MOUNTED| | MOUNTED|
4017 * +-------+------------------------------------------------------+--------+
4018 * | ^--------+ +------+ +------+ +------+ +--------^ |
4019 * | | | | | | | | | | | |
4020 * | 0--|MOUNTING|-0-|RECEIV|-0-|RECEIV|-0-|RECEIV|-0-| UN |--->0 |
4021 * | | | |PROPS | | PROPS| | STATE| |MOUNTING| |
4022 * | | | | | | | | | | | |
4023 * | | | | | | | | | | | |
4024 * | +--------+ +------+ +------+ +------+ +--------+ |
4025 * | | | |
4026 * +-------+------------------------------------------------------+--------+
4027 */
4028var CompositeLifeCycle = keyMirror({
4029 /**
4030 * Components in the process of being mounted respond to state changes
4031 * differently.
4032 */
4033 MOUNTING: null,
4034 /**
4035 * Components in the process of being unmounted are guarded against state
4036 * changes.
4037 */
4038 UNMOUNTING: null,
4039 /**
4040 * Components that are mounted and receiving new props respond to state
4041 * changes differently.
4042 */
4043 RECEIVING_PROPS: null,
4044 /**
4045 * Components that are mounted and receiving new state are guarded against
4046 * additional state changes.
4047 */
4048 RECEIVING_STATE: null
4049});
4050
4051/**
4052 * @lends {ReactCompositeComponent.prototype}
4053 */
4054var ReactCompositeComponentMixin = {
4055
4056 /**
4057 * Base constructor for all composite component.
4058 *
4059 * @param {?object} initialProps
4060 * @param {*} children
4061 * @final
4062 * @internal
4063 */
4064 construct: function(initialProps, children) {
4065 // Children can be either an array or more than one argument
4066 ReactComponent.Mixin.construct.apply(this, arguments);
4067 this.state = null;
4068 this._pendingState = null;
4069 this._compositeLifeCycleState = null;
4070 },
4071
4072 /**
4073 * Checks whether or not this composite component is mounted.
4074 * @return {boolean} True if mounted, false otherwise.
4075 * @protected
4076 * @final
4077 */
4078 isMounted: function() {
4079 return ReactComponent.Mixin.isMounted.call(this) &&
4080 this._compositeLifeCycleState !== CompositeLifeCycle.MOUNTING;
4081 },
4082
4083 /**
4084 * Initializes the component, renders markup, and registers event listeners.
4085 *
4086 * @param {string} rootID DOM ID of the root node.
4087 * @param {ReactReconcileTransaction} transaction
4088 * @return {?string} Rendered markup to be inserted into the DOM.
4089 * @final
4090 * @internal
4091 */
4092 mountComponent: function(rootID, transaction) {
4093 ReactComponent.Mixin.mountComponent.call(this, rootID, transaction);
4094 this._compositeLifeCycleState = CompositeLifeCycle.MOUNTING;
4095
4096 this._defaultProps = this.getDefaultProps ? this.getDefaultProps() : null;
4097 this._processProps(this.props);
4098
4099 if (this.__reactAutoBindMap) {
4100 this._bindAutoBindMethods();
4101 }
4102
4103 this.state = this.getInitialState ? this.getInitialState() : null;
4104 this._pendingState = null;
4105 this._pendingForceUpdate = false;
4106
4107 if (this.componentWillMount) {
4108 this.componentWillMount();
4109 // When mounting, calls to `setState` by `componentWillMount` will set
4110 // `this._pendingState` without triggering a re-render.
4111 if (this._pendingState) {
4112 this.state = this._pendingState;
4113 this._pendingState = null;
4114 }
4115 }
4116
4117 this._renderedComponent = this._renderValidatedComponent();
4118
4119 // Done with mounting, `setState` will now trigger UI changes.
4120 this._compositeLifeCycleState = null;
4121 var markup = this._renderedComponent.mountComponent(rootID, transaction);
4122 if (this.componentDidMount) {
4123 transaction.getReactOnDOMReady().enqueue(this, this.componentDidMount);
4124 }
4125 return markup;
4126 },
4127
4128 /**
4129 * Releases any resources allocated by `mountComponent`.
4130 *
4131 * @final
4132 * @internal
4133 */
4134 unmountComponent: function() {
4135 this._compositeLifeCycleState = CompositeLifeCycle.UNMOUNTING;
4136 if (this.componentWillUnmount) {
4137 this.componentWillUnmount();
4138 }
4139 this._compositeLifeCycleState = null;
4140
4141 this._defaultProps = null;
4142
4143 ReactComponent.Mixin.unmountComponent.call(this);
4144 this._renderedComponent.unmountComponent();
4145 this._renderedComponent = null;
4146
4147 if (this.refs) {
4148 this.refs = null;
4149 }
4150
4151 // Some existing components rely on this.props even after they've been
4152 // destroyed (in event handlers).
4153 // TODO: this.props = null;
4154 // TODO: this.state = null;
4155 },
4156
4157 /**
4158 * Sets a subset of the state. Always use this or `replaceState` to mutate
4159 * state. You should treat `this.state` as immutable.
4160 *
4161 * There is no guarantee that `this.state` will be immediately updated, so
4162 * accessing `this.state` after calling this method may return the old value.
4163 *
4164 * There is no guarantee that calls to `setState` will run synchronously,
4165 * as they may eventually be batched together. You can provide an optional
4166 * callback that will be executed when the call to setState is actually
4167 * completed.
4168 *
4169 * @param {object} partialState Next partial state to be merged with state.
4170 * @param {?function} callback Called after state is updated.
4171 * @final
4172 * @protected
4173 */
4174 setState: function(partialState, callback) {
4175 // Merge with `_pendingState` if it exists, otherwise with existing state.
4176 this.replaceState(
4177 merge(this._pendingState || this.state, partialState),
4178 callback
4179 );
4180 },
4181
4182 /**
4183 * Replaces all of the state. Always use this or `setState` to mutate state.
4184 * You should treat `this.state` as immutable.
4185 *
4186 * There is no guarantee that `this.state` will be immediately updated, so
4187 * accessing `this.state` after calling this method may return the old value.
4188 *
4189 * @param {object} completeState Next state.
4190 * @param {?function} callback Called after state is updated.
4191 * @final
4192 * @protected
4193 */
4194 replaceState: function(completeState, callback) {
4195 validateLifeCycleOnReplaceState(this);
4196 this._pendingState = completeState;
4197 ReactUpdates.enqueueUpdate(this, callback);
4198 },
4199
4200 /**
4201 * Processes props by setting default values for unspecified props and
4202 * asserting that the props are valid.
4203 *
4204 * @param {object} props
4205 * @private
4206 */
4207 _processProps: function(props) {
4208 var propName;
4209 var defaultProps = this._defaultProps;
4210 for (propName in defaultProps) {
4211 if (!(propName in props)) {
4212 props[propName] = defaultProps[propName];
4213 }
4214 }
4215 var propTypes = this.constructor.propTypes;
4216 if (propTypes) {
4217 var componentName = this.constructor.displayName;
4218 for (propName in propTypes) {
4219 var checkProp = propTypes[propName];
4220 if (checkProp) {
4221 checkProp(props, propName, componentName);
4222 }
4223 }
4224 }
4225 },
4226
4227 performUpdateIfNecessary: function() {
4228 var compositeLifeCycleState = this._compositeLifeCycleState;
4229 // Do not trigger a state transition if we are in the middle of mounting or
4230 // receiving props because both of those will already be doing this.
4231 if (compositeLifeCycleState === CompositeLifeCycle.MOUNTING ||
4232 compositeLifeCycleState === CompositeLifeCycle.RECEIVING_PROPS) {
4233 return;
4234 }
4235 ReactComponent.Mixin.performUpdateIfNecessary.call(this);
4236 },
4237
4238 /**
4239 * If any of `_pendingProps`, `_pendingState`, or `_pendingForceUpdate` is
4240 * set, update the component.
4241 *
4242 * @param {ReactReconcileTransaction} transaction
4243 * @internal
4244 */
4245 _performUpdateIfNecessary: function(transaction) {
4246 if (this._pendingProps == null &&
4247 this._pendingState == null &&
4248 !this._pendingForceUpdate) {
4249 return;
4250 }
4251
4252 var nextProps = this.props;
4253 if (this._pendingProps != null) {
4254 nextProps = this._pendingProps;
4255 this._processProps(nextProps);
4256 this._pendingProps = null;
4257
4258 this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_PROPS;
4259 if (this.componentWillReceiveProps) {
4260 this.componentWillReceiveProps(nextProps, transaction);
4261 }
4262 }
4263
4264 this._compositeLifeCycleState = CompositeLifeCycle.RECEIVING_STATE;
4265
4266 var nextState = this._pendingState || this.state;
4267 this._pendingState = null;
4268
4269 if (this._pendingForceUpdate ||
4270 !this.shouldComponentUpdate ||
4271 this.shouldComponentUpdate(nextProps, nextState)) {
4272 this._pendingForceUpdate = false;
4273 // Will set `this.props` and `this.state`.
4274 this._performComponentUpdate(nextProps, nextState, transaction);
4275 } else {
4276 // If it's determined that a component should not update, we still want
4277 // to set props and state.
4278 this.props = nextProps;
4279 this.state = nextState;
4280 }
4281
4282 this._compositeLifeCycleState = null;
4283 },
4284
4285 /**
4286 * Merges new props and state, notifies delegate methods of update and
4287 * performs update.
4288 *
4289 * @param {object} nextProps Next object to set as properties.
4290 * @param {?object} nextState Next object to set as state.
4291 * @param {ReactReconcileTransaction} transaction
4292 * @private
4293 */
4294 _performComponentUpdate: function(nextProps, nextState, transaction) {
4295 var prevProps = this.props;
4296 var prevState = this.state;
4297
4298 if (this.componentWillUpdate) {
4299 this.componentWillUpdate(nextProps, nextState, transaction);
4300 }
4301
4302 this.props = nextProps;
4303 this.state = nextState;
4304
4305 this.updateComponent(transaction, prevProps, prevState);
4306
4307 if (this.componentDidUpdate) {
4308 transaction.getReactOnDOMReady().enqueue(
4309 this,
4310 this.componentDidUpdate.bind(this, prevProps, prevState)
4311 );
4312 }
4313 },
4314
4315 /**
4316 * Updates the component's currently mounted DOM representation.
4317 *
4318 * By default, this implements React's rendering and reconciliation algorithm.
4319 * Sophisticated clients may wish to override this.
4320 *
4321 * @param {ReactReconcileTransaction} transaction
4322 * @param {object} prevProps
4323 * @param {?object} prevState
4324 * @internal
4325 * @overridable
4326 */
4327 updateComponent: function(transaction, prevProps, prevState) {
4328 ReactComponent.Mixin.updateComponent.call(this, transaction, prevProps);
4329 var currentComponent = this._renderedComponent;
4330 var nextComponent = this._renderValidatedComponent();
4331 if (currentComponent.constructor === nextComponent.constructor) {
4332 currentComponent.receiveProps(nextComponent.props, transaction);
4333 } else {
4334 // These two IDs are actually the same! But nothing should rely on that.
4335 var thisID = this._rootNodeID;
4336 var currentComponentID = currentComponent._rootNodeID;
4337 currentComponent.unmountComponent();
4338 var nextMarkup = nextComponent.mountComponent(thisID, transaction);
4339 ReactComponent.DOMIDOperations.dangerouslyReplaceNodeWithMarkupByID(
4340 currentComponentID,
4341 nextMarkup
4342 );
4343 this._renderedComponent = nextComponent;
4344 }
4345 },
4346
4347 /**
4348 * Forces an update. This should only be invoked when it is known with
4349 * certainty that we are **not** in a DOM transaction.
4350 *
4351 * You may want to call this when you know that some deeper aspect of the
4352 * component's state has changed but `setState` was not called.
4353 *
4354 * This will not invoke `shouldUpdateComponent`, but it will invoke
4355 * `componentWillUpdate` and `componentDidUpdate`.
4356 *
4357 * @param {?function} callback Called after update is complete.
4358 * @final
4359 * @protected
4360 */
4361 forceUpdate: function(callback) {
4362 var compositeLifeCycleState = this._compositeLifeCycleState;
4363 invariant(
4364 this.isMounted() ||
4365 compositeLifeCycleState === CompositeLifeCycle.MOUNTING,
4366 'forceUpdate(...): Can only force an update on mounted or mounting ' +
4367 'components.'
4368 );
4369 invariant(
4370 compositeLifeCycleState !== CompositeLifeCycle.RECEIVING_STATE &&
4371 compositeLifeCycleState !== CompositeLifeCycle.UNMOUNTING,
4372 'forceUpdate(...): Cannot force an update while unmounting component ' +
4373 'or during an existing state transition (such as within `render`).'
4374 );
4375 this._pendingForceUpdate = true;
4376 ReactUpdates.enqueueUpdate(this, callback);
4377 },
4378
4379 /**
4380 * @private
4381 */
4382 _renderValidatedComponent: function() {
4383 var renderedComponent;
4384 ReactCurrentOwner.current = this;
4385 try {
4386 renderedComponent = this.render();
4387 } catch (error) {
4388 // IE8 requires `catch` in order to use `finally`.
4389 throw error;
4390 } finally {
4391 ReactCurrentOwner.current = null;
4392 }
4393 invariant(
4394 ReactComponent.isValidComponent(renderedComponent),
4395 '%s.render(): A valid ReactComponent must be returned.',
4396 this.constructor.displayName || 'ReactCompositeComponent'
4397 );
4398 return renderedComponent;
4399 },
4400
4401 /**
4402 * @private
4403 */
4404 _bindAutoBindMethods: function() {
4405 for (var autoBindKey in this.__reactAutoBindMap) {
4406 if (!this.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {
4407 continue;
4408 }
4409 var method = this.__reactAutoBindMap[autoBindKey];
4410 this[autoBindKey] = this._bindAutoBindMethod(method);
4411 }
4412 },
4413
4414 /**
4415 * Binds a method to the component.
4416 *
4417 * @param {function} method Method to be bound.
4418 * @private
4419 */
4420 _bindAutoBindMethod: function(method) {
4421 var component = this;
4422 var boundMethod = function() {
4423 return method.apply(component, arguments);
4424 };
4425 if (true) {
4426 var componentName = component.constructor.displayName;
4427 var _bind = boundMethod.bind;
4428 boundMethod.bind = function(newThis) {
4429 // User is trying to bind() an autobound method; we effectively will
4430 // ignore the value of "this" that the user is trying to use, so
4431 // let's warn.
4432 if (newThis !== component) {
4433 console.warn(
4434 'bind(): React component methods may only be bound to the ' +
4435 'component instance. See ' + componentName
4436 );
4437 } else if (arguments.length === 1) {
4438 console.warn(
4439 'bind(): You are binding a component method to the component. ' +
4440 'React does this for you automatically in a high-performance ' +
4441 'way, so you can safely remove this call. See ' + componentName
4442 );
4443 return boundMethod;
4444 }
4445 return _bind.apply(boundMethod, arguments);
4446 };
4447 }
4448 return boundMethod;
4449 }
4450};
4451
4452var ReactCompositeComponentBase = function() {};
4453mixInto(ReactCompositeComponentBase, ReactComponent.Mixin);
4454mixInto(ReactCompositeComponentBase, ReactOwner.Mixin);
4455mixInto(ReactCompositeComponentBase, ReactPropTransferer.Mixin);
4456mixInto(ReactCompositeComponentBase, ReactCompositeComponentMixin);
4457
4458/**
4459 * Module for creating composite components.
4460 *
4461 * @class ReactCompositeComponent
4462 * @extends ReactComponent
4463 * @extends ReactOwner
4464 * @extends ReactPropTransferer
4465 */
4466var ReactCompositeComponent = {
4467
4468 LifeCycle: CompositeLifeCycle,
4469
4470 Base: ReactCompositeComponentBase,
4471
4472 /**
4473 * Creates a composite component class given a class specification.
4474 *
4475 * @param {object} spec Class specification (which must define `render`).
4476 * @return {function} Component constructor function.
4477 * @public
4478 */
4479 createClass: function(spec) {
4480 var Constructor = function() {};
4481 Constructor.prototype = new ReactCompositeComponentBase();
4482 Constructor.prototype.constructor = Constructor;
4483 mixSpecIntoComponent(Constructor, spec);
4484 invariant(
4485 Constructor.prototype.render,
4486 'createClass(...): Class specification must implement a `render` method.'
4487 );
4488 // Reduce time spent doing lookups by setting these on the prototype.
4489 for (var methodName in ReactCompositeComponentInterface) {
4490 if (!Constructor.prototype[methodName]) {
4491 Constructor.prototype[methodName] = null;
4492 }
4493 }
4494
4495 var ConvenienceConstructor = function(props, children) {
4496 var instance = new Constructor();
4497 instance.construct.apply(instance, arguments);
4498 return instance;
4499 };
4500 ConvenienceConstructor.componentConstructor = Constructor;
4501 ConvenienceConstructor.originalSpec = spec;
4502 return ConvenienceConstructor;
4503 },
4504
4505 /**
4506 * TODO: Delete this when all callers have been updated to rely on this
4507 * behavior being the default.
4508 *
4509 * Backwards compatible stub for what is now the default behavior.
4510 * @param {function} method Method to be bound.
4511 * @public
4512 */
4513 autoBind: function(method) {
4514 if (true) {
4515 console.warn(
4516 'React.autoBind() is now deprecated. All React component methods ' +
4517 'are auto bound by default, so React.autoBind() is a no-op. It ' +
4518 'will be removed in the next version of React'
4519 );
4520 }
4521 return method;
4522 }
4523};
4524
4525module.exports = ReactCompositeComponent;
4526
4527})()
4528},{"./ReactComponent":23,"./ReactCurrentOwner":25,"./ReactOwner":43,"./ReactPropTransferer":44,"./ReactUpdates":49,"./invariant":78,"./keyMirror":81,"./merge":84,"./mixInto":87}],25:[function(require,module,exports){
4529/**
4530 * Copyright 2013 Facebook, Inc.
4531 *
4532 * Licensed under the Apache License, Version 2.0 (the "License");
4533 * you may not use this file except in compliance with the License.
4534 * You may obtain a copy of the License at
4535 *
4536 * http://www.apache.org/licenses/LICENSE-2.0
4537 *
4538 * Unless required by applicable law or agreed to in writing, software
4539 * distributed under the License is distributed on an "AS IS" BASIS,
4540 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4541 * See the License for the specific language governing permissions and
4542 * limitations under the License.
4543 *
4544 * @providesModule ReactCurrentOwner
4545 */
4546
4547"use strict";
4548
4549/**
4550 * Keeps track of the current owner.
4551 *
4552 * The current owner is the component who should own any components that are
4553 * currently being constructed.
4554 *
4555 * The depth indicate how many composite components are above this render level.
4556 */
4557var ReactCurrentOwner = {
4558
4559 /**
4560 * @internal
4561 * @type {ReactComponent}
4562 */
4563 current: null
4564
4565};
4566
4567module.exports = ReactCurrentOwner;
4568
4569},{}],26:[function(require,module,exports){
4570/**
4571 * Copyright 2013 Facebook, Inc.
4572 *
4573 * Licensed under the Apache License, Version 2.0 (the "License");
4574 * you may not use this file except in compliance with the License.
4575 * You may obtain a copy of the License at
4576 *
4577 * http://www.apache.org/licenses/LICENSE-2.0
4578 *
4579 * Unless required by applicable law or agreed to in writing, software
4580 * distributed under the License is distributed on an "AS IS" BASIS,
4581 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4582 * See the License for the specific language governing permissions and
4583 * limitations under the License.
4584 *
4585 * @providesModule ReactDOM
4586 * @typechecks static-only
4587 */
4588
4589"use strict";
4590
4591var ReactNativeComponent = require("./ReactNativeComponent");
4592
4593var mergeInto = require("./mergeInto");
4594var objMapKeyVal = require("./objMapKeyVal");
4595
4596/**
4597 * Creates a new React class that is idempotent and capable of containing other
4598 * React components. It accepts event listeners and DOM properties that are
4599 * valid according to `DOMProperty`.
4600 *
4601 * - Event listeners: `onClick`, `onMouseDown`, etc.
4602 * - DOM properties: `className`, `name`, `title`, etc.
4603 *
4604 * The `style` property functions differently from the DOM API. It accepts an
4605 * object mapping of style properties to values.
4606 *
4607 * @param {string} tag Tag name (e.g. `div`).
4608 * @param {boolean} omitClose True if the close tag should be omitted.
4609 * @private
4610 */
4611function createDOMComponentClass(tag, omitClose) {
4612 var Constructor = function() {};
4613 Constructor.prototype = new ReactNativeComponent(tag, omitClose);
4614 Constructor.prototype.constructor = Constructor;
4615
4616 var ConvenienceConstructor = function(props, children) {
4617 var instance = new Constructor();
4618 instance.construct.apply(instance, arguments);
4619 return instance;
4620 };
4621 ConvenienceConstructor.componentConstructor = Constructor;
4622 return ConvenienceConstructor;
4623}
4624
4625/**
4626 * Creates a mapping from supported HTML tags to `ReactNativeComponent` classes.
4627 * This is also accessible via `React.DOM`.
4628 *
4629 * @public
4630 */
4631var ReactDOM = objMapKeyVal({
4632 a: false,
4633 abbr: false,
4634 address: false,
4635 area: false,
4636 article: false,
4637 aside: false,
4638 audio: false,
4639 b: false,
4640 base: false,
4641 bdi: false,
4642 bdo: false,
4643 big: false,
4644 blockquote: false,
4645 body: false,
4646 br: true,
4647 button: false,
4648 canvas: false,
4649 caption: false,
4650 cite: false,
4651 code: false,
4652 col: true,
4653 colgroup: false,
4654 data: false,
4655 datalist: false,
4656 dd: false,
4657 del: false,
4658 details: false,
4659 dfn: false,
4660 div: false,
4661 dl: false,
4662 dt: false,
4663 em: false,
4664 embed: true,
4665 fieldset: false,
4666 figcaption: false,
4667 figure: false,
4668 footer: false,
4669 form: false, // NOTE: Injected, see `ReactDOMForm`.
4670 h1: false,
4671 h2: false,
4672 h3: false,
4673 h4: false,
4674 h5: false,
4675 h6: false,
4676 head: false,
4677 header: false,
4678 hr: true,
4679 html: false,
4680 i: false,
4681 iframe: false,
4682 img: true,
4683 input: true,
4684 ins: false,
4685 kbd: false,
4686 keygen: true,
4687 label: false,
4688 legend: false,
4689 li: false,
4690 link: false,
4691 main: false,
4692 map: false,
4693 mark: false,
4694 menu: false,
4695 menuitem: false, // NOTE: Close tag should be omitted, but causes problems.
4696 meta: true,
4697 meter: false,
4698 nav: false,
4699 noscript: false,
4700 object: false,
4701 ol: false,
4702 optgroup: false,
4703 option: false,
4704 output: false,
4705 p: false,
4706 param: true,
4707 pre: false,
4708 progress: false,
4709 q: false,
4710 rp: false,
4711 rt: false,
4712 ruby: false,
4713 s: false,
4714 samp: false,
4715 script: false,
4716 section: false,
4717 select: false,
4718 small: false,
4719 source: false,
4720 span: false,
4721 strong: false,
4722 style: false,
4723 sub: false,
4724 summary: false,
4725 sup: false,
4726 table: false,
4727 tbody: false,
4728 td: false,
4729 textarea: false, // NOTE: Injected, see `ReactDOMTextarea`.
4730 tfoot: false,
4731 th: false,
4732 thead: false,
4733 time: false,
4734 title: false,
4735 tr: false,
4736 track: true,
4737 u: false,
4738 ul: false,
4739 'var': false,
4740 video: false,
4741 wbr: false,
4742
4743 // SVG
4744 circle: false,
4745 g: false,
4746 line: false,
4747 path: false,
4748 polyline: false,
4749 rect: false,
4750 svg: false,
4751 text: false
4752}, createDOMComponentClass);
4753
4754var injection = {
4755 injectComponentClasses: function(componentClasses) {
4756 mergeInto(ReactDOM, componentClasses);
4757 }
4758};
4759
4760ReactDOM.injection = injection;
4761
4762module.exports = ReactDOM;
4763
4764},{"./ReactNativeComponent":41,"./mergeInto":86,"./objMapKeyVal":88}],27:[function(require,module,exports){
4765/**
4766 * Copyright 2013 Facebook, Inc.
4767 *
4768 * Licensed under the Apache License, Version 2.0 (the "License");
4769 * you may not use this file except in compliance with the License.
4770 * You may obtain a copy of the License at
4771 *
4772 * http://www.apache.org/licenses/LICENSE-2.0
4773 *
4774 * Unless required by applicable law or agreed to in writing, software
4775 * distributed under the License is distributed on an "AS IS" BASIS,
4776 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4777 * See the License for the specific language governing permissions and
4778 * limitations under the License.
4779 *
4780 * @providesModule ReactDOMForm
4781 */
4782
4783"use strict";
4784
4785var ReactCompositeComponent = require("./ReactCompositeComponent");
4786var ReactDOM = require("./ReactDOM");
4787var ReactEventEmitter = require("./ReactEventEmitter");
4788var EventConstants = require("./EventConstants");
4789
4790// Store a reference to the <form> `ReactNativeComponent`.
4791var form = ReactDOM.form;
4792
4793/**
4794 * Since onSubmit doesn't bubble OR capture on the top level in IE8, we need
4795 * to capture it on the <form> element itself. There are lots of hacks we could
4796 * do to accomplish this, but the most reliable is to make <form> a
4797 * composite component and use `componentDidMount` to attach the event handlers.
4798 */
4799var ReactDOMForm = ReactCompositeComponent.createClass({
4800 render: function() {
4801 // TODO: Instead of using `ReactDOM` directly, we should use JSX. However,
4802 // `jshint` fails to parse JSX so in order for linting to work in the open
4803 // source repo, we need to just use `ReactDOM.form`.
4804 return this.transferPropsTo(form(null, this.props.children));
4805 },
4806
4807 componentDidMount: function(node) {
4808 ReactEventEmitter.trapBubbledEvent(
4809 EventConstants.topLevelTypes.topSubmit,
4810 'submit',
4811 node
4812 );
4813 }
4814});
4815
4816module.exports = ReactDOMForm;
4817
4818},{"./EventConstants":13,"./ReactCompositeComponent":24,"./ReactDOM":26,"./ReactEventEmitter":34}],28:[function(require,module,exports){
4819(function(){/**
4820 * Copyright 2013 Facebook, Inc.
4821 *
4822 * Licensed under the Apache License, Version 2.0 (the "License");
4823 * you may not use this file except in compliance with the License.
4824 * You may obtain a copy of the License at
4825 *
4826 * http://www.apache.org/licenses/LICENSE-2.0
4827 *
4828 * Unless required by applicable law or agreed to in writing, software
4829 * distributed under the License is distributed on an "AS IS" BASIS,
4830 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
4831 * See the License for the specific language governing permissions and
4832 * limitations under the License.
4833 *
4834 * @providesModule ReactDOMIDOperations
4835 * @typechecks static-only
4836 */
4837
4838/*jslint evil: true */
4839
4840"use strict";
4841
4842var CSSPropertyOperations = require("./CSSPropertyOperations");
4843var DOMChildrenOperations = require("./DOMChildrenOperations");
4844var DOMPropertyOperations = require("./DOMPropertyOperations");
4845var ReactMount = require("./ReactMount");
4846
4847var getTextContentAccessor = require("./getTextContentAccessor");
4848var invariant = require("./invariant");
4849
4850/**
4851 * Errors for properties that should not be updated with `updatePropertyById()`.
4852 *
4853 * @type {object}
4854 * @private
4855 */
4856var INVALID_PROPERTY_ERRORS = {
4857 dangerouslySetInnerHTML:
4858 '`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.',
4859 style: '`style` must be set using `updateStylesByID()`.'
4860};
4861
4862/**
4863 * The DOM property to use when setting text content.
4864 *
4865 * @type {string}
4866 * @private
4867 */
4868var textContentAccessor = getTextContentAccessor() || 'NA';
4869
4870/**
4871 * Operations used to process updates to DOM nodes. This is made injectable via
4872 * `ReactComponent.DOMIDOperations`.
4873 */
4874var ReactDOMIDOperations = {
4875
4876 /**
4877 * Updates a DOM node with new property values. This should only be used to
4878 * update DOM properties in `DOMProperty`.
4879 *
4880 * @param {string} id ID of the node to update.
4881 * @param {string} name A valid property name, see `DOMProperty`.
4882 * @param {*} value New value of the property.
4883 * @internal
4884 */
4885 updatePropertyByID: function(id, name, value) {
4886 var node = ReactMount.getNode(id);
4887 invariant(
4888 !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),
4889 'updatePropertyByID(...): %s',
4890 INVALID_PROPERTY_ERRORS[name]
4891 );
4892
4893 // If we're updating to null or undefined, we should remove the property
4894 // from the DOM node instead of inadvertantly setting to a string. This
4895 // brings us in line with the same behavior we have on initial render.
4896 if (value != null) {
4897 DOMPropertyOperations.setValueForProperty(node, name, value);
4898 } else {
4899 DOMPropertyOperations.deleteValueForProperty(node, name);
4900 }
4901 },
4902
4903 /**
4904 * Updates a DOM node to remove a property. This should only be used to remove
4905 * DOM properties in `DOMProperty`.
4906 *
4907 * @param {string} id ID of the node to update.
4908 * @param {string} name A property name to remove, see `DOMProperty`.
4909 * @internal
4910 */
4911 deletePropertyByID: function(id, name, value) {
4912 var node = ReactMount.getNode(id);
4913 invariant(
4914 !INVALID_PROPERTY_ERRORS.hasOwnProperty(name),
4915 'updatePropertyByID(...): %s',
4916 INVALID_PROPERTY_ERRORS[name]
4917 );
4918 DOMPropertyOperations.deleteValueForProperty(node, name, value);
4919 },
4920
4921 /**
4922 * This should almost never be used instead of `updatePropertyByID()` due to
4923 * the extra object allocation required by the API. That said, this is useful
4924 * for batching up several operations across worker thread boundaries.
4925 *
4926 * @param {string} id ID of the node to update.
4927 * @param {object} properties A mapping of valid property names.
4928 * @internal
4929 * @see {ReactDOMIDOperations.updatePropertyByID}
4930 */
4931 updatePropertiesByID: function(id, properties) {
4932 for (var name in properties) {
4933 if (!properties.hasOwnProperty(name)) {
4934 continue;
4935 }
4936 ReactDOMIDOperations.updatePropertiesByID(id, name, properties[name]);
4937 }
4938 },
4939
4940 /**
4941 * Updates a DOM node with new style values. If a value is specified as '',
4942 * the corresponding style property will be unset.
4943 *
4944 * @param {string} id ID of the node to update.
4945 * @param {object} styles Mapping from styles to values.
4946 * @internal
4947 */
4948 updateStylesByID: function(id, styles) {
4949 var node = ReactMount.getNode(id);
4950 CSSPropertyOperations.setValueForStyles(node, styles);
4951 },
4952
4953 /**
4954 * Updates a DOM node's innerHTML set by `props.dangerouslySetInnerHTML`.
4955 *
4956 * @param {string} id ID of the node to update.
4957 * @param {object} html An HTML object with the `__html` property.
4958 * @internal
4959 */
4960 updateInnerHTMLByID: function(id, html) {
4961 var node = ReactMount.getNode(id);
4962 // HACK: IE8- normalize whitespace in innerHTML, removing leading spaces.
4963 // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
4964 node.innerHTML = (html && html.__html || '').replace(/^ /g, '&nbsp;');
4965 },
4966
4967 /**
4968 * Updates a DOM node's text content set by `props.content`.
4969 *
4970 * @param {string} id ID of the node to update.
4971 * @param {string} content Text content.
4972 * @internal
4973 */
4974 updateTextContentByID: function(id, content) {
4975 var node = ReactMount.getNode(id);
4976 node[textContentAccessor] = content;
4977 },
4978
4979 /**
4980 * Replaces a DOM node that exists in the document with markup.
4981 *
4982 * @param {string} id ID of child to be replaced.
4983 * @param {string} markup Dangerous markup to inject in place of child.
4984 * @internal
4985 * @see {Danger.dangerouslyReplaceNodeWithMarkup}
4986 */
4987 dangerouslyReplaceNodeWithMarkupByID: function(id, markup) {
4988 var node = ReactMount.getNode(id);
4989 DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup);
4990 },
4991
4992 /**
4993 * TODO: We only actually *need* to purge the cache when we remove elements.
4994 * Detect if any elements were removed instead of blindly purging.
4995 */
4996 manageChildrenByParentID: function(parentID, domOperations) {
4997 var parent = ReactMount.getNode(parentID);
4998 DOMChildrenOperations.manageChildren(parent, domOperations);
4999 }
5000
5001};
5002
5003module.exports = ReactDOMIDOperations;
5004
5005})()
5006},{"./CSSPropertyOperations":3,"./DOMChildrenOperations":6,"./DOMPropertyOperations":8,"./ReactMount":39,"./getTextContentAccessor":74,"./invariant":78}],29:[function(require,module,exports){
5007/**
5008 * Copyright 2013 Facebook, Inc.
5009 *
5010 * Licensed under the Apache License, Version 2.0 (the "License");
5011 * you may not use this file except in compliance with the License.
5012 * You may obtain a copy of the License at
5013 *
5014 * http://www.apache.org/licenses/LICENSE-2.0
5015 *
5016 * Unless required by applicable law or agreed to in writing, software
5017 * distributed under the License is distributed on an "AS IS" BASIS,
5018 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5019 * See the License for the specific language governing permissions and
5020 * limitations under the License.
5021 *
5022 * @providesModule ReactDOMInput
5023 */
5024
5025"use strict";
5026
5027var DOMPropertyOperations = require("./DOMPropertyOperations");
5028var ReactCompositeComponent = require("./ReactCompositeComponent");
5029var ReactDOM = require("./ReactDOM");
5030
5031var merge = require("./merge");
5032
5033// Store a reference to the <input> `ReactNativeComponent`.
5034var input = ReactDOM.input;
5035
5036/**
5037 * Implements an <input> native component that allows setting these optional
5038 * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
5039 *
5040 * If `checked` or `value` are not supplied (or null/undefined), user actions
5041 * that affect the checked state or value will trigger updates to the element.
5042 *
5043 * If they are supplied (and not null/undefined), the rendered element will not
5044 * trigger updates to the element. Instead, the props must change in order for
5045 * the rendered element to be updated.
5046 *
5047 * The rendered element will be initialized as unchecked (or `defaultChecked`)
5048 * with an empty value (or `defaultValue`).
5049 *
5050 * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
5051 */
5052var ReactDOMInput = ReactCompositeComponent.createClass({
5053
5054 getInitialState: function() {
5055 return {
5056 checked: this.props.defaultChecked || false,
5057 value: this.props.defaultValue || ''
5058 };
5059 },
5060
5061 shouldComponentUpdate: function() {
5062 // Defer any updates to this component during the `onChange` handler.
5063 return !this._isChanging;
5064 },
5065
5066 getChecked: function() {
5067 return this.props.checked != null ? this.props.checked : this.state.checked;
5068 },
5069
5070 getValue: function() {
5071 // Cast `this.props.value` to a string so equality checks pass.
5072 return this.props.value != null ? '' + this.props.value : this.state.value;
5073 },
5074
5075 render: function() {
5076 // Clone `this.props` so we don't mutate the input.
5077 var props = merge(this.props);
5078
5079 props.checked = this.getChecked();
5080 props.value = this.getValue();
5081 props.onChange = this.handleChange;
5082
5083 return input(props, this.props.children);
5084 },
5085
5086 componentDidUpdate: function(prevProps, prevState, rootNode) {
5087 if (this.props.checked != null) {
5088 DOMPropertyOperations.setValueForProperty(
5089 rootNode,
5090 'checked',
5091 this.props.checked || false
5092 );
5093 }
5094 if (this.props.value != null) {
5095 // Cast `this.props.value` to a string so falsey values that cast to
5096 // truthy strings are not ignored.
5097 DOMPropertyOperations.setValueForProperty(
5098 rootNode,
5099 'value',
5100 '' + this.props.value || ''
5101 );
5102 }
5103 },
5104
5105 handleChange: function(event) {
5106 var returnValue;
5107 if (this.props.onChange) {
5108 this._isChanging = true;
5109 returnValue = this.props.onChange(event);
5110 this._isChanging = false;
5111 }
5112 this.setState({
5113 checked: event.target.checked,
5114 value: event.target.value
5115 });
5116 return returnValue;
5117 }
5118
5119});
5120
5121module.exports = ReactDOMInput;
5122
5123},{"./DOMPropertyOperations":8,"./ReactCompositeComponent":24,"./ReactDOM":26,"./merge":84}],30:[function(require,module,exports){
5124/**
5125 * Copyright 2013 Facebook, Inc.
5126 *
5127 * Licensed under the Apache License, Version 2.0 (the "License");
5128 * you may not use this file except in compliance with the License.
5129 * You may obtain a copy of the License at
5130 *
5131 * http://www.apache.org/licenses/LICENSE-2.0
5132 *
5133 * Unless required by applicable law or agreed to in writing, software
5134 * distributed under the License is distributed on an "AS IS" BASIS,
5135 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5136 * See the License for the specific language governing permissions and
5137 * limitations under the License.
5138 *
5139 * @providesModule ReactDOMOption
5140 */
5141
5142"use strict";
5143
5144var ReactCompositeComponent = require("./ReactCompositeComponent");
5145var ReactDOM = require("./ReactDOM");
5146
5147// Store a reference to the <option> `ReactNativeComponent`.
5148var option = ReactDOM.option;
5149
5150/**
5151 * Implements an <option> native component that warns when `selected` is set.
5152 */
5153var ReactDOMOption = ReactCompositeComponent.createClass({
5154
5155 componentWillMount: function() {
5156 // TODO (yungsters): Remove support for `selected` in <option>.
5157 if (this.props.selected != null) {
5158 if (true) {
5159 console.warn(
5160 'Use the `defaultValue` or `value` props on <select> instead of ' +
5161 'setting `selected` on <option>.'
5162 );
5163 }
5164 }
5165 },
5166
5167 render: function() {
5168 return option(this.props, this.props.children);
5169 }
5170
5171});
5172
5173module.exports = ReactDOMOption;
5174
5175},{"./ReactCompositeComponent":24,"./ReactDOM":26}],31:[function(require,module,exports){
5176/**
5177 * Copyright 2013 Facebook, Inc.
5178 *
5179 * Licensed under the Apache License, Version 2.0 (the "License");
5180 * you may not use this file except in compliance with the License.
5181 * You may obtain a copy of the License at
5182 *
5183 * http://www.apache.org/licenses/LICENSE-2.0
5184 *
5185 * Unless required by applicable law or agreed to in writing, software
5186 * distributed under the License is distributed on an "AS IS" BASIS,
5187 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5188 * See the License for the specific language governing permissions and
5189 * limitations under the License.
5190 *
5191 * @providesModule ReactDOMSelect
5192 */
5193
5194"use strict";
5195
5196var ReactCompositeComponent = require("./ReactCompositeComponent");
5197var ReactDOM = require("./ReactDOM");
5198
5199var invariant = require("./invariant");
5200var merge = require("./merge");
5201
5202// Store a reference to the <select> `ReactNativeComponent`.
5203var select = ReactDOM.select;
5204
5205/**
5206 * Validation function for `value` and `defaultValue`.
5207 * @private
5208 */
5209function selectValueType(props, propName, componentName) {
5210 if (props[propName] == null) {
5211 return;
5212 }
5213 if (props.multiple) {
5214 invariant(
5215 Array.isArray(props[propName]),
5216 'The `%s` prop supplied to <select> must be an array if `multiple` is ' +
5217 'true.',
5218 propName
5219 );
5220 } else {
5221 invariant(
5222 !Array.isArray(props[propName]),
5223 'The `%s` prop supplied to <select> must be a scalar value if ' +
5224 '`multiple` is false.',
5225 propName
5226 );
5227 }
5228}
5229
5230/**
5231 * If `value` is supplied, updates <option> elements on mount and update.
5232 * @private
5233 */
5234function updateOptions() {
5235 /*jshint validthis:true */
5236 if (this.props.value == null) {
5237 return;
5238 }
5239 var options = this.getDOMNode().options;
5240 var selectedValue = '' + this.props.value;
5241
5242 for (var i = 0, l = options.length; i < l; i++) {
5243 var selected = this.props.multiple ?
5244 selectedValue.indexOf(options[i].value) >= 0 :
5245 selected = options[i].value === selectedValue;
5246
5247 if (selected !== options[i].selected) {
5248 options[i].selected = selected;
5249 }
5250 }
5251}
5252
5253/**
5254 * Implements a <select> native component that allows optionally setting the
5255 * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
5256 * string. If `multiple` is true, the prop must be an array of strings.
5257 *
5258 * If `value` is not supplied (or null/undefined), user actions that change the
5259 * selected option will trigger updates to the rendered options.
5260 *
5261 * If it is supplied (and not null/undefined), the rendered options will not
5262 * update in response to user actions. Instead, the `value` prop must change in
5263 * order for the rendered options to update.
5264 *
5265 * If `defaultValue` is provided, any options with the supplied values will be
5266 * selected.
5267 */
5268var ReactDOMSelect = ReactCompositeComponent.createClass({
5269
5270 propTypes: {
5271 defaultValue: selectValueType,
5272 value: selectValueType
5273 },
5274
5275 getInitialState: function() {
5276 return {value: this.props.defaultValue || (this.props.multiple ? [] : '')};
5277 },
5278
5279 componentWillReceiveProps: function(nextProps) {
5280 if (!this.props.multiple && nextProps.multiple) {
5281 this.setState({value: [this.state.value]});
5282 } else if (this.props.multiple && !nextProps.multiple) {
5283 this.setState({value: this.state.value[0]});
5284 }
5285 },
5286
5287 shouldComponentUpdate: function() {
5288 // Defer any updates to this component during the `onChange` handler.
5289 return !this._isChanging;
5290 },
5291
5292 render: function() {
5293 // Clone `this.props` so we don't mutate the input.
5294 var props = merge(this.props);
5295
5296 props.onChange = this.handleChange;
5297 props.value = null;
5298
5299 return select(props, this.props.children);
5300 },
5301
5302 componentDidMount: updateOptions,
5303
5304 componentDidUpdate: updateOptions,
5305
5306 handleChange: function(event) {
5307 var returnValue;
5308 if (this.props.onChange) {
5309 this._isChanging = true;
5310 returnValue = this.props.onChange(event);
5311 this._isChanging = false;
5312 }
5313
5314 var selectedValue;
5315 if (this.props.multiple) {
5316 selectedValue = [];
5317 var options = event.target.options;
5318 for (var i = 0, l = options.length; i < l; i++) {
5319 if (options[i].selected) {
5320 selectedValue.push(options[i].value);
5321 }
5322 }
5323 } else {
5324 selectedValue = event.target.value;
5325 }
5326
5327 this.setState({value: selectedValue});
5328 return returnValue;
5329 }
5330
5331});
5332
5333module.exports = ReactDOMSelect;
5334
5335},{"./ReactCompositeComponent":24,"./ReactDOM":26,"./invariant":78,"./merge":84}],32:[function(require,module,exports){
5336/**
5337 * Copyright 2013 Facebook, Inc.
5338 *
5339 * Licensed under the Apache License, Version 2.0 (the "License");
5340 * you may not use this file except in compliance with the License.
5341 * You may obtain a copy of the License at
5342 *
5343 * http://www.apache.org/licenses/LICENSE-2.0
5344 *
5345 * Unless required by applicable law or agreed to in writing, software
5346 * distributed under the License is distributed on an "AS IS" BASIS,
5347 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5348 * See the License for the specific language governing permissions and
5349 * limitations under the License.
5350 *
5351 * @providesModule ReactDOMTextarea
5352 */
5353
5354"use strict";
5355
5356var DOMPropertyOperations = require("./DOMPropertyOperations");
5357var ReactCompositeComponent = require("./ReactCompositeComponent");
5358var ReactDOM = require("./ReactDOM");
5359
5360var invariant = require("./invariant");
5361var merge = require("./merge");
5362
5363// Store a reference to the <textarea> `ReactNativeComponent`.
5364var textarea = ReactDOM.textarea;
5365
5366// For quickly matching children type, to test if can be treated as content.
5367var CONTENT_TYPES = {'string': true, 'number': true};
5368
5369/**
5370 * Implements a <textarea> native component that allows setting `value`, and
5371 * `defaultValue`. This differs from the traditional DOM API because value is
5372 * usually set as PCDATA children.
5373 *
5374 * If `value` is not supplied (or null/undefined), user actions that affect the
5375 * value will trigger updates to the element.
5376 *
5377 * If `value` is supplied (and not null/undefined), the rendered element will
5378 * not trigger updates to the element. Instead, the `value` prop must change in
5379 * order for the rendered element to be updated.
5380 *
5381 * The rendered element will be initialized with an empty value, the prop
5382 * `defaultValue` if specified, or the children content (deprecated).
5383 */
5384var ReactDOMTextarea = ReactCompositeComponent.createClass({
5385
5386 getInitialState: function() {
5387 var defaultValue = this.props.defaultValue;
5388 // TODO (yungsters): Remove support for children content in <textarea>.
5389 var children = this.props.children;
5390 if (children != null) {
5391 if (true) {
5392 console.warn(
5393 'Use the `defaultValue` or `value` props instead of setting ' +
5394 'children on <textarea>.'
5395 );
5396 }
5397 invariant(
5398 defaultValue == null,
5399 'If you supply `defaultValue` on a <textarea>, do not pass children.'
5400 );
5401 if (Array.isArray(children)) {
5402 invariant(
5403 children.length <= 1,
5404 '<textarea> can only have at most one child.'
5405 );
5406 children = children[0];
5407 }
5408 invariant(
5409 CONTENT_TYPES[typeof children],
5410 'If you specify children to <textarea>, it must be a single string ' +
5411 'or number., not an array or object.'
5412 );
5413 defaultValue = '' + children;
5414 }
5415 defaultValue = defaultValue || '';
5416 return {
5417 // We save the initial value so that `ReactNativeComponent` doesn't update
5418 // `textContent` (unnecessary since we update value).
5419 initialValue: this.props.value != null ? this.props.value : defaultValue,
5420 value: defaultValue
5421 };
5422 },
5423
5424 shouldComponentUpdate: function() {
5425 // Defer any updates to this component during the `onChange` handler.
5426 return !this._isChanging;
5427 },
5428
5429 getValue: function() {
5430 return this.props.value != null ? this.props.value : this.state.value;
5431 },
5432
5433 render: function() {
5434 // Clone `this.props` so we don't mutate the input.
5435 var props = merge(this.props);
5436
5437 invariant(
5438 props.dangerouslySetInnerHTML == null,
5439 '`dangerouslySetInnerHTML` does not make sense on <textarea>.'
5440 );
5441
5442 props.value = this.getValue();
5443 props.onChange = this.handleChange;
5444
5445 // Always set children to the same thing. In IE9, the selection range will
5446 // get reset if `textContent` is mutated.
5447 return textarea(props, this.state.initialValue);
5448 },
5449
5450 componentDidUpdate: function(prevProps, prevState, rootNode) {
5451 if (this.props.value != null) {
5452 DOMPropertyOperations.setValueForProperty(
5453 rootNode,
5454 'value',
5455 this.props.value || ''
5456 );
5457 }
5458 },
5459
5460 handleChange: function(event) {
5461 var returnValue;
5462 if (this.props.onChange) {
5463 this._isChanging = true;
5464 returnValue = this.props.onChange(event);
5465 this._isChanging = false;
5466 }
5467 this.setState({value: event.target.value});
5468 return returnValue;
5469 }
5470
5471});
5472
5473module.exports = ReactDOMTextarea;
5474
5475},{"./DOMPropertyOperations":8,"./ReactCompositeComponent":24,"./ReactDOM":26,"./invariant":78,"./merge":84}],33:[function(require,module,exports){
5476/**
5477 * Copyright 2013 Facebook, Inc.
5478 *
5479 * Licensed under the Apache License, Version 2.0 (the "License");
5480 * you may not use this file except in compliance with the License.
5481 * You may obtain a copy of the License at
5482 *
5483 * http://www.apache.org/licenses/LICENSE-2.0
5484 *
5485 * Unless required by applicable law or agreed to in writing, software
5486 * distributed under the License is distributed on an "AS IS" BASIS,
5487 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5488 * See the License for the specific language governing permissions and
5489 * limitations under the License.
5490 *
5491 * @providesModule ReactDefaultInjection
5492 */
5493
5494"use strict";
5495
5496var ReactDOM = require("./ReactDOM");
5497var ReactDOMForm = require("./ReactDOMForm");
5498var ReactDOMInput = require("./ReactDOMInput");
5499var ReactDOMOption = require("./ReactDOMOption");
5500var ReactDOMSelect = require("./ReactDOMSelect");
5501var ReactDOMTextarea = require("./ReactDOMTextarea");
5502var ReactEventEmitter = require("./ReactEventEmitter");
5503var ReactEventTopLevelCallback = require("./ReactEventTopLevelCallback");
5504
5505var DefaultDOMPropertyConfig = require("./DefaultDOMPropertyConfig");
5506var DOMProperty = require("./DOMProperty");
5507
5508var DefaultEventPluginOrder = require("./DefaultEventPluginOrder");
5509var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin");
5510var ChangeEventPlugin = require("./ChangeEventPlugin");
5511var EventPluginHub = require("./EventPluginHub");
5512var ReactInstanceHandles = require("./ReactInstanceHandles");
5513var SimpleEventPlugin = require("./SimpleEventPlugin");
5514var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin");
5515
5516function inject() {
5517 ReactEventEmitter.TopLevelCallbackCreator = ReactEventTopLevelCallback;
5518 /**
5519 * Inject module for resolving DOM hierarchy and plugin ordering.
5520 */
5521 EventPluginHub.injection.injectEventPluginOrder(DefaultEventPluginOrder);
5522 EventPluginHub.injection.injectInstanceHandle(ReactInstanceHandles);
5523
5524 /**
5525 * Some important event plugins included by default (without having to require
5526 * them).
5527 */
5528 EventPluginHub.injection.injectEventPluginsByName({
5529 'SimpleEventPlugin': SimpleEventPlugin,
5530 'EnterLeaveEventPlugin': EnterLeaveEventPlugin,
5531 'ChangeEventPlugin': ChangeEventPlugin,
5532 'MobileSafariClickEventPlugin': MobileSafariClickEventPlugin
5533 });
5534
5535 ReactDOM.injection.injectComponentClasses({
5536 form: ReactDOMForm,
5537 input: ReactDOMInput,
5538 option: ReactDOMOption,
5539 select: ReactDOMSelect,
5540 textarea: ReactDOMTextarea
5541 });
5542
5543 DOMProperty.injection.injectDOMPropertyConfig(DefaultDOMPropertyConfig);
5544}
5545
5546module.exports = {
5547 inject: inject
5548};
5549
5550},{"./ChangeEventPlugin":5,"./DOMProperty":7,"./DefaultDOMPropertyConfig":10,"./DefaultEventPluginOrder":11,"./EnterLeaveEventPlugin":12,"./EventPluginHub":15,"./MobileSafariClickEventPlugin":20,"./ReactDOM":26,"./ReactDOMForm":27,"./ReactDOMInput":29,"./ReactDOMOption":30,"./ReactDOMSelect":31,"./ReactDOMTextarea":32,"./ReactEventEmitter":34,"./ReactEventTopLevelCallback":35,"./ReactInstanceHandles":37,"./SimpleEventPlugin":50}],34:[function(require,module,exports){
5551(function(){/**
5552 * Copyright 2013 Facebook, Inc.
5553 *
5554 * Licensed under the Apache License, Version 2.0 (the "License");
5555 * you may not use this file except in compliance with the License.
5556 * You may obtain a copy of the License at
5557 *
5558 * http://www.apache.org/licenses/LICENSE-2.0
5559 *
5560 * Unless required by applicable law or agreed to in writing, software
5561 * distributed under the License is distributed on an "AS IS" BASIS,
5562 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5563 * See the License for the specific language governing permissions and
5564 * limitations under the License.
5565 *
5566 * @providesModule ReactEventEmitter
5567 * @typechecks static-only
5568 */
5569
5570"use strict";
5571
5572var EventConstants = require("./EventConstants");
5573var EventListener = require("./EventListener");
5574var EventPluginHub = require("./EventPluginHub");
5575var ExecutionEnvironment = require("./ExecutionEnvironment");
5576var ReactUpdates = require("./ReactUpdates");
5577var ViewportMetrics = require("./ViewportMetrics");
5578
5579var invariant = require("./invariant");
5580var isEventSupported = require("./isEventSupported");
5581
5582/**
5583 * Summary of `ReactEventEmitter` event handling:
5584 *
5585 * - Top-level delegation is used to trap native browser events. We normalize
5586 * and de-duplicate events to account for browser quirks.
5587 *
5588 * - Forward these native events (with the associated top-level type used to
5589 * trap it) to `EventPluginHub`, which in turn will ask plugins if they want
5590 * to extract any synthetic events.
5591 *
5592 * - The `EventPluginHub` will then process each event by annotating them with
5593 * "dispatches", a sequence of listeners and IDs that care about that event.
5594 *
5595 * - The `EventPluginHub` then dispatches the events.
5596 *
5597 * Overview of React and the event system:
5598 *
5599 * .
5600 * +------------+ .
5601 * | DOM | .
5602 * +------------+ . +-----------+
5603 * + . +--------+|SimpleEvent|
5604 * | . | |Plugin |
5605 * +-----|------+ . v +-----------+
5606 * | | | . +--------------+ +------------+
5607 * | +-----------.--->|EventPluginHub| | Event |
5608 * | | . | | +-----------+ | Propagators|
5609 * | ReactEvent | . | | |TapEvent | |------------|
5610 * | Emitter | . | |<---+|Plugin | |other plugin|
5611 * | | . | | +-----------+ | utilities |
5612 * | +-----------.---------+ | +------------+
5613 * | | | . +----|---------+
5614 * +-----|------+ . | ^ +-----------+
5615 * | . | | |Enter/Leave|
5616 * + . | +-------+|Plugin |
5617 * +-------------+ . v +-----------+
5618 * | application | . +----------+
5619 * |-------------| . | callback |
5620 * | | . | registry |
5621 * | | . +----------+
5622 * +-------------+ .
5623 * .
5624 * React Core . General Purpose Event Plugin System
5625 */
5626
5627/**
5628 * Whether or not `ensureListening` has been invoked.
5629 * @type {boolean}
5630 * @private
5631 */
5632var _isListening = false;
5633
5634/**
5635 * Traps top-level events by using event bubbling.
5636 *
5637 * @param {string} topLevelType Record from `EventConstants`.
5638 * @param {string} handlerBaseName Event name (e.g. "click").
5639 * @param {DOMEventTarget} element Element on which to attach listener.
5640 * @internal
5641 */
5642function trapBubbledEvent(topLevelType, handlerBaseName, element) {
5643 EventListener.listen(
5644 element,
5645 handlerBaseName,
5646 ReactEventEmitter.TopLevelCallbackCreator.createTopLevelCallback(
5647 topLevelType
5648 )
5649 );
5650}
5651
5652/**
5653 * Traps a top-level event by using event capturing.
5654 *
5655 * @param {string} topLevelType Record from `EventConstants`.
5656 * @param {string} handlerBaseName Event name (e.g. "click").
5657 * @param {DOMEventTarget} element Element on which to attach listener.
5658 * @internal
5659 */
5660function trapCapturedEvent(topLevelType, handlerBaseName, element) {
5661 EventListener.capture(
5662 element,
5663 handlerBaseName,
5664 ReactEventEmitter.TopLevelCallbackCreator.createTopLevelCallback(
5665 topLevelType
5666 )
5667 );
5668}
5669
5670/**
5671 * Listens to window scroll and resize events. We cache scroll values so that
5672 * application code can access them without triggering reflows.
5673 *
5674 * NOTE: Scroll events do not bubble.
5675 *
5676 * @private
5677 * @see http://www.quirksmode.org/dom/events/scroll.html
5678 */
5679function registerScrollValueMonitoring() {
5680 var refresh = ViewportMetrics.refreshScrollValues;
5681 EventListener.listen(window, 'scroll', refresh);
5682 EventListener.listen(window, 'resize', refresh);
5683}
5684
5685/**
5686 * We listen for bubbled touch events on the document object.
5687 *
5688 * Firefox v8.01 (and possibly others) exhibited strange behavior when mounting
5689 * `onmousemove` events at some node that was not the document element. The
5690 * symptoms were that if your mouse is not moving over something contained
5691 * within that mount point (for example on the background) the top-level
5692 * listeners for `onmousemove` won't be called. However, if you register the
5693 * `mousemove` on the document object, then it will of course catch all
5694 * `mousemove`s. This along with iOS quirks, justifies restricting top-level
5695 * listeners to the document object only, at least for these movement types of
5696 * events and possibly all events.
5697 *
5698 * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
5699 *
5700 * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
5701 * they bubble to document.
5702 *
5703 * @param {boolean} touchNotMouse Listen to touch events instead of mouse.
5704 * @private
5705 * @see http://www.quirksmode.org/dom/events/keys.html.
5706 */
5707function listenAtTopLevel(touchNotMouse) {
5708 invariant(
5709 !_isListening,
5710 'listenAtTopLevel(...): Cannot setup top-level listener more than once.'
5711 );
5712 var topLevelTypes = EventConstants.topLevelTypes;
5713 var mountAt = document;
5714
5715 registerScrollValueMonitoring();
5716 trapBubbledEvent(topLevelTypes.topMouseOver, 'mouseover', mountAt);
5717 trapBubbledEvent(topLevelTypes.topMouseDown, 'mousedown', mountAt);
5718 trapBubbledEvent(topLevelTypes.topMouseUp, 'mouseup', mountAt);
5719 trapBubbledEvent(topLevelTypes.topMouseMove, 'mousemove', mountAt);
5720 trapBubbledEvent(topLevelTypes.topMouseOut, 'mouseout', mountAt);
5721 trapBubbledEvent(topLevelTypes.topClick, 'click', mountAt);
5722 trapBubbledEvent(topLevelTypes.topDoubleClick, 'dblclick', mountAt);
5723 if (touchNotMouse) {
5724 trapBubbledEvent(topLevelTypes.topTouchStart, 'touchstart', mountAt);
5725 trapBubbledEvent(topLevelTypes.topTouchEnd, 'touchend', mountAt);
5726 trapBubbledEvent(topLevelTypes.topTouchMove, 'touchmove', mountAt);
5727 trapBubbledEvent(topLevelTypes.topTouchCancel, 'touchcancel', mountAt);
5728 }
5729 trapBubbledEvent(topLevelTypes.topKeyUp, 'keyup', mountAt);
5730 trapBubbledEvent(topLevelTypes.topKeyPress, 'keypress', mountAt);
5731 trapBubbledEvent(topLevelTypes.topKeyDown, 'keydown', mountAt);
5732 trapBubbledEvent(topLevelTypes.topInput, 'input', mountAt);
5733 trapBubbledEvent(topLevelTypes.topChange, 'change', mountAt);
5734 trapBubbledEvent(
5735 topLevelTypes.topSelectionChange,
5736 'selectionchange',
5737 mountAt
5738 );
5739 trapBubbledEvent(
5740 topLevelTypes.topDOMCharacterDataModified,
5741 'DOMCharacterDataModified',
5742 mountAt
5743 );
5744
5745 if (isEventSupported('drag')) {
5746 trapBubbledEvent(topLevelTypes.topDrag, 'drag', mountAt);
5747 trapBubbledEvent(topLevelTypes.topDragEnd, 'dragend', mountAt);
5748 trapBubbledEvent(topLevelTypes.topDragEnter, 'dragenter', mountAt);
5749 trapBubbledEvent(topLevelTypes.topDragExit, 'dragexit', mountAt);
5750 trapBubbledEvent(topLevelTypes.topDragLeave, 'dragleave', mountAt);
5751 trapBubbledEvent(topLevelTypes.topDragOver, 'dragover', mountAt);
5752 trapBubbledEvent(topLevelTypes.topDragStart, 'dragstart', mountAt);
5753 trapBubbledEvent(topLevelTypes.topDrop, 'drop', mountAt);
5754 }
5755
5756 if (isEventSupported('wheel')) {
5757 trapBubbledEvent(topLevelTypes.topWheel, 'wheel', mountAt);
5758 } else if (isEventSupported('mousewheel')) {
5759 trapBubbledEvent(topLevelTypes.topWheel, 'mousewheel', mountAt);
5760 } else {
5761 // Firefox needs to capture a different mouse scroll event.
5762 // @see http://www.quirksmode.org/dom/events/tests/scroll.html
5763 trapBubbledEvent(topLevelTypes.topWheel, 'DOMMouseScroll', mountAt);
5764 }
5765
5766 // IE<9 does not support capturing so just trap the bubbled event there.
5767 if (isEventSupported('scroll', true)) {
5768 trapCapturedEvent(topLevelTypes.topScroll, 'scroll', mountAt);
5769 } else {
5770 trapBubbledEvent(topLevelTypes.topScroll, 'scroll', window);
5771 }
5772
5773 if (isEventSupported('focus', true)) {
5774 trapCapturedEvent(topLevelTypes.topFocus, 'focus', mountAt);
5775 trapCapturedEvent(topLevelTypes.topBlur, 'blur', mountAt);
5776 } else if (isEventSupported('focusin')) {
5777 // IE has `focusin` and `focusout` events which bubble.
5778 // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html
5779 trapBubbledEvent(topLevelTypes.topFocus, 'focusin', mountAt);
5780 trapBubbledEvent(topLevelTypes.topBlur, 'focusout', mountAt);
5781 }
5782}
5783
5784/**
5785 * `ReactEventEmitter` is used to attach top-level event listeners. For example:
5786 *
5787 * ReactEventEmitter.putListener('myID', 'onClick', myFunction);
5788 *
5789 * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.
5790 *
5791 * @internal
5792 */
5793var ReactEventEmitter = {
5794
5795 /**
5796 * React references `ReactEventTopLevelCallback` using this property in order
5797 * to allow dependency injection.
5798 */
5799 TopLevelCallbackCreator: null,
5800
5801 /**
5802 * Ensures that top-level event delegation listeners are installed.
5803 *
5804 * There are issues with listening to both touch events and mouse events on
5805 * the top-level, so we make the caller choose which one to listen to. (If
5806 * there's a touch top-level listeners, anchors don't receive clicks for some
5807 * reason, and only in some cases).
5808 *
5809 * @param {boolean} touchNotMouse Listen to touch events instead of mouse.
5810 */
5811 ensureListening: function(touchNotMouse) {
5812 invariant(
5813 ExecutionEnvironment.canUseDOM,
5814 'ensureListening(...): Cannot toggle event listening in a Worker ' +
5815 'thread. This is likely a bug in the framework. Please report ' +
5816 'immediately.'
5817 );
5818 invariant(
5819 ReactEventEmitter.TopLevelCallbackCreator,
5820 'ensureListening(...): Cannot be called without a top level callback ' +
5821 'creator being injected.'
5822 );
5823 if (!_isListening) {
5824 listenAtTopLevel(touchNotMouse);
5825 _isListening = true;
5826 }
5827 },
5828
5829 /**
5830 * Sets whether or not any created callbacks should be enabled.
5831 *
5832 * @param {boolean} enabled True if callbacks should be enabled.
5833 */
5834 setEnabled: function(enabled) {
5835 invariant(
5836 ExecutionEnvironment.canUseDOM,
5837 'setEnabled(...): Cannot toggle event listening in a Worker thread. ' +
5838 'This is likely a bug in the framework. Please report immediately.'
5839 );
5840 if (ReactEventEmitter.TopLevelCallbackCreator) {
5841 ReactEventEmitter.TopLevelCallbackCreator.setEnabled(enabled);
5842 }
5843 },
5844
5845 /**
5846 * @return {boolean} True if callbacks are enabled.
5847 */
5848 isEnabled: function() {
5849 return !!(
5850 ReactEventEmitter.TopLevelCallbackCreator &&
5851 ReactEventEmitter.TopLevelCallbackCreator.isEnabled()
5852 );
5853 },
5854
5855 /**
5856 * Streams a fired top-level event to `EventPluginHub` where plugins have the
5857 * opportunity to create `ReactEvent`s to be dispatched.
5858 *
5859 * @param {string} topLevelType Record from `EventConstants`.
5860 * @param {DOMEventTarget} topLevelTarget The listening component root node.
5861 * @param {string} topLevelTargetID ID of `topLevelTarget`.
5862 * @param {object} nativeEvent Native browser event.
5863 */
5864 handleTopLevel: function(
5865 topLevelType,
5866 topLevelTarget,
5867 topLevelTargetID,
5868 nativeEvent) {
5869 var events = EventPluginHub.extractEvents(
5870 topLevelType,
5871 topLevelTarget,
5872 topLevelTargetID,
5873 nativeEvent
5874 );
5875
5876 // Event queue being processed in the same cycle allows `preventDefault`.
5877 ReactUpdates.batchedUpdates(function() {
5878 EventPluginHub.enqueueEvents(events);
5879 EventPluginHub.processEventQueue();
5880 });
5881 },
5882
5883 registrationNames: EventPluginHub.registrationNames,
5884
5885 putListener: EventPluginHub.putListener,
5886
5887 getListener: EventPluginHub.getListener,
5888
5889 deleteListener: EventPluginHub.deleteListener,
5890
5891 deleteAllListeners: EventPluginHub.deleteAllListeners,
5892
5893 trapBubbledEvent: trapBubbledEvent,
5894
5895 trapCapturedEvent: trapCapturedEvent
5896
5897};
5898
5899module.exports = ReactEventEmitter;
5900
5901})()
5902},{"./EventConstants":13,"./EventListener":14,"./EventPluginHub":15,"./ExecutionEnvironment":19,"./ReactUpdates":49,"./ViewportMetrics":60,"./invariant":78,"./isEventSupported":79}],35:[function(require,module,exports){
5903(function(){/**
5904 * Copyright 2013 Facebook, Inc.
5905 *
5906 * Licensed under the Apache License, Version 2.0 (the "License");
5907 * you may not use this file except in compliance with the License.
5908 * You may obtain a copy of the License at
5909 *
5910 * http://www.apache.org/licenses/LICENSE-2.0
5911 *
5912 * Unless required by applicable law or agreed to in writing, software
5913 * distributed under the License is distributed on an "AS IS" BASIS,
5914 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5915 * See the License for the specific language governing permissions and
5916 * limitations under the License.
5917 *
5918 * @providesModule ReactEventTopLevelCallback
5919 * @typechecks static-only
5920 */
5921
5922"use strict";
5923
5924var ExecutionEnvironment = require("./ExecutionEnvironment");
5925var ReactEventEmitter = require("./ReactEventEmitter");
5926var ReactMount = require("./ReactMount");
5927
5928var getEventTarget = require("./getEventTarget");
5929
5930/**
5931 * @type {boolean}
5932 * @private
5933 */
5934var _topLevelListenersEnabled = true;
5935
5936/**
5937 * Top-level callback creator used to implement event handling using delegation.
5938 * This is used via dependency injection.
5939 */
5940var ReactEventTopLevelCallback = {
5941
5942 /**
5943 * Sets whether or not any created callbacks should be enabled.
5944 *
5945 * @param {boolean} enabled True if callbacks should be enabled.
5946 */
5947 setEnabled: function(enabled) {
5948 _topLevelListenersEnabled = !!enabled;
5949 },
5950
5951 /**
5952 * @return {boolean} True if callbacks are enabled.
5953 */
5954 isEnabled: function() {
5955 return _topLevelListenersEnabled;
5956 },
5957
5958 /**
5959 * Creates a callback for the supplied `topLevelType` that could be added as
5960 * a listener to the document. The callback computes a `topLevelTarget` which
5961 * should be the root node of a mounted React component where the listener
5962 * is attached.
5963 *
5964 * @param {string} topLevelType Record from `EventConstants`.
5965 * @return {function} Callback for handling top-level events.
5966 */
5967 createTopLevelCallback: function(topLevelType) {
5968 return function(nativeEvent) {
5969 if (!_topLevelListenersEnabled) {
5970 return;
5971 }
5972 // TODO: Remove when synthetic events are ready, this is for IE<9.
5973 if (nativeEvent.srcElement &&
5974 nativeEvent.srcElement !== nativeEvent.target) {
5975 nativeEvent.target = nativeEvent.srcElement;
5976 }
5977 var topLevelTarget = ReactMount.getFirstReactDOM(
5978 getEventTarget(nativeEvent)
5979 ) || ExecutionEnvironment.global;
5980 var topLevelTargetID = ReactMount.getID(topLevelTarget) || '';
5981 ReactEventEmitter.handleTopLevel(
5982 topLevelType,
5983 topLevelTarget,
5984 topLevelTargetID,
5985 nativeEvent
5986 );
5987 };
5988 }
5989
5990};
5991
5992module.exports = ReactEventTopLevelCallback;
5993
5994})()
5995},{"./ExecutionEnvironment":19,"./ReactEventEmitter":34,"./ReactMount":39,"./getEventTarget":72}],36:[function(require,module,exports){
5996/**
5997 * Copyright 2013 Facebook, Inc.
5998 *
5999 * Licensed under the Apache License, Version 2.0 (the "License");
6000 * you may not use this file except in compliance with the License.
6001 * You may obtain a copy of the License at
6002 *
6003 * http://www.apache.org/licenses/LICENSE-2.0
6004 *
6005 * Unless required by applicable law or agreed to in writing, software
6006 * distributed under the License is distributed on an "AS IS" BASIS,
6007 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6008 * See the License for the specific language governing permissions and
6009 * limitations under the License.
6010 *
6011 * @providesModule ReactInputSelection
6012 */
6013
6014"use strict";
6015
6016// It is not safe to read the document.activeElement property in IE if there's
6017// nothing focused.
6018function getActiveElement() {
6019 try {
6020 return document.activeElement;
6021 } catch (e) {
6022 }
6023}
6024
6025function isInDocument(node) {
6026 return document.documentElement.contains(node);
6027}
6028
6029/**
6030 * @ReactInputSelection: React input selection module. Based on Selection.js,
6031 * but modified to be suitable for react and has a couple of bug fixes (doesn't
6032 * assume buttons have range selections allowed).
6033 * Input selection module for React.
6034 */
6035var ReactInputSelection = {
6036
6037 hasSelectionCapabilities: function(elem) {
6038 return elem && (
6039 (elem.nodeName === 'INPUT' && elem.type === 'text') ||
6040 elem.nodeName === 'TEXTAREA' ||
6041 elem.contentEditable === 'true'
6042 );
6043 },
6044
6045 getSelectionInformation: function() {
6046 var focusedElem = getActiveElement();
6047 return {
6048 focusedElem: focusedElem,
6049 selectionRange:
6050 ReactInputSelection.hasSelectionCapabilities(focusedElem) ?
6051 ReactInputSelection.getSelection(focusedElem) :
6052 null
6053 };
6054 },
6055
6056 /**
6057 * @restoreSelection: If any selection information was potentially lost,
6058 * restore it. This is useful when performing operations that could remove dom
6059 * nodes and place them back in, resulting in focus being lost.
6060 */
6061 restoreSelection: function(priorSelectionInformation) {
6062 var curFocusedElem = getActiveElement();
6063 var priorFocusedElem = priorSelectionInformation.focusedElem;
6064 var priorSelectionRange = priorSelectionInformation.selectionRange;
6065 if (curFocusedElem !== priorFocusedElem &&
6066 isInDocument(priorFocusedElem)) {
6067 if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) {
6068 ReactInputSelection.setSelection(
6069 priorFocusedElem,
6070 priorSelectionRange
6071 );
6072 }
6073 priorFocusedElem.focus();
6074 }
6075 },
6076
6077 /**
6078 * @getSelection: Gets the selection bounds of a textarea or input.
6079 * -@input: Look up selection bounds of this input or textarea
6080 * -@return {start: selectionStart, end: selectionEnd}
6081 */
6082 getSelection: function(input) {
6083 var range;
6084 if (input.contentEditable === 'true' && window.getSelection) {
6085 range = window.getSelection().getRangeAt(0);
6086 var commonAncestor = range.commonAncestorContainer;
6087 if (commonAncestor && commonAncestor.nodeType === 3) {
6088 commonAncestor = commonAncestor.parentNode;
6089 }
6090 if (commonAncestor !== input) {
6091 return {start: 0, end: 0};
6092 } else {
6093 return {start: range.startOffset, end: range.endOffset};
6094 }
6095 }
6096
6097 if (!document.selection) {
6098 // Mozilla, Safari, etc.
6099 return {start: input.selectionStart, end: input.selectionEnd};
6100 }
6101
6102 range = document.selection.createRange();
6103 if (range.parentElement() !== input) {
6104 // There can only be one selection per document in IE, so if the
6105 // containing element of the document's selection isn't our text field,
6106 // our text field must have no selection.
6107 return {start: 0, end: 0};
6108 }
6109
6110 var length = input.value.length;
6111
6112 if (input.nodeName === 'INPUT') {
6113 return {
6114 start: -range.moveStart('character', -length),
6115 end: -range.moveEnd('character', -length)
6116 };
6117 } else {
6118 var range2 = range.duplicate();
6119 range2.moveToElementText(input);
6120 range2.setEndPoint('StartToEnd', range);
6121 var end = length - range2.text.length;
6122 range2.setEndPoint('StartToStart', range);
6123 return {
6124 start: length - range2.text.length,
6125 end: end
6126 };
6127 }
6128 },
6129
6130 /**
6131 * @setSelection: Sets the selection bounds of a textarea or input and focuses
6132 * the input.
6133 * -@input Set selection bounds of this input or textarea
6134 * -@rangeObj Object of same form that is returned from get*
6135 */
6136 setSelection: function(input, rangeObj) {
6137 var range;
6138 var start = rangeObj.start;
6139 var end = rangeObj.end;
6140 if (typeof end === 'undefined') {
6141 end = start;
6142 }
6143 if (document.selection) {
6144 // IE is inconsistent about character offsets when it comes to carriage
6145 // returns, so we need to manually take them into account
6146 if (input.tagName === 'TEXTAREA') {
6147 var cr_before =
6148 (input.value.slice(0, start).match(/\r/g) || []).length;
6149 var cr_inside =
6150 (input.value.slice(start, end).match(/\r/g) || []).length;
6151 start -= cr_before;
6152 end -= cr_before + cr_inside;
6153 }
6154 range = input.createTextRange();
6155 range.collapse(true);
6156 range.moveStart('character', start);
6157 range.moveEnd('character', end - start);
6158 range.select();
6159 } else {
6160 if (input.contentEditable === 'true') {
6161 if (input.childNodes.length === 1) {
6162 range = document.createRange();
6163 range.setStart(input.childNodes[0], start);
6164 range.setEnd(input.childNodes[0], end);
6165 var sel = window.getSelection();
6166 sel.removeAllRanges();
6167 sel.addRange(range);
6168 }
6169 } else {
6170 input.selectionStart = start;
6171 input.selectionEnd = Math.min(end, input.value.length);
6172 input.focus();
6173 }
6174 }
6175 }
6176
6177};
6178
6179module.exports = ReactInputSelection;
6180
6181},{}],37:[function(require,module,exports){
6182/**
6183 * Copyright 2013 Facebook, Inc.
6184 *
6185 * Licensed under the Apache License, Version 2.0 (the "License");
6186 * you may not use this file except in compliance with the License.
6187 * You may obtain a copy of the License at
6188 *
6189 * http://www.apache.org/licenses/LICENSE-2.0
6190 *
6191 * Unless required by applicable law or agreed to in writing, software
6192 * distributed under the License is distributed on an "AS IS" BASIS,
6193 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6194 * See the License for the specific language governing permissions and
6195 * limitations under the License.
6196 *
6197 * @providesModule ReactInstanceHandles
6198 * @typechecks static-only
6199 */
6200
6201"use strict";
6202
6203var invariant = require("./invariant");
6204
6205var SEPARATOR = '.';
6206var SEPARATOR_LENGTH = SEPARATOR.length;
6207
6208/**
6209 * Maximum depth of traversals before we consider the possibility of a bad ID.
6210 */
6211var MAX_TREE_DEPTH = 100;
6212
6213/**
6214 * Size of the reactRoot ID space. We generate random numbers for React root
6215 * IDs and if there's a collision the events and DOM update system will
6216 * get confused. If we assume 100 React components per page, and a user
6217 * loads 1 page per minute 24/7 for 50 years, with a mount point space of
6218 * 9,999,999 the likelihood of never having a collision is 99.997%.
6219 */
6220var GLOBAL_MOUNT_POINT_MAX = 9999999;
6221
6222/**
6223 * Creates a DOM ID prefix to use when mounting React components.
6224 *
6225 * @param {number} index A unique integer
6226 * @return {string} React root ID.
6227 * @internal
6228 */
6229function getReactRootIDString(index) {
6230 return SEPARATOR + 'r[' + index.toString(36) + ']';
6231}
6232
6233/**
6234 * Checks if a character in the supplied ID is a separator or the end.
6235 *
6236 * @param {string} id A React DOM ID.
6237 * @param {number} index Index of the character to check.
6238 * @return {boolean} True if the character is a separator or end of the ID.
6239 * @private
6240 */
6241function isBoundary(id, index) {
6242 return id.charAt(index) === SEPARATOR || index === id.length;
6243}
6244
6245/**
6246 * Checks if the supplied string is a valid React DOM ID.
6247 *
6248 * @param {string} id A React DOM ID, maybe.
6249 * @return {boolean} True if the string is a valid React DOM ID.
6250 * @private
6251 */
6252function isValidID(id) {
6253 return id === '' || (
6254 id.charAt(0) === SEPARATOR && id.charAt(id.length - 1) !== SEPARATOR
6255 );
6256}
6257
6258/**
6259 * Checks if the first ID is an ancestor of or equal to the second ID.
6260 *
6261 * @param {string} ancestorID
6262 * @param {string} descendantID
6263 * @return {boolean} True if `ancestorID` is an ancestor of `descendantID`.
6264 * @internal
6265 */
6266function isAncestorIDOf(ancestorID, descendantID) {
6267 return (
6268 descendantID.indexOf(ancestorID) === 0 &&
6269 isBoundary(descendantID, ancestorID.length)
6270 );
6271}
6272
6273/**
6274 * Gets the parent ID of the supplied React DOM ID, `id`.
6275 *
6276 * @param {string} id ID of a component.
6277 * @return {string} ID of the parent, or an empty string.
6278 * @private
6279 */
6280function getParentID(id) {
6281 return id ? id.substr(0, id.lastIndexOf(SEPARATOR)) : '';
6282}
6283
6284/**
6285 * Gets the next DOM ID on the tree path from the supplied `ancestorID` to the
6286 * supplied `destinationID`. If they are equal, the ID is returned.
6287 *
6288 * @param {string} ancestorID ID of an ancestor node of `destinationID`.
6289 * @param {string} destinationID ID of the destination node.
6290 * @return {string} Next ID on the path from `ancestorID` to `destinationID`.
6291 * @private
6292 */
6293function getNextDescendantID(ancestorID, destinationID) {
6294 invariant(
6295 isValidID(ancestorID) && isValidID(destinationID),
6296 'getNextDescendantID(%s, %s): Received an invalid React DOM ID.',
6297 ancestorID,
6298 destinationID
6299 );
6300 invariant(
6301 isAncestorIDOf(ancestorID, destinationID),
6302 'getNextDescendantID(...): React has made an invalid assumption about ' +
6303 'the DOM hierarchy. Expected `%s` to be an ancestor of `%s`.',
6304 ancestorID,
6305 destinationID
6306 );
6307 if (ancestorID === destinationID) {
6308 return ancestorID;
6309 }
6310 // Skip over the ancestor and the immediate separator. Traverse until we hit
6311 // another separator or we reach the end of `destinationID`.
6312 var start = ancestorID.length + SEPARATOR_LENGTH;
6313 for (var i = start; i < destinationID.length; i++) {
6314 if (isBoundary(destinationID, i)) {
6315 break;
6316 }
6317 }
6318 return destinationID.substr(0, i);
6319}
6320
6321/**
6322 * Gets the nearest common ancestor ID of two IDs.
6323 *
6324 * Using this ID scheme, the nearest common ancestor ID is the longest common
6325 * prefix of the two IDs that immediately preceded a "marker" in both strings.
6326 *
6327 * @param {string} oneID
6328 * @param {string} twoID
6329 * @return {string} Nearest common ancestor ID, or the empty string if none.
6330 * @private
6331 */
6332function getFirstCommonAncestorID(oneID, twoID) {
6333 var minLength = Math.min(oneID.length, twoID.length);
6334 if (minLength === 0) {
6335 return '';
6336 }
6337 var lastCommonMarkerIndex = 0;
6338 // Use `<=` to traverse until the "EOL" of the shorter string.
6339 for (var i = 0; i <= minLength; i++) {
6340 if (isBoundary(oneID, i) && isBoundary(twoID, i)) {
6341 lastCommonMarkerIndex = i;
6342 } else if (oneID.charAt(i) !== twoID.charAt(i)) {
6343 break;
6344 }
6345 }
6346 var longestCommonID = oneID.substr(0, lastCommonMarkerIndex);
6347 invariant(
6348 isValidID(longestCommonID),
6349 'getFirstCommonAncestorID(%s, %s): Expected a valid React DOM ID: %s',
6350 oneID,
6351 twoID,
6352 longestCommonID
6353 );
6354 return longestCommonID;
6355}
6356
6357/**
6358 * Traverses the parent path between two IDs (either up or down). The IDs must
6359 * not be the same, and there must exist a parent path between them.
6360 *
6361 * @param {?string} start ID at which to start traversal.
6362 * @param {?string} stop ID at which to end traversal.
6363 * @param {function} cb Callback to invoke each ID with.
6364 * @param {?boolean} skipFirst Whether or not to skip the first node.
6365 * @param {?boolean} skipLast Whether or not to skip the last node.
6366 * @private
6367 */
6368function traverseParentPath(start, stop, cb, arg, skipFirst, skipLast) {
6369 start = start || '';
6370 stop = stop || '';
6371 invariant(
6372 start !== stop,
6373 'traverseParentPath(...): Cannot traverse from and to the same ID, `%s`.',
6374 start
6375 );
6376 var traverseUp = isAncestorIDOf(stop, start);
6377 invariant(
6378 traverseUp || isAncestorIDOf(start, stop),
6379 'traverseParentPath(%s, %s, ...): Cannot traverse from two IDs that do ' +
6380 'not have a parent path.',
6381 start,
6382 stop
6383 );
6384 // Traverse from `start` to `stop` one depth at a time.
6385 var depth = 0;
6386 var traverse = traverseUp ? getParentID : getNextDescendantID;
6387 for (var id = start; /* until break */; id = traverse(id, stop)) {
6388 if ((!skipFirst || id !== start) && (!skipLast || id !== stop)) {
6389 cb(id, traverseUp, arg);
6390 }
6391 if (id === stop) {
6392 // Only break //after// visiting `stop`.
6393 break;
6394 }
6395 invariant(
6396 depth++ < MAX_TREE_DEPTH,
6397 'traverseParentPath(%s, %s, ...): Detected an infinite loop while ' +
6398 'traversing the React DOM ID tree. This may be due to malformed IDs: %s',
6399 start, stop
6400 );
6401 }
6402}
6403
6404/**
6405 * Manages the IDs assigned to DOM representations of React components. This
6406 * uses a specific scheme in order to traverse the DOM efficiently (e.g. in
6407 * order to simulate events).
6408 *
6409 * @internal
6410 */
6411var ReactInstanceHandles = {
6412
6413 separator: SEPARATOR,
6414
6415 createReactRootID: function() {
6416 return getReactRootIDString(
6417 Math.ceil(Math.random() * GLOBAL_MOUNT_POINT_MAX)
6418 );
6419 },
6420
6421 /**
6422 * Gets the DOM ID of the React component that is the root of the tree that
6423 * contains the React component with the supplied DOM ID.
6424 *
6425 * @param {string} id DOM ID of a React component.
6426 * @return {?string} DOM ID of the React component that is the root.
6427 * @internal
6428 */
6429 getReactRootIDFromNodeID: function(id) {
6430 var regexResult = /\.r\[[^\]]+\]/.exec(id);
6431 return regexResult && regexResult[0];
6432 },
6433
6434 /**
6435 * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
6436 * should would receive a `mouseEnter` or `mouseLeave` event.
6437 *
6438 * NOTE: Does not invoke the callback on the nearest common ancestor because
6439 * nothing "entered" or "left" that element.
6440 *
6441 * @param {string} leaveID ID being left.
6442 * @param {string} enterID ID being entered.
6443 * @param {function} cb Callback to invoke on each entered/left ID.
6444 * @param {*} upArg Argument to invoke the callback with on left IDs.
6445 * @param {*} downArg Argument to invoke the callback with on entered IDs.
6446 * @internal
6447 */
6448 traverseEnterLeave: function(leaveID, enterID, cb, upArg, downArg) {
6449 var ancestorID = getFirstCommonAncestorID(leaveID, enterID);
6450 if (ancestorID !== leaveID) {
6451 traverseParentPath(leaveID, ancestorID, cb, upArg, false, true);
6452 }
6453 if (ancestorID !== enterID) {
6454 traverseParentPath(ancestorID, enterID, cb, downArg, true, false);
6455 }
6456 },
6457
6458 /**
6459 * Simulates the traversal of a two-phase, capture/bubble event dispatch.
6460 *
6461 * NOTE: This traversal happens on IDs without touching the DOM.
6462 *
6463 * @param {string} targetID ID of the target node.
6464 * @param {function} cb Callback to invoke.
6465 * @param {*} arg Argument to invoke the callback with.
6466 * @internal
6467 */
6468 traverseTwoPhase: function(targetID, cb, arg) {
6469 if (targetID) {
6470 traverseParentPath('', targetID, cb, arg, true, false);
6471 traverseParentPath(targetID, '', cb, arg, false, true);
6472 }
6473 },
6474
6475 /**
6476 * Exposed for unit testing.
6477 * @private
6478 */
6479 _getFirstCommonAncestorID: getFirstCommonAncestorID,
6480
6481 /**
6482 * Exposed for unit testing.
6483 * @private
6484 */
6485 _getNextDescendantID: getNextDescendantID,
6486
6487 isAncestorIDOf: isAncestorIDOf,
6488
6489 SEPARATOR: SEPARATOR
6490
6491};
6492
6493module.exports = ReactInstanceHandles;
6494
6495},{"./invariant":78}],38:[function(require,module,exports){
6496/**
6497 * Copyright 2013 Facebook, Inc.
6498 *
6499 * Licensed under the Apache License, Version 2.0 (the "License");
6500 * you may not use this file except in compliance with the License.
6501 * You may obtain a copy of the License at
6502 *
6503 * http://www.apache.org/licenses/LICENSE-2.0
6504 *
6505 * Unless required by applicable law or agreed to in writing, software
6506 * distributed under the License is distributed on an "AS IS" BASIS,
6507 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6508 * See the License for the specific language governing permissions and
6509 * limitations under the License.
6510 *
6511 * @providesModule ReactMarkupChecksum
6512 */
6513
6514"use strict";
6515
6516var adler32 = require("./adler32");
6517
6518var ReactMarkupChecksum = {
6519 CHECKSUM_ATTR_NAME: 'data-react-checksum',
6520
6521 /**
6522 * @param {string} markup Markup string
6523 * @return {string} Markup string with checksum attribute attached
6524 */
6525 addChecksumToMarkup: function(markup) {
6526 var checksum = adler32(markup);
6527 return markup.replace(
6528 '>',
6529 ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '">'
6530 );
6531 },
6532
6533 /**
6534 * @param {string} markup to use
6535 * @param {DOMElement} element root React element
6536 * @returns {boolean} whether or not the markup is the same
6537 */
6538 canReuseMarkup: function(markup, element) {
6539 var existingChecksum = element.getAttribute(
6540 ReactMarkupChecksum.CHECKSUM_ATTR_NAME
6541 );
6542 existingChecksum = existingChecksum && parseInt(existingChecksum, 10);
6543 var markupChecksum = adler32(markup);
6544 return markupChecksum === existingChecksum;
6545 }
6546};
6547
6548module.exports = ReactMarkupChecksum;
6549
6550},{"./adler32":62}],39:[function(require,module,exports){
6551(function(){/**
6552 * Copyright 2013 Facebook, Inc.
6553 *
6554 * Licensed under the Apache License, Version 2.0 (the "License");
6555 * you may not use this file except in compliance with the License.
6556 * You may obtain a copy of the License at
6557 *
6558 * http://www.apache.org/licenses/LICENSE-2.0
6559 *
6560 * Unless required by applicable law or agreed to in writing, software
6561 * distributed under the License is distributed on an "AS IS" BASIS,
6562 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
6563 * See the License for the specific language governing permissions and
6564 * limitations under the License.
6565 *
6566 * @providesModule ReactMount
6567 */
6568
6569"use strict";
6570
6571var invariant = require("./invariant");
6572var getReactRootElementInContainer = require("./getReactRootElementInContainer");
6573var ReactEventEmitter = require("./ReactEventEmitter");
6574var ReactInstanceHandles = require("./ReactInstanceHandles");
6575
6576var SEPARATOR = ReactInstanceHandles.SEPARATOR;
6577
6578var ATTR_NAME = 'data-reactid';
6579var nodeCache = {};
6580
6581var $ = require("./$");
6582
6583/** Mapping from reactRootID to React component instance. */
6584var instanceByReactRootID = {};
6585
6586/** Mapping from reactRootID to `container` nodes. */
6587var containersByReactRootID = {};
6588
6589if (true) {
6590 /** __DEV__-only mapping from reactRootID to root elements. */
6591 var rootElementsByReactRootID = {};
6592}
6593
6594/**
6595 * @param {DOMElement} container DOM element that may contain a React component.
6596 * @return {?string} A "reactRoot" ID, if a React component is rendered.
6597 */
6598function getReactRootID(container) {
6599 var rootElement = getReactRootElementInContainer(container);
6600 return rootElement && ReactMount.getID(rootElement);
6601}
6602
6603/**
6604 * Accessing node[ATTR_NAME] or calling getAttribute(ATTR_NAME) on a form
6605 * element can return its control whose name or ID equals ATTR_NAME. All
6606 * DOM nodes support `getAttributeNode` but this can also get called on
6607 * other objects so just return '' if we're given something other than a
6608 * DOM node (such as window).
6609 *
6610 * @param {?DOMElement|DOMWindow|DOMDocument|DOMTextNode} node DOM node.
6611 * @return {string} ID of the supplied `domNode`.
6612 */
6613function getID(node) {
6614 var id = internalGetID(node);
6615 if (id) {
6616 if (nodeCache.hasOwnProperty(id)) {
6617 var cached = nodeCache[id];
6618 if (cached !== node) {
6619 invariant(
6620 !isValid(cached, id),
6621 'ReactMount: Two valid but unequal nodes with the same `%s`: %s',
6622 ATTR_NAME, id
6623 );
6624
6625 nodeCache[id] = node;
6626 }
6627 } else {
6628 nodeCache[id] = node;
6629 }
6630 }
6631
6632 return id;
6633}
6634
6635function internalGetID(node) {
6636 // If node is something like a window, document, or text node, none of
6637 // which support attributes or a .getAttribute method, gracefully return
6638 // the empty string, as if the attribute were missing.
6639 return node && node.getAttribute && node.getAttribute(ATTR_NAME) || '';
6640}
6641
6642/**
6643 * Sets the React-specific ID of the given node.
6644 *
6645 * @param {DOMElement} node The DOM node whose ID will be set.
6646 * @param {string} id The value of the ID attribute.
6647 */
6648function setID(node, id) {
6649 var oldID = internalGetID(node);
6650 if (oldID !== id) {
6651 delete nodeCache[oldID];
6652 }
6653 node.setAttribute(ATTR_NAME, id);
6654 nodeCache[id] = node;
6655}
6656
6657/**
6658 * Finds the node with the supplied React-generated DOM ID.
6659 *
6660 * @param {string} id A React-generated DOM ID.
6661 * @return {DOMElement} DOM node with the suppled `id`.
6662 * @internal
6663 */
6664function getNode(id) {
6665 if (!nodeCache.hasOwnProperty(id) || !isValid(nodeCache[id], id)) {
6666 nodeCache[id] = ReactMount.findReactNodeByID(id);
6667 }
6668 return nodeCache[id];
6669}
6670
6671/**
6672 * A node is "valid" if it is contained by a currently mounted container.
6673 *
6674 * This means that the node does not have to be contained by a document in
6675 * order to be considered valid.
6676 *
6677 * @param {?DOMElement} node The candidate DOM node.
6678 * @param {string} id The expected ID of the node.
6679 * @return {boolean} Whether the node is contained by a mounted container.
6680 */
6681function isValid(node, id) {
6682 if (node) {
6683 invariant(
6684 internalGetID(node) === id,
6685 'ReactMount: Unexpected modification of `%s`',
6686 ATTR_NAME
6687 );
6688
6689 var container = ReactMount.findReactContainerForID(id);
6690 if (container && contains(container, node)) {
6691 return true;
6692 }
6693 }
6694
6695 return false;
6696}
6697
6698function contains(ancestor, descendant) {
6699 if (ancestor.contains) {
6700 // Supported natively in virtually all browsers, but not in jsdom.
6701 return ancestor.contains(descendant);
6702 }
6703
6704 if (descendant === ancestor) {
6705 return true;
6706 }
6707
6708 if (descendant.nodeType === 3) {
6709 // If descendant is a text node, start from descendant.parentNode
6710 // instead, so that we can assume all ancestors worth considering are
6711 // element nodes with nodeType === 1.
6712 descendant = descendant.parentNode;
6713 }
6714
6715 while (descendant && descendant.nodeType === 1) {
6716 if (descendant === ancestor) {
6717 return true;
6718 }
6719 descendant = descendant.parentNode;
6720 }
6721
6722 return false;
6723}
6724
6725/**
6726 * Causes the cache to forget about one React-specific ID.
6727 *
6728 * @param {string} id The ID to forget.
6729 */
6730function purgeID(id) {
6731 delete nodeCache[id];
6732}
6733
6734/**
6735 * Mounting is the process of initializing a React component by creatings its
6736 * representative DOM elements and inserting them into a supplied `container`.
6737 * Any prior content inside `container` is destroyed in the process.
6738 *
6739 * ReactMount.renderComponent(component, $('container'));
6740 *
6741 * <div id="container"> <-- Supplied `container`.
6742 * <div data-reactid=".r[3]"> <-- Rendered reactRoot of React
6743 * // ... component.
6744 * </div>
6745 * </div>
6746 *
6747 * Inside of `container`, the first element rendered is the "reactRoot".
6748 */
6749var ReactMount = {
6750
6751 /** Time spent generating markup. */
6752 totalInstantiationTime: 0,
6753
6754 /** Time spent inserting markup into the DOM. */
6755 totalInjectionTime: 0,
6756
6757 /** Whether support for touch events should be initialized. */
6758 useTouchEvents: false,
6759
6760 /**
6761 * This is a hook provided to support rendering React components while
6762 * ensuring that the apparent scroll position of its `container` does not
6763 * change.
6764 *
6765 * @param {DOMElement} container The `container` being rendered into.
6766 * @param {function} renderCallback This must be called once to do the render.
6767 */
6768 scrollMonitor: function(container, renderCallback) {
6769 renderCallback();
6770 },
6771
6772 /**
6773 * Ensures that the top-level event delegation listener is set up. This will
6774 * be invoked some time before the first time any React component is rendered.
6775 *
6776 * @private
6777 */
6778 prepareTopLevelEvents: function() {
6779 ReactEventEmitter.ensureListening(ReactMount.useTouchEvents);
6780 },
6781
6782 /**
6783 * Take a component that's already mounted into the DOM and replace its props
6784 * @param {ReactComponent} prevComponent component instance already in the DOM
6785 * @param {ReactComponent} nextComponent component instance to render
6786 * @param {DOMElement} container container to render into
6787 * @param {?function} callback function triggered on completion
6788 */
6789 _updateRootComponent: function(
6790 prevComponent,
6791 nextComponent,
6792 container,
6793 callback) {
6794 var nextProps = nextComponent.props;
6795 ReactMount.scrollMonitor(container, function() {
6796 prevComponent.replaceProps(nextProps, callback);
6797 });
6798
6799 if (true) {
6800 // Record the root element in case it later gets transplanted.
6801 rootElementsByReactRootID[getReactRootID(container)] =
6802 getReactRootElementInContainer(container);
6803 }
6804
6805 return prevComponent;
6806 },
6807
6808 /**
6809 * Register a component into the instance map and start the events system.
6810 * @param {ReactComponent} nextComponent component instance to render
6811 * @param {DOMElement} container container to render into
6812 * @return {string} reactRoot ID prefix
6813 */
6814 _registerComponent: function(nextComponent, container) {
6815 ReactMount.prepareTopLevelEvents();
6816
6817 var reactRootID = ReactMount.registerContainer(container);
6818 instanceByReactRootID[reactRootID] = nextComponent;
6819 return reactRootID;
6820 },
6821
6822 /**
6823 * Render a new component into the DOM.
6824 * @param {ReactComponent} nextComponent component instance to render
6825 * @param {DOMElement} container container to render into
6826 * @param {boolean} shouldReuseMarkup if we should skip the markup insertion
6827 * @return {ReactComponent} nextComponent
6828 */
6829 _renderNewRootComponent: function(
6830 nextComponent,
6831 container,
6832 shouldReuseMarkup) {
6833 var reactRootID = ReactMount._registerComponent(nextComponent, container);
6834 nextComponent.mountComponentIntoNode(
6835 reactRootID,
6836 container,
6837 shouldReuseMarkup
6838 );
6839
6840 if (true) {
6841 // Record the root element in case it later gets transplanted.
6842 rootElementsByReactRootID[reactRootID] =
6843 getReactRootElementInContainer(container);
6844 }
6845
6846 return nextComponent;
6847 },
6848
6849 /**
6850 * Renders a React component into the DOM in the supplied `container`.
6851 *
6852 * If the React component was previously rendered into `container`, this will
6853 * perform an update on it and only mutate the DOM as necessary to reflect the
6854 * latest React component.
6855 *
6856 * @param {ReactComponent} nextComponent Component instance to render.
6857 * @param {DOMElement} container DOM element to render into.
6858 * @param {?function} callback function triggered on completion
6859 * @return {ReactComponent} Component instance rendered in `container`.
6860 */
6861 renderComponent: function(nextComponent, container, callback) {
6862 var registeredComponent = instanceByReactRootID[getReactRootID(container)];
6863
6864 if (registeredComponent) {
6865 if (registeredComponent.constructor === nextComponent.constructor) {
6866 return ReactMount._updateRootComponent(
6867 registeredComponent,
6868 nextComponent,
6869 container,
6870 callback
6871 );
6872 } else {
6873 ReactMount.unmountAndReleaseReactRootNode(container);
6874 }
6875 }
6876
6877 var reactRootElement = getReactRootElementInContainer(container);
6878 var containerHasReactMarkup =
6879 reactRootElement && ReactMount.isRenderedByReact(reactRootElement);
6880
6881 var shouldReuseMarkup = containerHasReactMarkup && !registeredComponent;
6882
6883 var component = ReactMount._renderNewRootComponent(
6884 nextComponent,
6885 container,
6886 shouldReuseMarkup
6887 );
6888 callback && callback();
6889 return component;
6890 },
6891
6892 /**
6893 * Constructs a component instance of `constructor` with `initialProps` and
6894 * renders it into the supplied `container`.
6895 *
6896 * @param {function} constructor React component constructor.
6897 * @param {?object} props Initial props of the component instance.
6898 * @param {DOMElement} container DOM element to render into.
6899 * @return {ReactComponent} Component instance rendered in `container`.
6900 */
6901 constructAndRenderComponent: function(constructor, props, container) {
6902 return ReactMount.renderComponent(constructor(props), container);
6903 },
6904
6905 /**
6906 * Constructs a component instance of `constructor` with `initialProps` and
6907 * renders it into a container node identified by supplied `id`.
6908 *
6909 * @param {function} componentConstructor React component constructor
6910 * @param {?object} props Initial props of the component instance.
6911 * @param {string} id ID of the DOM element to render into.
6912 * @return {ReactComponent} Component instance rendered in the container node.
6913 */
6914 constructAndRenderComponentByID: function(constructor, props, id) {
6915 return ReactMount.constructAndRenderComponent(constructor, props, $(id));
6916 },
6917
6918 /**
6919 * Registers a container node into which React components will be rendered.
6920 * This also creates the "reatRoot" ID that will be assigned to the element
6921 * rendered within.
6922 *
6923 * @param {DOMElement} container DOM element to register as a container.
6924 * @return {string} The "reactRoot" ID of elements rendered within.
6925 */
6926 registerContainer: function(container) {
6927 var reactRootID = getReactRootID(container);
6928 if (reactRootID) {
6929 // If one exists, make sure it is a valid "reactRoot" ID.
6930 reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(reactRootID);
6931 }
6932 if (!reactRootID) {
6933 // No valid "reactRoot" ID found, create one.
6934 reactRootID = ReactInstanceHandles.createReactRootID();
6935 }
6936 containersByReactRootID[reactRootID] = container;
6937 return reactRootID;
6938 },
6939
6940 /**
6941 * Unmounts and destroys the React component rendered in the `container`.
6942 *
6943 * @param {DOMElement} container DOM element containing a React component.
6944 * @return {boolean} True if a component was found in and unmounted from
6945 * `container`
6946 */
6947 unmountAndReleaseReactRootNode: function(container) {
6948 var reactRootID = getReactRootID(container);
6949 var component = instanceByReactRootID[reactRootID];
6950 if (!component) {
6951 return false;
6952 }
6953 component.unmountComponentFromNode(container);
6954 delete instanceByReactRootID[reactRootID];
6955 delete containersByReactRootID[reactRootID];
6956 if (true) {
6957 delete rootElementsByReactRootID[reactRootID];
6958 }
6959 return true;
6960 },
6961
6962 /**
6963 * Finds the container DOM element that contains React component to which the
6964 * supplied DOM `id` belongs.
6965 *
6966 * @param {string} id The ID of an element rendered by a React component.
6967 * @return {?DOMElement} DOM element that contains the `id`.
6968 */
6969 findReactContainerForID: function(id) {
6970 var reactRootID = ReactInstanceHandles.getReactRootIDFromNodeID(id);
6971 var container = containersByReactRootID[reactRootID];
6972
6973 if (true) {
6974 var rootElement = rootElementsByReactRootID[reactRootID];
6975 if (rootElement && rootElement.parentNode !== container) {
6976 invariant(
6977 // Call internalGetID here because getID calls isValid which calls
6978 // findReactContainerForID (this function).
6979 internalGetID(rootElement) === reactRootID,
6980 'ReactMount: Root element ID differed from reactRootID.'
6981 );
6982
6983 var containerChild = container.firstChild;
6984 if (containerChild &&
6985 reactRootID === internalGetID(containerChild)) {
6986 // If the container has a new child with the same ID as the old
6987 // root element, then rootElementsByReactRootID[reactRootID] is
6988 // just stale and needs to be updated. The case that deserves a
6989 // warning is when the container is empty.
6990 rootElementsByReactRootID[reactRootID] = containerChild;
6991 } else {
6992 console.warn(
6993 'ReactMount: Root element has been removed from its original ' +
6994 'container. New container:', rootElement.parentNode
6995 );
6996 }
6997 }
6998 }
6999
7000 return container;
7001 },
7002
7003 /**
7004 * Finds an element rendered by React with the supplied ID.
7005 *
7006 * @param {string} id ID of a DOM node in the React component.
7007 * @return {DOMElement} Root DOM node of the React component.
7008 */
7009 findReactNodeByID: function(id) {
7010 var reactRoot = ReactMount.findReactContainerForID(id);
7011 return ReactMount.findComponentRoot(reactRoot, id);
7012 },
7013
7014 /**
7015 * True if the supplied `node` is rendered by React.
7016 *
7017 * @param {*} node DOM Element to check.
7018 * @return {boolean} True if the DOM Element appears to be rendered by React.
7019 * @internal
7020 */
7021 isRenderedByReact: function(node) {
7022 if (node.nodeType !== 1) {
7023 // Not a DOMElement, therefore not a React component
7024 return false;
7025 }
7026 var id = ReactMount.getID(node);
7027 return id ? id.charAt(0) === SEPARATOR : false;
7028 },
7029
7030 /**
7031 * Traverses up the ancestors of the supplied node to find a node that is a
7032 * DOM representation of a React component.
7033 *
7034 * @param {*} node
7035 * @return {?DOMEventTarget}
7036 * @internal
7037 */
7038 getFirstReactDOM: function(node) {
7039 var current = node;
7040 while (current && current.parentNode !== current) {
7041 if (ReactMount.isRenderedByReact(current)) {
7042 return current;
7043 }
7044 current = current.parentNode;
7045 }
7046 return null;
7047 },
7048
7049 /**
7050 * Finds a node with the supplied `id` inside of the supplied `ancestorNode`.
7051 * Exploits the ID naming scheme to perform the search quickly.
7052 *
7053 * @param {DOMEventTarget} ancestorNode Search from this root.
7054 * @pararm {string} id ID of the DOM representation of the component.
7055 * @return {DOMEventTarget} DOM node with the supplied `id`.
7056 * @internal
7057 */
7058 findComponentRoot: function(ancestorNode, id) {
7059 var firstChildren = [ancestorNode.firstChild];
7060 var childIndex = 0;
7061
7062 while (childIndex < firstChildren.length) {
7063 var child = firstChildren[childIndex++];
7064 while (child) {
7065 var childID = ReactMount.getID(child);
7066 if (childID) {
7067 if (id === childID) {
7068 return child;
7069 } else if (ReactInstanceHandles.isAncestorIDOf(childID, id)) {
7070 // If we find a child whose ID is an ancestor of the given ID,
7071 // then we can be sure that we only want to search the subtree
7072 // rooted at this child, so we can throw out the rest of the
7073 // search state.
7074 firstChildren.length = childIndex = 0;
7075 firstChildren.push(child.firstChild);
7076 break;
7077 } else {
7078 // TODO This should not be necessary if the ID hierarchy is
7079 // correct, but is occasionally necessary if the DOM has been
7080 // modified in unexpected ways.
7081 firstChildren.push(child.firstChild);
7082 }
7083 } else {
7084 // If this child had no ID, then there's a chance that it was
7085 // injected automatically by the browser, as when a `<table>`
7086 // element sprouts an extra `<tbody>` child as a side effect of
7087 // `.innerHTML` parsing. Optimistically continue down this
7088 // branch, but not before examining the other siblings.
7089 firstChildren.push(child.firstChild);
7090 }
7091 child = child.nextSibling;
7092 }
7093 }
7094
7095 if (true) {
7096 console.error(
7097 'Error while invoking `findComponentRoot` with the following ' +
7098 'ancestor node:',
7099 ancestorNode
7100 );
7101 }
7102 invariant(
7103 false,
7104 'findComponentRoot(..., %s): Unable to find element. This probably ' +
7105 'means the DOM was unexpectedly mutated (e.g. by the browser).',
7106 id,
7107 ReactMount.getID(ancestorNode)
7108 );
7109 },
7110
7111
7112 /**
7113 * React ID utilities.
7114 */
7115
7116 ATTR_NAME: ATTR_NAME,
7117
7118 getID: getID,
7119
7120 setID: setID,
7121
7122 getNode: getNode,
7123
7124 purgeID: purgeID,
7125
7126 injection: {}
7127};
7128
7129module.exports = ReactMount;
7130
7131})()
7132},{"./$":1,"./ReactEventEmitter":34,"./ReactInstanceHandles":37,"./getReactRootElementInContainer":73,"./invariant":78}],40:[function(require,module,exports){
7133(function(){/**
7134 * Copyright 2013 Facebook, Inc.
7135 *
7136 * Licensed under the Apache License, Version 2.0 (the "License");
7137 * you may not use this file except in compliance with the License.
7138 * You may obtain a copy of the License at
7139 *
7140 * http://www.apache.org/licenses/LICENSE-2.0
7141 *
7142 * Unless required by applicable law or agreed to in writing, software
7143 * distributed under the License is distributed on an "AS IS" BASIS,
7144 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7145 * See the License for the specific language governing permissions and
7146 * limitations under the License.
7147 *
7148 * @providesModule ReactMultiChild
7149 */
7150
7151"use strict";
7152
7153var ReactComponent = require("./ReactComponent");
7154
7155/**
7156 * Given a `curChild` and `newChild`, determines if `curChild` should be managed
7157 * as it exists, as opposed to being destroyed and/or replaced.
7158 * @param {?ReactComponent} curChild
7159 * @param {?ReactComponent} newChild
7160 * @return {!boolean} Whether or not `curChild` should be updated with
7161 * `newChild`'s props
7162 */
7163function shouldManageExisting(curChild, newChild) {
7164 return curChild && newChild && curChild.constructor === newChild.constructor;
7165}
7166
7167/**
7168 * `ReactMultiChild` provides common functionality for components that have
7169 * multiple children. Standard `ReactCompositeComponent`s do not currently have
7170 * multiple children. `ReactNativeComponent`s do, however. Other specially
7171 * reconciled components will also have multiple children. Contains three
7172 * internally used properties that are used to keep track of state throughout
7173 * the `updateMultiChild` process.
7174 *
7175 * @class ReactMultiChild
7176 */
7177
7178/**
7179 * @lends `ReactMultiChildMixin`.
7180 */
7181var ReactMultiChildMixin = {
7182
7183 enqueueMarkupAt: function(markup, insertAt) {
7184 this.domOperations = this.domOperations || [];
7185 this.domOperations.push({insertMarkup: markup, finalIndex: insertAt});
7186 },
7187
7188 enqueueMove: function(originalIndex, finalIndex) {
7189 this.domOperations = this.domOperations || [];
7190 this.domOperations.push({moveFrom: originalIndex, finalIndex: finalIndex});
7191 },
7192
7193 enqueueUnmountChildByName: function(name, removeChild) {
7194 if (ReactComponent.isValidComponent(removeChild)) {
7195 this.domOperations = this.domOperations || [];
7196 this.domOperations.push({removeAt: removeChild._domIndex});
7197 removeChild.unmountComponent && removeChild.unmountComponent();
7198 delete this._renderedChildren[name];
7199 }
7200 },
7201
7202 /**
7203 * Process any pending DOM operations that have been accumulated when updating
7204 * the UI. By default, we execute the injected `DOMIDOperations` module's
7205 * `manageChildrenByParentID` which does executes the DOM operations without
7206 * any animation. It can be used as a reference implementation for special
7207 * animation based implementations.
7208 *
7209 * @abstract
7210 */
7211 processChildDOMOperationsQueue: function() {
7212 if (this.domOperations) {
7213 ReactComponent.DOMIDOperations
7214 .manageChildrenByParentID(this._rootNodeID, this.domOperations);
7215 this.domOperations = null;
7216 }
7217 },
7218
7219 unmountMultiChild: function() {
7220 var renderedChildren = this._renderedChildren;
7221 for (var name in renderedChildren) {
7222 if (renderedChildren.hasOwnProperty(name) && renderedChildren[name]) {
7223 var renderedChild = renderedChildren[name];
7224 renderedChild.unmountComponent && renderedChild.unmountComponent();
7225 }
7226 }
7227 this._renderedChildren = null;
7228 },
7229
7230 /**
7231 * Generates markup for a component that holds multiple children. #todo: Allow
7232 * all `ReactMultiChildMixin`s to support having arrays of children without a
7233 * container node. This current implementation may assume that children exist
7234 * at domIndices [0, parentNode.length].
7235 *
7236 * Has side effects of (likely) causing events to be registered. Also, every
7237 * component instance may only be rendered once.
7238 *
7239 * @param {?Object} children Flattened children object.
7240 * @return {!String} The rendered markup.
7241 */
7242 mountMultiChild: function(children, transaction) {
7243 var accum = '';
7244 var index = 0;
7245 for (var name in children) {
7246 var child = children[name];
7247 if (children.hasOwnProperty(name) && child) {
7248 accum += child.mountComponent(
7249 this._rootNodeID + '.' + name,
7250 transaction
7251 );
7252 child._domIndex = index;
7253 index++;
7254 }
7255 }
7256 this._renderedChildren = children; // children are in just the right form!
7257 this.domOperations = null;
7258 return accum;
7259 },
7260
7261 /**
7262 * Reconciles new children with old children in three phases.
7263 *
7264 * - Adds new content while updating existing children that should remain.
7265 * - Remove children that are no longer present in the next children.
7266 * - As a very last step, moves existing dom structures around.
7267 * - (Comment 1) `curChildrenDOMIndex` is the largest index of the current
7268 * rendered children that appears in the next children and did not need to
7269 * be "moved".
7270 * - (Comment 2) This is the key insight. If any non-removed child's previous
7271 * index is less than `curChildrenDOMIndex` it must be moved.
7272 *
7273 * @param {?Object} children Flattened children object.
7274 */
7275 updateMultiChild: function(nextChildren, transaction) {
7276 if (!nextChildren && !this._renderedChildren) {
7277 return;
7278 } else if (nextChildren && !this._renderedChildren) {
7279 this._renderedChildren = {}; // lazily allocate backing store with nothing
7280 } else if (!nextChildren && this._renderedChildren) {
7281 nextChildren = {};
7282 }
7283 var rootDomIdDot = this._rootNodeID + '.';
7284 var markupBuffer = null; // Accumulate adjacent new children markup.
7285 var numPendingInsert = 0; // How many root nodes are waiting in markupBuffer
7286 var loopDomIndex = 0; // Index of loop through new children.
7287 var curChildrenDOMIndex = 0; // See (Comment 1)
7288 for (var name in nextChildren) {
7289 if (!nextChildren.hasOwnProperty(name)) {continue;}
7290 var curChild = this._renderedChildren[name];
7291 var nextChild = nextChildren[name];
7292 if (shouldManageExisting(curChild, nextChild)) {
7293 if (markupBuffer) {
7294 this.enqueueMarkupAt(markupBuffer, loopDomIndex - numPendingInsert);
7295 markupBuffer = null;
7296 }
7297 numPendingInsert = 0;
7298 if (curChild._domIndex < curChildrenDOMIndex) { // (Comment 2)
7299 this.enqueueMove(curChild._domIndex, loopDomIndex);
7300 }
7301 curChildrenDOMIndex = Math.max(curChild._domIndex, curChildrenDOMIndex);
7302 curChild.receiveProps(nextChild.props, transaction);
7303 curChild._domIndex = loopDomIndex;
7304 } else {
7305 if (curChild) { // !shouldUpdate && curChild => delete
7306 this.enqueueUnmountChildByName(name, curChild);
7307 curChildrenDOMIndex =
7308 Math.max(curChild._domIndex, curChildrenDOMIndex);
7309 }
7310 if (nextChild) { // !shouldUpdate && nextChild => insert
7311 this._renderedChildren[name] = nextChild;
7312 var nextMarkup =
7313 nextChild.mountComponent(rootDomIdDot + name, transaction);
7314 markupBuffer = markupBuffer ? markupBuffer + nextMarkup : nextMarkup;
7315 numPendingInsert++;
7316 nextChild._domIndex = loopDomIndex;
7317 }
7318 }
7319 loopDomIndex = nextChild ? loopDomIndex + 1 : loopDomIndex;
7320 }
7321 if (markupBuffer) {
7322 this.enqueueMarkupAt(markupBuffer, loopDomIndex - numPendingInsert);
7323 }
7324 for (var childName in this._renderedChildren) { // from other direction
7325 if (!this._renderedChildren.hasOwnProperty(childName)) { continue; }
7326 var child = this._renderedChildren[childName];
7327 if (child && !nextChildren[childName]) {
7328 this.enqueueUnmountChildByName(childName, child);
7329 }
7330 }
7331 this.processChildDOMOperationsQueue();
7332 }
7333};
7334
7335var ReactMultiChild = {
7336 Mixin: ReactMultiChildMixin
7337};
7338
7339module.exports = ReactMultiChild;
7340
7341})()
7342},{"./ReactComponent":23}],41:[function(require,module,exports){
7343/**
7344 * Copyright 2013 Facebook, Inc.
7345 *
7346 * Licensed under the Apache License, Version 2.0 (the "License");
7347 * you may not use this file except in compliance with the License.
7348 * You may obtain a copy of the License at
7349 *
7350 * http://www.apache.org/licenses/LICENSE-2.0
7351 *
7352 * Unless required by applicable law or agreed to in writing, software
7353 * distributed under the License is distributed on an "AS IS" BASIS,
7354 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7355 * See the License for the specific language governing permissions and
7356 * limitations under the License.
7357 *
7358 * @providesModule ReactNativeComponent
7359 * @typechecks static-only
7360 */
7361
7362"use strict";
7363
7364var CSSPropertyOperations = require("./CSSPropertyOperations");
7365var DOMProperty = require("./DOMProperty");
7366var DOMPropertyOperations = require("./DOMPropertyOperations");
7367var ReactComponent = require("./ReactComponent");
7368var ReactEventEmitter = require("./ReactEventEmitter");
7369var ReactMultiChild = require("./ReactMultiChild");
7370var ReactMount = require("./ReactMount");
7371
7372var escapeTextForBrowser = require("./escapeTextForBrowser");
7373var flattenChildren = require("./flattenChildren");
7374var invariant = require("./invariant");
7375var keyOf = require("./keyOf");
7376var merge = require("./merge");
7377var mixInto = require("./mixInto");
7378
7379var putListener = ReactEventEmitter.putListener;
7380var deleteListener = ReactEventEmitter.deleteListener;
7381var registrationNames = ReactEventEmitter.registrationNames;
7382
7383// For quickly matching children type, to test if can be treated as content.
7384var CONTENT_TYPES = {'string': true, 'number': true};
7385
7386var DANGEROUSLY_SET_INNER_HTML = keyOf({dangerouslySetInnerHTML: null});
7387var STYLE = keyOf({style: null});
7388
7389/**
7390 * @param {?object} props
7391 */
7392function assertValidProps(props) {
7393 if (!props) {
7394 return;
7395 }
7396 // Note the use of `==` which checks for null or undefined.
7397 invariant(
7398 props.children == null || props.dangerouslySetInnerHTML == null,
7399 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.'
7400 );
7401 invariant(
7402 props.style == null || typeof props.style === 'object',
7403 'The `style` prop expects a mapping from style properties to values, ' +
7404 'not a string.'
7405 );
7406}
7407
7408/**
7409 * @constructor ReactNativeComponent
7410 * @extends ReactComponent
7411 * @extends ReactMultiChild
7412 */
7413function ReactNativeComponent(tag, omitClose) {
7414 this._tagOpen = '<' + tag;
7415 this._tagClose = omitClose ? '' : '</' + tag + '>';
7416 this.tagName = tag.toUpperCase();
7417}
7418
7419ReactNativeComponent.Mixin = {
7420
7421 /**
7422 * Generates root tag markup then recurses. This method has side effects and
7423 * is not idempotent.
7424 *
7425 * @internal
7426 * @param {string} rootID The root DOM ID for this node.
7427 * @param {ReactReconcileTransaction} transaction
7428 * @return {string} The computed markup.
7429 */
7430 mountComponent: function(rootID, transaction) {
7431 ReactComponent.Mixin.mountComponent.call(this, rootID, transaction);
7432 assertValidProps(this.props);
7433 return (
7434 this._createOpenTagMarkup() +
7435 this._createContentMarkup(transaction) +
7436 this._tagClose
7437 );
7438 },
7439
7440 /**
7441 * Creates markup for the open tag and all attributes.
7442 *
7443 * This method has side effects because events get registered.
7444 *
7445 * Iterating over object properties is faster than iterating over arrays.
7446 * @see http://jsperf.com/obj-vs-arr-iteration
7447 *
7448 * @private
7449 * @return {string} Markup of opening tag.
7450 */
7451 _createOpenTagMarkup: function() {
7452 var props = this.props;
7453 var ret = this._tagOpen;
7454
7455 for (var propKey in props) {
7456 if (!props.hasOwnProperty(propKey)) {
7457 continue;
7458 }
7459 var propValue = props[propKey];
7460 if (propValue == null) {
7461 continue;
7462 }
7463 if (registrationNames[propKey]) {
7464 putListener(this._rootNodeID, propKey, propValue);
7465 } else {
7466 if (propKey === STYLE) {
7467 if (propValue) {
7468 propValue = props.style = merge(props.style);
7469 }
7470 propValue = CSSPropertyOperations.createMarkupForStyles(propValue);
7471 }
7472 var markup =
7473 DOMPropertyOperations.createMarkupForProperty(propKey, propValue);
7474 if (markup) {
7475 ret += ' ' + markup;
7476 }
7477 }
7478 }
7479
7480 var escapedID = escapeTextForBrowser(this._rootNodeID);
7481 return ret + ' ' + ReactMount.ATTR_NAME + '="' + escapedID + '">';
7482 },
7483
7484 /**
7485 * Creates markup for the content between the tags.
7486 *
7487 * @private
7488 * @param {ReactReconcileTransaction} transaction
7489 * @return {string} Content markup.
7490 */
7491 _createContentMarkup: function(transaction) {
7492 // Intentional use of != to avoid catching zero/false.
7493 var innerHTML = this.props.dangerouslySetInnerHTML;
7494 if (innerHTML != null) {
7495 if (innerHTML.__html != null) {
7496 return innerHTML.__html;
7497 }
7498 } else {
7499 var contentToUse =
7500 CONTENT_TYPES[typeof this.props.children] ? this.props.children : null;
7501 var childrenToUse = contentToUse != null ? null : this.props.children;
7502 if (contentToUse != null) {
7503 return escapeTextForBrowser(contentToUse);
7504 } else if (childrenToUse != null) {
7505 return this.mountMultiChild(
7506 flattenChildren(childrenToUse),
7507 transaction
7508 );
7509 }
7510 }
7511 return '';
7512 },
7513
7514 receiveProps: function(nextProps, transaction) {
7515 assertValidProps(nextProps);
7516 ReactComponent.Mixin.receiveProps.call(this, nextProps, transaction);
7517 },
7518
7519 /**
7520 * Updates a native DOM component after it has already been allocated and
7521 * attached to the DOM. Reconciles the root DOM node, then recurses.
7522 *
7523 * @param {ReactReconcileTransaction} transaction
7524 * @param {object} prevProps
7525 * @internal
7526 * @overridable
7527 */
7528 updateComponent: function(transaction, prevProps) {
7529 ReactComponent.Mixin.updateComponent.call(this, transaction, prevProps);
7530 this._updateDOMProperties(prevProps);
7531 this._updateDOMChildren(prevProps, transaction);
7532 },
7533
7534 /**
7535 * Reconciles the properties by detecting differences in property values and
7536 * updating the DOM as necessary. This function is probably the single most
7537 * critical path for performance optimization.
7538 *
7539 * TODO: Benchmark whether checking for changed values in memory actually
7540 * improves performance (especially statically positioned elements).
7541 * TODO: Benchmark the effects of putting this at the top since 99% of props
7542 * do not change for a given reconciliation.
7543 * TODO: Benchmark areas that can be improved with caching.
7544 *
7545 * @private
7546 * @param {object} lastProps
7547 */
7548 _updateDOMProperties: function(lastProps) {
7549 var nextProps = this.props;
7550 var propKey;
7551 var styleName;
7552 var styleUpdates;
7553 for (propKey in lastProps) {
7554 if (nextProps.hasOwnProperty(propKey) ||
7555 !lastProps.hasOwnProperty(propKey)) {
7556 continue;
7557 }
7558 if (propKey === STYLE) {
7559 var lastStyle = lastProps[propKey];
7560 for (styleName in lastStyle) {
7561 if (lastStyle.hasOwnProperty(styleName)) {
7562 styleUpdates = styleUpdates || {};
7563 styleUpdates[styleName] = '';
7564 }
7565 }
7566 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7567 // http://jsperf.com/emptying-speed
7568 ReactComponent.DOMIDOperations.updateTextContentByID(
7569 this._rootNodeID,
7570 ''
7571 );
7572 } else if (registrationNames[propKey]) {
7573 deleteListener(this._rootNodeID, propKey);
7574 } else {
7575 ReactComponent.DOMIDOperations.deletePropertyByID(
7576 this._rootNodeID,
7577 propKey
7578 );
7579 }
7580 }
7581 for (propKey in nextProps) {
7582 var nextProp = nextProps[propKey];
7583 var lastProp = lastProps[propKey];
7584 if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp) {
7585 continue;
7586 }
7587 if (propKey === STYLE) {
7588 if (nextProp) {
7589 nextProp = nextProps.style = merge(nextProp);
7590 }
7591 if (lastProp) {
7592 // Unset styles on `lastProp` but not on `nextProp`.
7593 for (styleName in lastProp) {
7594 if (lastProp.hasOwnProperty(styleName) &&
7595 !nextProp.hasOwnProperty(styleName)) {
7596 styleUpdates = styleUpdates || {};
7597 styleUpdates[styleName] = '';
7598 }
7599 }
7600 // Update styles that changed since `lastProp`.
7601 for (styleName in nextProp) {
7602 if (nextProp.hasOwnProperty(styleName) &&
7603 lastProp[styleName] !== nextProp[styleName]) {
7604 styleUpdates = styleUpdates || {};
7605 styleUpdates[styleName] = nextProp[styleName];
7606 }
7607 }
7608 } else {
7609 // Relies on `updateStylesByID` not mutating `styleUpdates`.
7610 styleUpdates = nextProp;
7611 }
7612 } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
7613 var lastHtml = lastProp && lastProp.__html;
7614 var nextHtml = nextProp && nextProp.__html;
7615 if (lastHtml !== nextHtml) {
7616 ReactComponent.DOMIDOperations.updateInnerHTMLByID(
7617 this._rootNodeID,
7618 nextProp
7619 );
7620 }
7621 } else if (registrationNames[propKey]) {
7622 putListener(this._rootNodeID, propKey, nextProp);
7623 } else if (
7624 DOMProperty.isStandardName[propKey] ||
7625 DOMProperty.isCustomAttribute(propKey)) {
7626 ReactComponent.DOMIDOperations.updatePropertyByID(
7627 this._rootNodeID,
7628 propKey,
7629 nextProp
7630 );
7631 }
7632 }
7633 if (styleUpdates) {
7634 ReactComponent.DOMIDOperations.updateStylesByID(
7635 this._rootNodeID,
7636 styleUpdates
7637 );
7638 }
7639 },
7640
7641 /**
7642 * Reconciles the children with the various properties that affect the
7643 * children content.
7644 *
7645 * @param {object} lastProps
7646 * @param {ReactReconcileTransaction} transaction
7647 */
7648 _updateDOMChildren: function(lastProps, transaction) {
7649 var nextProps = this.props;
7650
7651 var lastUsedContent =
7652 CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null;
7653 var contentToUse =
7654 CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null;
7655
7656 // Note the use of `!=` which checks for null or undefined.
7657
7658 var lastUsedChildren =
7659 lastUsedContent != null ? null : lastProps.children;
7660 var childrenToUse = contentToUse != null ? null : nextProps.children;
7661
7662 if (contentToUse != null) {
7663 var childrenRemoved = lastUsedChildren != null && childrenToUse == null;
7664 if (childrenRemoved) {
7665 this.updateMultiChild(null, transaction);
7666 }
7667 if (lastUsedContent !== contentToUse) {
7668 ReactComponent.DOMIDOperations.updateTextContentByID(
7669 this._rootNodeID,
7670 '' + contentToUse
7671 );
7672 }
7673 } else {
7674 var contentRemoved = lastUsedContent != null && contentToUse == null;
7675 if (contentRemoved) {
7676 ReactComponent.DOMIDOperations.updateTextContentByID(
7677 this._rootNodeID,
7678 ''
7679 );
7680 }
7681 this.updateMultiChild(flattenChildren(nextProps.children), transaction);
7682 }
7683 },
7684
7685 /**
7686 * Destroys all event registrations for this instance. Does not remove from
7687 * the DOM. That must be done by the parent.
7688 *
7689 * @internal
7690 */
7691 unmountComponent: function() {
7692 ReactEventEmitter.deleteAllListeners(this._rootNodeID);
7693 ReactComponent.Mixin.unmountComponent.call(this);
7694 this.unmountMultiChild();
7695 }
7696
7697};
7698
7699mixInto(ReactNativeComponent, ReactComponent.Mixin);
7700mixInto(ReactNativeComponent, ReactNativeComponent.Mixin);
7701mixInto(ReactNativeComponent, ReactMultiChild.Mixin);
7702
7703module.exports = ReactNativeComponent;
7704
7705},{"./CSSPropertyOperations":3,"./DOMProperty":7,"./DOMPropertyOperations":8,"./ReactComponent":23,"./ReactEventEmitter":34,"./ReactMount":39,"./ReactMultiChild":40,"./escapeTextForBrowser":67,"./flattenChildren":69,"./invariant":78,"./keyOf":82,"./merge":84,"./mixInto":87}],42:[function(require,module,exports){
7706/**
7707 * Copyright 2013 Facebook, Inc.
7708 *
7709 * Licensed under the Apache License, Version 2.0 (the "License");
7710 * you may not use this file except in compliance with the License.
7711 * You may obtain a copy of the License at
7712 *
7713 * http://www.apache.org/licenses/LICENSE-2.0
7714 *
7715 * Unless required by applicable law or agreed to in writing, software
7716 * distributed under the License is distributed on an "AS IS" BASIS,
7717 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7718 * See the License for the specific language governing permissions and
7719 * limitations under the License.
7720 *
7721 * @providesModule ReactOnDOMReady
7722 */
7723
7724"use strict";
7725
7726var PooledClass = require("./PooledClass");
7727
7728var mixInto = require("./mixInto");
7729
7730/**
7731 * A specialized pseudo-event module to help keep track of components waiting to
7732 * be notified when their DOM representations are available for use.
7733 *
7734 * This implements `PooledClass`, so you should never need to instantiate this.
7735 * Instead, use `ReactOnDOMReady.getPooled()`.
7736 *
7737 * @param {?array<function>} initialCollection
7738 * @class ReactOnDOMReady
7739 * @implements PooledClass
7740 * @internal
7741 */
7742function ReactOnDOMReady(initialCollection) {
7743 this._queue = initialCollection || null;
7744}
7745
7746mixInto(ReactOnDOMReady, {
7747
7748 /**
7749 * Enqueues a callback to be invoked when `notifyAll` is invoked. This is used
7750 * to enqueue calls to `componentDidMount` and `componentDidUpdate`.
7751 *
7752 * @param {ReactComponent} component Component being rendered.
7753 * @param {function(DOMElement)} callback Invoked when `notifyAll` is invoked.
7754 * @internal
7755 */
7756 enqueue: function(component, callback) {
7757 this._queue = this._queue || [];
7758 this._queue.push({component: component, callback: callback});
7759 },
7760
7761 /**
7762 * Invokes all enqueued callbacks and clears the queue. This is invoked after
7763 * the DOM representation of a component has been created or updated.
7764 *
7765 * @internal
7766 */
7767 notifyAll: function() {
7768 var queue = this._queue;
7769 if (queue) {
7770 this._queue = null;
7771 for (var i = 0, l = queue.length; i < l; i++) {
7772 var component = queue[i].component;
7773 var callback = queue[i].callback;
7774 callback.call(component, component.getDOMNode());
7775 }
7776 queue.length = 0;
7777 }
7778 },
7779
7780 /**
7781 * Resets the internal queue.
7782 *
7783 * @internal
7784 */
7785 reset: function() {
7786 this._queue = null;
7787 },
7788
7789 /**
7790 * `PooledClass` looks for this.
7791 */
7792 destructor: function() {
7793 this.reset();
7794 }
7795
7796});
7797
7798PooledClass.addPoolingTo(ReactOnDOMReady);
7799
7800module.exports = ReactOnDOMReady;
7801
7802},{"./PooledClass":21,"./mixInto":87}],43:[function(require,module,exports){
7803/**
7804 * Copyright 2013 Facebook, Inc.
7805 *
7806 * Licensed under the Apache License, Version 2.0 (the "License");
7807 * you may not use this file except in compliance with the License.
7808 * You may obtain a copy of the License at
7809 *
7810 * http://www.apache.org/licenses/LICENSE-2.0
7811 *
7812 * Unless required by applicable law or agreed to in writing, software
7813 * distributed under the License is distributed on an "AS IS" BASIS,
7814 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7815 * See the License for the specific language governing permissions and
7816 * limitations under the License.
7817 *
7818 * @providesModule ReactOwner
7819 */
7820
7821"use strict";
7822
7823var invariant = require("./invariant");
7824
7825/**
7826 * ReactOwners are capable of storing references to owned components.
7827 *
7828 * All components are capable of //being// referenced by owner components, but
7829 * only ReactOwner components are capable of //referencing// owned components.
7830 * The named reference is known as a "ref".
7831 *
7832 * Refs are available when mounted and updated during reconciliation.
7833 *
7834 * var MyComponent = React.createClass({
7835 * render: function() {
7836 * return (
7837 * <div onClick={this.handleClick}>
7838 * <CustomComponent ref="custom" />
7839 * </div>
7840 * );
7841 * },
7842 * handleClick: function() {
7843 * this.refs.custom.handleClick();
7844 * },
7845 * componentDidMount: function() {
7846 * this.refs.custom.initialize();
7847 * }
7848 * });
7849 *
7850 * Refs should rarely be used. When refs are used, they should only be done to
7851 * control data that is not handled by React's data flow.
7852 *
7853 * @class ReactOwner
7854 */
7855var ReactOwner = {
7856
7857 /**
7858 * @param {?object} object
7859 * @return {boolean} True if `object` is a valid owner.
7860 * @final
7861 */
7862 isValidOwner: function(object) {
7863 return !!(
7864 object &&
7865 typeof object.attachRef === 'function' &&
7866 typeof object.detachRef === 'function'
7867 );
7868 },
7869
7870 /**
7871 * Adds a component by ref to an owner component.
7872 *
7873 * @param {ReactComponent} component Component to reference.
7874 * @param {string} ref Name by which to refer to the component.
7875 * @param {ReactOwner} owner Component on which to record the ref.
7876 * @final
7877 * @internal
7878 */
7879 addComponentAsRefTo: function(component, ref, owner) {
7880 invariant(
7881 ReactOwner.isValidOwner(owner),
7882 'addComponentAsRefTo(...): Only a ReactOwner can have refs.'
7883 );
7884 owner.attachRef(ref, component);
7885 },
7886
7887 /**
7888 * Removes a component by ref from an owner component.
7889 *
7890 * @param {ReactComponent} component Component to dereference.
7891 * @param {string} ref Name of the ref to remove.
7892 * @param {ReactOwner} owner Component on which the ref is recorded.
7893 * @final
7894 * @internal
7895 */
7896 removeComponentAsRefFrom: function(component, ref, owner) {
7897 invariant(
7898 ReactOwner.isValidOwner(owner),
7899 'removeComponentAsRefFrom(...): Only a ReactOwner can have refs.'
7900 );
7901 // Check that `component` is still the current ref because we do not want to
7902 // detach the ref if another component stole it.
7903 if (owner.refs[ref] === component) {
7904 owner.detachRef(ref);
7905 }
7906 },
7907
7908 /**
7909 * A ReactComponent must mix this in to have refs.
7910 *
7911 * @lends {ReactOwner.prototype}
7912 */
7913 Mixin: {
7914
7915 /**
7916 * Lazily allocates the refs object and stores `component` as `ref`.
7917 *
7918 * @param {string} ref Reference name.
7919 * @param {component} component Component to store as `ref`.
7920 * @final
7921 * @private
7922 */
7923 attachRef: function(ref, component) {
7924 invariant(
7925 component.isOwnedBy(this),
7926 'attachRef(%s, ...): Only a component\'s owner can store a ref to it.',
7927 ref
7928 );
7929 var refs = this.refs || (this.refs = {});
7930 refs[ref] = component;
7931 },
7932
7933 /**
7934 * Detaches a reference name.
7935 *
7936 * @param {string} ref Name to dereference.
7937 * @final
7938 * @private
7939 */
7940 detachRef: function(ref) {
7941 delete this.refs[ref];
7942 }
7943
7944 }
7945
7946};
7947
7948module.exports = ReactOwner;
7949
7950},{"./invariant":78}],44:[function(require,module,exports){
7951/**
7952 * Copyright 2013 Facebook, Inc.
7953 *
7954 * Licensed under the Apache License, Version 2.0 (the "License");
7955 * you may not use this file except in compliance with the License.
7956 * You may obtain a copy of the License at
7957 *
7958 * http://www.apache.org/licenses/LICENSE-2.0
7959 *
7960 * Unless required by applicable law or agreed to in writing, software
7961 * distributed under the License is distributed on an "AS IS" BASIS,
7962 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7963 * See the License for the specific language governing permissions and
7964 * limitations under the License.
7965 *
7966 * @providesModule ReactPropTransferer
7967 */
7968
7969"use strict";
7970
7971var emptyFunction = require("./emptyFunction");
7972var joinClasses = require("./joinClasses");
7973var merge = require("./merge");
7974
7975/**
7976 * Creates a transfer strategy that will merge prop values using the supplied
7977 * `mergeStrategy`. If a prop was previously unset, this just sets it.
7978 *
7979 * @param {function} mergeStrategy
7980 * @return {function}
7981 */
7982function createTransferStrategy(mergeStrategy) {
7983 return function(props, key, value) {
7984 if (!props.hasOwnProperty(key)) {
7985 props[key] = value;
7986 } else {
7987 props[key] = mergeStrategy(props[key], value);
7988 }
7989 };
7990}
7991
7992/**
7993 * Transfer strategies dictate how props are transferred by `transferPropsTo`.
7994 */
7995var TransferStrategies = {
7996 /**
7997 * Never transfer `children`.
7998 */
7999 children: emptyFunction,
8000 /**
8001 * Transfer the `className` prop by merging them.
8002 */
8003 className: createTransferStrategy(joinClasses),
8004 /**
8005 * Never transfer the `ref` prop.
8006 */
8007 ref: emptyFunction,
8008 /**
8009 * Transfer the `style` prop (which is an object) by merging them.
8010 */
8011 style: createTransferStrategy(merge)
8012};
8013
8014/**
8015 * ReactPropTransferer are capable of transferring props to another component
8016 * using a `transferPropsTo` method.
8017 *
8018 * @class ReactPropTransferer
8019 */
8020var ReactPropTransferer = {
8021
8022 TransferStrategies: TransferStrategies,
8023
8024 /**
8025 * @lends {ReactPropTransferer.prototype}
8026 */
8027 Mixin: {
8028
8029 /**
8030 * Transfer props from this component to a target component.
8031 *
8032 * Props that do not have an explicit transfer strategy will be transferred
8033 * only if the target component does not already have the prop set.
8034 *
8035 * This is usually used to pass down props to a returned root component.
8036 *
8037 * @param {ReactComponent} component Component receiving the properties.
8038 * @return {ReactComponent} The supplied `component`.
8039 * @final
8040 * @protected
8041 */
8042 transferPropsTo: function(component) {
8043 var props = {};
8044 for (var thatKey in component.props) {
8045 if (component.props.hasOwnProperty(thatKey)) {
8046 props[thatKey] = component.props[thatKey];
8047 }
8048 }
8049 for (var thisKey in this.props) {
8050 if (!this.props.hasOwnProperty(thisKey)) {
8051 continue;
8052 }
8053 var transferStrategy = TransferStrategies[thisKey];
8054 if (transferStrategy) {
8055 transferStrategy(props, thisKey, this.props[thisKey]);
8056 } else if (!props.hasOwnProperty(thisKey)) {
8057 props[thisKey] = this.props[thisKey];
8058 }
8059 }
8060 component.props = props;
8061 return component;
8062 }
8063
8064 }
8065
8066};
8067
8068module.exports = ReactPropTransferer;
8069
8070},{"./emptyFunction":66,"./joinClasses":80,"./merge":84}],45:[function(require,module,exports){
8071/**
8072 * Copyright 2013 Facebook, Inc.
8073 *
8074 * Licensed under the Apache License, Version 2.0 (the "License");
8075 * you may not use this file except in compliance with the License.
8076 * You may obtain a copy of the License at
8077 *
8078 * http://www.apache.org/licenses/LICENSE-2.0
8079 *
8080 * Unless required by applicable law or agreed to in writing, software
8081 * distributed under the License is distributed on an "AS IS" BASIS,
8082 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8083 * See the License for the specific language governing permissions and
8084 * limitations under the License.
8085 *
8086 * @providesModule ReactPropTypes
8087 */
8088
8089"use strict";
8090
8091var createObjectFrom = require("./createObjectFrom");
8092var invariant = require("./invariant");
8093
8094/**
8095 * Collection of methods that allow declaration and validation of props that are
8096 * supplied to React components. Example usage:
8097 *
8098 * var Props = require('ReactPropTypes');
8099 * var MyArticle = React.createClass({
8100 * propTypes: {
8101 * // An optional string prop named "description".
8102 * description: Props.string,
8103 *
8104 * // A required enum prop named "category".
8105 * category: Props.oneOf(['News','Photos']).isRequired,
8106 *
8107 * // A prop named "dialog" that requires an instance of Dialog.
8108 * dialog: Props.instanceOf(Dialog).isRequired
8109 * },
8110 * render: function() { ... }
8111 * });
8112 *
8113 * A more formal specification of how these methods are used:
8114 *
8115 * type := array|bool|object|number|string|oneOf([...])|instanceOf(...)
8116 * decl := ReactPropTypes.{type}(.isRequired)?
8117 *
8118 * Each and every declaration produces a function with the same signature. This
8119 * allows the creation of custom validation functions. For example:
8120 *
8121 * var Props = require('ReactPropTypes');
8122 * var MyLink = React.createClass({
8123 * propTypes: {
8124 * // An optional string or URI prop named "href".
8125 * href: function(props, propName, componentName) {
8126 * var propValue = props[propName];
8127 * invariant(
8128 * propValue == null ||
8129 * typeof propValue === string ||
8130 * propValue instanceof URI,
8131 * 'Invalid `%s` supplied to `%s`, expected string or URI.',
8132 * propName,
8133 * componentName
8134 * );
8135 * }
8136 * },
8137 * render: function() { ... }
8138 * });
8139 *
8140 * @internal
8141 */
8142var Props = {
8143
8144 array: createPrimitiveTypeChecker('array'),
8145 bool: createPrimitiveTypeChecker('boolean'),
8146 func: createPrimitiveTypeChecker('function'),
8147 number: createPrimitiveTypeChecker('number'),
8148 object: createPrimitiveTypeChecker('object'),
8149 string: createPrimitiveTypeChecker('string'),
8150
8151 oneOf: createEnumTypeChecker,
8152
8153 instanceOf: createInstanceTypeChecker
8154
8155};
8156
8157var ANONYMOUS = '<<anonymous>>';
8158
8159function createPrimitiveTypeChecker(expectedType) {
8160 function validatePrimitiveType(propValue, propName, componentName) {
8161 var propType = typeof propValue;
8162 if (propType === 'object' && Array.isArray(propValue)) {
8163 propType = 'array';
8164 }
8165 invariant(
8166 propType === expectedType,
8167 'Invalid prop `%s` of type `%s` supplied to `%s`, expected `%s`.',
8168 propName,
8169 propType,
8170 componentName,
8171 expectedType
8172 );
8173 }
8174 return createChainableTypeChecker(validatePrimitiveType);
8175}
8176
8177function createEnumTypeChecker(expectedValues) {
8178 var expectedEnum = createObjectFrom(expectedValues);
8179 function validateEnumType(propValue, propName, componentName) {
8180 invariant(
8181 expectedEnum[propValue],
8182 'Invalid prop `%s` supplied to `%s`, expected one of %s.',
8183 propName,
8184 componentName,
8185 JSON.stringify(Object.keys(expectedEnum))
8186 );
8187 }
8188 return createChainableTypeChecker(validateEnumType);
8189}
8190
8191function createInstanceTypeChecker(expectedClass) {
8192 function validateInstanceType(propValue, propName, componentName) {
8193 invariant(
8194 propValue instanceof expectedClass,
8195 'Invalid prop `%s` supplied to `%s`, expected instance of `%s`.',
8196 propName,
8197 componentName,
8198 expectedClass.name || ANONYMOUS
8199 );
8200 }
8201 return createChainableTypeChecker(validateInstanceType);
8202}
8203
8204function createChainableTypeChecker(validate) {
8205 function createTypeChecker(isRequired) {
8206 function checkType(props, propName, componentName) {
8207 var propValue = props[propName];
8208 if (propValue != null) {
8209 // Only validate if there is a value to check.
8210 validate(propValue, propName, componentName || ANONYMOUS);
8211 } else {
8212 invariant(
8213 !isRequired,
8214 'Required prop `%s` was not specified in `%s`.',
8215 propName,
8216 componentName || ANONYMOUS
8217 );
8218 }
8219 }
8220 if (!isRequired) {
8221 checkType.isRequired = createTypeChecker(true);
8222 }
8223 return checkType;
8224 }
8225 return createTypeChecker(false);
8226}
8227
8228module.exports = Props;
8229
8230},{"./createObjectFrom":64,"./invariant":78}],46:[function(require,module,exports){
8231/**
8232 * Copyright 2013 Facebook, Inc.
8233 *
8234 * Licensed under the Apache License, Version 2.0 (the "License");
8235 * you may not use this file except in compliance with the License.
8236 * You may obtain a copy of the License at
8237 *
8238 * http://www.apache.org/licenses/LICENSE-2.0
8239 *
8240 * Unless required by applicable law or agreed to in writing, software
8241 * distributed under the License is distributed on an "AS IS" BASIS,
8242 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8243 * See the License for the specific language governing permissions and
8244 * limitations under the License.
8245 *
8246 * @providesModule ReactReconcileTransaction
8247 * @typechecks static-only
8248 */
8249
8250"use strict";
8251
8252var ExecutionEnvironment = require("./ExecutionEnvironment");
8253var PooledClass = require("./PooledClass");
8254var ReactEventEmitter = require("./ReactEventEmitter");
8255var ReactInputSelection = require("./ReactInputSelection");
8256var ReactOnDOMReady = require("./ReactOnDOMReady");
8257var Transaction = require("./Transaction");
8258
8259var mixInto = require("./mixInto");
8260
8261/**
8262 * Ensures that, when possible, the selection range (currently selected text
8263 * input) is not disturbed by performing the transaction.
8264 */
8265var SELECTION_RESTORATION = {
8266 /**
8267 * @return {Selection} Selection information.
8268 */
8269 initialize: ReactInputSelection.getSelectionInformation,
8270 /**
8271 * @param {Selection} sel Selection information returned from `initialize`.
8272 */
8273 close: ReactInputSelection.restoreSelection
8274};
8275
8276/**
8277 * Suppresses events (blur/focus) that could be inadvertently dispatched due to
8278 * high level DOM manipulations (like temporarily removing a text input from the
8279 * DOM).
8280 */
8281var EVENT_SUPPRESSION = {
8282 /**
8283 * @return {boolean} The enabled status of `ReactEventEmitter` before the
8284 * reconciliation.
8285 */
8286 initialize: function() {
8287 var currentlyEnabled = ReactEventEmitter.isEnabled();
8288 ReactEventEmitter.setEnabled(false);
8289 return currentlyEnabled;
8290 },
8291
8292 /**
8293 * @param {boolean} previouslyEnabled Enabled status of `ReactEventEmitter`
8294 * before the reconciliation occured. `close` restores the previous value.
8295 */
8296 close: function(previouslyEnabled) {
8297 ReactEventEmitter.setEnabled(previouslyEnabled);
8298 }
8299};
8300
8301/**
8302 * Provides a `ReactOnDOMReady` queue for collecting `onDOMReady` callbacks
8303 * during the performing of the transaction.
8304 */
8305var ON_DOM_READY_QUEUEING = {
8306 /**
8307 * Initializes the internal `onDOMReady` queue.
8308 */
8309 initialize: function() {
8310 this.reactOnDOMReady.reset();
8311 },
8312
8313 /**
8314 * After DOM is flushed, invoke all registered `onDOMReady` callbacks.
8315 */
8316 close: function() {
8317 this.reactOnDOMReady.notifyAll();
8318 }
8319};
8320
8321/**
8322 * Executed within the scope of the `Transaction` instance. Consider these as
8323 * being member methods, but with an implied ordering while being isolated from
8324 * each other.
8325 */
8326var TRANSACTION_WRAPPERS = [
8327 SELECTION_RESTORATION,
8328 EVENT_SUPPRESSION,
8329 ON_DOM_READY_QUEUEING
8330];
8331
8332/**
8333 * Currently:
8334 * - The order that these are listed in the transaction is critical:
8335 * - Suppresses events.
8336 * - Restores selection range.
8337 *
8338 * Future:
8339 * - Restore document/overflow scroll positions that were unintentionally
8340 * modified via DOM insertions above the top viewport boundary.
8341 * - Implement/integrate with customized constraint based layout system and keep
8342 * track of which dimensions must be remeasured.
8343 *
8344 * @class ReactReconcileTransaction
8345 */
8346function ReactReconcileTransaction() {
8347 this.reinitializeTransaction();
8348 this.reactOnDOMReady = ReactOnDOMReady.getPooled(null);
8349}
8350
8351var Mixin = {
8352 /**
8353 * @see Transaction
8354 * @abstract
8355 * @final
8356 * @return {array<object>} List of operation wrap proceedures.
8357 * TODO: convert to array<TransactionWrapper>
8358 */
8359 getTransactionWrappers: function() {
8360 if (ExecutionEnvironment.canUseDOM) {
8361 return TRANSACTION_WRAPPERS;
8362 } else {
8363 return [];
8364 }
8365 },
8366
8367 /**
8368 * @return {object} The queue to collect `onDOMReady` callbacks with.
8369 * TODO: convert to ReactOnDOMReady
8370 */
8371 getReactOnDOMReady: function() {
8372 return this.reactOnDOMReady;
8373 },
8374
8375 /**
8376 * `PooledClass` looks for this, and will invoke this before allowing this
8377 * instance to be resused.
8378 */
8379 destructor: function() {
8380 ReactOnDOMReady.release(this.reactOnDOMReady);
8381 this.reactOnDOMReady = null;
8382 }
8383};
8384
8385
8386mixInto(ReactReconcileTransaction, Transaction.Mixin);
8387mixInto(ReactReconcileTransaction, Mixin);
8388
8389PooledClass.addPoolingTo(ReactReconcileTransaction);
8390
8391module.exports = ReactReconcileTransaction;
8392
8393},{"./ExecutionEnvironment":19,"./PooledClass":21,"./ReactEventEmitter":34,"./ReactInputSelection":36,"./ReactOnDOMReady":42,"./Transaction":59,"./mixInto":87}],47:[function(require,module,exports){
8394/**
8395 * Copyright 2013 Facebook, Inc.
8396 *
8397 * Licensed under the Apache License, Version 2.0 (the "License");
8398 * you may not use this file except in compliance with the License.
8399 * You may obtain a copy of the License at
8400 *
8401 * http://www.apache.org/licenses/LICENSE-2.0
8402 *
8403 * Unless required by applicable law or agreed to in writing, software
8404 * distributed under the License is distributed on an "AS IS" BASIS,
8405 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8406 * See the License for the specific language governing permissions and
8407 * limitations under the License.
8408 *
8409 * @typechecks static-only
8410 * @providesModule ReactServerRendering
8411 */
8412"use strict";
8413
8414var ReactMarkupChecksum = require("./ReactMarkupChecksum");
8415var ReactReconcileTransaction = require("./ReactReconcileTransaction");
8416var ReactInstanceHandles = require("./ReactInstanceHandles");
8417
8418/**
8419 * @param {object} component
8420 * @param {function} callback
8421 */
8422function renderComponentToString(component, callback) {
8423 // We use a callback API to keep the API async in case in the future we ever
8424 // need it, but in reality this is a synchronous operation.
8425 var id = ReactInstanceHandles.createReactRootID();
8426 var transaction = ReactReconcileTransaction.getPooled();
8427 transaction.reinitializeTransaction();
8428 try {
8429 transaction.perform(function() {
8430 var markup = component.mountComponent(id, transaction);
8431 markup = ReactMarkupChecksum.addChecksumToMarkup(markup);
8432 callback(markup);
8433 }, null);
8434 } finally {
8435 ReactReconcileTransaction.release(transaction);
8436 }
8437}
8438
8439module.exports = {
8440 renderComponentToString: renderComponentToString
8441};
8442
8443},{"./ReactInstanceHandles":37,"./ReactMarkupChecksum":38,"./ReactReconcileTransaction":46}],48:[function(require,module,exports){
8444/**
8445 * Copyright 2013 Facebook, Inc.
8446 *
8447 * Licensed under the Apache License, Version 2.0 (the "License");
8448 * you may not use this file except in compliance with the License.
8449 * You may obtain a copy of the License at
8450 *
8451 * http://www.apache.org/licenses/LICENSE-2.0
8452 *
8453 * Unless required by applicable law or agreed to in writing, software
8454 * distributed under the License is distributed on an "AS IS" BASIS,
8455 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8456 * See the License for the specific language governing permissions and
8457 * limitations under the License.
8458 *
8459 * @providesModule ReactTextComponent
8460 * @typechecks static-only
8461 */
8462
8463"use strict";
8464
8465var ReactComponent = require("./ReactComponent");
8466var ReactMount = require("./ReactMount");
8467
8468var escapeTextForBrowser = require("./escapeTextForBrowser");
8469var mixInto = require("./mixInto");
8470
8471/**
8472 * Text nodes violate a couple assumptions that React makes about components:
8473 *
8474 * - When mounting text into the DOM, adjacent text nodes are merged.
8475 * - Text nodes cannot be assigned a React root ID.
8476 *
8477 * This component is used to wrap strings in elements so that they can undergo
8478 * the same reconciliation that is applied to elements.
8479 *
8480 * TODO: Investigate representing React components in the DOM with text nodes.
8481 *
8482 * @class ReactTextComponent
8483 * @extends ReactComponent
8484 * @internal
8485 */
8486var ReactTextComponent = function(initialText) {
8487 this.construct({text: initialText});
8488};
8489
8490mixInto(ReactTextComponent, ReactComponent.Mixin);
8491mixInto(ReactTextComponent, {
8492
8493 /**
8494 * Creates the markup for this text node. This node is not intended to have
8495 * any features besides containing text content.
8496 *
8497 * @param {string} rootID DOM ID of the root node.
8498 * @return {string} Markup for this text node.
8499 * @internal
8500 */
8501 mountComponent: function(rootID) {
8502 ReactComponent.Mixin.mountComponent.call(this, rootID);
8503 return (
8504 '<span ' + ReactMount.ATTR_NAME + '="' + rootID + '">' +
8505 escapeTextForBrowser(this.props.text) +
8506 '</span>'
8507 );
8508 },
8509
8510 /**
8511 * Updates this component by updating the text content.
8512 *
8513 * @param {object} nextProps Contains the next text content.
8514 * @param {ReactReconcileTransaction} transaction
8515 * @internal
8516 */
8517 receiveProps: function(nextProps, transaction) {
8518 if (nextProps.text !== this.props.text) {
8519 this.props.text = nextProps.text;
8520 ReactComponent.DOMIDOperations.updateTextContentByID(
8521 this._rootNodeID,
8522 nextProps.text
8523 );
8524 }
8525 }
8526
8527});
8528
8529module.exports = ReactTextComponent;
8530
8531},{"./ReactComponent":23,"./ReactMount":39,"./escapeTextForBrowser":67,"./mixInto":87}],49:[function(require,module,exports){
8532/**
8533 * Copyright 2013 Facebook, Inc.
8534 *
8535 * Licensed under the Apache License, Version 2.0 (the "License");
8536 * you may not use this file except in compliance with the License.
8537 * You may obtain a copy of the License at
8538 *
8539 * http://www.apache.org/licenses/LICENSE-2.0
8540 *
8541 * Unless required by applicable law or agreed to in writing, software
8542 * distributed under the License is distributed on an "AS IS" BASIS,
8543 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8544 * See the License for the specific language governing permissions and
8545 * limitations under the License.
8546 *
8547 * @providesModule ReactUpdates
8548 */
8549
8550"use strict";
8551
8552var invariant = require("./invariant");
8553
8554var isBatchingUpdates = false;
8555
8556var dirtyComponents = [];
8557
8558/**
8559 * Call the provided function in a context within which calls to `setState` and
8560 * friends are batched such that components aren't updated unnecessarily.
8561 */
8562function batchedUpdates(callback) {
8563 if (isBatchingUpdates) {
8564 // We're already executing in an environment where updates will be batched,
8565 // so this is a no-op.
8566 callback();
8567 return;
8568 }
8569
8570 isBatchingUpdates = true;
8571
8572 try {
8573 callback();
8574 // TODO: Sort components by depth such that parent components update first
8575 for (var i = 0; i < dirtyComponents.length; i++) {
8576 // If a component is unmounted before pending changes apply, ignore them
8577 // TODO: Queue unmounts in the same list to avoid this happening at all
8578 var component = dirtyComponents[i];
8579 if (component.isMounted()) {
8580 // If performUpdateIfNecessary happens to enqueue any new updates, we
8581 // shouldn't execute the callbacks until the next render happens, so
8582 // stash the callbacks first
8583 var callbacks = component._pendingCallbacks;
8584 component._pendingCallbacks = null;
8585 component.performUpdateIfNecessary();
8586 if (callbacks) {
8587 for (var j = 0; j < callbacks.length; j++) {
8588 callbacks[j].call(component);
8589 }
8590 }
8591 }
8592 }
8593 } catch (error) {
8594 // IE8 requires `catch` in order to use `finally`.
8595 throw error;
8596 } finally {
8597 dirtyComponents.length = 0;
8598 isBatchingUpdates = false;
8599 }
8600}
8601
8602/**
8603 * Mark a component as needing a rerender, adding an optional callback to a
8604 * list of functions which will be executed once the rerender occurs.
8605 */
8606function enqueueUpdate(component, callback) {
8607 invariant(
8608 !callback || typeof callback === "function",
8609 'enqueueUpdate(...): You called `setProps`, `replaceProps`, ' +
8610 '`setState`, `replaceState`, or `forceUpdate` with a callback that ' +
8611 'isn\'t callable.'
8612 );
8613
8614 if (!isBatchingUpdates) {
8615 component.performUpdateIfNecessary();
8616 callback && callback();
8617 return;
8618 }
8619
8620 dirtyComponents.push(component);
8621
8622 if (callback) {
8623 if (component._pendingCallbacks) {
8624 component._pendingCallbacks.push(callback);
8625 } else {
8626 component._pendingCallbacks = [callback];
8627 }
8628 }
8629}
8630
8631var ReactUpdates = {
8632 batchedUpdates: batchedUpdates,
8633 enqueueUpdate: enqueueUpdate
8634};
8635
8636module.exports = ReactUpdates;
8637
8638},{"./invariant":78}],50:[function(require,module,exports){
8639/**
8640 * Copyright 2013 Facebook, Inc.
8641 *
8642 * Licensed under the Apache License, Version 2.0 (the "License");
8643 * you may not use this file except in compliance with the License.
8644 * You may obtain a copy of the License at
8645 *
8646 * http://www.apache.org/licenses/LICENSE-2.0
8647 *
8648 * Unless required by applicable law or agreed to in writing, software
8649 * distributed under the License is distributed on an "AS IS" BASIS,
8650 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8651 * See the License for the specific language governing permissions and
8652 * limitations under the License.
8653 *
8654 * @providesModule SimpleEventPlugin
8655 */
8656
8657"use strict";
8658
8659var EventConstants = require("./EventConstants");
8660var EventPropagators = require("./EventPropagators");
8661var SyntheticEvent = require("./SyntheticEvent");
8662var SyntheticFocusEvent = require("./SyntheticFocusEvent");
8663var SyntheticKeyboardEvent = require("./SyntheticKeyboardEvent");
8664var SyntheticMouseEvent = require("./SyntheticMouseEvent");
8665var SyntheticMutationEvent = require("./SyntheticMutationEvent");
8666var SyntheticTouchEvent = require("./SyntheticTouchEvent");
8667var SyntheticUIEvent = require("./SyntheticUIEvent");
8668var SyntheticWheelEvent = require("./SyntheticWheelEvent");
8669
8670var invariant = require("./invariant");
8671var keyOf = require("./keyOf");
8672
8673var topLevelTypes = EventConstants.topLevelTypes;
8674
8675var eventTypes = {
8676 blur: {
8677 phasedRegistrationNames: {
8678 bubbled: keyOf({onBlur: true}),
8679 captured: keyOf({onBlurCapture: true})
8680 }
8681 },
8682 click: {
8683 phasedRegistrationNames: {
8684 bubbled: keyOf({onClick: true}),
8685 captured: keyOf({onClickCapture: true})
8686 }
8687 },
8688 doubleClick: {
8689 phasedRegistrationNames: {
8690 bubbled: keyOf({onDoubleClick: true}),
8691 captured: keyOf({onDoubleClickCapture: true})
8692 }
8693 },
8694 drag: {
8695 phasedRegistrationNames: {
8696 bubbled: keyOf({onDrag: true}),
8697 captured: keyOf({onDragCapture: true})
8698 }
8699 },
8700 dragEnd: {
8701 phasedRegistrationNames: {
8702 bubbled: keyOf({onDragEnd: true}),
8703 captured: keyOf({onDragEndCapture: true})
8704 }
8705 },
8706 dragEnter: {
8707 phasedRegistrationNames: {
8708 bubbled: keyOf({onDragEnter: true}),
8709 captured: keyOf({onDragEnterCapture: true})
8710 }
8711 },
8712 dragExit: {
8713 phasedRegistrationNames: {
8714 bubbled: keyOf({onDragExit: true}),
8715 captured: keyOf({onDragExitCapture: true})
8716 }
8717 },
8718 dragLeave: {
8719 phasedRegistrationNames: {
8720 bubbled: keyOf({onDragLeave: true}),
8721 captured: keyOf({onDragLeaveCapture: true})
8722 }
8723 },
8724 dragOver: {
8725 phasedRegistrationNames: {
8726 bubbled: keyOf({onDragOver: true}),
8727 captured: keyOf({onDragOverCapture: true})
8728 }
8729 },
8730 dragStart: {
8731 phasedRegistrationNames: {
8732 bubbled: keyOf({onDragStart: true}),
8733 captured: keyOf({onDragStartCapture: true})
8734 }
8735 },
8736 drop: {
8737 phasedRegistrationNames: {
8738 bubbled: keyOf({onDrop: true}),
8739 captured: keyOf({onDropCapture: true})
8740 }
8741 },
8742 DOMCharacterDataModified: {
8743 phasedRegistrationNames: {
8744 bubbled: keyOf({onDOMCharacterDataModified: true}),
8745 captured: keyOf({onDOMCharacterDataModifiedCapture: true})
8746 }
8747 },
8748 focus: {
8749 phasedRegistrationNames: {
8750 bubbled: keyOf({onFocus: true}),
8751 captured: keyOf({onFocusCapture: true})
8752 }
8753 },
8754 input: {
8755 phasedRegistrationNames: {
8756 bubbled: keyOf({onInput: true}),
8757 captured: keyOf({onInputCapture: true})
8758 }
8759 },
8760 keyDown: {
8761 phasedRegistrationNames: {
8762 bubbled: keyOf({onKeyDown: true}),
8763 captured: keyOf({onKeyDownCapture: true})
8764 }
8765 },
8766 keyPress: {
8767 phasedRegistrationNames: {
8768 bubbled: keyOf({onKeyPress: true}),
8769 captured: keyOf({onKeyPressCapture: true})
8770 }
8771 },
8772 keyUp: {
8773 phasedRegistrationNames: {
8774 bubbled: keyOf({onKeyUp: true}),
8775 captured: keyOf({onKeyUpCapture: true})
8776 }
8777 },
8778 // Note: We do not allow listening to mouseOver events. Instead, use the
8779 // onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.
8780 mouseDown: {
8781 phasedRegistrationNames: {
8782 bubbled: keyOf({onMouseDown: true}),
8783 captured: keyOf({onMouseDownCapture: true})
8784 }
8785 },
8786 mouseMove: {
8787 phasedRegistrationNames: {
8788 bubbled: keyOf({onMouseMove: true}),
8789 captured: keyOf({onMouseMoveCapture: true})
8790 }
8791 },
8792 mouseUp: {
8793 phasedRegistrationNames: {
8794 bubbled: keyOf({onMouseUp: true}),
8795 captured: keyOf({onMouseUpCapture: true})
8796 }
8797 },
8798 scroll: {
8799 phasedRegistrationNames: {
8800 bubbled: keyOf({onScroll: true}),
8801 captured: keyOf({onScrollCapture: true})
8802 }
8803 },
8804 submit: {
8805 phasedRegistrationNames: {
8806 bubbled: keyOf({onSubmit: true}),
8807 captured: keyOf({onSubmitCapture: true})
8808 }
8809 },
8810 touchCancel: {
8811 phasedRegistrationNames: {
8812 bubbled: keyOf({onTouchCancel: true}),
8813 captured: keyOf({onTouchCancelCapture: true})
8814 }
8815 },
8816 touchEnd: {
8817 phasedRegistrationNames: {
8818 bubbled: keyOf({onTouchEnd: true}),
8819 captured: keyOf({onTouchEndCapture: true})
8820 }
8821 },
8822 touchMove: {
8823 phasedRegistrationNames: {
8824 bubbled: keyOf({onTouchMove: true}),
8825 captured: keyOf({onTouchMoveCapture: true})
8826 }
8827 },
8828 touchStart: {
8829 phasedRegistrationNames: {
8830 bubbled: keyOf({onTouchStart: true}),
8831 captured: keyOf({onTouchStartCapture: true})
8832 }
8833 },
8834 wheel: {
8835 phasedRegistrationNames: {
8836 bubbled: keyOf({onWheel: true}),
8837 captured: keyOf({onWheelCapture: true})
8838 }
8839 }
8840};
8841
8842var topLevelEventsToDispatchConfig = {
8843 topBlur: eventTypes.blur,
8844 topClick: eventTypes.click,
8845 topDoubleClick: eventTypes.doubleClick,
8846 topDOMCharacterDataModified: eventTypes.DOMCharacterDataModified,
8847 topDrag: eventTypes.drag,
8848 topDragEnd: eventTypes.dragEnd,
8849 topDragEnter: eventTypes.dragEnter,
8850 topDragExit: eventTypes.dragExit,
8851 topDragLeave: eventTypes.dragLeave,
8852 topDragOver: eventTypes.dragOver,
8853 topDragStart: eventTypes.dragStart,
8854 topDrop: eventTypes.drop,
8855 topFocus: eventTypes.focus,
8856 topInput: eventTypes.input,
8857 topKeyDown: eventTypes.keyDown,
8858 topKeyPress: eventTypes.keyPress,
8859 topKeyUp: eventTypes.keyUp,
8860 topMouseDown: eventTypes.mouseDown,
8861 topMouseMove: eventTypes.mouseMove,
8862 topMouseUp: eventTypes.mouseUp,
8863 topScroll: eventTypes.scroll,
8864 topSubmit: eventTypes.submit,
8865 topTouchCancel: eventTypes.touchCancel,
8866 topTouchEnd: eventTypes.touchEnd,
8867 topTouchMove: eventTypes.touchMove,
8868 topTouchStart: eventTypes.touchStart,
8869 topWheel: eventTypes.wheel
8870};
8871
8872var SimpleEventPlugin = {
8873
8874 eventTypes: eventTypes,
8875
8876 /**
8877 * Same as the default implementation, except cancels the event when return
8878 * value is false.
8879 *
8880 * @param {object} Event to be dispatched.
8881 * @param {function} Application-level callback.
8882 * @param {string} domID DOM ID to pass to the callback.
8883 */
8884 executeDispatch: function(event, listener, domID) {
8885 var returnValue = listener(event, domID);
8886 if (returnValue === false) {
8887 event.stopPropagation();
8888 event.preventDefault();
8889 }
8890 },
8891
8892 /**
8893 * @param {string} topLevelType Record from `EventConstants`.
8894 * @param {DOMEventTarget} topLevelTarget The listening component root node.
8895 * @param {string} topLevelTargetID ID of `topLevelTarget`.
8896 * @param {object} nativeEvent Native browser event.
8897 * @return {*} An accumulation of synthetic events.
8898 * @see {EventPluginHub.extractEvents}
8899 */
8900 extractEvents: function(
8901 topLevelType,
8902 topLevelTarget,
8903 topLevelTargetID,
8904 nativeEvent) {
8905 var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
8906 if (!dispatchConfig) {
8907 return null;
8908 }
8909 var EventConstructor;
8910 switch(topLevelType) {
8911 case topLevelTypes.topInput:
8912 case topLevelTypes.topSubmit:
8913 // HTML Events
8914 // @see http://www.w3.org/TR/html5/index.html#events-0
8915 EventConstructor = SyntheticEvent;
8916 break;
8917 case topLevelTypes.topKeyDown:
8918 case topLevelTypes.topKeyPress:
8919 case topLevelTypes.topKeyUp:
8920 EventConstructor = SyntheticKeyboardEvent;
8921 break;
8922 case topLevelTypes.topBlur:
8923 case topLevelTypes.topFocus:
8924 EventConstructor = SyntheticFocusEvent;
8925 break;
8926 case topLevelTypes.topClick:
8927 case topLevelTypes.topDoubleClick:
8928 case topLevelTypes.topDrag:
8929 case topLevelTypes.topDragEnd:
8930 case topLevelTypes.topDragEnter:
8931 case topLevelTypes.topDragExit:
8932 case topLevelTypes.topDragLeave:
8933 case topLevelTypes.topDragOver:
8934 case topLevelTypes.topDragStart:
8935 case topLevelTypes.topDrop:
8936 case topLevelTypes.topMouseDown:
8937 case topLevelTypes.topMouseMove:
8938 case topLevelTypes.topMouseUp:
8939 EventConstructor = SyntheticMouseEvent;
8940 break;
8941 case topLevelTypes.topDOMCharacterDataModified:
8942 EventConstructor = SyntheticMutationEvent;
8943 break;
8944 case topLevelTypes.topTouchCancel:
8945 case topLevelTypes.topTouchEnd:
8946 case topLevelTypes.topTouchMove:
8947 case topLevelTypes.topTouchStart:
8948 EventConstructor = SyntheticTouchEvent;
8949 break;
8950 case topLevelTypes.topScroll:
8951 EventConstructor = SyntheticUIEvent;
8952 break;
8953 case topLevelTypes.topWheel:
8954 EventConstructor = SyntheticWheelEvent;
8955 break;
8956 }
8957 invariant(
8958 EventConstructor,
8959 'SimpleEventPlugin: Unhandled event type, `%s`.',
8960 topLevelType
8961 );
8962 var event = EventConstructor.getPooled(
8963 dispatchConfig,
8964 topLevelTargetID,
8965 nativeEvent
8966 );
8967 EventPropagators.accumulateTwoPhaseDispatches(event);
8968 return event;
8969 }
8970
8971};
8972
8973module.exports = SimpleEventPlugin;
8974
8975},{"./EventConstants":13,"./EventPropagators":18,"./SyntheticEvent":51,"./SyntheticFocusEvent":52,"./SyntheticKeyboardEvent":53,"./SyntheticMouseEvent":54,"./SyntheticMutationEvent":55,"./SyntheticTouchEvent":56,"./SyntheticUIEvent":57,"./SyntheticWheelEvent":58,"./invariant":78,"./keyOf":82}],51:[function(require,module,exports){
8976/**
8977 * Copyright 2013 Facebook, Inc.
8978 *
8979 * Licensed under the Apache License, Version 2.0 (the "License");
8980 * you may not use this file except in compliance with the License.
8981 * You may obtain a copy of the License at
8982 *
8983 * http://www.apache.org/licenses/LICENSE-2.0
8984 *
8985 * Unless required by applicable law or agreed to in writing, software
8986 * distributed under the License is distributed on an "AS IS" BASIS,
8987 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8988 * See the License for the specific language governing permissions and
8989 * limitations under the License.
8990 *
8991 * @providesModule SyntheticEvent
8992 * @typechecks static-only
8993 */
8994
8995"use strict";
8996
8997var PooledClass = require("./PooledClass");
8998
8999var emptyFunction = require("./emptyFunction");
9000var getEventTarget = require("./getEventTarget");
9001var merge = require("./merge");
9002var mergeInto = require("./mergeInto");
9003
9004/**
9005 * @interface Event
9006 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9007 */
9008var EventInterface = {
9009 type: null,
9010 target: getEventTarget,
9011 currentTarget: null,
9012 eventPhase: null,
9013 bubbles: null,
9014 cancelable: null,
9015 timeStamp: function(event) {
9016 return event.timeStamp || Date.now();
9017 },
9018 defaultPrevented: null,
9019 isTrusted: null
9020};
9021
9022/**
9023 * Synthetic events are dispatched by event plugins, typically in response to a
9024 * top-level event delegation handler.
9025 *
9026 * These systems should generally use pooling to reduce the frequency of garbage
9027 * collection. The system should check `isPersistent` to determine whether the
9028 * event should be released into the pool after being dispatched. Users that
9029 * need a persisted event should invoke `persist`.
9030 *
9031 * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
9032 * normalizing browser quirks. Subclasses do not necessarily have to implement a
9033 * DOM interface; custom application-specific events can also subclass this.
9034 *
9035 * @param {object} dispatchConfig Configuration used to dispatch this event.
9036 * @param {string} dispatchMarker Marker identifying the event target.
9037 * @param {object} nativeEvent Native browser event.
9038 */
9039function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9040 this.dispatchConfig = dispatchConfig;
9041 this.dispatchMarker = dispatchMarker;
9042 this.nativeEvent = nativeEvent;
9043
9044 var Interface = this.constructor.Interface;
9045 for (var propName in Interface) {
9046 if (!Interface.hasOwnProperty(propName)) {
9047 continue;
9048 }
9049 var normalize = Interface[propName];
9050 if (normalize) {
9051 this[propName] = normalize(nativeEvent);
9052 } else {
9053 this[propName] = nativeEvent[propName];
9054 }
9055 }
9056
9057 if (nativeEvent.defaultPrevented || nativeEvent.returnValue === false) {
9058 this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
9059 } else {
9060 this.isDefaultPrevented = emptyFunction.thatReturnsFalse;
9061 }
9062 this.isPropagationStopped = emptyFunction.thatReturnsFalse;
9063}
9064
9065mergeInto(SyntheticEvent.prototype, {
9066
9067 preventDefault: function() {
9068 this.defaultPrevented = true;
9069 var event = this.nativeEvent;
9070 event.preventDefault ? event.preventDefault() : event.returnValue = false;
9071 this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
9072 },
9073
9074 stopPropagation: function() {
9075 var event = this.nativeEvent;
9076 event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;
9077 this.isPropagationStopped = emptyFunction.thatReturnsTrue;
9078 },
9079
9080 /**
9081 * We release all dispatched `SyntheticEvent`s after each event loop, adding
9082 * them back into the pool. This allows a way to hold onto a reference that
9083 * won't be added back into the pool.
9084 */
9085 persist: function() {
9086 this.isPersistent = emptyFunction.thatReturnsTrue;
9087 },
9088
9089 /**
9090 * Checks if this event should be released back into the pool.
9091 *
9092 * @return {boolean} True if this should not be released, false otherwise.
9093 */
9094 isPersistent: emptyFunction.thatReturnsFalse,
9095
9096 /**
9097 * `PooledClass` looks for `destructor` on each instance it releases.
9098 */
9099 destructor: function() {
9100 var Interface = this.constructor.Interface;
9101 for (var propName in Interface) {
9102 this[propName] = null;
9103 }
9104 this.dispatchConfig = null;
9105 this.dispatchMarker = null;
9106 this.nativeEvent = null;
9107 }
9108
9109});
9110
9111SyntheticEvent.Interface = EventInterface;
9112
9113/**
9114 * Helper to reduce boilerplate when creating subclasses.
9115 *
9116 * @param {function} Class
9117 * @param {?object} Interface
9118 */
9119SyntheticEvent.augmentClass = function(Class, Interface) {
9120 var Super = this;
9121
9122 var prototype = Object.create(Super.prototype);
9123 mergeInto(prototype, Class.prototype);
9124 Class.prototype = prototype;
9125 Class.prototype.constructor = Class;
9126
9127 Class.Interface = merge(Super.Interface, Interface);
9128 Class.augmentClass = Super.augmentClass;
9129
9130 PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler);
9131};
9132
9133PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler);
9134
9135module.exports = SyntheticEvent;
9136
9137},{"./PooledClass":21,"./emptyFunction":66,"./getEventTarget":72,"./merge":84,"./mergeInto":86}],52:[function(require,module,exports){
9138/**
9139 * Copyright 2013 Facebook, Inc.
9140 *
9141 * Licensed under the Apache License, Version 2.0 (the "License");
9142 * you may not use this file except in compliance with the License.
9143 * You may obtain a copy of the License at
9144 *
9145 * http://www.apache.org/licenses/LICENSE-2.0
9146 *
9147 * Unless required by applicable law or agreed to in writing, software
9148 * distributed under the License is distributed on an "AS IS" BASIS,
9149 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9150 * See the License for the specific language governing permissions and
9151 * limitations under the License.
9152 *
9153 * @providesModule SyntheticFocusEvent
9154 * @typechecks static-only
9155 */
9156
9157"use strict";
9158
9159var SyntheticUIEvent = require("./SyntheticUIEvent");
9160
9161/**
9162 * @interface FocusEvent
9163 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9164 */
9165var FocusEventInterface = {
9166 relatedTarget: null
9167};
9168
9169/**
9170 * @param {object} dispatchConfig Configuration used to dispatch this event.
9171 * @param {string} dispatchMarker Marker identifying the event target.
9172 * @param {object} nativeEvent Native browser event.
9173 * @extends {SyntheticUIEvent}
9174 */
9175function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9176 SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9177}
9178
9179SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);
9180
9181module.exports = SyntheticFocusEvent;
9182
9183},{"./SyntheticUIEvent":57}],53:[function(require,module,exports){
9184/**
9185 * Copyright 2013 Facebook, Inc.
9186 *
9187 * Licensed under the Apache License, Version 2.0 (the "License");
9188 * you may not use this file except in compliance with the License.
9189 * You may obtain a copy of the License at
9190 *
9191 * http://www.apache.org/licenses/LICENSE-2.0
9192 *
9193 * Unless required by applicable law or agreed to in writing, software
9194 * distributed under the License is distributed on an "AS IS" BASIS,
9195 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9196 * See the License for the specific language governing permissions and
9197 * limitations under the License.
9198 *
9199 * @providesModule SyntheticKeyboardEvent
9200 * @typechecks static-only
9201 */
9202
9203"use strict";
9204
9205var SyntheticUIEvent = require("./SyntheticUIEvent");
9206
9207/**
9208 * @interface KeyboardEvent
9209 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9210 */
9211var KeyboardEventInterface = {
9212 'char': null,
9213 key: null,
9214 location: null,
9215 ctrlKey: null,
9216 shiftKey: null,
9217 altKey: null,
9218 metaKey: null,
9219 repeat: null,
9220 locale: null,
9221 // Legacy Interface
9222 charCode: null,
9223 keyCode: null,
9224 which: null
9225};
9226
9227/**
9228 * @param {object} dispatchConfig Configuration used to dispatch this event.
9229 * @param {string} dispatchMarker Marker identifying the event target.
9230 * @param {object} nativeEvent Native browser event.
9231 * @extends {SyntheticUIEvent}
9232 */
9233function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9234 SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9235}
9236
9237SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);
9238
9239module.exports = SyntheticKeyboardEvent;
9240
9241},{"./SyntheticUIEvent":57}],54:[function(require,module,exports){
9242/**
9243 * Copyright 2013 Facebook, Inc.
9244 *
9245 * Licensed under the Apache License, Version 2.0 (the "License");
9246 * you may not use this file except in compliance with the License.
9247 * You may obtain a copy of the License at
9248 *
9249 * http://www.apache.org/licenses/LICENSE-2.0
9250 *
9251 * Unless required by applicable law or agreed to in writing, software
9252 * distributed under the License is distributed on an "AS IS" BASIS,
9253 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9254 * See the License for the specific language governing permissions and
9255 * limitations under the License.
9256 *
9257 * @providesModule SyntheticMouseEvent
9258 * @typechecks static-only
9259 */
9260
9261"use strict";
9262
9263var SyntheticUIEvent = require("./SyntheticUIEvent");
9264var ViewportMetrics = require("./ViewportMetrics");
9265
9266/**
9267 * @interface MouseEvent
9268 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9269 */
9270var MouseEventInterface = {
9271 screenX: null,
9272 screenY: null,
9273 clientX: null,
9274 clientY: null,
9275 ctrlKey: null,
9276 shiftKey: null,
9277 altKey: null,
9278 metaKey: null,
9279 button: function(event) {
9280 // Webkit, Firefox, IE9+
9281 // which: 1 2 3
9282 // button: 0 1 2 (standard)
9283 var button = event.button;
9284 if ('which' in event) {
9285 return button;
9286 }
9287 // IE<9
9288 // which: undefined
9289 // button: 0 0 0
9290 // button: 1 4 2 (onmouseup)
9291 return button === 2 ? 2 : button === 4 ? 1 : 0;
9292 },
9293 buttons: null,
9294 relatedTarget: function(event) {
9295 return event.relatedTarget || (
9296 event.fromElement === event.srcElement ?
9297 event.toElement :
9298 event.fromElement
9299 );
9300 },
9301 // "Proprietary" Interface.
9302 pageX: function(event) {
9303 return 'pageX' in event ?
9304 event.pageX :
9305 event.clientX + ViewportMetrics.currentScrollLeft;
9306 },
9307 pageY: function(event) {
9308 return 'pageY' in event ?
9309 event.pageY :
9310 event.clientY + ViewportMetrics.currentScrollTop;
9311 }
9312};
9313
9314/**
9315 * @param {object} dispatchConfig Configuration used to dispatch this event.
9316 * @param {string} dispatchMarker Marker identifying the event target.
9317 * @param {object} nativeEvent Native browser event.
9318 * @extends {SyntheticUIEvent}
9319 */
9320function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9321 SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9322}
9323
9324SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);
9325
9326module.exports = SyntheticMouseEvent;
9327
9328},{"./SyntheticUIEvent":57,"./ViewportMetrics":60}],55:[function(require,module,exports){
9329/**
9330 * Copyright 2013 Facebook, Inc.
9331 *
9332 * Licensed under the Apache License, Version 2.0 (the "License");
9333 * you may not use this file except in compliance with the License.
9334 * You may obtain a copy of the License at
9335 *
9336 * http://www.apache.org/licenses/LICENSE-2.0
9337 *
9338 * Unless required by applicable law or agreed to in writing, software
9339 * distributed under the License is distributed on an "AS IS" BASIS,
9340 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9341 * See the License for the specific language governing permissions and
9342 * limitations under the License.
9343 *
9344 * @providesModule SyntheticMutationEvent
9345 * @typechecks static-only
9346 */
9347
9348"use strict";
9349
9350var SyntheticEvent = require("./SyntheticEvent");
9351
9352/**
9353 * @interface MutationEvent
9354 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9355 */
9356var MutationEventInterface = {
9357 relatedNode: null,
9358 prevValue: null,
9359 newValue: null,
9360 attrName: null,
9361 attrChange: null
9362};
9363
9364/**
9365 * @param {object} dispatchConfig Configuration used to dispatch this event.
9366 * @param {string} dispatchMarker Marker identifying the event target.
9367 * @param {object} nativeEvent Native browser event.
9368 * @extends {SyntheticEvent}
9369 */
9370function SyntheticMutationEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9371 SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9372}
9373
9374SyntheticEvent.augmentClass(SyntheticMutationEvent, MutationEventInterface);
9375
9376module.exports = SyntheticMutationEvent;
9377
9378},{"./SyntheticEvent":51}],56:[function(require,module,exports){
9379/**
9380 * Copyright 2013 Facebook, Inc.
9381 *
9382 * Licensed under the Apache License, Version 2.0 (the "License");
9383 * you may not use this file except in compliance with the License.
9384 * You may obtain a copy of the License at
9385 *
9386 * http://www.apache.org/licenses/LICENSE-2.0
9387 *
9388 * Unless required by applicable law or agreed to in writing, software
9389 * distributed under the License is distributed on an "AS IS" BASIS,
9390 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9391 * See the License for the specific language governing permissions and
9392 * limitations under the License.
9393 *
9394 * @providesModule SyntheticTouchEvent
9395 * @typechecks static-only
9396 */
9397
9398"use strict";
9399
9400var SyntheticUIEvent = require("./SyntheticUIEvent");
9401
9402/**
9403 * @interface TouchEvent
9404 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9405 */
9406var TouchEventInterface = {
9407 touches: null,
9408 targetTouches: null,
9409 changedTouches: null,
9410 altKey: null,
9411 metaKey: null,
9412 ctrlKey: null,
9413 shiftKey: null
9414};
9415
9416/**
9417 * @param {object} dispatchConfig Configuration used to dispatch this event.
9418 * @param {string} dispatchMarker Marker identifying the event target.
9419 * @param {object} nativeEvent Native browser event.
9420 * @extends {SyntheticUIEvent}
9421 */
9422function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9423 SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9424}
9425
9426SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);
9427
9428module.exports = SyntheticTouchEvent;
9429
9430},{"./SyntheticUIEvent":57}],57:[function(require,module,exports){
9431/**
9432 * Copyright 2013 Facebook, Inc.
9433 *
9434 * Licensed under the Apache License, Version 2.0 (the "License");
9435 * you may not use this file except in compliance with the License.
9436 * You may obtain a copy of the License at
9437 *
9438 * http://www.apache.org/licenses/LICENSE-2.0
9439 *
9440 * Unless required by applicable law or agreed to in writing, software
9441 * distributed under the License is distributed on an "AS IS" BASIS,
9442 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9443 * See the License for the specific language governing permissions and
9444 * limitations under the License.
9445 *
9446 * @providesModule SyntheticUIEvent
9447 * @typechecks static-only
9448 */
9449
9450"use strict";
9451
9452var SyntheticEvent = require("./SyntheticEvent");
9453
9454/**
9455 * @interface UIEvent
9456 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9457 */
9458var UIEventInterface = {
9459 view: null,
9460 detail: null
9461};
9462
9463/**
9464 * @param {object} dispatchConfig Configuration used to dispatch this event.
9465 * @param {string} dispatchMarker Marker identifying the event target.
9466 * @param {object} nativeEvent Native browser event.
9467 * @extends {SyntheticEvent}
9468 */
9469function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9470 SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9471}
9472
9473SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);
9474
9475module.exports = SyntheticUIEvent;
9476
9477},{"./SyntheticEvent":51}],58:[function(require,module,exports){
9478/**
9479 * Copyright 2013 Facebook, Inc.
9480 *
9481 * Licensed under the Apache License, Version 2.0 (the "License");
9482 * you may not use this file except in compliance with the License.
9483 * You may obtain a copy of the License at
9484 *
9485 * http://www.apache.org/licenses/LICENSE-2.0
9486 *
9487 * Unless required by applicable law or agreed to in writing, software
9488 * distributed under the License is distributed on an "AS IS" BASIS,
9489 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9490 * See the License for the specific language governing permissions and
9491 * limitations under the License.
9492 *
9493 * @providesModule SyntheticWheelEvent
9494 * @typechecks static-only
9495 */
9496
9497"use strict";
9498
9499var SyntheticMouseEvent = require("./SyntheticMouseEvent");
9500
9501/**
9502 * @interface WheelEvent
9503 * @see http://www.w3.org/TR/DOM-Level-3-Events/
9504 */
9505var WheelEventInterface = {
9506 deltaX: function(event) {
9507 // NOTE: IE<9 does not support x-axis delta.
9508 return (
9509 'deltaX' in event ? event.deltaX :
9510 // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
9511 'wheelDeltaX' in event ? -event.wheelDeltaX : 0
9512 );
9513 },
9514 deltaY: function(event) {
9515 return (
9516 // Normalize (up is positive).
9517 'deltaY' in event ? -event.deltaY :
9518 // Fallback to `wheelDeltaY` for Webkit.
9519 'wheelDeltaY' in event ? event.wheelDeltaY :
9520 // Fallback to `wheelDelta` for IE<9.
9521 'wheelDelta' in event ? event.wheelData : 0
9522 );
9523 },
9524 deltaZ: null,
9525 deltaMode: null
9526};
9527
9528/**
9529 * @param {object} dispatchConfig Configuration used to dispatch this event.
9530 * @param {string} dispatchMarker Marker identifying the event target.
9531 * @param {object} nativeEvent Native browser event.
9532 * @extends {SyntheticMouseEvent}
9533 */
9534function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) {
9535 SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
9536}
9537
9538SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);
9539
9540module.exports = SyntheticWheelEvent;
9541
9542},{"./SyntheticMouseEvent":54}],59:[function(require,module,exports){
9543(function(){/**
9544 * Copyright 2013 Facebook, Inc.
9545 *
9546 * Licensed under the Apache License, Version 2.0 (the "License");
9547 * you may not use this file except in compliance with the License.
9548 * You may obtain a copy of the License at
9549 *
9550 * http://www.apache.org/licenses/LICENSE-2.0
9551 *
9552 * Unless required by applicable law or agreed to in writing, software
9553 * distributed under the License is distributed on an "AS IS" BASIS,
9554 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9555 * See the License for the specific language governing permissions and
9556 * limitations under the License.
9557 *
9558 * @providesModule Transaction
9559 */
9560
9561"use strict";
9562
9563var invariant = require("./invariant");
9564
9565/**
9566 * `Transaction` creates a black box that is able to wrap any method such that
9567 * certain invariants are maintained before and after the method is invoked
9568 * (Even if an exception is thrown while invoking the wrapped method). Whoever
9569 * instantiates a transaction can provide enforcers of the invariants at
9570 * creation time. The `Transaction` class itself will supply one additional
9571 * automatic invariant for you - the invariant that any transaction instance
9572 * should not be ran while it is already being ran. You would typically create a
9573 * single instance of a `Transaction` for reuse multiple times, that potentially
9574 * is used to wrap several different methods. Wrappers are extremely simple -
9575 * they only require implementing two methods.
9576 *
9577 * <pre>
9578 * wrappers (injected at creation time)
9579 * + +
9580 * | |
9581 * +-----------------|--------|--------------+
9582 * | v | |
9583 * | +---------------+ | |
9584 * | +--| wrapper1 |---|----+ |
9585 * | | +---------------+ v | |
9586 * | | +-------------+ | |
9587 * | | +----| wrapper2 |--------+ |
9588 * | | | +-------------+ | | |
9589 * | | | | | |
9590 * | v v v v | wrapper
9591 * | +---+ +---+ +---------+ +---+ +---+ | invariants
9592 * perform(anyMethod) | | | | | | | | | | | | maintained
9593 * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
9594 * | | | | | | | | | | | |
9595 * | | | | | | | | | | | |
9596 * | | | | | | | | | | | |
9597 * | +---+ +---+ +---------+ +---+ +---+ |
9598 * | initialize close |
9599 * +-----------------------------------------+
9600 * </pre>
9601 *
9602 * Bonus:
9603 * - Reports timing metrics by method name and wrapper index.
9604 *
9605 * Use cases:
9606 * - Preserving the input selection ranges before/after reconciliation.
9607 * Restoring selection even in the event of an unexpected error.
9608 * - Deactivating events while rearranging the DOM, preventing blurs/focuses,
9609 * while guaranteeing that afterwards, the event system is reactivated.
9610 * - Flushing a queue of collected DOM mutations to the main UI thread after a
9611 * reconciliation takes place in a worker thread.
9612 * - Invoking any collected `componentDidRender` callbacks after rendering new
9613 * content.
9614 * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue
9615 * to preserve the `scrollTop` (an automatic scroll aware DOM).
9616 * - (Future use case): Layout calculations before and after DOM upates.
9617 *
9618 * Transactional plugin API:
9619 * - A module that has an `initialize` method that returns any precomputation.
9620 * - and a `close` method that accepts the precomputation. `close` is invoked
9621 * when the wrapped process is completed, or has failed.
9622 *
9623 * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules
9624 * that implement `initialize` and `close`.
9625 * @return {Transaction} Single transaction for reuse in thread.
9626 *
9627 * @class Transaction
9628 */
9629var Mixin = {
9630 /**
9631 * Sets up this instance so that it is prepared for collecting metrics. Does
9632 * so such that this setup method may be used on an instance that is already
9633 * initialized, in a way that does not consume additional memory upon reuse.
9634 * That can be useful if you decide to make your subclass of this mixin a
9635 * "PooledClass".
9636 */
9637 reinitializeTransaction: function() {
9638 this.transactionWrappers = this.getTransactionWrappers();
9639 if (!this.wrapperInitData) {
9640 this.wrapperInitData = [];
9641 } else {
9642 this.wrapperInitData.length = 0;
9643 }
9644 if (!this.timingMetrics) {
9645 this.timingMetrics = {};
9646 }
9647 this.timingMetrics.methodInvocationTime = 0;
9648 if (!this.timingMetrics.wrapperInitTimes) {
9649 this.timingMetrics.wrapperInitTimes = [];
9650 } else {
9651 this.timingMetrics.wrapperInitTimes.length = 0;
9652 }
9653 if (!this.timingMetrics.wrapperCloseTimes) {
9654 this.timingMetrics.wrapperCloseTimes = [];
9655 } else {
9656 this.timingMetrics.wrapperCloseTimes.length = 0;
9657 }
9658 this._isInTransaction = false;
9659 },
9660
9661 _isInTransaction: false,
9662
9663 /**
9664 * @abstract
9665 * @return {Array<TransactionWrapper>} Array of transaction wrappers.
9666 */
9667 getTransactionWrappers: null,
9668
9669 isInTransaction: function() {
9670 return !!this._isInTransaction;
9671 },
9672
9673 /**
9674 * Executes the function within a safety window. Use this for the top level
9675 * methods that result in large amounts of computation/mutations that would
9676 * need to be safety checked.
9677 *
9678 * @param {function} method Member of scope to call.
9679 * @param {Object} scope Scope to invoke from.
9680 * @param {Object?=} args... Arguments to pass to the method (optional).
9681 * Helps prevent need to bind in many cases.
9682 * @return Return value from `method`.
9683 */
9684 perform: function(method, scope, a, b, c, d, e, f) {
9685 invariant(
9686 !this.isInTransaction(),
9687 'Transaction.perform(...): Cannot initialize a transaction when there ' +
9688 'is already an outstanding transaction.'
9689 );
9690 var memberStart = Date.now();
9691 var errorToThrow = null;
9692 var ret;
9693 try {
9694 this.initializeAll();
9695 ret = method.call(scope, a, b, c, d, e, f);
9696 } catch (error) {
9697 // IE8 requires `catch` in order to use `finally`.
9698 errorToThrow = error;
9699 } finally {
9700 var memberEnd = Date.now();
9701 this.methodInvocationTime += (memberEnd - memberStart);
9702 try {
9703 this.closeAll();
9704 } catch (closeError) {
9705 // If `method` throws, prefer to show that stack trace over any thrown
9706 // by invoking `closeAll`.
9707 errorToThrow = errorToThrow || closeError;
9708 }
9709 }
9710 if (errorToThrow) {
9711 throw errorToThrow;
9712 }
9713 return ret;
9714 },
9715
9716 initializeAll: function() {
9717 this._isInTransaction = true;
9718 var transactionWrappers = this.transactionWrappers;
9719 var wrapperInitTimes = this.timingMetrics.wrapperInitTimes;
9720 var errorToThrow = null;
9721 for (var i = 0; i < transactionWrappers.length; i++) {
9722 var initStart = Date.now();
9723 var wrapper = transactionWrappers[i];
9724 try {
9725 this.wrapperInitData[i] = wrapper.initialize ?
9726 wrapper.initialize.call(this) :
9727 null;
9728 } catch (initError) {
9729 // Prefer to show the stack trace of the first error.
9730 errorToThrow = errorToThrow || initError;
9731 this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;
9732 } finally {
9733 var curInitTime = wrapperInitTimes[i];
9734 var initEnd = Date.now();
9735 wrapperInitTimes[i] = (curInitTime || 0) + (initEnd - initStart);
9736 }
9737 }
9738 if (errorToThrow) {
9739 throw errorToThrow;
9740 }
9741 },
9742
9743 /**
9744 * Invokes each of `this.transactionWrappers.close[i]` functions, passing into
9745 * them the respective return values of `this.transactionWrappers.init[i]`
9746 * (`close`rs that correspond to initializers that failed will not be
9747 * invoked).
9748 */
9749 closeAll: function() {
9750 invariant(
9751 this.isInTransaction(),
9752 'Transaction.closeAll(): Cannot close transaction when none are open.'
9753 );
9754 var transactionWrappers = this.transactionWrappers;
9755 var wrapperCloseTimes = this.timingMetrics.wrapperCloseTimes;
9756 var errorToThrow = null;
9757 for (var i = 0; i < transactionWrappers.length; i++) {
9758 var wrapper = transactionWrappers[i];
9759 var closeStart = Date.now();
9760 var initData = this.wrapperInitData[i];
9761 try {
9762 if (initData !== Transaction.OBSERVED_ERROR) {
9763 wrapper.close && wrapper.close.call(this, initData);
9764 }
9765 } catch (closeError) {
9766 // Prefer to show the stack trace of the first error.
9767 errorToThrow = errorToThrow || closeError;
9768 } finally {
9769 var closeEnd = Date.now();
9770 var curCloseTime = wrapperCloseTimes[i];
9771 wrapperCloseTimes[i] = (curCloseTime || 0) + (closeEnd - closeStart);
9772 }
9773 }
9774 this.wrapperInitData.length = 0;
9775 this._isInTransaction = false;
9776 if (errorToThrow) {
9777 throw errorToThrow;
9778 }
9779 }
9780};
9781
9782var Transaction = {
9783
9784 Mixin: Mixin,
9785
9786 /**
9787 * Token to look for to determine if an error occured.
9788 */
9789 OBSERVED_ERROR: {}
9790
9791};
9792
9793module.exports = Transaction;
9794
9795})()
9796},{"./invariant":78}],60:[function(require,module,exports){
9797/**
9798 * Copyright 2013 Facebook, Inc.
9799 *
9800 * Licensed under the Apache License, Version 2.0 (the "License");
9801 * you may not use this file except in compliance with the License.
9802 * You may obtain a copy of the License at
9803 *
9804 * http://www.apache.org/licenses/LICENSE-2.0
9805 *
9806 * Unless required by applicable law or agreed to in writing, software
9807 * distributed under the License is distributed on an "AS IS" BASIS,
9808 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9809 * See the License for the specific language governing permissions and
9810 * limitations under the License.
9811 *
9812 * @providesModule ViewportMetrics
9813 */
9814
9815"use strict";
9816
9817var ViewportMetrics = {
9818
9819 currentScrollLeft: 0,
9820
9821 currentScrollTop: 0,
9822
9823 refreshScrollValues: function() {
9824 ViewportMetrics.currentScrollLeft =
9825 document.body.scrollLeft + document.documentElement.scrollLeft;
9826 ViewportMetrics.currentScrollTop =
9827 document.body.scrollTop + document.documentElement.scrollTop;
9828 }
9829
9830};
9831
9832module.exports = ViewportMetrics;
9833
9834},{}],61:[function(require,module,exports){
9835/**
9836 * Copyright 2013 Facebook, Inc.
9837 *
9838 * Licensed under the Apache License, Version 2.0 (the "License");
9839 * you may not use this file except in compliance with the License.
9840 * You may obtain a copy of the License at
9841 *
9842 * http://www.apache.org/licenses/LICENSE-2.0
9843 *
9844 * Unless required by applicable law or agreed to in writing, software
9845 * distributed under the License is distributed on an "AS IS" BASIS,
9846 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9847 * See the License for the specific language governing permissions and
9848 * limitations under the License.
9849 *
9850 * @providesModule accumulate
9851 */
9852
9853"use strict";
9854
9855var invariant = require("./invariant");
9856
9857/**
9858 * Accumulates items that must not be null or undefined.
9859 *
9860 * This is used to conserve memory by avoiding array allocations.
9861 *
9862 * @return {*|array<*>} An accumulation of items.
9863 */
9864function accumulate(current, next) {
9865 invariant(
9866 next != null,
9867 'accumulate(...): Accumulated items must be not be null or undefined.'
9868 );
9869 if (current == null) {
9870 return next;
9871 } else {
9872 // Both are not empty. Warning: Never call x.concat(y) when you are not
9873 // certain that x is an Array (x could be a string with concat method).
9874 var currentIsArray = Array.isArray(current);
9875 var nextIsArray = Array.isArray(next);
9876 if (currentIsArray) {
9877 return current.concat(next);
9878 } else {
9879 if (nextIsArray) {
9880 return [current].concat(next);
9881 } else {
9882 return [current, next];
9883 }
9884 }
9885 }
9886}
9887
9888module.exports = accumulate;
9889
9890},{"./invariant":78}],62:[function(require,module,exports){
9891/**
9892 * Copyright 2013 Facebook, Inc.
9893 *
9894 * Licensed under the Apache License, Version 2.0 (the "License");
9895 * you may not use this file except in compliance with the License.
9896 * You may obtain a copy of the License at
9897 *
9898 * http://www.apache.org/licenses/LICENSE-2.0
9899 *
9900 * Unless required by applicable law or agreed to in writing, software
9901 * distributed under the License is distributed on an "AS IS" BASIS,
9902 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9903 * See the License for the specific language governing permissions and
9904 * limitations under the License.
9905 *
9906 * @providesModule adler32
9907 */
9908
9909"use strict";
9910
9911var MOD = 65521;
9912
9913// This is a clean-room implementation of adler32 designed for detecting
9914// if markup is not what we expect it to be. It does not need to be
9915// cryptographically strong, only reasonable good at detecting if markup
9916// generated on the server is different than that on the client.
9917function adler32(data) {
9918 var a = 1;
9919 var b = 0;
9920 for (var i = 0; i < data.length; i++) {
9921 a = (a + data.charCodeAt(i)) % MOD;
9922 b = (b + a) % MOD;
9923 }
9924 return a | (b << 16);
9925}
9926
9927module.exports = adler32;
9928
9929},{}],63:[function(require,module,exports){
9930/**
9931 * Copyright 2013 Facebook, Inc.
9932 *
9933 * Licensed under the Apache License, Version 2.0 (the "License");
9934 * you may not use this file except in compliance with the License.
9935 * You may obtain a copy of the License at
9936 *
9937 * http://www.apache.org/licenses/LICENSE-2.0
9938 *
9939 * Unless required by applicable law or agreed to in writing, software
9940 * distributed under the License is distributed on an "AS IS" BASIS,
9941 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9942 * See the License for the specific language governing permissions and
9943 * limitations under the License.
9944 *
9945 * @providesModule copyProperties
9946 */
9947
9948/**
9949 * Copy properties from one or more objects (up to 5) into the first object.
9950 * This is a shallow copy. It mutates the first object and also returns it.
9951 *
9952 * NOTE: `arguments` has a very significant performance penalty, which is why
9953 * we don't support unlimited arguments.
9954 */
9955function copyProperties(obj, a, b, c, d, e, f) {
9956 obj = obj || {};
9957
9958 if (true) {
9959 if (f) {
9960 throw new Error('Too many arguments passed to copyProperties');
9961 }
9962 }
9963
9964 var args = [a, b, c, d, e];
9965 var ii = 0, v;
9966 while (args[ii]) {
9967 v = args[ii++];
9968 for (var k in v) {
9969 obj[k] = v[k];
9970 }
9971
9972 // IE ignores toString in object iteration.. See:
9973 // webreflection.blogspot.com/2007/07/quick-fix-internet-explorer-and.html
9974 if (v.hasOwnProperty && v.hasOwnProperty('toString') &&
9975 (typeof v.toString != 'undefined') && (obj.toString !== v.toString)) {
9976 obj.toString = v.toString;
9977 }
9978 }
9979
9980 return obj;
9981}
9982
9983module.exports = copyProperties;
9984
9985},{}],64:[function(require,module,exports){
9986/**
9987 * Copyright 2013 Facebook, Inc.
9988 *
9989 * Licensed under the Apache License, Version 2.0 (the "License");
9990 * you may not use this file except in compliance with the License.
9991 * You may obtain a copy of the License at
9992 *
9993 * http://www.apache.org/licenses/LICENSE-2.0
9994 *
9995 * Unless required by applicable law or agreed to in writing, software
9996 * distributed under the License is distributed on an "AS IS" BASIS,
9997 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9998 * See the License for the specific language governing permissions and
9999 * limitations under the License.
10000 *
10001 * @providesModule createObjectFrom
10002 */
10003
10004var hasArrayNature = require("./hasArrayNature");
10005
10006/**
10007 * Construct an object from an array of keys
10008 * and optionally specified value or list of values.
10009 *
10010 * >>> createObjectFrom(['a','b','c']);
10011 * {a: true, b: true, c: true}
10012 *
10013 * >>> createObjectFrom(['a','b','c'], false);
10014 * {a: false, b: false, c: false}
10015 *
10016 * >>> createObjectFrom(['a','b','c'], 'monkey');
10017 * {c:'monkey', b:'monkey' c:'monkey'}
10018 *
10019 * >>> createObjectFrom(['a','b','c'], [1,2,3]);
10020 * {a: 1, b: 2, c: 3}
10021 *
10022 * >>> createObjectFrom(['women', 'men'], [true, false]);
10023 * {women: true, men: false}
10024 *
10025 * @param Array list of keys
10026 * @param mixed optional value or value array. defaults true.
10027 * @returns object
10028 */
10029function createObjectFrom(keys, values /* = true */) {
10030 if (true) {
10031 if (!hasArrayNature(keys)) {
10032 throw new TypeError('Must pass an array of keys.');
10033 }
10034 }
10035
10036 var object = {};
10037 var is_array = hasArrayNature(values);
10038 if (typeof values == 'undefined') {
10039 values = true;
10040 }
10041
10042 for (var ii = keys.length; ii--;) {
10043 object[keys[ii]] = is_array ? values[ii] : values;
10044 }
10045 return object;
10046}
10047
10048module.exports = createObjectFrom;
10049
10050},{"./hasArrayNature":75}],65:[function(require,module,exports){
10051/**
10052 * Copyright 2013 Facebook, Inc.
10053 *
10054 * Licensed under the Apache License, Version 2.0 (the "License");
10055 * you may not use this file except in compliance with the License.
10056 * You may obtain a copy of the License at
10057 *
10058 * http://www.apache.org/licenses/LICENSE-2.0
10059 *
10060 * Unless required by applicable law or agreed to in writing, software
10061 * distributed under the License is distributed on an "AS IS" BASIS,
10062 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10063 * See the License for the specific language governing permissions and
10064 * limitations under the License.
10065 *
10066 * @providesModule dangerousStyleValue
10067 * @typechecks static-only
10068 */
10069
10070"use strict";
10071
10072var CSSProperty = require("./CSSProperty");
10073
10074/**
10075 * Convert a value into the proper css writable value. The `styleName` name
10076 * name should be logical (no hyphens), as specified
10077 * in `CSSProperty.isUnitlessNumber`.
10078 *
10079 * @param {string} styleName CSS property name such as `topMargin`.
10080 * @param {*} value CSS property value such as `10px`.
10081 * @return {string} Normalized style value with dimensions applied.
10082 */
10083function dangerousStyleValue(styleName, value) {
10084 // Note that we've removed escapeTextForBrowser() calls here since the
10085 // whole string will be escaped when the attribute is injected into
10086 // the markup. If you provide unsafe user data here they can inject
10087 // arbitrary CSS which may be problematic (I couldn't repro this):
10088 // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
10089 // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
10090 // This is not an XSS hole but instead a potential CSS injection issue
10091 // which has lead to a greater discussion about how we're going to
10092 // trust URLs moving forward. See #2115901
10093
10094 var isEmpty = value == null || typeof value === 'boolean' || value === '';
10095 if (isEmpty) {
10096 return '';
10097 }
10098
10099 var isNonNumeric = isNaN(value);
10100 if (isNonNumeric || value === 0 || CSSProperty.isUnitlessNumber[styleName]) {
10101 return '' + value; // cast to string
10102 }
10103
10104 return value + 'px';
10105}
10106
10107module.exports = dangerousStyleValue;
10108
10109},{"./CSSProperty":2}],66:[function(require,module,exports){
10110/**
10111 * Copyright 2013 Facebook, Inc.
10112 *
10113 * Licensed under the Apache License, Version 2.0 (the "License");
10114 * you may not use this file except in compliance with the License.
10115 * You may obtain a copy of the License at
10116 *
10117 * http://www.apache.org/licenses/LICENSE-2.0
10118 *
10119 * Unless required by applicable law or agreed to in writing, software
10120 * distributed under the License is distributed on an "AS IS" BASIS,
10121 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10122 * See the License for the specific language governing permissions and
10123 * limitations under the License.
10124 *
10125 * @providesModule emptyFunction
10126 */
10127
10128var copyProperties = require("./copyProperties");
10129
10130function makeEmptyFunction(arg) {
10131 return function() {
10132 return arg;
10133 };
10134}
10135
10136/**
10137 * This function accepts and discards inputs; it has no side effects. This is
10138 * primarily useful idiomatically for overridable function endpoints which
10139 * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
10140 */
10141function emptyFunction() {}
10142
10143copyProperties(emptyFunction, {
10144 thatReturns: makeEmptyFunction,
10145 thatReturnsFalse: makeEmptyFunction(false),
10146 thatReturnsTrue: makeEmptyFunction(true),
10147 thatReturnsNull: makeEmptyFunction(null),
10148 thatReturnsThis: function() { return this; },
10149 thatReturnsArgument: function(arg) { return arg; }
10150});
10151
10152module.exports = emptyFunction;
10153
10154},{"./copyProperties":63}],67:[function(require,module,exports){
10155/**
10156 * Copyright 2013 Facebook, Inc.
10157 *
10158 * Licensed under the Apache License, Version 2.0 (the "License");
10159 * you may not use this file except in compliance with the License.
10160 * You may obtain a copy of the License at
10161 *
10162 * http://www.apache.org/licenses/LICENSE-2.0
10163 *
10164 * Unless required by applicable law or agreed to in writing, software
10165 * distributed under the License is distributed on an "AS IS" BASIS,
10166 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10167 * See the License for the specific language governing permissions and
10168 * limitations under the License.
10169 *
10170 * @providesModule escapeTextForBrowser
10171 * @typechecks static-only
10172 */
10173
10174"use strict";
10175
10176var invariant = require("./invariant");
10177
10178var ESCAPE_LOOKUP = {
10179 "&": "&amp;",
10180 ">": "&gt;",
10181 "<": "&lt;",
10182 "\"": "&quot;",
10183 "'": "&#x27;",
10184 "/": "&#x2f;"
10185};
10186
10187function escaper(match) {
10188 return ESCAPE_LOOKUP[match];
10189}
10190
10191/**
10192 * Escapes text to prevent scripting attacks.
10193 *
10194 * @param {number|string} text Text value to escape.
10195 * @return {string} An escaped string.
10196 */
10197function escapeTextForBrowser(text) {
10198 var type = typeof text;
10199 invariant(
10200 type !== 'object',
10201 'escapeTextForBrowser(...): Attempted to escape an object.'
10202 );
10203 if (text === '') {
10204 return '';
10205 } else {
10206 if (type === 'string') {
10207 return text.replace(/[&><"'\/]/g, escaper);
10208 } else {
10209 return (''+text).replace(/[&><"'\/]/g, escaper);
10210 }
10211 }
10212}
10213
10214module.exports = escapeTextForBrowser;
10215
10216},{"./invariant":78}],68:[function(require,module,exports){
10217/**
10218 * Copyright 2013 Facebook, Inc.
10219 *
10220 * Licensed under the Apache License, Version 2.0 (the "License");
10221 * you may not use this file except in compliance with the License.
10222 * You may obtain a copy of the License at
10223 *
10224 * http://www.apache.org/licenses/LICENSE-2.0
10225 *
10226 * Unless required by applicable law or agreed to in writing, software
10227 * distributed under the License is distributed on an "AS IS" BASIS,
10228 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10229 * See the License for the specific language governing permissions and
10230 * limitations under the License.
10231 *
10232 * @providesModule ex
10233 * @typechecks
10234 * @nostacktrace
10235 */
10236
10237/**
10238 * This function transforms error message with arguments into plain text error
10239 * message, so that it can be passed to window.onerror without losing anything.
10240 * It can then be transformed back by `erx()` function.
10241 *
10242 * Usage:
10243 * throw new Error(ex('Error %s from %s', errorCode, userID));
10244 *
10245 * @param {string} errorMessage
10246 */
10247
10248var ex = function(errorMessage/*, arg1, arg2, ...*/) {
10249 var args = Array.prototype.slice.call(arguments).map(function(arg) {
10250 return String(arg);
10251 });
10252 var expectedLength = errorMessage.split('%s').length - 1;
10253
10254 if (expectedLength !== args.length - 1) {
10255 // something wrong with the formatting string
10256 return ex('ex args number mismatch: %s', JSON.stringify(args));
10257 }
10258
10259 return ex._prefix + JSON.stringify(args) + ex._suffix;
10260};
10261
10262ex._prefix = '<![EX[';
10263ex._suffix = ']]>';
10264
10265module.exports = ex;
10266
10267},{}],69:[function(require,module,exports){
10268/**
10269 * Copyright 2013 Facebook, Inc.
10270 *
10271 * Licensed under the Apache License, Version 2.0 (the "License");
10272 * you may not use this file except in compliance with the License.
10273 * You may obtain a copy of the License at
10274 *
10275 * http://www.apache.org/licenses/LICENSE-2.0
10276 *
10277 * Unless required by applicable law or agreed to in writing, software
10278 * distributed under the License is distributed on an "AS IS" BASIS,
10279 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10280 * See the License for the specific language governing permissions and
10281 * limitations under the License.
10282 *
10283 * @providesModule flattenChildren
10284 */
10285
10286"use strict";
10287
10288var invariant = require("./invariant");
10289var traverseAllChildren = require("./traverseAllChildren");
10290
10291/**
10292 * @param {function} traverseContext Context passed through traversal.
10293 * @param {?ReactComponent} child React child component.
10294 * @param {!string} name String name of key path to child.
10295 */
10296function flattenSingleChildIntoContext(traverseContext, child, name) {
10297 // We found a component instance.
10298 var result = traverseContext;
10299 invariant(
10300 !result.hasOwnProperty(name),
10301 'flattenChildren(...): Encountered two children with the same key, `%s`. ' +
10302 'Children keys must be unique.',
10303 name
10304 );
10305 result[name] = child;
10306}
10307
10308/**
10309 * Flattens children that are typically specified as `props.children`.
10310 * @return {!object} flattened children keyed by name.
10311 */
10312function flattenChildren(children) {
10313 if (children == null) {
10314 return children;
10315 }
10316 var result = {};
10317 traverseAllChildren(children, flattenSingleChildIntoContext, result);
10318 return result;
10319}
10320
10321module.exports = flattenChildren;
10322
10323},{"./invariant":78,"./traverseAllChildren":90}],70:[function(require,module,exports){
10324/**
10325 * Copyright 2013 Facebook, Inc.
10326 *
10327 * Licensed under the Apache License, Version 2.0 (the "License");
10328 * you may not use this file except in compliance with the License.
10329 * You may obtain a copy of the License at
10330 *
10331 * http://www.apache.org/licenses/LICENSE-2.0
10332 *
10333 * Unless required by applicable law or agreed to in writing, software
10334 * distributed under the License is distributed on an "AS IS" BASIS,
10335 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10336 * See the License for the specific language governing permissions and
10337 * limitations under the License.
10338 *
10339 * @providesModule forEachAccumulated
10340 */
10341
10342"use strict";
10343
10344/**
10345 * @param {array} an "accumulation" of items which is either an Array or
10346 * a single item. Useful when paired with the `accumulate` module. This is a
10347 * simple utility that allows us to reason about a collection of items, but
10348 * handling the case when there is exactly one item (and we do not need to
10349 * allocate an array).
10350 */
10351var forEachAccumulated = function(arr, cb, scope) {
10352 if (Array.isArray(arr)) {
10353 arr.forEach(cb, scope);
10354 } else if (arr) {
10355 cb.call(scope, arr);
10356 }
10357};
10358
10359module.exports = forEachAccumulated;
10360
10361},{}],71:[function(require,module,exports){
10362/**
10363 * Copyright 2013 Facebook, Inc.
10364 *
10365 * Licensed under the Apache License, Version 2.0 (the "License");
10366 * you may not use this file except in compliance with the License.
10367 * You may obtain a copy of the License at
10368 *
10369 * http://www.apache.org/licenses/LICENSE-2.0
10370 *
10371 * Unless required by applicable law or agreed to in writing, software
10372 * distributed under the License is distributed on an "AS IS" BASIS,
10373 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10374 * See the License for the specific language governing permissions and
10375 * limitations under the License.
10376 *
10377 * @providesModule ge
10378 */
10379
10380/**
10381 * Find a node by ID. Optionally search a sub-tree outside of the document
10382 *
10383 * Use ge if you're not sure whether or not the element exists. You can test
10384 * for existence yourself in your application code.
10385 *
10386 * If your application code depends on the existence of the element, use $
10387 * instead, which will throw in DEV if the element doesn't exist.
10388 */
10389function ge(arg, root, tag) {
10390 return typeof arg != 'string' ? arg :
10391 !root ? document.getElementById(arg) :
10392 _geFromSubtree(arg, root, tag);
10393}
10394
10395function _geFromSubtree(id, root, tag) {
10396 var elem, children, ii;
10397
10398 if (_getNodeID(root) == id) {
10399 return root;
10400 } else if (root.getElementsByTagName) {
10401 // All Elements implement this, which does an iterative DFS, which is
10402 // faster than recursion and doesn't run into stack depth issues.
10403 children = root.getElementsByTagName(tag || '*');
10404 for (ii = 0; ii < children.length; ii++) {
10405 if (_getNodeID(children[ii]) == id) {
10406 return children[ii];
10407 }
10408 }
10409 } else {
10410 // DocumentFragment does not implement getElementsByTagName, so
10411 // recurse over its children. Its children must be Elements, so
10412 // each child will use the getElementsByTagName case instead.
10413 children = root.childNodes;
10414 for (ii = 0; ii < children.length; ii++) {
10415 elem = _geFromSubtree(id, children[ii]);
10416 if (elem) {
10417 return elem;
10418 }
10419 }
10420 }
10421
10422 return null;
10423}
10424
10425/**
10426 * Return the ID value for a given node. This allows us to avoid issues
10427 * with forms that contain inputs with name="id".
10428 *
10429 * @return string (null if attribute not set)
10430 */
10431function _getNodeID(node) {
10432 // #document and #document-fragment do not have getAttributeNode.
10433 var id = node.getAttributeNode && node.getAttributeNode('id');
10434 return id ? id.value : null;
10435}
10436
10437module.exports = ge;
10438
10439},{}],72:[function(require,module,exports){
10440(function(){/**
10441 * Copyright 2013 Facebook, Inc.
10442 *
10443 * Licensed under the Apache License, Version 2.0 (the "License");
10444 * you may not use this file except in compliance with the License.
10445 * You may obtain a copy of the License at
10446 *
10447 * http://www.apache.org/licenses/LICENSE-2.0
10448 *
10449 * Unless required by applicable law or agreed to in writing, software
10450 * distributed under the License is distributed on an "AS IS" BASIS,
10451 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10452 * See the License for the specific language governing permissions and
10453 * limitations under the License.
10454 *
10455 * @providesModule getEventTarget
10456 * @typechecks static-only
10457 */
10458
10459"use strict";
10460
10461var ExecutionEnvironment = require("./ExecutionEnvironment");
10462
10463/**
10464 * Gets the target node from a native browser event by accounting for
10465 * inconsistencies in browser DOM APIs.
10466 *
10467 * @param {object} nativeEvent Native browser event.
10468 * @return {DOMEventTarget} Target node.
10469 */
10470function getEventTarget(nativeEvent) {
10471 var target =
10472 nativeEvent.target ||
10473 nativeEvent.srcElement ||
10474 ExecutionEnvironment.global;
10475 // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
10476 // @see http://www.quirksmode.org/js/events_properties.html
10477 return target.nodeType === 3 ? target.parentNode : target;
10478}
10479
10480module.exports = getEventTarget;
10481
10482})()
10483},{"./ExecutionEnvironment":19}],73:[function(require,module,exports){
10484/**
10485 * Copyright 2013 Facebook, Inc.
10486 *
10487 * Licensed under the Apache License, Version 2.0 (the "License");
10488 * you may not use this file except in compliance with the License.
10489 * You may obtain a copy of the License at
10490 *
10491 * http://www.apache.org/licenses/LICENSE-2.0
10492 *
10493 * Unless required by applicable law or agreed to in writing, software
10494 * distributed under the License is distributed on an "AS IS" BASIS,
10495 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10496 * See the License for the specific language governing permissions and
10497 * limitations under the License.
10498 *
10499 * @providesModule getReactRootElementInContainer
10500 */
10501
10502"use strict";
10503
10504/**
10505 * @param {DOMElement} container DOM element that may contain a React component
10506 * @return {?*} DOM element that may have the reactRoot ID, or null.
10507 */
10508function getReactRootElementInContainer(container) {
10509 return container && container.firstChild;
10510}
10511
10512module.exports = getReactRootElementInContainer;
10513
10514},{}],74:[function(require,module,exports){
10515/**
10516 * Copyright 2013 Facebook, Inc.
10517 *
10518 * Licensed under the Apache License, Version 2.0 (the "License");
10519 * you may not use this file except in compliance with the License.
10520 * You may obtain a copy of the License at
10521 *
10522 * http://www.apache.org/licenses/LICENSE-2.0
10523 *
10524 * Unless required by applicable law or agreed to in writing, software
10525 * distributed under the License is distributed on an "AS IS" BASIS,
10526 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10527 * See the License for the specific language governing permissions and
10528 * limitations under the License.
10529 *
10530 * @providesModule getTextContentAccessor
10531 */
10532
10533"use strict";
10534
10535var ExecutionEnvironment = require("./ExecutionEnvironment");
10536
10537var contentKey = null;
10538
10539/**
10540 * Gets the key used to access text content on a DOM node.
10541 *
10542 * @return {?string} Key used to access text content.
10543 * @internal
10544 */
10545function getTextContentAccessor() {
10546 if (!contentKey && ExecutionEnvironment.canUseDOM) {
10547 contentKey = 'innerText' in document.createElement('div') ?
10548 'innerText' :
10549 'textContent';
10550 }
10551 return contentKey;
10552}
10553
10554module.exports = getTextContentAccessor;
10555
10556},{"./ExecutionEnvironment":19}],75:[function(require,module,exports){
10557/**
10558 * Copyright 2013 Facebook, Inc.
10559 *
10560 * Licensed under the Apache License, Version 2.0 (the "License");
10561 * you may not use this file except in compliance with the License.
10562 * You may obtain a copy of the License at
10563 *
10564 * http://www.apache.org/licenses/LICENSE-2.0
10565 *
10566 * Unless required by applicable law or agreed to in writing, software
10567 * distributed under the License is distributed on an "AS IS" BASIS,
10568 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10569 * See the License for the specific language governing permissions and
10570 * limitations under the License.
10571 *
10572 * @providesModule hasArrayNature
10573 */
10574
10575/**
10576 * Perform a heuristic test to determine if an object is "array-like".
10577 *
10578 * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?"
10579 * Joshu replied: "Mu."
10580 *
10581 * This function determines if its argument has "array nature": it returns
10582 * true if the argument is an actual array, an `arguments' object, or an
10583 * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()).
10584 *
10585 * @param obj An object to test.
10586 * @return bool True if the object is array-like.
10587 */
10588function hasArrayNature(obj) {
10589 return (
10590 // not null/false
10591 !!obj &&
10592 // arrays are objects, NodeLists are functions in Safari
10593 (typeof obj == 'object' || typeof obj == 'function') &&
10594 // quacks like an array
10595 ('length' in obj) &&
10596 // not window
10597 !('setInterval' in obj) &&
10598 // no DOM node should be considered an array-like
10599 // a 'select' element has 'length' and 'item' properties
10600 (typeof obj.nodeType != 'number') &&
10601 (
10602 // a real array
10603 (Array.isArray(obj) ||
10604 // arguments
10605 ('callee' in obj) || // HTMLCollection/NodeList
10606 'item' in obj)
10607 )
10608 );
10609}
10610
10611module.exports = hasArrayNature;
10612
10613},{}],76:[function(require,module,exports){
10614/**
10615 * Copyright 2013 Facebook, Inc.
10616 *
10617 * Licensed under the Apache License, Version 2.0 (the "License");
10618 * you may not use this file except in compliance with the License.
10619 * You may obtain a copy of the License at
10620 *
10621 * http://www.apache.org/licenses/LICENSE-2.0
10622 *
10623 * Unless required by applicable law or agreed to in writing, software
10624 * distributed under the License is distributed on an "AS IS" BASIS,
10625 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10626 * See the License for the specific language governing permissions and
10627 * limitations under the License.
10628 *
10629 * @providesModule hyphenate
10630 * @typechecks
10631 */
10632
10633var _uppercasePattern = /([A-Z])/g;
10634
10635/**
10636 * Hyphenates a camelcased string, for example:
10637 *
10638 * > hyphenate('backgroundColor')
10639 * < "background-color"
10640 *
10641 * @param {string} string
10642 * @return {string}
10643 */
10644function hyphenate(string) {
10645 return string.replace(_uppercasePattern, '-$1').toLowerCase();
10646}
10647
10648module.exports = hyphenate;
10649
10650},{}],77:[function(require,module,exports){
10651/**
10652 * Copyright 2013 Facebook, Inc.
10653 *
10654 * Licensed under the Apache License, Version 2.0 (the "License");
10655 * you may not use this file except in compliance with the License.
10656 * You may obtain a copy of the License at
10657 *
10658 * http://www.apache.org/licenses/LICENSE-2.0
10659 *
10660 * Unless required by applicable law or agreed to in writing, software
10661 * distributed under the License is distributed on an "AS IS" BASIS,
10662 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10663 * See the License for the specific language governing permissions and
10664 * limitations under the License.
10665 *
10666 * @providesModule insertNodeAt
10667 */
10668
10669"use strict";
10670
10671/**
10672 * Inserts `node` at a particular child index. Other nodes move to make room.
10673 * @param {!Element} root The parent root node to insert into.
10674 * @param {!node} node The node to insert.
10675 * @param {!number} atIndex The index in `root` that `node` should exist at.
10676 */
10677function insertNodeAt(root, node, atIndex) {
10678 var childNodes = root.childNodes;
10679 // Remove from parent so that if node is already child of root,
10680 // `childNodes[atIndex]` already takes into account the removal.
10681 var curAtIndex = root.childNodes[atIndex];
10682 if (curAtIndex === node) {
10683 return node;
10684 }
10685 if (node.parentNode) {
10686 node.parentNode.removeChild(node);
10687 }
10688 if (atIndex >= childNodes.length) {
10689 root.appendChild(node);
10690 } else {
10691 root.insertBefore(node, childNodes[atIndex]);
10692 }
10693 return node;
10694}
10695
10696module.exports = insertNodeAt;
10697
10698},{}],78:[function(require,module,exports){
10699/**
10700 * Copyright 2013 Facebook, Inc.
10701 *
10702 * Licensed under the Apache License, Version 2.0 (the "License");
10703 * you may not use this file except in compliance with the License.
10704 * You may obtain a copy of the License at
10705 *
10706 * http://www.apache.org/licenses/LICENSE-2.0
10707 *
10708 * Unless required by applicable law or agreed to in writing, software
10709 * distributed under the License is distributed on an "AS IS" BASIS,
10710 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10711 * See the License for the specific language governing permissions and
10712 * limitations under the License.
10713 *
10714 * @providesModule invariant
10715 */
10716
10717/**
10718 * Use invariant() to assert state which your program assumes to be true.
10719 *
10720 * Provide sprintf style format and arguments to provide information about
10721 * what broke and what you were expecting.
10722 *
10723 * The invariant message will be stripped in production, but the invariant
10724 * will remain to ensure logic does not differ in production.
10725 */
10726
10727function invariant(condition) {
10728 if (!condition) {
10729 throw new Error('Invariant Violation');
10730 }
10731}
10732
10733module.exports = invariant;
10734
10735if (true) {
10736 var invariantDev = function(condition, format, a, b, c, d, e, f) {
10737 if (format === undefined) {
10738 throw new Error('invariant requires an error message argument');
10739 }
10740
10741 if (!condition) {
10742 var args = [a, b, c, d, e, f];
10743 var argIndex = 0;
10744 throw new Error(
10745 'Invariant Violation: ' +
10746 format.replace(/%s/g, function() { return args[argIndex++]; })
10747 );
10748 }
10749 };
10750
10751 module.exports = invariantDev;
10752}
10753
10754},{}],79:[function(require,module,exports){
10755/**
10756 * Copyright 2013 Facebook, Inc.
10757 *
10758 * Licensed under the Apache License, Version 2.0 (the "License");
10759 * you may not use this file except in compliance with the License.
10760 * You may obtain a copy of the License at
10761 *
10762 * http://www.apache.org/licenses/LICENSE-2.0
10763 *
10764 * Unless required by applicable law or agreed to in writing, software
10765 * distributed under the License is distributed on an "AS IS" BASIS,
10766 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10767 * See the License for the specific language governing permissions and
10768 * limitations under the License.
10769 *
10770 * @providesModule isEventSupported
10771 */
10772
10773"use strict";
10774
10775var ExecutionEnvironment = require("./ExecutionEnvironment");
10776
10777var testNode, useHasFeature;
10778if (ExecutionEnvironment.canUseDOM) {
10779 testNode = document.createElement('div');
10780 useHasFeature =
10781 document.implementation &&
10782 document.implementation.hasFeature &&
10783 // `hasFeature` always returns true in Firefox 19+.
10784 document.implementation.hasFeature('', '') !== true;
10785}
10786
10787/**
10788 * Checks if an event is supported in the current execution environment.
10789 *
10790 * NOTE: This will not work correctly for non-generic events such as `change`,
10791 * `reset`, `load`, `error`, and `select`.
10792 *
10793 * Borrows from Modernizr.
10794 *
10795 * @param {string} eventNameSuffix Event name, e.g. "click".
10796 * @param {?boolean} capture Check if the capture phase is supported.
10797 * @return {boolean} True if the event is supported.
10798 * @internal
10799 * @license Modernizr 3.0.0pre (Custom Build) | MIT
10800 */
10801function isEventSupported(eventNameSuffix, capture) {
10802 if (!testNode || (capture && !testNode.addEventListener)) {
10803 return false;
10804 }
10805 var element = document.createElement('div');
10806
10807 var eventName = 'on' + eventNameSuffix;
10808 var isSupported = eventName in element;
10809
10810 if (!isSupported) {
10811 element.setAttribute(eventName, '');
10812 isSupported = typeof element[eventName] === 'function';
10813 if (typeof element[eventName] !== 'undefined') {
10814 element[eventName] = undefined;
10815 }
10816 element.removeAttribute(eventName);
10817 }
10818
10819 if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {
10820 // This is the only way to test support for the `wheel` event in IE9+.
10821 isSupported = document.implementation.hasFeature('Events.wheel', '3.0');
10822 }
10823
10824 element = null;
10825 return isSupported;
10826}
10827
10828module.exports = isEventSupported;
10829
10830},{"./ExecutionEnvironment":19}],80:[function(require,module,exports){
10831/**
10832 * Copyright 2013 Facebook, Inc.
10833 *
10834 * Licensed under the Apache License, Version 2.0 (the "License");
10835 * you may not use this file except in compliance with the License.
10836 * You may obtain a copy of the License at
10837 *
10838 * http://www.apache.org/licenses/LICENSE-2.0
10839 *
10840 * Unless required by applicable law or agreed to in writing, software
10841 * distributed under the License is distributed on an "AS IS" BASIS,
10842 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10843 * See the License for the specific language governing permissions and
10844 * limitations under the License.
10845 *
10846 * @providesModule joinClasses
10847 * @typechecks static-only
10848 */
10849
10850"use strict";
10851
10852/**
10853 * Combines multiple className strings into one.
10854 * http://jsperf.com/joinclasses-args-vs-array
10855 *
10856 * @param {...?string} classes
10857 * @return {string}
10858 */
10859function joinClasses(className/*, ... */) {
10860 if (!className) {
10861 className = '';
10862 }
10863 var nextClass;
10864 var argLength = arguments.length;
10865 if (argLength > 1) {
10866 for (var ii = 1; ii < argLength; ii++) {
10867 nextClass = arguments[ii];
10868 nextClass && (className += ' ' + nextClass);
10869 }
10870 }
10871 return className;
10872}
10873
10874module.exports = joinClasses;
10875
10876},{}],81:[function(require,module,exports){
10877/**
10878 * Copyright 2013 Facebook, Inc.
10879 *
10880 * Licensed under the Apache License, Version 2.0 (the "License");
10881 * you may not use this file except in compliance with the License.
10882 * You may obtain a copy of the License at
10883 *
10884 * http://www.apache.org/licenses/LICENSE-2.0
10885 *
10886 * Unless required by applicable law or agreed to in writing, software
10887 * distributed under the License is distributed on an "AS IS" BASIS,
10888 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10889 * See the License for the specific language governing permissions and
10890 * limitations under the License.
10891 *
10892 * @providesModule keyMirror
10893 * @typechecks static-only
10894 */
10895
10896"use strict";
10897
10898var invariant = require("./invariant");
10899
10900/**
10901 * Constructs an enumeration with keys equal to their value.
10902 *
10903 * For example:
10904 *
10905 * var COLORS = keyMirror({blue: null, red: null});
10906 * var myColor = COLORS.blue;
10907 * var isColorValid = !!COLORS[myColor];
10908 *
10909 * The last line could not be performed if the values of the generated enum were
10910 * not equal to their keys.
10911 *
10912 * Input: {key1: val1, key2: val2}
10913 * Output: {key1: key1, key2: key2}
10914 *
10915 * @param {object} obj
10916 * @return {object}
10917 */
10918var keyMirror = function(obj) {
10919 var ret = {};
10920 var key;
10921 invariant(
10922 obj instanceof Object && !Array.isArray(obj),
10923 'keyMirror(...): Argument must be an object.'
10924 );
10925 for (key in obj) {
10926 if (!obj.hasOwnProperty(key)) {
10927 continue;
10928 }
10929 ret[key] = key;
10930 }
10931 return ret;
10932};
10933
10934module.exports = keyMirror;
10935
10936},{"./invariant":78}],82:[function(require,module,exports){
10937/**
10938 * Copyright 2013 Facebook, Inc.
10939 *
10940 * Licensed under the Apache License, Version 2.0 (the "License");
10941 * you may not use this file except in compliance with the License.
10942 * You may obtain a copy of the License at
10943 *
10944 * http://www.apache.org/licenses/LICENSE-2.0
10945 *
10946 * Unless required by applicable law or agreed to in writing, software
10947 * distributed under the License is distributed on an "AS IS" BASIS,
10948 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10949 * See the License for the specific language governing permissions and
10950 * limitations under the License.
10951 *
10952 * @providesModule keyOf
10953 */
10954
10955/**
10956 * Allows extraction of a minified key. Let's the build system minify keys
10957 * without loosing the ability to dynamically use key strings as values
10958 * themselves. Pass in an object with a single key/val pair and it will return
10959 * you the string key of that single record. Suppose you want to grab the
10960 * value for a key 'className' inside of an object. Key/val minification may
10961 * have aliased that key to be 'xa12'. keyOf({className: null}) will return
10962 * 'xa12' in that case. Resolve keys you want to use once at startup time, then
10963 * reuse those resolutions.
10964 */
10965var keyOf = function(oneKeyObj) {
10966 var key;
10967 for (key in oneKeyObj) {
10968 if (!oneKeyObj.hasOwnProperty(key)) {
10969 continue;
10970 }
10971 return key;
10972 }
10973 return null;
10974};
10975
10976
10977module.exports = keyOf;
10978
10979},{}],83:[function(require,module,exports){
10980/**
10981 * Copyright 2013 Facebook, Inc.
10982 *
10983 * Licensed under the Apache License, Version 2.0 (the "License");
10984 * you may not use this file except in compliance with the License.
10985 * You may obtain a copy of the License at
10986 *
10987 * http://www.apache.org/licenses/LICENSE-2.0
10988 *
10989 * Unless required by applicable law or agreed to in writing, software
10990 * distributed under the License is distributed on an "AS IS" BASIS,
10991 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10992 * See the License for the specific language governing permissions and
10993 * limitations under the License.
10994 *
10995 * @providesModule memoizeStringOnly
10996 * @typechecks static-only
10997 */
10998
10999"use strict";
11000
11001/**
11002 * Memoizes the return value of a function that accepts one string argument.
11003 *
11004 * @param {function} callback
11005 * @return {function}
11006 */
11007function memoizeStringOnly(callback) {
11008 var cache = {};
11009 return function(string) {
11010 if (cache.hasOwnProperty(string)) {
11011 return cache[string];
11012 } else {
11013 return cache[string] = callback.call(this, string);
11014 }
11015 };
11016}
11017
11018module.exports = memoizeStringOnly;
11019
11020},{}],84:[function(require,module,exports){
11021/**
11022 * Copyright 2013 Facebook, Inc.
11023 *
11024 * Licensed under the Apache License, Version 2.0 (the "License");
11025 * you may not use this file except in compliance with the License.
11026 * You may obtain a copy of the License at
11027 *
11028 * http://www.apache.org/licenses/LICENSE-2.0
11029 *
11030 * Unless required by applicable law or agreed to in writing, software
11031 * distributed under the License is distributed on an "AS IS" BASIS,
11032 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11033 * See the License for the specific language governing permissions and
11034 * limitations under the License.
11035 *
11036 * @providesModule merge
11037 */
11038
11039"use strict";
11040
11041var mergeInto = require("./mergeInto");
11042
11043/**
11044 * Shallow merges two structures into a return value, without mutating either.
11045 *
11046 * @param {?object} one Optional object with properties to merge from.
11047 * @param {?object} two Optional object with properties to merge from.
11048 * @return {object} The shallow extension of one by two.
11049 */
11050var merge = function(one, two) {
11051 var result = {};
11052 mergeInto(result, one);
11053 mergeInto(result, two);
11054 return result;
11055};
11056
11057module.exports = merge;
11058
11059},{"./mergeInto":86}],85:[function(require,module,exports){
11060/**
11061 * Copyright 2013 Facebook, Inc.
11062 *
11063 * Licensed under the Apache License, Version 2.0 (the "License");
11064 * you may not use this file except in compliance with the License.
11065 * You may obtain a copy of the License at
11066 *
11067 * http://www.apache.org/licenses/LICENSE-2.0
11068 *
11069 * Unless required by applicable law or agreed to in writing, software
11070 * distributed under the License is distributed on an "AS IS" BASIS,
11071 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11072 * See the License for the specific language governing permissions and
11073 * limitations under the License.
11074 *
11075 * @providesModule mergeHelpers
11076 *
11077 * requiresPolyfills: Array.isArray
11078 */
11079
11080"use strict";
11081
11082var invariant = require("./invariant");
11083var keyMirror = require("./keyMirror");
11084
11085/**
11086 * Maximum number of levels to traverse. Will catch circular structures.
11087 * @const
11088 */
11089var MAX_MERGE_DEPTH = 36;
11090
11091/**
11092 * We won't worry about edge cases like new String('x') or new Boolean(true).
11093 * Functions are considered terminals, and arrays are not.
11094 * @param {*} o The item/object/value to test.
11095 * @return {boolean} true iff the argument is a terminal.
11096 */
11097var isTerminal = function(o) {
11098 return typeof o !== 'object' || o === null;
11099};
11100
11101var mergeHelpers = {
11102
11103 MAX_MERGE_DEPTH: MAX_MERGE_DEPTH,
11104
11105 isTerminal: isTerminal,
11106
11107 /**
11108 * Converts null/undefined values into empty object.
11109 *
11110 * @param {?Object=} arg Argument to be normalized (nullable optional)
11111 * @return {!Object}
11112 */
11113 normalizeMergeArg: function(arg) {
11114 return arg === undefined || arg === null ? {} : arg;
11115 },
11116
11117 /**
11118 * If merging Arrays, a merge strategy *must* be supplied. If not, it is
11119 * likely the caller's fault. If this function is ever called with anything
11120 * but `one` and `two` being `Array`s, it is the fault of the merge utilities.
11121 *
11122 * @param {*} one Array to merge into.
11123 * @param {*} two Array to merge from.
11124 */
11125 checkMergeArrayArgs: function(one, two) {
11126 invariant(
11127 Array.isArray(one) && Array.isArray(two),
11128 'Critical assumptions about the merge functions have been violated. ' +
11129 'This is the fault of the merge functions themselves, not necessarily ' +
11130 'the callers.'
11131 );
11132 },
11133
11134 /**
11135 * @param {*} one Object to merge into.
11136 * @param {*} two Object to merge from.
11137 */
11138 checkMergeObjectArgs: function(one, two) {
11139 mergeHelpers.checkMergeObjectArg(one);
11140 mergeHelpers.checkMergeObjectArg(two);
11141 },
11142
11143 /**
11144 * @param {*} arg
11145 */
11146 checkMergeObjectArg: function(arg) {
11147 invariant(
11148 !isTerminal(arg) && !Array.isArray(arg),
11149 'Critical assumptions about the merge functions have been violated. ' +
11150 'This is the fault of the merge functions themselves, not necessarily ' +
11151 'the callers.'
11152 );
11153 },
11154
11155 /**
11156 * Checks that a merge was not given a circular object or an object that had
11157 * too great of depth.
11158 *
11159 * @param {number} Level of recursion to validate against maximum.
11160 */
11161 checkMergeLevel: function(level) {
11162 invariant(
11163 level < MAX_MERGE_DEPTH,
11164 'Maximum deep merge depth exceeded. You may be attempting to merge ' +
11165 'circular structures in an unsupported way.'
11166 );
11167 },
11168
11169 /**
11170 * Checks that the supplied merge strategy is valid.
11171 *
11172 * @param {string} Array merge strategy.
11173 */
11174 checkArrayStrategy: function(strategy) {
11175 invariant(
11176 strategy === undefined || strategy in mergeHelpers.ArrayStrategies,
11177 'You must provide an array strategy to deep merge functions to ' +
11178 'instruct the deep merge how to resolve merging two arrays.'
11179 );
11180 },
11181
11182 /**
11183 * Set of possible behaviors of merge algorithms when encountering two Arrays
11184 * that must be merged together.
11185 * - `clobber`: The left `Array` is ignored.
11186 * - `indexByIndex`: The result is achieved by recursively deep merging at
11187 * each index. (not yet supported.)
11188 */
11189 ArrayStrategies: keyMirror({
11190 Clobber: true,
11191 IndexByIndex: true
11192 })
11193
11194};
11195
11196module.exports = mergeHelpers;
11197
11198},{"./invariant":78,"./keyMirror":81}],86:[function(require,module,exports){
11199/**
11200 * Copyright 2013 Facebook, Inc.
11201 *
11202 * Licensed under the Apache License, Version 2.0 (the "License");
11203 * you may not use this file except in compliance with the License.
11204 * You may obtain a copy of the License at
11205 *
11206 * http://www.apache.org/licenses/LICENSE-2.0
11207 *
11208 * Unless required by applicable law or agreed to in writing, software
11209 * distributed under the License is distributed on an "AS IS" BASIS,
11210 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11211 * See the License for the specific language governing permissions and
11212 * limitations under the License.
11213 *
11214 * @providesModule mergeInto
11215 * @typechecks static-only
11216 */
11217
11218"use strict";
11219
11220var mergeHelpers = require("./mergeHelpers");
11221
11222var checkMergeObjectArg = mergeHelpers.checkMergeObjectArg;
11223
11224/**
11225 * Shallow merges two structures by mutating the first parameter.
11226 *
11227 * @param {object} one Object to be merged into.
11228 * @param {?object} two Optional object with properties to merge from.
11229 */
11230function mergeInto(one, two) {
11231 checkMergeObjectArg(one);
11232 if (two != null) {
11233 checkMergeObjectArg(two);
11234 for (var key in two) {
11235 if (!two.hasOwnProperty(key)) {
11236 continue;
11237 }
11238 one[key] = two[key];
11239 }
11240 }
11241}
11242
11243module.exports = mergeInto;
11244
11245},{"./mergeHelpers":85}],87:[function(require,module,exports){
11246/**
11247 * Copyright 2013 Facebook, Inc.
11248 *
11249 * Licensed under the Apache License, Version 2.0 (the "License");
11250 * you may not use this file except in compliance with the License.
11251 * You may obtain a copy of the License at
11252 *
11253 * http://www.apache.org/licenses/LICENSE-2.0
11254 *
11255 * Unless required by applicable law or agreed to in writing, software
11256 * distributed under the License is distributed on an "AS IS" BASIS,
11257 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11258 * See the License for the specific language governing permissions and
11259 * limitations under the License.
11260 *
11261 * @providesModule mixInto
11262 */
11263
11264"use strict";
11265
11266/**
11267 * Simply copies properties to the prototype.
11268 */
11269var mixInto = function(constructor, methodBag) {
11270 var methodName;
11271 for (methodName in methodBag) {
11272 if (!methodBag.hasOwnProperty(methodName)) {
11273 continue;
11274 }
11275 constructor.prototype[methodName] = methodBag[methodName];
11276 }
11277};
11278
11279module.exports = mixInto;
11280
11281},{}],88:[function(require,module,exports){
11282/**
11283 * Copyright 2013 Facebook, Inc.
11284 *
11285 * Licensed under the Apache License, Version 2.0 (the "License");
11286 * you may not use this file except in compliance with the License.
11287 * You may obtain a copy of the License at
11288 *
11289 * http://www.apache.org/licenses/LICENSE-2.0
11290 *
11291 * Unless required by applicable law or agreed to in writing, software
11292 * distributed under the License is distributed on an "AS IS" BASIS,
11293 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11294 * See the License for the specific language governing permissions and
11295 * limitations under the License.
11296 *
11297 * @providesModule objMapKeyVal
11298 */
11299
11300"use strict";
11301
11302/**
11303 * Behaves the same as `objMap` but invokes func with the key first, and value
11304 * second. Use `objMap` unless you need this special case.
11305 * Invokes func as:
11306 *
11307 * func(key, value, iteration)
11308 *
11309 * @param {?object} obj Object to map keys over
11310 * @param {!function} func Invoked for each key/val pair.
11311 * @param {?*} context
11312 * @return {?object} Result of mapping or null if obj is falsey
11313 */
11314function objMapKeyVal(obj, func, context) {
11315 if (!obj) {
11316 return null;
11317 }
11318 var i = 0;
11319 var ret = {};
11320 for (var key in obj) {
11321 if (obj.hasOwnProperty(key)) {
11322 ret[key] = func.call(context, key, obj[key], i++);
11323 }
11324 }
11325 return ret;
11326}
11327
11328module.exports = objMapKeyVal;
11329
11330},{}],89:[function(require,module,exports){
11331/**
11332 * Copyright 2013 Facebook, Inc.
11333 *
11334 * Licensed under the Apache License, Version 2.0 (the "License");
11335 * you may not use this file except in compliance with the License.
11336 * You may obtain a copy of the License at
11337 *
11338 * http://www.apache.org/licenses/LICENSE-2.0
11339 *
11340 * Unless required by applicable law or agreed to in writing, software
11341 * distributed under the License is distributed on an "AS IS" BASIS,
11342 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11343 * See the License for the specific language governing permissions and
11344 * limitations under the License.
11345 *
11346 * @providesModule throwIf
11347 */
11348
11349"use strict";
11350
11351var throwIf = function(condition, err) {
11352 if (condition) {
11353 throw new Error(err);
11354 }
11355};
11356
11357module.exports = throwIf;
11358
11359},{}],90:[function(require,module,exports){
11360(function(){/**
11361 * Copyright 2013 Facebook, Inc.
11362 *
11363 * Licensed under the Apache License, Version 2.0 (the "License");
11364 * you may not use this file except in compliance with the License.
11365 * You may obtain a copy of the License at
11366 *
11367 * http://www.apache.org/licenses/LICENSE-2.0
11368 *
11369 * Unless required by applicable law or agreed to in writing, software
11370 * distributed under the License is distributed on an "AS IS" BASIS,
11371 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11372 * See the License for the specific language governing permissions and
11373 * limitations under the License.
11374 *
11375 * @providesModule traverseAllChildren
11376 */
11377
11378"use strict";
11379
11380var ReactComponent = require("./ReactComponent");
11381var ReactTextComponent = require("./ReactTextComponent");
11382
11383var invariant = require("./invariant");
11384
11385/**
11386 * TODO: Test that:
11387 * 1. `mapChildren` transforms strings and numbers into `ReactTextComponent`.
11388 * 2. it('should fail when supplied duplicate key', function() {
11389 * 3. That a single child and an array with one item have the same key pattern.
11390 * });
11391 */
11392
11393/**
11394 * @param {?*} children Children tree container.
11395 * @param {!string} nameSoFar Name of the key path so far.
11396 * @param {!number} indexSoFar Number of children encountered until this point.
11397 * @param {!function} callback Callback to invoke with each child found.
11398 * @param {?*} traverseContext Used to pass information throughout the traversal
11399 * process.
11400 * @return {!number} The number of children in this subtree.
11401 */
11402var traverseAllChildrenImpl =
11403 function(children, nameSoFar, indexSoFar, callback, traverseContext) {
11404 var subtreeCount = 0; // Count of children found in the current subtree.
11405 if (Array.isArray(children)) {
11406 for (var i = 0; i < children.length; i++) {
11407 var child = children[i];
11408 var nextName = nameSoFar + '[' + ReactComponent.getKey(child, i) + ']';
11409 var nextIndex = indexSoFar + subtreeCount;
11410 subtreeCount += traverseAllChildrenImpl(
11411 child,
11412 nextName,
11413 nextIndex,
11414 callback,
11415 traverseContext
11416 );
11417 }
11418 } else {
11419 var type = typeof children;
11420 var isOnlyChild = nameSoFar === '';
11421 // If it's the only child, treat the name as if it was wrapped in an array
11422 // so that it's consistent if the number of children grows
11423 var storageName = isOnlyChild ?
11424 '[' + ReactComponent.getKey(children, 0) + ']' :
11425 nameSoFar;
11426 if (children === null || children === undefined || type === 'boolean') {
11427 // All of the above are perceived as null.
11428 callback(traverseContext, null, storageName, indexSoFar);
11429 subtreeCount = 1;
11430 } else if (children.mountComponentIntoNode) {
11431 callback(traverseContext, children, storageName, indexSoFar);
11432 subtreeCount = 1;
11433 } else {
11434 if (type === 'object') {
11435 invariant(
11436 children || children.nodeType !== 1,
11437 'traverseAllChildren(...): Encountered an invalid child; DOM ' +
11438 'elements are not valid children of React components.'
11439 );
11440 for (var key in children) {
11441 if (children.hasOwnProperty(key)) {
11442 subtreeCount += traverseAllChildrenImpl(
11443 children[key],
11444 nameSoFar + '{' + key + '}',
11445 indexSoFar + subtreeCount,
11446 callback,
11447 traverseContext
11448 );
11449 }
11450 }
11451 } else if (type === 'string') {
11452 var normalizedText = new ReactTextComponent(children);
11453 callback(traverseContext, normalizedText, storageName, indexSoFar);
11454 subtreeCount += 1;
11455 } else if (type === 'number') {
11456 var normalizedNumber = new ReactTextComponent('' + children);
11457 callback(traverseContext, normalizedNumber, storageName, indexSoFar);
11458 subtreeCount += 1;
11459 }
11460 }
11461 }
11462 return subtreeCount;
11463 };
11464
11465/**
11466 * Traverses children that are typically specified as `props.children`, but
11467 * might also be specified through attributes:
11468 *
11469 * - `traverseAllChildren(this.props.children, ...)`
11470 * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
11471 *
11472 * The `traverseContext` is an optional argument that is passed through the
11473 * entire traversal. It can be used to store accumulations or anything else that
11474 * the callback might find relevant.
11475 *
11476 * @param {?*} children Children tree object.
11477 * @param {!function} callback To invoke upon traversing each child.
11478 * @param {?*} traverseContext Context for traversal.
11479 */
11480function traverseAllChildren(children, callback, traverseContext) {
11481 if (children !== null && children !== undefined) {
11482 traverseAllChildrenImpl(children, '', 0, callback, traverseContext);
11483 }
11484}
11485
11486module.exports = traverseAllChildren;
11487
11488})()
11489},{"./ReactComponent":23,"./ReactTextComponent":48,"./invariant":78}]},{},[22])(22)
11490});
11491; \ No newline at end of file
diff --git a/frontend/delta/js/main.js b/frontend/delta/js/main.js
new file mode 100644
index 0000000..6f8b497
--- a/dev/null
+++ b/frontend/delta/js/main.js
@@ -0,0 +1,62 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24function _pm_logEvent(anEvent) {
25 //console.log("####", anEvent);
26
27 anEvent.preventDefault();
28}
29
30function handleGenericDeferredError(anError) {
31 var result;
32
33 if (anError instanceof MochiKit.Async.CancelledError) {
34 result = anError;
35 } else {
36MochiKit.Logging.logError("## MainController - GENERIC ERROR" + "\n" + "==>> " + anError + " <<==\n" + anError.stack);
37//console.log(anError);
38 result = new MochiKit.Async.CancelledError(anError);
39 }
40
41 return result;
42}
43
44
45Clipperz.PM.RunTime = {};
46function run() {
47 var parameters = {};
48
49 Clipperz.PM.Strings.Languages.initSetup();
50
51
52 if ((window.location.search.indexOf('registration') != -1) || (window.location.hash.indexOf('registration') != -1)) {
53 parameters['shouldShowRegistrationForm'] = true;
54 } else {
55 parameters['shouldShowRegistrationForm'] = false;
56 }
57
58 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.MainController();
59 Clipperz.PM.RunTime.mainController.run(parameters);
60}
61
62MochiKit.DOM.addLoadEvent(run);
diff --git a/frontend/delta/less/web.less b/frontend/delta/less/web.less
new file mode 100644
index 0000000..9ecd96b
--- a/dev/null
+++ b/frontend/delta/less/web.less
@@ -0,0 +1,9 @@
1@import "web/fonts";
2@import "web/overlay";
3@import "web/behavior";
4@import "web/style";
5@import "web/480";
6@import "web/768";
7@import "web/992";
8
9@import "web/add2home"; \ No newline at end of file
diff --git a/frontend/delta/less/web/480.less b/frontend/delta/less/web/480.less
new file mode 100644
index 0000000..bd9b93b
--- a/dev/null
+++ b/frontend/delta/less/web/480.less
@@ -0,0 +1,11 @@
1@media only screen and (min-width: 480px) {
2 .loginForm {
3 font-size: 1.2em;
4
5 input {
6 }
7 button {
8 }
9 }
10}
11
diff --git a/frontend/delta/less/web/768.less b/frontend/delta/less/web/768.less
new file mode 100644
index 0000000..e8b8969
--- a/dev/null
+++ b/frontend/delta/less/web/768.less
@@ -0,0 +1,3 @@
1@media only screen and (min-width: 768px) {
2
3}
diff --git a/frontend/delta/less/web/992.less b/frontend/delta/less/web/992.less
new file mode 100644
index 0000000..ca83f77
--- a/dev/null
+++ b/frontend/delta/less/web/992.less
@@ -0,0 +1,2 @@
1@media only screen and (min-width: 992px) {
2}
diff --git a/frontend/delta/less/web/add2home.less b/frontend/delta/less/web/add2home.less
new file mode 100644
index 0000000..ecff0b1
--- a/dev/null
+++ b/frontend/delta/less/web/add2home.less
@@ -0,0 +1,160 @@
1/**
2 *
3 * Main container
4 *
5 */
6#addToHomeScreen {
7 z-index:9999;
8 -webkit-user-select:none;
9 user-select:none;
10 -webkit-box-sizing:border-box;
11 box-sizing:border-box;
12 -webkit-touch-callout:none;
13 touch-callout:none;
14 width:240px;
15 font-size:15px;
16 padding:12px 14px;
17 text-align:left;
18 font-family:helvetica;
19 background-image:-webkit-gradient(linear,0 0,0 100%,color-stop(0,#fff),color-stop(0.02,#eee),color-stop(0.98,#ccc),color-stop(1,#a3a3a3));
20 border:1px solid #505050;
21 -webkit-border-radius:8px;
22 -webkit-background-clip:padding-box;
23 color:#333;
24 text-shadow:0 1px 0 rgba(255,255,255,0.75);
25 line-height:130%;
26 -webkit-box-shadow:0 0 4px rgba(0,0,0,0.5);
27}
28
29#addToHomeScreen.addToHomeIpad {
30 width:268px;
31 font-size:18px;
32 padding:14px;
33}
34
35/**
36 *
37 * The 'wide' class is added when the popup contains the touch icon
38 *
39 */
40#addToHomeScreen.addToHomeWide {
41 width:296px;
42}
43
44#addToHomeScreen.addToHomeIpad.addToHomeWide {
45 width:320px;
46 font-size:18px;
47 padding:14px;
48}
49
50/**
51 *
52 * The balloon arrow
53 *
54 */
55#addToHomeScreen .addToHomeArrow {
56 position:absolute;
57 background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(204,204,204,0)),color-stop(0.4,rgba(204,204,204,0)),color-stop(0.4,#ccc));
58 border-width:0 1px 1px 0;
59 border-style:solid;
60 border-color:#505050;
61 width:16px; height:16px;
62 -webkit-transform:rotateZ(45deg);
63 bottom:-9px; left:50%;
64 margin-left:-8px;
65 -webkit-box-shadow:inset -1px -1px 0 #a9a9a9;
66 -webkit-border-bottom-right-radius:2px;
67}
68
69
70/**
71 *
72 * The balloon arrow for iPad
73 *
74 */
75#addToHomeScreen.addToHomeIpad .addToHomeArrow {
76 -webkit-transform:rotateZ(-135deg);
77 background-image:-webkit-gradient(linear,0 0,100% 100%,color-stop(0,rgba(238,238,238,0)),color-stop(0.4,rgba(238,238,238,0)),color-stop(0.4,#eee));
78 -webkit-box-shadow:inset -1px -1px 0 #fff;
79 top:-9px; bottom:auto; left:50%;
80}
81
82
83/**
84 *
85 * Close button
86 *
87 */
88#addToHomeScreen .addToHomeClose {
89 -webkit-box-sizing:border-box;
90 position:absolute;
91 right:4px;
92 top:4px;
93 width:18px;
94 height:18px; line-height:14px;
95 text-align:center;
96 text-indent:1px;
97 -webkit-border-radius:9px;
98 background:rgba(0,0,0,0.12);
99 color:#707070;
100 -webkit-box-shadow:0 1px 0 #fff;
101 font-size:16px;
102}
103
104
105/**
106 *
107 * The '+' icon, displayed only on iOS < 4.2
108 *
109 */
110#addToHomeScreen .addToHomePlus {
111 font-weight:bold;
112 font-size:1.3em;
113}
114
115
116/**
117 *
118 * The 'share' icon, displayed only on iOS >= 4.2
119 *
120 */
121#addToHomeScreen .addToHomeShare {
122 display:inline-block;
123 width:18px;
124 height:15px;
125 background-repeat:no-repeat;
126 background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAeCAQAAADu6HTYAAADPElEQVR4Xq3TX2gcRRzA8e/M7mVv2+TSNpc/TZtrY6jUGqgaSAmEChKLrYK0YH0RFC2CSCkEfCghiKU04J8qNigq6os+iQV98MHWFwVBrQQRWs21lBw5cw3NNb1/udu72RGG5Y77IzXW77D7sAwf5scyYoL6BGXSDKFZwaGpLvIUaeoCkvX1MmsM0Ny6oRSQYOLuIS+YZOpfQdqslpUxcZrzTVAz4qPwW2O3CeIwC/RSzeY6Ow1QhUrkr+YOWfEKDkEP8Rij7CHKJmrFSDHBdwGEE5wiGChPN+PnT8VdRtEIl1d4gRj/1EVe5ZSBKGh8iqQpo/Fo5+3C/gz0MYg4zgwbqday1/Q4B8BGQ45d/Hi54lakCrU5obOcidJpu1+Lg9whjabyaOYLnrIBFFaRD+xe2ybMDWY66GmP/WA9cGfGp0CWhy0wkMN8inepFiH2rV1j0NQSNQbFLRQnS8/8YSDBBpadfv4CYDub2fmeHDNAsL1MBWUel0iA+Xik6eHcyvD3vAMSU1TGuA/YRS+dD7ovCQN43GKRFCU20Kd3V/avDVVyAZ5niTEuLA5/zBGWg9EEEhfJKN200Tat8CmRAQb9+wv7soPlHt2tQorsz1uPbr0HTY4sJwrH47zJZwABBAKLMBoQXepwgTwdHCo+fXMkQ4lrxEmQ5AaXipPqDY9V2vn09tgvTPI71EEGYxM+/uMJLJ4svpgaWGKOi/xKgmqLSUGSUd5f2vIVJ/CgBaTIUsZ7ZBsn0+NzfMOXLFCXQyTcybN6ep5ZZgUOHn7jpfUpsZshdugPGf+E5zjbyHTSRyQ8xfRPPM/s63RHeuknSoT22mjmmnAOIMkUZ6D1xSfPPAfd1WFKM3sO2CMaHx8M1NjnXKHaAGGkOW0C02WeYHUz4qMtx+w5gUDS8NckYe5lHsMYwCZEPyEEmjLDZFmAS7CDviMdxyTkMNVBKEmYLvbiQQBIBBbCQG04bGQvFWz6CfsCQLWCigILFwcfkGYBiOpbYuOizTAyYyDdCtrGaRG1LCkIgMYEFhI0WqQZoSlbGRyHKe4qOx7iv2bVQW9dp4dlM/x6kmwnWQcd/Q3FCqwTEiT5s+6D5v/pb0SSHyg7uhMWAAAAAElFTkSuQmCC);
127 background-size:18px 15px;
128 text-indent:-9999em;
129 overflow:hidden;
130}
131
132#addToHomeScreen .addToHomeShare.addToHomeShareOS7 {
133 width:11px;
134 background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAA8CAYAAAAQTCjdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAASCQAAEgkB80sG3AAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKjSURBVGiB7dpPiFVVHMDxz7m9NCtMyI2bEJEC25WrEkzHUXCRraIwdNE8ZxfYIlcis1ZEbGEzT1QCF4XgH1CyWhUoJKIWNRGEiCNKmkSiYTzfcfGuOokx77x3ZlS8382959zfn+/invvn3RdijHIRBrwkOINCYXEcdjpb7VyiYdBsLScwt5y6IloYdzqXo36Ro0gY9IKWo+5JwmzBt2HQnBw9ehYNazyn5TBee8Dh+Vq+CWu92GufnkTDR6ab7gDeBNHouMM/l9tXTXM0fGBmL726Fg1Dam74EsvKqR8VNowL2Yzj5f7rnnE4DHq2235diYYhhTGfC94up35T0y+6di/ITU0rKVd+sEi0P7xr2pSJOu8zvF+OzqEv7vDH/WFxt7/cshy/ticsN8sXYUht0kXDOlsF9XJ4UaEvNoz9X3zc5bKaZThbyr5jzJ4wlNY7KTgM+ES0vhz+KeiPw36fKC/ucAF9uFBOrTZm26SJCtaV27+xIo7cXdkTEhvOoh+XyxprU1qnim7CQdGK2HAyKRexYVShT3RItDElN+mkjiP2Ym+S3f01hv2EVal5WW6hU0ElmptaqJuBpXg6MbeFH2LDpU6CQ93zWIKnEvs0cayGU3glMfkOo1jQYewZzOuyz7FC95Jwo5OgUFfgeg993hh/eTqCTxOSm/iuk8DY0Ap1b2GhtHXxsfZN4j/X0fOx4auEIknEhqv4OiUn1L13Z/+xWfWVaG4q0dxUormpRHNTieamEs1NJZqbJ1Q0jHvdiJo5S2cVjSNOCHZhn3/SnuYnIvl3yomIIz7MXZMn9hydRCrR3FSiualEc1OJ5qYSzU0lmptKNDePjWgwcPePT7/g+4cp8wCW4GXaryK3tL+mLdD5x62ppllgu7bso8q/2HIbzGWdNmWnSJwAAAAASUVORK5CYII=);
135 background-size:11px 15px;
136}
137
138/**
139 *
140 * The touch icon (if available)
141 *
142 */
143#addToHomeScreen .addToHomeTouchIcon {
144 display:block;
145 float:left;
146 -webkit-border-radius:6px;
147 border-radius:6px;
148 -webkit-box-shadow:0 1px 3px rgba(0,0,0,0.5),
149 inset 0 0 2px rgba(255,255,255,0.9);
150 box-shadow:0 1px 3px rgba(0,0,0,0.5),
151 inset 0 0 2px rgba(255,255,255,0.9);
152 background-repeat:no-repeat;
153 width:57px; height:57px;
154 -webkit-background-size:57px 57px;
155 background-size:57px 57px;
156 margin:0 12px 0 0;
157 border:1px solid #333;
158 -webkit-background-clip:padding-box;
159 background-clip:padding-box;
160}
diff --git a/frontend/delta/less/web/behavior.less b/frontend/delta/less/web/behavior.less
new file mode 100644
index 0000000..f9d0a3c
--- a/dev/null
+++ b/frontend/delta/less/web/behavior.less
@@ -0,0 +1,111 @@
1 //https://github.com/h5bp/Effeckt.css
2
3
4.slide () {
5 -webkit-transform: translate3d(0, 0, 0);
6 transform: translate3d(0, 0, 0);
7
8 &.left {
9 -webkit-transform: translate3d(-100%, 0, 0);
10 transform: translate3d(-100%, 0, 0);
11 }
12
13 &.center {
14 -webkit-transform: translate3d(0, 0, 0);
15 transform: translate3d(0, 0, 0);
16 }
17
18 &.right {
19 -webkit-transform: translate3d(100%, 0, 0);
20 transform: translate3d(100%, 0, 0);
21 visibility: hidden;
22 display: none;
23
24 &.transition {
25 visibility: visible;
26 display: block;
27 }
28 }
29
30 &.transition {
31 -webkit-transition-duration: .25s;
32 transition-duration: .25s;
33 }
34}
35
36 //http://coenraets.org/blog/2013/03/hardware-accelerated-page-transitions-for-mobile-web-apps-phonegap-apps/
37.page {
38 position: absolute;
39
40 top: 0;
41 left: 0;
42 width: 100%;
43 height: 100%;
44
45 .slide();
46}
47
48/*
49.registrationForm {
50 .steps {
51 .step {
52 position: absolute;
53
54 // top: 0;
55 // left: 0;
56 // width: 100%;
57 // height: 100%;
58
59 .slide();
60 }
61 }
62}
63*/
64
65//----------------------------------------------------------------------
66 //tentative 3D transformations
67/*
68.page {
69 transform: rotateY( 0deg) translateZ( 100px);
70
71 &.left {
72 transform: rotateY( -90deg) translateZ( 100px);
73 }
74
75 &.center {
76 transform: rotateY( 0deg) translateZ( 100px);
77 }
78
79 &.right {
80 transform: rotateY( 90deg) translateZ( 100px);
81 }
82}
83
84#mainDiv {
85 width: 100%;
86 height: 100%;
87 position: absolute;
88 transform-style: preserve-3d;
89
90 transition: transform 3s;
91
92 &.show-front { transform: translateZ( -100px ) rotateY( 0deg ); }
93 &.show-back { transform: translateZ( -100px ) rotateX( -180deg ); }
94 &.show-right { transform: translateZ( -100px ) rotateY( -90deg ); }
95 &.show-left { transform: translateZ( -100px ) rotateY( 90deg ); }
96 &.show-top { transform: translateZ( -100px ) rotateX( -90deg ); }
97 &.show-bottom { transform: translateZ( -100px ) rotateX( 90deg ); }
98}
99*/
100//=======================================================================
101
102
103//=======================================================================
104
105
106
107
108
109
110
111//========================================================
diff --git a/frontend/delta/less/web/fonts.less b/frontend/delta/less/web/fonts.less
new file mode 100644
index 0000000..071ebba
--- a/dev/null
+++ b/frontend/delta/less/web/fonts.less
@@ -0,0 +1,81 @@
1//========================================================================================
2//
3 //S o u r c e C o d e P r o
4//
5
6@font-face {
7 font-family: 'Source Code Pro';
8 font-style: normal;
9 font-weight: 200;
10 //src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqUMbjGELOEJD5J8DUmxkO-A.ttf) format('truetype');
11 src: local('Source Code Pro ExtraLight'), local('SourceCodePro-ExtraLight'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAASvIAAAAOkNGRiC57zEmAABJNAAAxfVEU0lHN9HpJQABLAQAACBYR0RFRi8sL9AAARa0AAAA1EdQT1MeKxk7AAEivAAACQxHU1VC3Z7yFQABF4gAAAsyT1MvMnIMzrUAAAFQAAAAYGNtYXDp1MYJAAA/BAAAChBoZWFk++6HegAAAOwAAAA2aGhlYQaHAN8AAAEkAAAAJGhtdHjIHsvPAAEPLAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZYg91ZIAAAGwAAA9VHBvc3T/uAAzAABJFAAAACAAAQAAAAEEWtZRnFVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6v5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/q/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWADIAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwMJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGgBFAAEAAAAAAAIABwBfAAEAAAAAAAMAKQBmAAEAAAAAAAQAGgBFAAEAAAAAAAUAOQCPAAEAAAAAAAYAGADIAAEAAAAAAAcAYADgAAEAAAAAAAgAGgFAAAEAAAAAAAkADAFaAAEAAAAAAAsAGQFmAAEAAAAAAA0R2QF/AAEAAAAAAA4AJBNYAAEAAAAAABAADxN8AAEAAAAAABEAChOLAAEAAAAAAQAAFhOVAAEAAAAAAQEACxOrAAEAAAAAAQIACxO2AAEAAAAAAQMAFRPBAAMAAQQJAAAAihPWAAMAAQQJAAEANBRgAAMAAQQJAAIADhSUAAMAAQQJAAMAUhSiAAMAAQQJAAQANBRgAAMAAQQJAAUAchT0AAMAAQQJAAYAMBVmAAMAAQQJAAcAwBWWAAMAAQQJAAgANBZWAAMAAQQJAAkAGBaKAAMAAQQJAAsAMhaiAAMAAQQJAA0jthbUAAMAAQQJAA4ASDqKAAMAAQQJABAAHjrSAAMAAQQJABEAFDrwAAMAAQQJAQAALDsEAAMAAQQJAQEAFjswAAMAAQQJAQIAFjtGAAMAAQQJAQMAKjtcQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEV4dHJhTGlnaHRSZWd1bGFyMS4wMTc7QURCRTtTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQ7QURPQkVWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9FeHRyYUxpZ2h0VHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AIABFAHgAdAByAGEATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0ADsAQQBEAE8AQgBFAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAxADcAOwBQAFMAIAAxAC4AMAAwADAAOwBoAG8AdABjAG8AbgB2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADkAMAAwAFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBFAHgAdAByAGEATABpAGcAaAB0AFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZABQAGEAdQBsACAARAAuACAASAB1AG4AdABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgACgAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AKQAsACAAdwBpAHQAaAAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACAAJwBTAG8AdQByAGMAZQAnAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AIABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgANAAoADQAKAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4ADQAKAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGMAbwBwAGkAZQBkACAAYgBlAGwAbwB3ACwAIABhAG4AZAAgAGkAcwAgAGEAbABzAG8AIABhAHYAYQBpAGwAYQBiAGwAZQAgAHcAaQB0AGgAIABhACAARgBBAFEAIABhAHQAOgAgAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAANAAoADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoAUwBJAEwAIABPAFAARQBOACAARgBPAE4AVAAgAEwASQBDAEUATgBTAEUAIABWAGUAcgBzAGkAbwBuACAAMQAuADEAIAAtACAAMgA2ACAARgBlAGIAcgB1AGEAcgB5ACAAMgAwADAANwANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgANAAoAUABSAEUAQQBNAEIATABFAA0ACgBUAGgAZQAgAGcAbwBhAGwAcwAgAG8AZgAgAHQAaABlACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACAAKABPAEYATAApACAAYQByAGUAIAB0AG8AIABzAHQAaQBtAHUAbABhAHQAZQAgAHcAbwByAGwAZAB3AGkAZABlACAAZABlAHYAZQBsAG8AcABtAGUAbgB0ACAAbwBmACAAYwBvAGwAbABhAGIAbwByAGEAdABpAHYAZQAgAGYAbwBuAHQAIABwAHIAbwBqAGUAYwB0AHMALAAgAHQAbwAgAHMAdQBwAHAAbwByAHQAIAB0AGgAZQAgAGYAbwBuAHQAIABjAHIAZQBhAHQAaQBvAG4AIABlAGYAZgBvAHIAdABzACAAbwBmACAAYQBjAGEAZABlAG0AaQBjACAAYQBuAGQAIABsAGkAbgBnAHUAaQBzAHQAaQBjACAAYwBvAG0AbQB1AG4AaQB0AGkAZQBzACwAIABhAG4AZAAgAHQAbwAgAHAAcgBvAHYAaQBkAGUAIABhACAAZgByAGUAZQAgAGEAbgBkACAAbwBwAGUAbgAgAGYAcgBhAG0AZQB3AG8AcgBrACAAaQBuACAAdwBoAGkAYwBoACAAZgBvAG4AdABzACAAbQBhAHkAIABiAGUAIABzAGgAYQByAGUAZAAgAGEAbgBkACAAaQBtAHAAcgBvAHYAZQBkACAAaQBuACAAcABhAHIAdABuAGUAcgBzAGgAaQBwACAAdwBpAHQAaAAgAG8AdABoAGUAcgBzAC4ADQAKAA0ACgBUAGgAZQAgAE8ARgBMACAAYQBsAGwAbwB3AHMAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAZAAgAGYAbwBuAHQAcwAgAHQAbwAgAGIAZQAgAHUAcwBlAGQALAAgAHMAdAB1AGQAaQBlAGQALAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGYAcgBlAGUAbAB5ACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABlAHkAIABhAHIAZQAgAG4AbwB0ACAAcwBvAGwAZAAgAGIAeQAgAHQAaABlAG0AcwBlAGwAdgBlAHMALgAgAFQAaABlACAAZgBvAG4AdABzACwAIABpAG4AYwBsAHUAZABpAG4AZwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAsACAAYwBhAG4AIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIABlAG0AYgBlAGQAZABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAYQBuAHkAIAByAGUAcwBlAHIAdgBlAGQAIABuAGEAbQBlAHMAIABhAHIAZQAgAG4AbwB0ACAAdQBzAGUAZAAgAGIAeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALgAgAFQAaABlACAAZgBvAG4AdABzACAAYQBuAGQAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALAAgAGgAbwB3AGUAdgBlAHIALAAgAGMAYQBuAG4AbwB0ACAAYgBlACAAcgBlAGwAZQBhAHMAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIAB0AHkAcABlACAAbwBmACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAGYAbwBuAHQAcwAgAG8AcgAgAHQAaABlAGkAcgAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAuAA0ACgANAAoARABFAEYASQBOAEkAVABJAE8ATgBTAA0ACgAiAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABzAGUAdAAgAG8AZgAgAGYAaQBsAGUAcwAgAHIAZQBsAGUAYQBzAGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQBuAGQAIABjAGwAZQBhAHIAbAB5ACAAbQBhAHIAawBlAGQAIABhAHMAIABzAHUAYwBoAC4AIABUAGgAaQBzACAAbQBhAHkAIABpAG4AYwBsAHUAZABlACAAcwBvAHUAcgBjAGUAIABmAGkAbABlAHMALAAgAGIAdQBpAGwAZAAgAHMAYwByAGkAcAB0AHMAIABhAG4AZAAgAGQAbwBjAHUAbQBlAG4AdABhAHQAaQBvAG4ALgANAAoADQAKACIAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABuAGEAbQBlAHMAIABzAHAAZQBjAGkAZgBpAGUAZAAgAGEAcwAgAHMAdQBjAGgAIABhAGYAdABlAHIAIAB0AGgAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAcwB0AGEAdABlAG0AZQBuAHQAKABzACkALgANAAoADQAKACIATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAGMAbwBsAGwAZQBjAHQAaQBvAG4AIABvAGYAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAGEAcwAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGIAeQAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAuAA0ACgANAAoAIgBNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAG0AYQBkAGUAIABiAHkAIABhAGQAZABpAG4AZwAgAHQAbwAsACAAZABlAGwAZQB0AGkAbgBnACwAIABvAHIAIABzAHUAYgBzAHQAaQB0AHUAdABpAG4AZwAgAC0ALQAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUAIAAtAC0AIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYwBvAG0AcABvAG4AZQBuAHQAcwAgAG8AZgAgAHQAaABlACAATwByAGkAZwBpAG4AYQBsACAAVgBlAHIAcwBpAG8AbgAsACAAYgB5ACAAYwBoAGEAbgBnAGkAbgBnACAAZgBvAHIAbQBhAHQAcwAgAG8AcgAgAGIAeQAgAHAAbwByAHQAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIAB0AG8AIABhACAAbgBlAHcAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQALgANAAoADQAKACIAQQB1AHQAaABvAHIAIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcwBpAGcAbgBlAHIALAAgAGUAbgBnAGkAbgBlAGUAcgAsACAAcAByAG8AZwByAGEAbQBtAGUAcgAsACAAdABlAGMAaABuAGkAYwBhAGwAIAB3AHIAaQB0AGUAcgAgAG8AcgAgAG8AdABoAGUAcgAgAHAAZQByAHMAbwBuACAAdwBoAG8AIABjAG8AbgB0AHIAaQBiAHUAdABlAGQAIAB0AG8AIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFAARQBSAE0ASQBTAFMASQBPAE4AIAAmACAAQwBPAE4ARABJAFQASQBPAE4AUwANAAoAUABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGgAZQByAGUAYgB5ACAAZwByAGEAbgB0AGUAZAAsACAAZgByAGUAZQAgAG8AZgAgAGMAaABhAHIAZwBlACwAIAB0AG8AIABhAG4AeQAgAHAAZQByAHMAbwBuACAAbwBiAHQAYQBpAG4AaQBuAGcAIABhACAAYwBvAHAAeQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAdABvACAAdQBzAGUALAAgAHMAdAB1AGQAeQAsACAAYwBvAHAAeQAsACAAbQBlAHIAZwBlACwAIABlAG0AYgBlAGQALAAgAG0AbwBkAGkAZgB5ACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQAsACAAYQBuAGQAIABzAGUAbABsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACAAYwBvAHAAaQBlAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHMAdQBiAGoAZQBjAHQAIAB0AG8AIAB0AGgAZQAgAGYAbwBsAGwAbwB3AGkAbgBnACAAYwBvAG4AZABpAHQAaQBvAG4AcwA6AA0ACgANAAoAMQApACAATgBlAGkAdABoAGUAcgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG4AbwByACAAYQBuAHkAIABvAGYAIABpAHQAcwAgAGkAbgBkAGkAdgBpAGQAdQBhAGwAIABjAG8AbQBwAG8AbgBlAG4AdABzACwAIABpAG4AIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMALAAgAG0AYQB5ACAAYgBlACAAcwBvAGwAZAAgAGIAeQAgAGkAdABzAGUAbABmAC4ADQAKAA0ACgAyACkAIABPAHIAaQBnAGkAbgBhAGwAIABvAHIAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuAHMAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABhAG4AZAAvAG8AcgAgAHMAbwBsAGQAIAB3AGkAdABoACAAYQBuAHkAIABzAG8AZgB0AHcAYQByAGUALAAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABlAGEAYwBoACAAYwBvAHAAeQAgAGMAbwBuAHQAYQBpAG4AcwAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAHAAeQByAGkAZwBoAHQAIABuAG8AdABpAGMAZQAgAGEAbgBkACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlAHMAZQAgAGMAYQBuACAAYgBlACAAaQBuAGMAbAB1AGQAZQBkACAAZQBpAHQAaABlAHIAIABhAHMAIABzAHQAYQBuAGQALQBhAGwAbwBuAGUAIAB0AGUAeAB0ACAAZgBpAGwAZQBzACwAIABoAHUAbQBhAG4ALQByAGUAYQBkAGEAYgBsAGUAIABoAGUAYQBkAGUAcgBzACAAbwByACAAaQBuACAAdABoAGUAIABhAHAAcAByAG8AcAByAGkAYQB0AGUAIABtAGEAYwBoAGkAbgBlAC0AcgBlAGEAZABhAGIAbABlACAAbQBlAHQAYQBkAGEAdABhACAAZgBpAGUAbABkAHMAIAB3AGkAdABoAGkAbgAgAHQAZQB4AHQAIABvAHIAIABiAGkAbgBhAHIAeQAgAGYAaQBsAGUAcwAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAbwBzAGUAIABmAGkAZQBsAGQAcwAgAGMAYQBuACAAYgBlACAAZQBhAHMAaQBsAHkAIAB2AGkAZQB3AGUAZAAgAGIAeQAgAHQAaABlACAAdQBzAGUAcgAuAA0ACgANAAoAMwApACAATgBvACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAdQBzAGUAIAB0AGgAZQAgAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACgAcwApACAAdQBuAGwAZQBzAHMAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAgAGkAcwAgAGcAcgBhAG4AdABlAGQAIABiAHkAIAB0AGgAZQAgAGMAbwByAHIAZQBzAHAAbwBuAGQAaQBuAGcAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByAC4AIABUAGgAaQBzACAAcgBlAHMAdAByAGkAYwB0AGkAbwBuACAAbwBuAGwAeQAgAGEAcABwAGwAaQBlAHMAIAB0AG8AIAB0AGgAZQAgAHAAcgBpAG0AYQByAHkAIABmAG8AbgB0ACAAbgBhAG0AZQAgAGEAcwAgAHAAcgBlAHMAZQBuAHQAZQBkACAAdABvACAAdABoAGUAIAB1AHMAZQByAHMALgANAAoADQAKADQAKQAgAFQAaABlACAAbgBhAG0AZQAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAG8AcgAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABzAGgAYQBsAGwAIABuAG8AdAAgAGIAZQAgAHUAcwBlAGQAIAB0AG8AIABwAHIAbwBtAG8AdABlACwAIABlAG4AZABvAHIAcwBlACAAbwByACAAYQBkAHYAZQByAHQAaQBzAGUAIABhAG4AeQAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4ALAAgAGUAeABjAGUAcAB0ACAAdABvACAAYQBjAGsAbgBvAHcAbABlAGQAZwBlACAAdABoAGUAIABjAG8AbgB0AHIAaQBiAHUAdABpAG8AbgAoAHMAKQAgAG8AZgAgAHQAaABlACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAoAHMAKQAgAGEAbgBkACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AcgAgAHcAaQB0AGgAIAB0AGgAZQBpAHIAIABlAHgAcABsAGkAYwBpAHQAIAB3AHIAaQB0AHQAZQBuACAAcABlAHIAbQBpAHMAcwBpAG8AbgAuAA0ACgANAAoANQApACAAVABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABtAG8AZABpAGYAaQBlAGQAIABvAHIAIAB1AG4AbQBvAGQAaQBmAGkAZQBkACwAIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACwAIABtAHUAcwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZQBuAHQAaQByAGUAbAB5ACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUALAAgAGEAbgBkACAAbQB1AHMAdAAgAG4AbwB0ACAAYgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAdQBuAGQAZQByACAAYQBuAHkAIABvAHQAaABlAHIAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAVABFAFIATQBJAE4AQQBUAEkATwBOAA0ACgBUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGIAZQBjAG8AbQBlAHMAIABuAHUAbABsACAAYQBuAGQAIAB2AG8AaQBkACAAaQBmACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAIABhAHIAZQAgAG4AbwB0ACAAbQBlAHQALgANAAoADQAKAEQASQBTAEMATABBAEkATQBFAFIADQAKAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAEkAUwAgAFAAUgBPAFYASQBEAEUARAAgACIAQQBTACAASQBTACIALAAgAFcASQBUAEgATwBVAFQAIABXAEEAUgBSAEEATgBUAFkAIABPAEYAIABBAE4AWQAgAEsASQBOAEQALAAgAEUAWABQAFIARQBTAFMAIABPAFIAIABJAE0AUABMAEkARQBEACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEIAVQBUACAATgBPAFQAIABMAEkATQBJAFQARQBEACAAVABPACAAQQBOAFkAIABXAEEAUgBSAEEATgBUAEkARQBTACAATwBGACAATQBFAFIAQwBIAEEATgBUAEEAQgBJAEwASQBUAFkALAAgAEYASQBUAE4ARQBTAFMAIABGAE8AUgAgAEEAIABQAEEAUgBUAEkAQwBVAEwAQQBSACAAUABVAFIAUABPAFMARQAgAEEATgBEACAATgBPAE4ASQBOAEYAUgBJAE4ARwBFAE0ARQBOAFQAIABPAEYAIABDAE8AUABZAFIASQBHAEgAVAAsACAAUABBAFQARQBOAFQALAAgAFQAUgBBAEQARQBNAEEAUgBLACwAIABPAFIAIABPAFQASABFAFIAIABSAEkARwBIAFQALgAgAEkATgAgAE4ATwAgAEUAVgBFAE4AVAAgAFMASABBAEwATAAgAFQASABFACAAQwBPAFAAWQBSAEkARwBIAFQAIABIAE8ATABEAEUAUgAgAEIARQAgAEwASQBBAEIATABFACAARgBPAFIAIABBAE4AWQAgAEMATABBAEkATQAsACAARABBAE0AQQBHAEUAUwAgAE8AUgAgAE8AVABIAEUAUgAgAEwASQBBAEIASQBMAEkAVABZACwAIABJAE4AQwBMAFUARABJAE4ARwAgAEEATgBZACAARwBFAE4ARQBSAEEATAAsACAAUwBQAEUAQwBJAEEATAAsACAASQBOAEQASQBSAEUAQwBUACwAIABJAE4AQwBJAEQARQBOAFQAQQBMACwAIABPAFIAIABDAE8ATgBTAEUAUQBVAEUATgBUAEkAQQBMACAARABBAE0AQQBHAEUAUwAsACAAVwBIAEUAVABIAEUAUgAgAEkATgAgAEEATgAgAEEAQwBUAEkATwBOACAATwBGACAAQwBPAE4AVABSAEEAQwBUACwAIABUAE8AUgBUACAATwBSACAATwBUAEgARQBSAFcASQBTAEUALAAgAEEAUgBJAFMASQBOAEcAIABGAFIATwBNACwAIABPAFUAVAAgAE8ARgAgAFQASABFACAAVQBTAEUAIABPAFIAIABJAE4AQQBCAEkATABJAFQAWQAgAFQATwAgAFUAUwBFACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAATwBSACAARgBSAE8ATQAgAE8AVABIAEUAUgAgAEQARQBBAEwASQBOAEcAUwAgAEkATgAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAuAA0ACgBoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwB0AHkAcABlAC8AbABlAGcAYQBsAC4AaAB0AG0AbABTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBFAHgAdAByAGEATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARlTb3VyY2VDb2RlUHJvLUV4dHJhTGlnaHQAAQEBLvr2APr3Afr4DAD6+QL6+gP6+wSMDAF1/CT5Vvp8BRwvFQ8cMY8Rxx0AALOjEgLhAgABAAgADgAVABwAIwAqADEAOAA/AEYATQBUAFsAYgBpAHAAdwB9AIgAjgCYAJ4ApQCsALIAuAC/AMUAzwDWAN0A5ADrAPIA+QEAAQcBDgEZAR8BKQEwATYBPQFIAVMBWgFhAWUBawFyAXkBgwGKAZEBmAGfAaoBsQG3Ab0BxAHIAc8B1gHdAeQB6gHwAfcB/gIFAgwCEwIaAicCLgI1AjwCQwJKAlECWAJfAmQCawJyAnkCgAKHAo4ClAKaAqECqAKvArYCvALHAs4C1QLcAuMC6gLwAvcC/gMFAwwDEgMZAx8DJAMxAzgDPwNGA00DVANbA2IDaQNuA3UDfAODA4oDkQOXA50DqAOxA7cDwgPJA9AD1wPeA+QD7gP1A/wEAwQJBBAEFwQeBCUELAQzBDoEQQRIBE8EVgRdBGQEawRyBHgEgwSJBJMEmQSgBKcErQSzBLoEwATKBNEE2ATfBOYE7QT0BPsFAgUJBRQFGgUkBSsFMQU4BUMFTgVVBVwFYAVmBW0FdAV7BYIFiQWQBZkFpAWrBbcFvQXDBccFzgXVBdwF4wXqBfAF9gX9BgQGCwYSBh0GJAYrBjgGPwZGBk0GVAZbBmIGaQZwBnUGfAaDBooGkQaYBp8GpQasBrIGuQbABscGzQbYBt8G5gbtBvQG+gcBBwgHDwcWBx0HIwcqBzAHNQdCB0kHUAdXB14HZQdsB3MHegd/B4YHjQeUB5sHogeoB64HuQfCB8gH0wfaB+EH6AfvB/UH/wgGCA0IFAgbCCIIKQgwCDcIPghFCEwIUwhaCGEIaAhrCHMIewiICJAImwikCKwIswi8CMUIzgjXCOAI6QjyCPsJBAkNCRYJHwkoCTEJNAlBCUkJVQleCWYJbwl8CYUJjQmVCZ8JqAmxCbkJwwnNCdYJ3QnkCesJ8gn5CgMKCwoUChwKJQotCjUKPwpIClEKWQpjCm0KdgqECpMKngqoCrEKuQrBCssK1ArdCuUK7wr5CwILEAsfCyoLNAs9C0ULTQtXC2ALaQtxC3sLhQuOC5wLqwu2C8ALyQvRC9kL4wvsC/UL/QwHDBEMGgwoDDcMQgxMDFkMXwxlDGsMcQx3DH0MgwyJDI8MlQybDKEMpwytDLMMuQy/DMUMywzRDNcM3QzjDOkM7wz1DQANCw0XDR0NIw0nDS4NMg05DT8NQw1KDVENWA1fDWYNbQ13DX4Nhw2TDZsNpg2oDbANtw3CDcoN0Q3YDd8N6A3vDfYN/w4GDg0OFA4dDiQOKw4yDjkOQA5HDk4OVQ5cDmMOag5xDngOfw6GDo0OlA6bDqIOqQ6wDrcOvg7FDswO0w7aDuEO6A7zDvoPBQ8MDxcPHg8pDzAPOw9CD00PVA9fD2YPcQ94D4MPig+VD5wPpw+uD7kPwA/LD9IP2Q/gD+cP7g/1D/wQBxAOEBkQIBAnEDIQQRBMEFsQZhB1EIAQjxCaEKkQtBDDEM4Q3RDoEPcRAhERERwRKxE2EUURUBFfEWoReRGCEYsRkhGZEaMRrxG2Eb0RxBHLEdIR2RHgEecR7hH1EfwSAxIKEhESGBIfEiYSLRI0EjsSQhJJElASVxJeEmUSbBJzEnoSgRKIEo8SlhKdEqQSqxKyErkSwBLHEs4S1RLcEuMS6hLxEvgS/xMGEw0TFBMbEyITKRMwEzcTPhNFE0wTUxNaE2ETaBNvE3YTfROEE4sTkhOZE6ATpxOuE7UTvBPDE8oT0RPYE98T5hPtE/QT+xQCFAkUEBQXFB4UJRQsFDMUOhRBFEgUTxRWFF0UZBRrFHIUeRSAFIcUjhSVFJwUoxSqFLEUuBS/FMYUzRTUFNsU4hTpFPAU9xT+FQUVDBUTFRoVIRUoFS8VNhU9FUQVSxVSFVkVYBVnFW4VdRV8FYMVihWRFZgVnxWmFa0VtBW7FcIVyRXQFdcV3hXlFewV8xX6FgEWCBYPFhYWHRYiFoIWxxbhFvAW+kFtYWNyb25BYnJldmV1bmkwMUNEdW5pMUVBMHVuaTFFQTJ1bmkxRUE0dW5pMUVBNnVuaTFFQTh1bmkxRUFBdW5pMUVBQ3VuaTFFQUV1bmkxRUIwdW5pMUVCMnVuaTFFQjR1bmkxRUI2QW9nb25la3VuaTAyNDNDYWN1dGVDY2lyY3VtZmxleENjYXJvbkNkb3RhY2NlbnREY2Fyb251bmkxRTBDdW5pMUUwRURjcm9hdEVjYXJvbkVtYWNyb25FYnJldmVFZG90YWNjZW50dW5pMUVCOHVuaTFFQkF1bmkxRUJDdW5pMUVCRXVuaTFFQzB1bmkxRUMydW5pMUVDNHVuaTFFQzZFb2dvbmVrR2NpcmN1bWZsZXhHYnJldmVHZG90YWNjZW50dW5pMDEyMkdjYXJvbnVuaTFFMjB1bmkwMDQ3MDMwM0hjaXJjdW1mbGV4dW5pMUUyNHVuaTFFMkFIYmFySXRpbGRlSW1hY3JvbnVuaTAxMkNJZG90YWNjZW50dW5pMDFDRnVuaTFFQzh1bmkxRUNBSW9nb25la0pjaXJjdW1mbGV4dW5pMDEzNkxhY3V0ZUxjYXJvbnVuaTAxM0JMZG90dW5pMUUzNnVuaTFFMzh1bmkxRTNBdW5pMUU0Mk5hY3V0ZU5jYXJvbnVuaTAxNDV1bmkxRTQ0dW5pMUU0NnVuaTFFNDhPbWFjcm9udW5pMDE0RU9odW5nYXJ1bWxhdXR1bmkwMUQxdW5pMUVDQ3VuaTFFQ0V1bmkxRUQwdW5pMUVEMnVuaTFFRDR1bmkxRUQ2dW5pMUVEOE9ob3JudW5pMUVEQXVuaTFFREN1bmkxRURFdW5pMUVFMHVuaTFFRTJ1bmkwMUVBUmFjdXRlUmNhcm9udW5pMDE1NnVuaTFFNUF1bmkxRTVDdW5pMUU1RVNhY3V0ZVNjaXJjdW1mbGV4dW5pMDE1RXVuaTAyMTh1bmkxRTYwdW5pMUU2MnVuaTFFOUVUY2Fyb251bmkwMTYydW5pMDIxQXVuaTFFNkN1bmkxRTZFVXRpbGRlVW1hY3JvblVicmV2ZVVyaW5nVWh1bmdhcnVtbGF1dHVuaTAxRDN1bmkwMUQ1dW5pMDFEN3VuaTAxRDl1bmkwMURCdW5pMUVFNHVuaTFFRTZVb2dvbmVrVWhvcm51bmkxRUU4dW5pMUVFQXVuaTFFRUN1bmkxRUVFdW5pMUVGMFdncmF2ZVdhY3V0ZVdjaXJjdW1mbGV4V2RpZXJlc2lzWWdyYXZlWWNpcmN1bWZsZXh1bmkxRThFdW5pMUVGNHVuaTFFRjZ1bmkxRUY4WmFjdXRlWmRvdGFjY2VudHVuaTFFOTJ1bmkwMThGYW1hY3JvbmFicmV2ZXVuaTAxQ0V1bmkxRUExdW5pMUVBM3VuaTFFQTV1bmkxRUE3dW5pMUVBOXVuaTFFQUJ1bmkxRUFEdW5pMUVBRnVuaTFFQjF1bmkxRUIzdW5pMUVCNXVuaTFFQjdhb2dvbmVrdW5pMDE4MGNhY3V0ZWNjaXJjdW1mbGV4Y2Nhcm9uY2RvdGFjY2VudGRjYXJvbnVuaTFFMER1bmkxRTBGZGNyb2F0ZWNhcm9uZW1hY3JvbmVicmV2ZWVkb3RhY2NlbnR1bmkxRUI5dW5pMUVCQnVuaTFFQkR1bmkxRUJGdW5pMUVDMXVuaTFFQzN1bmkxRUM1dW5pMUVDN2VvZ29uZWtnY2lyY3VtZmxleGdicmV2ZWdkb3RhY2NlbnR1bmkwMTIzZ2Nhcm9udW5pMUUyMXVuaTAwNjcwMzAzaGNpcmN1bWZsZXh1bmkxRTI1dW5pMUUyQmhiYXJpdGlsZGVpbWFjcm9udW5pMDEyRHVuaTAxRDB1bmkxRUM5dW5pMUVDQmlvZ29uZWtpb2dvbmVrLmRqY2lyY3VtZmxleHVuaTAxMzdrZ3JlZW5sYW5kaWNsYWN1dGVsY2Fyb25sZG90dW5pMDEzQ3VuaTFFMzd1bmkxRTM5dW5pMUUzQnVuaTFFNDNuYWN1dGVuY2Fyb251bmkwMTQ2dW5pMUU0NXVuaTFFNDd1bmkxRTQ5bmFwb3N0cm9waGVvbWFjcm9udW5pMDE0Rm9odW5nYXJ1bWxhdXR1bmkwMUQydW5pMUVDRHVuaTFFQ0Z1bmkxRUQxdW5pMUVEM3VuaTFFRDV1bmkxRUQ3dW5pMUVEOW9ob3JudW5pMUVEQnVuaTFFRER1bmkxRURGdW5pMUVFMXVuaTFFRTN1bmkwMUVCcmFjdXRldW5pMDE1N3JjYXJvbnVuaTFFNUJ1bmkxRTVEdW5pMUU1RnNhY3V0ZXNjaXJjdW1mbGV4dW5pMDE1RnVuaTAyMTl1bmkxRTYxdW5pMUU2M3RjYXJvbnVuaTAxNjN1bmkwMjFCdW5pMUU2RHVuaTFFNkZ1bmkxRTk3dXRpbGRldW1hY3JvbnVicmV2ZXVyaW5ndWh1bmdhcnVtbGF1dHVuaTAxRDR1bmkwMUQ2dW5pMDFEOHVuaTAxREF1bmkwMURDdW5pMUVFNXVuaTFFRTd1b2dvbmVrdWhvcm51bmkxRUU5dW5pMUVFQnVuaTFFRUR1bmkxRUVGdW5pMUVGMXdncmF2ZXdhY3V0ZXdjaXJjdW1mbGV4d2RpZXJlc2lzeWdyYXZleWNpcmN1bWZsZXh1bmkxRThGdW5pMUVGNXVuaTFFRjd1bmkxRUY5emFjdXRlemRvdGFjY2VudHVuaTFFOTN1bmkwMjM3dW5pMDI1MHVuaTAyNTF1bmkwMjUydW5pMDI1OXVuaTAyNjF1bmkwMjY1dW5pMDI2RnVuaTAyNzl1bmkwMjg3dW5pMDI4Q3VuaTAyOER1bmkwMjhFdW5pMDI5RWEuYWFncmF2ZS5hYWFjdXRlLmFhY2lyY3VtZmxleC5hYXRpbGRlLmFhZGllcmVzaXMuYWFtYWNyb24uYWFicmV2ZS5hYXJpbmcuYXVuaTAxQ0UuYXVuaTFFQTEuYXVuaTFFQTMuYXVuaTFFQTUuYXVuaTFFQTcuYXVuaTFFQTkuYXVuaTFFQUIuYXVuaTFFQUQuYXVuaTFFQUYuYXVuaTFFQjEuYXVuaTFFQjMuYXVuaTFFQjUuYXVuaTFFQjcuYWFvZ29uZWsuYWcuYWdjaXJjdW1mbGV4LmFnYnJldmUuYWdkb3RhY2NlbnQuYXVuaTAxMjMuYWdjYXJvbi5hdW5pMUUyMS5hdW5pMDA2NzAzMDMuYXplcm8ub251bW9uZS5vbnVtdHdvLm9udW10aHJlZS5vbnVtZm91ci5vbnVtZml2ZS5vbnVtc2l4Lm9udW1zZXZlbi5vbnVtZWlnaHQub251bW5pbmUub251bXVuaTAwQUR1bmkyMDE1dW5pMjExN3VuaTIxMjBhdC5jYXNlYXN0ZXJpc2suYWh5cGhlbi5hdW5pMDBBRC5hZG9sbGFyLmF6ZXJvLnN1cHNvbmUuc3Vwc3R3by5zdXBzdGhyZWUuc3Vwc2ZvdXIuc3Vwc2ZpdmUuc3Vwc3NpeC5zdXBzc2V2ZW4uc3Vwc2VpZ2h0LnN1cHNuaW5lLnN1cHNwYXJlbmxlZnQuc3Vwc3BhcmVucmlnaHQuc3Vwc3BlcmlvZC5zdXBzY29tbWEuc3Vwc3plcm8uc3Vic29uZS5zdWJzdHdvLnN1YnN0aHJlZS5zdWJzZm91ci5zdWJzZml2ZS5zdWJzc2l4LnN1YnNzZXZlbi5zdWJzZWlnaHQuc3Vic25pbmUuc3Vic3BhcmVubGVmdC5zdWJzcGFyZW5yaWdodC5zdWJzcGVyaW9kLnN1YnNjb21tYS5zdWJzemVyby5kbm9tb25lLmRub210d28uZG5vbXRocmVlLmRub21mb3VyLmRub21maXZlLmRub21zaXguZG5vbXNldmVuLmRub21laWdodC5kbm9tbmluZS5kbm9tcGFyZW5sZWZ0LmRub21wYXJlbnJpZ2h0LmRub21wZXJpb2QuZG5vbWNvbW1hLmRub216ZXJvLm51bXJvbmUubnVtcnR3by5udW1ydGhyZWUubnVtcmZvdXIubnVtcmZpdmUubnVtcnNpeC5udW1yc2V2ZW4ubnVtcmVpZ2h0Lm51bXJuaW5lLm51bXJwYXJlbmxlZnQubnVtcnBhcmVucmlnaHQubnVtcnBlcmlvZC5udW1yY29tbWEubnVtcm9yZGZlbWluaW5lLmFhLnN1cHNiLnN1cHNjLnN1cHNkLnN1cHNlLnN1cHNmLnN1cHNnLnN1cHNoLnN1cHNpLnN1cHNqLnN1cHNrLnN1cHNsLnN1cHNtLnN1cHNuLnN1cHNvLnN1cHNwLnN1cHNxLnN1cHNyLnN1cHNzLnN1cHN0LnN1cHN1LnN1cHN2LnN1cHN3LnN1cHN4LnN1cHN5LnN1cHN6LnN1cHNlZ3JhdmUuc3Vwc2VhY3V0ZS5zdXBzdW5pMDI1OS5zdXBzYS5zdXBhZy5zdXBhRXVyb3VuaTAxOTJsaXJhdW5pMjBBNnBlc2V0YWRvbmd1bmkyMEIxdW5pMjBCMnVuaTIwQjV1bmkyMEI5dW5pMjBCQXVuaTIyMTVzbGFzaC5mcmFjdW5pMjIxOWxlc3NlcXVhbGdyZWF0ZXJlcXVhbG5vdGVxdWFsYXBwcm94ZXF1YWxwaWluZmluaXR5dW5pMDBCNXBhcnRpYWxkaWZmaW50ZWdyYWxyYWRpY2FsdW5pMjIwNnVuaTIxMjZzdW1tYXRpb25wcm9kdWN0dW5pMjExM2VzdGltYXRlZHVuaTIxOTBhcnJvd3VwdW5pMjE5MmFycm93ZG93bnVuaTI1QTB1bmkyNUM2dW5pMjVDOXVuaTI3NTJ0cmlhZ3VwdW5pMjVCM3VuaTI1QjZ1bmkyNUI3dHJpYWdkbnVuaTI1QkR1bmkyNUMwdW5pMjVDMXVuaTI2MTB1bmkyNjExdW5pMjcxM3VuaTI2NkFsb3plbmdldW5pMjAzMnVuaTIwMzN1bmkwMkJCdW5pMDJCQ3VuaTAyQkV1bmkwMkJGdW5pMDJDOHVuaTAyQzl1bmkwMkNBdW5pMDJDQnVuaTAyQ0N1bmkwMzAwdW5pMDMwMC5jYXB1bmkwMzAxdW5pMDMwMS5jYXB1bmkwMzAydW5pMDMwMi5jYXB1bmkwMzAzdW5pMDMwMy5jYXB1bmkwMzA0dW5pMDMwNC5jYXB1bmkwMzA2dW5pMDMwNi5jYXB1bmkwMzA3dW5pMDMwNy5jYXB1bmkwMzA4dW5pMDMwOC5jYXB1bmkwMzA5dW5pMDMwOS5jYXB1bmkwMzBBdW5pMDMwQS5jYXB1bmkwMzBCdW5pMDMwQi5jYXB1bmkwMzBDdW5pMDMwQy5jYXB1bmkwMzBGdW5pMDMwRi5jYXB1bmkwMzEydW5pMDMxM3VuaTAzMUJ1bmkwMzIzdW5pMDMyNHVuaTAzMjZ1bmkwMzI3dW5pMDMyNy5jYXB1bmkwMzI4dW5pMDMyOC5jYXB1bmkwMzJFdW5pMDMzMXVuaTAzMDgwMzA0dW5pMDMwODAzMDQuY2FwdW5pMDMwODAzMDF1bmkwMzA4MDMwMS5jYXB1bmkwMzA4MDMwQ3VuaTAzMDgwMzBDLmNhcHVuaTAzMDgwMzAwdW5pMDMwODAzMDAuY2FwdW5pMDMwMjAzMDF1bmkwMzAyMDMwMS5jYXB1bmkwMzAyMDMwMHVuaTAzMDIwMzAwLmNhcHVuaTAzMDIwMzA5dW5pMDMwMjAzMDkuY2FwdW5pMDMwMjAzMDN1bmkwMzAyMDMwMy5jYXB1bmkwMzA2MDMwMXVuaTAzMDYwMzAxLmNhcHVuaTAzMDYwMzAwdW5pMDMwNjAzMDAuY2FwdW5pMDMwNjAzMDl1bmkwMzA2MDMwOS5jYXB1bmkwMzA2MDMwM3VuaTAzMDYwMzAzLmNhcHVuaTAzMDIwMzA2dW5pMDMwMjAzMDYuY2FwdW5pMDMwQy5hdW5pMDMyNi5hdW5pMDBBMHVuaTIwMDdzcGFjZS5mcmFjbmJzcGFjZS5mcmFjdW5pMjUwMHVuaTI1MDF1bmkyNTAydW5pMjUwM3VuaTI1MDR1bmkyNTA1dW5pMjUwNnVuaTI1MDd1bmkyNTA4dW5pMjUwOXVuaTI1MEF1bmkyNTBCdW5pMjUwQ3VuaTI1MER1bmkyNTBFdW5pMjUwRnVuaTI1MTB1bmkyNTExdW5pMjUxMnVuaTI1MTN1bmkyNTE0dW5pMjUxNXVuaTI1MTZ1bmkyNTE3dW5pMjUxOHVuaTI1MTl1bmkyNTFBdW5pMjUxQnVuaTI1MUN1bmkyNTFEdW5pMjUxRXVuaTI1MUZ1bmkyNTIwdW5pMjUyMXVuaTI1MjJ1bmkyNTIzdW5pMjUyNHVuaTI1MjV1bmkyNTI2dW5pMjUyN3VuaTI1Mjh1bmkyNTI5dW5pMjUyQXVuaTI1MkJ1bmkyNTJDdW5pMjUyRHVuaTI1MkV1bmkyNTJGdW5pMjUzMHVuaTI1MzF1bmkyNTMydW5pMjUzM3VuaTI1MzR1bmkyNTM1dW5pMjUzNnVuaTI1Mzd1bmkyNTM4dW5pMjUzOXVuaTI1M0F1bmkyNTNCdW5pMjUzQ3VuaTI1M0R1bmkyNTNFdW5pMjUzRnVuaTI1NDB1bmkyNTQxdW5pMjU0MnVuaTI1NDN1bmkyNTQ0dW5pMjU0NXVuaTI1NDZ1bmkyNTQ3dW5pMjU0OHVuaTI1NDl1bmkyNTRBdW5pMjU0QnVuaTI1NEN1bmkyNTREdW5pMjU0RXVuaTI1NEZ1bmkyNTUwdW5pMjU1MXVuaTI1NTJ1bmkyNTUzdW5pMjU1NHVuaTI1NTV1bmkyNTU2dW5pMjU1N3VuaTI1NTh1bmkyNTU5dW5pMjU1QXVuaTI1NUJ1bmkyNTVDdW5pMjU1RHVuaTI1NUV1bmkyNTVGdW5pMjU2MHVuaTI1NjF1bmkyNTYydW5pMjU2M3VuaTI1NjR1bmkyNTY1dW5pMjU2NnVuaTI1Njd1bmkyNTY4dW5pMjU2OXVuaTI1NkF1bmkyNTZCdW5pMjU2Q3VuaTI1NkR1bmkyNTZFdW5pMjU2RnVuaTI1NzB1bmkyNTcxdW5pMjU3MnVuaTI1NzN1bmkyNTc0dW5pMjU3NXVuaTI1NzZ1bmkyNTc3dW5pMjU3OHVuaTI1Nzl1bmkyNTdBdW5pMjU3QnVuaTI1N0N1bmkyNTdEdW5pMjU3RXVuaTI1N0Z1bmkyNTgwdW5pMjU4MXVuaTI1ODJ1bmkyNTgzdW5pMjU4NHVuaTI1ODV1bmkyNTg2dW5pMjU4N3VuaTI1ODh1bmkyNTg5dW5pMjU4QXVuaTI1OEJ1bmkyNThDdW5pMjU4RHVuaTI1OEV1bmkyNThGdW5pMjU5MHVuaTI1OTF1bmkyNTkydW5pMjU5M3VuaTI1OTR1bmkyNTk1dW5pMjU5NnVuaTI1OTd1bmkyNTk4dW5pMjU5OXVuaTI1OUF1bmkyNTlCdW5pMjU5Q3VuaTI1OUR1bmkyNTlFdW5pMjU5RnVuaTAyNTh1bmkwMjU0MS4wMDBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5Db3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIElu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+wUGCxX3Ban7BQYLyv//yYAAuQt3AfcwqQup96SnCxX3wKn7ovkjbQYL97AB/wEVgAC4Awv7LKL4H6P4H6IBC/fA+UFt/SP7ogYL+Vylx+kB91KlAwt7CvexCwf7IHw1+xD7UhoLpRLRqwu5+My5C6n3KqkLAAAAAlgAVAAAADIAdwBKAGQAhACcAD0AXABwAGIAegCcAF8AYAA4AHwAPAB8AFAAMgBcAEEADwBTADgASABgAG4AWgBGAFAAeABYAG4AZABCAIIAYQBQAG4ARgBuAEYAqgBXAFQAWgBCAAwAVgBAAEgAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAAACoASgBKAEoASgBKAGQAZABkABwAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAIQAhACEAD0APQA9AD0APQA9AD0AXABcAFwAEABwAHAAcABwAHAAcABwAHAAcABwAHAAcABiAHoAmgCcAJwAnACcAEwAnABFAF8AYABgAGAAYABgAGAAYAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgALAA4ADgAOAA4ADgAOAA4AHwAfAB8AHwAfAB8AFAAUABQAFAAUABQAFAAWgAyADIAMgAyADIAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAA8ADwAPAA8AOAA4ADgAOAA4ADgAOAA4AEgASABIAEgAHAB8AEIAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAARACAAWgBaAFoAWgBaAEYARgBGAEYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFgAWABYAFgAWABYAFgAIABuAG4AIABkAGQAZABkAGQAZABkAGQAZABkAGQAZABkAEIAggCCAGEAYQBDAGEAYQBhAGEAYQBQAG4AbgBuAG4AbgBuAG7//gBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYACgBGAEYARgBGAEYARgBGAKoAgACqAJ4AngBWAFcAVwBXAFcAVwBXAFcAbgBUAFQAVABUAFQAVABaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoADAAMAAwADABAAEAAQABAAEAAQABAAEAASABIAEgASABGAG4AQgBwAEYAbgBEAEYAUABGAFoAOgBIADoAQgAMAEAAJABYAF0ARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgA5AFQAcABTAEYAKwBAAFoATABKAE4AVABwAFMARgArAEAAXABMAEoATgD4ANAA+ADQADoA+AD4AHYAigEMAKgA5gDmAIIAggDmAIIA1wDjAHMAfwBiAGIAUAAUAFAAFAD4AKQAPADmAHYA9gBeAIQAXgB4AR4AeAEeAGUAngCeAGoAXAAoACgAeAACACIAQABAAGQAeQCOAI4AZgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAqADaALoAsgC0ALIAugC7ALYAtAD+AOABDAECAKgA2gC6ALIAtACyALwAuwC2ALQA/gDgAQwBAgCoANoAugCyALQAsgC6ALsAtgC0AP4A4AEMAQIAsgCQAJYAsgC6AL0AkACqANIAogC+ALQAkgDUAM8AjwC+AJYAugCQAQsArwCvAKoAqwBRALwAlACOAKoAqgCgAJAAkAC+AEwAZgBSAEYARAB+ADQAbgBUAD4APAB8ADwAYgBuAHsASAAmACYAJgAcAD4AJgAmACYAJgAmACYAJgAmACYAYgBiAHQAYgDyAGIAfAByAGIAYgBiAIQAYgBgAGAAYgA8AAQAWgBaANkAVgA2ACoATgBKAJYAGgAUACIAHAAiANkAswCIALYAMQAxAFMAUwAxADEALQAt/+r/6gACAGEAcgEWANYA5gDmAP8A4wDcAPgAwADAAQ0AvgD2ANoBDQC2ALQAvgC4AN4A4AEEAPAA+gDcAMIA+AEMAMAAvgC2ALAAvgC+ALgAvAEEAQoAtADAAPoA+gDeAN4A4ADWAMAAvgCMAIwBBAEEASQBBADAAOYA5gDeAPoA/AC4ALwAvAC+AMAAwADAAL4AwADAAMoAxADKAMQAygDEALYAtgC4AL4AuAC+ALgAvgC2ALYAwgC+AQ4A9AAAAAAAAAAA//H/8QEdAQ4AIQAhAR0BDgASABIBHQEOAR0BHQEOAQ7/8f/x//H/8QEdAR0BDgEO//H/8f/x//EBHQEdAQ4BDgEOAQ4BDgEO//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//H/8f/x//EASwBLAR0BDv/xAP8BHQD/AP//8f/x//EBHQD/AP//8f/x//EBHQD/AP//8f/x//H/8f/x//H/8f/x//H/8f/x//EBHf/x//EBHf/x//H/8f/xAR0BHQEd//EBDgEdAQ7/8QEO//EBDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAAAAAAAAAINAAABLAAAAAAAAAAAAAABLAAAAAAAAQAAAAwAAAAAAL4AAgAdAAIANQABAEsATAABAGcAZwABAG4AbgACAH4AfgABAKEAowABAKkAqQABAM0AzgABAOYA5gABAPwA/AABAQQBBAACARgBGAABARwBHAACAR8BHwACAS4BLgACAS8BMAABATUBNQACAVUBVwABAV0BXQABAWwBbAACAYIBgwABAZoBqgABAa0BrQABAcMBxAABAcgByAACAs0CzQABAtcC1wABAt0DHAADAx4DHgADAAIAAwLdAvgAAQMDAxwAAQMeAx4AAQABAAAACgBsAhoAAkRGTFQADmxhdG4AOAAEAAAAAP//ABAAAAACAAQABgAIAAoADAAOABAAEgAUABYAGAAaABwAHgAEAAAAAP//ABAAAQADAAUABwAJAAsADQAPABEAEwAVABcAGQAbAB0AHwAgYWFsdADCYWFsdADKY2FzZQDSY2FzZQDYY2NtcADeY2NtcADsZG5vbQD6ZG5vbQEAZnJhYwEGZnJhYwEQbnVtcgEabnVtcgEgb251bQEmb251bQEsb3JkbgEyb3JkbgE4c2FsdAE+c2FsdAFKc2luZgFWc2luZgFcc3MwMQFic3MwMQFoc3MwMgFuc3MwMgF0c3MwMwF6c3MwMwGAc3MwNAGGc3MwNAGMc3VicwGSc3VicwGYc3VwcwGec3VwcwGmAAAAAgAAAAEAAAACAAAAAQAAAAEAEAAAAAEAEAAAAAUAAwAEAAUABgAHAAAABQADAAQABQAGAAcAAAABAAkAAAABAAkAAAADAAgACgALAAAAAwAIAAoACwAAAAEACAAAAAEACAAAAAEADwAAAAEADwAAAAEADAAAAAEADAAAAAQAEQASABMAFAAA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) format('truetype');
12}
13@font-face {
14 font-family: 'Source Code Pro';
15 font-style: normal;
16 font-weight: 300;
17 //src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqcw1o1eFRj7wYC6JbISqOjY.ttf) format('truetype');
18 src: local('Source Code Pro Light'), local('SourceCodePro-Light'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATmEAAAAOkNGRiCTrBH5AABI+AAA0/1EU0lHvkvMtAABOcAAACBYR0RFRi8sL9AAASSAAAAA1EdQT1NNQOJiAAEwiAAACPpHU1VC3Z7yFQABJVQAAAsyT1MvMnJwz7UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk++2HegAAAOwAAAA2aGhlYQaGAN8AAAEkAAAAJGhtdHjAa8POAAEc+AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZdEIqPsAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWjTEiMVfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/6f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/p/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAEsAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwQJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIExpZ2h0UmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1MaWdodDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tTGlnaHRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9MaWdodFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAATABpAGcAaAB0AFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBMAGkAZwBoAHQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEwAaQBnAGgAdABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8ATABpAGcAaAB0AFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARRTb3VyY2VDb2RlUHJvLUxpZ2h0AAEBAS769gD69wH6+AwA+vkC+voD+BYEjAwBdPwk+Vb6fAUcMQgPHDOCEccdAADAyRIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBMaWdodFNvdXJjZSBDb2RlIFBy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9z/3YXWfBQuxAda39/S3A/esCxVjp3Spqaeisx4L+TrrChWpBq8LXV+IHwufUI0eCwAAAAJYAE4AAAAtAHMASABgAH8AlgA7AFkAawBdAHMAlgBbAFwANgB2ADkAdQBMADAAWQA7AA4ASwAzAEYAXABpAFcAQwBNAHMAVABpAGEAPwB7AF0ASwBpAEMAaQBDAKMAUwBQAFcAPgALAFAAPABIAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AAAAmAEgASABIAEgASABgAGAAYAAZAH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwB/AH8AfwA7ADsAOwA7ADsAOwA7AFkAWQBZAA4AawBrAGsAawBrAGsAawBrAGsAawBrAGsAXQBzAJYAlgCWAJYAlgBJAJYAQQBbAFwAXABcAFwAXABcAFwANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ADYANgA2ACkANgA2ADYANgA2ADYANgB1AHUAdQB1AHUAdQBMAEwATABMAEwATABMAFcAMAAwADAAMAAwAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQAOAA4ADgAOADMAMwAzADMAMwAzADMAMwBGAEYARgBGABkAdgBBAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAEQAdAFcAVwBXAFcAVwBAAEMAQwBDAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBUAFQAVABUAFQAVABUABoAaQBpAB0AYQBhAGEAYQBhAGEAYQBhAGEAYQBhAGEAYQA/AHsAewBdAF0APABdAF0AXQBdAF0ASwBpAGkAaQBpAGkAaQBp//kAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAAoAQwBDAEMAQwBDAEMAQwCjAH0AowCYAJgAUwBTAFMAUwBTAFMAUwBTAGgAUABQAFAAUABQAFAAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAAsACwALAAsAPAA8ADwAPAA8ADwAPAA8AEgASABIAEgAQwBpAD8AawBDAGkAQgBEAE0AQwBWADcARgA5AD4ACwA8ACEATgBTAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMAQwBDAEMANQBRAGwATwBDACoAPgBWAEoASABLAFEAbABPAEMAKgA+AFgASgBIAEsA8ADNAPAAzQAzAPIA8gB0AIYBBgCeAOAA4wB4AHsA4wB7ANIA3wBqAHcAXwBfAFAAFABQABQA8AChADwA4AB3APAAXwCBAF8AcgEYAHIBGABgAJYAlgBmAFcAJQAlAHYAAAAdADwAPABgAHQAjACMAGEApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AKYA1wC3ALAAsgCwALcAugC0ALIA+QDdAQgA/gCmANcAtgCwALIAsAC5ALoAtACyAPkA3QEIAP4ApgDXALcAsACyALAAtwC6ALQAsgD5AN0BCAD+AK8AjgCUAK8AtgC7AI4ApwDPAJ4AugCzAJAAzgDMAIwAugCUALYAjgEFAKsArACnAKUAUQC0AJIAjwCnAKcAngCOAI4AugBHAGEAUQBBAEEAegAzAGoAUgA6ADcAeAA3AF4AagB3AEQAIwAjACMAGwA6ACMAIwAmACMAIwAjACMAIwAjAF8AXwBwAF8A6wBfAHsAcABfAF8AXwB+AF8AWwBbAF8ANgACAFcAVgDQAFAAMQAmAEwARACNABoAEwAiABwAIgDVAK4AgwCyAC4ALgBQAFAALgAuACoAKv/p/+kAAABcAG4BEADJAOAA4wD8AOEA0wD0ALkAuQEHALsA8wDRAQcAsACsALsAtADaANoA/QDrAPYA0wC7APQBBwC5ALcAsACqALsAugC0ALkA/QEEAKwAuQD2APYA2gDaANoA0AC5ALcAgwCDAQEBAgEkAP0AuQDiAOIA2wD2APcAtQC5ALkAugC6ALoAugC3ALoAugDFAL0AxQC9AMUAvQCzALIAtQC7ALUAuwC1ALsAswCyAL0AuwEMAPAAAAAAAAAAAP/q/+oBFgEBACEAIQEWAQEAEgASARYBAQEWARYBAQEB/+r/6v/q/+oBFgEWAQEBAf/q/+r/6v/qARYBFgEBAQEBAQEBAQEBAf/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q/+r/6v/q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AaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSAMYA2ADeAOQA6gDGAPAA9gD8AMYBAgDGAQgBDgECARQBGgDqAOoAxgEgAMYBCAEmASwBMgE4AT4BRAFKAVABVgFWAVwBYgFoAW4AwAF0AXoBgAGGAYwBkgGYAMAAwAGeAW4AxgGkANgAxgDqAaoA6gDGAOoAxgEIASYBPgGwAbAAwAG2AMAAwAGSAZIBLAGwAbwBngHCAcgBzgGGAdQB2gHgAeYB7AGYAMAB8gH4AZ4BngH+AgQCCgABASwB9gABASwCqQABAScCqQABAVcCqQABAVACqQABAVoCqQABAUwCqQABASsCqQABAUACqQABAUcCqQABALsCqQABATICqQABATwCqQABASsCtAABATkCqQABASoCqQABAS0CqQABAT0B9gABAIMC2gABAVgB9gABAcYC2gABATwB9gABAagC5AABATUB9gABAJcC2gABAV0CpgABALkC2gABASMC2gABATkB9QABAT8B9gABATYB9gABASkB9gABAVcB9gABASoB9gABAQYCeQABASYB9gABAS0B9gABAS8B9gABAdsCtgABAaECqQABAV0B9gABAUEB9gABATgB9gABAToB9gABARkB9gABAR8B9gABATEB9gABASQB9gABASMB9QABAZIB9gABAOMB9gABAS4B9gABARMB9gABATIB9gABASwCxQABASwCvAABBFgEYAABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVoAAAABAT4AAAABAVcAAAABATsAAAABAXkAAAABBCgENgABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmACYAKQAyACYAJgAmADOANQA2gCYAMIA4ADmAOwAmADyAMIA+AD+AQQBCgCqARABFgEcASIBKAEuAPIBNACYAToBQAFGAUwBUgFYAV4AmACYAWQBCgDCAJgBCgEcAJgBWACeAWoA5gDa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) format('truetype');
19}
20@font-face {
21 font-family: 'Source Code Pro';
22 font-style: normal;
23 font-weight: 400;
24 //src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/mrl8jkM18OlOQN8JLgasD9zbP97U9sKh0jjxbPbfOKg.ttf) format('truetype');
25 src: local('Source Code Pro'), local('SourceCodePro-Regular'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT80AAAAOkNGRiD9qd9kAABIiAAA2ktEU0lHYnpAEAABP3AAACBYR0RFRi8sL9AAASpcAAAA1EdQT1MK+gbMAAE2ZAAACNBHU1VC3Z7yFQABKzAAAAsyT1MvMnLU0PUAAAFQAAAAYGNtYXDp1MYJAAA+WAAAChBoZWFk+92HfAAAAOwAAAA2aGhlYQZ2AN8AAAEkAAAAJGhtdHisN66qAAEi1AAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZQWUCakAAAGwAAA8pnBvc3T/uAAzAABIaAAAACAAAQAAAAEEWlvC/ZlfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/2f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/Z/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAGQAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAQAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABwBUAAEAAAAAAAMAJgBbAAEAAAAAAAQADwBFAAEAAAAAAAUAOQCBAAEAAAAAAAYAFQC6AAEAAAAAAAcAYADPAAEAAAAAAAgAGgEvAAEAAAAAAAkADAFJAAEAAAAAAAsAGQFVAAEAAAAAAA0R2QFuAAEAAAAAAA4AJBNHAAEAAAAAAQAAFhNrAAEAAAAAAQEACxOBAAEAAAAAAQIACxOMAAEAAAAAAQMAFROXAAMAAQQJAAAAihOsAAMAAQQJAAEAHhQ2AAMAAQQJAAIADhRUAAMAAQQJAAMATBRiAAMAAQQJAAQAHhQ2AAMAAQQJAAUAchSuAAMAAQQJAAYAKhUgAAMAAQQJAAcAwBVKAAMAAQQJAAgANBYKAAMAAQQJAAkAGBY+AAMAAQQJAAsAMhZWAAMAAQQJAA0jthaIAAMAAQQJAA4ASDo+AAMAAQQJAQAALDqGAAMAAQQJAQEAFjqyAAMAAQQJAQIAFjrIAAMAAQQJAQMAKjreQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1SZWd1bGFyO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1SZWd1bGFyU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWRQYXVsIEQuIEh1bnRodHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgKGh0dHA6Ly93d3cuYWRvYmUuY29tLyksIHdpdGggUmVzZXJ2ZWQgRm9udCBOYW1lICdTb3VyY2UnLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy4NCg0KVGhpcyBGb250IFNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTSUwgT3BlbiBGb250IExpY2Vuc2UsIFZlcnNpb24gMS4xLg0KDQpUaGlzIGxpY2Vuc2UgaXMgY29waWVkIGJlbG93LCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgd2l0aCBhIEZBUSBhdDogaHR0cDovL3NjcmlwdHMuc2lsLm9yZy9PRkwNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClNJTCBPUEVOIEZPTlQgTElDRU5TRSBWZXJzaW9uIDEuMSAtIDI2IEZlYnJ1YXJ5IDIwMDcNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBSRUFNQkxFDQpUaGUgZ29hbHMgb2YgdGhlIE9wZW4gRm9udCBMaWNlbnNlIChPRkwpIGFyZSB0byBzdGltdWxhdGUgd29ybGR3aWRlIGRldmVsb3BtZW50IG9mIGNvbGxhYm9yYXRpdmUgZm9udCBwcm9qZWN0cywgdG8gc3VwcG9ydCB0aGUgZm9udCBjcmVhdGlvbiBlZmZvcnRzIG9mIGFjYWRlbWljIGFuZCBsaW5ndWlzdGljIGNvbW11bml0aWVzLCBhbmQgdG8gcHJvdmlkZSBhIGZyZWUgYW5kIG9wZW4gZnJhbWV3b3JrIGluIHdoaWNoIGZvbnRzIG1heSBiZSBzaGFyZWQgYW5kIGltcHJvdmVkIGluIHBhcnRuZXJzaGlwIHdpdGggb3RoZXJzLg0KDQpUaGUgT0ZMIGFsbG93cyB0aGUgbGljZW5zZWQgZm9udHMgdG8gYmUgdXNlZCwgc3R1ZGllZCwgbW9kaWZpZWQgYW5kIHJlZGlzdHJpYnV0ZWQgZnJlZWx5IGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IHNvbGQgYnkgdGhlbXNlbHZlcy4gVGhlIGZvbnRzLCBpbmNsdWRpbmcgYW55IGRlcml2YXRpdmUgd29ya3MsIGNhbiBiZSBidW5kbGVkLCBlbWJlZGRlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSBwcm92aWRlZCB0aGF0IGFueSByZXNlcnZlZCBuYW1lcyBhcmUgbm90IHVzZWQgYnkgZGVyaXZhdGl2ZSB3b3Jrcy4gVGhlIGZvbnRzIGFuZCBkZXJpdmF0aXZlcywgaG93ZXZlciwgY2Fubm90IGJlIHJlbGVhc2VkIHVuZGVyIGFueSBvdGhlciB0eXBlIG9mIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgZm9udHMgb3IgdGhlaXIgZGVyaXZhdGl2ZXMuDQoNCkRFRklOSVRJT05TDQoiRm9udCBTb2Z0d2FyZSIgcmVmZXJzIHRvIHRoZSBzZXQgb2YgZmlsZXMgcmVsZWFzZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykgdW5kZXIgdGhpcyBsaWNlbnNlIGFuZCBjbGVhcmx5IG1hcmtlZCBhcyBzdWNoLiBUaGlzIG1heSBpbmNsdWRlIHNvdXJjZSBmaWxlcywgYnVpbGQgc2NyaXB0cyBhbmQgZG9jdW1lbnRhdGlvbi4NCg0KIlJlc2VydmVkIEZvbnQgTmFtZSIgcmVmZXJzIHRvIGFueSBuYW1lcyBzcGVjaWZpZWQgYXMgc3VjaCBhZnRlciB0aGUgY29weXJpZ2h0IHN0YXRlbWVudChzKS4NCg0KIk9yaWdpbmFsIFZlcnNpb24iIHJlZmVycyB0byB0aGUgY29sbGVjdGlvbiBvZiBGb250IFNvZnR3YXJlIGNvbXBvbmVudHMgYXMgZGlzdHJpYnV0ZWQgYnkgdGhlIENvcHlyaWdodCBIb2xkZXIocykuDQoNCiJNb2RpZmllZCBWZXJzaW9uIiByZWZlcnMgdG8gYW55IGRlcml2YXRpdmUgbWFkZSBieSBhZGRpbmcgdG8sIGRlbGV0aW5nLCBvciBzdWJzdGl0dXRpbmcgLS0gaW4gcGFydCBvciBpbiB3aG9sZSAtLSBhbnkgb2YgdGhlIGNvbXBvbmVudHMgb2YgdGhlIE9yaWdpbmFsIFZlcnNpb24sIGJ5IGNoYW5naW5nIGZvcm1hdHMgb3IgYnkgcG9ydGluZyB0aGUgRm9udCBTb2Z0d2FyZSB0byBhIG5ldyBlbnZpcm9ubWVudC4NCg0KIkF1dGhvciIgcmVmZXJzIHRvIGFueSBkZXNpZ25lciwgZW5naW5lZXIsIHByb2dyYW1tZXIsIHRlY2huaWNhbCB3cml0ZXIgb3Igb3RoZXIgcGVyc29uIHdobyBjb250cmlidXRlZCB0byB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KUEVSTUlTU0lPTiAmIENPTkRJVElPTlMNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhlIEZvbnQgU29mdHdhcmUsIHRvIHVzZSwgc3R1ZHksIGNvcHksIG1lcmdlLCBlbWJlZCwgbW9kaWZ5LCByZWRpc3RyaWJ1dGUsIGFuZCBzZWxsIG1vZGlmaWVkIGFuZCB1bm1vZGlmaWVkIGNvcGllcyBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNCjEpIE5laXRoZXIgdGhlIEZvbnQgU29mdHdhcmUgbm9yIGFueSBvZiBpdHMgaW5kaXZpZHVhbCBjb21wb25lbnRzLCBpbiBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucywgbWF5IGJlIHNvbGQgYnkgaXRzZWxmLg0KDQoyKSBPcmlnaW5hbCBvciBNb2RpZmllZCBWZXJzaW9ucyBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgYmUgYnVuZGxlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3Igc29sZCB3aXRoIGFueSBzb2Z0d2FyZSwgcHJvdmlkZWQgdGhhdCBlYWNoIGNvcHkgY29udGFpbnMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbGljZW5zZS4gVGhlc2UgY2FuIGJlIGluY2x1ZGVkIGVpdGhlciBhcyBzdGFuZC1hbG9uZSB0ZXh0IGZpbGVzLCBodW1hbi1yZWFkYWJsZSBoZWFkZXJzIG9yIGluIHRoZSBhcHByb3ByaWF0ZSBtYWNoaW5lLXJlYWRhYmxlIG1ldGFkYXRhIGZpZWxkcyB3aXRoaW4gdGV4dCBvciBiaW5hcnkgZmlsZXMgYXMgbG9uZyBhcyB0aG9zZSBmaWVsZHMgY2FuIGJlIGVhc2lseSB2aWV3ZWQgYnkgdGhlIHVzZXIuDQoNCjMpIE5vIE1vZGlmaWVkIFZlcnNpb24gb2YgdGhlIEZvbnQgU29mdHdhcmUgbWF5IHVzZSB0aGUgUmVzZXJ2ZWQgRm9udCBOYW1lKHMpIHVubGVzcyBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBDb3B5cmlnaHQgSG9sZGVyLiBUaGlzIHJlc3RyaWN0aW9uIG9ubHkgYXBwbGllcyB0byB0aGUgcHJpbWFyeSBmb250IG5hbWUgYXMgcHJlc2VudGVkIHRvIHRoZSB1c2Vycy4NCg0KNCkgVGhlIG5hbWUocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgb3IgdGhlIEF1dGhvcihzKSBvZiB0aGUgRm9udCBTb2Z0d2FyZSBzaGFsbCBub3QgYmUgdXNlZCB0byBwcm9tb3RlLCBlbmRvcnNlIG9yIGFkdmVydGlzZSBhbnkgTW9kaWZpZWQgVmVyc2lvbiwgZXhjZXB0IHRvIGFja25vd2xlZGdlIHRoZSBjb250cmlidXRpb24ocykgb2YgdGhlIENvcHlyaWdodCBIb2xkZXIocykgYW5kIHRoZSBBdXRob3Iocykgb3Igd2l0aCB0aGVpciBleHBsaWNpdCB3cml0dGVuIHBlcm1pc3Npb24uDQoNCjUpIFRoZSBGb250IFNvZnR3YXJlLCBtb2RpZmllZCBvciB1bm1vZGlmaWVkLCBpbiBwYXJ0IG9yIGluIHdob2xlLCBtdXN0IGJlIGRpc3RyaWJ1dGVkIGVudGlyZWx5IHVuZGVyIHRoaXMgbGljZW5zZSwgYW5kIG11c3Qgbm90IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGFueSBvdGhlciBsaWNlbnNlLiBUaGUgcmVxdWlyZW1lbnQgZm9yIGZvbnRzIHRvIHJlbWFpbiB1bmRlciB0aGlzIGxpY2Vuc2UgZG9lcyBub3QgYXBwbHkgdG8gYW55IGRvY3VtZW50IGNyZWF0ZWQgdXNpbmcgdGhlIEZvbnQgU29mdHdhcmUuDQoNClRFUk1JTkFUSU9ODQpUaGlzIGxpY2Vuc2UgYmVjb21lcyBudWxsIGFuZCB2b2lkIGlmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4NCg0KRElTQ0xBSU1FUg0KVEhFIEZPTlQgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIEFOWSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBDT1BZUklHSFQsIFBBVEVOVCwgVFJBREVNQVJLLCBPUiBPVEhFUiBSSUdIVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBGT05UIFNPRlRXQVJFIE9SIEZST00gT1RIRVIgREVBTElOR1MgSU4gVEhFIEZPTlQgU09GVFdBUkUuaHR0cDovL3d3dy5hZG9iZS5jb20vdHlwZS9sZWdhbC5odG1sVHlwb2dyYXBoaWMgYWx0ZXJuYXRlc0FsdGVybmF0ZSBhQWx0ZXJuYXRlIGdBbHRlcm5hdGUgZG9sbGFyIHNpZ24AQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAC4AIABBAGwAbAAgAFIAaQBnAGgAdABzACAAUgBlAHMAZQByAHYAZQBkAC4AUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUgBlAGcAdQBsAGEAcgAxAC4AMAAxADcAOwBBAEQAQgBFADsAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFIAZQBnAHUAbABhAHIAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAAAAwAAAAMAAAIUAAEAAAAAABwAAwABAAACFAAGAfgAAAAJAPcAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUBzQHOAc8B0AHRAdIB0wHUAdUB1gHjAeQCmgKZApsB6AITAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwIBAgcCAgKfAf4CywAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUCAwIGAgQCoQAAADoAPQBOAFgAjACVAMEA6ADnAOkA6wDqAO4A/wEJAQgBCgEMASUBJAEmASgBPwFGAUUBRwFJAUgBcwFyAXQBdgIKAnQCegJ3AgwB/QINAWsCEAIOAhECzALVAqAATAChAqUCngKcAp0CeAKmAqcCrAKtAqQCqAJSAlQAAAD9AVUB6QHnAqMCqQJ7AqICqgH0AfUB5QMfADYAOQCUAKIBVgH4AfkB7gHvAewB7QKXAsQBkADbAoYCeQHyAfMBqwGsAgsB/AHwAfECigA4AFkANwBbAFcAdAB1AHcAcwCSAJMAAACRAL4AvwC9ATACzQLUAtYC1wLaAtgC2wLZAtwCzgAEB/wAAAEWAQAABwAWAC8AOQBAAFoAYAB6AH4AvwDEANEA1gDfAOQA8QD2ATEBSQFlAX4BgAGPAZIBoQGwAdwB5wHrAhsCNwJDAlICVAJZAmECZQJvAnkChwKOAp4CsAKzArgCvAK/AswC3QLjAwQDDAMPAxMDGwMkAygDLgMxA8AdQx1JHU0dUB1SHVgdWx2cHaAdux4PHiEeJR4rHjseSR5jHm8ehR6PHpMelx6eHvkgByAVIBogHiAiICYgMCAzIDogRCBxIHkgfyCJII4glCChIKQgpyCsILIgtSC6IRMhFyEgISIhJiEuIVQhXiGTIgIiBiIPIhIiFSIaIh4iKyJIImAiZSWfJaAlsyW3Jb0lwSXGJcomESZqJxMnUvsC//8AAAAgADAAOgBBAFsAYQB7AKAAwADFANIA1wDgAOUA8gD3ATQBTAFoAYABjwGSAaABrwHNAeYB6gIYAjcCQwJQAlQCWAJhAmUCbwJ5AocCjAKeArACsgK3ArsCvgLGAtgC4QMAAwYDDwMSAxsDIwMmAy4DMQPAHUMdRx1NHU8dUh1WHVsdnB2gHbseDB4gHiQeKh42HkIeWh5sHoAejh6SHpcenh6gIAcgEiAYIBwgICAmIDAgMiA5IEQgcCB0IH0ggCCNIJQgoSCkIKYgqyCxILUguSETIRchICEiISYhLiFTIVshkCICIgYiDyIRIhUiGSIeIisiSCJgImQlACWgJbIltiW8JcAlxiXJJhAmaicTJ1L7Af//AAABnQAA/8EAAP+7AAAAAP92AAD/vwAAAAcAAABTAAAAAAAA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dQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvATACAAEARgB9AK4A0QD4AUABkQGkAbwB6AH3AjgCQwJfAnYCegKZAsAC5gLqAvMDFQMtA2YDlQOiA+kD7wP+BAcEDgQSBCUEOARLBIAEiASdBKgEqwSwBMEE3AThBQUFFQUvBUQFSQVXBWsFcwWCBYYFigXQBdcF2wXlBfsGFAYlBmMG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AF8AXwBfAF8AUQBiAIYAhgCGAIYAhgBCAIYANQBRAFMAUwBTAFMAUwBTAFMAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAtACEAMAAwADAAMAAwADAAMABkAGQAZABkAGQAZABDAEMAQwBDAEMAQwBDAE8AKgAqACoAKgAqAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAKAAoACgAKACYAJgAmACYAJgAmACYAJgBBAEEAQQBBABAAZQA+AFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAEQAUAFAAUABQAFAAUAAyADwAPAA8AEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBFAEUARQBIAEgASABIAEgASABIAAoAXQBdABQAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgA3AGoAagBRAFEAKgBRAFEAUQBRAFEAPABdAF0AXQBdAF0AXQBd/+oAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAsAPAA8ADwAPAA8ADwAPACSAHMAkgCGAIYATABIAEgASABIAEgASABIAFgARQBFAEUARQBFAEUATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAE0ATQBNAAgACAAIAAgAMQAxADEAMQAxADEAMQAxAEcARwBHAEcAPABdADcAXgA8AF0APQA/AEUAPABNAC4APwA2ADMACAAxABoANAA5ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAKgBHAGIARQA5ACcAOABNAEYARABDAEcAYgBFADkAJwA4AE4ARgBEAEMA2wDFANsAxQAgAOMA4wBtAHsA9QCCANEA2QBfAGcA2QBnAMUA0wBSAGAAVQBVAFAAFABQABQA2wCXADwA0AB6AOIAYwB4AGMAYwEHAGMBBwBUAH8AfwBbAEgAHgAeAHD/+wAPADEAMQBXAGgAhgCGAFUAoQDQAK0ArACsAKwArwC3AK8ArQDsANUA/gD0AKEA0ACtAKwArACsAK8AtwCvAK0A7ADVAP4A9AChANAArQCsAKwArACw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AbYBvADAAcIByAGAAc4B1AFoAMABdAHaAT4BPgE+AeAB5gABASwB/AABASwCpgABASMCpgABAVsCpgABASsCpgABAUsCpgABAVMCpgABAUECpgABAL4CpgABATICpgABATsCpgABAS0CrgABATECpgABATcCpgABAS0CpgABAToB/AABAIoC2gABAVcB/AABAcEC2gABATsB/AABAaQC5AABATMB/AABAJcC2gABAVwCtgABALIC2gABARwC2gABATwB/AABAT4B/AABAS0B/AABAVYB/AABAS8B/AABAQcCgwABAScB/AABATAB/AABAUAB/AABAcMCtgABAZgCpgABAT0CpgABAVwB/AABAT8B/AABATgB/AABARoB/AABASAB/AABATIB/AABASUB/AABAZEB/AABAOsB/AABARcB/AABASwCzwABASwCwgABBFIEWgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATkAAAABAVYAAAABAToAAAABAXgAAAABBCIEMAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAMIAmADsAPIAmAD4AOwAmAD+AQQBCgEQARYBHAEiASgAvAEuATQBOgCYAUABRgFMAOYBUgFYAMgAmACYAV4BZADCAJgBWAEiAJgBWAEEAWoAngEEAWoAngFwAXYBfAF8AYIBiADIAJgBXgGOAJ4BlAABASz/6gABATT/6gABAVv/6gABASL/6gABAUz/6gABALz/6gABAU//6gABASv/6gABAS3/6gABAVL/6gABAVr/6gABAJX/6gABAUD/6gABATb/6gABAS//6gABASf/6gABATf/6gABAVb/6gABATL/6gABATv/6gABASP/6gABASn/GgABATr/6gABAVz/6gABAOz/GQABAXP/6gABATX/6gABATn/6gABAIj/JgABAcH/JgABAMj/6gABAXv/6gABAUH/6gABAQr/DgABAT3/6gABAUP/6gABASD/6gABAcv/JgABASr/6gABAHb/6gABAW3/6gABAP7/6gABAcz/JgABAsACxgABAAwAEgABAAAADgADAA4AFAAaAAEBLAHmAAEBpAKGAAEB9wKaAAEBnQHm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) format('truetype');
26}
27@font-face {
28 font-family: 'Source Code Pro';
29 font-style: normal;
30 font-weight: 500;
31 //src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqU6EJOknnpZ4Yy-3LjgZKxo.ttf) format('truetype');
32 src: local('Source Code Pro Medium'), local('SourceCodePro-Medium'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT1oAAAAOkNGRiDLPo+VAABJBAAA2CNEU0lHEXcESwABPaQAACBYR0RFRjJdMx0AASiwAAAA4EdQT1MzPM2kAAE0xAAACKJHU1VC3Z7yFQABKZAAAAsyT1MvMnM40LUAAAFQAAAAYGNtYXDp1MYJAAA+1AAAChBoZWFk+9WHfAAAAOwAAAA2aGhlYQZuAN8AAAEkAAAAJGhtdHijJaU6AAEhKAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZe4mG4MAAAGwAAA9JHBvc3T/uAAzAABI5AAAACAAAQAAAAEEWkwQeqtfDzz1AAMD6AAAAADNFZ/1AAAAAM0Vn/X/0f5wAsID6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/R/5YCwgABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAH0AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwUJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFgBFAAEAAAAAAAIABwBbAAEAAAAAAAMAJQBiAAEAAAAAAAQAFgBFAAEAAAAAAAUAOQCHAAEAAAAAAAYAFADAAAEAAAAAAAcAYADUAAEAAAAAAAgAGgE0AAEAAAAAAAkADAFOAAEAAAAAAAsAGQFaAAEAAAAAAA0R2QFzAAEAAAAAAA4AJBNMAAEAAAAAABAADxNwAAEAAAAAABEABhN/AAEAAAAAAQAAFhOFAAEAAAAAAQEACxObAAEAAAAAAQIACxOmAAEAAAAAAQMAFROxAAMAAQQJAAAAihPGAAMAAQQJAAEALBRQAAMAAQQJAAIADhR8AAMAAQQJAAMAShSKAAMAAQQJAAQALBRQAAMAAQQJAAUAchTUAAMAAQQJAAYAKBVGAAMAAQQJAAcAwBVuAAMAAQQJAAgANBYuAAMAAQQJAAkAGBZiAAMAAQQJAAsAMhZ6AAMAAQQJAA0jthasAAMAAQQJAA4ASDpiAAMAAQQJABAAHjqqAAMAAQQJABEADDrIAAMAAQQJAQAALDrUAAMAAQQJAQEAFjsAAAMAAQQJAQIAFjsWAAMAAQQJAQMAKjssQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIE1lZGl1bVJlZ3VsYXIxLjAxNztBREJFO1NvdXJjZUNvZGVQcm8tTWVkaXVtO0FET0JFVmVyc2lvbiAxLjAxNztQUyAxLjAwMDtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41OTAwU291cmNlQ29kZVByby1NZWRpdW1Tb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9NZWRpdW1UeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAE0AZQBkAGkAdQBtAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBNAGUAZABpAHUAbQA7AEEARABPAEIARQBWAGUAcgBzAGkAbwBuACAAMQAuADAAMQA3ADsAUABTACAAMQAuADAAMAAwADsAaABvAHQAYwBvAG4AdgAgADEALgAwAC4ANwAwADsAbQBhAGsAZQBvAHQAZgAuAGwAaQBiADIALgA1AC4ANQA5ADAAMABTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0ATQBlAGQAaQB1AG0AUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvAE0AZQBkAGkAdQBtAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARVTb3VyY2VDb2RlUHJvLU1lZGl1bQABAQEu+vYA+vcB+vgMAPr5Avr5A/gXBIwMAVz8JPlW+nwFHDGmDxw0IBHHHQAAxCsSAt8CAAEACAAOABUAHAAjACoAMQA4AD8ARgBNAFQAWwBiAGkAcAB3AH0AiACOAJgAngClAKwAsgC4AL8AxQDPANYA3QDkAOsA8gD5AQABBwEOARkBHwEpATABNgE9AUgBUwFaAWEBZQFrAXIBeQGDAYoBkQGYAZ8BqgGxAbcBvQHEAcgBzwHWAd0B5AHqAfAB9wH+AgUCDAITAhoCJwIuAjUCPAJDAkoCUQJYAl8CZAJrAnICeQKAAocCjgKUApoCoQKoAq8CtgK8AscCzgLVAtwC4wLqAvAC9wL+AwUDDAMSAxkDHwMkAzEDOAM/A0YDTQNUA1sDYgNpA24DdQN8A4MDigORA5cDnQOoA7EDtwPCA8kD0APXA94D5APuA/UD/AQDBAkEEAQXBB4EJQQsBDMEOgRBBEgETwRWBF0EZARrBHIEeASDBIkEkwSZBKAEpwStBLMEugTABMoE0QTYBN8E5gTtBPQE+wUCBQkFFAUaBSQFKwUxBTgFQwVOBVUFXAVgBWYFbQV0BXsFggWJBZAFmQWkBasFtwW9BcMFxwXOBdUF3AXjBeoF8AX2Bf0GBAYLBhIGHQYkBisGOAY/BkYGTQZUBlsGYgZpBnAGdQZ8BoMGigaRBpgGnwalBqwGsga5BsAGxwbNBtgG3wbmBu0G9Ab6BwEHCAcPBxYHHQcjByoHMAc1B0IHSQdQB1cHXgdlB2wHcwd6B38HhgeNB5QHmweiB6gHrge5B8IHyAfTB9oH4QfoB+8H9Qf/CAYIDQgUCBsIIggpCDAINwg+CEUITAhTCFoIYQhoCGsIcwh7CIgIkAibCKQIrAizCLwIxQjOCNcI4AjpCPII+wkECQ0JFgkfCSgJMQk0CUEJSQlVCV4JZglvCXwJhQmNCZUJnwmoCbEJuQnDCc0J1gndCeQJ6wnyCfkKAwoLChQKHAolCi0KNQo/CkgKUQpZCmMKbQp2CoQKkwqeCqgKsQq5CsEKywrUCt0K5QrvCvkLAgsQCx8LKgs0Cz0LRQtNC1cLYAtpC3ELewuFC44LnAurC7YLwAvJC9EL2QvjC+wL9Qv9DAcMEQwaDCgMNwxCDEwMWQxfDGUMawxxDHcMfQyDDIkMjwyVDJsMoQynDK0Mswy5DL8MxQzLDNEM1wzdDOMM6QzvDPUNAA0LDRcNHQ0jDScNLg0yDTkNPw1DDUoNUQ1YDV8NZg1tDXcNfg2HDZMNmw2mDagNsA23DcINyg3RDdgN3w3oDe8N9g3/DgYODQ4UDh0OJA4rDjIOOQ5ADkcOTg5VDlwOYw5qDnEOeA5/DoYOjQ6UDpsOog6pDrAOtw6+DsUOzA7TDtoO4Q7oDvMO+g8FDwwPFw8eDykPMA87D0IPTQ9UD18PZg9xD3gPgw+KD5UPnA+nD64PuQ/AD8sP0g/ZD+AP5w/uD/UP/BAHEA4QGRAgECcQMhBBEEwQWxBmEHUQgBCPEJoQqRC0EMMQzhDdEOgQ9xECERERHBErETYRRRFQEV8RahF5EYIRixGSEZkRoxGvEbYRvRHEEcsR0hHZEeAR5xHuEfUR/BIDEgoSERIYEh8SJhItEjQSOxJCEkkSUBJXEl4SZRJsEnMSehKBEogSjxKWEp0SpBKrErISuRLAEscSzhLVEtwS4xLqEvES+BL/EwYTDRMUExsTIhMpEzATNxM+E0UTTBNTE1oTYRNoE28TdhN9E4QTixOSE5kToBOnE64TtRO8E8MTyhPRE9gT3xPmE+0T9BP7FAIUCRQQFBcUHhQlFCwUMxQ6FEEUSBRPFFYUXRRkFGsUchR5FIAUhxSOFJUUnBSjFKoUsRS4FL8UxhTNFNQU2xTiFOkU8BT3FP4VBRUMFRMVGhUhFSgVLxU2FT0VRBVLFVIVWRVgFWcVbhV1FXwVgxWKFZEVmBWfFaYVrRW0FbsVwhXJFdAV1xXeFeUV7BXzFfoWARYIFg8WFhYdFiIWghbHFtZBbWFjcm9uQWJyZXZldW5pMDFDRHVuaTFFQTB1bmkxRUEydW5pMUVBNHVuaTFFQTZ1bmkxRUE4dW5pMUVBQXVuaTFFQUN1bmkxRUFFdW5pMUVCMHVuaTFFQjJ1bmkxRUI0dW5pMUVCNkFvZ29uZWt1bmkwMjQzQ2FjdXRlQ2NpcmN1bWZsZXhDY2Fyb25DZG90YWNjZW50RGNhcm9udW5pMUUwQ3VuaTFFMEVEY3JvYXRFY2Fyb25FbWFjcm9uRWJyZXZlRWRvdGFjY2VudHVuaTFFQjh1bmkxRUJBdW5pMUVCQ3VuaTFFQkV1bmkxRUMwdW5pMUVDMnVuaTFFQzR1bmkxRUM2RW9nb25la0djaXJjdW1mbGV4R2JyZXZlR2RvdGFjY2VudHVuaTAxMjJHY2Fyb251bmkxRTIwdW5pMDA0NzAzMDNIY2lyY3VtZmxleHVuaTFFMjR1bmkxRTJBSGJhckl0aWxkZUltYWNyb251bmkwMTJDSWRvdGFjY2VudHVuaTAxQ0Z1bmkxRUM4dW5pMUVDQUlvZ29uZWtKY2lyY3VtZmxleHVuaTAxMzZMYWN1dGVMY2Fyb251bmkwMTNCTGRvdHVuaTFFMzZ1bmkxRTM4dW5pMUUzQXVuaTFFNDJOYWN1dGVOY2Fyb251bmkwMTQ1dW5pMUU0NHVuaTFFNDZ1bmkxRTQ4T21hY3JvbnVuaTAxNEVPaHVuZ2FydW1sYXV0dW5pMDFEMXVuaTFFQ0N1bmkxRUNFdW5pMUVEMHVuaTFFRDJ1bmkxRUQ0dW5pMUVENnVuaTFFRDhPaG9ybnVuaTFFREF1bmkxRURDdW5pMUVERXVuaTFFRTB1bmkxRUUydW5pMDFFQVJhY3V0ZVJjYXJvbnVuaTAxNTZ1bmkxRTVBdW5pMUU1Q3VuaTFFNUVTYWN1dGVTY2lyY3VtZmxleHVuaTAxNUV1bmkwMjE4dW5pMUU2MHVuaTFFNjJ1bmkxRTlFVGNhcm9udW5pMDE2MnVuaTAyMUF1bmkxRTZDdW5pMUU2RVV0aWxkZVVtYWNyb25VYnJldmVVcmluZ1VodW5nYXJ1bWxhdXR1bmkwMUQzdW5pMDFENXVuaTAxRDd1bmkwMUQ5dW5pMDFEQnVuaTFFRTR1bmkxRUU2VW9nb25la1Vob3JudW5pMUVFOHVuaTFFRUF1bmkxRUVDdW5pMUVFRXVuaTFFRjBXZ3JhdmVXYWN1dGVXY2lyY3VtZmxleFdkaWVyZXNpc1lncmF2ZVljaXJjdW1mbGV4dW5pMUU4RXVuaTFFRjR1bmkxRUY2dW5pMUVGOFphY3V0ZVpkb3RhY2NlbnR1bmkxRTkydW5pMDE4RmFtYWNyb25hYnJldmV1bmkwMUNFdW5pMUVBMXVuaTFFQTN1bmkxRUE1dW5pMUVBN3VuaTFFQTl1bmkxRUFCdW5pMUVBRHVuaTFFQUZ1bmkxRUIxdW5pMUVCM3VuaTFFQjV1bmkxRUI3YW9nb25la3VuaTAxODBjYWN1dGVjY2lyY3VtZmxleGNjYXJvbmNkb3RhY2NlbnRkY2Fyb251bmkxRTBEdW5pMUUwRmRjcm9hdGVjYXJvbmVtYWNyb25lYnJldmVlZG90YWNjZW50dW5pMUVCOXVuaTFFQkJ1bmkxRUJEdW5pMUVCRnVuaTFFQzF1bmkxRUMzdW5pMUVDNXVuaTFFQzdlb2dvbmVrZ2NpcmN1bWZsZXhnYnJldmVnZG90YWNjZW50dW5pMDEyM2djYXJvbnVuaTFFMjF1bmkwMDY3MDMwM2hjaXJjdW1mbGV4dW5pMUUyNXVuaTFFMkJoYmFyaXRpbGRlaW1hY3JvbnVuaTAxMkR1bmkwMUQwdW5pMUVDOXVuaTFFQ0Jpb2dvbmVraW9nb25lay5kamNpcmN1bWZsZXh1bmkwMTM3a2dyZWVubGFuZGljbGFjdXRlbGNhcm9ubGRvdHVuaTAxM0N1bmkxRTM3dW5pMUUzOXVuaTFFM0J1bmkxRTQzbmFjdXRlbmNhcm9udW5pMDE0NnVuaTFFNDV1bmkxRTQ3dW5pMUU0OW5hcG9zdHJvcGhlb21hY3JvbnVuaTAxNEZvaHVuZ2FydW1sYXV0dW5pMDFEMnVuaTFFQ0R1bmkxRUNGdW5pMUVEMXVuaTFFRDN1bmkxRUQ1dW5pMUVEN3VuaTFFRDlvaG9ybnVuaTFFREJ1bmkxRUREdW5pMUVERnVuaTFFRTF1bmkxRUUzdW5pMDFFQnJhY3V0ZXVuaTAxNTdyY2Fyb251bmkxRTVCdW5pMUU1RHVuaTFFNUZzYWN1dGVzY2lyY3VtZmxleHVuaTAxNUZ1bmkwMjE5dW5pMUU2MXVuaTFFNjN0Y2Fyb251bmkwMTYzdW5pMDIxQnVuaTFFNkR1bmkxRTZGdW5pMUU5N3V0aWxkZXVtYWNyb251YnJldmV1cmluZ3VodW5nYXJ1bWxhdXR1bmkwMUQ0dW5pMDFENnVuaTAxRDh1bmkwMURBdW5pMDFEQ3VuaTFFRTV1bmkxRUU3dW9nb25la3Vob3JudW5pMUVFOXVuaTFFRUJ1bmkxRUVEdW5pMUVFRnVuaTFFRjF3Z3JhdmV3YWN1dGV3Y2lyY3VtZmxleHdkaWVyZXNpc3lncmF2ZXljaXJjdW1mbGV4dW5pMUU4RnVuaTFFRjV1bmkxRUY3dW5pMUVGOXphY3V0ZXpkb3RhY2NlbnR1bmkxRTkzdW5pMDIzN3VuaTAyNTB1bmkwMjUxdW5pMDI1MnVuaTAyNTl1bmkwMjYxdW5pMDI2NXVuaTAyNkZ1bmkwMjc5dW5pMDI4N3VuaTAyOEN1bmkwMjhEdW5pMDI4RXVuaTAyOUVhLmFhZ3JhdmUuYWFhY3V0ZS5hYWNpcmN1bWZsZXguYWF0aWxkZS5hYWRpZXJlc2lzLmFhbWFjcm9uLmFhYnJldmUuYWFyaW5nLmF1bmkwMUNFLmF1bmkxRUExLmF1bmkxRUEzLmF1bmkxRUE1LmF1bmkxRUE3LmF1bmkxRUE5LmF1bmkxRUFCLmF1bmkxRUFELmF1bmkxRUFGLmF1bmkxRUIxLmF1bmkxRUIzLmF1bmkxRUI1LmF1bmkxRUI3LmFhb2dvbmVrLmFnLmFnY2lyY3VtZmxleC5hZ2JyZXZlLmFnZG90YWNjZW50LmF1bmkwMTIzLmFnY2Fyb24uYXVuaTFFMjEuYXVuaTAwNjcwMzAzLmF6ZXJvLm9udW1vbmUub251bXR3by5vbnVtdGhyZWUub251bWZvdXIub251bWZpdmUub251bXNpeC5vbnVtc2V2ZW4ub251bWVpZ2h0Lm9udW1uaW5lLm9udW11bmkwMEFEdW5pMjAxNXVuaTIxMTd1bmkyMTIwYXQuY2FzZWFzdGVyaXNrLmFoeXBoZW4uYXVuaTAwQUQuYWRvbGxhci5hemVyby5zdXBzb25lLnN1cHN0d28uc3Vwc3RocmVlLnN1cHNmb3VyLnN1cHNmaXZlLnN1cHNzaXguc3Vwc3NldmVuLnN1cHNlaWdodC5zdXBzbmluZS5zdXBzcGFyZW5sZWZ0LnN1cHNwYXJlbnJpZ2h0LnN1cHNwZXJpb2Quc3Vwc2NvbW1hLnN1cHN6ZXJvLnN1YnNvbmUuc3Vic3R3by5zdWJzdGhyZWUuc3Vic2ZvdXIuc3Vic2ZpdmUuc3Vic3NpeC5zdWJzc2V2ZW4uc3Vic2VpZ2h0LnN1YnNuaW5lLnN1YnNwYXJlbmxlZnQuc3Vic3BhcmVucmlnaHQuc3Vic3BlcmlvZC5zdWJzY29tbWEuc3Vic3plcm8uZG5vbW9uZS5kbm9tdHdvLmRub210aHJlZS5kbm9tZm91ci5kbm9tZml2ZS5kbm9tc2l4LmRub21zZXZlbi5kbm9tZWlnaHQuZG5vbW5pbmUuZG5vbXBhcmVubGVmdC5kbm9tcGFyZW5yaWdodC5kbm9tcGVyaW9kLmRub21jb21tYS5kbm9temVyby5udW1yb25lLm51bXJ0d28ubnVtcnRocmVlLm51bXJmb3VyLm51bXJmaXZlLm51bXJzaXgubnVtcnNldmVuLm51bXJlaWdodC5udW1ybmluZS5udW1ycGFyZW5sZWZ0Lm51bXJwYXJlbnJpZ2h0Lm51bXJwZXJpb2QubnVtcmNvbW1hLm51bXJvcmRmZW1pbmluZS5hYS5zdXBzYi5zdXBzYy5zdXBzZC5zdXBzZS5zdXBzZi5zdXBzZy5zdXBzaC5zdXBzaS5zdXBzai5zdXBzay5zdXBzbC5zdXBzbS5zdXBzbi5zdXBzby5zdXBzcC5zdXBzcS5zdXBzci5zdXBzcy5zdXBzdC5zdXBzdS5zdXBzdi5zdXBzdy5zdXBzeC5zdXBzeS5zdXBzei5zdXBzZWdyYXZlLnN1cHNlYWN1dGUuc3Vwc3VuaTAyNTkuc3Vwc2Euc3VwYWcuc3VwYUV1cm91bmkwMTkybGlyYXVuaTIwQTZwZXNldGFkb25ndW5pMjBCMXVuaTIwQjJ1bmkyMEI1dW5pMjBCOXVuaTIwQkF1bmkyMjE1c2xhc2guZnJhY3VuaTIyMTlsZXNzZXF1YWxncmVhdGVyZXF1YWxub3RlcXVhbGFwcHJveGVxdWFscGlpbmZpbml0eXVuaTAwQjVwYXJ0aWFsZGlmZmludGVncmFscmFkaWNhbHVuaTIyMDZ1bmkyMTI2c3VtbWF0aW9ucHJvZHVjdHVuaTIxMTNlc3RpbWF0ZWR1bmkyMTkwYXJyb3d1cHVuaTIxOTJhcnJvd2Rvd251bmkyNUEwdW5pMjVDNnVuaTI1Qzl1bmkyNzUydHJpYWd1cHVuaTI1QjN1bmkyNUI2dW5pMjVCN3RyaWFnZG51bmkyNUJEdW5pMjVDMHVuaTI1QzF1bmkyNjEwdW5pMjYxMXVuaTI3MTN1bmkyNjZBbG96ZW5nZXVuaTIwMzJ1bmkyMDMzdW5pMDJCQnVuaTAyQkN1bmkwMkJFdW5pMDJCRnVuaTAyQzh1bmkwMkM5dW5pMDJDQXVuaTAyQ0J1bmkwMkNDdW5pMDMwMHVuaTAzMDAuY2FwdW5pMDMwMXVuaTAzMDEuY2FwdW5pMDMwMnVuaTAzMDIuY2FwdW5pMDMwM3VuaTAzMDMuY2FwdW5pMDMwNHVuaTAzMDQuY2FwdW5pMDMwNnVuaTAzMDYuY2FwdW5pMDMwN3VuaTAzMDcuY2FwdW5pMDMwOHVuaTAzMDguY2FwdW5pMDMwOXVuaTAzMDkuY2FwdW5pMDMwQXVuaTAzMEEuY2FwdW5pMDMwQnVuaTAzMEIuY2FwdW5pMDMwQ3VuaTAzMEMuY2FwdW5pMDMwRnVuaTAzMEYuY2FwdW5pMDMxMnVuaTAzMTN1bmkwMzFCdW5pMDMyM3VuaTAzMjR1bmkwMzI2dW5pMDMyN3VuaTAzMjcuY2FwdW5pMDMyOHVuaTAzMjguY2FwdW5pMDMyRXVuaTAzMzF1bmkwMzA4MDMwNHVuaTAzMDgwMzA0LmNhcHVuaTAzMDgwMzAxdW5pMDMwODAzMDEuY2FwdW5pMDMwODAzMEN1bmkwMzA4MDMwQy5jYXB1bmkwMzA4MDMwMHVuaTAzMDgwMzAwLmNhcHVuaTAzMDIwMzAxdW5pMDMwMjAzMDEuY2FwdW5pMDMwMjAzMDB1bmkwMzAyMDMwMC5jYXB1bmkwMzAyMDMwOXVuaTAzMDIwMzA5LmNhcHVuaTAzMDIwMzAzdW5pMDMwMjAzMDMuY2FwdW5pMDMwNjAzMDF1bmkwMzA2MDMwMS5jYXB1bmkwMzA2MDMwMHVuaTAzMDYwMzAwLmNhcHVuaTAzMDYwMzA5dW5pMDMwNjAzMDkuY2FwdW5pMDMwNjAzMDN1bmkwMzA2MDMwMy5jYXB1bmkwMzAyMDMwNnVuaTAzMDIwMzA2LmNhcHVuaTAzMEMuYXVuaTAzMjYuYXVuaTAwQTB1bmkyMDA3c3BhY2UuZnJhY25ic3BhY2UuZnJhY3VuaTI1MDB1bmkyNTAxdW5pMjUwMnVuaTI1MDN1bmkyNTA0dW5pMjUwNXVuaTI1MDZ1bmkyNTA3dW5pMjUwOHVuaTI1MDl1bmkyNTBBdW5pMjUwQnVuaTI1MEN1bmkyNTBEdW5pMjUwRXVuaTI1MEZ1bmkyNTEwdW5pMjUxMXVuaTI1MTJ1bmkyNTEzdW5pMjUxNHVuaTI1MTV1bmkyNTE2dW5pMjUxN3VuaTI1MTh1bmkyNTE5dW5pMjUxQXVuaTI1MUJ1bmkyNTFDdW5pMjUxRHVuaTI1MUV1bmkyNTFGdW5pMjUyMHVuaTI1MjF1bmkyNTIydW5pMjUyM3VuaTI1MjR1bmkyNTI1dW5pMjUyNnVuaTI1Mjd1bmkyNTI4dW5pMjUyOXVuaTI1MkF1bmkyNTJCdW5pMjUyQ3VuaTI1MkR1bmkyNTJFdW5pMjUyRnVuaTI1MzB1bmkyNTMxdW5pMjUzMnVuaTI1MzN1bmkyNTM0dW5pMjUzNXVuaTI1MzZ1bmkyNTM3dW5pMjUzOHVuaTI1Mzl1bmkyNTNBdW5pMjUzQnVuaTI1M0N1bmkyNTNEdW5pMjUzRXVuaTI1M0Z1bmkyNTQwdW5pMjU0MXVuaTI1NDJ1bmkyNTQzdW5pMjU0NHVuaTI1NDV1bmkyNTQ2dW5pMjU0N3VuaTI1NDh1bmkyNTQ5dW5pMjU0QXVuaTI1NEJ1bmkyNTRDdW5pMjU0RHVuaTI1NEV1bmkyNTRGdW5pMjU1MHVuaTI1NTF1bmkyNTUydW5pMjU1M3VuaTI1NTR1bmkyNTU1dW5pMjU1NnVuaTI1NTd1bmkyNTU4dW5pMjU1OXVuaTI1NUF1bmkyNTVCdW5pMjU1Q3VuaTI1NUR1bmkyNTVFdW5pMjU1RnVuaTI1NjB1bmkyNTYxdW5pMjU2MnVuaTI1NjN1bmkyNTY0dW5pMjU2NXVuaTI1NjZ1bmkyNTY3dW5pMjU2OHVuaTI1Njl1bmkyNTZBdW5pMjU2QnVuaTI1NkN1bmkyNTZEdW5pMjU2RXVuaTI1NkZ1bmkyNTcwdW5pMjU3MXVuaTI1NzJ1bmkyNTczdW5pMjU3NHVuaTI1NzV1bmkyNTc2dW5pMjU3N3VuaTI1Nzh1bmkyNTc5dW5pMjU3QXVuaTI1N0J1bmkyNTdDdW5pMjU3RHVuaTI1N0V1bmkyNTdGdW5pMjU4MHVuaTI1ODF1bmkyNTgydW5pMjU4M3VuaTI1ODR1bmkyNTg1dW5pMjU4NnVuaTI1ODd1bmkyNTg4dW5pMjU4OXVuaTI1OEF1bmkyNThCdW5pMjU4Q3VuaTI1OER1bmkyNThFdW5pMjU4RnVuaTI1OTB1bmkyNTkxdW5pMjU5MnVuaTI1OTN1bmkyNTk0dW5pMjU5NXVuaTI1OTZ1bmkyNTk3dW5pMjU5OHVuaTI1OTl1bmkyNTlBdW5pMjU5QnVuaTI1OUN1bmkyNTlEdW5pMjU5RXVuaTI1OUZ1bmkwMjU4dW5pMDI1NDEuMDAwU291cmNlIGlzIGEgdHJhZGVtYXJrIG9mIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkIGluIHRoZSBVbml0ZWQgU3RhdGVzIGFuZC9vciBvdGhlciBjb3VudHJpZXMuQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvASICAAEARwB5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CxVktchs3Bv3H/cWC6qlYLobuKuyxpAfCxXWBjH3LQUhBg73kRX4Hun3Fx0V9wXp+wUGC7RYG15sZlAL9xUK92R3C/trufcNvgELfQr3jgv3iBX7NguFHpRdBQuPH1AGCxPc9wQmBxPs+wQLN54fjwcT+NqmwQsVIAb3BvsFBdsGCwHW9yr3KvcqA9YL/CQcBXhJCgv3ZvsD7vsd+wgmC3AdwgoL9yH3HAoL92P8xOj5IfvABgsVWK9qt7evrL4eC2ppWl2qbLiTk40LGZAGiWaJXIpnCAv5IfUdb7YfDgACWAA3AAAAGgBiAD8AUABuAIAAMwBLAFoASwBaAH8ATQBPAC0AXgAuAFwAPwAnAEsAIwAJAC0AIQA/AEwAWABMADgAQQBiAEMAWABXADQAYgBMADYAWAA4AFgAOACKAEMAQABJAC4ABwA5AC0ARwAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAa//4AFwA/AD8APwA/AD8AUABQAFAADABuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AMwAzADMAMwAzADMAMwBLAEsASwAIAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAEsAWgB/AH8AfwB/AH8APwB/ADAATQBPAE8ATwBPAE8ATwBPAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0AKQAdAC0ALQAtAC0ALQAtAC0AXABcAFwAXABcAFwAPwA/AD8APwA/AD8APwBLACcAJwAnACcAJwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsACQAJAAkACQAhACEAIQAhACEAIQAhACEAPwA/AD8APwAMAF4APQBMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMAEwATABMABEAEABMAEwATABMAEwAKwA4ADgAOABBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQQBBAEEAQwBDAEMAQwBDAEMAQwACAFgAWAAQAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcANABiAGIATABMACIATABMAEwATABMADYAWABYAFgAWABYAFgAWP/kADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAALADgAOAA4ADgAOAA4ADgAigBvAIoAfwB/AEkAQwBDAEMAQwBDAEMAQwBRAEAAQABAAEAAQABAAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQBJAEkASQAHAAcABwAHAC0ALQAtAC0ALQAtAC0ALQBHAEcARwBHADgAWAA0AFkAOABYADoAPABBADgASQAqADwANQAuAAcALAAXACgALQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ACUAQwBeAEAANQAmADUASQBEAEIAPwBDAF4AQAA1ACYANQBKAEQAQgA/ANIAwQDSAMEAFwDcANwAagB2AO0AdgDLANUAUwBeANUAXgC/AM4ASABXAFEAUQBQABQAUAAUANIAkwA8AMkAewDbAGQAdABkAF0BAABdAQAATwB1AHUAVgBCABsAGwBt//kACQAtAC0AUwBjAIMAgwBQAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACeAM0AqQCqAKkAqgCrALUArACqAOcA0QD6APAAngDNAKkAqgCpAKoArAC1AKwAqgDnANEA+gDwAJ4AzQCpAKoAqQCqAKsAtQCsAKoA5wDRAPoA8ACkAIcAjACkAKcAsgCHAJ0AwgCRAKoArgCKALUAwAB+AKoAjACnAIcA7ACeAKAAmwCMAFIAlgCJAJMAnQCdAJkAhwCHAKoANABQAEsALwA2AG0AMQBcAEsAKgAlAGkAJgBQAFwAZwAzABkAGQAZABoALAAZABkAJgAZABkAGQAZABkAGQBRAFEAYQBRAM8AUQB3AGgAUQBRAFEAaQBRAEYARgBRACH/+gBJAEgAsAA3AB8AGQBDAC0AagAaABAAIAAeACAAxACZAHIAoQAiACIARABEACIAIgAdAB3/5v/m//cARwBdAPkAmQDLANUA8gDYAK4A5wCgAKAA8gCtAOUArQDyAJcAjACtAKYAygDDAOIA2ADlAK4AoQDnAPMAoACcAJcAlQCtAKwApgCtAOIA7ACMAJwA6ADoAMoAygDDALgAoACcAGIAYgDzAPoBIwDiAJwA0wDTAM4A5QDkAKoArAChAKEAoQChAKEAnAChAKEAsgCkALIApACyAKQApQCkAKoArgCqAK4AqgCuAKUAogCqAKQBBADjAAAAAAAAAAD/0f/RAP0AzwAhACEA/QDPABIAEgD9AM8A/QD9AM8Az//R/9H/0f/RAP0A/QDPAM//0f/R/9H/0QD9AP0AzwDPAM8AzwDPAM//0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QBLAEsA/QDP/9EAoAD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0QD9AKAAoP/R/9H/0f/R/9H/0f/R/9H/0f/R/9H/0QD9/9H/0QD9/9H/0f/R/9EA/QD9AP3/0QDPAP0Az//RAM//0QDPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAAAAAAAAAAg0AAAEsAAAAAAAAAAAAAAEsAAAAAAABAAAADAAAAAAAygACAB8AAgA1AAEASwBMAAEAZwBnAAEAbgBuAAIAfgB+AAEAoQCjAAEAqQCpAAEAzQDOAAEA5gDmAAEA/AD8AAEBBAEEAAIBGAEYAAEBHAEcAAIBHwEfAAIBLgEuAAIBLwEwAAEBNQE1AAIBVQFXAAEBXQFdAAEBbAFsAAIBggGDAAEBmgGbAAEBnQGdAAEBoQGiAAEBrQGtAAEBwwHEAAEByAHIAAICzQLNAAEC1wLXAAEC3QMcAAMDHgMeAAMAAgADAt0C+AABAwMDHAABAx4DHgABAAEAAAAKAGwCGgACREZMVAAObGF0bgA4AAQAAAAA//8AEAAAAAIABAAGAAgACgAMAA4AEAASABQAFgAYABoAHAAeAAQAAAAA//8AEAABAAMABQAHAAkACwANAA8AEQATABUAFwAZABsAHQAfACBhYWx0AMJhYWx0AMpjYXNlANJjYXNlANhjY21wAN5jY21wAOxkbm9tAPpkbm9tAQBmcmFjAQZmcmFjARBudW1yARpudW1yASBvbnVtASZvbnVtASxvcmRuATJvcmRuAThzYWx0AT5zYWx0AUpzaW5mAVZzaW5mAVxzczAxAWJzczAxAWhzczAyAW5zczAyAXRzczAzAXpzczAzAYBzczA0AYZzczA0AYxzdWJzAZJzdWJzAZhzdXBzAZ5zdXBzAaYAAAACAAAAAQAAAAIAAAABAAAAAQAQAAAAAQAQAAAABQADAAQABQAGAAcAAAAFAAMABAAFAAYABwAAAAEACQAAAAEACQAAAAMACAAKAAsAAAADAAgACgALAAAAAQAIAAAAAQAIAAAAAQAPAAAAAQAPAAAAAQAMAAAAAQAMAAAABAARABIAEwAUAAAABAARABIAEwAUAAAAAQAOAAAAAQAOBAQAAQARA/4AAQARBAgAAQASBAIAAQASBDgAAQATBDIAAQATBEgAAQAUBEIAAQAUAAAAAQAOAAAAAQAOAAAAAgAMAA0AAAACAAwADQAXADAAOABAAEgAUABaAGIAagByAHoAggCKAJYAngCmAK4AtgC+AMYAzgDWAN4A5gABAAAAAQP6AAMAAAABBLAAAgAAAAEArgAGAAAAAQDMAAYAAAACANYA6gAEAAAAAQDyAAQAAAABAWQABgAAAAECKgABAAAAAQI0AAEAAAABAk4AAQAAAAECaAAGAAAAAwJmAngCigABAAAAAQKSAAEAAAABAsoAAQAAAAEC5AABAAAAAQL+AAEAAAABAvwAAQAAAAEC/gABAAAAAQMGAAEAAAABAzoAAQAAAAEDTgAEAAAAAQTcAAEAAAABBOYAAQU+AAQADgAUABoAIAACAAYC4QACABAC4QACACAC4QACACoC4QADAAAAAQUYAAEFJAABAAAAAgADAAAAAgUYBR4AAQUkAAEAAAAVAAMAAAABBRYAAQUQAAEAAAAWAAEFCgADAAwANgBYAAUADAASABgAHgAkAw0AAgLdAwsAAgLfAxEAAgLjAxsAAgLnAw8AAgLtAAQACgAQABYAHAMVAAIC3QMTAAIC3wMZAAIC4wMXAAIC7QAEAAoAEAAWABwDCQACAt0DBQACAt8DAwACAuUDBwACAvMAAQSaABAAJgAwADoARABOAFgAYgBsAHYAgACSAJwApgCwALoAxAABAAQASwACAv8AAQAEAGcAAgL/AAEABABuAAIC4wABAAQAfgACAv8AAQAEAKkAAgL/AAEABADNAAIC/wABAAQA/AACAv8AAQAEAQQAAgLzAAEABAEYAAIC/wACAAYADAEfAAIC4wEcAAIC/QABAAQBLgACAv8AAQAEATUAAgLzAAEABAFdAAIC/wABAAQBbAACAvMAAQAEAYIAAgL/AAEABAHIAAIC/QADAAED8AABBBIAAAABAAAAFgACBDwADgJEAkUCRgJHAkgCSQJKAksCTAJNAlACUQJOAk8AAgQaAA4CNgI3AjgCOQI6AjsCPAI9Aj4CPwJCAkMCQAJBAAEEDgCDAAMAAQQOAAEEGAAAAAEAAAAWAAMAAQQOAAEEHgAAAAEAAAAWAAMAAgQgBBYAAQQMAAAAAQAAABYAAgQUAB0CVQJWAlcCWAJZAloCWwJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAm8CcAJxAAIDegAOAhoCGwIcAh0CHgIfAiACIQIiAiMCJgInAiQCJQACA1gADgIoAikCKgIrAiwCLQIuAi8CMAIxAjQCNQIyAjMAAQOmAAoAAQOqAAEAAAEAAAID3gADAhcCGAIWAAABAQACA9gAGQGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMCUwJyAAABAgACA7gACQHEAcUBxgHHAcgByQHKAcsCcwAAAQMAAQOy/6MAAgOyAFwCVgJXAlgCWQJaAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJvAnABxQHGAccByAHJAcoBywJxAhcCGAIWAhQCUwJyAnMCGQLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAAEDsAAQACYALAAyAD4ASgBWAGIAbgB6AIYAkgCeAKoAtAC+AMgAAgJVAa0AAgJbAcQABQJEAjYCGgIoAdcABQJFAjcCGwIpAdgABQJGAjgCHAIqAdkABQJHAjkCHQIrAdoABQJIAjoCHgIsAdsABQJJAjsCHwItAdwABQJKAjwCIAIuAd0ABQJLAj0CIQIvAd4ABQJMAj4CIgIwAd8ABQJNAj8CIwIxAeAABAJQAkICJgI0AAQCUQJDAicCNQAEAk4CQAIkAjIABAJPAkECJQIzAAEAhAABAAgAAQAEAS8AAgL/AAIC7gAtAyEBLwI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMC3gLgAuIC5ALmAugC6gLsAu4C8ALyAvQC9gL+AwADBAMGAwgDCgMMAw4DEAMSAxQDFgMYAxoDHAMiAAEABABZ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) format('truetype');
33}
34@font-face {
35 font-family: 'Source Code Pro';
36 font-style: normal;
37 font-weight: 600;
38 //src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqdNE-IuDiR70wI4zXaKqWCM.ttf) format('truetype');
39 src: local('Source Code Pro Semibold'), local('SourceCodePro-Semibold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAT8cAAAAOkNGRiC2ZBOfAABJHAAA2XlEU0lHBLtt/AABP1gAACBYR0RFRi8sL9AAASogAAAA1EdQT1MlURFbAAE2KAAACPRHU1VC3Z7yFQABKvQAAAsyT1MvMnOc0bUAAAFQAAAAYGNtYXDp1MYJAAA+7AAAChBoZWFk+82HfgAAAOwAAAA2aGhlYQZmAOAAAAEkAAAAJGhtdHialJxBAAEimAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZXGkOKIAAAGwAAA9PHBvc3T/uAAzAABI/AAAACAAAQAAAAEEWrrz6QNfDzz1AAMD6AAAAADNFZ/2AAAAAM0Vn/b/yv5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP/K/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAJYAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwYJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAGABFAAEAAAAAAAIABwBdAAEAAAAAAAMAJwBkAAEAAAAAAAQAGABFAAEAAAAAAAUAOQCLAAEAAAAAAAYAFgDEAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAABAADxN2AAEAAAAAABEACBOFAAEAAAAAAQAAFhONAAEAAAAAAQEACxOjAAEAAAAAAQIACxOuAAEAAAAAAQMAFRO5AAMAAQQJAAAAihPOAAMAAQQJAAEAMBRYAAMAAQQJAAIADhSIAAMAAQQJAAMAThSWAAMAAQQJAAQAMBRYAAMAAQQJAAUAchTkAAMAAQQJAAYALBVWAAMAAQQJAAcAwBWCAAMAAQQJAAgANBZCAAMAAQQJAAkAGBZ2AAMAAQQJAAsAMhaOAAMAAQQJAA0jthbAAAMAAQQJAA4ASDp2AAMAAQQJABAAHjq+AAMAAQQJABEAEDrcAAMAAQQJAQAALDrsAAMAAQQJAQEAFjsYAAMAAQQJAQIAFjsuAAMAAQQJAQMAKjtEQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIFNlbWlib2xkUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1TZW1pYm9sZDtBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tU2VtaWJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9TZW1pYm9sZFR5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAUwBlAG0AaQBiAG8AbABkAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBTAGUAbQBpAGIAbwBsAGQAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAFMAZQBtAGkAYgBvAGwAZABTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AUwBlAG0AaQBiAG8AbABkAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCmIKsgsSC1ILkhEyEXISAhIiEmIS4hUyFbIZAiAiIGIg8iESIVIhkiHiIrIkgiYCJkJQAloCWyJbYlvCXAJcYlySYQJmonEydS+wH//wAAAZ0AAP/BAAD/uwAAAAD/dgAA/78AAAAHAAAAUwAAAAAAAAAA/37/VwDpAAAAAAAAAAAAAAAA/2T+Cv9M/0v/SP9B/z7/Nf8s/x//G/8M/6wAAAAAAAwACwAHAAAAAAAAAAD/5v/l/97/1wAA/9P/0f7k5RIAAOUOAADlEQAA5Q/ku+S65LMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4triGQAA4xkAAAAAAAAAAOG/4lrik+G54kIAAOGqAADhqOGl4d3h2+HZ4dgAAOHQ4c7hy+Gb4Pjg8uDv4YXhgeE74TXhIOCl4KTgngAA4HIAAOCH4H3gWuBA4DjeI90U3QbdBN0A3P7c7wAA3LDcWduv22UGqgABARYAAAEyAAABPAAAAUQBSgAAAYYAAAGcAAABqgAAAcACNAJeApAAAAAAAAACtgK4AroC2ALaAtwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAsoAAAAAAAACxgLQAtQC3AAAAAAAAAAAAuAAAAAAAAAAAALcAAAC3gAAAt4AAAAAAAAAAALaAuAC4gLkAuYC8AL+AxADFgMgAyIAAAAAAyAAAAPQA9YD2gPeAAAAAAAAAAAAAAPYAAAD2AAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7QAAAO0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA54AAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHjAeQCmgKZApsB6AITAgECBwICAp8B/gLLAgMCBgIEAqEDHwHnAnoCdwJ1AngCCAIMAtUCDgJSAfQCowH3AhAC1gJ0Ap4CHAIdAswCpgINAfwC2wIbAlQB9QKLAowCjQHpAD0ATABOAFcAWABZAFsAcwB0AHUAdwDkAIwClgChAL0AvgC/AMEA2QDlAWsA7gD9AP8BCAEJAQoBDAEkASUBJgEoAZkBPwKXAVUBcgFzAXQBdgGOAZoBkAA7AOwAPADtAEsA/ABPAQAAUAEBAFIBAwBRAQIAUwEEAFYBBwBcAQ0AXQEOAF4BDwBnARgAWgELAGgBGQBpARoAagEbAGsBHABvASAAcgEjAHYBJwB4ASkAeQEqAH4BLgB6ATAAfwExAIABMgEzAIEBNACDATcAggE1AIQBNgCIATsAigE9AI0BQACLAT4BRACWAUoAlwFLAJgBTACiAVYAqgFeAKwBXwCrAWAAsAFkALEBZQCzAWcAsgFmALkBbQC4AWwAwAF1AMIBdwDDAXgAxAF5AMUBegDNAYIA1gGLANoBjwDbAOABlQDiAZcA4QGWAKMBVwDOAYMAPgDvAHsBKwCZAU0AxgF7AMcBfADIAX0AyQF+AMoBfwBsAR0AqQFdALQBaAC6AW4CXgJmAmsCbQLXAtoC2ALcAtQC2QJgAmcCbALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL8Av0C/wJWAlgCWQJfAmECZAJoAmkAVAEFAFUBBgBtAR4AcAEhAHEBIgCFATgAhgE5AIcBOgCJATwAjgFBAI8BQgCQAUMArQFhAK4BYgCvAWMAtQFpALYBagC7AW8AvAFwANQBiQDVAYoA1wGMANwBkQDjAZgAPwDwAEAA8QBBAPIAQgDzAEMA9ABEAPUARQD2AEYA9wBHAPgASAD5AEkA+gBKAPsAXwEQAGABEQBhARIAYgETAGMBFABkARUAZQEWAGYBFwB8ASwAfQEtAJoBTgCbAU8AnAFQAJ0BUQCeAVIAnwFTAKABVACkAVgApQFZAKYBWgCnAVsAqAFcAMsBgADMAYEAzwGEANABhQDRAYYA0gGHANMBiADYAY0A3QGSAN4BkwDfAZQB+gH4AfkB+wHsAe0B8AHuAe8B8QIKAgsB/QIaAl0CJAIlAmICgAJ5AqwClQKYAqkCtgLEAAMAAAAAAAD/tQAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQCAAEBARdTb3VyY2VDb2RlUHJvLVNlbWlib2xkAAEBAS769gD69wH6+AwA+vkC+voD+BoEjAwBVfwk+VX6fAUcMZ4PHDQYEckdAADFDxIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3xbuQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBTZW1pYm9sZFNvdXJjZSBDb2RlIFBybwEZAgABAEgAfACwANMA+AFBAZABowHGAh0ChAKZAqUC5gMPAzYDTQOIA6ADvwPEA+YECAQUBDkEcgSMBQQFGwViBWcFcAXzBgMGCAYQBiMGKwYzBkgGWgZ+BoIGowa+BsMG5wdEB2QHhAeUB5gHoge2B8UIDAgPCBQIHghACFUIWghoCGwIfQiOCKAItgjFCNEI3AjjCP0JCwkqCToJQAlQCVQJYAmfCa4Jtwm9CfcKDQoaCiEKJgo0Cj4KQwp5CowKlAqZCqAKswq7CsUKygrPCukK+wsQCzILNQs9C2gLkwuiC8wL4Qv2DAwMHAwkDEsMXQxqDHcMhgyVDJwMrwzBDNUM5gzvDP4NDA0TDTMNOA1JDVQNXA1gDWwNdw1+DZENlQ2ZDaINsg25DcUN0Q3aDd4N4w3oDgIOBQ4LDhIOGQ4hDicOLg41DjwOQw5IDk0OYw5xDn8Ogw6IDpAOmA6eDqUOug6+DsMO0A7dDuMO7Q7zDvoPAA8GDwwPEQ8mDzsPUA9jD3MPeA+KD5wPqA+0D7wPwg/HD8wP3w/nD+8P+A//EAYQChAcECEQJxAuEDIQNxA8EE0QUBBfEG8QdhCAEIoQkhCWEJ4QpBCpEK4QshDBENAQ1xDcEOEQ7xD9EQMRCREOERcRHhEjESkRLxE0ETkRRhFTEWARbRF6EX8RiRGTEZoRoRGoEa8RthHCEc4R2hHmEe4R+hICEgoSERIYEh4SIxIoEi0SOBI9EkgSUBJVEmASZcn3iRX7NvcLLPcp086jrMAeZNMFcl5hfFgbMke844Mf9/kGjZeOoaEa9xw57Psm+xT7ECr7NR73CboV25jGtc0b2bRdPx8LFaLbn9Cf1Z3UGY8GnkOfQJ5GojsY1/ugFfcPBvto+SIF+xwG+2j9IgX3Cga+90UF924GDsD3Nx33Ci33FfcV9wrp9zf3OPsK6fsV+xX7Ci37OB73Cxbuu8zb27tKKClbSjs7W8ztHguUTgXp97cG9x1A1vscNzpqaFAetT4Fp77Co8Ib26xiVI8fC+kK+0fhOPcj9yTe3vdHHvgo+wP8MQcgXl5ERWC49h74MfsIBwuBVwWIBrRjW6JVG/sIJCr7LPso4Cr3EcDEpa6uH4k7BUyHX2E4G15Tl6hbH/c590UVQlvE6unHxs2wrX9qrh/7XAdhaWV5ZBsLxd8VTsziaOcb9yzl4/XqULw4rB81sAVQoladvhq7tajPx7l2aLcex9UFvlU/qzsb+xktOyMr0ljQcB/kZAXMcrh6VRpYYWo7S0qpt1oeC4FXBYgGtmBdoFYb+wcjKfs0HwvdFvcI9+MGubisorsbzqRnPB/7tfcI98QH9xNX0/sFQFNkCwPwFvcZBrX3YJXKkbaRsRmPBpNYkl2TXbb7YRj3Gwbm+H8FIQZe+5OEXIZdg1sZhwaDu4K5gbpd92MYNQZd+2OBXYNchFsZhwaEu4a5g7pe95MY+wYGCxWemJ2ilx6xgKt/bhp2cnxvbXSboh4T2NDxFWmVcpajGp2cmaSnnHx3e4N9d38eE+T7JvsAFVrAYtjWwrO9uG+gaJsejwcT2KeZpJ6vGr9YrkZKVGhXZaN8qHgehwcT5Gt6bHZiGg4VT0sFhwZPywUxBuv7CAX3BAbwHQ66rqm6yQpcrm26Hw4Dx/fZFftt9xj7DPc73c6tyMAeS9IFYmZic1Yb+wRA5fcp9yfW5fcBvrF2a6sfzNMFtmFLsjsb+0H7FvsT+2ofC9L4+xX3L/xIBvsNx0X3B8Sul5u6HnDgBX5qcYVyG1llpM0f+Kn7ogcLFa6kpK2ucqRoaHNyaGmjcq4f904WrqOkra5zpGhocnJoaaRyrh8O3xb4RO37Mvhe9zLt/EQp9zL8XvsyBgtSHdH3MpUK91vxcfcDE7sgdwoT2pBIHRO7IFYdE7pQMx0TuqBFChO2oEIKE7pgVQoTuyDBChO2oDwdC86TxqfKGr9bqiGOlAqjf3QadnWBb4UeC/dB9wLY7OBJrvsTHycGTmuZrJ6WmZ6XH4KlpYeiGwv3VPdsC/c4+I9FHWNye1qDHplqaJNmG/sV+wot+zj7N/cKLfcVHwv3QfkhRR1kcntggx6faGKWXxv7LCL7Eftn+2j0+xb3LB8Lu62purAdXK5tuh8OVvwxBiBeXkRFYLj2Hvgx+wj8KAf7R+E49yP3JN7e90ce9/sHCxVptbR9vRvWwbnJyV+vSXp4iIV+H5K/Bfcc0vteBnz7MbByBZeem5OiG6uhe2tudHpsaG2cn3UfDtSA2obQHo4GyPse90P8BQX3Cvki+wP7sAYLH5T8Fy0KE4Eg+1z8dRWemZ2ilx6wgKx/bhp2cnxvbXOboh4TQMDR8RVplXKWoxqdnJmkp5t8d3uDfXh/HhOBIPsm+wAVWr9i2dbCs724b6Bomx6PBxNAwKeZpJ6vGr9XrkdKVGhXZaJ8qXgehwcTgSBremx2YhoO93b3zhVYYa/Jx7Wxvr62ZU9NYGdYHwsB9y7c9y7TA/cu+DoVINdM67a4maGtHm6+BXxxcYNuG1VjqMODH/dxBo2TjZmaGuVZzCs5PEohHtyqFb6Sr6SyG7ujblwfC/eK9wAL5VJ294bT6+gLf934hN0Sy/FH8fdn7Dr3ARPk9zr3QxXAr7C8qB7waNZ2QhpQXGc+OlO1yh4T2PdK90wVNqdMp8sawrarxtGyYlNjdmdhaR4T5Puw+1gVJOZD9yb3KuDW7eNVt0atHo8HE9i/rba/xhryPdD7EvsLNEkkSLVbwGkehwcT5EhrTVs4Gg7f+CQV92n8JPcH+H/73AYLAT4dAwsGx+zQHSoFCxW0qaaysW2mYmJtcGVkqXC0Hw4Vk3+SfHoaC3b3Reb3vOUL9xYW9wj3owbqvc2uzhuwn4aBqx8LhZ6jiasb2QbMrYFlYU1lKx8L+wQiKfs0H/cLjBXyxMbPr61/aq4e+3EHY2lneGIbQF/E9R8Lf10dC8SRuqHCGrhkpy2PHoBXBbyInoF1Gnh6g3WGHvuXMjEKDgPIFvh27fvoBvfk+HoF0fxUKvfFB/vj/HsFC/cAQh0L/PsVN1Xp9yf3JsHk39/BMvsm+ydVLTcfE/Q2HRP4cR0T9HYK95DM92bNAfc13PcO3wP3NffwFVS2YseysJ6jqh6NBpFoBdD3UwboXLw2Vld4dGUeqlMFnaqsmasbt51yao0f+yF8TWdFGtySFamroOWWHkcHd3Ryf3EbcHaXpR8OFfJk1EjRHkxiBcROpkc/GkBwR1JOHspiBc7RstTxGg4V0aG0wM4awnSpY21xdmtqpXmnHo2Ni40bZXF0XnseDvtt1vcU5jje2tP3RuBI2gt/TwoLQh33ivwkFfcAC9mmv8juGvcmIrv7HB77bv0i9wgLMFimtx8rfBUz5GD3Gx4LmR33b/g7Fc2ur7Ogo4R5oR77JgdzdnWCchtebq3PHzWKFSDCTN+ur56ipB6NBpFpBdD32UkGhGwFiAamcG2XaBs/R0sgHw5mHQ5sHTYGDhW7raq5sB26Cgv3CBPdwIcdE72UUgXq+Vb7CPtGBpA4Ba9jZKFRGxPdSR0LJx33Fffc9xsdwEYF1AY69xAFLgYLZx1/dwv3DBb4Ou37x/jA+wcGCxI5CgsVYh33Yha2HW9tZWWnbrIfDs6TxqbKGsBbqSGPlAqj1B0LsqeosbFvqWRkcG1lZaZush8LFaqio6mpdKJsgx33OQqho6mpdW8KC5lucZFjGzZBXzxZH4gGC/ti5vcQ6ffF6n93CxX7DAYx+zIF4QYL6k12+CzqC9MW9wj3tvd0+7b3CPki+wj7m/t095v7CAYLNhVcaGtdXK5tui8KHwugdvgl8Xeftx33FvcIE8xHHROso+wFE8xkHROc1woLRR1bZX9dhx4T9DgdE/Z2Hc0KNUoKCxtedbC2hh9IBkOPtELpGwv3CAUL9yf7Enb4j/cni3cL9+sHtJ6cn6Ubp5l2Xx/75+X36we0np6fpRunmHZfH/vn9wH38AftY8RGVWloXHQewX9sp1wbU21rYHUfiAYL9yz09xb3aPcHbORWxR8LWWVePoMfyAYLf/D4yXcL95DP92LOAfcd4vcs4gP3Hfg6FSDYTOHh2Mr29wE+yTU1Pk37AR7iFsmmtby9pWFNTnFiWVpwtMgeDsvpu7bSAf8AzIAA0f8AR4AA3wP3PAvMmMCs0hqof6R8nR4OAYv47MQdC3b4f3cL9xX3Cun3N+BrzVu3HwsV4QYx9zL3HgoOpwrxCgv4tbnyuQH3WcbjxgP3wPi1Fci1ssXGYbJOTmFkUFG1ZMgfuQRyeKCpqp6gpKSedmxteHZyHw4VaqN0qqqjoqyrc6NsbHNzax4OPx3R9zLPCgvp99vpC4oKE6BzCgu1gJ19dhpwaH5ZhR6UWQXh4woL0/cI93n3AwtsdXRtbaFzqh8LYwrXHQuymx1kCzs5v1nSH78EbXSixMKin6moonhTUnR0bh8L94kV+zbfLPcSwsKqsbEejgYLFeJuHSUGS/sIBfc9FtoG4m4dJQYOqfseFaqhoaqqwx1sbKJ1qh/7ThaqoqGqqr8dbGyhdaofDm0dDhV0XQWofgoLp5CZl50bE71AqaBjvhsTu0C5q6/Nkh9WBhO9QG+Gfn94GxO6oG13s1cbCwPeFvcJ91MG6vcJ9zf7yAX3FQb7c/gj9133kwX7FQb7ffu9BYj3vfsJBgsV1Abm9ycFLQbk+yfVCg4D5Rb3CPcUBunp9y77cgX3Egb7Z/e591L3WgX7FAb7cft3BYf4TvsIBgsT7KsKE9raHRPqch0T2qIKE+zYHQv46NcB9z73mAP3PvjoFfeY1/uYBg4Vvrj7E/c99xP3PFi5+zb7MQX7BgcLy9y618sS997fRN8T6Pc8CxX3mdf7mQYLp5GYl54bE9ipn2O/GxO4uKyvzZEfVwYT2G+Ffn94GxO4bXezVxsLOQoSPh0ToPEKBhNg+Rr3DB0LPh3AHQcToPzk+4oHDvcGHVtpa11drWy7Hw73kND3YM8B9xnh9yLfAwvL92DLAfcw3fcQ3QP3wAumqLGxcKkLZAr3ivwkFfcA+K73DB33AOAKC9kd9yz3vAP3LPjRFeFsCikGDsTCr+6xH0WsBUx1cXZtVGTbOxsLOQoSNB0TYPc8HQYToPcqHQtW3QdG/JstCgv3FfhGFfcFCoV1Zl9tHQvREvdI95H7UuMToPeHC72xudeTHwsD+AD5yBVuhXlyYxtjeaSohR9JBkuSsljfG9+y90EKCxPoQR0L9//5VBU3bh37Egb3CfsIBQuL9wP3jvcS9zt3C9UW9wP3sgYLf9oKC/sA/Rr7AO8K+1QGDhXgCvtU+K77AAYLfnUadXWCC8K0HYFXBb2InH91Gnh8gnaFHg75WLodFTIdC7lpq1tcaGtdC9H3SdAS90b3jiveE+D3RgtvHRLV9wMLwfcWxAH329cD94oLlb2exhq6YqYtjh4L90EdhnVmXhsLhR1kC3/3NgoLEtH3BwvJ9zuCCoP7AgX7CND3zDQHZCN0PwWHBnPXC+cdDgYo9zIFC/cJCt33CAs0HQE0HQMLFfuaP/eaBg73QAp1dAv7ivka+2wL+4r45PtsC/te6Pjsdwt1omxsdHQLxR347AsD+1wEC/lUFfAdMQZPSwWHBk/LBTEG6/sIBQt2+CXxd59/dxL3FvcIC+bh9y8S95z3OPsX9wcLErYKC+q3HcAL8Pc+6vdn8AsB9y722fYDC2dcO4IfC+sdj+YTvAv3Y+cB9xX36gP3FfdjFffq5/vqBg6CCscL98BpHQsVvQf8zvpKBW0G+OwL/IgVvQf7ovhWBW0GC6wdb4QeC/h/Afd14AP3dQv3NR2EHwtJj7JI5RsLratawRsL+NH3MgELaWu7VRsL9wD3AAsS92n3Qv//cYAA9wP//5qAAOcTSAvlss7Njx9IBmeGd2xiG2J3qq+GHwuSeZaiGqOvlr2RHoG9BTaFP25MGgv3Y+cB2/hMA9v3YxX4TOf8TAYO92Pn5wqf92MV+MTn/MQGDhLA9wsLFfiwjQb7oPiRBYcG+6D8kQUOFY0G+JH3oAWPB/yR958FiQYOFcmhpaGpwrI72xsL9wsB9yj3C833CwML3fcI93r3Cwv3AP1YBgtV91QVC/ka+wALqgZwc2VjUxpRt23Cp7KXnaIeC1Md8fcyiwoLFfcAHAV48AriAfev4QP3rwuxkpiboBsLZYR+e3YbC+tuHQvlAcvzyvceyvMD98B/Ffcl5gvoHbcKC6BGHb7CC2cd9193EgtKHfELoPcfCgsS0/cIC7v3BH0fwbm9n7Yb07ZmPz0LugoO+NEVMfcy9x4K9xD7MgULAZ33BbD3BbD3BbD3BQOdC/cA+8D3MgoVuq6qubloq1wL+0F290rq99nqC215dYJbhAgL0e4KC/cA91D7AAYL6n934R0L4Ar7wAuL9zgKC/zsBg6VwQWOBmG2wXO5G/cF9Av/AKOAAHcB/wEAgADiAwv7bPzk9w0Kdvgo7gunVbwbC/tc+nwSi/fAi/fAE8ALFdYGtPc/oPcPBfsHBgv3MR33VAv3MQr4LAvQ9zQKCxX3BfcA+wUGC+Ed95T3CwsV9zYdC/sIBc4GDtRC9xMSC/zk9wALdvkidwvBxo8fUgZuhXVwXBsLAaz3Gs33Gs33GgOsC/c/AfdW3/c43wP3CwuBvfi83AFwvfie3QML+44VvQf7DPdcBW0GC2UK94oL94oV+Cz3APcTCvdUFfgs92z3Ewplg397dRsL9wJf9wgSC/jk94r3bAtJjrNI5BsLoaOpqXWiCxVjtstr3xv3H/cXCwf3P90Fzgf7PzkFC/uO+nwB943xA/eNCwH4FfcCA8wW+GPtC/wkHAV4Qh0LFfsPBvcH+wgF6AYLdve28Pebdwv7bb33DbwBC7NXG/cSCgvVBr/QggoL94kV+zcLd/H3Mgv3bvc4Cx5+TgULWGJxZ2kevl4FowtzCsIKC/ssyvfg0ffgyhILUfcnCsXFYQv3COwKCwHW9yr3KvcqA9YLH0gGYAsBAAEAACIZAEIZAK4AAKsBALAAAK0AAYcBAK8AAYkNAIoAAZcAALEAAZgHALUAALIBAaAAALQAAaEWALkAALYBAbgAALgAAbkPAIwAAckCALoAAcwDAL4AALsBAL8AAL0AAdAKAI0BAdsOAMAAAeoJAMQAAMEBAfQAAMMAAfUWAMUAAgwAAMYAAg0EAMcAAhIBAJoAAJ0AAhQAAMsAAMgBAM0AAMoAAhUBAMwAAhcNAJAAAiUAAM4AAiYHANIAAM8BAi4AANEAAi8WANYAANMBAkYAANUAAkcGAJEAAk4JAJIAAlgCANcAAlsEANsAANgBANwAANoAAmAKAJMBAmsOAN0AAnoDAJUAAn4FAOEAAN4BAoQAAOAAAoUWAOIAApwAAOMAAp0EAOQAAqIBAKcAAKIAAqQDBGEABGAAAqgJAG0BArIeAAcAABEJAtEJAA8AAA0AABsBAHkAAAIAAGAAACAAAHsAAGgAAAMAAEEAAAgAAGkAAHcAAHUBAGsBAGoAAHgAAA4AAtsAAG8AAIkAAToAAtwAAHIAAHQAAEAAAAkBADwAAD4AAFwAAF4AABAAAF0AAD0AAKAAAAsAAHABAGYAAHMAAKoAAt0AAKUAAJkAAt4AACEAAt8AAAQAAuA7AIsAAxwAAI8AAx0eAKEAAGcAAAUAAGIAAGQAAzwAAGEAAz0AASwAAz4IAGMAA0cBAAYAAHoAAJ4AAJsAAKMAAUQBAUADAAwAAKYAAKgAAJ8AA0kAAB4AAB0AAB8AA0oBAJwAAD8AA0wAAF8AA00AAJcAA04mAHwCAIgAA3UEAH8AAIMAAIABAIQAAIYAAIIAAIUAAIcAA3rlA8MCAAEATgBPAFoAugDDANQA3gEBAQ4BHgEmAS4BNwFFAVcBawF0AbECGwI7AkkCUwJcApQCnQLtAvQDAAMRA0kDUgN5A4YDxAP8BBUEJAQ2BEMEUQRwBIUEkwTcBRMFKAU5BUcFXgWQBZkF5gXwBfwGCwYfBkQGdgarBsQG1QcSByMHNQdHB3QHoAflCC4IWgh6CJwItQkNCSIJgQnJCjsKoQqwCr8KzQryCwsLKAtGC0gLWQtsC34LkAuqC78L0AvkC/0MEgxCDGYMiAyfDLsM3A0WDSwNWw1yDY4Now28DgQOHA46DnQOyA7YDukO+g8sDz8PWA9oD4MPkw+uD8kQHBAtEEsQYhCBEJoQxhDiEQkRJRFYEXIRkxGzEfsSKRJKEmgSiBKVEqQSshLYEvUTDxMeEysTOBNME2QTiBOrE8MT5BQCFHgUzRT6FQsVGBVSFagV3hY/FloWchalFtEXIBdWF3IXhheZGAwYNRhNGGYYzRjfGRAZMRlKGV0ZbRl/GZAZpRnBGc8Z3xn6GgoaGxpJGnUalhq2GtMa7hs7G1cbbxuDG6MbxhvhG/EcAxwUHCgcNhxGHFUcZhx/HJgcsRzkHPkdDR0iHTcdOR16Hdsd9B4NHjAefh69Ht0fAB9LH24fjh+vH90gCiBJIIAgtCDsISEhfiHGIfQiUSL5I1wjuyPJI9wj7yQDJHEkhCSYJQklHiUyJU8lbCWJJaMl2iXxJggmIyZbJoQmqybkJ0InaCfnJ/ooRyhcKKgouijQKT8pcCmZKdMqKio8Kk8qZCqQKqkqwCrXKusrAysZK0MrYCtrK4QrnCvOK+UsDSxbLIEslyy/LNUtIC1NLWkthi28Ldst/S4fLkEurC6/LtIu6S8gLzsvWC9yL4cvni+3L9Av9zAcMD4wljC6MScxrDHLMe8yEzJBMp8yyjMtMzUzVjNfM4kzxTPjM/w0GTQ3NLQ02DTvNQY1bDWHNew2BTYgNjw2fzaWNqw2xjcHN0k3bjeqN+w4DjgnOHQ4vTkOOVc5eTmwOeE6CjowOlY6jTrwOyE7MTtCO1o7bzuBO5M7rDvDO9Y78TwEPDg8TDxoPH08kj0JPU09XD3HPds+MD5zPsQ/Gz80P3M/0EASQFJAhkDrQUdBgEHLQhZCKkJDQlxCeEKsQtVC90MeQ15DeUOZQ7tD3EP7RDVEfESmRN9FFkV0RcVF+EZrRoRGqEbSRvZHJ0dJR29HqkhBSJJIukj6SUhJhEnPShhKR0pJSqNK8ksaS1VLo0vcTCtMe0ypTKtNBU0PTR5NPk1sTYpNwE32TlBOqk6+TtxO7E78TxNPIk8xTz9PTk9dT3FPhE+GT4hPik+MT45PkE+lT8RP1VASUExQalCGUOhRSFFgUWxRhFGZUdBR61InUrNS3VMpU2lT1lQYVJtU0FUDVWRVm1WdVZ9WL1Y4VkFWSVZRVllWYVZpVnJWelaCVopWklaaVqJWq1azVrtWw1bJVtFW2VbhVuhW71b2Vv1XBVcNVxRXG1dVV1tXYldoV71XxFfKV9FX2FffV+VX7Ff1V/5YBlgOWBZYHlgmWC9YN1g/WEdYT1hXWF9YYVhjWGVYZ1iwWPFZF1khWVlaE1ogWk1allrFWvdbTFtZW1tboFvFW/lcUFyLXMJc8l1TXZ9d714YXi9eRl6WXphfBF88X65gDWBiYL5hOmGaYg9iz2M4Y7dkDGR0ZPZldmXbZjdmjmabZqhmtWb6Z1RnwWf1aJxoy2kVaTlpc2nOag9qL2oxamdqrGrNauxrFGs8a3RrrmvcbANsQGxebJFsqG0EbYdt625Qbqtu4m8Tb3Zvo2/DcCdwq3DUcP5xKHFRcWhxhXHYcgVyEXIqcjZyUHJpcpNyr3LZcvlzVHOVc+J0I3Q/dFh0aHR4dKB0yHTVdOJ05HTmdP91AXUOdRt1M3U1dUh1SnVbdV11bXV2dZh1mnWndbV1wnXRddN14nXkdhB2EnYedi92P3ZIdlh2a3Z1doV2kHaSdqR2tHbCdsR20nb2dxl3Rndzd513p3fWd/t4HXgweDJ4Ynh5eId4q3jOeOl5BnkpeTx5anl7eZ95wXnjegF6HnowelZ6bHqGeqF6vHrWewd7FntOe4h7vHvufAB8NHw1fDZ8N3w4fEN8VHxifHB8mHzAfO19En0yfVJ9eX2ifa99vn3Lfdh94n3pffd+BX4VfiV+NH5DflF+W35kfm1+fH6NfqZ+wX7OfuV/A38Qfx5/JX84f0d/VX9of35/jH+Xf6F/rX+5f8d/1n/if/F/+oAXgDaARIBLgFyAdYCCgI6Am4CpgLeAzYDegO2BAYEggTKBWIFwgYiBnIGkgbaB0oHugguCLIJAgl2CYoJ+gqWCvoLZgveDDYMkg0ODW4Nng4SDjIOpg9KD74QJhCyEQ4RZhH2El4SnhMKE6IUEhSqFS4VthZGFtIXRhdyGDIYXhiiGNYY/hkqGX4ZshniGjYadhrCGwobVhuCG64b2hwGHDIcXhyKHLYc7h0mHV4djh3GHf4eKh5WHrYfpiJGIpIi1iMWI0IjiiPCJCokbiTCJRYldiW2L1viR1wG73ffn3gO7FviM+Sj8jAbd/KMV+DQH9wP7ZQX3Chb3AvdlBfw0B/unURXE87rvggq5J8MjBSH32hVd6VrkBfdVBlsyXS0FDg6gRh3nCvdr96AhHYvl92be90nlEuj3CPdX9wY79wUT9OgW92UG9yT0yPcX41e+LJsfjwcT+NifsMfJGvcMKbT7Gh77VQb3CPujFfdJ0AfftXJPTmVoMB9J+7kV92bcBxP07b1rR0FXZysfDqkdAcf3Cy0dDovp+GbpAdb3CPeG9wsDPQoOVgoB8/cIAykKDqB296Xt903tAfcN9wgD9w0W9wj3pfeT7fuT9033wO38NAYOygoBu/cM95/0AyUKDqD3Mx0B0/cI93T3CANoHQ73DR2bCjAdDn/v+GnsjQoO2AoB3vcJjR0Oi+34wHcB9wz3BwNeHQ6gdvdE9xH3gvcHAdTp951rCg6Lsh33evcDE1yoHRNsOh0TnEQKDqkdAbYKAyEKDqB294To93joAeL3CPeD9wYD4hb3CPeE8wb3IfcAzvcl9ywivfskH/twBvcI+9UV93jqB+q8cDk7XGQqHw77PunpdvjN7wG29wr3pfcLA/c1994V9ya/5eDfvzH7JvsnVyw3Nlfq9yce+BX8HhWFfnmFdxtSWaG+dB/3BqzV9w33Rxr3ZyT3Efss+ywk+xH7Z/tN2vsP9w1vHiuw20f3Dhuup5KVoR8OoPczCgHf9wj3efcGA/dc+MWZCvgF+/AV+zD3pQVACg6pHQHi9wn3cvcKAyYdDqB2+MDtmwp1Cg5zHQGCHQMkHQ6L9wQw9x8dEqf4tBNw93wW9x0G91/5IgX7CwYw+90FE7B3QXxLdUAIhwZ11nzLdtUv990Y+w8GDqcdAZL43igKDtgKAa/4pAOvFvcPBt33Lpytm6ydsxmPBp9jnGqdaeD7Lhj3FAb7VPfg90j31gX7DwZB+yV8bX1semQZhwZ3snyqe6k+9yUY+xUG90j70QUO2AqbCicKDovt+F/sAcj4dkwdDkkK7AoTvCoKE3wjHRO8IwoOf/Qd5h0TfN0W5gYTvPcPHez3PfcrQe37E1ZTcmNgH4/hBfdK+wgH9wj81hWxClZRRmxil6xnHw6jCgHU9wsuCg5/xwr3evcIE7zAhx0TfJRSBer5VvsI+0YGkDgFr2NkoVEbE7xJHQ5yCgHJ9wr3lPUDIB0O9h33HOYB93j3BgP42vlHFZxfWpVWG/skSzf7CB9wB/schgU19xz8JPcG+CT3T+b7T6gH0Kyx1rOrhH2vHg5SHZUK91vxcfcDE7pAdwoT2SBIHRO6QFYdE7igMx0TuUBFChO1QEIKE7jAVQoTukDBChO1QDwdDqD3Eh33X3cBzAoDKB1eXh6S9AX3SvsIBw6gdvgkyB2lHRPw95rh3wr7Yub4l8gdE+hfChPw95rh3wqgeB33f3cB5fcIjx0Of+n4qeYB93b3BwMuHQ6g9wkKu/cB8+X09wETvLsW9wEGE9xwHRO8gsoFNAYOoLwd9273CBPYKB1cXR6HBhO49goOowoBwPcL95T3CwMiHQ73Bx1/dxLmHRPs91a5FWazvXa4G/cF9Oz3PPcsQu37FFNQbmRhH4gGE9yCwwUs/UH3CPcuBvc8BBPssQpWUUUfE9xtYpesZx8O9wcdf3fIChPswPeJFfs23yz3EsDAp7CxHoY5Bfs59wgHE9z5QTAHE+yBVwWIBrZgX6BSG0kdDqDHHRPIRx0TqKPsBRPIZB0TmNcKDn/i9+niAef3B/dn9wcDJgoOf+f31OYB91L3BwMsCg5/9Ar3a/cHE7j4l/h/FfsHIgoTeJ4KDovj+Cd3AbT4mgP3gRb3Fwb3U/h/BfsCBiz7k3lafFp7WRmHBnu9fLx5vCz3kxj7CAYO5QoBkfjgKR0OoHgdAb74hgO+FvcNBsvrnaqcp52oGY8Gn2+ga55w0ioY9xEG+0f3h/c794wF+w0GUS98cHltfG8ZhwZ5p3eoe6ZL6Bj7EQb3OvuABQ7CHQGz+J0DJAoOi+f3yOYB0vhmSwoOoEYdvfcI5wqmHVT8SCEdoEYdvfcI5wr4U/nIVAr7B/xIIR2gRh299wjnCve++ZQVjwbHSwXlBituHfsEBiv7CAXlBnT8SCEdoEYdwPcdCvciyPdWyBPq+CH50RUT8qsKE+zaHRP0ch0T7KIKE/LYHRPqox37h/zFIR2gRh3B5R34HflYFa6jpK2uc6RoaHJyaGmkcq4f+04WrqSkra5ypGhoc3JoaaNyrh+T/EwhHaBGHdHX9ysK+EX5tBX7nj/3ngb7bvxcIR2gRh2+yAGf+MSkHftr/LwhHaBGHbe56bkB91nG48YD98D52hWjn3lubXd6c3J4nKmonp2kH/sgBMe2r8TDYLBPTmFmU1K1Z8gfNvxCIR2gRh299wjnCvf4xh1u/EghHfuE9y/1Rh0B9273OAP3wDY6CqBGHfc4yAH3yOEDpApg/G8hHdsK+Mn6ChUuBhP0RfsIBc8G+0CDFY8GxVEF3wYt9wIFJwYt+wIF3wZy/EghHdsK+JP5lhVGbh0u9zcKE/T7JYMVjwbFUQXfBi33AgUnBi37AgXfBnL8SCEd5Aq5vwH4WtcD+D75hBXEkbqhwhq4ZKctjx6AVwW8iJ6BdRp4eoN1hh77CWwVjwbFUQXfBi33AgUnBi37AgXfBnL8SCEd5Aqv8QH3M8D3RMAD+Bj6TBVvhn1/eW1y1h3ABqeQmZedqaRjvxu4rK/Nkh/7I/tSFY8GxVEF3wYt9wIFJwYt+wIF3wZy/EghHfuE9y/1Rh299wgB9zkdA/e++ZQVjwbHSwXlBituHfsEBiv7CAXlBsn9qToK8x24mOcK+Df6KRUvBkb7BAXJBsCYFUcKwwr7avy6IR3zHbiY5wr36vm5FUb3BAUvBu77BAXomBVHCsMK+2r8uiEdoHb3Reb3vOW+jgr3BHEVRwrDCvtq/LohHfMd5PNNyRL3P7P3Q8ET+/gW+k0Vb4V9fXgbE/dtbrVeGxP7XmllSYQfwQYT96aPm5qdGxP79y8K+6H7GxVMkrNZ3RvDClMGa4N4cV0bXXilq4Mff/y6IR37hPcv9UYdvsgB9zkdpB37Fv4dOgr7btn3NUYdAfgs4gP3a/egFaLbn9Cf1Z3UGY8GnkOeQJ9GojsY91n8HhWCgH2Gext1d5mns625vpcf+2j5IgX7HAb7aP0iBfcKBr73RQX3bga9+0UFqQZpdl5bUbMKDovt0+aq7fc67QH3zvMD92P3mRWv9KHLo86hzxmO+8QG8/s3FfdW9xjt+xj3Ovc67fv0B/t+/SIF9wwGxfc+Bfce+z73q+0GDovf58be0vdJ3xLp9wj3XPcEPvcDE/r3Zt8V5/cQxvsQ3uEH7L9oPjpVYiwfNfh6FdQGE/zgtXJPTGRqMB9FBhP691xxFRP815+vwcYa9wgqtfsaHvtZ/DcGP4YFVdf7RPdqBxP69yTzyvcb51e/LZwfDvttvfdIdvjR8AHH9wv3MeAD+IX3LhViZmJzVhv7BEDl9yn3J9bl9wG+sXZrqx/M0wW2YUuyOxv7QfsW+xP7avtX9vsJ9yJ2H2lIBbaAnX12GnBnfkEKtHGfapcem67VkMesvMMZDmYKAcf3Cy0d+En4g70KDmYKAcf3Cy0d93j4DysKDmYKAcf3Cy0d9/T4gysdqR209xcBx/cL7/cjLR33tvgSFbSqprKxbKZiY2xwZWSqcLMfDovp+GbpvfcIAdb3CPeG9wsDPQr3D/lqKx1NCuDp+GbpEtb3CJz3OMj3CxN0PQoT/MD74hUsHftI1/Pp+GbpEtb3CGv3mZj3CxP0PQoT7PdL+1q+ClsKVgq99wgB8/cIAykK91S9eQpWCr33CAHz9wgDKQr4Bfc6VAoOVgq99wgB8/cIAykK9zS9KwoOVgq99wgB8/cIAykK97D3OisdVgrB9wsS8/cIXfcLzfcLE+gpChP29xXBLx1WCtHXEvP3CHD3nhP4KQoT9OTRrQpWCr7IAfP3CAMpCvdyvhVGClYKwPcXAfP3CK73IgMpCvdywEQdTQrgWgoS8/cIo/c4E3gpChP893L+EhU3HVYK9zjIAfP3CPcG4QMpCvdSs68dDlYKwPcdCvP3CFfI91bIE/UpCvewwBUT7aMdTgYT9asKE+vaHRPzch0T66IKE/XmClYKvfcpHfP3CBP0KQr32PcIFc8GE+zqbh0uBhP0+9D7SjEKDlYKvfcpHfP3CBP0KQoT7PgA93wVLvc3Cs8GE/T790kxCg5WCr33Arm/AfP3CPeY1wMpCvfw7RVLHVYKvfcCr/ES8/cIaMD3RMAT/CkK2b0xChP7YgpNCuBaCr33CBLz9wij9zgTfCkK9zS9KwoT/vcs/kQVNx37btn3IFoKAfP3CPcY4gPzFvfZBmd1YlxRswpvxwX1Cru2ubmPH4/t+8z3VfeU7fuU9zv3wu38NgYOygqx9wgBu/cM95/0AyUK93H4DysKDsoKssgBu/cM95/0AyUK96/4EBXes/dBCkkGboV4cmQbY3ikqIUfSgZLkrJY3xsOygq09xcBu/cM5/cirPQDJQr3r/gSRB37c733NcsdErv3DPcy4aL0E3olChP+95L8BqEKygqx9wgBu/cM95/0AyUK9+34gysdygrF1xK79wyp955u9BP6JQoT/Pcq+COtCsoKtPcdCrv3DJDI91bHVvQT5IAlChP1APfs+BIVE+0Aox1PBhP1AGqFfHx4GxPqgGpqu1YbE/KAch0T6oCiChP1AK2rWsAbDqD3Mx3R9wgB0/cI93T3CANoHfc5vSsKDvuE9y/19zMd9wAdqPc4qvcIE/poHRP+93f+EhU3Hftkzfc39zMd9wAdds33GM539wgT+Wgd93f98hUT9uWzzs2OH0gGZ4d2bGIbYneqr4YfE/lJBvcrHQ6gdve28O3GUPc59wAd93T3CBPc+DD4GxX7dO33dAYT7PdKxhVJBhPc9fsIBxPsIft0BxPc9fsIBxPsIQdJhgUT3FXN/H33CPe293T7tvcI+H3NBw73DR299wibCjAd90748nkK9w0dvfcImwowHff/+WZUCg73DR299wibCjAd9y748isKDvcNHcD3HQr3Isiy9wiyyBPmMB33qvj1FRPWox1OBhPmqwoT3todE+5yHRPeogoT5uYK9w0dwfcVChPIMB0T9PcP+PYvHfcNHdHXEvc79577U/cIE+gwHRPw3vkGrQr3DR2+yJsKMB33bPjzFUYK9w0dwPcXEvd59yL7FfcIE8gwHRPw92z49UQd9w0dvfcImwowHfeq+WYrHfcNHfc4yBL3hvcIWeET0DAd90z46BUT6DIdDk0K4Pc4ChL3OR37IPcIE2gwHRPw92z75hU3Hftu2fcg9zgKEvde4V33CBNo3xYT8PdQBmxyZGJOGlC5a8aqspmdoR5vxwWDgH6FfBt1dZiosKGtu6Yf9zLtBhNo+zL4Xvcy7fxEKfcy/F77MgYOf+/4aey99wiNCvcL+K0rCg73Kgr5IncB3vcJ9w7gjR33a/1Pix1ngEEKum33AgqL7fjAd9H3CAH3DPcHA14d92/3Or0KDovt+DL3bUB3EvcM9wf/AJaAANUTuF4dE9j31PsiuQr7c733Qe34wHcB9wz3B+rhA14d9079T6EKi+33RPcu93Z3AfcM9wf3Efc4A14d99b8EBW6rqm5umiqXFxobFxdrm26Hw5NCuDt+MB3EvcM9weh9zgT8F4dE/j3b/4SFSwdTQrg7fjAd+XXEvcM9weh9zgT+F4dT9EV953X+50GE/z3q/6kFSwd+0jX8+34wHcS9wz3B3D3mRPwXh0T6Pfx/Yq+Covt+MB3AfcM9wcD93/tFfc/B/dsbh3mB/ts+wgF97r7B/vyBz5gBTAH2LYF+2n4Ou0HDsQK90T3EfeC9wcB1Om+9zi9awr3d/4SFSwdi28d0fcIEtX3A/d69wMTXqgdE246HROeRAr4D/c6VAoOi28d0fcIEtX3A/d69wMTXqgdE246HROeRAr3uvc6Kx2Lbx3U9x0K1fcDZsj3Vsha9wMTVkCoHRNmQDodE5ZARAoTWoD3usAVE1aAox1OBhNagKsKE1VA2h0TWUByHRNVQKIKE1qA5gr7c733QbId9uCx9wMTragdE7U6HRPPRAr3Vv1PFXNdBal+CmeAQQq6bKM9lB4Oi28d1PcXEtX3A733IrH3AxNdqB0TbTodE59ECvd8wEQdTQrgsh2s9zis9wMTragdE7U6HRPPRAr3dv4SFSwd+0jX87Ide/eZfPcDE62oHRO1Oh0TzUQKE6r3+P2KvgpmCgG2CgMhCm34+3kKZgoBtgoDIQr3J/lvVAoOZgoBtgoDIQpN+PsrCg7QChPZIQoT6sn4/hUT2qMdTgYT6qsKE9XaHRPlch0T1aIKE+rmCqkdtfcLErb3C333C833C333CxPyIQoT7C74/y8dqR3F1xK29wuQ956Q9wsT9CEKE+j7GfkPrQqpHbLIAbYKAyEK+PwERgpmCgG2CgMhCl/4+4gdZgoBtgoDIQrJ+W8rHdQKAbb3C8P3OMP3CwMhCvvdBCwdqR33LMgBtvcL9ybht/cLAyEKa/jxrx0O9ygK9wJf9wjJHRPsIQrx+T0VzwYT3OpuHS4GE+z70PtKMQoO9ygK9wJf9wjJHRPsIQoT3Pci+bEVLvc3Cs8GE+z790kxCg73KAr3Arm/yR0k1xP8IQr3EvkrFRP6Sx33KAr3Aq/xErb3C4jA90TAiPcLE/khCvsk+PsxChP2YgrUCrH3CAG29wvD9zjD9wsDIQpN+PsrCvcs/kQVLB1/8Dt2+NXwi3fJHROs+D74TBWTa49mYhr7J1UtN2lumqd1HmXYFYGuhrO5GvcmweTfr6l7bqIeE5z3R/cUFRNsTLVWPQWuYleeUBv7LCL7EftnLKA8sFIfTC4FE5zJYb/XBWm0vXnEG/cs9PcW92jmd9dpwx8Oi+kt7fdV7fc87C3pEqX3C/cx8xN2pffeFftt9fsF9zQe98Ht+0/3Vfca7fsa9zz3Rez7sgb7NvsB+wD7bB8TrvcLFvc2vM/lHp38ZnkGMVrV9zYfDqkdyR1G5hPw98DkFTdV6fcn9ybB5N/fwTL7JvsnVS03HxPoNh0T8HEdE+h2CmYKyR1G5hP4+FP5yFQKbU4dZgrJHUbmE/imHalOHakd9yzIErb3C/cm4bf3C0bmE/ykCrX9IhU3Ven3J/cmweTf38Ey+yb7J1UtNx8T+jYdE/xxHRP6dgrQCkbmE9oA+CH50RUT6gCrChPVANodE+UAch0T1QCiChPqANgdE9oAox0T2QD7Mv14FTdV6fcn9ybB5N/fwTL7JvsnVS03HxPYgDYdE9kAcR0T2IB2CtQKErb3C8P3OMP3C0bmE/zRHfdCBDdV6fcn9ybB5N/fwTL7JvsnVS03HxP6Nh0T/HEdE/p2Cvtu2fcV7/hw8AG29wvH4vcV9wsD+Bz7EhX1Cqygt7+iH/W50PP3Rhr3ZyL3Efss+ywi+xH7Z/tB1vsw9zt/HmpwbWJbswr7DPenFTdV6fcn9ybB5N/fwTL7JvsnVS03Hw7cCvhW+ci9Cvsa+yOZCvgF+/AV+zD3pQVACg7cCvf8xh1b+yOZCvgF+/AV+zD3pQVACg77c733VvczCgHf9wj3BOCr9wYD95wwFal+CmeAQQq6bKM9lB4z+PKZCvdpQBVACvcXBg77hPcv9fczChLf9wix9zim9wYX99RpHfsM+RoV5QYTensK92lAFUAK9xcGDvuE9y/19zMK0dcS3/cIbved+1r3OKb3BhN6APhI+bQV+50/950GE/2A+wj9vRVcaGtdXK5tui8KH/sM+RoV5QYTfIB7CvdpQBVACvcXBg77SNf3EfczChLf9wiA95l29wYT+vdc+MWZCi8E7Qb3IPuUBfcXBvsw96UFVR0GE/SA+0iUHQ5mCgHi9wn3cvcKAyYd9975JRX7EgY3+wgF6QYOZgoB4vcJ93L3CgMmHfcN+LErCg5mCgHi9wn3cvcKAyYd94n5JSsd+2299zHuPXb40/AS4vcJ5+G39woTvvfQ+CAVUKJWnb4au7Woz8e5dmi3HsfVBb5VP6s7G/sZLTsjK9JY0HAf5GQFE97Mcrh6VRpYYWo7S0qpt1oeRzzEVdVq24QZakoFgR2crwX3FZjW3ewa6lC8OKweDvtzvfc12goB4vcJ7eCy9woDJh33LPtkFXNdBal+CmeAQQq6bKM9lB4OqR209xcB4vcJrfciufcKAyYd90v4tEQd1AoS4vcJo/c4rfcKE/QmHRP890z8JxUsHX/qOMNodvjP6hLS9wv3kfcNEzzSFvcL+DcG8rO81buqa2WaHiv7H5JFBROc7nWuX1gaVXJlZG9xmKtvHhNcTUMFE5xlq8Ft0hv3A8jc9OxTxzSoH+n3HQXwcUPP+wIb+zhDJvsUHw6gdvjA7b33CJsKdQr3DPecKx37bb33UHb4wO0S94b3CEXhE/D3+hb4wPdi7fykKfdi/MAHE+ijBmVABYEdE/ChuQUO9yoK+MDtEveG9whJ4BPwdQoT6KX87YsdZ4BBCrpt9wIKxAr4wO0S9zkd+yD3CBPodQoT8MX9sBU3HftI1/cRdvjA7ZsKdQr3Uf0ovh1zHdH3CAGCHQMkHfdavXkKcx3R9wgBgh0DJB34C/c6VAoOcx3R9wgBgh0DJB33Or0rCg7hChPaJB0T7Pe2wBUT3KMdTgaQHQ5zHdX3C/cAHWP3C833C2j3AxPyJB0T7PcbwS8dcx3l1wGCHQMkHerRrQpzHdLIAYIdAyQd93i+FUYKcx3Luem59wAdlMbjxpn3AxP5JB0T//d4t5EKcx3R9wgBgh0DJB33TL2IHXMd0fcIAYIdAyQd97b3Oisdcx3V9r7F9wAdafYt954t9m73AxP4gCQdE/IA6vdoFfeexfueBhP1ALP7bDUKDnMd1faq9wj3AB1p9tn2bvcDE/kkHfc591QV6Ab3B24d+w8GE/b7B/uSNQoOcx3V9qr3CPcAHWn22fZu9wMT+SQdE/b3G8E1Cmz3kisdcx3V9qr3CPcAHWn22fZu9wMT+SQd92L3yPcyHRP2iR1NCtTw+Ml39wAdqfc4rvcDE/QkHRP893j+EhUsHXMd90zI9wAd9wzhovcDE/QkHfdYsxUT/DIdDvtu2fcW7vjJdwHT9wir4vcC9wMD6Qr7NtAu9ySGHnZ2X2ZQswpvxwX1CqujsdSuH9qvuNf3Fxr4KPsD/DEHIF1eRUVguPYe+DH7CAcOcx0Sgh2l5xf4r/mORR1bZX9dhx4T8DgdE/h2HXMd0fcIEoIdpecT+PhT+chUChP892VqCnMd0fcIEoIdpecT+KYdE/z3oWoKcx33TMj3AB33DOGi9wOl5xP096D5ShUT/jId962eax3hCqXnE9z4IfnRFZAdE92jHdxIRR1bZX9dhx4T2jgdE9t2HU0K1PD4yXf3AB2p9ziu9wOl5xfRHfeD+eNrHacd0fcIAZL43igK95u9eQqnHdH3CAGS+N4oCvhM9zpUCg6nHdH3CAGS+N4oCvd7vSsKDqcd1fcLAfco9wvN9wsoCvdcwS8d2ArR9wibCicKp/hxeQrYCtH3CJsKJwr3YfjlVAoO2ArR9wibCicKh/hxKwoO2ArV9xUKE+gnChP0aPh1Lx3YCtT3FxL3efci+xX3CBPoJwoT8MX4dEQdxAr5IncS9zkd+yD3CBPoJwoT8MX8ZxUsHdgK90zIEveG9whZ4RPwJwql+GcVE+gyHQ7YCtT3HQr3Isiy9wiyyBPUJwoT5vcM+HQVE9ajHU4GE+arChPc2h0T7HIdE9yiChPm5gqL7fhf7L33CAHI+HZMHfgl+YJUCg6L7fhf7L33CAHI+HZMHffQ+YIrHYvt+F/swPcXAfeI9yJMHfeS+RFEHU0K4O34X+wB93n3OEwd9477yhUsHVsKoHb3HOj3eOjzdwHi9wj3gvcHA+IW9wj3HPMG9yH3AM33JvcrIb77Ix8j8/sIBvcI/D0V93jpB+q8bzo7XWQpHw5/7v8AuoAA/wBVgAD3ZO4Bx/cK95j3CQP4SvemFfsLf1lHRBtEW873C4MfjPeFFampsaK9G+O7QPsZkR/8DQaKf4p/gBr7Yuz7Fvco9ynw9xX3Z/doKvcS+yk7UGxhYR4Of34d93j3BxO+KgoTfiMdE74jCvcJ+ESvCn9+Hfd49wcTvioKE34jHRO+Iwr3nfjiWB1/fh33ePcHE74qChN+Ix0TviMKePhEFeFDHeAGKfcyBSkGDkkK1fcdHdL3A2/J91b3BxO2gCoKE3aAIx0TtoAjChO1gG/4SBXJBu4dE7qAqvcTHRO2gMSBChO6gPcoHRO2gG5twVsbE7WAUmdcO4EfDkkK1/cbzwpj9xjU9xlF9wcTvIAqChN8gCMdE7yAIwoTuwCl+EoVth1wbWVlpm6yH/diFoUdY3BtZWWmbrMfDkkK6NfPCon3mWz3BxO9KgoTfSMdE70jChO6ifhblB0OSQrTzM8Kgc73JM5j9wcTvIAqChN8gCMdE7yAIwoTuwChHQ5JCrW58rnPCqXF5MaH9wcTv0AqChN9QCMdE79AIwoTnYD3FfgoFci1ssXGYbJOTmFkUFG1ZMgfuQRyd6Cpqp+gpKOfdmxtd3ZzHw5/fh33ePcHE74qChN+Ix0TviMK2/hEFe0G7fcyBTZKCjUGDvcUCs8Ktfc4ofcHE90qChO9Ix0T3SMKE9/3EPwRFTcdSQr3RMjPCvcd4JH3BxO9KgoTfSMdE70jCuz4MhUTvnwKSQrR9xBV9z8dE7sqChN7Ix0TuyMKjPhEFdQGwEMKLgb3JVUVzgYTt+huHTIGDkkK0fcQVfc/HRO7KgoTeyMdE7sjCoz4RBXUBsBDCi4GE7f3XskVMfc3Cs0GDkkK0fcQt7/sCk/ZE78AKgoTfwAjHRO/ACMKjPhEFdQGwEMKLgb3QkYVE76AwrQdgVcFvIidf3UaeHyCdYUeDkkK9xgd0vcDgcD3P8Bk9wcTvSAqChN9ICMdE70gIwqE+EOGCiIGE7ygaq8VE7qgjB0TvKD3AQr7hPcv1H4dtfc4ofcHE96AKgoTvoAjHRPegCMKePhEFeFDHeAGKfcyBSkGE9+At/5fFTcdSQrTxr2jc/c/HRO9gCoKE32AIx0TvYAjCuL4sxXIBhO7gORuHTQGdvt1FRO9gOSzYwoTu4DXHQ5JCtPGvaNz9z8dE72AKgoTfYAjHRO9gCMKE7uA9wD5JxU0BhO9gOP7CAXJBmH7ARXks4QdDkkK08ZQ9xnrvs8K9xHZpPcHE7dAKgoTd0AjHRO3QCMK9xX4RhXks87Njx9UBhO7QGOFc2lbGxO3QFtzrbOFH1QG1x1s9wgVE7fAw5S89yEKvYicf3Uad3yDdoUeDkkK08TfyU3xzwqIufc/wGT3BxO7ICoKE3sgIx0TuyAjChO6oPcV+EYV5LL3IB1bdqaohR9SBlCOslXlG/sf9yEVwAaMHfcBCvcUCtPMzwqBznz3OIbOY/cHE14gKgoTPiAjHRNeICMKE11AoR0T3qCG/cMVNx37ZNL3ET8dzwr3RNtv9wcT3dL3GBU1z1HrHhPezc2ss78fjgaVTwVrdmFfUxqSCpioHxO9rqazx58e97cH9x1A1vscNzpqaFAetT4Fp77Co8Ib26xiVI8fE90jCg5/5vcb1PcQ5zLkEpv09xjo9zDoE96b9xoVNb1P37y6p8PBHlerumvSG7i8naavH2PWBXlwcIBrG0xnvt+DH/eHBo2ajqChGvcRWPUnTmJtVGoevXdmrk4bUVVzblsfE+61PgWgrLecqhu9nmVQjh8T3vsycDxVKBr33vctFd6Rrbe6G8CbUUYf/BH7JRW8sa3onB6MdIxskGuUcRlqcGl4cBtndKG1Hw5/6k12+Bjq3MNTxlD3IhLmHROn91r33RW0s7KdsBvbrVQwIlZVRmxil6xnH/gMBMf3WAcTq8b7WAcTp977CAcTszcHRocFE2dV0PzI5gcTp/cPHej3N/clQen7E1ZTcmNgHw77bb33Rnb4N+kB1PcL9yHgA/gMgRXHkcaju7Vb1RhuZV1yUxsqSczt7s/M7beye2yxH8LTBbJiTak8G/sq+xUt+zj7Ke0w9xp8H2pKBbaAnX12GnBnfkEKtHGfapceDoUKAdT3Cy4K+Cn4elgdhQoB1PcLLgr3DffcFeFsCikGDoUKAdT3Cy4K93D33BXtbB01Bg6jCtX3LwHU9wvP9zguCveh9+BoCn9nHbj3Mvsy920SsPcK93v3B7L/AEmAABO3sIcdE3eUUgXp+Vb7B/tGBpA4Ba9jY6FSGxO3+wQiKfs0H/cKjBXyxcbPr61/aq4e+3EHY2lmeGMbQF7E9R/4S/fCFROvnvcujMoFPwYTt4/7bQUOTQrUxwrB9ziXWx0T3/cc/HozCvtI1+fHCo/3mmdbHRPa95778r4df+pNdvgY6tzGUPciyAoTrvgm9yIVY2lneGIbQF/A7+vEw9GtrX5rrh8TtvdM96wVRwYTrt77CAcTtjj7OAcTrlD3OFMHkDgFr2NkoVEb+wQiLfsu+zDfMPcSwsKqsbEfjgYTbpRSBer4yAYTts+QBQ5yCtH3MgHJ9wr3lPUDIB37GvetrwpyCtH3MgHJ9wr3lPUDIB2Z+EtYHXIK0fcyAcn3CveU9QMgHfui960V4UMd4LsdKgYOcgrR9zIByfcK95T1AyAd+z/3rRXszQo2Sgo1Bg5yCtf3GxLJ9wpn9xnU9xlc9RP5IB0T9vt197NgCnIK6NcSyfcKjveZg/UT+iAdE/T7kffElB0OcgrTzBLJ9wqGzvckzXv1E/kgHRP2+w73rxXotdTTjh9JBmCFdWZfG151sLaGH0gGQ461QukbDnIK1fcvAcn3Cr/3OLP1AyAd+w73sZgdTQrUUwoByfcKv/c4s/UDIB37DvyoMwpyCvdEyBLJ9wr3IuCo9RPqIB37LvebFRP+fApyCtX3HR3J9wr3lPUT7iAd+6v3sRXIBrGTmJugGxP2qadVvRsT7sSBChP29ygdE+5ubcFbG1GoCnIK9wkdyfcK95T1E/YgHfuO960V1AbAQwouBvclVRXNBhPu6W4dMQYOcgr3CR3J9wr3lPUT9iAd+473rRXUBsBDCi4GE+73XckVMgbo9xwdcgrR9xC3vxLJ9wr3lPVB2RP+IB37jvetFdQGwEMKLgb3QUYVE/3DtB2AVwW9iJ1/dRp4fIJ1hR4Ocgr3GB3J9wqGwPc/wHv1E/ZAIB37lvesFdgGxMmCCsNNBdkGN/cABSIGE/lAaq8VE/VAp5CZl50bE/qAqaBjvhsT9oD3GAoT+oBvhn1/eRsT9UBtd7NXGxP5QPcBCk0K1FMK0fcyAcn3Cr/3OLP1AyAd+6L3rRXhQx3gux0qBrz+XzMK+2TS9xFTChLJ9wr3Ktqm9RN6+Hf3CRVyXmF8WBsyR7zjgx/3+QaNl46hoRr3HDns+yb7FPsQKvs1+zb3Cyz3KR4T/p+bjJKlH290aWFYGlG1bcKnspedoh5xwQWDgH+GfBtzd5mntaKu5cof++v3ixXbmMa1zRsTetm0XT8fDjEd+xb37RXhQx3gBin3MgUpBg5SHdPMlQp7zvckzkzxcfcDE7sIdwoT2oRIHRO7CFYdE7pEMx0TuohFChO2iEIKE7pIVQoTuwjBChO2iDwdE7ownffvFfcFCoV1Zl+KHVId1fcvlQq09ziFNAoTuqCd9/FoClId9zy9lQq44NDxcfcDE7kwdwoT2KhIHRO5MFYdE7hoMx0TuLBFChO0sEIKE7hwVQoTuTDBChO2sDwdvPfPFaO5BW3eHVyqc9mCHg4xHWz37RXtBu33MgU2Sgo1Bg5SHejXlQqD95lVNAoTuiD7BfgElB0OUh3V1EL3E5UKacn3P/Fx9wMTuYh3ChPZREgdE7mIVh0TuSQzHRO5SEUKE7VIQgoTuShVChO5iMEKE7VIPB0TuRj7H/fxFckG7h0Tukiq9xMdE7lIxIEKE7pI9ygdE7lIbm3BWxsTuRhSZ1w7gR8OoPcSHfdfd8r3CAHMCgMoHV5eHpL0BfdK+wgHjrYVx8zQHUoF5QYrbh37BAYr+wgFDsQK+Cju9193Et33CKr3OKL3CBP6KB1eXh6S9AX3SvsIBxP+93n+RjMK+2TN9zf3Eh33X3cS3fcIds73GM5w9wgT+SgdXl4ekvQF90r7CAf3eP4mFRP23R0T+UgGSY+zSOQbDqB2+BTu3MNTxlD3IhLMChPO91r4jBXH91gHE9bG+1gHE87e+wgHE+Y3B0aHBRPOVdD8yPcI988HubisorsbzqRnPB/7ofcI97AH9xNX0/sFQFNkXl4eDvYd3fcyAfe99wcDQR33jt16HfYd3fcyAfe99wcDQR34I/eEiAr2Hd33MgH3vfcHA0Ed9wfdYQoqBg72HeH3HR33vfcHE9hBHfXhtQoT6Kn3Ex0T2MWBChPoZYN+e3YbE9jZClKoCvYd4/cbEvdF9xl+9wdu9xmlHRP09zTjYAr2HfTXEvds95n7SPcHpR0T8PcY9JQdDvYd38wS92TNovcHkc6lHRP095rfWAoO9h3d9zIB9733BwNBHfdq3RXsWR32HfdQyBL3vfcHUuAT8EEd93vLFRPorArECvgkyB0T9EEdE/j3muFaHf3FBDcd+2TS9zL3Hwrh9y8S95vcO/c4+xf3BxPy970WE/jqHRPysAoT9Lz3Rd8K+2TS9zL3HwoS95vcXPcHE+j3vRYT8OodE+iwCg72HQH3vfcHA0EdDvti5viX5t33MgH3vfcHA18K9wfdYQoqBg73Kgr4f3f3f3cB5fcI9wfgjx33Y/2DUQqgeB0B5fcIA+UW9wj3Egbp5vcu+20F9xIG+2f3ufdS91oF+xQG+3L7dYiKBfd2+wgHDn/p+Knmv/cIAfd29wcDLh337vc8vQoOf+n4Zvdt+yrmEvd29wfM1RO4Lh0T2PgZ+zIVnvcujcoFPgaP+20FDn/p91L3L/dQ5gH3SvcH1vc4A6b4+xX3L/xIBvsNx0X3BsWtl5u7HnDgBX5qcYVyG1llpM0f+Kn7ogf4P/xGFbutqrm6aapbXGhsXPcCHftzvfc19wYKnOAT8C4dE/j3m/2DFXNdBal+CmeAQQq6bKM9lB4OTQrU9wYKUvc4E/AuHRPo97v+RhUsHU0K1On4qeb21xL3J/eZ+0r3B1L3OBP0Lh0T+Nf2lB0T8vdv/v0VLB37SNfn9wYKIfeZE/AuHRPo+D39vr4Kf+n4qeYB93b3BwP4lfAVfmpxhXIbWWWkzR/3UAf3MOEF6gf7MDUF9477ojD3L/ttB/sKSAUsB/cKzwX7EQf7DcdF9wfErpebuh4O+4T3L/X3CQq79wHM9zj7EeX09wET27sW9wEGE+twHRPdgsoFNAb3lP1vFSwdoHb4KO63HcwKE9woHVxdHocGE7z2CvgH94SICqB2+Cjutx3MChPcKB1cXR6HBhO89gr3Tt0V7FkdoMAK9fcdHcwKE84oHVxdHocGE672CtnhtQoT1qn3Ex0TzsWBChPWZYN+e3YbE87ZChOuUqgK+3O991a8HfLgqfcIE+ooHVxdHocGE972CvdX/KxRCqDACvX3LxLd9wiv9zid9wgT2igdXF0ehwYTvvYK937h3wr7hPcv9bwdqfc4o/cIE+ooHVxdHocGE9r2ChPu93j9bzMK+0jX9xG8HXf3mnP3CBPqKB1cXR6HBhPa9goT5Pf6/Oe+HaDACsP3PxLU4br3CPdM9wcTzor30xXzvcPf8xoT3uNiwExZaGdVW6xqu5KTjI6SHodJZVpKaQgTzvfsshUTroLRBSz8f/cIBhPO9+cHtrOlobUbwaFoPx/7ufcH98gH9xBc0iVHXGZeYB4OhQoBwPcL95T3CwMiHfcI99x6HYUKAcD3C/eU9wsDIh33nPh6WB2FCgHA9wv3lPcLAyIdd/fcFeFsCikGDqMK1fcdHcD3C2/I91LIb/cLE9kiHRPVb/fgFcgG7h0T6ar3Ex0T2sSBChPq7x0T2dkKE9VSqAqjCtf3G+EdYvcZ0/cZYvcLE/IiHRPspPfiYB2jCujX4R2J95iJ9wsT9CIdE+iJ9/MV95jX+5gGDqMK08zhHYDO9yTOgPcLE/IiHRPs9xT33nQKowrQ9ycBwPcL95T3CwMiHZv3244dhQoBwPcL95T3CwMiHdr33BXtbB01Bg5NCtR/HQHA9wu59zi59wsDIh33FPx5FTcdowr3RMgBwPcL9xzhrfcLAyId6/fKFWEdDqMK0fcQVfcI9xodE+wiHffcBNUGv0MKLwb3JFUVzgYT3OhuHTIGDqMK0fcQVfcI9xodE+wiHffcBNUGv0MKLwYT3PddyRUxBun3HB2jCtH3ELe/9xodLtkT/CId99wE1Qa/QwovBvdBRhUT+q0dowr3GB3A9wuBv/dAv4H3CxPsgCIdg/fbhgojBhPygGmvFRPqgKeRmJeeGxP1AKmfY78bE+0AuKyvzZEfVwYT9QBvhX5/eBsT6oBtd7NXGxPygPcSCoUfDk0K1H8d0fcyAcD3C7n3OLn3CwMiHXf33BXhbAopBrz+XxUsHX/l9+PlAcD3C/eU9wsD+DD34hWWcZBtahopW0Y7a3GWnnYeab0VgaSGqKwa7rvQ26qmgHmfHvcy6xVdr1tTBadiWZpYG/sV+wot+zhDolCxYB9ZULlnusMFbrS9fL8b9xX3Cun3N9Rzx2a2Hw5/6PcZ1PcP6DLkEpb09zPd9yXnE+73CPeKFe2nzcG7qEkpKG5JW1Vvze4eIhb7ONot8Mi0rMioHk6nvGrEG7e4naauH2PWBXlxdIBtG1Bnvt+DH/d8Bo6gjJqhGvcSWPQrU2BmS3AeynJfsVAbJjot+zcf9+60FRPe3JKnubkbvJpQRx8Oowr3Gh1H5hPw98DdWQoT6DUdE/B5HRPox5u2rslpCoUK9xodR+YT+PhI9yIKf/x/WQoT9DUdE/h5HRP0x5u2rslpCoUK9xodR+YT+PgK9wMdl/x/WQoT9DUdE/h5HRP0x5u2rslpCqMK90TI4R33HOGt9wtH5hP896D4vxVhHbX8nVkKE/o1HRP8eR0T+sebtq7JaQqjCtXUeNThHW/I91LIb/cLR+YT2gD4H/lUFRPqAO8dE9kA2QoT5QBSzR3IBhPVAO4dE+kAqvcTHRPaAMSvutuUHxPZAPsw/QJZChPYgDUdE9kAeR0T2IDHm7auyWkKTQrUfx3hHbr3OLj3C0fmE/z3wWkdivc7WQoT+jUdE/x5HRP6x5u2rslpCvtk0vcT5/fb6QHA9wu/2/cQ9wsD93T7DBWYCoB+hn0bdXWYqKyhsbqhH/S30NH3GRr3OPsJ6fsW+xb7CS37OPss8i33D4IedHdrY1kaV/gBFe67zNvbu0ooKVtKOztbzO0eDmod9+/3hIgK+3O991bHHVbgE+RHHRPUo+wFE+RkHRPM1woT4rL8rFEKah33Nt0V7FkdxAr4JfF3n393EvcM9zj7LvcIE+JHHRPSo+wFE+JkHRPK1woT5NP9bzMKxAr4JfF3n3939xHXEvcM9zj7LvcIZ/eZE+UARx0T1QCj7AUT5QBkHRPNANcKE+SA2/SUHRPmAIP+JDMK+0jX9xHHHRPkRx0T1KPsBRPkZB0TzNcK9178574df+L36eLR9zIB5/cH92f3BwMmCvfc+OZYHX/i9+ni0fcyAef3B/dn9wcDJgq3+EgV4WwKKQYOf+L36eLR9zIB5/cH92f3BwMmCvcj+EgV7WwdNQYO+2299zDh9+niEuf3B+zgqPcHE/T4lfhKFaxZQas7G/sfPU41QeJh6XIf7nG5dmkaaWhyPj9Qo7FUHlVCBRP8wmXYbN2FaksYtoCdfXYacGd+QQq0cp9plx6crwUT9PcNl8zK1hrcQbD7BqkePJ9Qnq4aqqai18O9d263Hg77c733NeL36eIB5/cH6OCs9wcDJgr3NPtKix1ngEEKum33Agp/4vfp4tX3L/c7ChPUJgoT/PdU+ExoCk0K1OL36eL3OwoTdCYKE/z3VPwNFTcdf+JVdvkH5hLV9wfo9wBq9wCG9wATdNUW9wf4hAbfrrrKt6VrYR46QG02GhO6+xv3RpMsGmpzcGJrbJWiah5iPAVxtrV8wxv1ytDiH/cs+0aF3MfWqu0aE7TdUNf7CvsfQDP7Dx4Of+f31ObE2AH3UvcH/wBVgADVAywK95P3KLkK+2299y/nSHb4LOYS91L3B8jgE9j4LH8Vv468l7KYdd8Yf2tpg2EbOG2w3B/3Xvd05vt09xosB3z7GvschgU19xf7XgcTvPsCsjz3AnoeaUgFtoCdfXYacGd+QQoT3LRyn2mXHg77c733Nef31OYB91L3B8fgAywK9yv8UVEKTQrU5/fU5hL3UvcHfvc4E/AsChPo90z9FDMK+0jX5+f31OYS91L3B0z3mhPwLAoT6PfO/Iy+HX/n99Tm93X3GxLq9xll9weH9xkT6CwKE/Rv99AVsqapsbFwqGRjcG5lZaZtsx/3YRayp6mxsW+oZGRwbmVlpm2yHw7rHRO8+Jf4fxX7ByIKE3yeCvt8+NF6HesdE7z4l/h/FfsHIgoTfJ4KOPlviArrHRO8+Jf4fxX7ByIKE3yeCvwD+NFhCikGDlMd9fcdHdH3B/dhyVf3BxOt+Jf4fxX7ByIKE22eCvwM+NW1ChO1qfcTHROuxK+625UfTQYTtu8dE63ZChNtUqgKUx33APcbuB1Q9xnU9xhL9wcTufiX+H8V+wciChN1ngr71/jXFbObHWNkcG1lZaZush8TuvdiFrYdcG1lZaZush8OUx33Ede4HXf3mXH3BxO6+Jf4fxX7ByIKE3qeChO0+/L46JQdDlMd88y4HW7O9yTOafcHE7n4l/h/FfsHIgoTdZ4K+3D40xUTtum01NOPtR1fdbC2hR9IBhN1Q4+0QukbDlMd1bnyubgdksbkxY33BxO8gPiX+H8V+wciChN6gJ4K+3D4tRUTuwDItbLFxmGyTk5hZFAfE3qAUbVkyB4TuwDRClMd8PcniwoTvPiX+H8V+wciChN8ngr74PjQ1Qrk+yfVCg7rHRO8+Jf4fxX7ByIKE3yeCvuh+NEV7VkdUx33APbOxbgdZ/Yv95ov9wBh9wcTvED4l/h/FfsHIgoTekCeCvvN+NcVq/csHWuDHRO8gPc5CqKjqal0bwoTuQD7dPdCFfeaxfuaBg5THfcA9rb2uB1n9tn3AGH3BxO8gPiX+H8V+wciChN6gJ4K+6z5bRXXBvcB9gUkBvsH+5UVq/csHWuDHRO9APc5CqKjqal0bwoOUx33APa29rgdZ/bZ9wBh9wcTvID4l/h/FfsHIgoTeoCeCvuh+W0V7Qbj9gU7BlROBYcGVcgFOga3+5UVq/csHWuDHRO9APc5CqKjqal0bwoOUx33APa29rgdZ/bZ9wBh9wcTvID4l/h/FfsHIgoTfICeCvuG+dgVJAb3AiAF1wYTuwCr+yoVqqKjqal0bwr7Thar9ywda4MdDk0K1PQKwPc4ifcHE9r4l/h/FfsHIgoTup4KE9z7V/uEMwpTHfdkyLgd9wvglvcHE7r4l/h/FfsHIgoTep4K+4/4vxUTvs2TxqbKGsBbqSGPlAqkrB1uhB4O+2TS9xH0Cvc322/3BxPa+Jf4fxX7ByIKlT4FE9xpcmNjUxqSCpmnHxO6rqSvyaMeDn/0Cvdr9weP5hO0+Iz460UdW2N+YYgeE7hmIgoTeMsKE7S9mrisymkKzh34QvciChO691qlRR1bY35hiB4TvGYiChN8ywoTur2auKzKaQrOHfgE9wMdE7r3cqVFHVtjfmGIHhO8ZiIKE3zLChO6vZq4rMppClMd92TIuB33CeGX9weP5hO695r4vxUTvWEd95CHRR1bY35hiB4TumYiChN6ywoTub2auKzKaQpTHfXUeNS4HVzI91LIWfcHj+YTrQD4GflUFRO1AO8dE6yA2QoTtIBSzR0TsoDIBhOqgO4dE7SAqvcTHROtQMSvutuUH8EiRR1bY35hiB4TrIBmIgoTbIDLChOsQL2auKzKaQpNCtT0CrT3OJX3B4/mE933yGkd91j5QEUdW2N+YYgeE9pmIgoTussKE9m9mrisymkK5Qrx9zIBkfjgKR33r92vCuUK8fcyAZH44Ckd+EP3hFgd5Qrx9zIBkfjgKR33J90V4UMd4LsdKgYO5Qr3APcbAfcX9xnU9xkpHfdU45AKwh3x9zIBs/idAyQK92H5N68Kwh3x9zIBs/idAyQK9/X51Vgdwh3x9zIBs/idAyQK0Pk3FeFDHeC7HSoGDsId9wD3GwH3HPcZ1PcZAyQK9wb5PZAKwh319y8B93T3OAMkCvdt+TuYHft+9y/7D+j47HcS+Bv3OBNwJAoTsPgU+xgzCsId92TIAffQ4AMkCvdP+SUVfArCHfX3HR2z+J0T2CQKx/k7FcgGsZOYm6AbE+ipp1W9GxPYxIEKE+j3KB0T2G5twVsbUagKi+f3yObd9zIB0vhmSwr4F/kxWB2L5/fI5t33MgHS+GZLCvde+JMV7M0KNkoKNQYOi+f3yObh9y8B94T3OEsK94/4l5gdTQrg5/fI5gH3f/c4Swr3ivvCFSwdf+n3ruIBwPb3pvcBA/fA3RU+TMHk4b3A5Lq5eVm0H4x+i359GvsAXEk0Hvdq+NwVbMH7HEZfrFmmV6MZWESzeK54q3YZ+xNKq1b3KtfAXLBSnUAZuGhWoVUb+xAmNfsg+yb3BTD3Fvcu6PcF9zX3MFL3ATXcHw73Bx33X3cB5h0D91pjFYjhBWmyunO7G/cD9uz3PPcsQO37ElVVcmNfH4/cBfdP+wj+GPcIB/fWBLEKVFFHbWKXrGcfDvti5viX5gH3vfcHA18KDn/o7NL3OOV/dxLe9wf3ePcEE+z4rvf7FeFGxStJSWpjWB6HBhPcg8gFLPu3Bvsc1j/3HODbrK7GHmHYBW9YVXNTGztqtMOHHxPs94eb7ML3Ahr7BIIVVlhn+0V/HvMHsLi5or0bvLF4Xx8Of6oK93r3CBOsIAoTXD8KE6wnHQ5KHRLmHROs+ED3ixUhVVFFbGSXrGce93EHtK2znbMb2rBRJB/3C5IV9ytB7fsTT09sZWYeiAYTXILEBSz8f+YGE6yVwQWOBmG2wHO6G/cG8+z3PR8OowoB+Cz3CwP4o/eJFfc4+wzp+yY2R21kYR7BQwWqtLabvBvnykooKUdKKlRcpKhnH1pBBVrC03LTG/cs9wzp9zcfDnIKAcX195T3CgP4rveJFfc1+wTs+xb7Ji8q+xx1jnWNfx73+QYxgEpcMhtYYZqkXh9kQwVqwM5z0xv3KfcL6vc2H/wKuhXXv7nV0rthO5ceDn/k9xPZ9xjkAcn195X3CQPJ93UV+yHgK/cl9yD3Au33NPc1Jev7L0VGd2pWHrJBBaK2upq9G+a+WzeVH/v5Bol/iHR1GvV2FfeVBjeCWWA/Gz9dudwfDmUdEsD3Cfd89wgT7DsKE9z4gDAHE+wlHQ77QXb3Su74KHcBz9YKA/ia+H8V+wj74wZdXmp0WxtIcq/aH/e1+wj7xAf7E79D9wXWw7K4uB6EIwX7NvcIBw5THRKy9wHz5fT3ARN8+MD4fxX7AQYTvPvrB2J4eXdxG3B8oLcf9+cx++sHYnh5d3Abb3+gtx/35/sB+/AHKbNSz8KtrrqiHlWXqm+5G8Soq7ahH44GE3yUTAXjBg5/n3fxRngdEvf29wgTWPhq+H8V+wj7owYsWUloSBtmd5CWax8TmHMpBRNYfailhbMb4NW3270fjgYTOJX7BAXqBg6L5/fU5gH3u/cHA/gu97oV9xFY3/spUFR+fV8eoTcFlqutlLUb3qllOh/7Xft0L/d0+xrqB5r3GgX3HOf7FwYOoHb4J+MBtPiaA/f/+H8V+xcG+1P8fwX3Agbq95OdvJq9m7wZjwabWppZnVrq+5MY9wgGDqB2u+r3keoBkfjgA/iH+H8V+xkGYftggU2FYIVkGYcGg76EuYO5YPdhGPsbBjD8fwX1Brj3k5K6kLmTuxmPBpNblF2VXLn7YxjhBrn3Y5W5k7qSuxmPBpJbkF2TXLj7kxj3BgYOoHb5BueBdxKy+J0T0PiW+P8VE7Ch5AUT0JF3c49yG/sHUkT7AmIf+2v8rQX3AQbk94WbuZ2+mrsZjwadWZ1ZnV7w+4UY9wcG+3D4eaHBBbyerbHGG5mYiIeYHw77QXb3a3gdAfge9wgD+JL4fxX7CPsSBi0w+y73bQX7Egb3Z/u5+1L7WgX3FAb3cfd1BY/8N/cIBg72HeH3MSDmEur3B/dA9z77IvcIE9rq3gqhpbScnYeDnfcjClxBJR/3z/yyFfcI+H/7CAYT7MT3hxVbZmtcXbBru7yvq7m6Z6taHw5/6U73Hwr3HOZ/dxLv9wf3SvcHE3bv3gqgpbScnoeDnPcjCl1BJR8Trvhb/F4ViYKHi4Ybf36Vpx/43vsH/NgHNqlW3Keej5GZHg5/qgr3evcIE6wgChNcPwoTrCcdDn99Cvd69wgTriAKE14/ChOuJx33iffceh1/fQr3evcIE64gChNePwoTricd+B74eogKf30K93r3CBOuIAoTXj8KE64nHfcC99xhCioGDkod9dRC9xPIChOnIAoTVz8KE6cnHfD34LUKE6up9xMdE6fFgQoTq2WDfnt2GxOn2QpSqApKHfcA9xvhHWz3GdT3GT33CBOsgCAKE1yAPwoTrIAnHROrAPcv9+JgCkod9xHX4R2T95lk9wgTrSAKE10/ChOtJx0TrvcT9/OUHQ5KHfPM4R2Lzfckzlz3CBOsgCAKE1yAPwoTrIAnHROrAPeV995YCg5KHdW58rnhHa7G5MZ/9wgTr0AgChNfQD8KE69AJx33lffAFROvgMi2ssXGYLJOT2BkUB8Tr0BRtmTHHhOvgNEKf30K93r3CBOuIAoTXj8KE64nHfdl99wV7FkdTQrUqgrF9ziT9wgT1SAKE60/ChPVJx0T1/eX/HkVNx1KHfdkyOEd9yfgifcIE60gChNdPwoTrScd93b3yhUTrqwK0gpV9wjIChOrIAoTWz8KE6tcHfckVRXOBhOn6W4dMQYO0gpV9wjIChOrIAoTWz8KE6tcHROn913JFTIG6PccHdIKt7/IClXZE68AIAoTXwA/ChOvAFwd90FGFROugMOVvJ7GGrpjpi2OHoBXBb2InH91Gnh9gnWFHg5KHfD3NArA9wuLwPc/wFz3CBOtICAKE10gPwoTrSAnHfcN99sV2QbDyYIKxE0F2AY49wAFIgYTrKBqrxUTqqCMChOsoPcBCk0K1H0Kxfc4k/cIE9aAIAoTroA/ChPWgCcd9wL33GEKKgYT14C9/l8zCkod88a9o3P3CMgKE62AIAoTXYA/ChOtgCcd92v4SxXJBhOrgONuHTQGdvt1FROtgM4KE6uA9ysdDkod88a9o3P3CMgKE62AIAoTXYA/ChOtgCcdE6uA94H4vxUzBhOtgOT7CAXIBmH7ARXOCvcrHQ5KHfPGUPcZ677hHfcb2Zz3CBOnQCAKE1dAPwoTp0AnHfeV994V5bPOzY4fVAYTq0BjhXRpWhsTp0Bbc62zhR9VBvcrHW33CBUTp8DClL33IQq8iJ1/dRp3fIN1hR4OSh3zxN/JTfHhHZG69z/AXPcIE6sgIAoTWyA/ChOrICcdE6qg95X33hXlssHGjh9SBm6FdnBbG1x2pqiFH1EGUI+yVeQb+x73IRXABowK9wEKTQrUXR3zzOEdi82D9zh/zlz3CBNWICAKEy4gPwoTViAnHRNVQPeV995YChPWoI39wzMK+2TS9xGqCvdG22/3CBPV90D3ihXyxMbPr61/aq4e+3EHY2lneGIbQF/E9R/7C4oV+zbgLPcRHhPWwcSqsbAfjgaVUwVpcmNjUxpRt23BqLKXnaEeccEFg4F+hnwbdHaZpx8Tra6kr8qjHvh/MAcT1ScdDmUdEsD3Cfd89wgT7DsKE9z4gDAHE+wlHQ5lHfH3MhLA9wn3fPcIE+47ChPe+IAwBxPuJR37FvhqYQoqBg5lHfPMEsD3CYvN9yTOXvcIE+yAOwoT3ID4gDAHE+yAJR0T6wCc+GxYCg5lHfX3LxLA9wnD9ziX9wgT7TsKE934gDAHE+0lHRPvnPhu3wplHfdcvRLA9wnI4OH3CBPnOwoT1/iAMAcT5yUdvPhMFRPvorkFbt4dE+dcqXPagh4OZR3x9zISwPcJ93z3CBPuOwoT3viAMAcT7iUdbPhqFexZHWUd9xHXEsD3CZP3mWb3CBPtOwoT3fiAMAcT7SUdE+77BfiBlB0OZR319x0dwPcJ93z3CBPnOwoT1/iAMAcT5yUd+x/4brUKE+up9xMdE+fFgQoT62WDfnt2GxPn2QpSqAp/5PiT2RKr9wJk6/cB5RPo9yL3RxWyoKuoqB60UL9SwlsIc29sfWsbTl20yB8T2MT32RW9oq2usZhwaFpmaFxqHnusgqupGvgT/DoVbJRpnWakt8+r2KHdCCEGfEl0Um1cV7Zav2XACM2+zsDfGt5WwzIuT0IxX5tYplYeE+hPYFVWNBok2Dr3EtTGprS7HrpquXS4fwgOf+X3RPci9zbxHfcL92r3azD3BPsl+yUw+wT7a/tq5vsL9yUf+M4E18NM+0L7QlNGPz9T0PdC90LDytcf+8QEsaqmt7dspmVlbHBfX6pwsR8Oi+n4NvcQAfea9wcD+A3pFfiyNwdfc1p7RH8IQ/cZ/Db7QC34T+kHDovt+F/m9zAd+0gGaF+HiGYf9yj3GfcH9wj3BRr3CjXY+xcuS2dNTh7KSwWxsbqswhvbtWBIKPsN+wL7W/s/Hw5/6fdg3/dP5vcOCtn3IArP9wjfR8E4nx+PBxP42aa+u9Ia9wAux/sWOUVrW1Eex0QFr7W7o8Ibz7drVlBXYPc6CmFJT1FnPUZRqrJhHw6gdvc45Peq9QH39vcAA/cu95EV9xr3RaGto62grBmQBolliFmKZQj7LAf3WhYx+BT7GQb7uPwfBT33Jgp/6feF3vcZ7AH3BPL3WPcIA77XFfctCtv3H/cdKMn7DGRvg35qH5n3LgX3p+z8CwZ3+87CaAWkt6aWuhvcwmA/Pk5eO0JZq69gHw5/4/d+3/c06QHP9veW9gP30tcVRFX3AR1XYEwf92f4iBX3Awr3CSr3GvcK8t33E/cZN8v7BlNNbltaH/dFkNnH5Ru4uHdvqB8OoHb4r+wB92X3CQP3ZRb3CQaW942s9xj3OvdNCNH8air36wf7H/tBWvsgf/t2CA5AHX/p9zXe937jAcf195f1A/et99oVQ2Cx19jAtsrSwVv7A5kfVV1Zdl8b+2f7nvctHfL3i/dq+wjr+xv7CSQ6+xP7Gd5L9wfCyai6vR/7RYU9TzIbXV+fp20fDn/l9yb3I/cX8R33AfdX91Qw8/sl+yUwI/tU+1fm+wH3JR/4kgTXw1L7KfssU00/P1PJ9yz3KcPE1x/7pgSxqqe3tmynZWVsb2Bfqm+xHw6L6ff59xEB95r3BwP4DekV+HY3B19zWnpEgAhC9xn7+ftALfhP6QcOi+34Iuf3MB37MgZoXoeIZh/3JPPt6u8a9ww12fsXLktnTE4eykwFsbG6q8Ib27VgRjr7CSP7X/sYHw4z6fdo3/dW5/cOCo33IArR9wziR8A4nx+PBxP42ai+vNQa9wAuyvsWOUVrW1Eex0MFsLW7osIbz7dpVk1XXvc6CmJGS1FlPUZRqrJhHw7j5fe59AH39vcAA/ct90YV9xz3UqGso66frhmQBolliFiKZQj7Ogf3WhYx+CL7GQb7uPwtBTz3Jgoz6Zp295Te9x/tEvcE8vdY9wgTfL4WE7z3LQrd9yP3ISjI+wxkb4V9ah+Z9zMF96ft/AsGd/vUwmgFpLemlbob3MJhOzpOXDtCWauvYB8Of+P3ft/3NOlDdxLQ9veW9RPs99LXFURW9wEdVmBMHxPc92j4iBUT7PcDCvcIKvcb9wrx3fcT9xk4y/sGU01vW1of90SR2MfkG7m3d2+pHw74cu0B92X3CQP3ZT8V9wkGl/eUq/cd9zr3UAjS/Gop9+sH+yD7RFv7J3/7ewgOQB0z6fc23veN4wHH9feW9gP3rfePFUNgttvewLbK1cJX+w2XH1RcWHZfG/tn+5/3LR3195f3avsI7Psb+wkkOPsX+x3eRvcHwsmourwf+0eDPlA0G11fn6dtHw5/9173GgrkFeIKkvdGAffR6wP3b/trFZ0Kf/de9x73X/caCvhCFVD3JwrGxGG3UlJhX1Ie++kE4gqS90b3I/dfEvdd91o56xPg98D33BXEtbbGxGG3UlJhX1JQtWDEHzr8sxUT0J0Kf/dAAZr3NrX3NrX3NgOa1RWmCvdgFqYK92AWpgoOf/dG+zF23B33mveIFRNQ1wab98yO9wYF+wYGjvsGBRNgavxy9z0KE6DAZa5aHhNgWmVoVh8O99n3Rot33B335veLFRNQPwZ7+8yI+wYF9wYGiPcGBRNgrPhy9z4KE6BWsWi8HhNgvLGuwB8Of/dG+zF2+OzpEvdb90KP9wMTaPd694gV8AZ89w73QKX3FhryOcT7BTxLZ1ldHsxPBaussJ+5G8Sua1sz+z5lovseHxNwbPs69z0KE7DAZa5aHhNwWmVoVh8O+1Pp+Dr3Rot3EvcF9wOP90ITsPgH94sVJgaa+w77QHL7Fxok3VL3BdnMr725HkrHBWxqZnZdG1Joq7vj9z6xdPceHxOoqvc69z4KE8hWsWi8HhOovLGuwB8O99v3+wH/AOeAAPcdA/eb99ulCg732/f7Af8Aa4AA9x33A/cdA/cf99ulCveq+3ulCg730/c/AfdY4QP3+PlOUgoO+KP3PwH30t8D94f30zYKDvfT9z8B0+H3NuED93z5TlIK92vKUgoO+KP3Ih330zYK961MNgoOdvc/AffS3wP3h/t5NgoOdvciHft5Ngr3rUw2Cg6x+EAB9073aQP38LGSHQ6x+EAB9133aQP3Xd6PCg6x+EAByfhhA/d0sZId+C77MZIdDrH4QAHY+GED2N6PCvcN+z2PCg6XCpcK3x3gHd8d4B33jfdf9xoK9/IV9z4dt1JSYV9RHg73APfIAfck98wD4AoV4dHL5eVFyzU1RUsxMdFL4R8O+yzlAcf4dAPHTRUx+HTlBw77RfoiAfdW7gP4MPtFFcvABfsT9wdT9xD3Nxr3N8P3EPcT9wceS8AF+xr7Azf7LvtSGvtS3/su9xr7Ax4O+0X6IgH3x+4D91D7RRX3GvcD3/cu91Ia91I39y77GvcDHktWBfcT+wfD+xD7Nxr7N1P7EPsT+wceDvssyvlyygH3aeQD92n7LBX3ssr7Wfly91nK+7IGDvssyvlyygH3vuUD8TIVTPey+fD7skz3WP1yBw73PR33BfcdhfAT6PeIfRUhxmv3Ex7Qyl0GLnefxx/FkL3LGtFyqkWXHo8H0ZekqtHIhsPCGsefn+geucpGBvsTUGshH0aVWUwaE/Bnb2X7BYoeRQcT6PcFiqdlZ0mBX0MaDvc9HfeU74b3HBPw8TIVTNAH9xPFq/Uf04G3zRoT6K+nsfcFjB7RBxPw+wWMb7GvypW90Br1Uav7Ex5GTLkG56B3Tx9UhlNOGkWjbNJ/HocHRH9zbEVLkFlRGk92dy8eDvs0+foB4fhAA/iW+VoVKAb73f36Be4GDvcvHfuOFfH6fCUGDvs0+foB4fhAA/gz+zQV7gb73fn6BSgGDvcvHffCFfH4VCUG/LEE/F/x+F8HDvD4YAH3m9UD90rwFfcK9yr3CvsqwLAk9zX3MtB4xvs5WoH3SwVLBoH7S/s5vHhQ9zJGJPs1BQ74Yf8AV4AA9xAd95E7FekGhPi09yyFxgqRBQ7/AFOAAOH3ueH3EB33ANsV9yyShPs7BekGhPc79yyEBekH+yyCkvcrhPcr9yyCxgqUhPsrkvsr+yyUBQ5B4fjg4hLc7WH09wTzZu0T5PdH9+oVrJ6irJwe3V/3AHc/Gmh6dml6Hjq5+wKe1hr3u/ewFapiUKlDGxPUIVBNO2mWcJ52HxPoWG9oXFX7Tvelmysaa3JzXFtlnqxpHkdPBVi30XDVG/cCzcrfrIGke6AfE9TBqqyzyPdK+6mF5Rqon6C5tLF3cKweDvkidwHH96vA9wYD+Bw7FfcG+XL7BgZWFmAG+xgjU/s2+yz2Q/ccH68GDoG/39L3itLkvgGjw8ni97fDA6P32G4KyYoV+w7UQOq6rZ6kqh5lwwV7dXh+bRtYarzY0K2+wqKbgXqdH7i9BaZwa6BZGzI7QfsJHw6Bv/dbyvcZzPC+AaPD9ODt3tDDA/dN9x4V4PKvBtrNt+jkS646H/sNBuD7WhX3GacHuKR5YFlzdV0f+6afbgoO98+29xCvx7HDtQH1utG8x8DHuwP3v/fPFfbi3fcJ9wo03SAhNDn7CvsJ4jn1H7YEN03K6OnJy9/fyUstLk1MNx8/xhW8zK4Gq0oFwQZf2gWilZihohq6Z51fHjkGvCkVx6QHo5Z+enl+f3MfDvg71OnhRNIS2dn3E9H3OdATvPev+AAV0fcIBoL3AoIKyfs7Bb0GE9y5HQUTvGPzBTQG+2H7zBXZ94Xj0vuRROIGDvf0x5bU6eFYxxKe0tHTvtH3OdATn/cI9/QV07e6vbp1o2SdH1+gBXKWf5SbGpuXmaWhon18oB6xvQWhcWacZBtGYWJWWqhzqXwfuHQFpX6WhncaeH2Ac2x0mqFzHmJaBWysr3q3G/c7lxXR9wgGE++C9wKCCsn7OwW9BrkdY/MFNAYO+ybU9zXY+Cf3JQr4IhX3HUn0+yX7OPsZ+xH7m/ud9yH7Gd0K9wL3Z/dx8+727LdCNh98fwp11PTY9/33JQr4WhX3CUrq+yH7Ofsd+wL7gPt49yH7Bt0K5vdC91b3Ad/26LZSSh+CfwqgdvdX1/cV1wHZ+FQD9xgW0Qai91cF9woGc/tXBdEGo/dXBejXNwab9xUF49c8BqD3QgVGBnX7QgX7Cgag90IFRwZ0+0IFMD/dBnv7FQU1P9gG2tcVm/cVBfcKBnv7FQUO9734MwH3m9UD91r3vRXx9xnx+xnAsDT3JPcew3jG+yVmgfcwBUsGgfsx+yWxeFD3HlM0+yQFDs8dzx2t6fgg6QHr9wP3YfcEA/ff96AVuXiudmkaY2pxSx6Ih4uIG3P3oRVgnGydpxqzraPCHo6Oi44b0n0Vo4KgfqR5xc4Ybaloo16ZpPcdGEOUcvsZBYWFi4Ub+xA3TSku4GPcbB9v+y5ll2ieaKEZVzywbL9ywH4Zb/sr04On9ygFj4+Ljxv3H+DR7ewxtTeqHw74QJod+EA3Cg75Ke0d+EwViQr4TLEd+ExOCvhAkx34cDAK+I+zHfjFSAr4QHUd+HA5HfhAsgr4gD4K+TqiHfhMFVcK+ECECvigKh34QJMK+SEyCvf51R347lAK9/nTCvjuUB34RLsK+Hx9HfhM7Qr30VEd+0qaHftKNwoOvu0d+z4ViQr7PrEd+z5OCvtKkx37GjAKJLMdWkgK+0p1HfsaOR37SrIK+wo+Cs+iHfs+FVcK+0qECjUqHftKkwq2Mgr7kdUdg1AK+5HTCoNQHftGuwr7Dn0d+z7tCvu5UR1/mh1/NwoO93HtHRaJCovR90nQEvdF944r3RPg90UW947RBhPQ+wYGwby5ub0azVyyP/c7HZ2imaEbrZ54bB8T4GROWS5JHg5/kx2vMArOsx33DUgKf3Udrzkdf8vgwM3LAfc92fcB2AP3yb8VcXCbtoMfnaCdk6Abq5t7cnB6em0f9wz3fBWgcGqaYhsnUEQmK8RL4dG+u8fGZq5LaW9/eHQfx5CnsMAbpJ+CfZwfDveCoh0WVwp/hArfKh1/kwr3aTIKONUd9zZQCjjTCvc2UB2Duwq7fR2L7Qr7D1Ed99CaHffQNwoO+LntHffcFYkK99yxHffcTgr30JMd+AAwCvgfsx34VUgK99B1HfgAOR330LIK+BA+CvjKoh333BVXCvfQhAr4MCod99CTCvixMgr3SdUd+D5QCvdJ0wr4PlAd95S7CvfMfR33nO0K9yFRHU8dVx10HU8d95DQ92DPAfc33/ch4gP3N/eYFc0Gkq0FjQZwp618qhvW0Mz3A+9azDZpaHt0cB+NwAX3CjcH3/wQFfcmB6KjovckCnORnXUfDveQz/dizgH3Q+ED90P4OhUg1Uzts7aZpq0eaMEFfXdzfm0bVGS0yMmztcShnoN8nR+zwAWgc2mbXhssN037AR8OmR33Gfg6FSDCTN+vrp6ipB6NBpFpBdD4ZTf7CAaOWAWgcnKZlgr3kMvgv9fLPR0O+JvN3c0B95/eA/iO+WAVlG5rk2cbKGBUPx96Bz6IBUzY+5fe95f3DM37DJ0Hs6GjuqWhhoOhHg73CsDZzbu/9wHIW8MS9yHRVdo/zvcQ1nTbE/RA92f3bBWYk5iglx6ImJmJoRu9BrSihnNxYnROUmqcpx9FfxVRyG/k9wnWvc3EXqM1HhPxgEkGY3iTn5iRkpeTH4admoibG9bEr9Wggp2Blx/VyPsbBpF8eI15GxPygEFMYj9lnm2jex+IBxPxgHJ7fHR1GnCaep2BHogHE/RAaXl5c3IaE+qA9y33ZxVqcqGysKSjrKqlc2ZkcXVsHw6HCnBvHpDMBfcKNgcO+JvNwfcAEve09wgo3xOQ90D4mxX3GfuX3/fZ+20GE+D3QsEVraOgrKtz9xcK9xLN99vNwfcAEveo9wko3hPo9zX4mxX3GfuQBll7clZ4dpCWdB5xTwV/paqBrxv3B6zM2x/3zvtsBxPw90HBFa2koKyrcvcXCveY+GUB90LfA/dC95gV394GxcLp+x4F5wb7HfdV9xD3GAUvBvsc+yEFiPetNwYO95DP9+fNAfec3wP3UfknFdb7rAY8rlvbrp+RkqcefMwFhHh+iH0baXiZtB/38vszBw74ntIB9w/ays7J2wP3D/eYFdr3dAakl5aYmhuck39xH/t0zvd0B6SWlpibG5ySf3Ef+3Tb93oHzHCxXWZ0dGx8Hq+EdZ1tG2V3dm99H4kGhLQFTAYOhwpubR6IBoW4BUYGDnQd95DQ92DPAfc33/ch4gP3iPezFXWnp36qG9bQzPcD71vMNmZmeXRvH4kGhawFRvxX3+8G9wME9yYHoqSh9yQKdJGddB8OmR33Gfg6FSDCTN+trZygpB6HVwUj3/hXSQeEawWIBqdvcJeWCvic1AH3ed8D93n3mBXf90MGyae0orEbo5iIhKEfm9EFlHl5j3AbWl1vVm0fiQaE1AVGBg73kMn3bckB90Hf9wfeA/ct974VcbLDd8Mb7cC5xMdNoFOcH2GXZZWiGp6cmbWtqIB6ph6yvQWgal+eVxsyVWJSVMlzwXoftX60gHIadnd8XV9omaJoHg73kM33Xc0B93rgA/d6+BwVN65T8bGtlJSlHnzIBYN4d4Z0G1Z3or8f9xL3HM37HONEB4EzPogFTNQHDveQ0wH3K+D3Fd8D+FX43RU3+3AGbHF3gW4bY32guh/3VTb7Xwc5rFvWuq+irKkejQaSWwXPBg73mMoB9xn35AP3kveYFewG9wr32QU6BlX7N4BqgmqBahmJBoGsgqyArFX3Nxg2Bg73mM/3Lc8B3vggA/ck95gV7Aaj9xKStY6nj6QZjgaQaJBtkG2k+xIY7gbF99kFPQZx+zaGa4hshmsZiAaGq4aqhKtu9xIYTgZw+xKEbIZrhmsZiQaGq4mqhqtv9zYYOAYO95j32QH3IffaA/ch95gV4wavx5Wflp6WnhmNBpd4mHiXd7RPGOUG+wP3NPP3OQUzBmtRgXmCeIJ5GYgGgJ1/noGdZsUYMQby+y8FDvcVzQH3GvffA/c/91sVfEwFh5iYiJ4b16+32Kgf9w/34wU6Blr7LIJtg2uCbRmIBoGqgquAqFL3LBg2Bvca+9OFdwVugHd1ZxuDgo6MhB8O95jN91XNAfcp980D9yn3mBX3zc37WAb3UvdrBbf7sUn3Owf7UftqBQ73kMvgv9fLufU9HTX3ThXKBk/1BTQGDveQy+C/18u59T0dofe4FTMGTyEFygYO95DL2b/eywH3K9T3LNsD9yv4LRUvv0rq4dPM9fVKyylfYH50aR6nVwWapqWUqRvAq29UkR/7bwaJg4l+exrUfBX3LAZWhG1yYBtccqi8Hw5XHfcTzNbO91PPAfcZ4Pcj3wP3TPdvFW5TBXOwvX+xG/THut4f99xHB4RtBYkGpXFtl2gbQ0NKJyrCS9+trJqgox+JXAVlinFxVRtuZ5SdbB/3AfcHFV5tr8bHrq+0oKOEeaEf+xcHcnZ1gXIbDvgxxvcvxQH3Ocv3I8sD98H4MRXVyMLc3E7CQUFNVDo6yVTVH8YEYW2ruLmpq7W1qGtdXm5rYR8O9xjd93vdAenz92DzA/XUFePlBXarr4GxG7CwlaCqH+Qxxsc43gWhqpmxtxq4frF1qh7d3lDHMzEFn2xllmYbZWaAd2wfM+VQT9w4BXZsfmVeGl+YZaFsHjk4Bfcr91gV0bm5w8O5XUVGXV1TU1250B4Oruj4IPdyAfH3A7/byPcEA/iM+K0VYrRbqUWTCPcWO/sXByh+S1E1+0f3xJ0kGmNqcUtGUqaxUh5XPLxi1GzQhBn7Jdv3Jwf3AZvLy+D3S/vFfOUas62jwsiveGi6Hg6L7fdI1fde6RL3H/cCU/AT6Pd67RWPB7axoLDGGpqKmIiZHvcz1QYT8PtHBoCrgaqsuApql2iYaR8xhgVGBxPo9wYGjn2Nfn0aQl5OQGseRPho7QcOi/doT8fGxvfGdxL3hvcHE3i1+RAV90H7xgX7KFD3Q1D7Q0/3QwYTuPss9wcHE3j3LPdEx/tExvdExvspB/dC98YF+wcGP/srdV93X3VeGYcGdbh4t3W3P/crGA5/5fcnyMbI9yzlAfb3CQP4kvchFWJnZXVXGz1Xweh2H/d8yPuEBoqWi5aXGpSLk4yTHvesyPulBuudwMPeG7qudm2sH8zKBbtfS6lHG/siIjL7Lm8fS4cFU8QHioKLgYEagIuBjIEeUocFU8sH+y2n8Tf3GRvcyq3GwB8OZvlH+1PoEvP3BerOE7D3zPc2FU6eacDVGtStwcifHvcv+5cVc3hueWiHCBNw98gHpoiif6J3wdIYbalgo1WOCO1IJgf7C3gyNfsgGvsj3jT3EXseKM7uB7uQvKCyrggOKuf33+D3Nuh3dxK7+IP//tyAAPcDE1j4s/kaFRNolnZilGsbE+T7EVlJ+yB3H4ZaBWoGQ4YFO+oHd/tKfPsAdmNOihl3eJCReR96NZ2Cq4Syihn3F7Tl9wyaH6T3aQX3HuD7FAaSxgXEk6S5xhulnoWEmx8OgOZFdqh2+MXlhnehdxLi9wn3DLdit7n/ACuAABOSwPf0+MEVjI+Qi5Abl5aKiJYfU/xveY58kHyTGWOsFWm1ec3fGvcJr9zNpx73TPwpFW1oa3ZjhsH4XRiZgpeBmIDMyhhyp2qgaZmY9wUYXwYTJsB/JgUTM0CNf36Mf4eHi4cbl+0FXwYTK0B/JAX7IXMx+wr7TRr7Lsgi6l8eEybAfPsPBbcGmPaah5uInIoZE0bAfygFtwaX7tOPxK28wRkOi+33FMnAyfcr6RL3H/cCU/AT9Pd67RWPB7SvoK6NwAj3L8n7NQaHnYadhZwI90TJBhP4+1YGh5qJmpq4CnqOepB5H0KHBVLpB5J5kXqQeQhvBjeFBVMHE/T3CwaGR19SRG0IRPho7QcOi+f3Jr3CvPcs5wH3AeH3ZuED+C73tBVUBnjAio0F0Qah+48VhwZY9yYFtQb7b70VjAeGwQXFBptcjoMFLfeUFY8GwPssBV8G+AxaFbxE94g1+4gyByr3iAX7AvuIBkOGBV/TVAdDhgVe0/uC4feC5wfp+4IF9wL3gtK9RMIGDqB293rW6NXl1QHz9wED92n3xRXo90YHTn9da0Eb95UE1LlxS5gf+0blBvfyMRVLBvcMey23+wwb+zn7OQZDhgVH0/wi9wH3esMH9wrrwPcHnB/KBg6Lyb7a92bbw8kB7+73TOsD9wQW+CPJ/CMG96P3QhVrbW9/aRtSaLHUxrizvq6igXOpH+v3fBXFK1H7L033L3MHj0AFpmpum1gbNDRH+wT7Ds1I8ry0n6mpH44Gk2MF2vgzBtaRBcMHDqB293rWw72/vL3VAfP3AfdJ9wAD92n4LxW/90cHjIKMgYAag4uEioQe+0ghFcP3OAdmdmN4Uhv3lQTDsnxooR/7N70G9/JZFUIG5W01rSIb+zn7EAZDhgVf01cHQ4YFXtP7/fcB93rDB/PjteSpH9O9TQaMkouSkxqVi5WKlR7JBg77AvdUMOZFdveZ6vdn4zP3UCV3oXcS1vcJ9wLbufMTMeD4qPfvFftbLOoGE1jg+yUHfXtsgGsbKVDi9yv3KMTl8bmvdmurH8zKZbNWqlKSGRM04O87BxMy4CUH+xxzMPsL+00a+1Pp+wf3GXgeE5HgJtsHEzHg8AfDk7+jtbEIDpZ2+SN3oXcS4vcJ9w7PE7j32t4VPZ9f4fcXGvcUtuDanx73OPwwFW5qbXdmhAj4bgethaZ5pXPMyhhktVWoUJEIE9joRywH+yR3LPsM+1Ea+1jt+wf3IXweJ8/vB8uUv6u4vQgOoHb3dujoydHnTsgS7fg+E+z4oPkQFfw+BhP0L9cH4sN4WJwf+zIGPYYFUveDB0x+Um0uGz8u4gb3Sft2BfcWBvtZ94Teo8bDlecZ1Mk/BhPsgrdwrmKhCPctBg5/9wD4sHcB9yD3CPdR7gP3lOsV9133Lh3K9y4d9yL7CPtaBy1eBUgH6bcFTActXwVIB+m3BfuQB/eEhfc45fdDGpqInYahHitzBZB7i4CCGjQpVTCGHg6p+OYBofjAA9+pLQoOqfjmAaH4wAPfqS0KDqn45gGh+MAD36ktCg5/y/dgy4fL92DLEqTd9xDdcd33EN0Tvfc999A3Cjf78hX3OfddYbL7TftJBfiB+KsV+zn7XbVk9033SQUTw/sn/NU3Cg5/v/cvwPchv/cvvwGy0fTRrNH00QP3NvgZFdG/vd3bV7pFRFdchh34FtIV/FX7XJxl+GL3NQX8NPxTFdG/vd3bV7tFRFdbhh33qlcV0b+93dtXu0VEV1uGHQ6L9w1VwfcWxPeF9wgK93DXE6741vjJFU3G+zn7XbVkBfuEUxXg98hIBhO29wgdE65W3Qf7F/xgFclQ9zn3XWGyBfc++ykVts6yygWP9wwK9xIWWfdPJAYTbvsa+1wFYvc1BxOuSNcHE27OvQcOi9H3SdD3efcICtH3jiveE9jyChPo9wgdE9ygHfui/MkV947R+wYGE9qpChPcZE5ZLkkeDov3DVXB9xbEk8vcutfLEvdb30Tf9zbXE56A+Ob4yRVNxvs5+121ZAX8B/u7FclQ9zn3XWGyBfsh97EVm5+mmKIbqpt9d29yfV0fE52AXAfFpX1ucXV/bmtpnJ92H2ZWBV0KXpYfE76AspmbvwpLWV16cW8e99/8eBW3zrLKBY73DArX908VJAYTXoD7GvtcBWL3NQcTnoBI1wcTXoDOvgcTnoDBWAcOf8vcutfL93n3CAr3c99F3xPs8goT9PcIHRPtoB37qvylFV0KXZYfE+5tChPt6wp/y9y618uT0fdJ0BK5944r3vdG30XfE5yAuffcFfeO0fsGBhOagKkKE5yAZE5ZLkkesfvsLQr7qvylFV0KXZYfE/sAbQoT2oDrCn/E927E93n3CArL9woKE9gA8goTKAD3CB0TnIBW3QdG/Js8Cn/E927Eh8vcutfLEvdb30XfkPcKChMiALH4ABVdCl2WHxMcAG0KEzIAXAfEpn1ucXR/bmtpnJ93Ox1/xPduxIfL6bu20hL/AEqAAND/AEiAAN+N9woKEz4AsfgAFWm1tH29G9XCucnJX69JeneIhX4fkr8F9xzS+10GfPsxr3IFl56bk6IbrKF7a250emtpbZyfdTsdf8T3bsT3itESvPeS+1Pk8PcKChPsgPcE99wV5AYTMACQ9JzP2+UIuPuSRQcTKAD3MgYT7IBPOm5PhSoIb/u+PAr3tN8B95TjA/eU7hXj91H3Rt/7RvdRM/tR+0Y390YGDpcK9wv4OQHo+DID9yz3CxX3KPcr9yj7K8bH+yj3Kvco9ytQx/so+yz7KPcsUE/3KPsr+yj7KgUO3/cX1N/T9xcB93z3HAP3wPhQFbGpprKxbaZlZW1wZWSpcLEfR/u6FWSpcLGxqaaysW2mZWVtcGUe+y73HhX4UN/8UAYO9433XwH3W/dZA/db9/IVUbRgxcS0tsXFYrdSUWJfUR4O90Tf9yDfAdn4UAPZ+CQV+FDf/FAG+8gE+FDf/FAGDrL43gH3CuwD9wr3txX4EPuQBfYH+6/3TAWPB/ev90wF9gf8EPuQBQ6y+N4B+BXsA/h2+AkV/BD3kAUgB/ev+0wFhwf7r/tMBSAH+BD3kAUOi94S2fcJ+wn4UBOg2Rb4UN78UAYTwPduBPhQ+ygF7Af7Usb7HbIFjwf3HbL3UsYF7Af8UPsoBQ6L3hLZ+FD7CfcJE8DZFvhQ3vxQBhOg+FD30BX8UPcoBSoH91JQ9x1kBYcH+x1k+1JQBSoH+FD3KAUOi973bN4B95TjA/eU9yMV4/cw90be+0b3RzP7R/tGOPdGBvtG+78V+FDe/FAGDvjJ9AHt+CgD7ferFewGw/cruvcbggq6+xvD+ysF7Ab7LvgbBSsGDvdE3/cg3wHZ+FAD778V2AbV9xAF96Pf+3QG3fcgBfci3ysG1fcQBT4GQfsQBfujN/d0Bjn7IAX7IjfrBg73jN+H3xLL+GwTYPca94jkHROgnh0TYFJUZydlHw73HN+H38ffh98Sy/hsE1j3Gvf45B0TaJ4dE1hSVGcnZR/R+5TkHROYnh0TWFJUZydlHw73tN8B+EfiA9n3tBX3+ftR4vel/FAGDn/p99HnAfcO9vcn9wAD+Az3GhUwrFTpqKCRkpoefeEFiH+EiYUbbXyXra6M9x2R7h/e5/xwBkOGBTTrB/sNhfsfe/sfHvcHhAWU9x2Q9yL3Exr3KwYsh/sWYxoO9xz2NuH3LPZG4BKC4vhQ4hNc9xb3MhXMt7a8qR+PBhOcN7+7bdQb6NHX9xL0RtcxRVllRWAfhwYTrMFtYLFLGzJJR/sHHxNcM8lB2B4TnPdT908Vya6vprQbwq1jUFltYVdbaarSZh8TbPtCJhVjbq64tqOotK2pdFKnH1t0bnNnGw5/6THquB33a/cAE3DR+1QV9wgGhdmJwYrlCGuhrYWwG8K8rMyuH44GE7BGmKhqxRuln4+RmR994QWJgoeLhht5fZWn74/3KI/3Dx/7CAYTcPvLB0BhZHleG05vrtsf97X7BwcOf+n3hOX3OukBz/b3i/cCA/eh3RVZX7LP3be+2LO0eVmvH/sJdlRURxs8+FQVqquunLQb3bVG+x8fgouDgxq1ZlikWBv7FjYs+xr7DeJB8fc39wT3LPd391Y79wP7IklTcV9aHw77MuP5mOMS94L0SvMT0PdGSRV/NgWIlZ+Hohv3G6fx9xwfE+D3MWT3PfcqGu2Wu8CZl4qIlB6X4AWPgnaOdhv7HW8k+xsfE9D7MLP7PvsqGiiAXFV9f4yOgh4OM/cKAbv4tAP3Xvg7FfsuSqFS1Kr3Kvw4Bd0G9236IAU8Bvs8/WGGc4dyh3MZhwaFo4WkhKMIDovt+GLpAaT4uwOkFvi70Qb7Y/jcBfsdBvtj/NwF9xGnFd/3l8n3X4IKyvtf4PuXBQ6L6fhr8BKu9wt59wTz9wR59wsT5J8WE9T3eN8GE+RQyGjb9wsa9xS/6Onpvy77FPsLaDtQTh4T6Df3eOn7CI8HE+S7vcDi9wsa90sk9xX7Nvs2JPsV+0v7C8A0u1keh/sIBw77DO34xewBy/h9A8tZFUX4fe377Y8H91r3qPtR96kFj/fK7PxYRQf3Z/vIBQ74q/ABsfcI97f3CQOx+wwV9wj5I/e3/SP3CfmI/KAGDn/r+LrhAfdP9wX06gP3wPiPFeamr6qmn3RVOWZGR0ge90P7ZxV2c290YxtdZqraH6kH9xn1zvL3ERrxUMc0LENG+zUe+4gHb3hsdmp3uEMYnJablZuVCCOZ11bhG8y9rq6yHw5/n/fInffGnwGl9xb3tvcUA/c4zxWHkYeRkxr3dAeNjY2NHvgyBo2Lj40a9077D/cq+yv7K/sP+yr7TvtO9w/7Kvcr5dm/28EeZQZHXUlfRRtVWaGxaR+H954ViYmNjx/3cAeSj5SPkR6vrb2hwRu9vXdprR+RhY+Dgxr7dAeHiYmHHg73YucBmvi+A5r3jhX3p/uew8r7QvczBfgh5/whBvdC9zNTyvun+54FDnL4vQH3kucD9774pBX7nvunylP3M/dDBfwh5/ghB/cz+0PKw/ue96cFDvdi5wGp+L4D+Nz3khX7p/eeU0z3Q/szBfwiL/giBvtD+zPDTPen954FDnL4vQH3kucD98JyFfee96dMw/sz+0MF+CEv/CEH+zP3Q0xT9577pwUO9yz3cgH3U/duA/dT9ywV9273cvtuBg73AvfFAfcn98YD98D3AhX3Lfct+y33LPst+ywFDs/JzvcW0MgB9wDNy/cQy80D98D3WRWtp6exsG+maWlvcGZlp2+tH/sVBPXh2fcJ9wg12SEhNT37CPsJ4T31H8kER1G/3NzFv8/PxVc6OlFXRx8O9wS190LXAfcwt/c81wP3XPcuFfdC9zz7Qgf7aGEV938GwMkF93r7dQdMVgUOqPiTAan4sAOpqOIdqNgBqfiwA/c59RX3G/eg9xz7oAX8Kj7iHZf4rwHL+JMDy5fjHZf4rwHL2QP3IvcmFfejB/ed+xsF++v7ouMdo/iSAan4sAP3vqMVjwb3oPiQBY38sIkHDvhd2AGp+LAD+Ej4XRX7HPuf+xv3nwX7G9YV96D8kIIK96D4kAWN/LAHDpf4rwGk+JMDpPesFfiR+6AFjfiviQb8kfufBQ6X+K8B+F7ZA/dV964V9533GwX7owfZ+CkViQb8kfufBYcH+JH7oAWNBg73Ix2isxX4vPie/LwH/NBZFfjoBsXPBfj7/N4HR1EFDvcjHfi1sxX8nvi8+FAGQPsLSvseY/sgCIcGcNtm21zWQFoYxjO3NrAl9wSYGLr3PND3Jdv3CQjj95MVZWVmX2haCPx2BkdRBf0F+OgHxc8F+OsHpamlp6WkCA7///KAAP8AUoAAAYD5CAP3lIQV2fer9x33afcm9x1Dyxj7Jvsm+xf7fEP7gwiHBmzhYOVV3EBaGM4suTC0+wMIDnH3YgH3tND3CdEDzMIVVL9xwvXayvcMHvgUB9ZztU5OGmeIcoFsHrV6BZ+soMDBGtlvxC/LHlmugZSApAhK/KIGkYNykXEbLUVRSB8Ogez4euwB4/g8A/ePgRXtBvc39+j7N/foBSkG+zf76AX3ZvuHFVH3ElT3CcL3CMX3E4IKxfsTwvsIVPsJUfsSBQ74Hve6AfeH9xwD94f4HhXWBrT3P5/3DwX7BgYO+B73ugH3H/fsA/cf+B73FR33Tfu69xUdDvfT9z8B91jhA/f4+U5SCg74o/c/AffS3wP3h/fTNgoO+I249yS5AffexgP3g/iNFe+IvbvTGtNZvCeIHl0Hz6JuYGF0bUcfDviNuPckuQH3asYD+AD5eBUnjllaQxpDvVvvjh64B0hzqbW2o6jOHw7ZHfc492YD97T40Xod2R33dvdmA/hI9yIKDp0dnAr4F/fpAfeA9xQD95v4FxXVBqb36QX7FAYOkR3ZHfd292YD+Ej5b4gK2R33N/dmA/ez+NF6HfuY9+oB94D3FAP35d0VQQZw++oF9xQGDmcK+Nf3GwH3F/cZ0/cZA/dZ+NdgHZEd+NPMAfc1zvckzgP3wPjTdAp8HfjQ9ycB91D32AP3UPjQjh341fc/CvjVaAr3NB33vOAD939AFbaAnX12GnBnfkEKtHGfapceorwFRQYOgArZHfc492YD97T40Xod9xwK9y33ZgP3ovlUeQrZHfd292YD+Ej3IgoO9xwK94H3ZgP4U/nIVAoOnR33HAr3KPfEA/eC+VQrCg5nCvlX9x0K9yLI91bIE5D3/vlXFRNQox1OBhOQqwoTYNodE6ByHRNgogoTkOYKkR35aNf3Kwr3O/lorQr408wB9zXO9yTOA/fA+NN0CvlVyAH3PveYA/fA+VUVRgr41fc/CvjVaAr5V/cXAfd59yID98D5V0Qd+Nf3GwH3F/cZ0/cZA/dZ+NdgHflY5R33Y/lYLx35O8gB98jhA/eg+L8VYR0O+cbIAffI4QOkCg58HflOuem5AfdZxuPGA/fA+U6RCvjQ9ycB91D32AP3UPjQjh33HAr3RffjA/eU+VSIHZwK9xwK9yj3xAP3/vnIKx340PcnAeP32AP36vljFS0G5vsnBdQG+3n3JxUsBuf7JwXUBg73HArj9+MD+Dv5VBVLbh0lBuL7CAX7LvcIFSUG4vsIBdoGDvi16wH3hLwD9975fBVMcXBdWBpZn3GxpaCdrKh0m3OIiIuKiB6Op5+gsZwIDvka6wH3yL0D96D4shXJpae6vhq8d6ZlcXZ5am6ie6OOjYuMjh6Ibnd2ZnsIDvhD91cB+ALmA/fA+EMV4pLRrtsaqH+lfZ0eO2YFk3+SfHoaYm98XIMeDvuE9z8K+4QVLB37ZOUd92P7ZBWupKWsrXKlaGhzcWlqo3GuH/dOFq6jpaytc6VoaHJxaWqkca4fDvtzvVn3RhL3uOATYPegXhUToHNdBal+CmeAQQoTYLpsoz2UHg73NB33uOAD93tAFbaAnX12GnBnfkEKtHGfapceorwFRQYO9zQd97ThA/d4QBWBHaK8BUUGDoAK+27ZAfdy4QP3vI4VbHVgWlAaULprxaqymZ2iHm7HBYOAf4V8G3V0mKito6+yqh8O+2TNAfc7zvcYzgP3wPtkFd0dSAbXHQ77SNcB9z33mQP4QiO+CvjX9s7FEvcu9i/3mTD2E+j3Y/jXYx0T0Pt090IV95nF+5kGDvlY9r7FEvcu9i33ni32E1D3O/n2FfeexfueBhPos/tsNQoO+Nf2tvbMHfeE+W0V1wb3AfYFJAb7B/uVYx0O+Vj2qvcIzB33gfniFegG9wduHfsPBvsH+5I1Cg741/a29swd94/5bRXtBuP2BToGVU4FhwZVyAU6Brf7lWMdDvlY9qr3CMwd92P5WDUKbPeSKx341/a29swd96r52BUkBvcBIAXXBqz7KhWqoaOpqXVvCvtOFqqio6mpdKJsgx0O+Vj2qvcIzB33qvpW9zIdiR340e4K90D4FhOg90D40RXVBr9DCi8G9yRVFc4GE2Dobh0yBg75VPcpHfcw+C0ToPgm+ZYVzwYTYOpuHS4GE6D70PtKMQoO+NHuCvdA9/YToPdA+NEV1Qa/QwovBhNg913JFTEG6fccHflU9ykd9zD39xNg+E76ChUu9zcKzwYToPv3STEKDvjR9xC3vwH4WtkD90D40RXVBr9DCi8G90FGFa0d+VT3Arm/Afha1wP4PvmEFUsd+ND3NAr3Nr/3QL8TuPc4+NCGCiMGE9hprxUTuJUdE9j3EgqFHw75VPcCr/EB9zPA90TAA/cw+VQxCmIK+NPGvaP3Kwr3lvlAFckG424dNAZ2+3V6Cg73Lgr3lvm5FckG7vcEBS8GcPtoFcMKUwZHCg7408a9o/crCver+bQVNAbj+wgFyQZh+wF6Cg73Lgr3pfopFS8G7vsEBckGYScVwwpTBkcKDvjTxvc+vgH3vNkD98D403oKbPcIFcOUvJ7HGrpjpS2OHoBYBb2InH91Gnd9g3WFHg75VY4KsvsfFcMKUwZHCg7408TfyU3xEvc2v/dAvxO498D40xXlsfcgHVx1pqiFH1IGUI+xVeUb+x73IRW/BpUdXmpnSYUfDvlVwuTzAfc/s/dDwQP3wPlVFcMKUwZHCvsj9yQVwQamj5uanfcvClUGb4V9fXhtbrVeG15pZUmEHw740PcAq8QB9zj3pAP3OPjQhgojBr+rFdyxvcOOH1IGcIZ4dWIbYnihpoYfUgZTjrFZ3BsO+VT3AqvCAfcw97QD9zD5VDEKvasV3bO3yZIfUwZtg3h2XRtdeKCpgx9TBk2Ss1/dGw74uPdtAf8BA4AA1QP3zvi4uQr4s/dGWb0S93LhE6D34PizFRNgorkFbpJ5lqIao66WvZEegr0FNYU/bkwaE6BcqnPagh4ODg4ODj4dAVX5WANzCq4dNB0BVflYA+gd+Vj3bP1YBg78JBwFeFQdHAV4+wAGDvwkHAV4eAocBXj7bAYOPh33IR33ihX3GvcA+xoG91z7ABX3GvcA+xoG91z7ABX3GvcA+xoGDjQd9yEd91QV9xr3bPsaBvdc+2wV9xr3bPsaBvdc+2wV9xr3bPsaBg77Jfdy9wP3cvcD93JCHfeK+yUV9wD3cvsABvcDBPcA93L7AAb3AwT3APdy8Ar7Jfdy9wP3cvcD93IBNB0D91T7JRX3NQr3AwT3NQr3AwT3NQoOPh33BB33ivcZHfcq+wD3GR33KvsA9xkd9yr7APcZHQ40HfcEHfdU9xkK9yr7bPcZCvcq+2z3GQr3Kvts9xkKDvs991DJ91DJ91DJ91BCHfeK+z0V9wodyQT3Ch3JBPcKHckE9wodDvs991DJ91DJ91DJ91ABNB0D91T7PRX3BwrJBPcHCskE9wcKyQT3BwoO94r3AFQd+RrgCvcTCvdU92xUHfjk98D3bPcTCveK9wB4CvcLCvxiBg73VPdseAr3Kh38YgYOZQr3PAr5hvcTCnsd+bz3EwpxCveK/Rr3bPmG/GIGDnAK94r85Pds+bz8YgYO9yUd94oV+Cz3APvA+RrwCqcK94r3VBX4LPds9ykKBg68CvdU94oV+GL3AMAdBg69HfdU91QV+GL3bMEdBg5lCnMK+Cz5hvsA/RqDCqcK6B34LPm8oApxCvhi+Yb3EQpwCvhi+bz3ER33ivcAVB35GvcMHfka8Ar3VPdsVB345PfA92z3KQoGDooKE8D3VPeKFROgwegK+RrgCgYTwMAdBg6KChPA91T8JBX3bPcLCgYToPvA7woGE8BVBg73ivcAeAr3CwrAHQYONB1fHRPA91T3VBUToMH3MAoTwMEdBg40HV8dE8D3VPwkFfds9yodBhOg9ykK/OQGE8BVBg73VPdseAr3Kh3BHQYOZQr3PAocBXj7AP0agwp7HRwFeKAKgB33wP0a9wD5GgYTwMH5hvcRCoAdE8DCCvmGBhOgVfcyCnEK94r9GvdsHAV49xEKNB1fHROg8Qr45AYTwMH5vPcRHTQdXx0ToOgdE8C3Cvm8BhOgVfjkoApwCveK/OT3bBwFePcRHWUK9zwK+Rr3wLodlh0HE6DB/CwHDp8K/CwHE2BV+8AHDnsd+OT3wPds/VgGDnEK94r9Gvds+Rr3irodOQoSNB3FCgcToMH8YgcOnx38YgcTYFX7igcOcAr3ivzk92z3Kh39WAYOZQpzCvlY9wUdOQoSPh0ToOgd+CwGE2DB9wwd6R0HE6D85PvABw45ChI+HRNgcwr3wAYToFX4LPds9ykKBxNg/Rr7wAcOpwroHflY92z7wPjkoApxCvlY9wQKOQoSNB0ToOgd+GIGE2DBlx05ChI0HRNgcwr3igYToFX4YvdswR0H9xAKcAr5WPds+4r45PcRHWUK9zwK+Rr3wPcFHZYd6R0HE6D85PvABw6fCvcpCgcTYP0a+8AHDnsd+OT3wPds+8D45KAKgB33wP0a9wD5GuAKBhPA+4r5GvcRCoAdE8DCCvcLCgYToPvA9zIKcQr3iv0a92z5GveK9wQKOQpfHROQ8Qr45AYToMEGE2DBlx05Cl8dE1BzChNg94oGE6BVBxOQwfcwChOgwR0G9xAKOQpfHcUKBxOgwQcTkFX45KAKOQpfHRNQcwoTYMIKBhOg9yodBxOQ9ykK/OQGE6BVBhNgVfuKBw40HV8dE6BV91QV98D3MAoTwPuK+OT3ER00HV8dE6DoHRPAtwr3Kh0GE6D7wPjkoAo5ChI0HcUK+Rr7bAcToPzk+4oHDp8dwR0H9xAKcAr3ivzk92z3Kh37ivjk9xEdPh33QB33ihX3KvcA+yoG98D7ABX3KvcA+yoGDjQd90Ad91QV9yr3bPsqBvfA+2wV9yr3bPsqBg5A9473jveOQh33ikAV9wD3jvsABveOBPcA947wCkD3jveO944BNB0D91RAFfds9477bAb3jgT3bPeO+2wGDkwKAVX5WANV9/YV+VjnHfvYBK4d/CQcBXgBTAoD9x78JBX3ABwFePsABvdsHPqI7B2cHfcTCveKOAr3HvwkFfcA+Rr3AOgK+Rr3VPcA/CwG8Ar3HvcA9wA4Cvce/CQV9wD5hvgs9wD8mAb3bP3yFfcA+K73VPcAgwpkClX39hX3wPsA+8D7APfA/K73APny9xMK94o4Cvf2/CQV9wD5hvyY+wD3VOgK+Rr3AAYO9x73APcAOApV9/YV+Cz9hvcA+fL8mAb72AT3MQoOZAr3ivceFfgs9wD7wPcA9wwd+K7wCveKOAr3HveKFfiY9wD7VO8K+wD5GvAK9x73APcAOAr3HvceFfiY9wD8LPmG+wAG92z9GqsdDmQKVff2FffA+wD7wPsA+Cz58vsA/K6DCveKOApzCviY+YaqHfce9wD3ADgKVfceFfiY+fL7AP2G/CwG9wAEtAoOnB37wPiu8Ar3ijgK9/b8JBX3APka91T3APtU6R0G+2wc+ojsHfce9wD3ADgK9x78JBX3ABwFePsABvds/RqrHRz6iAT3APiu91T3AIMKZApV9/YV98D7APvA+wD3wPyu9wAcBXj7APyugwr3ijgKcwr3VOgKHAV4+wD9GvtUBvgs/YbsHfce9wD3ADgK9/b8JBX3ABwFePsABvws/fIV9zEK9wAEtAoOZApV9x4V98D8rvcA+K73wOcd9wAErh33ijgKcwr3VOgK+Rr3AOgK+Rr3VLod9x73APcAOApV9x4V9xcd/RoV9wD4rvdU9wD7wAb8LPcAFa4dZApV9/YV+Vj3APvA+K77APyu+8AG+9gErh33ijgKcwr5WPcA+1T5Gqod9x73APcAOApV9/YVtAr4LPsAqx38LP3yFa4dZApV9/YV98D7APvA+wD3wPyu9wD4rvcMHfcA9wwd+K77APyugwr3ijgKcwr3VOgK+Rr3AOgK+Rr3VPcA+1T5Gqod9x73APcAOApV9/YVtAr72AT3Fx33AKsdHPqIBPcA+K73VPcAgwr3ivcAVB34JAb3HPcC9wL3HB7B9wBVBvtY+zL7MvtYHw5lCvf2FvdY+zL3MvtYHlX7AMEG9xz3AvsC+xwf/CT3AAcOZQr39vp8FfsA/CQG+xz7AvsC+xweVfsAwQb3WPcy9zL3WB8O9yUd+OwV+1j3Mvsy91gewfcAVQb7HPsC9wL3HB/4JPsABw77kvroAVX5WANV+yYV+wD3AAf47Pp8BfcA+wAHDuoK+Oz+fAXbHQYO6gr3oPxS+6D8UgX7APcAB/eK+C73ivwuBdsdBvug+FL3oPhSBfcA+wAH+4r8LgUOPh0BVfgsA1X3Jh33ivmGQh33iveKFfcA+YbwCj4dAfeK+CwD94r3Jh38JPmGVB35hvAKNB0BVfgsA1X3Jx33ivmGATQdA/dU94oV92z5hvtsBg40HQH3ivgsA/eK9ycd/CT5hngK+Yb7bAYOPh0BVflYA3MK98BV+Cz3bPwsVYMK9xYd/CQV92z5hlXvClUGDj4dAVX5WAPoHfgswfcMHcH3Ewr3Fh33ihXB6Ar5GsH5hvtsBg73wPiIAYv47AP3wAT47PiI9w4d+1z3EXcd9xH3Dh37XPeOdx33jvcOHftc+At3HfgL9w4d+1z4iHcd+Ij3Dh37XPkFdx35BfcOHftc+YJ3HfmC9w4d+1z5/3cd+f/3Dh37XPp8dx36fPcOHZoK+KHFHfih+nz8oQYOmgr4VsUd+Fb6fPxWBg6aCvgLxR34C/p8/AsGDpoK98DFHffA+nyDCpoK93XFHfd1+nz7dQYOmgr3KsUd9yr6fPsqBg6aCtbFHdb6fEAGDvtc+nz3Fgr6fIMKmgqpxR2pBm29BffAWfMK+Oz8iNId0x0OmgqpxR2pBm29BfcqWRWpBvtI98AFWQf3wPuO8wr4VvyIFakG/HT5tAVZB/js/YLSHfcPCtMd98D3JB0OmgqpxR2pBm29BdZZFakGIvdDBVkH9yr7ERWpBvtI98AFWQf3dfuOFakG+5P4PQVZB/fA/AvzCvgL/IgVqQb8Kfk3BVkH+Fb9BRWpBvx0+bQFWQf4of2CFakG/L/6MQVZB/js/f/SHf3/Fb0H/IP5zQVtBvih9w8K/QUVvQf77fjTBW0G+AvTHffA/AsVvQf7V/fZBW0G93X3JB33KvsRFb0HXtYFbQYO+Tf3EQGL+OwD+TcE+Oz3EfcOHa4K+KHWA/ih+1wV1vp8QAYO+1z4iAGL98DFHffA+IiDCvtc+Ij3Fgr4iIMK98D4iAGL98AD98AE98D4iIMKmgr3wMQd+Ij7wPiIgwr3FB35tAT8iPfA+IgHE6D8iAT8iPfA+IgHDpoK98DFHffA+Ij3wPiI9w4drgr3wPfAA/fABPfA/Ij3wPp89w4d98D4iAH3wPfAA/fA98AV98D4iIMK9xQd+1wE98D4iPvABhOg98AW98D4iIMKrgr3wPfAxB36fPvA/IiDCn+X+H+X1Je7l5GXs5cG+2KXB3+X+HqX15e/l5GXt5cI+22XCR6gYl8MCYsMC+kK9wwL6QwM9wwMDfjsFMkTARkCAAEAMQBqAI4ArwD4AT4BiAG2Ag4CJQI2AkoCgAKdAtYC3wMYAysDbgN6A6wDygPrBBEEGAQfBGQEeQTqBRoFXgVnBXMFegWPBZwFsAXDBd8F9AYUBhgGIgY9BkQGSQZ5Bn4GngatBs4G1gbhBvAG9AcRBygHOwdDB5MHnAeqB64H1wfpB+4ICAgdCCYIKwgxCGQIbgh2CIcIygjQCO8JMQk9CUIJRwlLCVAJYAlxCX4JiQmVCZ8JpQmxCcUJzwnWCgoKKgoyCjYKOgpNClMKZAqRCpwKrAqxCrgK3gsJCzMLSgtmC4wLlgumC6wLtQvYC+sL+gwADAQMCwwdDD8MRQxZDF8MdAx7DH8MhgyYDKoMrwyyDMoM0QzYDPAM+Az+DQkNJQ01DUUNUQ1bDWUNbQ10DY8NnQ2jDa4NtQ3ADcgNzw3VDdwN4w3qDe8N/A4UDhoOIQ4qDi4ONg46DkAOVw5cDm4Ogg6HDpEOlw6hDqgOrw60DroOvw7LDtwO8Q8GDwkPDg8eDykPNQ88D0QPRw9ND1IPVw9qD24PdQ9+D4UPig+OD5YPoQ+sD7EPvA/CD9MP1w/cD+wP9Q/+EAgQEBAYEBwQJBApEDAQNBBDEFIQWhBhEGYQahBwEH4QjBCYEKEQqhCzELsQwRDGEMsQ0BDdEOoQ7xD8EQkRFhEhESgRLBEzEToRQRFHEVMRXxFrEXYRghGGEY4RlhGeEaMRqRGuEbMRvhHJEdAR2xHmEewR8RH290D3ihXyxMbPr61/aq4e+3EHY2lneGIbQF/E9R/7C4oV+zbgLPcRwcSqsbAejgYL98B/Ffcs9PcW92j3ZyL3Efss+ywi+xH7Z/to9PsW9ywf8AQ3Ven3J/cmweTf38Ey+yb7J1UtNx8L+98GVV9qeF0bR3Ov2h/3tfsH+8QH+xO9Q/cG1MKvwbkejwYL+4Z6KlT7Ahr3A5QVwL+v90SXHiMHZ15dc1obWmSetx8L5CUVdTEFhZ6kh6Ub9wrG0PcDtR/3YfiVBfsBBjL7hXtdeVh8XBmHBnm8eb55tyb3hRj7Bwb3cPx5f2wFWndnaE0bfX2Oj34fC7v32RX7bfcS+wz3Ot/Ur7W2Hve0+24s9wX7IQd4eGmBaBv7CEzl9yn3J9Tl88StdWypH8vTBbRkULQ0G/s++xP7EvtrHwvJyxVhyONp5xv3KdzP39xBsPsGqR88n1CerhqqpqLXw713brcewNIFrFlBqzsb+x89TjVB4mHpch/ucbl2aRppaHI+P1CjsVQeC/eGFvcI93cG92v4P/ceCjr7Q3VYdFtzVhmHBnTAdrt0vTn3RBj7Dwb3a/w/BQsD8Bb3DQbC94OUtJK1kbIZjgaQZJJhlGLF+4MY9w8G5PkiBfsCBmn8D4hWh1SIUxmHBoDDfMKAwFP3aBhBBlL7aH9VfFSAVBmIBojCh8GIwmf4Dxj7CQYL8xb4QO37zPdV95Tt+5T3O/fC7fw2BgvS9xgVNc9R683NrLO/Ho4GCxXHy9AdSwXlBituHfsEBiv7CAUL91L3WhX7Er439ynGwpiatx513wV/a2mDYRs4bbDcH/de93Tm+3T3GiwHfPsa+xyGBTX3FwcLFfc5911hsvtN+0kF+IL4qxX7OftdtWT3TfdJBQsD1Pc3HfcJLfcu0dSkvMMeW9UFbmVdclMbKknM7e7PzO23sntssR/C0wWyYk2pPBv7KvsVLfs4Hwu6rqm6uWirXAsVXQpelh8T8LKZm78KS1ldenFvHq9ZBZufppiiG6qbfXdvcn1dHxPoXAfFpX1ucXV/bmtpnJ92Hw4V3wbFxYIKxVEF3wYt9wIFJwYLFaWcnKimpnxfkh55d3iDdxtqfJulH0L7UBV1pqt8tRvux9Lx61LKNUVYW09RsGfLrKeWn6IfUIZwZVYbcneVmHofDl4KW2lrXVytbbsfDvFx9wMTuxB3ChPaiEgdE7sQVh0TukgzHRO6kEUKE7aQQgoTulBVChO7EMEKE7aQPB0LFaqioaqqvx1sbKF1qh/3OQqhoaqqwx1sbKJ1qh8LFfK9w9/zGuNjwEtaZ2dVW61qupOTjI6THoZJZVpKaQgLFd7Iy/PzTsc4OE5PIyPIS94fywRpb6rU1aelra2ncUFCb2xpHwv3AAFMCgMLNB37NvcACxVcaGtdXK5tui8KHzb39RWi25/Qn9Wd1BmPBp5Dn0CeRqI7GPdb+6AV+2j5IgX7HAb7aP0iBfcKBr73RQX3bga9+0UFDvcSQRVjOwVnw9V7xhv3MeHY9xQfCy0K+1z8dRWemZ2ilx6wgKx/bhp2cnxvbXOboh4TQwDR8RVplXKWoxqdnJmkp5t8d3uDfXh/HhOEgPsm+wAVWr9i2dbCs724b6Bomx6PBxNDAKeZpJ6vGr9XrkdKVGhXZaJ8qXgehwcThIBremx2YhoO1hb3Qwb3T/cH9wX3bfds+wf3APtVH/s9BvcI/MQV+Ga5B/cR0kX7NPs1RED7ER8LFXFvm7aDH52gnZOgG6yae3JwenpuH/cL93wVoHBrmmEbKE9EJivES+HRvrvHxmauS2lvf3h0H8eQp7DAG6Sfgn2cHw6UUgXq+H8wBgtVHfeU7Qb3IPuUBQtZhR6VXAoLk3Vxj24b+wAtS/sFUadfrnMfhwcL0IIKv0YF1QY59xAFC0KWOJBIHogGTvcf+0P4BAX7CgYL9wLhxPcBrXupep8f9wfg+10GC9+y90EKSQZuhXlyYxtjeaSohR9JBkuSsljfGw5rg3hxXRtdeKWrgx9TBkySs1ndGwsVt86yygWO9wwK9xMWWPdPJAb7GvtcBWL3NUjXzr4HDn8/HQsGTyoFhwZP7AULA9IW+Gbn+8UG97z35gXI/Dsw95kH+7v75gUL9x73ANsdC/uE9y8LFfeO0fsGBhPQwby6ub0azVuyP1lhcWdqHr1eBaOdopmhG62eeGwfE+BkTlkuSR4O7kl4HQsVJbJCzkUeyrQFUshwz9Ya16bPxMgeTLQFSEVkQiQaDosdaIBZhR6UXAq6bfcCChUjWVM3IxoztFbKva6vwbtqrFuEg4qIhB6PzbG8zK0IC+T3Hdn3DuQLFfsSBjf7CAXoBgtncnRoahpio3GlfB6HBwuLWgoL4wYTwJH0m8/b5Qi4+5FFBxOg9zIGTjpvT4UqCA4V6bXU0461HV91sLaFH0kGQ461QugbCxU7W8zt7rvM29u7SigpW0o7Hwvt91Xt9zvtC4vp923G91LpAdz3CPeG9wsD3Bb3Qwb3TvcI9wX3bfds+wj3APtUH/s9+7AGQ4YFVdMH9wj7bRX3bfcRxvsR91K5B/cQ00X7NPs1Q0D7EB8OWQXgkdeoyhoLabO7fbcb0cSxxbN0pQsVLwoL3/gkFfdp/CEGPnNiN2tnk5xmHmg4BXizvH3EG/c8vOr3DB/4dvvcBwsVhR1jcG1lZaZusx/3YRZiHQ4V4GwKC2WvFaeQmZedqaRjvxv3GApvhn1/eW1y1h0Ozs2PH1QGY4VzaVsbW3Ots4UfVAYL9x73APcATR0L94pNHQv3KAr3CAv41dR41BL3JMhO98xOyBOg9yT41RXIBhNg7h0TkKr3Ex0TSMSBChOI7x0TUNkKE6BSqAr3Bh1caGtd9wIdGqh/pX2dHg7FRR1bZX9dhx4T+DgdE/x2HeoD1Bbp97YGyYH3EYbJHo4Gufs00ftfBcMG0Pdfuvc0BY4Ghk2C+xFNGvu26vki+wwHPvuScCgFiAZv7jz3kvceCgtDHeG7HQuzmZq/CkxYXnpxbx6vWQWbn6aYohuqmn13b3N9XR8LFfth9w/7Ffct9y33D/cV92H3YvsP9xD7Lfst+w/7EPtiHsMW9z7j9wH3GPcY4/sB+z77PTP7BfsY+xgz9wX3PR4LomxsdHRtbaJzqh8LvR3oHQu8CnMKC39TCgtV94oVCxXptNTTjx9IBmCGdWZeih33hhb3CPjA92Lt/KQp92IGC8mat67LGqh/pH2dHg73MkQVopigrqAeCwE0HQP3VPwkFfdsCxXoBjduHfsSBg4V5bKEHQvlvHFAQVplMR8xBgvOk8WmyhrAXKkhj/c6HcOIpNQdDupNdvgsyh33CwuEnYB0GnMLB/s2dyxcIxo7w1PTwLmpr6YejwaUVQXLBvuI9xIVwLan9wicHvsBB2xtbHhrG2JyorEfDvtk0gH3dNsD93T7DBWSCpiorqCrs6ofRAZudWJeUxoOr7rblB9OBgsFjwYL+8AGDsT3bsQS9z7YSNji10jYE+T3iwujCtH3MgsV2AbEyYIKxE0F2AY39wAFC/ie0gH3OeD3Ft8D9zn3mBXg93MGpKaemacbtJp1Wx/7VN/3XwfdartBWmhzCxX7DQYy+zIF4AYO4ffISAZteXSCXIQIVtwHDj4dXx0LuB33a/cHC6eQmZedGxOtQKmfY78bE6tA9xgKE61Ab4Z9f3kbE6qgbXazWBsLAfgZ9wgD0esVPb7bbdQb90DG8vcRH/hK/BEq95373wcoZWQ7XFymv2YeC8L3LL4B98DXA/ek+bcVxJK6oMIauWSnLY4egFgFvIeegXUaeHqDdYYeCxW+Xvc29zEF9wYH+zb3MVhd9xP7PAULFbYdb21lZadush/3YRazmx1jZHBtZWWmbrIfDhXHtq/Ew2CwT05hZlNStWfIH7kEcnicqaienaSjn3lubXd6cx8OmAqBfYZ9G3V1C8vNwODLAfc82PcA2gP3iQv3Oh3EiAsSyetD9wEi6AtlG0FGSyAf4YwVza2vtKKhhHmhHvsmB3N2dYJyG1xwrc8fDve03wHZ+FAD2fe0FfhQ3/xQBg5Rtm3Cp7OXnaEeccEFgwsV5QZ7CguuCosLAfeG9wgDC9kd9yz3vAP3j/jRFe1sHTUGDvcQtNHi9w4a6GbERFdfaVRRt2y9kI+LjJAeikVhWTZpCA6UPQXpBgs5ChI+HRNg9zwKBhOg+OT3wPdsC/sA/OSDCosdaIBZhR6UWQXhkdeoyhq6bPcCCqyRmpudGwt/fx0L96D5Sq8dCxXVBqn3e473FAX7IAaO+xQFC1mtZ7q6ra+9vGmwXFxpZloeCzQdQh0LzR0Owby6ub0azVuyQPc7HZyimaIbrZ14bB8LXR0SwPcLC2qFfHx5GwvOk8WmyhrAW6khjx5/TgXDiKSsHW6EHg4V957X+54GDvtc+nwBCxXgBjL3MgX7DQYOccEFg36Ahn0bdHaZp66gr7qjH/h/+9ww92kHC/dxB7Szsp2wG9utUSn7AwvL4MDNywH3PNn3AdgD98kLGlC6a8aps5mdoR4L98DpHfyu+1QGCxXIBrGTl5uhGwu29wv3qPcLC/eK/OT3bAsazray17mseW6oHsvKBbtgUqk6G/sWMUH7DAsVnvcujMoFPgaQ+20FDl2ubLofC/cEAfeJ9wID94kLPh0BNB0DCxX7EQY2+wgF6QYLFfuZP/eZBg6hsBrAWqwL9xIdf3cLWHBwZmQaC/eK/Rr3bAvds73Kkh8LTQr1dgsToPIdBhNg9wsK+4oLBekH+yyEkvc7BS0Gkvs7+yySBS0H9ywL9B3A9wsL4R33evcIC7loq1xcaGtdC3/LHQuUPQXp+FgGC93WCgsG7vcyBQvls87Njh9UBmOFdGlaG1tzrbOFH1UGCxLS9wMLqR209x0KtvcLd8j3Vsh39wsLuQRzd6Cpqp+go6Sfdmxtd3ZyHw71HfcQC/h/Afe24AP4CwtNCtTaCgsV1Abn9ycFLAYL9wj3bvcIC4H3AwUsBgug9x8dC21uwVobC/D4cPAL5Apf9wgSn/jEE+wLoPczCr33CAHf9wj3efcGAwv3M9DAoK3BHmfGBXFlZHxQG/sMJQv4fxVJhgU1zfwk9wf4JOvmK8AHxAtaHQ73wPcAC3Md1NVy1PcAHfdlyGL3Awv3Ph22UlJhYFEeDpHXqMoatHGfapceC6BGHb33AguL6veR6rt3C9gdDgGf+MQDC/0a9wAL0/eOFQv7kvroAVX5WAPB+eoV+wD7AAYL9wAKDs8K93j3BwvzAffGxgP3kgv3EFX3CBIL6R39Ggv7AAYO6B33wPceHQv3LffcFeD3yEgGCxWpBvve+LoFWQcLTwq4HQuDgH6FfRt0dZioC4LVBSwGC1wHxKZ9bnF0f25raZyfdx8L9ywKDqM8lB4Os2BMqzcb+yD7FyX7i/tqC/cA+4r5GvcRCum01NOP90EdC+n4qeYS93b3Bwv3bPdQ+2wGC8BW4hL3LeALwAoSC9dJ2OHYSNgL+Ro+HQsGhjAFZAcL+4oGDhL3WvdEmPcILfcIE/S9C/2CFb0H/Dj5UAVtBvhWCxNg/Rr7igcO+2z9GvcNCl5qZ0kL/CwGDk0K1D8dC/cLEvco9wty9why9wsLAffA98AD98D7XBX3wAuhaWlzdWtqo3atHw64rK/Nkh9WBgsV9wX3bPsFBgsB9133WgP3XQsB9zkdA/fAC/lU9wgBC9Vy1BILBfsMBgt2+CTmCxVZuthj9wEb9xb3BAuexxq6YqUtjh6BWAUL+W9mHQseoeEFlHVrk2cb+wgLlqMbvKBnTUNqaWB4C9MBs93q4vcz4AP4uAv30fs49wD3OOUHDrVgxMS1tgupHbEL+8D45PsAC/tzvfdWdgsB9zv3ngML9xIKhB8LXL7RYvcEG/cT9wgL+VXCuJgB9z/3lgMLqadhuhu4rbHNkh8L9x4d+OT3wPdsBgv3VPyu9wD5GvvABgvvCoMKdveU5/dp6Av3AK/JdckSC/ds93L7bAYL9zgdEgsG6fsIBQvt+F7tC/dOFqoL+x0fE/Q3B/cxwQsS5/cHnvc4p/cHC3MK98DoCgsVVbFnvLyxr8EeCxXBZa9aWmVnVR4L9y/3GwoLdKJsbAu+y5IfCwAAAAJYADAAAAAUAF0APABLAGgAeQAwAEgAVABGAFMAeABJAEoAKwBXACsAVAA6ACQASAAcAAcAJAAbAD0ARwBSAEkANQA+AFwAPgBSAFQAMQBaAEcAMABSADUAUgA1AIIAPgA7AEYAKQAGADMAKABHABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABT//gASADwAPAA8ADwAPABLAEsASwAJAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaAAwADAAMAAwADAAMAAwAEgASABIAAYAVABUAFQAVABUAFQAVABUAFQAVABUAFQARgBTAHgAeAB4AHgAeAA8AHgAKwBJAEoASgBKAEoASgBKAEoAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAmABoAKwArACsAKwArACsAKwBUAFQAVABUAFQAVAA6ADoAOgA6ADoAOgA6AEcAJAAkACQAJAAkAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASABIAEgASAAHAAcABwAHABsAGwAbABsAGwAbABsAGwA9AD0APQA9AAkAVwA8AEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcARwBHAEcAEAANAEkASQBJAEkASQAlADUANQA1AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+//sAUgBSAA0AVABUAFQAVABUAFQAVABUAFQAVABUAFQAVAAxAFoAWgBHAEcAGwBHAEcARwBHAEcAMABSAFIAUgBSAFIAUgBS/94ANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1AAsANQA1ADUANQA1ADUANQCCAGwAggB4AHgARgA+AD4APgA+AD4APgA+AEoAOwA7ADsAOwA7ADsARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAEYARgBGAAYABgAGAAYAKAAoACgAKAAoACgAKAAoAEcARwBHAEcANQBSADEAUwA1AFIAOAA6AD4ANQBEACcAOgA0ACkABgAnABQAHQAiADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUANQA1ADUAIABAAFoAPAAyACUAMwBEAEIAQAA8AEAAWgA8ADIAJQAzAEUAQgBAADwAyQC9AMkAvQAPANUA1QBoAHEA5gBqAMQA0gBIAFYA0gBWALoAyQA+AE0ATgBOAFAAFABQABQAyQCQADwAwgB8ANUAZgBxAGYAVgD5AFYA+QBKAGwAbABRADwAGAAYAGr/9wADACgAKABOAF4AgQCBAEoAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAJwAygCmAKgApgCoAKgAtACqAKgA4QDOAPUA6wCcAMoApACoAKYAqACpALQAqgCoAOEAzgD1AOsAnADKAKYAqACmAKgAqAC0AKoAqADhAM4A9QDrAKEAhQCJAKEAowCvAIUAmgC+AI0ApQCsAIgArgC9AHsApQCJAKMAhQDlAJkAnQCXAIUAUwCNAIYAlQCaAJoAlwCFAIUApQAvAEoASQAqADMAaAAwAFcASQAlACAAZAAgAEsAVwBiAC4AFgAWABYAFwAnABYAFgAlABYAFgAWABYAFgAWAE4ATgBdAE4AxwBOAHYAZgBOAE4ATgBiAE4AQABAAE4AGv/3AEYARACmADAAGQAUAEAAJgBfABoADwAgAB4AIAC/AJMAbACcAB4AHgBAAEAAHgAeABkAGf/l/+X/9QBBAFgA8wCLAMQA0gDvANYApADiAJgAmADsAKoA4gCjAOwAkACDAKoAoQDFALwA2gDSAOAApACZAOIA7QCYAJQAkACOAKoApwChAKoA2gDlAIMAlADjAOMAxQDFALwAsQCYAJQAWABYAPAA+AEjANoAlADOAM4AywDgAN4ApwCpAJoAmgCaAJoAmgCUAJoAmgCsAJwArACcAKwAnACiAJwApwCrAKcAqwCnAKsAogCdAKQAnAEBAN4AAAAAAAAAAP/K/8oA9gDAACEAIQD2AMAAEgASAPYAwAD2APYAwADA/8r/yv/K/8oA9gD2AMAAwP/K/8r/yv/KAPYA9gDAAMAAwADAAMAAwP/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAEsASwD2AMD/ygCKAPYAigCK/8r/yv/KAPYAigCK/8r/yv/KAPYAigCK/8r/yv/K/8r/yv/K/8r/yv/K/8r/yv/KAPb/yv/KAPb/yv/K/8r/ygD2APYA9v/KAMAA9gDA/8oAwP/KAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAA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ASoCpAABAUYCpAABAU0CpAABAUsCpAABASsCpAABAUECpAABATwCpAABAMECpAABATICpAABAToCpAABAS8CqQABATACpAABATUCpAABATsCpAABATcCAQABAJEC2gABAVYCAQABAb0C2gABAToCAQABAaAC5QABATICAQABAJcC2gABAVoCxQABAKwC2gABARUC2gABAT8CAgABATwCAQABAT4CAQABATACAQABAVQCAQABATQCAQABAQgCigABAScCAQABAS4CAQABAS0CAQABAUICAQABAa8CtgABAS8CpAABAZECpAABAT4CpAABATkCAQABAVoCAQABAT0CAQABATgCAQABATYCAQABARwCAQABASICAQABASUCAQABASoCAgABAZACAQABAPICAQABARoCAQABASwC1gABASwCxwABBEYETgABAAwAFgACAAAAGAAAABgABgAUABoADgAgACYALAABASwAAAABAVsAAAABATQAAAABAVUAAAABATgAAAABAXYAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAAngCYAJgAwgDmAOwAmADyAPgA5gD+AQQBCgDsARAA8gEWARwAzgEiAPgAngCYASgBLgE0AQQBOgDgAMgBQACYAUYBTACYAJgBUgEWAJgA4AFYAV4BZADIAVIAngCqAWoBcADIAXYBfADIAUABggGIAWQBjgABASz/6gABATb/6gABAVv/6gABASL/6gABAUb/6gABAMD/6gABAU//6gABASv/6gABAS7/6gABAUr/6gABAVP/6gABAJn/6gABAUD/6gABAS//6gABAST/6gABATf/6gABATL/6gABAVX/6gABATT/6gABATr/6gABASL/GwABAVr/6gABAO7/FwABAW7/6gABAIv/JgABAb//JgABAMr/6gABAXb/6gABAS3/6gABAQv/DwABAT3/6gABAUX/6gABATP/6gABAUP/6gABATj/6gABAcn/JgABASn/6gABAIH/6gABAW//6gABAQn/DwABAQD/6gABAcr/JgABAroCwAABAAwAEgABAAAADgADAA4AFAAaAAEBLAHrAAEBpgKEAAEB/AKYAAEBnQHrAAECmAKgAAEADAAWAAIAAAAk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) format('truetype');
40}
41@font-face {
42 font-family: 'Source Code Pro';
43 font-style: normal;
44 font-weight: 700;
45 //src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqbsbIrGiHa6JIepkyt5c0A0.ttf) format('truetype');
46 src: local('Source Code Pro Bold'), local('SourceCodePro-Bold'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAAUlwAAAAOkNGRiAHSupxAABIqAAA5CBEU0lHE/UMPwABSawAACBYR0RFRi8sL9AAATRQAAAA1EdQT1MlBRrrAAFAWAAACRhHU1VC3Z7yFQABNSQAAAsyT1MvMnQA0tUAAAFQAAAAYGNtYXDp1MYJAAA+eAAAChBoZWFk+7+HegAAAOwAAAA2aGhlYQZXAOAAAAEkAAAAJGhtdHiJeIp6AAEsyAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZU1Di90AAAGwAAA8x3Bvc3T/uAAzAABIiAAAACAAAQAAAAEEWmW2IDdfDzz1AAMD6AAAAADNFZ/0AAAAAM0Vn/T/u/5wAsED6AABAAMAAgAAAAAAAAABAAAD2P7vAAACWP+7/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAK8AAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwcJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAIAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAIgGeAAEAAAAAAAAARQAAAAEAAAAAAAEADwBFAAEAAAAAAAIABABUAAEAAAAAAAMAIwBYAAEAAAAAAAQAFAB7AAEAAAAAAAUAOQCPAAEAAAAAAAYAEgDIAAEAAAAAAAcAYADaAAEAAAAAAAgAGgE6AAEAAAAAAAkADAFUAAEAAAAAAAsAGQFgAAEAAAAAAA0R2QF5AAEAAAAAAA4AJBNSAAEAAAAAAQAAFhN2AAEAAAAAAQEACxOMAAEAAAAAAQIACxOXAAEAAAAAAQMAFROiAAMAAQQJAAAAihO3AAMAAQQJAAEAHhRBAAMAAQQJAAIACBRfAAMAAQQJAAMARhRnAAMAAQQJAAQAKBStAAMAAQQJAAUAchTVAAMAAQQJAAYAJBVHAAMAAQQJAAcAwBVrAAMAAQQJAAgANBYrAAMAAQQJAAkAGBZfAAMAAQQJAAsAMhZ3AAMAAQQJAA0jthapAAMAAQQJAA4ASDpfAAMAAQQJAQAALDqnAAMAAQQJAQEAFjrTAAMAAQQJAQIAFjrpAAMAAQQJAQMAKjr/Q29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvQm9sZDEuMDE3O0FEQkU7U291cmNlQ29kZVByby1Cb2xkO0FET0JFU291cmNlIENvZGUgUHJvIEJvbGRWZXJzaW9uIDEuMDE3O1BTIDEuMDAwO2hvdGNvbnYgMS4wLjcwO21ha2VvdGYubGliMi41LjU5MDBTb3VyY2VDb2RlUHJvLUJvbGRTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxUeXBvZ3JhcGhpYyBhbHRlcm5hdGVzQWx0ZXJuYXRlIGFBbHRlcm5hdGUgZ0FsdGVybmF0ZSBkb2xsYXIgc2lnbgBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwBCAG8AbABkADEALgAwADEANwA7AEEARABCAEUAOwBTAG8AdQByAGMAZQBDAG8AZABlAFAAcgBvAC0AQgBvAGwAZAA7AEEARABPAEIARQBTAG8AdQByAGMAZQAgAEMAbwBkAGUAIABQAHIAbwAgAEIAbwBsAGQAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbwBsAGQAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4AQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkAFAAYQB1AGwAIABEAC4AIABIAHUAbgB0AGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMQAwACwAIAAyADAAMQAyACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAKABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBkAG8AYgBlAC4AYwBvAG0ALwApACwAIAB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIAAnAFMAbwB1AHIAYwBlACcALgAgAEEAbABsACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAgAFMAbwB1AHIAYwBlACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAAQQBkAG8AYgBlACAAUwB5AHMAdABlAG0AcwAgAEkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaQBuACAAdABoAGUAIABVAG4AaQB0AGUAZAAgAFMAdABhAHQAZQBzACAAYQBuAGQALwBvAHIAIABvAHQAaABlAHIAIABjAG8AdQBuAHQAcgBpAGUAcwAuAA0ACgANAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgANAAoADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYwBvAHAAaQBlAGQAIABiAGUAbABvAHcALAAgAGEAbgBkACAAaQBzACAAYQBsAHMAbwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAA0ACgANAAoALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgBTAEkATAAgAE8AUABFAE4AIABGAE8ATgBUACAATABJAEMARQBOAFMARQAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAgAC0AIAAyADYAIABGAGUAYgByAHUAYQByAHkAIAAyADAAMAA3AA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAA0ACgBQAFIARQBBAE0AQgBMAEUADQAKAFQAaABlACAAZwBvAGEAbABzACAAbwBmACAAdABoAGUAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUAIAAoAE8ARgBMACkAIABhAHIAZQAgAHQAbwAgAHMAdABpAG0AdQBsAGEAdABlACAAdwBvAHIAbABkAHcAaQBkAGUAIABkAGUAdgBlAGwAbwBwAG0AZQBuAHQAIABvAGYAIABjAG8AbABsAGEAYgBvAHIAYQB0AGkAdgBlACAAZgBvAG4AdAAgAHAAcgBvAGoAZQBjAHQAcwAsACAAdABvACAAcwB1AHAAcABvAHIAdAAgAHQAaABlACAAZgBvAG4AdAAgAGMAcgBlAGEAdABpAG8AbgAgAGUAZgBmAG8AcgB0AHMAIABvAGYAIABhAGMAYQBkAGUAbQBpAGMAIABhAG4AZAAgAGwAaQBuAGcAdQBpAHMAdABpAGMAIABjAG8AbQBtAHUAbgBpAHQAaQBlAHMALAAgAGEAbgBkACAAdABvACAAcAByAG8AdgBpAGQAZQAgAGEAIABmAHIAZQBlACAAYQBuAGQAIABvAHAAZQBuACAAZgByAGEAbQBlAHcAbwByAGsAIABpAG4AIAB3AGgAaQBjAGgAIABmAG8AbgB0AHMAIABtAGEAeQAgAGIAZQAgAHMAaABhAHIAZQBkACAAYQBuAGQAIABpAG0AcAByAG8AdgBlAGQAIABpAG4AIABwAGEAcgB0AG4AZQByAHMAaABpAHAAIAB3AGkAdABoACAAbwB0AGgAZQByAHMALgANAAoADQAKAFQAaABlACAATwBGAEwAIABhAGwAbABvAHcAcwAgAHQAaABlACAAbABpAGMAZQBuAHMAZQBkACAAZgBvAG4AdABzACAAdABvACAAYgBlACAAdQBzAGUAZAAsACAAcwB0AHUAZABpAGUAZAAsACAAbQBvAGQAaQBmAGkAZQBkACAAYQBuAGQAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAZgByAGUAZQBsAHkAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAGUAeQAgAGEAcgBlACAAbgBvAHQAIABzAG8AbABkACAAYgB5ACAAdABoAGUAbQBzAGUAbAB2AGUAcwAuACAAVABoAGUAIABmAG8AbgB0AHMALAAgAGkAbgBjAGwAdQBkAGkAbgBnACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzACwAIABjAGEAbgAgAGIAZQAgAGIAdQBuAGQAbABlAGQALAAgAGUAbQBiAGUAZABkAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAgAHAAcgBvAHYAaQBkAGUAZAAgAHQAaABhAHQAIABhAG4AeQAgAHIAZQBzAGUAcgB2AGUAZAAgAG4AYQBtAGUAcwAgAGEAcgBlACAAbgBvAHQAIAB1AHMAZQBkACAAYgB5ACAAZABlAHIAaQB2AGEAdABpAHYAZQAgAHcAbwByAGsAcwAuACAAVABoAGUAIABmAG8AbgB0AHMAIABhAG4AZAAgAGQAZQByAGkAdgBhAHQAaQB2AGUAcwAsACAAaABvAHcAZQB2AGUAcgAsACAAYwBhAG4AbgBvAHQAIABiAGUAIAByAGUAbABlAGEAcwBlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAHQAeQBwAGUAIABvAGYAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQAgAHIAZQBxAHUAaQByAGUAbQBlAG4AdAAgAGYAbwByACAAZgBvAG4AdABzACAAdABvACAAcgBlAG0AYQBpAG4AIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGQAbwBlAHMAIABuAG8AdAAgAGEAcABwAGwAeQAgAHQAbwAgAGEAbgB5ACAAZABvAGMAdQBtAGUAbgB0ACAAYwByAGUAYQB0AGUAZAAgAHUAcwBpAG4AZwAgAHQAaABlACAAZgBvAG4AdABzACAAbwByACAAdABoAGUAaQByACAAZABlAHIAaQB2AGEAdABpAHYAZQBzAC4ADQAKAA0ACgBEAEUARgBJAE4ASQBUAEkATwBOAFMADQAKACIARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIAB0AGgAZQAgAHMAZQB0ACAAbwBmACAAZgBpAGwAZQBzACAAcgBlAGwAZQBhAHMAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABhAG4AZAAgAGMAbABlAGEAcgBsAHkAIABtAGEAcgBrAGUAZAAgAGEAcwAgAHMAdQBjAGgALgAgAFQAaABpAHMAIABtAGEAeQAgAGkAbgBjAGwAdQBkAGUAIABzAG8AdQByAGMAZQAgAGYAaQBsAGUAcwAsACAAYgB1AGkAbABkACAAcwBjAHIAaQBwAHQAcwAgAGEAbgBkACAAZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAuAA0ACgANAAoAIgBSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAG4AYQBtAGUAcwAgAHMAcABlAGMAaQBmAGkAZQBkACAAYQBzACAAcwB1AGMAaAAgAGEAZgB0AGUAcgAgAHQAaABlACAAYwBvAHAAeQByAGkAZwBoAHQAIABzAHQAYQB0AGUAbQBlAG4AdAAoAHMAKQAuAA0ACgANAAoAIgBPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAYwBvAGwAbABlAGMAdABpAG8AbgAgAG8AZgAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAYQBzACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApAC4ADQAKAA0ACgAiAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAYQBuAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAbQBhAGQAZQAgAGIAeQAgAGEAZABkAGkAbgBnACAAdABvACwAIABkAGUAbABlAHQAaQBuAGcALAAgAG8AcgAgAHMAdQBiAHMAdABpAHQAdQB0AGkAbgBnACAALQAtACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAgAC0ALQAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABjAG8AbQBwAG8AbgBlAG4AdABzACAAbwBmACAAdABoAGUAIABPAHIAaQBnAGkAbgBhAGwAIABWAGUAcgBzAGkAbwBuACwAIABiAHkAIABjAGgAYQBuAGcAaQBuAGcAIABmAG8AcgBtAGEAdABzACAAbwByACAAYgB5ACAAcABvAHIAdABpAG4AZwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHQAbwAgAGEAIABuAGUAdwAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAAuAA0ACgANAAoAIgBBAHUAdABoAG8AcgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQBzAGkAZwBuAGUAcgAsACAAZQBuAGcAaQBuAGUAZQByACwAIABwAHIAbwBnAHIAYQBtAG0AZQByACwAIAB0AGUAYwBoAG4AaQBjAGEAbAAgAHcAcgBpAHQAZQByACAAbwByACAAbwB0AGgAZQByACAAcABlAHIAcwBvAG4AIAB3AGgAbwAgAGMAbwBuAHQAcgBpAGIAdQB0AGUAZAAgAHQAbwAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAuAA0ACgANAAoAUABFAFIATQBJAFMAUwBJAE8ATgAgACYAIABDAE8ATgBEAEkAVABJAE8ATgBTAA0ACgBQAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAaABlAHIAZQBiAHkAIABnAHIAYQBuAHQAZQBkACwAIABmAHIAZQBlACAAbwBmACAAYwBoAGEAcgBnAGUALAAgAHQAbwAgAGEAbgB5ACAAcABlAHIAcwBvAG4AIABvAGIAdABhAGkAbgBpAG4AZwAgAGEAIABjAG8AcAB5ACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIAB0AG8AIAB1AHMAZQAsACAAcwB0AHUAZAB5ACwAIABjAG8AcAB5ACwAIABtAGUAcgBnAGUALAAgAGUAbQBiAGUAZAAsACAAbQBvAGQAaQBmAHkALAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlACwAIABhAG4AZAAgAHMAZQBsAGwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHUAbgBtAG8AZABpAGYAaQBlAGQAIABjAG8AcABpAGUAcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAcwB1AGIAagBlAGMAdAAgAHQAbwAgAHQAaABlACAAZgBvAGwAbABvAHcAaQBuAGcAIABjAG8AbgBkAGkAdABpAG8AbgBzADoADQAKAA0ACgAxACkAIABOAGUAaQB0AGgAZQByACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbgBvAHIAIABhAG4AeQAgAG8AZgAgAGkAdABzACAAaQBuAGQAaQB2AGkAZAB1AGEAbAAgAGMAbwBtAHAAbwBuAGUAbgB0AHMALAAgAGkAbgAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAsACAAbQBhAHkAIABiAGUAIABzAG8AbABkACAAYgB5ACAAaQB0AHMAZQBsAGYALgANAAoADQAKADIAKQAgAE8AcgBpAGcAaQBuAGEAbAAgAG8AcgAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AcwAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAG0AYQB5ACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGEAbgBkAC8AbwByACAAcwBvAGwAZAAgAHcAaQB0AGgAIABhAG4AeQAgAHMAbwBmAHQAdwBhAHIAZQAsACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGUAYQBjAGgAIABjAG8AcAB5ACAAYwBvAG4AdABhAGkAbgBzACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAG4AbwB0AGkAYwBlACAAYQBuAGQAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAcwBlACAAYwBhAG4AIABiAGUAIABpAG4AYwBsAHUAZABlAGQAIABlAGkAdABoAGUAcgAgAGEAcwAgAHMAdABhAG4AZAAtAGEAbABvAG4AZQAgAHQAZQB4AHQAIABmAGkAbABlAHMALAAgAGgAdQBtAGEAbgAtAHIAZQBhAGQAYQBiAGwAZQAgAGgAZQBhAGQAZQByAHMAIABvAHIAIABpAG4AIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAgAG0AYQBjAGgAaQBuAGUALQByAGUAYQBkAGEAYgBsAGUAIABtAGUAdABhAGQAYQB0AGEAIABmAGkAZQBsAGQAcwAgAHcAaQB0AGgAaQBuACAAdABlAHgAdAAgAG8AcgAgAGIAaQBuAGEAcgB5ACAAZgBpAGwAZQBzACAAYQBzACAAbABvAG4AZwAgAGEAcwAgAHQAaABvAHMAZQAgAGYAaQBlAGwAZABzACAAYwBhAG4AIABiAGUAIABlAGEAcwBpAGwAeQAgAHYAaQBlAHcAZQBkACAAYgB5ACAAdABoAGUAIAB1AHMAZQByAC4ADQAKAA0ACgAzACkAIABOAG8AIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIAB1AHMAZQAgAHQAaABlACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAKABzACkAIAB1AG4AbABlAHMAcwAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuACAAaQBzACAAZwByAGEAbgB0AGUAZAAgAGIAeQAgAHQAaABlACAAYwBvAHIAcgBlAHMAcABvAG4AZABpAG4AZwAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIALgAgAFQAaABpAHMAIAByAGUAcwB0AHIAaQBjAHQAaQBvAG4AIABvAG4AbAB5ACAAYQBwAHAAbABpAGUAcwAgAHQAbwAgAHQAaABlACAAcAByAGkAbQBhAHIAeQAgAGYAbwBuAHQAIABuAGEAbQBlACAAYQBzACAAcAByAGUAcwBlAG4AdABlAGQAIAB0AG8AIAB0AGgAZQAgAHUAcwBlAHIAcwAuAA0ACgANAAoANAApACAAVABoAGUAIABuAGEAbQBlACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAbwByACAAdABoAGUAIABBAHUAdABoAG8AcgAoAHMAKQAgAG8AZgAgAHQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAHMAaABhAGwAbAAgAG4AbwB0ACAAYgBlACAAdQBzAGUAZAAgAHQAbwAgAHAAcgBvAG0AbwB0AGUALAAgAGUAbgBkAG8AcgBzAGUAIABvAHIAIABhAGQAdgBlAHIAdABpAHMAZQAgAGEAbgB5ACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAsACAAZQB4AGMAZQBwAHQAIAB0AG8AIABhAGMAawBuAG8AdwBsAGUAZABnAGUAIAB0AGgAZQAgAGMAbwBuAHQAcgBpAGIAdQB0AGkAbwBuACgAcwApACAAbwBmACAAdABoAGUAIABDAG8AcAB5AHIAaQBnAGgAdAAgAEgAbwBsAGQAZQByACgAcwApACAAYQBuAGQAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwByACAAdwBpAHQAaAAgAHQAaABlAGkAcgAgAGUAeABwAGwAaQBjAGkAdAAgAHcAcgBpAHQAdABlAG4AIABwAGUAcgBtAGkAcwBzAGkAbwBuAC4ADQAKAA0ACgA1ACkAIABUAGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAG0AbwBkAGkAZgBpAGUAZAAgAG8AcgAgAHUAbgBtAG8AZABpAGYAaQBlAGQALAAgAGkAbgAgAHAAYQByAHQAIABvAHIAIABpAG4AIAB3AGgAbwBsAGUALAAgAG0AdQBzAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABlAG4AdABpAHIAZQBsAHkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAsACAAYQBuAGQAIABtAHUAcwB0ACAAbgBvAHQAIABiAGUAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIAB1AG4AZABlAHIAIABhAG4AeQAgAG8AdABoAGUAcgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBUAEUAUgBNAEkATgBBAFQASQBPAE4ADQAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYgBlAGMAbwBtAGUAcwAgAG4AdQBsAGwAIABhAG4AZAAgAHYAbwBpAGQAIABpAGYAIABhAG4AeQAgAG8AZgAgAHQAaABlACAAYQBiAG8AdgBlACAAYwBvAG4AZABpAHQAaQBvAG4AcwAgAGEAcgBlACAAbgBvAHQAIABtAGUAdAAuAA0ACgANAAoARABJAFMAQwBMAEEASQBNAEUAUgANAAoAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFACAASQBTACAAUABSAE8AVgBJAEQARQBEACAAIgBBAFMAIABJAFMAIgAsACAAVwBJAFQASABPAFUAVAAgAFcAQQBSAFIAQQBOAFQAWQAgAE8ARgAgAEEATgBZACAASwBJAE4ARAAsACAARQBYAFAAUgBFAFMAUwAgAE8AUgAgAEkATQBQAEwASQBFAEQALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQgBVAFQAIABOAE8AVAAgAEwASQBNAEkAVABFAEQAIABUAE8AIABBAE4AWQAgAFcAQQBSAFIAQQBOAFQASQBFAFMAIABPAEYAIABNAEUAUgBDAEgAQQBOAFQAQQBCAEkATABJAFQAWQAsACAARgBJAFQATgBFAFMAUwAgAEYATwBSACAAQQAgAFAAQQBSAFQASQBDAFUATABBAFIAIABQAFUAUgBQAE8AUwBFACAAQQBOAEQAIABOAE8ATgBJAE4ARgBSAEkATgBHAEUATQBFAE4AVAAgAE8ARgAgAEMATwBQAFkAUgBJAEcASABUACwAIABQAEEAVABFAE4AVAAsACAAVABSAEEARABFAE0AQQBSAEsALAAgAE8AUgAgAE8AVABIAEUAUgAgAFIASQBHAEgAVAAuACAASQBOACAATgBPACAARQBWAEUATgBUACAAUwBIAEEATABMACAAVABIAEUAIABDAE8AUABZAFIASQBHAEgAVAAgAEgATwBMAEQARQBSACAAQgBFACAATABJAEEAQgBMAEUAIABGAE8AUgAgAEEATgBZACAAQwBMAEEASQBNACwAIABEAEEATQBBAEcARQBTACAATwBSACAATwBUAEgARQBSACAATABJAEEAQgBJAEwASQBUAFkALAAgAEkATgBDAEwAVQBEAEkATgBHACAAQQBOAFkAIABHAEUATgBFAFIAQQBMACwAIABTAFAARQBDAEkAQQBMACwAIABJAE4ARABJAFIARQBDAFQALAAgAEkATgBDAEkARABFAE4AVABBAEwALAAgAE8AUgAgAEMATwBOAFMARQBRAFUARQBOAFQASQBBAEwAIABEAEEATQBBAEcARQBTACwAIABXAEgARQBUAEgARQBSACAASQBOACAAQQBOACAAQQBDAFQASQBPAE4AIABPAEYAIABDAE8ATgBUAFIAQQBDAFQALAAgAFQATwBSAFQAIABPAFIAIABPAFQASABFAFIAVwBJAFMARQAsACAAQQBSAEkAUwBJAE4ARwAgAEYAUgBPAE0ALAAgAE8AVQBUACAATwBGACAAVABIAEUAIABVAFMARQAgAE8AUgAgAEkATgBBAEIASQBMAEkAVABZACAAVABPACAAVQBTAEUAIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABPAFIAIABGAFIATwBNACAATwBUAEgARQBSACAARABFAEEATABJAE4ARwBTACAASQBOACAAVABIAEUAIABGAE8ATgBUACAAUwBPAEYAVABXAEEAUgBFAC4ADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvAHQAeQBwAGUALwBsAGUAZwBhAGwALgBoAHQAbQBsAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAADAAAAAwAAAhQAAQAAAAAAHAADAAEAAAIUAAYB+AAAAAkA9wABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQHmAesCFQJ2AokBzAHqAf8CAAIJApQB4gH2AeECBQHNAc4BzwHQAdEB0gHTAdQB1QHWAeMB5AKaApkCmwHoAhMAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbAgECBwICAp8B/gLLABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQIDAgYCBAKhAAAAOgA9AE4AWACMAJUAwQDoAOcA6QDrAOoA7gD/AQkBCAEKAQwBJQEkASYBKAE/AUYBRQFHAUkBSAFzAXIBdAF2AgoCdAJ6AncCDAH9Ag0BawIQAg4CEQLMAtUCoABMAKECpQKeApwCnQJ4AqYCpwKsAq0CpAKoAlICVAAAAP0BVQHpAecCowKpAnsCogKqAfQB9QHlAx8ANgA5AJQAogFWAfgB+QHuAe8B7AHtApcCxAGQANsChgJ5AfIB8wGrAawCCwH8AfAB8QKKADgAWQA3AFsAVwB0AHUAdwBzAJIAkwAAAJEAvgC/AL0BMALNAtQC1gLXAtoC2ALbAtkC3ALOAAQH/AAAARYBAAAHABYALwA5AEAAWgBgAHoAfgC/AMQA0QDWAN8A5ADxAPYBMQFJAWUBfgGAAY8BkgGhAbAB3AHnAesCGwI3AkMCUgJUAlkCYQJlAm8CeQKHAo4CngKwArMCuAK8Ar8CzALdAuMDBAMMAw8DEwMbAyQDKAMuAzEDwB1DHUkdTR1QHVIdWB1bHZwdoB27Hg8eIR4lHiseOx5JHmMebx6FHo8ekx6XHp4e+SAHIBUgGiAeICIgJiAwIDMgOiBEIHEgeSB/IIkgjiCUIKEgpCCnIKwgsiC1ILohEyEXISAhIiEmIS4hVCFeIZMiAiIGIg8iEiIVIhoiHiIrIkgiYCJlJZ8loCWzJbclvSXBJcYlyiYRJmonEydS+wL//wAAACAAMAA6AEEAWwBhAHsAoADAAMUA0gDXAOAA5QDyAPcBNAFMAWgBgAGPAZIBoAGvAc0B5gHqAhgCNwJDAlACVAJYAmECZQJvAnkChwKMAp4CsAKyArcCuwK+AsYC2ALhAwADBgMPAxIDGwMjAyYDLgMxA8AdQx1HHU0dTx1SHVYdWx2cHaAdux4MHiAeJB4qHjYeQh5aHmwegB6OHpIelx6eHqAgByASIBggHCAgICYgMCAyIDkgRCBwIHQgfSCAII0glCChIKQgpiCrILEgtSC5IRMhFyEgISIhJiEuIVMhWyGQIgIiBiIPIhEiFSIZIh4iKyJIImAiZCUAJaAlsiW2JbwlwCXGJckmECZqJxMnUvsB//8AAAGdAAD/wQAA/7sAAAAA/3YAAP+/AAAABwAAAFMAAAAAAAAAAP9+/1cA6QAAAAAAAAAAAAAAAP9k/gr/TP9L/0j/Qf8+/zX/LP8f/xv/DP+sAAAAAAAMAAsABwAAAAAAAAAA/+b/5f/e/9cAAP/T/9H+5OUSAADlDgAA5REAAOUP5LvkuuSzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLa4hkAAOMZAAAAAAAAAADhv+Ja4pPhueJCAADhqgAA4ajhpeHd4dvh2eHYAADh0OHO4cvhm+D44PLg7+GF4YHhO+E14SDgpeCk4J4AAOByAADgh+B94FrgQOA43iPdFN0G3QTdANz+3O8AANyw3Fnbr9tlBqoAAQEWAAABMgAAATwAAAFEAUoAAAGGAAABnAAAAaoAAAHAAjQCXgKQAAAAAAAAArYCuAK6AtgC2gLcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyALKAAAAAAAAAsYC0ALUAtwAAAAAAAAAAALgAAAAAAAAAAAC3AAAAt4AAALeAAAAAAAAAAAC2gLgAuIC5ALmAvAC/gMQAxYDIAMiAAAAAAMgAAAD0APWA9oD3gAAAAAAAAAAAAAD2AAAA9gAAAAAAAAAAAAAAAAD0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAADtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeAAAAAAAAAAAAAAAAAAEB5gHrAhUCdgKJAcwB6gH/AgACCQKUAeIB9gHhAgUB4wHkApoCmQKbAegCEwIBAgcCAgKfAf4CywIDAgYCBAKhAx8B5wJ6AncCdQJ4AggCDALVAg4CUgH0AqMB9wIQAtYCdAKeAhwCHQLMAqYCDQH8AtsCGwJUAfUCiwKMAo0B6QA9AEwATgBXAFgAWQBbAHMAdAB1AHcA5ACMApYAoQC9AL4AvwDBANkA5QFrAO4A/QD/AQgBCQEKAQwBJAElASYBKAGZAT8ClwFVAXIBcwF0AXYBjgGaAZAAOwDsADwA7QBLAPwATwEAAFABAQBSAQMAUQECAFMBBABWAQcAXAENAF0BDgBeAQ8AZwEYAFoBCwBoARkAaQEaAGoBGwBrARwAbwEgAHIBIwB2AScAeAEpAHkBKgB+AS4AegEwAH8BMQCAATIBMwCBATQAgwE3AIIBNQCEATYAiAE7AIoBPQCNAUAAiwE+AUQAlgFKAJcBSwCYAUwAogFWAKoBXgCsAV8AqwFgALABZACxAWUAswFnALIBZgC5AW0AuAFsAMABdQDCAXcAwwF4AMQBeQDFAXoAzQGCANYBiwDaAY8A2wDgAZUA4gGXAOEBlgCjAVcAzgGDAD4A7wB7ASsAmQFNAMYBewDHAXwAyAF9AMkBfgDKAX8AbAEdAKkBXQC0AWgAugFuAl4CZgJrAm0C1wLaAtgC3ALUAtkCYAJnAmwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC/AL9Av8CVgJYAlkCXwJhAmQCaAJpAFQBBQBVAQYAbQEeAHABIQBxASIAhQE4AIYBOQCHAToAiQE8AI4BQQCPAUIAkAFDAK0BYQCuAWIArwFjALUBaQC2AWoAuwFvALwBcADUAYkA1QGKANcBjADcAZEA4wGYAD8A8ABAAPEAQQDyAEIA8wBDAPQARAD1AEUA9gBGAPcARwD4AEgA+QBJAPoASgD7AF8BEABgAREAYQESAGIBEwBjARQAZAEVAGUBFgBmARcAfAEsAH0BLQCaAU4AmwFPAJwBUACdAVEAngFSAJ8BUwCgAVQApAFYAKUBWQCmAVoApwFbAKgBXADLAYAAzAGBAM8BhADQAYUA0QGGANIBhwDTAYgA2AGNAN0BkgDeAZMA3wGUAfoB+AH5AfsB7AHtAfAB7gHvAfECCgILAf0CGgJdAiQCJQJiAoACeQKsApUCmAKpArYCxAADAAAAAAAA/7UAMgAAAAEAAAAAAAAAAAAAAAAAAAAAAQAEAgABAQETU291cmNlQ29kZVByby1Cb2xkAAEBAS769gD69wH6+AwA+vkC+voD+BQEjAwBRvwk+VX6fAUcMkMPHDS9EcsdAADOrhIC4AIAAQAIAA4AFQAcACMAKgAxADgAPwBGAE0AVABbAGIAaQBwAHcAfQCIAI4AmACeAKUArACyALgAvwDFAM8A1gDdAOQA6wDyAPkBAAEHAQ4BGQEfASkBMAE2AT0BSAFTAVoBYQFlAWsBcgF5AYMBigGRAZgBnwGqAbEBtwG9AcQByAHPAdYB3QHkAeoB8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW2xbqQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCb2xkU291cmNlIENvZGUgUHJvAS4CAAEASACAAKYAxwEKAVsBpAG+AfMCSwJlAm4CcgKMApYCswLXAuQC8AM/A0cDZAOLA64DswPNA9cEDQQZBCkELQQ6BIIEmQThBOwFdAWB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AEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAABAAEAAQABAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAACAEkAOgA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ABAABgBDAEMAQwBDAEMAGQAvAC8ALwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANAA0ADQANAA0ADQANP/uAEgASAAGAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AKgBMAEwAPgA+AAwAPgA+AD4APgA+ACQASABIAEgASABIAEgASP/SAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAMAC8ALwAvAC8ALwAvAC8AdABkAHQAaQBpAEEANQA1ADUANQA1ADUANQA9ADEAMQAxADEAMQAxAD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgA+AD4APgAEAAQABAAEAB8AHwAfAB8AHwAfAB8AHwBGAEYARgBGAC8ASAAqAEgALwBIADQANgA3AC8APAAgADQAMgAfAAQAHQAPAAcACwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvAC8ALwAvABcAOABSADMAKgAjAC4APAA+AD0ANQA4AFIAMwAqACMALgA9AD4APQA1ALgAtgC4ALb//wDIAMgAYgBnANcAUgC4AMoAMwBFAMoARQCvAMAAKgA7AEYARgBQABQAUAAUALgAiAA8ALUAfgDJAGkAagBpAEoA6wBKAOsAQABZAFkARwAwABMAEwBl//P/9wAfAB8ARgBUAHwAfABAAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCYAMQAngClAKEApQChALEApgCkANYAxwDtAOMAmADEAJwApQChAKUAogCxAKYApADWAMcA7QDjAJgAxACeAKUAoQClAKEAsQCmAKQA1gDHAO0A4wCaAIAAhQCaAJoAqgCAAJQAtwCFAJwAqQCFAKAAtgBzAJwAhQCaAIAA1gCRAJYAkAB2AFMAfACBAJcAlACUAJQAgACAAJwAJABAAEMAHwAtAGAALgBPAEMAGwAVAFsAFgBDAE8AWAAkABEAEQAR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) format('truetype');
47}
48@font-face {
49 font-family: 'Source Code Pro';
50 font-style: normal;
51 font-weight: 900;
52 //src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(https://themes.googleusercontent.com/static/fonts/sourcecodepro/v3/leqv3v-yTsJNC7nFznSMqRPPOa1q11iOmmM9mDHHHX4.ttf) format('truetype');
53 src: local('Source Code Pro Black'), local('SourceCodePro-Black'), url(data:font/ttf;charset=utf-8;base64,T1RUTwAOAIAAAwBgQkFTRYsZlLEAATq8AAAAOkNGRiDcZxQDAABI+AAA1VlEU0lHIymbLAABOvgAACBYR0RFRi8sL9AAASXcAAAA1EdQT1NOSdIWAAEx5AAACNZHU1VC3Z7yFQABJrAAAAsyT1MvMnTI07UAAAFQAAAAYGNtYXDp1MYJAAA+yAAAChBoZWFk+7OHeAAAAOwAAAA2aGhlYQZMAOAAAAEkAAAAJGhtdHh8E3yCAAEeVAAAB4htYXhwA8NQAAAAAUgAAAAGbmFtZbSud8oAAAGwAAA9GHBvc3T/uAAzAABI2AAAACAAAQAAAAEEWpUd6D1fDzz1AAMD6AAAAADNFZ/zAAAAAM0Vn/P/sP5wAsED6AAAAAMAAgAAAAAAAAABAAAD2P7vAAACWP+w/5cCwQABAAAAAAAAAAAAAAAAAAAAAQAAUAADwwAAAAMCWAOEAAUAAAKKAlgAAABLAooCWAAAAV4AMgEgAAACCwgJAwQDAgIEIAAABwAAGAEAAAAAAAAAAEFEQkUAAAAg+wIC7v8GAAAD2AERYAABkwAAAAAB4AKUAAAAIAADAAAAJgHOAAEAAAAAAAAARQAAAAEAAAAAAAEAFQBFAAEAAAAAAAIABwBaAAEAAAAAAAMAJABhAAEAAAAAAAQAFQBFAAEAAAAAAAUAOQCFAAEAAAAAAAYAEwC+AAEAAAAAAAcAYADRAAEAAAAAAAgAGgExAAEAAAAAAAkADAFLAAEAAAAAAAsAGQFXAAEAAAAAAA0R2QFwAAEAAAAAAA4AJBNJAAEAAAAAABAADxNtAAEAAAAAABEABRN8AAEAAAAAAQAAFhOBAAEAAAAAAQEACxOXAAEAAAAAAQIACxOiAAEAAAAAAQMAFROtAAMAAQQJAAAAihPCAAMAAQQJAAEAKhRMAAMAAQQJAAIADhR2AAMAAQQJAAMASBSEAAMAAQQJAAQAKhRMAAMAAQQJAAUAchTMAAMAAQQJAAYAJhU+AAMAAQQJAAcAwBVkAAMAAQQJAAgANBYkAAMAAQQJAAkAGBZYAAMAAQQJAAsAMhZwAAMAAQQJAA0jthaiAAMAAQQJAA4ASDpYAAMAAQQJABAAHjqgAAMAAQQJABEACjq+AAMAAQQJAQAALDrIAAMAAQQJAQEAFjr0AAMAAQQJAQIAFjsKAAMAAQQJAQMAKjsgQ29weXJpZ2h0IDIwMTAsIDIwMTIgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuU291cmNlIENvZGUgUHJvIEJsYWNrUmVndWxhcjEuMDE3O0FEQkU7U291cmNlQ29kZVByby1CbGFjaztBRE9CRVZlcnNpb24gMS4wMTc7UFMgMS4wMDA7aG90Y29udiAxLjAuNzA7bWFrZW90Zi5saWIyLjUuNTkwMFNvdXJjZUNvZGVQcm8tQmxhY2tTb3VyY2UgaXMgYSB0cmFkZW1hcmsgb2YgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kL29yIG90aGVyIGNvdW50cmllcy5BZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZFBhdWwgRC4gSHVudGh0dHA6Ly93d3cuYWRvYmUuY29tL3R5cGVDb3B5cmlnaHQgMjAxMCwgMjAxMiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCAoaHR0cDovL3d3dy5hZG9iZS5jb20vKSwgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUgJ1NvdXJjZScuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLg0KDQpUaGlzIEZvbnQgU29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNJTCBPcGVuIEZvbnQgTGljZW5zZSwgVmVyc2lvbiAxLjEuDQoNClRoaXMgbGljZW5zZSBpcyBjb3BpZWQgYmVsb3csIGFuZCBpcyBhbHNvIGF2YWlsYWJsZSB3aXRoIGEgRkFRIGF0OiBodHRwOi8vc2NyaXB0cy5zaWwub3JnL09GTA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KU0lMIE9QRU4gRk9OVCBMSUNFTlNFIFZlcnNpb24gMS4xIC0gMjYgRmVicnVhcnkgMjAwNw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KUFJFQU1CTEUNClRoZSBnb2FscyBvZiB0aGUgT3BlbiBGb250IExpY2Vuc2UgKE9GTCkgYXJlIHRvIHN0aW11bGF0ZSB3b3JsZHdpZGUgZGV2ZWxvcG1lbnQgb2YgY29sbGFib3JhdGl2ZSBmb250IHByb2plY3RzLCB0byBzdXBwb3J0IHRoZSBmb250IGNyZWF0aW9uIGVmZm9ydHMgb2YgYWNhZGVtaWMgYW5kIGxpbmd1aXN0aWMgY29tbXVuaXRpZXMsIGFuZCB0byBwcm92aWRlIGEgZnJlZSBhbmQgb3BlbiBmcmFtZXdvcmsgaW4gd2hpY2ggZm9udHMgbWF5IGJlIHNoYXJlZCBhbmQgaW1wcm92ZWQgaW4gcGFydG5lcnNoaXAgd2l0aCBvdGhlcnMuDQoNClRoZSBPRkwgYWxsb3dzIHRoZSBsaWNlbnNlZCBmb250cyB0byBiZSB1c2VkLCBzdHVkaWVkLCBtb2RpZmllZCBhbmQgcmVkaXN0cmlidXRlZCBmcmVlbHkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3Qgc29sZCBieSB0aGVtc2VsdmVzLiBUaGUgZm9udHMsIGluY2x1ZGluZyBhbnkgZGVyaXZhdGl2ZSB3b3JrcywgY2FuIGJlIGJ1bmRsZWQsIGVtYmVkZGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlIHByb3ZpZGVkIHRoYXQgYW55IHJlc2VydmVkIG5hbWVzIGFyZSBub3QgdXNlZCBieSBkZXJpdmF0aXZlIHdvcmtzLiBUaGUgZm9udHMgYW5kIGRlcml2YXRpdmVzLCBob3dldmVyLCBjYW5ub3QgYmUgcmVsZWFzZWQgdW5kZXIgYW55IG90aGVyIHR5cGUgb2YgbGljZW5zZS4gVGhlIHJlcXVpcmVtZW50IGZvciBmb250cyB0byByZW1haW4gdW5kZXIgdGhpcyBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvIGFueSBkb2N1bWVudCBjcmVhdGVkIHVzaW5nIHRoZSBmb250cyBvciB0aGVpciBkZXJpdmF0aXZlcy4NCg0KREVGSU5JVElPTlMNCiJGb250IFNvZnR3YXJlIiByZWZlcnMgdG8gdGhlIHNldCBvZiBmaWxlcyByZWxlYXNlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSB1bmRlciB0aGlzIGxpY2Vuc2UgYW5kIGNsZWFybHkgbWFya2VkIGFzIHN1Y2guIFRoaXMgbWF5IGluY2x1ZGUgc291cmNlIGZpbGVzLCBidWlsZCBzY3JpcHRzIGFuZCBkb2N1bWVudGF0aW9uLg0KDQoiUmVzZXJ2ZWQgRm9udCBOYW1lIiByZWZlcnMgdG8gYW55IG5hbWVzIHNwZWNpZmllZCBhcyBzdWNoIGFmdGVyIHRoZSBjb3B5cmlnaHQgc3RhdGVtZW50KHMpLg0KDQoiT3JpZ2luYWwgVmVyc2lvbiIgcmVmZXJzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZvbnQgU29mdHdhcmUgY29tcG9uZW50cyBhcyBkaXN0cmlidXRlZCBieSB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKS4NCg0KIk1vZGlmaWVkIFZlcnNpb24iIHJlZmVycyB0byBhbnkgZGVyaXZhdGl2ZSBtYWRlIGJ5IGFkZGluZyB0bywgZGVsZXRpbmcsIG9yIHN1YnN0aXR1dGluZyAtLSBpbiBwYXJ0IG9yIGluIHdob2xlIC0tIGFueSBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgT3JpZ2luYWwgVmVyc2lvbiwgYnkgY2hhbmdpbmcgZm9ybWF0cyBvciBieSBwb3J0aW5nIHRoZSBGb250IFNvZnR3YXJlIHRvIGEgbmV3IGVudmlyb25tZW50Lg0KDQoiQXV0aG9yIiByZWZlcnMgdG8gYW55IGRlc2lnbmVyLCBlbmdpbmVlciwgcHJvZ3JhbW1lciwgdGVjaG5pY2FsIHdyaXRlciBvciBvdGhlciBwZXJzb24gd2hvIGNvbnRyaWJ1dGVkIHRvIHRoZSBGb250IFNvZnR3YXJlLg0KDQpQRVJNSVNTSU9OICYgQ09ORElUSU9OUw0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGUgRm9udCBTb2Z0d2FyZSwgdG8gdXNlLCBzdHVkeSwgY29weSwgbWVyZ2UsIGVtYmVkLCBtb2RpZnksIHJlZGlzdHJpYnV0ZSwgYW5kIHNlbGwgbW9kaWZpZWQgYW5kIHVubW9kaWZpZWQgY29waWVzIG9mIHRoZSBGb250IFNvZnR3YXJlLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KMSkgTmVpdGhlciB0aGUgRm9udCBTb2Z0d2FyZSBub3IgYW55IG9mIGl0cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMsIGluIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zLCBtYXkgYmUgc29sZCBieSBpdHNlbGYuDQoNCjIpIE9yaWdpbmFsIG9yIE1vZGlmaWVkIFZlcnNpb25zIG9mIHRoZSBGb250IFNvZnR3YXJlIG1heSBiZSBidW5kbGVkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBzb2xkIHdpdGggYW55IHNvZnR3YXJlLCBwcm92aWRlZCB0aGF0IGVhY2ggY29weSBjb250YWlucyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBsaWNlbnNlLiBUaGVzZSBjYW4gYmUgaW5jbHVkZWQgZWl0aGVyIGFzIHN0YW5kLWFsb25lIHRleHQgZmlsZXMsIGh1bWFuLXJlYWRhYmxlIGhlYWRlcnMgb3IgaW4gdGhlIGFwcHJvcHJpYXRlIG1hY2hpbmUtcmVhZGFibGUgbWV0YWRhdGEgZmllbGRzIHdpdGhpbiB0ZXh0IG9yIGJpbmFyeSBmaWxlcyBhcyBsb25nIGFzIHRob3NlIGZpZWxkcyBjYW4gYmUgZWFzaWx5IHZpZXdlZCBieSB0aGUgdXNlci4NCg0KMykgTm8gTW9kaWZpZWQgVmVyc2lvbiBvZiB0aGUgRm9udCBTb2Z0d2FyZSBtYXkgdXNlIHRoZSBSZXNlcnZlZCBGb250IE5hbWUocykgdW5sZXNzIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBncmFudGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIENvcHlyaWdodCBIb2xkZXIuIFRoaXMgcmVzdHJpY3Rpb24gb25seSBhcHBsaWVzIHRvIHRoZSBwcmltYXJ5IGZvbnQgbmFtZSBhcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJzLg0KDQo0KSBUaGUgbmFtZShzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBvciB0aGUgQXV0aG9yKHMpIG9mIHRoZSBGb250IFNvZnR3YXJlIHNoYWxsIG5vdCBiZSB1c2VkIHRvIHByb21vdGUsIGVuZG9yc2Ugb3IgYWR2ZXJ0aXNlIGFueSBNb2RpZmllZCBWZXJzaW9uLCBleGNlcHQgdG8gYWNrbm93bGVkZ2UgdGhlIGNvbnRyaWJ1dGlvbihzKSBvZiB0aGUgQ29weXJpZ2h0IEhvbGRlcihzKSBhbmQgdGhlIEF1dGhvcihzKSBvciB3aXRoIHRoZWlyIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbi4NCg0KNSkgVGhlIEZvbnQgU29mdHdhcmUsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWQsIGluIHBhcnQgb3IgaW4gd2hvbGUsIG11c3QgYmUgZGlzdHJpYnV0ZWQgZW50aXJlbHkgdW5kZXIgdGhpcyBsaWNlbnNlLCBhbmQgbXVzdCBub3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgYW55IG90aGVyIGxpY2Vuc2UuIFRoZSByZXF1aXJlbWVudCBmb3IgZm9udHMgdG8gcmVtYWluIHVuZGVyIHRoaXMgbGljZW5zZSBkb2VzIG5vdCBhcHBseSB0byBhbnkgZG9jdW1lbnQgY3JlYXRlZCB1c2luZyB0aGUgRm9udCBTb2Z0d2FyZS4NCg0KVEVSTUlOQVRJT04NClRoaXMgbGljZW5zZSBiZWNvbWVzIG51bGwgYW5kIHZvaWQgaWYgYW55IG9mIHRoZSBhYm92ZSBjb25kaXRpb25zIGFyZSBub3QgbWV0Lg0KDQpESVNDTEFJTUVSDQpUSEUgRk9OVCBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIENPUFlSSUdIVCwgUEFURU5ULCBUUkFERU1BUkssIE9SIE9USEVSIFJJR0hULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIEZPTlQgU09GVFdBUkUgT1IgRlJPTSBPVEhFUiBERUFMSU5HUyBJTiBUSEUgRk9OVCBTT0ZUV0FSRS5odHRwOi8vd3d3LmFkb2JlLmNvbS90eXBlL2xlZ2FsLmh0bWxTb3VyY2UgQ29kZSBQcm9CbGFja1R5cG9ncmFwaGljIGFsdGVybmF0ZXNBbHRlcm5hdGUgYUFsdGVybmF0ZSBnQWx0ZXJuYXRlIGRvbGxhciBzaWduAEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAMAAsACAAMgAwADEAMgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuAFMAbwB1AHIAYwBlACAAQwBvAGQAZQAgAFAAcgBvACAAQgBsAGEAYwBrAFIAZQBnAHUAbABhAHIAMQAuADAAMQA3ADsAQQBEAEIARQA7AFMAbwB1AHIAYwBlAEMAbwBkAGUAUAByAG8ALQBCAGwAYQBjAGsAOwBBAEQATwBCAEUAVgBlAHIAcwBpAG8AbgAgADEALgAwADEANwA7AFAAUwAgADEALgAwADAAMAA7AGgAbwB0AGMAbwBuAHYAIAAxAC4AMAAuADcAMAA7AG0AYQBrAGUAbwB0AGYALgBsAGkAYgAyAC4ANQAuADUAOQAwADAAUwBvAHUAcgBjAGUAQwBvAGQAZQBQAHIAbwAtAEIAbABhAGMAawBTAG8AdQByAGMAZQAgAGkAcwAgAGEAIAB0AHIAYQBkAGUAbQBhAHIAawAgAG8AZgAgAEEAZABvAGIAZQAgAFMAeQBzAHQAZQBtAHMAIABJAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGkAbgAgAHQAaABlACAAVQBuAGkAdABlAGQAIABTAHQAYQB0AGUAcwAgAGEAbgBkAC8AbwByACAAbwB0AGgAZQByACAAYwBvAHUAbgB0AHIAaQBlAHMALgBBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAUABhAHUAbAAgAEQALgAgAEgAdQBuAHQAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQBDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAxADAALAAgADIAMAAxADIAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIAAoAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBhAGQAbwBiAGUALgBjAG8AbQAvACkALAAgAHcAaQB0AGgAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAgACcAUwBvAHUAcgBjAGUAJwAuACAAQQBsAGwAIABSAGkAZwBoAHQAcwAgAFIAZQBzAGUAcgB2AGUAZAAuACAAUwBvAHUAcgBjAGUAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABBAGQAbwBiAGUAIABTAHkAcwB0AGUAbQBzACAASQBuAGMAbwByAHAAbwByAGEAdABlAGQAIABpAG4AIAB0AGgAZQAgAFUAbgBpAHQAZQBkACAAUwB0AGEAdABlAHMAIABhAG4AZAAvAG8AcgAgAG8AdABoAGUAcgAgAGMAbwB1AG4AdAByAGkAZQBzAC4ADQAKAA0ACgBUAGgAaQBzACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGkAcwAgAGwAaQBjAGUAbgBzAGUAZAAgAHUAbgBkAGUAcgAgAHQAaABlACAAUwBJAEwAIABPAHAAZQBuACAARgBvAG4AdAAgAEwAaQBjAGUAbgBzAGUALAAgAFYAZQByAHMAaQBvAG4AIAAxAC4AMQAuAA0ACgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABpAHMAIABjAG8AcABpAGUAZAAgAGIAZQBsAG8AdwAsACAAYQBuAGQAIABpAHMAIABhAGwAcwBvACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwADQAKAA0ACgAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKAFMASQBMACAATwBQAEUATgAgAEYATwBOAFQAIABMAEkAQwBFAE4AUwBFACAAVgBlAHIAcwBpAG8AbgAgADEALgAxACAALQAgADIANgAgAEYAZQBiAHIAdQBhAHIAeQAgADIAMAAwADcADQAKAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQANAAoADQAKAFAAUgBFAEEATQBCAEwARQANAAoAVABoAGUAIABnAG8AYQBsAHMAIABvAGYAIAB0AGgAZQAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAgACgATwBGAEwAKQAgAGEAcgBlACAAdABvACAAcwB0AGkAbQB1AGwAYQB0AGUAIAB3AG8AcgBsAGQAdwBpAGQAZQAgAGQAZQB2AGUAbABvAHAAbQBlAG4AdAAgAG8AZgAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQB2AGUAIABmAG8AbgB0ACAAcAByAG8AagBlAGMAdABzACwAIAB0AG8AIABzAHUAcABwAG8AcgB0ACAAdABoAGUAIABmAG8AbgB0ACAAYwByAGUAYQB0AGkAbwBuACAAZQBmAGYAbwByAHQAcwAgAG8AZgAgAGEAYwBhAGQAZQBtAGkAYwAgAGEAbgBkACAAbABpAG4AZwB1AGkAcwB0AGkAYwAgAGMAbwBtAG0AdQBuAGkAdABpAGUAcwAsACAAYQBuAGQAIAB0AG8AIABwAHIAbwB2AGkAZABlACAAYQAgAGYAcgBlAGUAIABhAG4AZAAgAG8AcABlAG4AIABmAHIAYQBtAGUAdwBvAHIAawAgAGkAbgAgAHcAaABpAGMAaAAgAGYAbwBuAHQAcwAgAG0AYQB5ACAAYgBlACAAcwBoAGEAcgBlAGQAIABhAG4AZAAgAGkAbQBwAHIAbwB2AGUAZAAgAGkAbgAgAHAAYQByAHQAbgBlAHIAcwBoAGkAcAAgAHcAaQB0AGgAIABvAHQAaABlAHIAcwAuAA0ACgANAAoAVABoAGUAIABPAEYATAAgAGEAbABsAG8AdwBzACAAdABoAGUAIABsAGkAYwBlAG4AcwBlAGQAIABmAG8AbgB0AHMAIAB0AG8AIABiAGUAIAB1AHMAZQBkACwAIABzAHQAdQBkAGkAZQBkACwAIABtAG8AZABpAGYAaQBlAGQAIABhAG4AZAAgAHIAZQBkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABmAHIAZQBlAGwAeQAgAGEAcwAgAGwAbwBuAGcAIABhAHMAIAB0AGgAZQB5ACAAYQByAGUAIABuAG8AdAAgAHMAbwBsAGQAIABiAHkAIAB0AGgAZQBtAHMAZQBsAHYAZQBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAsACAAaQBuAGMAbAB1AGQAaQBuAGcAIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIAB3AG8AcgBrAHMALAAgAGMAYQBuACAAYgBlACAAYgB1AG4AZABsAGUAZAAsACAAZQBtAGIAZQBkAGQAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACAAcAByAG8AdgBpAGQAZQBkACAAdABoAGEAdAAgAGEAbgB5ACAAcgBlAHMAZQByAHYAZQBkACAAbgBhAG0AZQBzACAAYQByAGUAIABuAG8AdAAgAHUAcwBlAGQAIABiAHkAIABkAGUAcgBpAHYAYQB0AGkAdgBlACAAdwBvAHIAawBzAC4AIABUAGgAZQAgAGYAbwBuAHQAcwAgAGEAbgBkACAAZABlAHIAaQB2AGEAdABpAHYAZQBzACwAIABoAG8AdwBlAHYAZQByACwAIABjAGEAbgBuAG8AdAAgAGIAZQAgAHIAZQBsAGUAYQBzAGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAdAB5AHAAZQAgAG8AZgAgAGwAaQBjAGUAbgBzAGUALgAgAFQAaABlACAAcgBlAHEAdQBpAHIAZQBtAGUAbgB0ACAAZgBvAHIAIABmAG8AbgB0AHMAIAB0AG8AIAByAGUAbQBhAGkAbgAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAZABvAGUAcwAgAG4AbwB0ACAAYQBwAHAAbAB5ACAAdABvACAAYQBuAHkAIABkAG8AYwB1AG0AZQBuAHQAIABjAHIAZQBhAHQAZQBkACAAdQBzAGkAbgBnACAAdABoAGUAIABmAG8AbgB0AHMAIABvAHIAIAB0AGgAZQBpAHIAIABkAGUAcgBpAHYAYQB0AGkAdgBlAHMALgANAAoADQAKAEQARQBGAEkATgBJAFQASQBPAE4AUwANAAoAIgBGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAHQAaABlACAAcwBlAHQAIABvAGYAIABmAGkAbABlAHMAIAByAGUAbABlAGEAcwBlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIAB1AG4AZABlAHIAIAB0AGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGEAbgBkACAAYwBsAGUAYQByAGwAeQAgAG0AYQByAGsAZQBkACAAYQBzACAAcwB1AGMAaAAuACAAVABoAGkAcwAgAG0AYQB5ACAAaQBuAGMAbAB1AGQAZQAgAHMAbwB1AHIAYwBlACAAZgBpAGwAZQBzACwAIABiAHUAaQBsAGQAIABzAGMAcgBpAHAAdABzACAAYQBuAGQAIABkAG8AYwB1AG0AZQBuAHQAYQB0AGkAbwBuAC4ADQAKAA0ACgAiAFIAZQBzAGUAcgB2AGUAZAAgAEYAbwBuAHQAIABOAGEAbQBlACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAbgBhAG0AZQBzACAAcwBwAGUAYwBpAGYAaQBlAGQAIABhAHMAIABzAHUAYwBoACAAYQBmAHQAZQByACAAdABoAGUAIABjAG8AcAB5AHIAaQBnAGgAdAAgAHMAdABhAHQAZQBtAGUAbgB0ACgAcwApAC4ADQAKAA0ACgAiAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4AIgAgAHIAZQBmAGUAcgBzACAAdABvACAAdABoAGUAIABjAG8AbABsAGUAYwB0AGkAbwBuACAAbwBmACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABhAHMAIABkAGkAcwB0AHIAaQBiAHUAdABlAGQAIABiAHkAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkALgANAAoADQAKACIATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgAiACAAcgBlAGYAZQByAHMAIAB0AG8AIABhAG4AeQAgAGQAZQByAGkAdgBhAHQAaQB2AGUAIABtAGEAZABlACAAYgB5ACAAYQBkAGQAaQBuAGcAIAB0AG8ALAAgAGQAZQBsAGUAdABpAG4AZwAsACAAbwByACAAcwB1AGIAcwB0AGkAdAB1AHQAaQBuAGcAIAAtAC0AIABpAG4AIABwAGEAcgB0ACAAbwByACAAaQBuACAAdwBoAG8AbABlACAALQAtACAAYQBuAHkAIABvAGYAIAB0AGgAZQAgAGMAbwBtAHAAbwBuAGUAbgB0AHMAIABvAGYAIAB0AGgAZQAgAE8AcgBpAGcAaQBuAGEAbAAgAFYAZQByAHMAaQBvAG4ALAAgAGIAeQAgAGMAaABhAG4AZwBpAG4AZwAgAGYAbwByAG0AYQB0AHMAIABvAHIAIABiAHkAIABwAG8AcgB0AGkAbgBnACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAdABvACAAYQAgAG4AZQB3ACAAZQBuAHYAaQByAG8AbgBtAGUAbgB0AC4ADQAKAA0ACgAiAEEAdQB0AGgAbwByACIAIAByAGUAZgBlAHIAcwAgAHQAbwAgAGEAbgB5ACAAZABlAHMAaQBnAG4AZQByACwAIABlAG4AZwBpAG4AZQBlAHIALAAgAHAAcgBvAGcAcgBhAG0AbQBlAHIALAAgAHQAZQBjAGgAbgBpAGMAYQBsACAAdwByAGkAdABlAHIAIABvAHIAIABvAHQAaABlAHIAIABwAGUAcgBzAG8AbgAgAHcAaABvACAAYwBvAG4AdAByAGkAYgB1AHQAZQBkACAAdABvACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBQAEUAUgBNAEkAUwBTAEkATwBOACAAJgAgAEMATwBOAEQASQBUAEkATwBOAFMADQAKAFAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABoAGUAcgBlAGIAeQAgAGcAcgBhAG4AdABlAGQALAAgAGYAcgBlAGUAIABvAGYAIABjAGgAYQByAGcAZQAsACAAdABvACAAYQBuAHkAIABwAGUAcgBzAG8AbgAgAG8AYgB0AGEAaQBuAGkAbgBnACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALAAgAHQAbwAgAHUAcwBlACwAIABzAHQAdQBkAHkALAAgAGMAbwBwAHkALAAgAG0AZQByAGcAZQAsACAAZQBtAGIAZQBkACwAIABtAG8AZABpAGYAeQAsACAAcgBlAGQAaQBzAHQAcgBpAGIAdQB0AGUALAAgAGEAbgBkACAAcwBlAGwAbAAgAG0AbwBkAGkAZgBpAGUAZAAgAGEAbgBkACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAgAGMAbwBwAGkAZQBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACwAIABzAHUAYgBqAGUAYwB0ACAAdABvACAAdABoAGUAIABmAG8AbABsAG8AdwBpAG4AZwAgAGMAbwBuAGQAaQB0AGkAbwBuAHMAOgANAAoADQAKADEAKQAgAE4AZQBpAHQAaABlAHIAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABuAG8AcgAgAGEAbgB5ACAAbwBmACAAaQB0AHMAIABpAG4AZABpAHYAaQBkAHUAYQBsACAAYwBvAG0AcABvAG4AZQBuAHQAcwAsACAAaQBuACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACwAIABtAGEAeQAgAGIAZQAgAHMAbwBsAGQAIABiAHkAIABpAHQAcwBlAGwAZgAuAA0ACgANAAoAMgApACAATwByAGkAZwBpAG4AYQBsACAAbwByACAATQBvAGQAaQBmAGkAZQBkACAAVgBlAHIAcwBpAG8AbgBzACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAbQBhAHkAIABiAGUAIABiAHUAbgBkAGwAZQBkACwAIAByAGUAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYQBuAGQALwBvAHIAIABzAG8AbABkACAAdwBpAHQAaAAgAGEAbgB5ACAAcwBvAGYAdAB3AGEAcgBlACwAIABwAHIAbwB2AGkAZABlAGQAIAB0AGgAYQB0ACAAZQBhAGMAaAAgAGMAbwBwAHkAIABjAG8AbgB0AGEAaQBuAHMAIAB0AGgAZQAgAGEAYgBvAHYAZQAgAGMAbwBwAHkAcgBpAGcAaAB0ACAAbgBvAHQAaQBjAGUAIABhAG4AZAAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlAC4AIABUAGgAZQBzAGUAIABjAGEAbgAgAGIAZQAgAGkAbgBjAGwAdQBkAGUAZAAgAGUAaQB0AGgAZQByACAAYQBzACAAcwB0AGEAbgBkAC0AYQBsAG8AbgBlACAAdABlAHgAdAAgAGYAaQBsAGUAcwAsACAAaAB1AG0AYQBuAC0AcgBlAGEAZABhAGIAbABlACAAaABlAGEAZABlAHIAcwAgAG8AcgAgAGkAbgAgAHQAaABlACAAYQBwAHAAcgBvAHAAcgBpAGEAdABlACAAbQBhAGMAaABpAG4AZQAtAHIAZQBhAGQAYQBiAGwAZQAgAG0AZQB0AGEAZABhAHQAYQAgAGYAaQBlAGwAZABzACAAdwBpAHQAaABpAG4AIAB0AGUAeAB0ACAAbwByACAAYgBpAG4AYQByAHkAIABmAGkAbABlAHMAIABhAHMAIABsAG8AbgBnACAAYQBzACAAdABoAG8AcwBlACAAZgBpAGUAbABkAHMAIABjAGEAbgAgAGIAZQAgAGUAYQBzAGkAbAB5ACAAdgBpAGUAdwBlAGQAIABiAHkAIAB0AGgAZQAgAHUAcwBlAHIALgANAAoADQAKADMAKQAgAE4AbwAgAE0AbwBkAGkAZgBpAGUAZAAgAFYAZQByAHMAaQBvAG4AIABvAGYAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABtAGEAeQAgAHUAcwBlACAAdABoAGUAIABSAGUAcwBlAHIAdgBlAGQAIABGAG8AbgB0ACAATgBhAG0AZQAoAHMAKQAgAHUAbgBsAGUAcwBzACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4AIABpAHMAIABnAHIAYQBuAHQAZQBkACAAYgB5ACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkAbgBnACAAQwBvAHAAeQByAGkAZwBoAHQAIABIAG8AbABkAGUAcgAuACAAVABoAGkAcwAgAHIAZQBzAHQAcgBpAGMAdABpAG8AbgAgAG8AbgBsAHkAIABhAHAAcABsAGkAZQBzACAAdABvACAAdABoAGUAIABwAHIAaQBtAGEAcgB5ACAAZgBvAG4AdAAgAG4AYQBtAGUAIABhAHMAIABwAHIAZQBzAGUAbgB0AGUAZAAgAHQAbwAgAHQAaABlACAAdQBzAGUAcgBzAC4ADQAKAA0ACgA0ACkAIABUAGgAZQAgAG4AYQBtAGUAKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABvAHIAIAB0AGgAZQAgAEEAdQB0AGgAbwByACgAcwApACAAbwBmACAAdABoAGUAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAcwBoAGEAbABsACAAbgBvAHQAIABiAGUAIAB1AHMAZQBkACAAdABvACAAcAByAG8AbQBvAHQAZQAsACAAZQBuAGQAbwByAHMAZQAgAG8AcgAgAGEAZAB2AGUAcgB0AGkAcwBlACAAYQBuAHkAIABNAG8AZABpAGYAaQBlAGQAIABWAGUAcgBzAGkAbwBuACwAIABlAHgAYwBlAHAAdAAgAHQAbwAgAGEAYwBrAG4AbwB3AGwAZQBkAGcAZQAgAHQAaABlACAAYwBvAG4AdAByAGkAYgB1AHQAaQBvAG4AKABzACkAIABvAGYAIAB0AGgAZQAgAEMAbwBwAHkAcgBpAGcAaAB0ACAASABvAGwAZABlAHIAKABzACkAIABhAG4AZAAgAHQAaABlACAAQQB1AHQAaABvAHIAKABzACkAIABvAHIAIAB3AGkAdABoACAAdABoAGUAaQByACAAZQB4AHAAbABpAGMAaQB0ACAAdwByAGkAdAB0AGUAbgAgAHAAZQByAG0AaQBzAHMAaQBvAG4ALgANAAoADQAKADUAKQAgAFQAaABlACAARgBvAG4AdAAgAFMAbwBmAHQAdwBhAHIAZQAsACAAbQBvAGQAaQBmAGkAZQBkACAAbwByACAAdQBuAG0AbwBkAGkAZgBpAGUAZAAsACAAaQBuACAAcABhAHIAdAAgAG8AcgAgAGkAbgAgAHcAaABvAGwAZQAsACAAbQB1AHMAdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAGUAbgB0AGkAcgBlAGwAeQAgAHUAbgBkAGUAcgAgAHQAaABpAHMAIABsAGkAYwBlAG4AcwBlACwAIABhAG4AZAAgAG0AdQBzAHQAIABuAG8AdAAgAGIAZQAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAZAAgAHUAbgBkAGUAcgAgAGEAbgB5ACAAbwB0AGgAZQByACAAbABpAGMAZQBuAHMAZQAuACAAVABoAGUAIAByAGUAcQB1AGkAcgBlAG0AZQBuAHQAIABmAG8AcgAgAGYAbwBuAHQAcwAgAHQAbwAgAHIAZQBtAGEAaQBuACAAdQBuAGQAZQByACAAdABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABkAG8AZQBzACAAbgBvAHQAIABhAHAAcABsAHkAIAB0AG8AIABhAG4AeQAgAGQAbwBjAHUAbQBlAG4AdAAgAGMAcgBlAGEAdABlAGQAIAB1AHMAaQBuAGcAIAB0AGgAZQAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUALgANAAoADQAKAFQARQBSAE0ASQBOAEEAVABJAE8ATgANAAoAVABoAGkAcwAgAGwAaQBjAGUAbgBzAGUAIABiAGUAYwBvAG0AZQBzACAAbgB1AGwAbAAgAGEAbgBkACAAdgBvAGkAZAAgAGkAZgAgAGEAbgB5ACAAbwBmACAAdABoAGUAIABhAGIAbwB2AGUAIABjAG8AbgBkAGkAdABpAG8AbgBzACAAYQByAGUAIABuAG8AdAAgAG0AZQB0AC4ADQAKAA0ACgBEAEkAUwBDAEwAQQBJAE0ARQBSAA0ACgBUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUAIABJAFMAIABQAFIATwBWAEkARABFAEQAIAAiAEEAUwAgAEkAUwAiACwAIABXAEkAVABIAE8AVQBUACAAVwBBAFIAUgBBAE4AVABZACAATwBGACAAQQBOAFkAIABLAEkATgBEACwAIABFAFgAUABSAEUAUwBTACAATwBSACAASQBNAFAATABJAEUARAAsACAASQBOAEMATABVAEQASQBOAEcAIABCAFUAVAAgAE4ATwBUACAATABJAE0ASQBUAEUARAAgAFQATwAgAEEATgBZACAAVwBBAFIAUgBBAE4AVABJAEUAUwAgAE8ARgAgAE0ARQBSAEMASABBAE4AVABBAEIASQBMAEkAVABZACwAIABGAEkAVABOAEUAUwBTACAARgBPAFIAIABBACAAUABBAFIAVABJAEMAVQBMAEEAUgAgAFAAVQBSAFAATwBTAEUAIABBAE4ARAAgAE4ATwBOAEkATgBGAFIASQBOAEcARQBNAEUATgBUACAATwBGACAAQwBPAFAAWQBSAEkARwBIAFQALAAgAFAAQQBUAEUATgBUACwAIABUAFIAQQBEAEUATQBBAFIASwAsACAATwBSACAATwBUAEgARQBSACAAUgBJAEcASABUAC4AIABJAE4AIABOAE8AIABFAFYARQBOAFQAIABTAEgAQQBMAEwAIABUAEgARQAgAEMATwBQAFkAUgBJAEcASABUACAASABPAEwARABFAFIAIABCAEUAIABMAEkAQQBCAEwARQAgAEYATwBSACAAQQBOAFkAIABDAEwAQQBJAE0ALAAgAEQAQQBNAEEARwBFAFMAIABPAFIAIABPAFQASABFAFIAIABMAEkAQQBCAEkATABJAFQAWQAsACAASQBOAEMATABVAEQASQBOAEcAIABBAE4AWQAgAEcARQBOAEUAUgBBAEwALAAgAFMAUABFAEMASQBBAEwALAAgAEkATgBEAEkAUgBFAEMAVAAsACAASQBOAEMASQBEAEUATgBUAEEATAAsACAATwBSACAAQwBPAE4AUwBFAFEAVQBFAE4AVABJAEEATAAgAEQAQQBNAEEARwBFAFMALAAgAFcASABFAFQASABFAFIAIABJAE4AIABBAE4AIABBAEMAVABJAE8ATgAgAE8ARgAgAEMATwBOAFQAUgBBAEMAVAAsACAAVABPAFIAVAAgAE8AUgAgAE8AVABIAEUAUgBXAEkAUwBFACwAIABBAFIASQBTAEkATgBHACAARgBSAE8ATQAsACAATwBVAFQAIABPAEYAIABUAEgARQAgAFUAUwBFACAATwBSACAASQBOAEEAQgBJAEwASQBUAFkAIABUAE8AIABVAFMARQAgAFQASABFACAARgBPAE4AVAAgAFMATwBGAFQAVwBBAFIARQAgAE8AUgAgAEYAUgBPAE0AIABPAFQASABFAFIAIABEAEUAQQBMAEkATgBHAFMAIABJAE4AIABUAEgARQAgAEYATwBOAFQAIABTAE8ARgBUAFcAQQBSAEUALgANAAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGEAZABvAGIAZQAuAGMAbwBtAC8AdAB5AHAAZQAvAGwAZQBnAGEAbAAuAGgAdABtAGwAUwBvAHUAcgBjAGUAIABDAG8AZABlACAAUAByAG8AQgBsAGEAYwBrAFQAeQBwAG8AZwByAGEAcABoAGkAYwAgAGEAbAB0AGUAcgBuAGEAdABlAHMAQQBsAHQAZQByAG4AYQB0AGUAIABhAEEAbAB0AGUAcgBuAGEAdABlACAAZwBBAGwAdABlAHIAbgBhAHQAZQAgAGQAbwBsAGwAYQByACAAcwBpAGcAbgAAAAMAAAADAAACFAABAAAAAAAcAAMAAQAAAhQABgH4AAAACQD3AAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAeYB6wIVAnYCiQHMAeoB/wIAAgkClAHiAfYB4QIFAc0BzgHPAdAB0QHSAdMB1AHVAdYB4wHkApoCmQKbAegCEwACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsCAQIHAgICnwH+AssAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AgMCBgIEAqEAAAA6AD0ATgBYAIwAlQDBAOgA5wDpAOsA6gDuAP8BCQEIAQoBDAElASQBJgEoAT8BRgFFAUcBSQFIAXMBcgF0AXYCCgJ0AnoCdwIMAf0CDQFrAhACDgIRAswC1QKgAEwAoQKlAp4CnAKdAngCpgKnAqwCrQKkAqgCUgJUAAAA/QFVAekB5wKjAqkCewKiAqoB9AH1AeUDHwA2ADkAlACiAVYB+AH5Ae4B7wHsAe0ClwLEAZAA2wKGAnkB8gHzAasBrAILAfwB8AHxAooAOABZADcAWwBXAHQAdQB3AHMAkgCTAAAAkQC+AL8AvQEwAs0C1ALWAtcC2gLYAtsC2QLcAs4ABAf8AAABFgEAAAcAFgAvADkAQABaAGAAegB+AL8AxADRANYA3wDkAPEA9gExAUkBZQF+AYABjwGSAaEBsAHcAecB6wIbAjcCQwJSAlQCWQJhAmUCbwJ5AocCjgKeArACswK4ArwCvwLMAt0C4wMEAwwDDwMTAxsDJAMoAy4DMQPAHUMdSR1NHVAdUh1YHVsdnB2gHbseDx4hHiUeKx47HkkeYx5vHoUejx6THpcenh75IAcgFSAaIB4gIiAmIDAgMyA6IEQgcSB5IH8giSCOIJQgoSCkIKcgrCCyILUguiETIRchICEiISYhLiFUIV4hkyICIgYiDyISIhUiGiIeIisiSCJgImUlnyWgJbMltyW9JcElxiXKJhEmaicTJ1L7Av//AAAAIAAwADoAQQBbAGEAewCgAMAAxQDSANcA4ADlAPIA9wE0AUwBaAGAAY8BkgGgAa8BzQHmAeoCGAI3AkMCUAJUAlgCYQJlAm8CeQKHAowCngKwArICtwK7Ar4CxgLYAuEDAAMGAw8DEgMbAyMDJgMuAzEDwB1DHUcdTR1PHVIdVh1bHZwdoB27HgweIB4kHioeNh5CHloebB6AHo4ekh6XHp4eoCAHIBIgGCAcICAgJiAwIDIgOSBEIHAgdCB9IIAgjSCUIKEgpCCm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8AH3Af4CBQIMAhMCGgInAi4CNQI8AkMCSgJRAlgCXwJkAmsCcgJ5AoAChwKOApQCmgKhAqgCrwK2ArwCxwLOAtUC3ALjAuoC8AL3Av4DBQMMAxIDGQMfAyQDMQM4Az8DRgNNA1QDWwNiA2kDbgN1A3wDgwOKA5EDlwOdA6gDsQO3A8IDyQPQA9cD3gPkA+4D9QP8BAMECQQQBBcEHgQlBCwEMwQ6BEEESARPBFYEXQRkBGsEcgR4BIMEiQSTBJkEoASnBK0EswS6BMAEygTRBNgE3wTmBO0E9AT7BQIFCQUUBRoFJAUrBTEFOAVDBU4FVQVcBWAFZgVtBXQFewWCBYkFkAWZBaQFqwW3Bb0FwwXHBc4F1QXcBeMF6gXwBfYF/QYEBgsGEgYdBiQGKwY4Bj8GRgZNBlQGWwZiBmkGcAZ1BnwGgwaKBpEGmAafBqUGrAayBrkGwAbHBs0G2AbfBuYG7Qb0BvoHAQcIBw8HFgcdByMHKgcwBzUHQgdJB1AHVwdeB2UHbAdzB3oHfweGB40HlAebB6IHqAeuB7kHwgfIB9MH2gfhB+gH7wf1B/8IBggNCBQIGwgiCCkIMAg3CD4IRQhMCFMIWghhCGgIawhzCHsIiAiQCJsIpAisCLMIvAjFCM4I1wjgCOkI8gj7CQQJDQkWCR8JKAkxCTQJQQlJCVUJXglmCW8JfAmFCY0JlQmfCagJsQm5CcMJzQnWCd0J5AnrCfIJ+QoDCgsKFAocCiUKLQo1Cj8KSApRClkKYwptCnYKhAqTCp4KqAqxCrkKwQrLCtQK3QrlCu8K+QsCCxALHwsqCzQLPQtFC00LVwtgC2kLcQt7C4ULjgucC6sLtgvAC8kL0QvZC+ML7Av1C/0MBwwRDBoMKAw3DEIMTAxZDF8MZQxrDHEMdwx9DIMMiQyPDJUMmwyhDKcMrQyzDLkMvwzFDMsM0QzXDN0M4wzpDO8M9Q0ADQsNFw0dDSMNJw0uDTINOQ0/DUMNSg1RDVgNXw1mDW0Ndw1+DYcNkw2bDaYNqA2wDbcNwg3KDdEN2A3fDegN7w32Df8OBg4NDhQOHQ4kDisOMg45DkAORw5ODlUOXA5jDmoOcQ54Dn8Ohg6NDpQOmw6iDqkOsA63Dr4OxQ7MDtMO2g7hDugO8w76DwUPDA8XDx4PKQ8wDzsPQg9ND1QPXw9mD3EPeA+DD4oPlQ+cD6cPrg+5D8APyw/SD9kP4A/nD+4P9Q/8EAcQDhAZECAQJxAyEEEQTBBbEGYQdRCAEI8QmhCpELQQwxDOEN0Q6BD3EQIREREcESsRNhFFEVARXxFqEXkRghGLEZIRmRGjEa8RthG9EcQRyxHSEdkR4BHnEe4R9RH8EgMSChIREhgSHxImEi0SNBI7EkISSRJQElcSXhJlEmwScxJ6EoESiBKPEpYSnRKkEqsSshK5EsASxxLOEtUS3BLjEuoS8RL4Ev8TBhMNExQTGxMiEykTMBM3Ez4TRRNME1MTWhNhE2gTbxN2E30ThBOLE5ITmROgE6cTrhO1E7wTwxPKE9ET2BPfE+YT7RP0E/sUAhQJFBAUFxQeFCUULBQzFDoUQRRIFE8UVhRdFGQUaxRyFHkUgBSHFI4UlRScFKMUqhSxFLgUvxTGFM0U1BTbFOIU6RTwFPcU/hUFFQwVExUaFSEVKBUvFTYVPRVEFUsVUhVZFWAVZxVuFXUVfBWDFYoVkRWYFZ8VphWtFbQVuxXCFckV0BXXFd4V5RXsFfMV+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBCbGFja1NvdXJjZSBDb2RlIFBy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ADYANgA2ADYAEAAAAD4APgA+AD4APgAPACoAKgAqADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAyADIAMgAsACwALAAsACwALAAs/+MAQABAAAAASgBKAEoASgBKAEoASgBKAEoASgBKAEoASgAlAEAAQAA2ADYAAAA2ADYANgA2ADYAGgBAAEAAQABAAEAAQABA/8cAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAAwAKgAqACoAKgAqACoAKgBoAF4AaABeAF4APAAuAC4ALgAuAC4ALgAuADIAKgAqACoAKgAqACoAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAIAAgACAAIAGAAYABgAGAAYABgAGAAYAEYARgBGAEYAKgBAACUAQAAqAEAAMAAyADIAKgA2ABoAMAAwABgAAgAWAAr/9v/6ACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAEAAyAEsALAAkACEAKgA2ADsAOgAwADIASwAsACQAIQAqADYAOwA6ADAAqgCxAKoAqv/zAL4AvgBeAGAAzABAAK4AwgAiADYAwgA2AKYAuAAaACwAQABAAFAAFABQABQAqgCCADwAqgCAAL8AawBkAGsAQADgAEAA4AA4AEoASgBAACYADgAOAGH/8P/uABgAGABAAEwAeAB4ADgAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJQAvwCYAKIAnQCiAJwArwCiAKAAzgDCAOYA3ACUAL8AlgCiAJ0AogCcAK8AogCgAM4AwgDmANwAlAC/AJgAogCdAKIAnACvAKIAoADOAMIA5gDcAJUAfQCBAJUAkwCmAH0AjwCxAH8AlQCnAIIAlQCxAG0AlQCBAJMAfQDLAIsAkQCLAGsAVABuAH0AmQCPAI8AkQB9AH0AlQAbADgAPwAXACgAWgAtAEgAPwAUAA0AVAAOADwASABRABwADAAMAAwADQAYAAwADAAMAAwADAAMAAwADAAMAEAAQABNAEAAqgBAAHIAXgBAAEAAQABMAEAAKgAqAEAABP/vADgANQCEABYABgAGADcADgA7ABoADAAeACAAHgCuAH4AWgCLABIAEgA0ADQAEgASAAwADP/h/+H/7AAsAEYA2wBZAK4AwgDlAM0AfgDUAH4AfgDWAJwA1AB+ANYAdgBiAJwAkgC0AKQAvgC+AM4AfgB+ANQA2AB+AHgAdgB4AJwAmACSAJ4AvgDMAGIAdgDUANQAtAC0AKQAmAB+AHgANgA2AOIA8AEiAL4AdgC+AL4AvgDOAMoAnACcAIAAgACAAIAAgAB4AIAAgACYAIIAmACCAJgAggCQAIIAnACeAJwAngCcAJ4AlACMAJAAggD5ANAAAAAAAAAAAP+w/7AA3ACMACEAIQDcAIwAEgASANwAjADcANwAjACM/7D/sP+w/7AA3ADcAIwAjP+w/7D/sP+wANwA3ACMAIwAjACMAIwAjP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wAEsASwDcAIz/sAA8ANwAPAA8/7D/sP+wANwAPAA8/7D/sP+wANwAPAA8/7D/sP+w/7D/sP+w/7D/sP+w/7D/sP+wANz/sP+wANz/sP+w/7D/sADcANwA3P+wAIwA3ACM/7AAjP+wAIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAAABYAAQUKAAMADAA2AFgABQAMABIAGAAeACQDDQACAt0DCwACAt8DEQACAuMDGwACAucDDwACAu0ABAAKABAAFgAcAxUAAgLdAxMAAgLfAxkAAgLjAxcAAgLtAAQACgAQABYAHAMJAAIC3QMFAAIC3wMDAAIC5QMHAAIC8wABBJoAEAAmADAAOgBEAE4AWABiAGwAdgCAAJIAnACmALAAugDEAAEABABLAAIC/wABAAQAZwACAv8AAQAEAG4AAgLj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AxkDGwMfAAAAAQAAAAoAOACSAAJERkxUAA5sYXRuAB4ABAAAAAD//wADAAAAAgAEAAQAAAAA//8AAwABAAMABQAGbWFyawAmbWFyawA2bWttawBGbWttawBMc2l6ZQBSc2l6ZQBWAAAABgAAAAEAAgADAAQABQAAAAYAAAABAAIAAwAEAAUAAAABAAYAAAABAAYAUgAAAE4AAAAHABAAGgAiACoAMgA6AEIAAQAAAAIARABOAAQAAAABAEwABAAAAAEDMgAEAAAAAQNsAAQAAAABBSAABAAAAAEFSgAGAQAAAQWoAGQAAAAAAAAAAAABBqAABf7U/agAAQagAAT9qAABBqIGuAABAAwA6gA3AAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSANgA3gDkAOoA8ADGAOQA9gD8AMYBAgDGAQgBAgEOAQIAxgDGAMYAxgDGAMYBFAEaASABJgEsATIBOAE+AUQBSgFKAVABVgFcAWIAwAFoAW4BdAF6AYABhgGMAZIAwAGYAWgAxgGeAN4AxgECAaQAxgDGAMYAxgGqARoBsAG2AbYAwAFiAMAAwAGGAYYBIAG2ATIBegG8AcIByAHOAdQB2gHgAeYB7AGMAZIBGgHyAXoBegHUAfgB/gABASwCCgABASwCoAABARsCoAABAWQCoAABASgCoAABAT4CoAABAUICoAABAUoCoAABASsCoAABATQCoAABAMUCoAABATICoAABATgCoAABAS4CoAABAToCoAABATICCgABAJwC2gABAVQCCgABAbYC2gABATgCCgABAZoC5QABAS8CCgABAJcC2gABAVgC3QABAKIC2gABAQoC2gABAUQCDAABAToCCgABAUQCCgABATUCCgABAVICCgABATwCCgABAQoCmAABASgCCgABAS4CCgABAS0CCgABATQCCgABAYsCtgABAYQCoAABAUACoAABATcCCgABAVgCCgABAT4CCgABAR4CCgABASQCCgABATECCgABATYCCgABASYCCgABATACDAABAY4CCgABAP4CCgABASACCgABASwC5AABASwC0AABBEAESAABAAwAFgACAAAAGAAAABgABgAUAA4ADgAaACAAJgABASwAAAABAVwAAAABAVQAAAABATYAAAABAXQAAAABBBYEJAABAAwAIgAFAAAArgAAAK4AAACuAAAArgAAAK4ASwCYAJ4ApACqALAAtgC8AMIAmADIAM4A1ACYAJgAmADaAOAA5gCYAJgA7ADyAPgAmADmAP4BBAEKAOYA/gEQARYBHAEiASgA4AEuAPIAyACYATQBOgFAAUYBTADOAPIBUgCYAVgAzgCYAJgBXgEiAJgAzgEEAWQAzgDsAWoA/gFwAXYBfADmAYIBiADyAVIBjgGUAM4BdgABASz/6gABATr/6gABAVz/6gABASL/6gABATz/6gABAMj/6gABAU7/6gABASv/6gABATD/6gABAT7/6gABAUb/6gABAKH/6gABAUD/6gABATb/6gABASj/6gABAS7/6gABASD/6gABATj/6gABATP/6gABAVT/6gABASb/6gABART/GwABATH/6gABAVj/6gABAPH/EwABAWb/6gABAJH/JgABAbv/JgABAMz/6gABATL/6gABAWz/6gABAS3/6gABAQv/DwABAUz/6gABAUL/6gABAUf/6gABASX/6gABAcb/JgABASf/6gABAJT/6gABAXL/6gABAQn/DwABAQT/6gABArQCugABAAwAEgABAAAADgADAA4AFAAaAAEBLAH0AAEBqgKAAAECBAKUAAEBngH0AAECkgKaAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAGgAyADgAPgA4ADIARABKAAEBLAAAAAEB7AAAAAEBogAAAAEBGgAAAAEBlAAAAAEBjAAAAAEBYgAAAAEBJQAAAAEBqAAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAA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) format('truetype');
54}
55
56//========================================================================================
57//
58 //C l i p p e r z I c o n s
59//
60
61@font-face {
62 font-family: 'clipperz-icons';
63 font-style: normal;
64 font-weight: normal;
65 src: url(data:application/x-font-ttf;charset=utf-8;base64,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X25fZQdzX2Ffdl9lB3RfYV9nX3MHZF9vX25fZQdiX2FfY19rB2VfZF9pX3QHZV94X2lfdAV0X2FfZwVhX2RfZANnX28AAAAB//8AAgABAAAADgAAACQAAAAAAAIAAwADAAMAAQAEAB4AAgAfADYAAQAEAAAAAgAAAAEAAAAKAB4ALAABbGF0bgAIAAQAAAAA//8AAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQHWAA0AIABiAIoAnAC2ANoBAAEsAXABiAGcAaYByAAEAAoAHAAqADgABQAIACAALwAhACYAIAAkAB8ADgAGACIAKwAkACUAJgASAAYAIgAmACIAKwAiABgABAAgACEAIgADAAgAFAAeABQABQA0ACQAJQAmABoABAAfACUAKwAbAAQANgAlACsAAQAEABAABgAkACUAJgAiAB8AAgAGABIAEwAFACYAIgAsACsAHQADAB8AHwACAAYAFgAMAAcAIAAkAB8AJQAhAC0ADQAGACAAJwAoACIAHwACAAYAGAAIAAgAJgAlADAAMAAiACwAMQAPAAYAJAAhACcAIgAmAAIABgAaAAQACQAhACoAKwAkACwALAAiAB8ABgAIACEAJgAgACcAKAAiAB8ABAAKABwALAA6AAcACAAiACsAKwAlACEALQAqAAkABwArACQALAAsACIAHwARAAYAIgAkACwAJwAuABYABAAkADIAIgACAAYAEAAXAAQAJAAtACoAHAADACQALQABAAQACwAHACIAIwAsACIAKgAuAAEABAAeAAIAIAACAAYAFgAKAAcAJAAzADQAIgAhACsAFQAFAC4AIAAhACIAAQAEABkABAAkACcAKAABAA0AHwAiACMAJAAmACcAKQAqACsALAAtADAANQABAAAACgAcAB4AAWxhdG4ACAAEAAAAAP//AAAAAAAAAAAAAQAAAADJiW8xAAAAAM5FKjwAAAAAzkUqPA==) format('truetype');
66}
67/*
68@font-face {
69 font-family: 'blokkregular';
70 font-style: normal;
71 font-weight: normal;
72 src: url(data:application/x-font-ttf;charset=utf-8;base64,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AUMAAwABBAkACQASAW0AAwABBAkACgBMAX8AAwABBAkACwAuAcsAAwABBAkADABgAfkAAwABBAkADQBQAlkAAwABBAkADgBcAqkAAwABBAkAEwBSAwUAAwABBAkAyAAWA1cAAwABBAkAyQAwA21GaXZlIGJpZyBxdWFja2luZyB6ZXBoeXJzIGpvbHQgbXkgd2F4IGJlZABDAG8AcAB5AHIAaQBnAGgAdAAgAGIAYQBrAGsAZQBtAG8AZQBuACAAMgAwADEAMwBCAEwATwBLAEsAUgBlAGcAdQBsAGEAcgBGAG8AbgB0AFMAdAByAHUAYwB0ACAAQgBMAE8ASwBLAEIATABPAEsASwAgAFIAZQBnAHUAbABhAHIAVgBlAHIAcwBpAG8AbgAgADEALgAwAEIATABPAEsASwBGAG8AbgB0AFMAdAByAHUAYwB0ACAAaQBzACAAYQAgAHQAcgBhAGQAZQBtAGEAcgBrACAAbwBmACAARgBTAEkAIABGAG8AbgB0AFMAaABvAHAAIABJAG4AdABlAHIAbgBhAHQAaQBvAG4AYQBsACAARwBtAGIASABoAHQAdABwADoALwAvAGYAbwBuAHQAcwB0AHIAdQBjAHQALgBjAG8AbQBiAGEAawBrAGUAbQBvAGUAbiAaAMQA+gBCAEwATwBLAEsgGgDEAPkAIAB3AGEAcwAgAGIAdQBpAGwAdAAgAHcAaQB0AGgAIABGAG8AbgB0AFMAdAByAHUAYwB0AAoAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGYAbwBuAHQAcwBoAG8AcAAuAGMAbwBtAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABzAHQAcgB1AGMAdAAuAGMAbwBtAC8AZgBvAG4AdABzAHQAcgB1AGMAdABpAG8AbgBzAC8AcwBoAG8AdwAvADcANwAwADgAMgAzAEMAcgBlAGEAdABpAHYAZQAgAEMAbwBtAG0AbwBuAHMAIABBAHQAdAByAGkAYgB1AHQAaQBvAG4AIABTAGgAYQByAGUAIABBAGwAaQBrAGUAaAB0AHQAcAA6AC8ALwBjAHIAZQBhAHQAaQB2AGUAYwBvAG0AbQBvAG4AcwAuAG8AcgBnAC8AbABpAGMAZQBuAHMAZQBzAC8AYgB5AC0AcwBhAC8AMwAuADAALwBGAGkAdgBlACAAYgBpAGcAIABxAHUAYQBjAGsAaQBuAGcAIAB6AGUAcABoAHkAcgBzACAAagBvAGwAdAAgAG0AeQAgAHcAYQB4ACAAYgBlAGQAVwBlAGIAZgBvAG4AdAAgADEALgAwAFQAaAB1ACAARgBlAGIAIAAgADcAIAAwADkAOgAyADUAOgAwADEAIAAyADAAMQAzAAACAAAAAAAAAMsAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAHsAAAECAQMAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMAsgCzALYAtwC0ALUBFAEVARYGZ2x5cGgxBmdseXBoMgd1bmkwMEEwB3VuaTAwQUQHdW5pMjAwMAd1bmkyMDAxB3VuaTIwMDIHdW5pMjAwMwd1bmkyMDA0B3VuaTIwMDUHdW5pMjAwNgd1bmkyMDA3B3VuaTIwMDgHdW5pMjAwOQd1bmkyMDBBB3VuaTIwMTAHdW5pMjAxMQpmaWd1cmVkYXNoB3VuaTIwMkYHdW5pMjA1Rgd1bmlFMDAwAAAAuAH/hbABjQBLsAhQWLEBAY5ZsUYGK1ghsBBZS7AUUlghsIBZHbAGK1xYAbABIEWwAytEsAIgRboAAX//AAIrsQNGditEWbAUKwAAAAABURO5PQAA) format('truetype');
73}
74*/
75@font-face {
76 font-family: 'clipperz-password';
77 //font-family: 'passwordregular';
78 font-style: normal;
79 font-weight: normal;
80 src: url(data:application/x-font-ttf;charset=utf-8;base64,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AZP/HwGU/x8Bl/9OAZj/HwGa/04BnP8fAZ7/agGg/7QBo/9qAaT/jwGm/x8Bqv8fAaz/UAGt/x8Brv+PAa//agGxALwBsv9OAbP/HwG0/04AGwAE/9sAEP76ABH/RgAS/voAHv+PAB//jwF4ALwBef9oAXz/aAGA/40Bg/9oAYf/jQGN/40BkP+eAZX/aAGW/7QBmP9GAZr/ngGe/2gBoP+0AaH/aAGj/2gBpv9GAar/RgGt/0YBsQB5AbP/RgADAXn/xQGM/74Bkv++AAoBk/+yAZj/sgGb/7IBn//ZAab/sgGq/7IBrf+yAbD/sgGz/7IBtf+yABUABP/bAXgAqgF5/2gBfP9oAYD/jQGD/2gBh/+NAY3/jQGQ/54Blf9oAZb/tAGY/0YBnv9oAaD/tAGh/2gBo/9oAab/RgGq/0YBrf9GAbEAYgGz/0YABAGi/9kBp//jAav/4wGu/8kAEgGT/3cBlf/bAZj/dwGa/6oBm/+0AZ7/2wGf/54BoP/bAaH/2wGk/6oBpv93Aaf/qgGq/3cBq/+qAa3/dwGw/3cBs/93AbX/dwABAaL/2QANAZP/5wGY/+cBm//nAZ3/5wGf/+cBpf/nAab/5wGp/+cBqv/nAa3/5wGw/+cBs//nAbX/5wANAZP/4QGY/+EBm//hAaX/4QGm/+EBqf/RAar/4QGs/88Brf/bAbD/4QGz/+EBtP/PAbX/4QAKAZP/yQGY/8kBm//JAZ3/yQGl/8kBpv/JAan/yQGq/8kBrf/JAbP/yQAJAZP/4wGY/+MBnf/jAab/4wGp/+MBqv/jAa3/4wGw/+MBtf/jAAMBov/ZAaf/4wGr/+MACgGT/+MBmP/jAZv/4wGd/+MBpv/jAan/4wGq/+MBrf/jAbD/4wG1/+MACwGT/8kBmP/JAZv/yQGd/8kBpv/JAan/yQGq/8kBrf/JAbD/yQGz/8kBtf/JAAUAEP8GABL/BgBu/3cAfv93A5L/0wABA5b/YAABA5b/dwARAckARAHM/+kB0AAtAdP/0wHU/+kB1v/TAdf/YAHY/6YB2f+8Adz/YAHi/9MB5QAXAff/0wH4/+kB+QAXAgIALQOW/40ADgHF/9MBzP/pAdP/6QHW/+kB1/+kAdj/0QHZ/+kB2v/TAdz/pAHf/7wB4v/pAeT/6QHw/+kB+P/TABUBxf+8Acn/0wHL/9MBzP+8AdD/6QHT/7wB1v+8Adf/dwHY/7wB2f+8Adr/pgHc/6QB3/+NAeT/vAHp/+kB8f/pAff/vAH4/+kB+v/pAfz/vAIE/+kAHAAQ/wYAEv8GAG7/dwB+/3cBxf93Acn/dwHM/9MB0P+NAdH/0QHT/40B1v+kAeT/vAHl/40B5/+NAen/dwHq/3cB7f+NAfD/jQHx/40B8v+NAfP/dwH1/40B+P93AgD/jQIB/40CA/+NAgT/dwOS/9MABgHYABcB2f/TAdz/ugHsAEQB8wAXAfgALQACAcz/0wH2/+kACgHM/+kB0//TAdb/6QHXABcB2AAtAd8ALQHlABcB6v/nAfP/6QH4/+kACAHQ/+kB0//pAdb/6QHX/9MB2P/pAdn/6QHc/9MB5P/pAAUBzP/pAdP/6QHW/+kB2AAXAdn/ugADAdn/6QHmABcB+AAXAAkB2f/pAdz/6QHlABcB6gAXAfMAFwH2ABcB+AAXAfz/6QICABcACwHF/9MByf/TAcv/0wHQ/+kB2P/TAdr/pAHc/9MB5P/TAen/0wHw/+kB+v/pABgAEP59ABL+fQAe/9MAH//TAH7/jQHF/3cByf93Acv/6QHM/9MB0P+NAdH/6QHT/9MB1v/pAdf/pAHY/9MB2f/pAdr/pAHk/9MB5f+8Aen/YAHq/6YB8/+mAgL/0wIE/7wADwHF/9MByf/TAcz/6QHQ/7wB0f/pAdP/0wHX/7wB2P+8Adr/jQHc/7wB3/+6AeL/6QHlABcB6wAtAfz/6QAfABD/HQAS/x0Abv+mAH7/pgHF/7wByf+8AcsAFwHM/+kB0P/TAdP/pAHZ/7wB5P/TAeX/pAHn/6YB6v+NAe3/pgHv/6YB8P+kAfH/pgHz/2AB9P+mAfX/jQH2/40B+P+NAfr/pgH+/6YCAP+mAgH/pgID/6YCBP+NA5L/0wAmABD+8AAS/vAAHv/TAB//0wBu/6YAfv+kAcX/dwHJ/6QBzP/TAdD/vAHT/7wB2f+8AeL/0wHk/9MB5v/TAef/jQHo/6QB6f9gAer/dwHr/7wB7P+NAe3/pAHu/7wB7/+kAfD/dwHx/6QB8v+kAfP/dwH0/6QB9f+kAfb/dwH6/6QB+/+kAf3/pAH+/6QCA/+kAgT/dwOS/+kACAHF/9MByf+8AdD/vAHX/40B2P+kAdz/0wHk/7oB8P+8AAcBzP/TAdP/vAHW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AscC5QAnAucC6gBGAuwC7ABKAvgC+ABLAvoC+gBMAxoDHABNBLQEtABQBMcExwBRBNYE1gBSBSsFKwBTAAIArgBUBOgE7ATwBPME9gT5BPwFAwUGBQkFDAUPBRIFFQUYBRsFHgUhBSQFJwUqBTIF+QX7BJsElQSMBg8GEgSPBJgEkgYVBhgEpwSkBhsEqgStBioGLQYwBjMGNgY3BjoF+wY9BkAEngZDBKEFGwSeBkgGSwZOBMwGUQS6BlQEwAZXBL0GWgZdBmAGYwZmBmkEmgZsBI8GcATGBnYE1QZ7Bn4GgQS3BS0FMgUtAAIAEgJlAmUAAAJnAmcAAQJpAm0AAgJyAnkABwJ7AoAADwKDAoMAFQKcAp0AFgKmArQAGALHAuUAJwLnAuoARgLsAuwASgL4AvgASwL6AvoATAMaAxwATQS0BLQAUATHBMcAUQTWBNYAUgUrBSsAUwACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+BJwGQQSfBkQGRQZGBkkGTAaIBk8EuAZSBL4GVQS7BlgGWwZeBmEGZAZnBMEEwgZqBm0GbgTDAuwC7QLuBnEE0QTOBM0EzwTSBnIE0AZzBnQGdwTTBngEyATJBnkGfAZ/BLUFLATXBOIFLAU0BTYFOAU6AAIADgJiAnkAAAJ7AoMAGAKcAp0AIQKfAv0AIwMaAxwAggS0BLQAhQTHBMcAhgTWBNYAhwThBOEAiAUrBSsAiQUzBTMAigU1BTUAiwU3BTcAjAU5BTkAjQACASIAjgTjBOQE5QTmBOkE6gTtBO4E8QT0BPcE+gT9BP4E/wUABQEFBAUHBQoFDQUQBRMFFgUZBRwFHwUiBSUFKAUuBS8FMAKcAp0EiQYHBggGCQYKBgsGDASZBJMEigYNBhAEjQSWBJAGEwYWBKUEogYZBKgEqwSxBhwGHQYeBK8ErgSwBh8GIASzBiEGIgYjBiQGJQYmBLIGJwYoBisGLgYxBjQGNwY4As4GOwY+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A+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAjkAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwKAAAAFAAAAAoAAAAUAAAABqgAAAUAAAADVAAAA1QAAAKAAAAEAAAAARwAAA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAQAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXAUAAAAPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXA+QAVwPkAFcD5ABXBB8AAAPkAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAAABYAFgAWABYAFgAsAEIAWABuAIQAmgCwAMYA3ADyAQgBHgE0AUoBYAF2AYwBogG4Ac4B5AH6AhACJgI8AlICaAJ+ApQCqgLAAtYC7AMCAxgDLgNEA1oDcAOGA5wDsgPIA94D9AQKBCAENgRMBGIEeASOBKQEugTQBOYE/AUSBSgFPgVUBWoFgAWWBawFwgXYBe4GBAYaBjAGRgZcBnIGiAaeBrQGygbgBvYHDAciBzgHTgdkB3oHkAemB7wH0gfoB/4IFAgqCCoIQAhWCGwIggiYCK4IxAjaCPAJBgkcCTIJSAleCXQJigmgCbYJzAniCfgKDgokCjoKUApmCnwKkgqoCr4K1ArqCwALFgssC0ILWAtuC4QLmguwC8YL3AvyDAgMHgw0DEoMYAx2DIwMogy4DM4M5Az6DRANJg08DVINaA1+DZQNqg3ADdYN7A4CDhgOLg5EDloOcA6GDpwOsg7IDt4O9A8KDyAPNg9MD2IPeA+OD6QPug/QD+YP/BASECgQPhBUEGoQgBCWEKwQwhDYEO4RBBEaETARRhFcEXIRiBGeEbQRyhHgEfYSDBIiEjgSThJkEnoSkBKmErwS0hLoEv4TFBMqE0ATVhNsE4ITmBOuE8QT2hPwFAYUHBQyFEgUXhR0FIoUoBS2FMwU4hT4FQ4VJBU6FVAVZhV8FZIVqBW+FdQV6hYAFhYWLBZCFlgWbhaEFpoWsBbGFtwW8hcIFx4XNBdKF2AXdheMF6IXuBfOF+QX+hgQGCYYPBhSGGgYfhiUGKoYwBjWGOwZAhkYGS4ZRBlaGXAZhhmcGbIZyBneGfQaChogGjYaTBpiGngajhqkGroa0BrmGvwbEhsoGz4bVBtqG4AblhusG8Ib2BvuHAQcGhwwHEYcXBxyHIgcnhy0HMoc4Bz2HQwdIh04HU4dZB16HZAdph28HdId6B3+HhQeKh5AHlYebB6CHpgerh7EHtoe8B8GHxwfMh9IH14fdB+KH6Afth/MH+If+CAOICQgOiBQIGYgfCCSIKggviDUIOohACEWISwhQiFYIW4hhCGaIbAhxiHcIfIiCCIeIjQiSiJgInYijCKiIrgiziLkIvojECMmIzwjUiNoI34jlCOqI8Aj1iPsJAIkGCQuJEQkWiRwJIYknCSyJMgk3iT0JQolICU2JUwlYiV4JY4lpCW6JdAl5iX8JhImKCY+JlQmaiaAJpYmrCbCJtgm7icEJxonMCdGJ1wncieIJ54ntCfKJ+An9igMKCIoOChOKGQoeiiQKKYovCjSKOgo/ikUKSopQClWKWwpgimYKa4pxCnaKfAqBiocKjIqSCpeKnQqiiqgKrYqzCriKvgrDiskKzorUCtmK3wrkiuoK74r1CvqLAAsFiwsLEIsWCxuLIQsmiywLMYs3CzyLQgtHi00LUotYC12LYwtoi24Lc4t5C36LhAuJi48LlIuaC5+LpQuqi7ALtYu7C8CLxgvLi9EL1ovcC+GL5wvsi/IL94v9DAKMCAwNjBMMGIweDCOMKQwujDQMOYw/DESMSgxPjFUMWoxgDGWMawxwjHYMe4yBDIaMjAyRjJcMnIyiDKeMrQyyjLgMvYzDDMiMzgzTjNkM3ozkDOmM7wz0jPoM/40FDQqNEA0VjRsNII0mDSuNMQ02jTwNQY1HDUyNUg1XjV0NYo1oDW2Ncw14jX4Ng42JDY6NlA2ZjZ8NpI2qDa+NtQ26jcANxY3LDdCN1g3bjeEN5o3sDfGN9w38jgIOB44NDhKOGA4djiMOKI4uDjOOOQ4+jkQOSY5PDlSOWg5fjmUOao5wDnWOew6AjoYOi46RDpaOnA6hjqcOrI6yDreOvQ7CjsgOzY7TDtiO3g7jjukO7o70DvmO/w8EjwoPD48VDxqPIA8ljysPMI82DzuPQQ9Gj0wPUY9XD1yPYg9nj20Pco94D32Pgw+Ij44Pk4+ZD56PpA+pj68PtI+6D7+PxQ/Kj9AP1Y/bD+CP5g/rj/EP9o/8EAGQBxAMkBIQF5AdECKQKBAtkDMQOJA+EEOQSRBOkFQQWZBfEGSQahBvkHUQepCAEIWQixCQkJYQm5ChEKaQrBCxkLcQvJDCEMeQzRDSkNgQ3ZDjEOiQ7hDzkPkQ/pEEEQmRDxEUkRoRH5ElESqRMBE1kTsRQJFGEUuRURFWkVwRYZFnEWyRchF3kX0RgpGIEY2RkxGYkZ4Ro5GpEa6RtBG5kb8RxJHKEc+R1RHakeAR5ZHrEfCR9hH7kgESBpIMEhGSFxIckiISJ5ItEjKSOBI9kkMSSJJOElOSWRJekmQSaZJvEnSSehJ/koUSipKQEpWSmxKgkqYSq5KxEraSvBLBkscSzJLSEteS3RLikugS7ZLzEviS/hMDkwkTDpMUExmTHxMfEx8THxMfEx8THxMfEx8THxMfEx8TJJMqEy+TNRM6k0ATRZNLE1CTVhNbk2ETZpNsE3GTdxN8k4ITh5ONE5KTmBOdk6MTqJOuE7OTs5O5E76TxBPJk88T1JPaE9+T35PlE+qT8BP1k/sUAJQGFAuUERQWlBwUIZQnFCyUMhQ3lD0UQpRIFE2UUxRYlF4UY5RpFG6UdBR5lH8UhJSKFI+UlRSalKAUpZSrFLCUthS7lMEUxpTMFNGU1xTclOIU55TtFPKU+BT9lQMVCJUOFROVGRUelSQVKZUvFTSVOhU/lUUVSpVQFVWVWxVglWYVa5VxFXaVfBWBlYcVjJWSFZeVnRWilagVrZWzFbiVvhXDlckVzpXUFdmV3xXkleoV75X1FfqWABYFlgsWEJYWFhuWIRYmliwWMZY3FjyWQhZHlk0WUpZYFl2WYxZolm4Wc5Z5Fn6WhBaJlo8WkpaYFp2Woxaolq4Ws5a5Fr6WxBbJls8W1JbaFt+W5RbqlvAW9Zb7FwCXBhcLlxEXFpccFyGXJxcslzIXN5c9F0KXSBdNl1MXWJdeF2OXaRdul3QXeZd/F4SXihePl5UXmpegF6WXqxewl7YXu5fBF8aXzBfRl9cX3JfiF+eX7Rfyl/gX/ZgDGAiYDhgTmBkYHpgkGCmYLxg0mDoYP5hFGEqYUBhVmFsYYJhmGGuYcRh2mHwYgZiHGIyYkhiXmJ0YopioGK2Ysxi4mL4Yw5jJGM6Y1BjZmN8Y5JjqGO+Y9Rj6mQAZBZkLGRCZFhkbmSEZJpksGTGZNxk8mUIZR5lNGVKZWBldmWMZaJluGXOZeRl+mYQZiZmPGZSZmhmfmaUZqpmwGbWZuxnAmcYZy5nRGdaZ3BnhmecZ7JnyGfeZ/RoCmggaDZoTGhiaHhojmikaLpo0GjmaPxpEmkoaT5pVGlqaYBplmmsacJp2GnuagRqGmowakZqXGpyaohqnmq0aspq4Gr2awxrIms4a05rZGt6a5Brpmu8a9Jr6Gv+bBRsKmxAbFZsbGyCbJhsrmzEbNps8G0GbRxtMm1IbV5tdG2KbaBttm3MbeJt+G4ObiRuOm5QbmZufG6Sbqhuvm7UbupvAG8WbyxvQm9Yb25vhG+ab7Bvxm/cb/JwCHAecDRwSnBgcHZwjHCicLhwznDkcPpxEHEmcTxxUnFocX5xlHGqccBx1nHscgJyGHIuckRyWnJwcoZynHKycshy3nL0cwpzIHM2c0xzYnN4c45zpHO6c9Bz5nP8dBJ0KHQ+dFR0anSAdJZ0rHTCdNh07nUEdRp1MHVGdVx1cnWIdZ51tHXKdeB19nYMdiJ2OHZOdmR2enaQdqZ2vHbSduh2/ncUdyp3QHdWd2x3gneYd653xHfad/B4BngceDJ4SHheeHR4inigeLZ4zHjiePh5DnkkeTp5UHlmeXx5knmoeb551HnqegB6FnosekJ6WHpueoR6mnqwesZ63Hryewh7Hns0e0p7YHt2e4x7onu4e8575Hv6fBB8Jnw8fFJ8aHx+fJR8qnzAfNZ87H0CfRh9Ln1EfVp9cH2GfZx9sn3Ifd599H4KfiB+Nn5MfmJ+eH6OfqR+un7QfuZ+/H8Sfyh/Pn9Uf2p/gH+Wf6x/wn/Yf+6ABIAagDCARoBcgHKAiICegLSAyoDggPaBDIEigTiBToFkgXqBkIGmgbyB0oHogf6CFIIqgkCCVoJsgoKCmIKugsSC2oLwgwaDHIMyg0iDXoN0g4qDoIO2g8yD4oP4hA6EJIQ6hFCEZoR8hJKEqIS+hNSE6oUAhRaFLIVChViFboWEhZqFsIXGhdyF8oYIhh6GNIZKhmCGdoaMhqKGuIbOhuSG+ocQhyaHPIdSh2iHfoeUh6qHwIfWh+yIAogYiC6IRIhaiHCIhoiciLKIyIjeiPSJCokgiTaJTIliiXiJjomkibqJ0InmifyKEoooij6KVIpqioCKloqsisKK2IruiwSLGoswi0aLXItyi4iLnou0i8qL4Iv2jAyMIow4jE6MZIx6jJCMpoy8jNKM6Iz+jRSNKo1AjVaNbI2CjZiNro3EjdqN8I4GjhyOMo5Ijl6OdI6KjqCOto7MjuKO+I8OjySPOo9Qj2aPfI+Sj6iPvo/UAAAAAQAABpwADAACAAAAAAACABAALwBWAAAEDQAAAAAAAAAAABAAxgADAAEECQABABAAAAADAAEECQACAA4AEAADAAEECQADACIAHgADAAEECQAEACAAQAADAAEECQAFABgAYAADAAEECQAGABAAeAADAAEECQAHABAAiAADAAEECQAIACYAmAADAAEECQAJAIoAvgADAAEECQAKBMIBSAADAAEECQALAGIGCgADAAEECQAMAGYGbAADAAEECQANBrQG0gADAAEECQAOAFwNhgADAAEECQDIABYN4gADAAEECQDJADAN+ABQAGEAcwBzAHcAbwByAGQAUgBlAGcAdQBsAGEAcgBNAG8AbgBvAHQAeQBwAGUAOgBQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMQAuADAAMABQAGEAcwBzAHcAbwByAGQAUABhAHMAcwB3AG8AcgBkAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkATQBvAG4AbwB0AHkAcABlACAAVAB5AHAAZQAgAEQAcgBhAHcAaQBuAGcAIABPAGYAZgBpAGMAZQAgAC0AIABSAG8AYgBpAG4AIABOAGkAYwBoAG8AbABhAHMALAAgAFAAYQB0AHIAaQBjAGkAYQAgAFMAYQB1AG4AZABlAHIAcwAgADEAOQA4ADIAQwBvAG4AdABlAG0AcABvAHIAYQByAHkAIABzAGEAbgBzACAAcwBlAHIAaQBmACAAZABlAHMAaQBnAG4ALAAgAEEAcgBpAGEAbAAgAGMAbwBuAHQAYQBpAG4AcwAgAG0AbwByAGUAIABoAHUAbQBhAG4AaQBzAHQAIABjAGgAYQByAGEAYwB0AGUAcgBpAHMAdABpAGMAcwAgAHQAaABhAG4AIABtAGEAbgB5ACAAbwBmACAAaQB0AHMAIABwAHIAZQBkAGUAYwBlAHMAcwBvAHIAcwAgAGEAbgBkACAAYQBzACAAcwB1AGMAaAAgAGkAcwAgAG0AbwByAGUAIABpAG4AIAB0AHUAbgBlACAAdwBpAHQAaAAgAHQAaABlACAAbQBvAG8AZAAgAG8AZgAgAHQAaABlACAAbABhAHMAdAAgAGQAZQBjAGEAZABlAHMAIABvAGYAIAB0AGgAZQAgAHQAdwBlAG4AdABpAGUAdABoACAAYwBlAG4AdAB1AHIAeQAuACAAIABUAGgAZQAgAG8AdgBlAHIAYQBsAGwAIAB0AHIAZQBhAHQAbQBlAG4AdAAgAG8AZgAgAGMAdQByAHYAZQBzACAAaQBzACAAcwBvAGYAdABlAHIAIABhAG4AZAAgAGYAdQBsAGwAZQByACAAdABoAGEAbgAgAGkAbgAgAG0AbwBzAHQAIABpAG4AZAB1AHMAdAByAGkAYQBsACAAcwB0AHkAbABlACAAcwBhAG4AcwAgAHMAZQByAGkAZgAgAGYAYQBjAGUAcwAuACAAIABUAGUAcgBtAGkAbgBhAGwAIABzAHQAcgBvAGsAZQBzACAAYQByAGUAIABjAHUAdAAgAG8AbgAgAHQAaABlACAAZABpAGEAZwBvAG4AYQBsACAAdwBoAGkAYwBoACAAaABlAGwAcABzACAAdABvACAAZwBpAHYAZQAgAHQAaABlACAAZgBhAGMAZQAgAGEAIABsAGUAcwBzACAAbQBlAGMAaABhAG4AaQBjAGEAbAAgAGEAcABwAGUAYQByAGEAbgBjAGUALgAgACAAQQByAGkAYQBsACAAaQBzACAAYQBuACAAZQB4AHQAcgBlAG0AZQBsAHkAIAB2AGUAcgBzAGEAdABpAGwAZQAgAGYAYQBtAGkAbAB5ACAAbwBmACAAdAB5AHAAZQBmAGEAYwBlAHMAIAB3AGgAaQBjAGgAIABjAGEAbgAgAGIAZQAgAHUAcwBlAGQAIAB3AGkAdABoACAAZQBxAHUAYQBsACAAcwB1AGMAYwBlAHMAcwAgAGYAbwByACAAdABlAHgAdAAgAHMAZQB0AHQAaQBuAGcAIABpAG4AIAByAGUAcABvAHIAdABzACwAIABwAHIAZQBzAGUAbgB0AGEAdABpAG8AbgBzACwAIABtAGEAZwBhAHoAaQBuAGUAcwAgAGUAdABjACwAIABhAG4AZAAgAGYAbwByACAAZABpAHMAcABsAGEAeQAgAHUAcwBlACAAaQBuACAAbgBlAHcAcwBwAGEAcABlAHIAcwAsACAAYQBkAHYAZQByAHQAaQBzAGkAbgBnACAAYQBuAGQAIABwAHIAbwBtAG8AdABpAG8AbgBzAC4AaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG0AbwBuAG8AdAB5AHAAZQAuAGMAbwBtAC8AaAB0AG0AbAAvAG0AdABuAGEAbQBlAC8AbQBzAF8AYQByAGkAYQBsAC4AaAB0AG0AbABoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AbQB0AG4AYQBtAGUALwBtAHMAXwB3AGUAbABjAG8AbQBlAC4AaAB0AG0AbABOAE8AVABJAEYASQBDAEEAVABJAE8ATgAgAE8ARgAgAEwASQBDAEUATgBTAEUAIABBAEcAUgBFAEUATQBFAE4AVAANAAoADQAKAFQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABpAHMAIAB0AGgAZQAgAHAAcgBvAHAAZQByAHQAeQAgAG8AZgAgAE0AbwBuAG8AdAB5AHAAZQAgAFQAeQBwAG8AZwByAGEAcABoAHkAIABhAG4AZAAgAGkAdABzACAAdQBzAGUAIABiAHkAIAB5AG8AdQAgAGkAcwAgAGMAbwB2AGUAcgBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAHQAZQByAG0AcwAgAG8AZgAgAGEAIABsAGkAYwBlAG4AcwBlACAAYQBnAHIAZQBlAG0AZQBuAHQALgAgAFkAbwB1ACAAaABhAHYAZQAgAG8AYgB0AGEAaQBuAGUAZAAgAHQAaABpAHMAIAB0AHkAcABlAGYAYQBjAGUAIABzAG8AZgB0AHcAYQByAGUAIABlAGkAdABoAGUAcgAgAGQAaQByAGUAYwB0AGwAeQAgAGYAcgBvAG0AIABNAG8AbgBvAHQAeQBwAGUAIABvAHIAIAB0AG8AZwBlAHQAaABlAHIAIAB3AGkAdABoACAAcwBvAGYAdAB3AGEAcgBlACAAZABpAHMAdAByAGkAYgB1AHQAZQBkACAAYgB5ACAAbwBuAGUAIABvAGYAIABNAG8AbgBvAHQAeQBwAGUAJwBzACAAbABpAGMAZQBuAHMAZQBlAHMALgANAAoADQAKAFQAaABpAHMAIABzAG8AZgB0AHcAYQByAGUAIABpAHMAIABhACAAdgBhAGwAdQBhAGIAbABlACAAYQBzAHMAZQB0ACAAbwBmACAATQBvAG4AbwB0AHkAcABlAC4AIABVAG4AbABlAHMAcwAgAHkAbwB1ACAAaABhAHYAZQAgAGUAbgB0AGUAcgBlAGQAIABpAG4AdABvACAAYQAgAHMAcABlAGMAaQBmAGkAYwAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAGcAcgBhAG4AdABpAG4AZwAgAHkAbwB1ACAAYQBkAGQAaQB0AGkAbwBuAGEAbAAgAHIAaQBnAGgAdABzACwAIAB5AG8AdQByACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAG0AaQB0AGUAZAAgAHQAbwAgAHkAbwB1AHIAIAB3AG8AcgBrAHMAdABhAHQAaQBvAG4AIABmAG8AcgAgAHkAbwB1AHIAIABvAHcAbgAgAHAAdQBiAGwAaQBzAGgAaQBuAGcAIAB1AHMAZQAuACAAWQBvAHUAIABtAGEAeQAgAG4AbwB0ACAAYwBvAHAAeQAgAG8AcgAgAGQAaQBzAHQAcgBpAGIAdQB0AGUAIAB0AGgAaQBzACAAcwBvAGYAdAB3AGEAcgBlAC4ADQAKAA0ACgBJAGYAIAB5AG8AdQAgAGgAYQB2AGUAIABhAG4AeQAgAHEAdQBlAHMAdABpAG8AbgAgAGMAbwBuAGMAZQByAG4AaQBuAGcAIAB5AG8AdQByACAAcgBpAGcAaAB0AHMAIAB5AG8AdQAgAHMAaABvAHUAbABkACAAcgBlAHYAaQBlAHcAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAgAHkAbwB1ACAAcgBlAGMAZQBpAHYAZQBkACAAdwBpAHQAaAAgAHQAaABlACAAcwBvAGYAdAB3AGEAcgBlACAAbwByACAAYwBvAG4AdABhAGMAdAAgAE0AbwBuAG8AdAB5AHAAZQAgAGYAbwByACAAYQAgAGMAbwBwAHkAIABvAGYAIAB0AGgAZQAgAGwAaQBjAGUAbgBzAGUAIABhAGcAcgBlAGUAbQBlAG4AdAAuAA0ACgANAAoATQBvAG4AbwB0AHkAcABlACAAYwBhAG4AIABiAGUAIABjAG8AbgB0AGEAYwB0AGUAZAAgAGEAdAA6AA0ACgANAAoAVQBTAEEAIAAtACAAKAA4ADQANwApACAANwAxADgALQAwADQAMAAwAAkACQBVAEsAIAAtACAAMAAxADEANAA0ACAAMAAxADcAMwA3ACAANwA2ADUAOQA1ADkADQAKAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBtAG8AbgBvAHQAeQBwAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbQBvAG4AbwB0AHkAcABlAC4AYwBvAG0ALwBoAHQAbQBsAC8AdAB5AHAAZQAvAGwAaQBjAGUAbgBzAGUALgBoAHQAbQBsAFcAZQBiAGYAbwBuAHQAIAAxAC4AMABGAHIAaQAgAEYAZQBiACAAIAA4ACAAMAA5ADoAMgA2ADoANAA0ACAAMgAwADEAMwAAAAIAAAAAAAD/JwCWAAAAAAAAAAAAAAAAAAAAAAAAAAAGnAAAAAEAAgECAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQEDAKMAhACFAL0AlgDoAIYAjgCLAJ0AqQCkAQQAigEFAIMAkwDyAPMAjQEGAIgAwwDeAPEAngCqAPUA9AD2AKIArQDJAMcArgBiAGMAkABkAMsAZQDIAMoAzwDMAM0AzgDpAGYA0wDQANEArwBnAPAAkQDWANQA1QBoAOsA7QCJAGoAaQBrAG0AbABuAKAAbwBxAHAAcgBzAHUAdAB2AHcA6gB4AHoAeQB7AH0AfAC4AKEAfwB+AIAAgQDsAO4AugEHAQgBCQEKAQsBDAD9AP4BDQEOAQ8BEAD/AQABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8BIAD4APkBIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAD6ANcBMQEyATMBNAE1ATYBNwE4ATkBOgE7ATwBPQE+AT8A4gDjAUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOALAAsQFPAVABUQFSAVMBVAFVAVYBVwFYAPsA/ADkAOUBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgC7AW8BcAFxAXIA5gDnAXMBdACmAXUBdgF3AXgBeQF6AXsBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAGJAYoBiwGMAY0BjgGPANgA4QDaANsA3ADdAOAA2QDfAZABkQGSAZMBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIAqAGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AJ8BtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAccAlwHIAckBygCbAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IDcwN0A3UDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzALIAswO0A7UAtgC3AMQDtgC0ALUAxQCCAMIAhwCrA7cDuAO5A7oDuwO8AMYDvQO+AL4AvwO/A8AAvAPBA8IDwwPEA8UDxgPHA8gA9wPJA8oDywPMA80DzgPPA9AAjAPRA9ID0wPUA9UD1gPXA9gD2QPaA9sD3APdA94D3wCYA+AAmgCZAO8ApQCSA+ED4gCcAKcAjwPjAJQAlQPkA+UD5gPnA+gD6QPqA+sD7APtA+4D7wPwA/ED8gPzA/QD9QP2A/cD+AP5A/oD+wP8A/0D/gP/BAAEAQQCBAMEBAQFBAYEBwQIBAkECgQLBAwEDQQOBA8EEAQRBBIEEwQUBBUEFgQXBBgEGQQaBBsEHAQdBB4EHwQgALkEIQQiBCMEJAQlBCYEJwQoBCkEKgQrBCwELQQuBC8EMAQxBDIEMwQ0BDUENgQ3BDgEOQQ6BDsEPAQ9BD4EPwRABEEEQgRDBEQERQRGBEcESARJBEoESwRMBE0ETgRPBFAEUQRSBFMEVARVBFYEVwRYBFkEWgRbBFwEXQReBF8EYARhBGIEYwRkBGUEZgDAAMEEZwRoBGkEagRrBGwEbQRuBG8EcARxBHIEcwR0BHUEdgR3BHgEeQR6BHsEfAR9BH4EfwSABIEEggSDBIQEhQSGBIcEiASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/BMAEwQTCBMMExATFBMYExwTIBMkEygTLBMwEzQTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3ATdBN4E3wTgBOEE4gTjBOQE5QTmBOcE6ATpBOoE6wTsBO0E7gTvBPAE8QTyBPME9AT1BPYE9wT4BPkE+gT7BPwE/QT+BP8FAAUBBQIFAwUEBQUFBgUHBQgFCQUKBQsFDAUNBQ4FDwUQBREFEgUTBRQFFQUWBRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0BTUFNgU3BTgFOQU6BTsFPAU9BT4FPwVABUEFQgVDBUQFRQVGBUcFSAVJBUoFSwVMBU0FTgVPBVAFUQVSBVMFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVkBWUFZgVnBWgFaQVqBWsFbAVtBW4FbwVwBXEFcgVzBXQFdQV2BXcFeAV5BXoFewV8BX0FfgV/BYAFgQWCBYMFhAWFBYYFhwWIBYkFigWLBYwFjQWOBY8FkAWRBZIFkwWUBZUFlgWXBZgFmQWaBZsFnAWdBZ4FnwWgBaEFogWjBaQFpQWmBacFqAWpBaoFqwWsBa0FrgWvBbAFsQWyBbMFtAW1BbYFtwW4BbkFugW7BbwFvQW+Bb8FwAXBBcIFwwXEBcUFxgXHBcgFyQXKBcsFzAXNBc4FzwXQBdEF0gXTBdQF1QXWBdcF2AXZBdoF2wXcBd0F3gXfBeAF4QXiBeMF5AXlBeYF5wXoBekF6gXrBewF7QXuBe8F8AXxBfIF8wX0BfUF9gX3BfgF+QX6BfsF/AX9Bf4F/wYABgEGAgYDBgQGBQYGBgcGCAYJBgoGCwYMBg0GDgYPBhAGEQYSBhMGFAYVBhYGFwYYBhkGGgYbBhwGHQYeBh8GIAYhBiIGIwYkBiUGJgYnBigGKQYqBisGLAYtBi4GLwYwBjEGMgYzBjQGNQY2BjcGOAY5BjoGOwY8Bj0GPgY/BkAGQQZCBkMGRAZFBkYGRwZIBkkGSgZLBkwGTQZOBk8GUAZRBlIGUwZUBlUGVgZXBlgGWQZaBlsGXAZdBl4GXwZgBmEGYgZjBmQGZQZmBmcGaAZpBmoGawZsBm0GbgZvBnAGcQZyBnMGdAZ1BnYGdwZ4BnkGegZ7BnwGfQZ+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWdseXBoMTY3MwCxVA9BIgMXAO8DFwD/AxcAAwAfAxcALwMXAE8DFwBfAxcAjwMXAJ8DFwAGAA8DFwBfAxcAbwMXAH8DFwC/AxcA8AMXAAYAQAMXspIzQLgDF7KLM0C4AxezamwyQLgDF7JhM0C4AxezXF0yQLgDF7NXWTJAuAMXs01RMkC4AxezREkyQLgDF7I6M0C4AxezMTQyQLgDF7MuQjJAuAMXsycsMkC4AxezEiUygLgDF7MKDTLAQRYDFgDQAxYAAgBwAxYAAQLEAA8BAQAfAKADFQCwAxUAAgMGAA8BAQAfAEADErMkJjKfvwMEAAEDAgMBAGQAH//AAwGyDREyQQoC/wLvABIAHwLuAu0AZAAf/8AC7bMOETKfQUoC4gCvAuIAvwLiAAMC4gLiAuEC4QB/AuAAAQAQAuAAPwLgAJ8C4AC/AuAAzwLgAO8C4AAGAuAC4ALfAt8C3gLeAA8C3QAvAt0APwLdAF8C3QCfAt0AvwLdAO8C3QAHAt0C3QAQAtwAAQAAAtwAAQAQAtwAPwLcAAIC3ALcABAC2wABAtsC2wAPAtoAAQLaAtr/wALTsjc5Mrn/wALTsisvMrn/wALTsh8lMrn/wALTshcbMrn/wALTshIWMrgC0rL5KR+4AuOzICsfoEEwAtQAsALUAAIAAALUABAC1AAgAtQAUALUAGAC1ABwAtQABgBgAtYAcALWAIAC1gCQAtYAoALWALAC1gAGAAAC1gAQAtYAIALKACACzAAgAtYAMALWAEAC1gBQAtYACALQsiArH7gCz7ImQh9BFgLOAscAFwAfAs0CyAAXAB8CzALGABcAHwLLAsUAFwAfAskCxQAeAB8CygLGsh4fAEELAsYAAALHABACxgAQAscALwLFAAUCwbMkEh//QRECvwABAB8CvwAvAr8APwK/AE8CvwBfAr8AjwK/AAYCvwIismQfEkELArsAyggAAB8CsgDpCAAAHwKmAKIIAEBqH0AmQ0kyQCBDSTJAJjo9MkAgOj0ynyCfJgJAJpaZMkAglpkyQCaOkjJAII6SMkAmhIwyQCCEjDJAJnqBMkAgeoEyQCZsdjJAIGx2MkAmZGoyQCBkajJAJlpfMkAgWl8yQCZPVDJAIE9UMrgCnrckJx83T2sBIEEPAncAMAJ3AEACdwBQAncABAJ3AncCdwD5BAAAHwKbsioqH7gCmkArKSofgLoBgLwBgFIBgKIBgGUBgH4BgIEBgDwBgF4BgCsBgBwBgB4BgEABgLsBOAABAIABQLQBgEABgLsBOAABAIABOUAYAYDKAYCtAYBzAYAmAYAlAYAkAYAgATdAuAIhskkzQLgCIbJFM0C4AiGzQUIyQLgCIbM9PjIPQQ8CIQA/AiEAfwIhAAMAvwIhAM8CIQD/AiEAAwBAAiGzICIyQLgCIbMZHjJAuAIisyo/MkC4AiGzLjoyb0FIAsMAfwLDAI8CwwDfAsMABAAvAsMAYALDAM8CwwADAA8CwwA/AsMAXwLDAMACwwDvAsMA/wLDAAYA3wIiAAEAjwIiAAEADwIiAC8CIgA/AiIAXwIiAH8CIgDvAiIABgC/AiEA7wIhAAIAbwIhAH8CIQCvAiEAAwAvAiEAPwIhAE8CIQADAsMCwwIiAiICIQIhQB0QHBArEEgDjxwBDx4BTx7/HgI3ABYWAAAAEhEIEbgBDbb3Dfj3DQAJQQkCjgKPAB0AHwKQAo8AHQAfAo+y+R0fuAGYsia7H0EVAZcAHgQBAB8BOQAmASUAHwE4AHMEAQAfATUAHAgBAB8BNAAcAqsAHwEyshxWH7gBD7ImLB+6AQ4AHgQBth/5HOQf6Ry4AgG2H+gcux/XILgEAbIf1Ry4Aqu2H9QciR/JL7gIAbIfvCa4AQGyH7oguAIBth+5HDgfrcq4BAGyH4EmuAGash9+JrgBmrYffRxHH2scuAQBsh9lJrgBmrIfXnO4BAFADx9SJlofSByJH0QcYh9Ac7gIAbYfPxxeHzwmuAGash81HLgEAbYfMBy7HyscuAQBth8qHFYfKRy4AQGyHyMeuAQBsh9VN7gBaEAsB5YHWAdPBzYHMgcsByEHHwcdBxsHFAgSCBAIDggMCAoICAgGCAQIAggACBS4/+BAKwAAAQAUBhAAAAEABgQAAAEABBAAAAEAEAIAAAEAAgAAAAEAAAIBCAIASgCwEwNLAktTQgFLsMBjAEtiILD2UyO4AQpRWrAFI0IBsBJLAEtUQrA4K0u4B/9SsDcrS7AHUFtYsQEBjlmwOCuwAoi4AQBUWLgB/7EBAY6FG7ASQ1i5AAEBEYWNG7kAAQEohY1ZWQAYFnY/GD8SPhE5RkQ+ETlGRD4ROUZEPhE5RkQ+ETlGYEQ+ETlGYEQrKysrKysrKysrKxgrKysrKysrKysrKxgrHbCWS1NYsKodWbAyS1NYsP8dWUuwk1MgXFi5AfIB8EVEuQHxAfBFRFlYuQM+AfJFUli5AfIDPkRZWUu4AVZTIFxYuQAgAfFFRLkAJgHxRURZWLkIHgAgRVJYuQAgCB5EWVlLuAGaUyBcWLkAJQHyRUS5ACQB8kVEWVi5CQkAJUVSWLkAJQkJRFlZS7gEAVMgXFixcyRFRLEkJEVEWVi5FyAAc0VSWLkAcxcgRFlZS7gEAVMgXFixyiVFRLElJUVEWVi5FoAAykVSWLkAyhaARFlZS7A+UyBcWLEcHEVEsR4cRURZWLkBGgAcRVJYuQAcARpEWVlLsFZTIFxYsRwcRUSxLxxFRFlYuQGJABxFUli5ABwBiURZWUu4AwFTIFxYsRwcRUSxHBxFRFlYuQ3gABxFUli5ABwN4ERZWSsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrZUIrKwGzO1ljXEVlI0VgI0VlYCNFYLCLdmgYsIBiICCxY1lFZSNFILADJmBiY2ggsAMmYWWwWSNlRLBjI0QgsTtcRWUjRSCwAyZgYmNoILADJmFlsFwjZUSwOyNEsQBcRVRYsVxAZUSyO0A7RSNhRFmzR1A0N0VlI0VgI0VlYCNFYLCJdmgYsIBiICCxNFBFZSNFILADJmBiY2ggsAMmYWWwUCNlRLA0I0QgsUc3RWUjRSCwAyZgYmNoILADJmFlsDcjZUSwRyNEsQA3RVRYsTdAZUSyR0BHRSNhRFkAS1NCAUtQWLEIAEJZQ1xYsQgAQlmzAgsKEkNYYBshWUIWEHA+sBJDWLk7IRh+G7oEAAGoAAsrWbAMI0KwDSNCsBJDWLktQS1BG7oEAAQAAAsrWbAOI0KwDyNCsBJDWLkYfjshG7oBqAQAAAsrWbAQI0KwESNCACt0dXN1ABhFaURFaURFaURzc3NzdHVzdHUrKysrdHUrKysrK3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3MrKytFsEBhRHN0AABLsCpTS7A/UVpYsQcHRbBAYERZAEuwOlNLsD9RWlixCwtFuP/AYERZAEuwLlNLsDpRWlixAwNFsEBgRFkAS7AuU0uwPFFaWLEJCUW4/8BgRFkrKysrKysrKysrKysrKysrKyt1KysrKysrK0NcWLkAgAK7swFAHgF0AHNZA7AeS1QCsBJLVFqwEkNcWli6AJ8CIgABAHNZACt0cwErAXMrKysrKysrK3Nzc3MrACsrKysrKwBFaURzRWlEc0VpRHN0dUVpRHNFaURFaURFaURzdEVpREVpRHMrKysrK3MrACtzK3R1KysrKysrKysrKysrKytzdHUrAAABURULJAAA) format('truetype');
81}
diff --git a/frontend/delta/less/web/mixin.less b/frontend/delta/less/web/mixin.less
new file mode 100644
index 0000000..2728079
--- a/dev/null
+++ b/frontend/delta/less/web/mixin.less
@@ -0,0 +1,87 @@
1.border-radius (@radius) {
2 border-radius: @radius;
3 -moz-border-radius: @radius;
4 -webkit-border-radius: @radius;
5}
6
7.font-feature-settings(@foo, @bar) {
8 -webkit-font-feature-settings:"@foo","@bar";
9 -moz-font-feature-settings:"@foo=1, @bar=1";
10 -moz-font-feature-settings:"@foo","@bar";
11 -ms-font-feature-settings:"@foo","@bar";
12 -o-font-feature-settings:"@foo","@bar";
13 font-feature-settings:"@foo","@bar";
14}
15
16.icon-font() {
17 font-family: 'clipperz-icons';
18 .font-feature-settings("liga", "dlig");
19 -webkit-font-smoothing: antialiased;
20 text-rendering:optimizeLegibility;
21}
22
23.password-font() {
24 font-family: 'clipperz-password';
25 -webkit-font-smoothing: antialiased;
26 text-rendering:optimizeLegibility;
27}
28
29.animation (@animation, @duration, @fill-mode:none, @iteration-count:1) {
30 -webkit-animation-name: @animation;
31 -webkit-animation-duration: @duration;
32 -webkit-animation-fill-mode: @fill-mode;
33 -webkit-animation-iteration-count: @iteration-count;
34
35 -moz-animation-name: @animation;
36 -moz-animation-duration: @duration;
37 -moz-animation-fill-mode: @fill-mode;
38 -moz-animation-iteration-count: @iteration-count;
39
40 -ms-animation-name: @animation;
41 -ms-animation-duration: @duration;
42 -ms-animation-fill-mode: @fill-mode;
43 -ms-animation-iteration-count: @iteration-count;
44
45 -o-animation-name: @animation;
46 -o-animation-duration: @duration;
47 -o-animation-fill-mode: @fill-mode;
48 -o-animation-iteration-count: @iteration-count;
49
50 animation-name: @animation;
51 animation-duration: @duration;
52 animation-fill-mode: @fill-mode;
53 animation-iteration-count: @iteration-count;
54}
55
56.transition (@item, @time, @function) {
57 -webkit-transition: @item @time @function;
58 -moz-transition: @item @time @function;
59 -o-transition: @item @time @function;
60 -ms-transition: @item @time @function;
61 transition: @item @time @function;
62}
63
64.transform (@rotateAngle, @translateX, @translateY) {
65 -webkit-transform: rotate( @rotateAngle) translate(@translateX, @translateY);
66 -moz-transform: rotate( @rotateAngle) translate(@translateX, @translateY);
67 -ms-transform: rotate( @rotateAngle) translate(@translateX, @translateY);
68 -o-transform: rotate( @rotateAngle) translate(@translateX, @translateY);
69 transform: rotate( @rotateAngle) translate(@translateX, @translateY);
70}
71
72
73.animation-delay (@delay) {
74 -webkit-animation-delay: @delay;
75 -moz-animation-delay: @delay;
76 -ms-animation-delay: @delay;
77 -o-animation-delay: @delay;
78 animation-delay: @delay;
79}
80
81.box-shadow (@xOffset, @yOffset, @size, @color) {
82 -webkit-box-shadow: @xOffset @yOffset @size @color;
83 -moz-box-shadow: @xOffset @yOffset @size @color;
84 -ms-box-shadow: @xOffset @yOffset @size @color;
85 -o-box-shadow: @xOffset @yOffset @size @color;
86 box-shadow: @xOffset @yOffset @size @color;
87}
diff --git a/frontend/delta/less/web/overlay.less b/frontend/delta/less/web/overlay.less
new file mode 100644
index 0000000..bac3ca3
--- a/dev/null
+++ b/frontend/delta/less/web/overlay.less
@@ -0,0 +1,157 @@
1@import "mixin";
2
3div.overlay {
4 z-index: 99999;
5 position: fixed;
6 top: 50%;
7 left: 50%;
8 width: 200px;
9 height: 200px;
10 margin-left: -100px;
11 margin-top: -100px;
12 background: rgba(0,0,0,0.8);
13 .border-radius(20px);
14
15 .title {
16 color: #FFF;
17 font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
18 font-weight: bold;
19 text-align: center;
20 display: block;
21 font-size: 26px;
22 position: absolute;
23 bottom: 30px;
24 left: 0;
25 width: 100%;
26 }
27
28 .icon {
29 position: relative;
30 display: inline-block;
31 width: 128px;
32 height: 128px;
33 top: 40%;
34 left: 50%;
35 margin-left: -64px;
36 margin-top: -64px;
37
38 text-align: center;
39 vertical-align: middle;
40
41 .icon-font();
42 font-size: 96pt;
43 color: white;
44 text-shadow: none;
45 }
46
47 &.ios-overlay-show {
48 .animation(ios-overlay-show, 750ms);
49 }
50
51
52 &.ios-overlay-hide {
53 .animation(ios-overlay-hide, 750ms, forwards);
54 }
55
56 //http://37signals.com/svn/posts/2577-loading-spinner-animation-using-css-and-webkit
57 div.spinner {
58 position: relative;
59 width: 100px;
60 height: 100px;
61 left: 50% !important;
62 top: 40% !important;
63
64 margin-left: -50px;
65 margin-top: -50px;
66
67 // display: inline-block;
68 display: block;
69
70 div {
71 width: 12%;
72 height: 26%;
73 background: #ffffff;
74 position: absolute;
75 left: 44.5%;
76 top: 37%;
77 opacity: 0;
78 .animation(fade, 1s, linear, infinite);
79 .border-radius(50px);
80 .box-shadow(0, 0, 3px, rgba(0,0,0,0.2));
81 }
82
83 div.bar01 {.transform( 0deg, 0, -142%); .animation-delay(-0.00000s);}
84 div.bar02 {.transform( 30deg, 0, -142%); .animation-delay(-0.91670s);}
85 div.bar03 {.transform( 60deg, 0, -142%); .animation-delay(-0.83300s);}
86 div.bar04 {.transform( 90deg, 0, -142%); .animation-delay(-0.75000s);}
87 div.bar05 {.transform(120deg, 0, -142%); .animation-delay(-0.66700s);}
88 div.bar06 {.transform(150deg, 0, -142%); .animation-delay(-0.58330s);}
89 div.bar07 {.transform(180deg, 0, -142%); .animation-delay(-0.50000s);}
90 div.bar08 {.transform(210deg, 0, -142%); .animation-delay(-0.41667s);}
91 div.bar09 {.transform(240deg, 0, -142%); .animation-delay(-0.33300s);}
92 div.bar10 {.transform(270deg, 0, -142%); .animation-delay(-0.25000s);}
93 div.bar11 {.transform(300deg, 0, -142%); .animation-delay(-0.16670s);}
94 div.bar12 {.transform(330deg, 0, -142%); .animation-delay(-0.08330s);}
95
96 @-webkit-keyframes fade {
97 from {opacity: 1;}
98 to {opacity: 0.25;}
99 }
100 @-o-keyframes fade {
101 from {opacity: 1;}
102 to {opacity: 0.25;}
103 }
104 @keyframes fade {
105 from {opacity: 1;}
106 to {opacity: 0.25;}
107 }
108 }
109}
110
111//========================================================
112
113@-webkit-keyframes ios-overlay-show {
114 0% { opacity: 0; }
115 100% { opacity: 1; }
116}
117@-moz-keyframes ios-overlay-show {
118 0% { opacity: 0; }
119 100% { opacity: 1; }
120}
121@-ms-keyframes ios-overlay-show {
122 0% { opacity: 0; }
123 100% { opacity: 1; }
124}
125@-o-keyframes ios-overlay-show {
126 0% { opacity: 0; }
127 100% { opacity: 1; }
128}
129@keyframes ios-overlay-show {
130 0% { opacity: 0; }
131 100% { opacity: 1; }
132}
133
134//--------------------------------------------------------
135
136@-webkit-keyframes ios-overlay-hide {
137 0% { opacity: 1; }
138 100% { opacity: 0; }
139}
140@-moz-keyframes ios-overlay-hide {
141 0% { opacity: 1; }
142 100% { opacity: 0; }
143}
144@-ms-keyframes ios-overlay-hide {
145 0% { opacity: 1; }
146 100% { opacity: 0; }
147}
148@-o-keyframes ios-overlay-hide {
149 0% { opacity: 1; }
150 100% { opacity: 0; }
151}
152@keyframes ios-overlay-hide {
153 0% { opacity: 1; }
154 100% { opacity: 0; }
155}
156
157//========================================================
diff --git a/frontend/delta/less/web/style.less b/frontend/delta/less/web/style.less
new file mode 100644
index 0000000..05ae794
--- a/dev/null
+++ b/frontend/delta/less/web/style.less
@@ -0,0 +1,730 @@
1 //http://ethanschoonover.com/solarized
2@solarize-Background-15: #002b36;
3@solarize-Background-20: #073642;
4
5@solarize-Content-45: #586375;
6@solarize-Content-50: #657b83;
7@solarize-Content-60: #839496;
8@solarize-Content-65: #93a1a1;
9
10 @solarize-Background-92:#eee8d5;
11 @solarize-Background-97:#fdf6e3;
12
13 @solarize-Accent-Yellow:#b58900;
14 @solarize-Accent-Orange:#cb4b16;
15 @solarize-Accent-Red: #dc322f;
16 @solarize-Accent-Magenta:#d33682;
17 @solarize-Accent-Violet:#6c71c4;
18 @solarize-Accent-Blue: #268bd2;
19 @solarize-Accent-Cyan: #2aa198;
20 @solarize-Accent-Green: #859900;
21
22 @clipperz-orange:#ff9900;
23 @clipperz-blue: #1863a1;
24 @terminal-green:#23ff18;
25
26@text-color: @solarize-Content-50;
27@background-color: #f8f8f8;
28
29//------------------------------------------------------------------
30
31@side-margin: 10px;
32
33//==================================================================
34/*
35 # box-sizing: { content-box | border-box | inherit };
36
37 # css flex box (also with LESSCSS mixin):
38 - https://github.com/ProLoser/Flexbox.less;
39 - https://gist.github.com/jayj/4012969
40
41*/
42//==================================================================
43
44body {
45 font-family: "Source Code Pro";
46 background: @background-color url('data:image/png;base64,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') top left;
47 font-size: 18pt;
48}
49
50a {
51 cursor: pointer;
52}
53
54.button {
55 min-height: 48px;
56 min-width: 48px;
57
58 color: white;
59 font-size: 100%;
60 font-weight: 700;
61 border: 0px;
62
63 padding-left: 20px;
64 padding-right: 20px;
65
66 background-color: @solarize-Accent-Red;
67 .transition(background-color, 0.2s, linear);
68 //.transition(all, 0.2s, linear);
69
70 &:hover {
71 };
72
73 &:disabled {
74 background-color: #c0c0c0;
75 &:hover {
76 };
77 }
78}
79
80div.page {
81 padding: 0px;
82 margin: 0px;
83 width: 100%;
84 //text-align: center;
85
86 div.header {
87 h1 {
88 font-size: 36pt;
89 font-weight: 900;
90 color: @clipperz-orange;
91 margin: 0px @side-margin;
92 }
93 }
94
95 div.content {
96 margin: 0px @side-margin;
97 }
98}
99
100
101
102@Loading_outer-color: @solarize-Accent-Violet;
103@Loading_inner-color: lighten(@Loading_outer-color, 30%);
104
105 @Loading_h1-color: lighten(@Loading_inner-color, 70%);
106 @Loading_h3-color: @Loading_outer-color;
107
108#loadingPage {
109 background-image: -ms-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* IE10 */
110 background-image: -moz-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Mozilla Firefox */
111 background-image: -o-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Opera */
112 background-image: -webkit-radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Webkit (Chrome 11+) */
113 background-image: radial-gradient(center, circle farthest-corner, @Loading_inner-color 0%, @Loading_outer-color 100%); /* Proposed W3C Markup */
114 background-image: -webkit-gradient(radial, center center, 0, center center, 495, color-stop(0, @Loading_inner-color), color-stop(1, @Loading_outer-color));/* Webkit (Safari/Chrome 10) */
115
116 div {
117 vertical-align: middle;
118 width: 100%;
119 text-align: center;
120
121 h1 {
122 font-size: 40pt;
123 color: @Loading_h1-color;
124 margin-top: 5%;
125 margin-bottom: 5px;
126 }
127
128 h3 {
129 font-size: 18pt;
130 color: @Loading_h3-color;
131 margin: 0px;
132 }
133 }
134}
135
136#loginPage {
137 form {
138 label {
139 display: none;
140 }
141 input {
142 display: block;
143 border: 1px solid @solarize-Background-92;
144 .border-radius(6px);
145 padding: 5px;
146 margin-top: 5px;
147 margin-bottom: 10px;
148 font-size: 100%;
149 box-shadow:inset 0 0 0;
150 }
151 button {
152 }
153 }
154
155 .registrationLink {
156 color: @solarize-Accent-Orange;
157 background: none;
158 &:before {
159 content: "> ";
160 };
161
162 a {
163 color: @solarize-Accent-Orange;
164 }
165 }
166}
167
168#registrationPage {
169
170 label {
171 display: none;
172 }
173 input {
174 display: block;
175 border: 1px solid @solarize-Background-92;
176 .border-radius(6px);
177 padding: 5px;
178 margin-top: 5px;
179 margin-bottom: 10px;
180 font-size: 100%;
181 box-shadow:inset 0 0 0;
182 }
183
184
185 .steps {
186 .step {
187 display: none;
188
189 &.center {
190 display: block;
191 }
192
193 h1 {
194 color: @solarize-Accent-Blue;
195 font-size: 24pt;
196 font-weight: 700;
197 margin: 0px;
198 }
199 p {
200 color: @solarize-Content-50;
201 font-size: 14pt;
202 font-weight: 100;
203 margin: 0px;
204 }
205
206 &.TERMS_OF_SERVICE {
207 .checkboxBlock {
208 margin-top: 10px;
209 margin-bottom: 10px;
210 clear: both;
211
212 input {
213 display: block;
214 float: left;
215 margin: 5px;
216 width: 30px;
217 }
218
219 p {
220 font-size: 12pt;
221 font-weight: 500;
222 display: block;
223
224 a {
225 color: @solarize-Accent-Red;
226 }
227 }
228 }
229 }
230 .stepIndex {
231 text-align: center;
232 .stepIndexItem {
233 font-weight: 900;
234 font-size: 28pt;
235 display: inline;
236 color: lightgrey;
237
238 &.center {
239 color: gray;
240 }
241 }
242 }
243 .buttons {
244 text-align: center;
245 margin-top: 10px;
246
247 .button {
248 margin: 10px;
249 text-align: center;
250 vertical-align: middle;
251 display: inline-block;
252 width: 80px;
253
254 font-weight: 900;
255 line-height: 45px;
256 font-size: 24px;
257
258 &.back {
259
260 background-color: lightgrey;
261
262 // &.step_-1 {
263 // visibility: hidden;
264 // }
265 }
266
267 &.disabled {
268 background-color: #c0c0c0;
269 cursor: default;
270 }
271 }
272 }
273 }
274 }
275}
276
277#cardListPage {
278
279 >div {
280 // background-color: purple;
281 }
282
283 .header {
284 border-bottom: 2px solid @solarize-Accent-Cyan;
285 display: inline-block;
286 width: 100%;
287 margin-bottom: 0px;
288 height: 46px;
289
290 a.account {
291 .icon-font();
292 color: @clipperz-orange;
293 display: block;
294 float: left;
295
296 font-size: 28pt;
297 padding-top: 3px;
298 padding-left: 15px;
299 padding-right: 15px;
300 vertical-align: top;
301 }
302
303 .features {
304 text-align: right;
305 display: block;
306 float: right;
307 padding-right: 5px;
308 height: 100%;
309
310 a {
311 .icon-font();
312 color: @solarize-Accent-Cyan;
313 display: inline-block;
314 font-size: 28pt;
315 padding-left: 10px;
316 padding-right: 10px;
317 height: 100%;
318 line-height: 33pt;
319
320 &.selected {
321 background-color: @solarize-Accent-Cyan;
322 color: white;
323 }
324 }
325 }
326 }
327
328 .searchBox {
329 background-color: @solarize-Accent-Cyan;
330 width: 100%;
331 // height: 30px;
332 clear: both;
333
334 >div {
335 padding: 4px;
336 padding-top: 2px;
337 }
338
339 input {
340 font-size: 14pt;
341 display: block;
342 border: 1px solid @solarize-Background-92;
343 .border-radius(6px);
344 box-shadow:inset 0 0 0;
345 width: 100%;
346 margin: 0px;
347 color: @solarize-Content-50;
348 }
349 }
350
351 .content.cardList {
352 margin-left: 0px;
353 margin-right: 0px;
354
355 .listItem {
356 min-height: 48px;
357 // line-height: 35pt;
358 line-height: 24pt;
359 cursor: pointer;
360 display: inline-table;
361 width: 100%;
362
363
364 &:nth-child(odd) {
365 background-color: @solarize-Background-92;
366
367 // &:hover {
368 // background-color: @solarize-Background-97;
369 // };
370 }
371
372 &:nth-child(even) {
373 // &:hover {
374 // background-color: @solarize-Background-97;
375 // };
376 }
377
378 .labelWrapper {
379 float: left;
380 width: 100%;
381
382 span {
383 margin: 0px;
384 margin-left: 42px;
385 margin-right: 30px;
386 display: block;
387 padding-top: 7px;
388 padding-bottom: 7px;
389
390 color: @solarize-Accent-Red;
391 font-weight: 400;
392 }
393 }
394
395 .faviconWrapper {
396 float: left;
397 width: 42px;
398 margin-left: -100%;
399
400 .favicon {
401 width: 32px;
402 height: 32px;
403 padding: 8px 5px;
404 vertical-align: text-bottom;
405 }
406 }
407
408 .detailLinkWrapper {
409 float: left;
410 width: 30px;
411 margin-left: -30px;
412 text-align: center;
413 padding-top: 7px;
414
415 span {
416 color: @solarize-Accent-Cyan;
417 .icon-font();
418 }
419 }
420 }
421 }
422}
423
424#cardDetailPage {
425 .header {
426 border-bottom: 2px solid @solarize-Accent-Cyan;
427 // display: inline-table;
428 width: 100%;
429 margin-bottom: 0px;
430 height: 46px;
431
432 .backWrapper {
433 float: left;
434 width: 48px;
435 margin-left: -100%;
436
437 .back {
438 display: inline-block;
439 background-color: @solarize-Accent-Cyan;
440 padding: 11px;
441 box-sizing: border-box;
442 .icon-font();
443 }
444 }
445
446 .titleWrapper {
447 float: left;
448 width: 100%;
449 height: 48px;
450 overflow: hidden;
451
452 .title {
453 margin-left: 48px;
454 margin-right: 48px;
455 display: inline-block;
456
457 padding-left: 10px;
458 color: @solarize-Accent-Red;
459 font-weight: 400;
460 line-height: 36pt;
461 white-space: nowrap;
462 }
463 }
464
465 .starWrapper {
466 float: left;
467 width: 48px;
468 margin-left: -48px;
469 text-align: center;
470
471 .star {
472 font-size: 18pt;
473 line-height: 35pt;
474 color: @solarize-Accent-Magenta;
475 .icon-font();
476 }
477 }
478 }
479
480 .content {
481 overflow: scroll;
482 margin: 0px;
483
484 .fields {
485 .listItem {
486 display: inline-table;
487 width: 100%;
488 font-size: 14pt;
489 border-bottom: 1px solid @solarize-Background-92;
490
491 .fieldWrapper {
492 width: 100%;
493 float: left;
494
495 .fieldInnerWrapper {
496 padding: 3px 10px 3px 10px;
497 margin: 0px;
498 margin-right: 48px;
499 display: block;
500
501 .labelWrapper {
502 display: block;
503 .label {
504 color: @solarize-Accent-Orange;
505 font-size: 10pt;
506 font-weight: 300;
507 }
508 }
509 .valueWrapper {
510 display: block;
511 box-sizing: border-box;
512
513 .value {
514 color: @solarize-Accent-Blue;
515 font-weight: 500;
516
517 &.PASSWORD {
518 .password-font();
519 font-size: 28pt;
520 }
521 }
522 }
523 }
524 }
525 .actionWrapper {
526 float: left;
527 width: 48px;
528 margin-left: -48px;
529 text-align: center;
530
531 div {
532 font-size: 18pt;
533 line-height: 35pt;
534 color: @solarize-Accent-Cyan;
535 .icon-font();
536 }
537 }
538 }
539 }
540
541 .directLogins {
542 // @solarize-Accent-Yellow:#b58900;
543 // @solarize-Accent-Orange:#cb4b16;
544 // @solarize-Accent-Red: #dc322f;
545 // @solarize-Accent-Magenta:#d33682;
546 // @solarize-Accent-Violet:#6c71c4;
547 // @solarize-Accent-Blue: #268bd2;
548 // @solarize-Accent-Cyan: #2aa198;
549 // @solarize-Accent-Green: #859900;
550 .listItem {
551 min-height: 47px;
552 line-height: 35pt;
553 cursor: pointer;
554 display: inline-table;
555 width: 100%;
556 background-color: @solarize-Accent-Green;
557 border-bottom: 1px solid @solarize-Background-92;
558 font-size: 14pt;
559
560 .labelWrapper {
561 float: left;
562 width: 100%;
563
564 span {
565 margin: 0px;
566 margin-left: 42px;
567 margin-right: 48px;
568 display: block;
569
570 // color: @solarize-Accent-Red;
571 color: white;
572 font-weight: 500;
573 }
574 }
575
576 .faviconWrapper {
577 float: left;
578 width: 42px;
579 margin-left: -100%;
580
581 .favicon {
582 width: 32px;
583 height: 32px;
584 padding: 8px 5px;
585 vertical-align: text-bottom;
586 }
587 }
588
589 .directLoginLinkWrapper {
590 float: left;
591 width: 48px;
592 margin-left: -48px;
593 text-align: center;
594
595 span {
596 font-size: 18pt;
597 color: white;
598 .icon-font();
599 }
600 }
601 }
602
603 }
604 }
605
606 .footer {
607 .icon-font();
608 color: white;
609 width: 100%;
610 position: fixed;
611 bottom: 0px;
612 display: none;
613
614 // bottom: -100px;
615 // display: none;
616
617 a {
618 display: inline-block;
619 text-align: center;
620 padding: 11px;
621 box-sizing: border-box;
622
623
624 &.cancel {
625 width: 33%;
626 background-color: @solarize-Accent-Red;
627 }
628
629 &.save {
630 width: 67%;
631 background-color: @solarize-Accent-Green;
632 }
633 }
634 }
635}
636
637
638.icon-spin {
639 display: inline-block;
640 -moz-animation: spin 2s infinite linear;
641 -o-animation: spin 2s infinite linear;
642 -webkit-animation: spin 2s infinite linear;
643 animation: spin 2s infinite linear;
644}
645@-moz-keyframes spin {
646 0% { -moz-transform: rotate(0deg); }
647 100% { -moz-transform: rotate(359deg); }
648}
649@-webkit-keyframes spin {
650 0% { -webkit-transform: rotate(0deg); }
651 100% { -webkit-transform: rotate(359deg); }
652}
653@-o-keyframes spin {
654 0% { -o-transform: rotate(0deg); }
655 100% { -o-transform: rotate(359deg); }
656}
657@-ms-keyframes spin {
658 0% { -ms-transform: rotate(0deg); }
659 100% { -ms-transform: rotate(359deg); }
660}
661@keyframes spin {
662 0% { transform: rotate(0deg); }
663 100% { transform: rotate(359deg); }
664}
665
666
667
668/*
669==================================
670
671THREE COLUMN LAYOUT (left/right fixed size; center elastic)
672
673------------- ~~~~~~ ------------
674| | | |
675| a | b | c |
676| | | |
677------------- ~~~~~~ ------------
678
679==================================
680
681.listItem
682 .bWrapper
683 .b
684 .aWrapper
685 .a
686 .cWrapper
687 .c
688
689==================================
690
691.listItem {
692
693 display: inline-table;
694 width: 100%;
695
696 .aWrapper {
697 float: left;
698 width: <a.width>px;
699 margin-left: -100%;
700
701 .a {
702
703 }
704 }
705
706 .bWrapper {
707 float: left;
708 width: 100%;
709
710
711 .b {
712 margin: 0px;
713 margin-left: <a.width>px;
714 margin-right: <c.width>px;
715 display: block;
716 }
717 }
718
719 .cWrapper {
720 float: left;
721 width: <c.width>px;
722 margin-left: -<c.width>px;
723
724 .c {
725
726 }
727 }
728
729}
730*/ \ No newline at end of file
diff --git a/frontend/delta/properties/creditsAndCopyrights.txt b/frontend/delta/properties/creditsAndCopyrights.txt
new file mode 100644
index 0000000..f4722c1
--- a/dev/null
+++ b/frontend/delta/properties/creditsAndCopyrights.txt
@@ -0,0 +1,569 @@
1@clipperz.license@
2
3===============================================================================
4
5 This application is build using also the following libraries
6
7# MochiKit (http://www.mochikit.com)
8 - repository: @mochikit.repository@ (version: @mochikit.version@ - commit: @mochikit.commit@)
9
10 * Software licence: https://github.com/mochi/mochikit/blob/master/LICENSE.txt
11
12 |MochiKit is dual-licensed software. It is available under the terms of the
13 |MIT License, or the Academic Free License version 2.1. The full text of
14 |each license is included below.
15 |
16 |The MochiKit.Style.getElementPosition function is adapted from
17 |YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc. and
18 |licensed under the BSD license also reproduced in full below.
19 |
20 |MIT License
21 |===========
22 |
23 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
24 |
25 |Permission is hereby granted, free of charge, to any person obtaining a copy
26 |of this software and associated documentation files (the "Software"), to deal
27 |in the Software without restriction, including without limitation the rights
28 |to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
29 |copies of the Software, and to permit persons to whom the Software is furnished
30 |to do so, subject to the following conditions:
31 |
32 |The above copyright notice and this permission notice shall be included in all
33 |copies or substantial portions of the Software.
34 |
35 |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
36 |IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
37 |FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
38 |COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
39 |IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
40 |CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41 |
42 |
43 |Academic Free License v. 2.1
44 |============================
45 |
46 |Copyright (c) 2005 Bob Ippolito. All rights reserved.
47 |
48 |This Academic Free License (the "License") applies to any original work of
49 |authorship (the "Original Work") whose owner (the "Licensor") has placed the
50 |following notice immediately following the copyright notice for the Original Work:
51 |
52 |Licensed under the Academic Free License version 2.1
53 |
54 | 1)Grant of Copyright License. Licensor hereby grants You a world-wide, royalty-free,
55 | non-exclusive, perpetual, sublicenseable license to do the following:
56 |
57 |a) to reproduce the Original Work in copies;
58 |b) to prepare derivative works ("Derivative Works") based upon the Original Work;
59 |c) to distribute copies of the Original Work and Derivative Works to the public;
60 |d) to perform the Original Work publicly; and
61 |e) to display the Original Work publicly.
62 |
63 | 2)Grant of Patent License. Licensor hereby grants You a world-wide, royalty-free,
64 | non-exclusive, perpetual, sublicenseable license, under patent claims owned or
65 | controlled by the Licensor that are embodied in the Original Work as furnished by
66 | the Licensor, to make, use, sell and offer for sale the Original Work and Derivative
67 | Works.
68 |
69 | 3)Grant of Source Code License. The term "Source Code" means the preferred form of
70 | the Original Work for making modifications to it and all available documentation
71 | describing how to modify the Original Work. Licensor hereby agrees to provide a
72 | machine-readable copy of the Source Code of the Original Work along with each copy
73 | of the Original Work that Licensor distributes. Licensor reserves the right to satisfy
74 | this obligation by placing a machine-readable copy of the Source Code in an information
75 | repository reasonably calculated to permit inexpensive and convenient access by You for
76 | as long as Licensor continues to distribute the Original Work, and by publishing the
77 | address of that information repository in a notice immediately following the copyright
78 | notice that applies to the Original Work.
79 |
80 | 4)Exclusions From License Grant. Neither the names of Licensor, nor the names of any
81 | contributors to the Original Work, nor any of their trademarks or service marks, may
82 | be used to endorse or promote products derived from this Original Work without express
83 | prior written permission of the Licensor. Nothing in this License shall be deemed to
84 | grant any rights to trademarks, copyrights, patents, trade secrets or any other
85 | intellectual property of Licensor except as expressly stated herein. No patent license
86 | is granted to make, use, sell or offer to sell embodiments of any patent claims other
87 | than the licensed claims defined in Section 2. No right is granted to the trademarks
88 | of Licensor even if such marks are included in the Original Work. Nothing in this
89 | License shall be interpreted to prohibit Licensor from licensing under different terms
90 | from this License any Original Work that Licensor otherwise would have a right to license.
91 |
92 | 5)This section intentionally omitted.
93 |
94 | 6)Attribution Rights. You must retain, in the Source Code of any Derivative Works that You
95 | create, all copyright, patent or trademark notices from the Source Code of the Original
96 | Work, as well as any notices of licensing and any descriptive text identified therein as
97 | an "Attribution Notice." You must cause the Source Code for any Derivative Works that You
98 | create to carry a prominent Attribution Notice reasonably calculated to inform recipients
99 | that You have modified the Original Work.
100 |
101 | 7)Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that the copyright
102 | in and to the Original Work and the patent rights granted herein by Licensor are owned
103 | by the Licensor or are sublicensed to You under the terms of this License with the
104 | permission of the contributor(s) of those copyrights and patent rights. Except as expressly
105 | stated in the immediately proceeding sentence, the Original Work is provided under this
106 | License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or implied, including,
107 | without limitation, the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A
108 | PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU.
109 | This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No license to
110 | Original Work is granted hereunder except under this disclaimer.
111 |
112 | 8)Limitation of Liability. Under no circumstances and under no legal theory, whether in tort
113 | (including negligence), contract, or otherwise, shall the Licensor be liable to any person
114 | for any direct, indirect, special, incidental, or consequential damages of any character
115 | arising as a result of this License or the use of the Original Work including, without
116 | limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction,
117 | or any and all other commercial damages or losses. This limitation of liability shall not
118 | apply to liability for death or personal injury resulting from Licensor's negligence to
119 | the extent applicable law prohibits such limitation. Some jurisdictions do not allow the
120 | exclusion or limitation of incidental or consequential damages, so this exclusion and
121 | limitation may not apply to You.
122 |
123 | 9)Acceptance and Termination. If You distribute copies of the Original Work or a Derivative
124 | Work, You must make a reasonable effort under the circumstances to obtain the express
125 | assent of recipients to the terms of this License. Nothing else but this License (or
126 | another written agreement between Licensor and You) grants You permission to create
127 | Derivative Works based upon the Original Work or to exercise any of the rights granted in
128 | Section 1 herein, and any attempt to do so except under the terms of this License (or
129 | another written agreement between Licensor and You) is expressly prohibited by U.S. copyright
130 | law, the equivalent laws of other countries, and by international treaty. Therefore, by
131 | exercising any of the rights granted to You in Section 1 herein, You indicate Your
132 | acceptance of this License and all of its terms and conditions.
133 |
134 | 10)Termination for Patent Action. This License shall terminate automatically and You may no
135 | longer exercise any of the rights granted to You by this License as of the date You
136 | commence an action, including a cross-claim or counterclaim, against Licensor or any
137 | licensee alleging that the Original Work infringes a patent. This termination provision
138 | shall not apply for an action alleging patent infringement by combinations of the Original
139 | Work with other software or hardware.
140 |
141 | 11)Jurisdiction, Venue and Governing Law. Any action or suit relating to this License may be
142 | brought only in the courts of a jurisdiction wherein the Licensor resides or in which
143 | Licensor conducts its primary business, and under the laws of that jurisdiction excluding
144 | its conflict-of-law provisions. The application of the United Nations Convention on Contracts
145 | for the International Sale of Goods is expressly excluded. Any use of the Original Work
146 | outside the scope of this License or after its termination shall be subject to the
147 | requirements and penalties of the U.S. Copyright Act, 17 U.S.C. § 101 et seq., the equivalent
148 | laws of other countries, and international treaty. This section shall survive the termination
149 | of this License.
150 |
151 | 12)Attorneys Fees. In any action to enforce the terms of this License or seeking damages
152 | relating thereto, the prevailing party shall be entitled to recover its costs and expenses,
153 | including, without limitation, reasonable attorneys' fees and costs incurred in connection
154 | with such action, including any appeal of such action. This section shall survive the
155 | termination of this License.
156 |
157 | 13)Miscellaneous. This License represents the complete agreement concerning the subject matter
158 | hereof. If any provision of this License is held to be unenforceable, such provision shall
159 | be reformed only to the extent necessary to make it enforceable.
160 |
161 | 14)Definition of "You" in This License. "You" throughout this License, whether in upper or lower
162 | case, means an individual or a legal entity exercising rights under, and complying with all
163 | of the terms of, this License. For legal entities, "You" includes any entity that controls,
164 | is controlled by, or is under common control with you. For purposes of this definition,
165 | "control" means (i) the power, direct or indirect, to cause the direction or management of
166 | such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or
167 | more of the outstanding shares, or (iii) beneficial ownership of such entity.
168 |
169 | 15)Right to Use. You may use the Original Work in all ways not otherwise restricted or
170 | conditioned by this License or by law, and Licensor promises not to interfere with or be
171 | responsible for such uses by You.
172 |
173 |This license is Copyright (C) 2003-2004 Lawrence E. Rosen. All rights reserved. Permission is
174 |hereby granted to copy and distribute this license without modification. This license may not
175 |be modified without the express written permission of its copyright owner.
176 |
177 |
178 |BSD License
179 |===========
180 |
181 |Copyright (c) 2006, Yahoo! Inc.
182 |All rights reserved.
183 |
184 |Redistribution and use of this software in source and binary forms, with or without modification,
185 |are permitted provided that the following conditions are met:
186 |
187 | *Redistributions of source code must retain the above copyright notice, this list of
188 | conditions and the following disclaimer.
189 | *Redistributions in binary form must reproduce the above copyright notice, this list of
190 | conditions and the following disclaimer in the documentation and/or other materials provided
191 | with the distribution.
192 | *Neither the name of Yahoo! Inc. nor the names of its contributors may be used to endorse or
193 | promote products derived from this software without specific prior written permission of
194 | Yahoo! Inc.
195 |
196 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
197 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
198 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
199 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
200 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
201 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
202 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
203 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
204
205
206
207# React.js (http://facebook.github.io/react/)
208 - repository: @reactjs.repository@ (version: @reactjs.version@ - commit: @reactjs.commit@)
209
210 * Software licence: https://github.com/facebook/react/blob/master/LICENSE
211
212 | Apache License
213 | Version 2.0, January 2004
214 | http://www.apache.org/licenses/
215 |
216 |TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
217 |
218 |1. Definitions.
219 |
220 | "License" shall mean the terms and conditions for use, reproduction,
221 | and distribution as defined by Sections 1 through 9 of this document.
222 |
223 | "Licensor" shall mean the copyright owner or entity authorized by
224 | the copyright owner that is granting the License.
225 |
226 | "Legal Entity" shall mean the union of the acting entity and all
227 | other entities that control, are controlled by, or are under common
228 | control with that entity. For the purposes of this definition,
229 | "control" means (i) the power, direct or indirect, to cause the
230 | direction or management of such entity, whether by contract or
231 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
232 | outstanding shares, or (iii) beneficial ownership of such entity.
233 |
234 | "You" (or "Your") shall mean an individual or Legal Entity
235 | exercising permissions granted by this License.
236 |
237 | "Source" form shall mean the preferred form for making modifications,
238 | including but not limited to software source code, documentation
239 | source, and configuration files.
240 |
241 | "Object" form shall mean any form resulting from mechanical
242 | transformation or translation of a Source form, including but
243 | not limited to compiled object code, generated documentation,
244 | and conversions to other media types.
245 |
246 | "Work" shall mean the work of authorship, whether in Source or
247 | Object form, made available under the License, as indicated by a
248 | copyright notice that is included in or attached to the work
249 | (an example is provided in the Appendix below).
250 |
251 | "Derivative Works" shall mean any work, whether in Source or Object
252 | form, that is based on (or derived from) the Work and for which the
253 | editorial revisions, annotations, elaborations, or other modifications
254 | represent, as a whole, an original work of authorship. For the purposes
255 | of this License, Derivative Works shall not include works that remain
256 | separable from, or merely link (or bind by name) to the interfaces of,
257 | the Work and Derivative Works thereof.
258 |
259 | "Contribution" shall mean any work of authorship, including
260 | the original version of the Work and any modifications or additions
261 | to that Work or Derivative Works thereof, that is intentionally
262 | submitted to Licensor for inclusion in the Work by the copyright owner
263 | or by an individual or Legal Entity authorized to submit on behalf of
264 | the copyright owner. For the purposes of this definition, "submitted"
265 | means any form of electronic, verbal, or written communication sent
266 | to the Licensor or its representatives, including but not limited to
267 | communication on electronic mailing lists, source code control systems,
268 | and issue tracking systems that are managed by, or on behalf of, the
269 | Licensor for the purpose of discussing and improving the Work, but
270 | excluding communication that is conspicuously marked or otherwise
271 | designated in writing by the copyright owner as "Not a Contribution."
272 |
273 | "Contributor" shall mean Licensor and any individual or Legal Entity
274 | on behalf of whom a Contribution has been received by Licensor and
275 | subsequently incorporated within the Work.
276 |
277 |2. Grant of Copyright License. Subject to the terms and conditions of
278 | this License, each Contributor hereby grants to You a perpetual,
279 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
280 | copyright license to reproduce, prepare Derivative Works of,
281 | publicly display, publicly perform, sublicense, and distribute the
282 | Work and such Derivative Works in Source or Object form.
283 |
284 |3. Grant of Patent License. Subject to the terms and conditions of
285 | this License, each Contributor hereby grants to You a perpetual,
286 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
287 | (except as stated in this section) patent license to make, have made,
288 | use, offer to sell, sell, import, and otherwise transfer the Work,
289 | where such license applies only to those patent claims licensable
290 | by such Contributor that are necessarily infringed by their
291 | Contribution(s) alone or by combination of their Contribution(s)
292 | with the Work to which such Contribution(s) was submitted. If You
293 | institute patent litigation against any entity (including a
294 | cross-claim or counterclaim in a lawsuit) alleging that the Work
295 | or a Contribution incorporated within the Work constitutes direct
296 | or contributory patent infringement, then any patent licenses
297 | granted to You under this License for that Work shall terminate
298 | as of the date such litigation is filed.
299 |
300 |4. Redistribution. You may reproduce and distribute copies of the
301 | Work or Derivative Works thereof in any medium, with or without
302 | modifications, and in Source or Object form, provided that You
303 | meet the following conditions:
304 |
305 | (a) You must give any other recipients of the Work or
306 | Derivative Works a copy of this License; and
307 |
308 | (b) You must cause any modified files to carry prominent notices
309 | stating that You changed the files; and
310 |
311 | (c) You must retain, in the Source form of any Derivative Works
312 | that You distribute, all copyright, patent, trademark, and
313 | attribution notices from the Source form of the Work,
314 | excluding those notices that do not pertain to any part of
315 | the Derivative Works; and
316 |
317 | (d) If the Work includes a "NOTICE" text file as part of its
318 | distribution, then any Derivative Works that You distribute must
319 | include a readable copy of the attribution notices contained
320 | within such NOTICE file, excluding those notices that do not
321 | pertain to any part of the Derivative Works, in at least one
322 | of the following places: within a NOTICE text file distributed
323 | as part of the Derivative Works; within the Source form or
324 | documentation, if provided along with the Derivative Works; or,
325 | within a display generated by the Derivative Works, if and
326 | wherever such third-party notices normally appear. The contents
327 | of the NOTICE file are for informational purposes only and
328 | do not modify the License. You may add Your own attribution
329 | notices within Derivative Works that You distribute, alongside
330 | or as an addendum to the NOTICE text from the Work, provided
331 | that such additional attribution notices cannot be construed
332 | as modifying the License.
333 |
334 | You may add Your own copyright statement to Your modifications and
335 | may provide additional or different license terms and conditions
336 | for use, reproduction, or distribution of Your modifications, or
337 | for any such Derivative Works as a whole, provided Your use,
338 | reproduction, and distribution of the Work otherwise complies with
339 | the conditions stated in this License.
340 |
341 |5. Submission of Contributions. Unless You explicitly state otherwise,
342 | any Contribution intentionally submitted for inclusion in the Work
343 | by You to the Licensor shall be under the terms and conditions of
344 | this License, without any additional terms or conditions.
345 | Notwithstanding the above, nothing herein shall supersede or modify
346 | the terms of any separate license agreement you may have executed
347 | with Licensor regarding such Contributions.
348 |
349 |6. Trademarks. This License does not grant permission to use the trade
350 | names, trademarks, service marks, or product names of the Licensor,
351 | except as required for reasonable and customary use in describing the
352 | origin of the Work and reproducing the content of the NOTICE file.
353 |
354 |7. Disclaimer of Warranty. Unless required by applicable law or
355 | agreed to in writing, Licensor provides the Work (and each
356 | Contributor provides its Contributions) on an "AS IS" BASIS,
357 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
358 | implied, including, without limitation, any warranties or conditions
359 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
360 | PARTICULAR PURPOSE. You are solely responsible for determining the
361 | appropriateness of using or redistributing the Work and assume any
362 | risks associated with Your exercise of permissions under this License.
363 |
364 |8. Limitation of Liability. In no event and under no legal theory,
365 | whether in tort (including negligence), contract, or otherwise,
366 | unless required by applicable law (such as deliberate and grossly
367 | negligent acts) or agreed to in writing, shall any Contributor be
368 | liable to You for damages, including any direct, indirect, special,
369 | incidental, or consequential damages of any character arising as a
370 | result of this License or out of the use or inability to use the
371 | Work (including but not limited to damages for loss of goodwill,
372 | work stoppage, computer failure or malfunction, or any and all
373 | other commercial damages or losses), even if such Contributor
374 | has been advised of the possibility of such damages.
375 |
376 |9. Accepting Warranty or Additional Liability. While redistributing
377 | the Work or Derivative Works thereof, You may choose to offer,
378 | and charge a fee for, acceptance of support, warranty, indemnity,
379 | or other liability obligations and/or rights consistent with this
380 | License. However, in accepting such obligations, You may act only
381 | on Your own behalf and on Your sole responsibility, not on behalf
382 | of any other Contributor, and only if You agree to indemnify,
383 | defend, and hold each Contributor harmless for any liability
384 | incurred by, or claims asserted against, such Contributor by reason
385 | of your accepting any such warranty or additional liability.
386 |
387 |END OF TERMS AND CONDITIONS
388 |
389 |APPENDIX: How to apply the Apache License to your work.
390 |
391 | To apply the Apache License to your work, attach the following
392 | boilerplate notice, with the fields enclosed by brackets "[]"
393 | replaced with your own identifying information. (Don't include
394 | the brackets!) The text should be enclosed in the appropriate
395 | comment syntax for the file format. We also recommend that a
396 | file or class name and description of purpose be included on the
397 | same "printed page" as the copyright notice for easier
398 | identification within third-party archives.
399 |
400 |Copyright [yyyy] [name of copyright owner]
401 |
402 |Licensed under the Apache License, Version 2.0 (the "License");
403 |you may not use this file except in compliance with the License.
404 |You may obtain a copy of the License at
405 |
406 | http://www.apache.org/licenses/LICENSE-2.0
407 |
408 |Unless required by applicable law or agreed to in writing, software
409 |distributed under the License is distributed on an "AS IS" BASIS,
410 |WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
411 |See the License for the specific language governing permissions and
412 |limitations under the License.
413
414
415
416# Add to Home Screen (http://cubiq.org/add-to-home-screen)
417 - repository: @addtohomescreen.repository@ (version: @addtohomescreen.version@ - commit: @addtohomescreen.commit@)
418
419 * Software licence: https://github.com/facebook/react/blob/master/LICENSE
420
421 |This software is released under the MIT License.
422 |
423 |Copyright (c) 2013 Matteo Spinelli, http://cubiq.org/
424 |
425 |Permission is hereby granted, free of charge, to any person obtaining
426 |a copy of this software and associated documentation files (the "Software"),
427 |to deal in the Software without restriction, including without limitation
428 |the rights to use, copy, modify, merge, publish, distribute, sublicense,
429 |and/or sell copies of the Software, and to permit persons to whom the Software
430 |is furnished to do so, subject to the following conditions:
431 |
432 |The above copyright notice and this permission notice shall be included in
433 |all copies or substantial portions of the Software.
434 |
435 |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
436 |IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
437 |FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
438 |THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
439 |LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
440 |OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
441 |THE SOFTWARE.
442
443
444
445# Yahoo! UI Library (http://developer.yahoo.com/yui/)
446 - package version: 0.12
447
448 Copyright © 2005-2006 Yahoo! Inc. All rights reserved
449 * Copyright notes: http://docs.yahoo.com/info/copyright/copyright.html
450 * Software licence: http://developer.yahoo.com/yui/license.txt
451
452 |Software License Agreement (BSD License)
453 |
454 |Copyright (c) 2006, Yahoo! Inc.
455 |All rights reserved.
456 |
457 |Redistribution and use of this software in source and binary forms, with or without modification, are
458 |permitted provided that the following conditions are met:
459 |
460 |* Redistributions of source code must retain the above
461 | copyright notice, this list of conditions and the
462 | following disclaimer.
463 |
464 |* Redistributions in binary form must reproduce the above
465 | copyright notice, this list of conditions and the
466 | following disclaimer in the documentation and/or other
467 | materials provided with the distribution.
468 |
469 |* Neither the name of Yahoo! Inc. nor the names of its
470 | contributors may be used to endorse or promote products
471 | derived from this software without specific prior
472 | written permission of Yahoo! Inc.
473 |
474 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
475 |WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
476 |PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
477 |ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
478 |LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
479 |INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
480 |TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
481 |ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
482
483
484
485# YUI-ext (http://www.yui-ext.com)
486 - repository: http://yui-ext.googlecode.com/svn/trunk/ (revision: 120)
487
488 * Software licence: http://yui-ext.googlecode.com/svn/trunk/src/licence.txt
489
490 |yui-ext
491 |Copyright (c) 2006, Jack Slocum
492 |All rights reserved.
493 |
494 |Redistribution and use in source and binary forms, with or without modification,
495 |are permitted provided that the following conditions are met:
496 |
497 | * Redistributions of source code must retain the above copyright notice,
498 | this list of conditions and the following disclaimer.
499 | * Redistributions in binary form must reproduce the above copyright notice,
500 | this list of conditions and the following disclaimer in the documentation
501 | and/or other materials provided with the distribution.
502 | * Neither the name yui-ext nor the names of its contributors
503 | may be used to endorse or promote products derived from this software
504 | without specific prior written permission.
505 |
506 |THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
507 |ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
508 |WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
509 |IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
510 |INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
511 |BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
512 |DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
513 |OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
514 |NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
515 |EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
516
517
518
519# Big Integer Library v. 5.0
520 - code downloaded on March 5, 2007 from http://www.leemon.com/crypto/BigInt.js
521
522 |Big Integer Library v. 5.0
523 |Created 2000, last modified 2006
524 |Leemon Baird
525 |www.leemon.com
526 |
527 |This file is public domain. You can use it for any purpose without restriction.
528 |I do not guarantee that it is correct, so use it at your own risk. If you use
529 |it for something interesting, I'd appreciate hearing about it. If you find
530 |any bugs or make any improvements, I'd appreciate hearing about those too.
531 |It would also be nice if my name and address were left in the comments.
532 |But none of that is required.
533
534
535
536# Other code snippets used in the first demo of the program, and still present just to be able to
537 read record previously written using these same functions:
538
539 - Code downloaded on March 30, 2006 from http://anmar.eu.org/projects/jssha2/files/jssha2-0.3.zip
540 File used: jsSha2/sha256.js
541
542 |A JavaScript implementation of the Secure Hash Algorithm, SHA-256
543 |Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
544 |Distributed under the BSD License
545 |Some bits taken from Paul Johnston's SHA-1 implementation
546
547
548 - Code downloaded on March 30, 2006 from http://www.fourmilab.ch/javascrypt/javascrypt.zip
549 Files used: entropy.js, aesprng.js, md5.js, aes.js, utf-8.js
550
551
552 - Code downloaded on April 26, 2006 from http://pajhome.org.uk/crypt/md5/md5.js
553
554 |A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
555 |Digest Algorithm, as defined in RFC 1321.
556 |Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
557 |Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
558 |Distributed under the BSD License
559 |See http://pajhome.org.uk/crypt/md5 for more info.
560
561
562
563 #General notes
564 The code in this page has been processed with a JavaScript compressor and is thus
565 difficult to read.
566 To get the exact version of the code used to build this application you
567 can take a look here:
568 - http://www.clipperz.com/security_privacy/security_code_review
569
diff --git a/frontend/delta/properties/delta.properties.json b/frontend/delta/properties/delta.properties.json
new file mode 100644
index 0000000..c23e6a8
--- a/dev/null
+++ b/frontend/delta/properties/delta.properties.json
@@ -0,0 +1,136 @@
1{
2 "copyright.values": {
3 "mochikit.repository": "https://github.com/mochi/mochikit.git",
4 "mochikit.version": "master",
5 "mochikit.commit": "6f26f745d5d915540aa0fc6c34fda24952891a9d",
6
7 "reactjs.repository": "https://github.com/facebook/react.git",
8 "reactjs.version": "0.4.1",
9 "reactjs.commit": "0cac12d375264a8a232a426d6d6cc8074a94000a",
10
11 "addtohomescreen.repository":"https://github.com/cubiq/add-to-homescreen.git",
12 "addtohomescreen.version": "2.0.8",
13 "addtohomescreen.commit": "4d375840079bcea994cc5795a568802400c7a793"
14 },
15
16 "html.template": "index_template.html",
17
18 "js": [
19 "MochiKit/Base.js",
20 "MochiKit/Iter.js",
21 "-- MochiKit/Logging.js",
22 "-- MochiKit/DateTime.js",
23 "-- MochiKit/Format.js",
24 "MochiKit/Async.js",
25 "MochiKit/DOM.js",
26 "MochiKit/Style.js",
27 "-- MochiKit/LoggingPane.js",
28 "-- MochiKit/Color.js",
29 "MochiKit/Signal.js",
30 "-- MochiKit/Position.js",
31 "MochiKit/Selector.js",
32 "-- MochiKit/Visual.js",
33
34 "React/react-0.4.1.js",
35 "Cubiq/add2home.js",
36
37 "Clipperz/YUI/Utils.js",
38 "Clipperz/YUI/DomHelper.js",
39
40 "Clipperz/ByteArray.js",
41 "Clipperz/Base.js",
42 "Clipperz/Async.js",
43 "Clipperz/CSVProcessor.js",
44 "Clipperz/KeePassExportProcessor.js",
45 "Clipperz/Date.js",
46 "Clipperz/DOM.js",
47 "Clipperz/Logging.js",
48 "Clipperz/Signal.js",
49 "-- Clipperz/Style.js",
50 "-- Clipperz/Visual.js",
51 "Clipperz/Set.js",
52 "-- Clipperz/Profile.js",
53 "Clipperz/KeyValueObjectStore.js",
54
55 "Clipperz/Crypto/SHA.js",
56 "Clipperz/Crypto/AES.js",
57 "Clipperz/Crypto/AES_2.js",
58 "Clipperz/Crypto/PRNG.js",
59 "Clipperz/Crypto/BigInt.js",
60 "Clipperz/Crypto/Base.js",
61 "Clipperz/Crypto/SRP.js",
62 "Clipperz/Crypto/RSA.js",
63
64 "Clipperz/PM/Strings/Strings_defaults.js",
65 "Clipperz/PM/Strings/Strings_en-US.js",
66 "-- # Clipperz/PM/Strings/Strings_en-GB.js",
67 "-- # Clipperz/PM/Strings/Strings_en-CA.js",
68 "-- Clipperz/PM/Strings/Strings_it-IT.js",
69 "-- Clipperz/PM/Strings/Strings_pt-BR.js",
70 "-- # Clipperz/PM/Strings/Strings_pt-PT.js",
71 "-- Clipperz/PM/Strings/Strings_ja-JP.js",
72 "-- Clipperz/PM/Strings/Strings_zh-CN.js",
73 "-- Clipperz/PM/Strings/Strings_es-ES.js",
74 "-- Clipperz/PM/Strings/Strings_fr-FR.js",
75 "-- # Clipperz/PM/Strings/Strings_de-DE.js",
76 "-- # Clipperz/PM/Strings/Strings_el-GR.js",
77 "-- # Clipperz/PM/Strings/Strings_ru-RU.js",
78 "-- # Clipperz/PM/Strings/Strings_he-IL.js",
79 "Clipperz/PM/Strings.js",
80 "-- Clipperz/PM/Strings/MessagePanelConfigurations.js",
81
82 "Clipperz/PM/Date.js",
83
84 "Clipperz/PM/Toll.js",
85 "Clipperz/PM/Proxy.js",
86 "Clipperz/PM/Proxy/Proxy.JSON.js",
87 "Clipperz/PM/Proxy/Proxy.Offline.js",
88 "Clipperz/PM/Proxy/Proxy.Offline.DataStore.js",
89 "Clipperz/PM/Proxy/Proxy.Offline.MemoryDataStore.js",
90 "Clipperz/PM/Proxy/Proxy.Offline.LocalStorageDataStore.js",
91
92 "Clipperz/PM/Connection.js",
93 "Clipperz/PM/Crypto.js",
94 "Clipperz/PM/PIN.js",
95 "-- Clipperz/PM/BookmarkletProcessor.js",
96
97 "Clipperz/PM/DataModel/EncryptedRemoteObject.js",
98 "Clipperz/PM/DataModel/User.js",
99 "Clipperz/PM/DataModel/User.Header.Legacy.js",
100 "Clipperz/PM/DataModel/User.Header.RecordIndex.js",
101 "Clipperz/PM/DataModel/User.Header.Preferences.js",
102 "Clipperz/PM/DataModel/User.Header.OneTimePasswords.js",
103 "Clipperz/PM/DataModel/User.Subscription.js",
104 "Clipperz/PM/DataModel/Record.js",
105 "Clipperz/PM/DataModel/Record.Version.js",
106 "Clipperz/PM/DataModel/Record.Version.Field.js",
107 "Clipperz/PM/DataModel/DirectLogin.js",
108 "Clipperz/PM/DataModel/DirectLoginInput.js",
109 "Clipperz/PM/DataModel/DirectLoginBinding.js",
110 "Clipperz/PM/DataModel/DirectLoginFormValue.js",
111 "Clipperz/PM/DataModel/OneTimePassword.js",
112
113 "-- Clipperz/PM/UI/Web/Components/BaseComponent.js",
114 "-- Clipperz/PM/UI/Web/Components/Overlay.js",
115 "-- Clipperz/PM/UI/Web/Components/LoginForm.js",
116 "-- Clipperz/PM/UI/Web/Components/RegistrationWizard.js",
117
118 "-- Clipperz/PM/UI/Web/Controllers/MainController.js",
119
120 "Clipperz/PM/UI/Components/Overlay.js",
121 "Clipperz/PM/UI/Components/PageTemplate.js",
122 "Clipperz/PM/UI/Components/LoginForm.js",
123 "Clipperz/PM/UI/Components/RegistrationWizard.js",
124 "Clipperz/PM/UI/Components/CardList.js",
125 "Clipperz/PM/UI/Components/CardDetail.js",
126 "Clipperz/PM/UI/Components/ErrorPage.js",
127
128 "Clipperz/PM/UI/MainController.js",
129 "Clipperz/PM/UI/DirectLoginController.js",
130 "main.js"
131 ],
132
133 "css": [
134 "web.css"
135 ]
136}
diff --git a/frontend/delta/properties/manifest.webapp b/frontend/delta/properties/manifest.webapp
new file mode 100644
index 0000000..cd18e01
--- a/dev/null
+++ b/frontend/delta/properties/manifest.webapp
@@ -0,0 +1,17 @@
1{
2 "name": "Clipperz",
3 "description": "Keep it to yourself: store and manage your password and online credentials",
4 "launch_path": "/delta/index.html",
5 "icons": {
6 "16": "https://www.clipperz.com/manifests/logo/16.png",
7 "32": "https://www.clipperz.com/manifests/logo/32.png",
8 "30": "https://www.clipperz.com/manifests/logo/30.png",
9 "60": "https://www.clipperz.com/manifests/logo/60.png",
10 "128": "https://www.clipperz.com/manifests/logo/128.png"
11 },
12 "developer": {
13 "name": "Clipperz",
14 "url": "https://www.clipperz.com"
15 },
16 "default_locale": "en"
17} \ No newline at end of file
diff --git a/frontend/delta/tests/tests/Components/CardDetail/User.data.js b/frontend/delta/tests/tests/Components/CardDetail/User.data.js
new file mode 100644
index 0000000..ba60878
--- a/dev/null
+++ b/frontend/delta/tests/tests/Components/CardDetail/User.data.js
@@ -0,0 +1,972 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24testData = {
25
26 //-------------------------------------------------------------------------
27
28 'simpleLogin_001': {
29 'users': [
30 {
31 'username': "joe",
32 'passphrase': "eoj",
33 'version': "0.2",
34 'connectionVersion':"0.2",
35 'records':{
36 'record 1': {
37 'notes':"Some notes here",
38 'fields':[
39 { 'name': "username", 'value': "joe", 'type': "text" },
40 { 'name': "password", 'value': "1234", 'type': "password"}
41 ],
42 'directLogins':{
43 "record 1 direct login": {
44 'configuration':"",
45 'bindings':[
46 ],
47 'favicon':"http://www.example.com/favicon.ico"
48 }
49 }
50 }
51 },
52 'otp':[
53 "12345678 90abcdef 12345678 90abcdef",
54 "fedcba09 87654321 fedcba09 87654321"
55 ]
56 }
57 ]
58 },
59
60 //-------------------------------------------------------------------------
61
62 'joe_clipperz_offline_copy_data': {
63 users:{
64 'catchAllUser': {
65 __masterkey_test_value__: 'masterkey',
66 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
67 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
68 },
69 'f527cdd90d0d47f8524b4e165398ad1455eba515d04abd101d1e93b3c6ae0674': {
70 s: '186f0c40bf73f2af236eaa6c429df225efa933050c9aae65240e93b7b362e3ee',
71 v: 'ac61a6e325ecf329926a86084f591d8852d0ad3e4a6080f2adc901b82395ecaf',
72 version: '0.2',
73 maxNumberOfRecords: '100',
74 userDetails: '{"records":{"index":{"eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5":"0","13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551":"1","062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80":"2","ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c":"3","507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a":"4","d5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d":"5","de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4":"6","d620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045":"7","f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732":"8","36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113":"9","fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6":"10","6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18":"11","9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291":"12","6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a":"13","6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728":"14","8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39":"15","084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d":"16","7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb":"17","5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4":"18","c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065":"19"},"data":"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"},"directLogins":{"index":{"61e87fdc4f1d9112e3b30c1f6812d095dcdb24f014c83319091eb6c9899ec348":"0","989593d4c48929f0c8f1581aa96969c622807e99619ed4732026e967530a68ad":"1","9f7979368fa29f66c44bd97ecaf6c545abc800b1c7bb21b7655a68e1514c3906":"2","dba0db679802f0e6aa6d0b7a6aaf42350aabc5f057409edd99a268a92ebb6496":"3","aa18149164302d5dbe7e2d3724565b9550e00887b49978559783b2e38c625584":"4","1f9bfd677b531a03168d3f8bd8afabb5357244a7bc355dff50bd6c0a072114a6":"5","a48e38845713462ecc9f827149eeaae87da882031f98ef8ebbf9ee9537b63468":"6","6f7bbc4e42ea462b5246e6f51c3f86056bec50601ce2de6067c8c1d26f21c07f":"7","2df54059e78f5771f23bd285cce19595b38331b73d67020424d9a1b2257db09c":"8","065cd0c270e5e8ce50e4ea8e3828dccdae18c01ab030813d756a87d03fe68784":"9","ddbc8d01300a4f10631cbde09e1246332eade3a877a2205209f9eb9e5bc9da0b":"10","9b7a30e667afc9f76ba77600658b2c13bff52432d444261d39bf3d069a160afe":"11","9fd2929cde3d32d9cbc5f1d787f2f64729a5e12a14410556b31c0c099762c46a":"12","f695fc36ac56bead80c0d20a88e01e382819c18dc268f1679551b7c83db7cb14":"13","f22dc41ffabef4b3bc8f7af804fec975bd50718098322a673cbe4aaff9464ae1":"14","03251dc1cbc5398789e4c4b45c52cfac3fcd8c1a4f19a81fa68fc6feae31d55c":"15","a7b32e72502804bf2946a2a8856139cbbb759c5777e6b3e673db1fdf7e3bd06e":"16","cb9ae0bba1957075ccdbfd3b3481704d62087687a2ac7c411a4f07d444bde0f7":"17","7e1d069b7fa57c03bd7bf48807520feb953157834503aaff8c9d493f37dea69d":"18","24404059cabc63b2dbff0f42ba57183108b8189ef53ab62fa25141a1caea824b":"19","33cf9758477460a8056deef0295a1ebe65b39b392c361ceb920a83edacfe5d78":"20","e9a16316f330e3d150f6ffd194f6fd8acd1426757b097de4b88ca0db875202e4":"21"},"data":"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"},"preferences":{"data":"EZMrwxNFFd1sMGycoYE7IrlGGrfLixLUnLZmWMkFysfISe2ay3ueO0PGCApuKqh9hA=="},"oneTimePasswords":{"data":"jufmL1KVY0YBl8MSaL413hGtw12I/+sFnumcfeVku9RRMBmXaXCfE/vYnraxZyPxJxVS3qFRWDKsSGR3pScdACSwlBD+mzjifRn2SCfXWutD1/oJiqiMvq3YFzwyZJiXx+oS5u8DOTieQT9HZYt0pUmAod9QHiq2NAkueVjvRkZI1saRlWGtNXCaJIHwpuFJpHBDSD//6D9DYeTdVUeFEbej+4oNYpBCkyE1G2OL6q50YRBYp9yARRiy9juKHRWFvZiSeMGEJQS0f2gaP+xZkb9Z4qrfDgAZ1F7oDbPksr2SOYlSsm0bqa6c+7Wtopdo63Urf7Ze3Wg9n8TGBk6H88boseR8e3sHudlmtO1oLxcB9p3z/NTceF6SvWyJWTxHeMe6O72dZVmSnZlXhD/IJamRt13HLk3g05d8oXfrXM3iMhIGQ+EsXMxZfKdXlZpyYtjWD5tcQTKz7M5Qo3SFmdkwDu4jH5ke+bD8CeluDcMaHF6KHfdV8nEsmsjGwrH6lqSCT/9kBO5ETqUJKloOhJpFpNS/EN7nxjXF/QbqnUmWV4wngdyYmk9goNZNfZv7C2ouiyys55/QEfGsIsvEPPSfO670oJuncTyfFngFj2tdh2JpJ5vytuoRNLOm7XPM3hDCvZCOpUnjbm+jt4AvdOGU7ID8a2mtZFjb2noP5emAxTg6MO6f3+44eTkUcbCDskO5fe6jd0pTdODk21Ilp7WUjFwxEdJG8tRrGYpLooProJExamL7WShm/S/nhJL4+euW+1UIDjcZJA+a7aGdMSC63qBvrEsNyf57SDBk/o2eNJHs2sndCzgvK42IKGKcipq9D1Gyos9JQsA3My9ARMt68V/5FfzOkgPO6mblOsQMoTyQj/OCLzITEBfqA5IufhljSEkD3CLkfkeVwVf1NB2SsTPXJFChnynfsK7cMFy0O2XBNByCRTQDqBDBYo673tI1KTGnT4gLSAwCt96lq8UkEdt51jjkAJcvBXkbswuw3hvhtzLJ302hkN9CIHJrEN0oss5mWlxIxYrCyqE3ABME3FCR9r+V7exuIaQn6mdJTkMcRbYmVQQkexsROh2cdx8I/tuMN4ECWEAL948k9vEPZfgaQirWnrTtHoxLzNAUBDSQfzYXd8yr0T4vAHLnXaUalWPgLamJJ3eR+LDFcDQVvFkaomsF3RpOIS5fswTBFuRKGKEBSIINc9AyC4DtkSmDMTF2S0TgpnGdK94ZS8C/PM8WEsX738echa5qZG5qG0f+koOUUrbaORcDqaktCuDmsgFTYiUv1JxFskTvS/t/EM2Y0MEKVLZBsoG+4WXz4XEE0VJFoI9glaYll96WH/iMbaVXRnDwjyE62CAk/8DXIf//MJQVyO6ElFsvCrDfH03yLpCJhqwHv+mD5sRctVaq6Cp5Ts3bzdFeiLCX9rhSaqdG5AuMk4dCInlywxrsOvBfNaDBjX7NGCULri6px2T53FNiH6ineVjr9TfgY2uoMyevLiQsGd3GHS4wnxiUfIyz7/Yav5an4o82cHhMVOLvfKwF8C2dJQDg9woJ3ju1ha66UA2XGScJVd93w3OWco78+giXBE96R3CebxgaWQ5Zif6nI+FJnw6OipaRgd7EyrLrQTWadvTiYLfDknlsxFZd4XVs33/3xxF3RyoVsIFO7cpEX/BLVB69v+1TJvLdiyGwSl5FUKbrcrXycZ67uTKtHyAI/vrzwwoQxYV8e32xW86blEjH4pq/Zrijm1wGw7IrD9fYVgEO7nnWpE/ac85LrDaJpGOdZ+slcVWM6THHR9boKJGLtuc8V81gDVNtZ/f4Hx5YXZWKIIfpe57BybWejdQ8ZACWK+mXOGczyXJ88B4nIvaKnRlhSszQryAZzSqJry2k3t1v73BzL48TZWJ6yu1rFmqAUk2V5DCA4XnyHfPuiG8hZfTuu1YXQ+iBgbyDipTwozQqyTv3SxLBPTFxKZLuabMn7ZTo/kLXGfVO/2va58bv6kzW6WjwZ0D481N1Nyd1kZUw1lyxXklcAzZqaHUiIsy+/5DgV/qULYFqEBMNMA7QvBfRN4VZRlnNiemgzkBQXj+JGJOWZMz5cvss291rj1fAe91s10nkZoaddDrvfgfjTq6n9XLSyGSmnrIDMLVc9+YuDtuaQ4gwuiLG2X57Jzrc/Xy7jdZ82G1j+cfT/8Pvb40i1K9aid0Z3xl/tm7jBAqQ91Ehkbo6c8jUVPaQsRcfTumtsNf+Xa5PJmQtEGEPCUlGN6F7eFB5eOLXQFdsLRL1x+SzhS7k3aDri9sTMwYQij26AexwwzAPqcOOkkfbYf0lov5Gxx0LhsZAetDZCRFlxjDRDS8jE8dKBBXkWFazF8K2rdQXKNlclwezCEDBwUWhoJs/H5ndJ38MpSPfKo1YsVvlxi4QFyOTDPJIstCCvYnCjj1r7SrkRrbcuevITRTxD4FKgPCdsYFlGfhS1zWb23DWYWo6fPQ1/zlnN01gZStxsZKepB3NnxbTSjBgTSmzG6RzZajv6BtqivtvOa1hI2KZQtVGCDU2+NGmfbJ5TTJehYiTEPeBF9TfLRP9rktQTUngj2ohv+1TDL0jL3YWiSA9TJzYonsincEVy1aRUeGVazWF2Rrq2o4hCBp12BfuMGHOdVkg9rMXdusyl2y75YyEkcBNMz4zi8i1lVhjUg16rCR48uKJ9QO2KBbjoGTx13uxIXTR8ufXx6mW7iW3qVx+6k7BQGKlMo1G64O8HQ2UrboS/tCqlP0W+7XB2C3EaZMqfKeYcuzM4MLkM6CT2GKYmJPyevXLKE749BM8zRQUcrWieAxmyD+g0QQ4T1fl0RTNEFB1/0BIg3fQQHCLGUTahXwt0EluG9iNPVgmFwwBHybH6gmIEZ4xnD8I7QPwgYY3JF407NdLkHjOuXrP+GODGEvX49MMaUigUUO2fkdw9EJbaidhx6j1EsFpQrz4Lt/5sAu5c9B/365TXtnNnmaPkaFj1q+3ezVXUroimRqxZ9BMaTm7J1hjubO+Dxjb2QlR/UApvQ0ty8aZpmIrMi0xjfoodIMiH6IYdw3VRZSqup7irWWpnJhef2qqtcpoxdiYZaFyf5u2XpZqEnAJpTupqOg+qJN/7aQt6ZmP7POFPwUwzwAsfTYk2EwMlTVAXrawZZEYu2JZ4kIjazo1LgyuuWTieEuONnye8Hr9p70RjwWUdlErlPSCKKn6JRdsM2no13F3151cfgx8I02J9vDuiNa3vfJfmRnBOly5jq6Wlnm2rJN6YYQHwbikoq3lJvkX5ZANDRKFlMWKK42+fXLBuofAZShFt6xvlY384aYsv3EcR42GOLrgYPQy0a7lr/FS4mM2ErNwNYnCz/xTuPBjgXXplbAnyA3jpKdPN1EfUM1oA4kZjECmkXZOuyEQxrndS9eOGbPM6S131zpdWEw9dWSZdkSI34+OkLfAKf6W6z4G4Z+cMRrkYLHs+BavJOum4XTjyyXHIKhQiqz9mgEf+ulodXi+LNsbq1eCcGPWrGg+GNwN1SjJHZm78gidyrlEF6xuPCaZRvGQtk59nuJULOZWkC3Ns/EcFiAql8cu37Lp842fsHHeCVOq0e8ZII4TPg9HKPwDD4HLSg4frBzyeZwK0nN30C5ATCxWdL4Q60cKtZyIEM7Kn1a/vifsAbe019Ui3ovTOCYiTCAdOLaAL/NdpgWA/fDNOsTlPvnEYkq+4+bV3Wyye9ddxICD4TnC2yvXvjw4C/WnYYceJy5R4KamIJueEGIHGp22/0DSF3H4ji3QoUDiFB/H+CA8A2q9LO9q0NYcf2P5q2MfdJGu4bd49g68mltj35pRnGQaafflXY9VmMfrlAbBYfUnsKOb3DOUpq8asveE41/6WkGcXFIuSABcbBf0cHIfBn41wRWQhoCm/JL8pfqEZC/paBdFBRW4FjKkxhbg4BPvBL0aQyGGkU8eH8tr8nm4YN1HMFF/s3s8+9FPoBxPuXLoGSg7Rvdz+g=="},"version":"0.1"}',
75 statistics: 'SfGy/4mpXQdDOv+Bcfie4Yt/',
76 userDetailsVersion: '0.3',
77 records: {
78 '062af892bcfba49ffcff05c56d99b7af2d508358e39c058c2e1fc83531436f80': {
79 data: '7sgxSQlqR+wh3g06M2+sWp7raQxjjQ9jLIz2OcEB7SckuQcXNrhMlDCbL6ncSljtzgqhioWrOB409kIG8lc7h6ekghOE/Mhi7rVwAiRfNGB7r3mYxpEXRe96O2RG7E+NcSp8ezl+5gJ9D0o1abXPeFQYGcr95hUioCfyY+xrxY8TJVwdb9nHkYvBdKV7rCl1dTxgsKWK3nlo1T7e5uyiz5YUAE6BrCtTFAqtprLI/xOpRti9C+llohS7D6s8hkCBPZfp3chKFDrgpsCBFLhXN8jrBKSjHi1PJdRQzpJsgrxyeBj0dZx3gTsYOXqrYgdIzFUo7K1Tqb30yNprBiDMr7j0YYXiSvEb7OuOIP+HTXGN+yt09bk9LggyY6Fh0e+tenjQQ3soySN/XznOBpEjXbzXoz6fR1MXVnE9GgaX99LVNqwWfq2rIBdSE/FfspRiWP3BY5jIrEkNeRclS05U1zw3K3wxOL+cB9r2IynSXnK8QcrDNNRZ0W3PhsSFfByUXuviLSEOPuJa1mYP29L9Lj/WyHL1Gyl8xLbt2H41S6+wvIleKMuc7teH6wPXbnYphvbwBowoI6HZTEFkz3dQKhhY6VF/81iCXsuaz6BjyrzFX6SkQ4S3lN1tv4opQMJFvnmHb6EkXqVWfeIXzJIJO+owL4vDOf4okpAD+HPjjlVXhq6fvyM5UBIK9+tzJW78X/zifrQOfWRIhwjVsfUdZWmZ/S35vnHWNuXkM8GBYrDysqxanDtah3U8XLAiIhFtBOzpzr6qGaNDOKKgG3K8QXT4bYHOq1rQVUwzQuKhlCyStrRMQrC5Ry251xmLy6dKfppRarVeGDtzB/30BbtFNdZmzMNG2g+Jj5tFCrEtCMvMiQEWZHMU3tGMFxDef/KKdv1fFTJC16jmaUiCHUZmNjB3EO9R6xPVcMlAVKf57n3efrpRk/GTmm9JhAFkuF/wsveH4JjPpDUdkHYFu5tHbb30sbga3ufBAXbQL4ck10S24akU/cKraFGLvuKGaR2U0i6ih911TBSf3pAfZ3RFbBhVIl+6rSknC5+IXoBR7MRstBPW/xC9pQVjN5Qyn0g3aUjUSI+q4jcTuvMl32NtTJbWRMGhfkrpVzypZTyPnIh6XJkyBghlUARXw23MlbjiZxmY4ScDmcWZRZJWIknHlqjDKFDKNnwrfnEI9qWyMDno+jA/DEQz0mnpdZYEsoz1/qAmAeDt89vx',
80 version: '0.2',
81 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
82 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
83 accessDate: 'Mon Jan 19 16:10:04 CET 2009',
84 currentVersion: '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3',
85 versions: {
86 '4a70ca20167875a936d4540f19980e972c20f329a65d85e9b0ce709f1fc7c7e3': {
87 header: '####',
88 data: 'GCNNIhDQjMJQZGVSf+95fPtU6eOnFWVhuGm86r8WZGVR2Gf2EjbG1OJ0ZIGpZ/AXgirCMpo5AFxJe0Bay8IYg+xmBqMFhwFxzAgJBYCIts+raSaNRipuY8dTEqDxAqD1cChcG8EhSoiFgQ0fG0I7nNEUDJi0pIt4/ygBcwvAhuAenEp9ZW+oQA0+YysPQRqkz3IieFaOoSEbe5/SqpUilV4q1gTVyzNXvrxzxx+rlvEyGFgFN+vgtUZ1NrwlPk4gVksTpylvv6CFaMGEWKhgMG6efo0rJckKosaJTu1pldJdnmMK4EKNMLOd+jZ6pEhEhYyadrA4+zYU5TlmZA6ASzTaps8piSwZodoi9qY0ch2StK4mAbzeEGe2HdfHuAU9Tyq3Ppk3+VfNdKgpQfYrQOiSlXbKzK636tzXTN/gyrfOTHjBrRl117ywibgSX63ayAYNfcLpKotC',
89 version: '0.2',
90 creationDate: 'Wed Mar 14 15:46:44 CET 2007',
91 updateDate: 'Wed Mar 14 15:46:44 CET 2007',
92 accessDate: 'Mon Jan 19 16:10:04 CET 2009'
93 }
94 }
95 },
96 '084e23120544603f0297368fd3891a3818e0fe13488e2f2c6079913c8d1bed8d': {
97 data: 'fGzBu1On7e/6rAoSB1a4fq/CkS8Be/T8UP5cQ93asBTWndSYu2lW4DQ4SXQXSindIi3OnNx/f6SNv/extb7OrMLREF92wXI045ipPwy+DIICb+cQNMJ82Sh4cXaIcAWcyrm+MYri3qq9LBKbpwkILcebZidJ86lmKYHJozUezmfbMcwNCljHs/gYkHVzVcuw9L52Ugc6wC7sjsshh+UH6i4/2Frlrophtx+b1vervNd8eoYiKnedHVXVfW7UJcQoF27eHFgzwYnGvRW0KNXFFhqmPb61TSkIvNdCCvBKDP4SXrWvGgzU89wipvWdUPpQ+fCT6Mp3hPRrbJxwMunmjujZOzBld/HkjnXoiNfBb5akA280WvdyzWYATrjV1ZFx8yQY8G0+lRt/MxjKDc38w4y+Rf5WeRbXboJMvFatwooHUggk6qSRmZVvgOmFmNuDRnRYIFzqK3JclhJeVasnqhR6RiGSowc1Ffr1HhcZCMnXpQABGBkZcHD/zw6YjHRyh9Plw7XAm0xb16HMDtiwt7WLJpxLH/HP99j/A2hvMGWiUiFCaYv7AzyEPTmYbN32D1IsAEE/GC3FG0HypGTBolP8wpAfTRdlvWpJz8oRRdwuLV3Pgpu+kXh5sQyeZI6tnuMPQFmRDcMN1oo3E5V5V585nVMnKTFcXhBzD4UnoV+DQNkG/+iSPybQzz/EZmucEqGEYyjI3kl4MAX8UMEUxE4JO0fF8MzyBI13nxknowAceEammx1dGVaJCoIOdhadaPVPyOzXM1Vp1erVm5k4TsxSx1pll+GOm6hVoNHIuQLDueaMEpRxMhfwc8cDyXURqRGPTgTc0bint5xVjo10fnpX1gcdc/AWL6y3tXM80NW+uFJ4GI7VzyzfcMRzTiRaGi19z8MIx8PbIVGh2sw4FhgGujNsPrpuESvUVT+17M0+v8oEoABNlcizTMFs/sA1uqlPumFASltzmViAzClOsDuCh069hFLjdk/Ex5jy4vPYlwOT8Uq9DJC9ZWuZgiI1DrhWN/8QGAEGxxbvnSZPNCQ9kpD5p+iabinLLWOAirVNgKwIRJRyAu/uR9xKd7J9Wxq8q/ii+y5lGilbo2g24wbDwrkXYVhqp/4J0g+p8Wv1NBjCTSCqV39WEizUCRHo3ee9HnQnBJQDOyTBRuz2odTJtJ5tLYjWXZRdFzFSJrEq+Z1z3oq7LnhZy3YWaFXPeKmBCemMthtNt0nL',
98 version: '0.3',
99 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
100 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
101 accessDate: 'Mon Jan 19 16:09:39 CET 2009',
102 currentVersion: '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac',
103 versions: {
104 '0ae362285f103722abbd046eee2b7d10aeae6a1d05cbaf2081392ce9df882bcf': {
105 header: '####',
106 data: 'sG6TUmPSEPFpiJ5YdtghWHmHbvUK63tZCZ+Q5iz2ALas//jN+lZCBhZcjEwPEJskBkK2R0MyAh14wWGh2bBHMjsokgTe+L+x+0c/Zi0epE/IC9gtOBhsTe/hZ2e2xOGF/SbzET3DAAYXvxduZ36f7SvvFnrkkKvpj8wGSdTFcBmzqMb9DL2bRyRCLGLMzE3F1a0q5CufCIRz2TgHm+Uw+kfvvwC7ig/F/5iLW90Ypz3vmEtMEFYFHZ9a8Oh0rsXGfevbMhFqALoywzihQEe/NiB8dwn7GEdYKSQ35rhvZh29ULWOZinqmg0ONe0HYaxx7DbKsVoue57S0CIUlgHLajzHfLfqQg2sFI0OT8TnHsGg0YZ6mM2EdKmEjJiER0cP',
107 version: '0.3',
108 creationDate: 'Fri Oct 17 17:00:31 CEST 2008',
109 updateDate: 'Fri Oct 17 17:00:31 CEST 2008',
110 accessDate: 'Fri Oct 17 17:00:31 CEST 2008'
111 },
112 '10f45664bbd979a92f37886f1ecc6e52e49798b16dc997aecd37259ad9b2090e': {
113 header: '####',
114 data: 'RdKVaV/WWWchrCse3KtcXd47Bfm6IAwjqVUpaxoed3HeunI42AAm7xYYSjeK8edHpbNRJbhobBAX5OZtWIp/HmgkobKM8CIiWxrWz89FqyrbnPD7+fXdtgF2yTax/0sC1l0ibncdOuJKX6U829oPlXCpXIOjlomc4wEEAD/5V6FbORvdZ9IE/ME3LsG2y02cT2tIpx6+R6wC/PKXhZA2UDsTE6R2Op2BtIzpVORZLXsdyAp/4wvWQxq90i9cEpbsVQsMB10JVyNHNsRTFhIlHi9MVCaMxQvcrwRElMj/Y9x3RbsFzSGKqFLqdg7Fn/U+KYkpYtsgHv9hraPIb9lV5FH16+iItU/HBM6FGezIj1ZkoQ+dgjPfSjTZzgzDYwyb',
115 version: '0.3',
116 creationDate: 'Fri Oct 17 16:49:20 CEST 2008',
117 updateDate: 'Fri Oct 17 16:49:20 CEST 2008',
118 accessDate: 'Fri Oct 17 16:54:23 CEST 2008'
119 },
120 '2fa7b67e569d5e268d2b70b3d4d3a960d7e437e1937bcb324b67d0b9441db8ba': {
121 header: '####',
122 data: 'dpnI2qKjk0+bfyKktw4ZCWf+rWZ12hO5bda39CwD29JH7KtdpLCLe2LoLd+KKF2wOdpDsoI2iTiwRgFpt77e7DoWJABxq/0aaRCVN9XpqZo08iHiYhJyNlIszO8CdEhX+M3AeZqzTnd6fs91VfIEWggvku2Z+jwr0CbclY6FnOcNnS+1fj+W79Z9XC383GOm2ujjfo3SX/fyNQSw8aX+7AgJIRGR9uHK7M1cVfsNNTbmDb/HDgLlYZ1Pqm/9poHpmS7G4HUoRM2/WjI0R6F48dy5s8vZRi11SCnlnj5oRykScJj6wh2DltbCyesiaTpAjP6MQjTXsZzKpaosaQcQClZw+w6hDD2cA54IaBIv2j5KAHyhxDh2ERdwbdnCsDKPz4+zP+fmKfW295d4OY0l1NCSdcY+75HWTmBWRAooZeDTo7AE8m5sRwxewE0Y8J2MLUYsrs7Rl4kbZCiRRHU7cs+us3fq2DVn2OLGEbkRrK3kA9swT9W8ABqINoA79+DmDaIr6TGxe5AlHkCAl5sYAN4g42UX1NKhl4fWI1Scj9O1Ixds/1UUvqzavld0mE2cR9yt6LntjE5sQSAaexvymAJbU5IIM5NTk7NlY7G3PEvAPjcUsL9SGw==',
123 version: '0.3',
124 creationDate: 'Fri Oct 17 17:00:13 CEST 2008',
125 updateDate: 'Fri Oct 17 17:00:13 CEST 2008',
126 accessDate: 'Fri Oct 17 17:00:13 CEST 2008'
127 },
128 '5a17723c34226d8cd663f91b11bfa14979e694e461818113ec8abf7194b46b6b': {
129 header: '####',
130 data: 'yRTvhkoY9zDRBwFYf0G5U8zhfS1XWIUfwes6ADNnFyOrHOr7JZvZZHSgkOPnsmN/f5ngcvFaIV9X3TNTmmPLzD/ewgGVMR+ofMLyOIMGhxUDzosSd1+HKqwDZWneZ6xNsci87W8UCfJgoEGrkAtAwktqyS04pcAas74XiRGBWNcv5mHZONwGPckYUnnaVG02Zf+qif6Pp7ugdvXrgncO5oi2AMSoR8GQxMP+tX53YzLwOpabA32PDT6o+aDPwMstJNQjWCXjeYLDIlb0GjL2zgjglX5CfdGw8vNT5hwGEK2D1FkvHkw79m++9sOWd5w9WdGgtS4mrTZP3JHWC1sPqvsIpq6PsrzRrbfCFH7C4X/ya5ciOIZTCNl4dEGAif94zgN74ueY5BF31PNFtaRaQ1waKkbsrU63MrbQbBar9b0hDZoser3BdgDGb1Ecc2GbJM1HbDITttmFDrzy/Ugh2kistHx7Dci8IGgfT7K94TntRFc5R6suEqYRrmOn57YJTZYrwSgbeTqAt/KOE+gL9LawiLJ0IdSC2RQnO3yu/aOEThHxpdLIKiVJoiEQXYVnq2UpnO79GNtplNnUe1hETQ/JT0o5X1bbENyInUsFjPuitAfChXofkAysIhDOHAdifc0Y+pxOHbQLkL65ZOsEDXWSlwMcduMNdQm4LVx26GLIV6yVsaDN+hGta2CxUuSvEIMM6T5xhaPfJ4K57LVw9MbOjRXpmFQz3QgEr8ZZdUxgE+Kj6CtmsjvzXtCQ3Bv/SccTLJSR/LQ8XRdIcPoOlDDy5jSQDF/8lxkgV1V7M3+SI1iWESPT8My5C+RH32F2MNZzthYq5hIFUB3wsM/AaQ==',
131 version: '0.3',
132 creationDate: 'Fri Oct 17 16:59:31 CEST 2008',
133 updateDate: 'Fri Oct 17 16:59:31 CEST 2008',
134 accessDate: 'Fri Oct 17 16:59:31 CEST 2008'
135 },
136 '6fd60c5709a4808444f43f7bbd872363d76703957f613076538ba2f9161206ac': {
137 header: '####',
138 data: 'RgIWPbNN3sPkIPBE6lfvf9/EoDFLemTZe0Qh/1wZLrKxLRNzFpUk9+NmeGUp5f1hM3XjXw4cXRvP6GrWq69mz9zGja+1TA6RoW3dFMpSQkbONcrSD1mIjxV2zIvzA/Pangz0ZixbEeHCfwXLvgnevbTXXFjkti3kLHQlk2pJpM3zMl+rMJtcsefszuJ/0tE/bO7sBcFqcYgKAht2OyDQORBAGiW1kI9USKM5OOfJJIZDQ0gDhRgl2U92l3kIOO8hdnj32oRedwfKFmdSRkuMY7ykU0bMuVEVkLi/FWmhHxi66C2ovAztVtMd1IiyoNcHc4UH942GC4pT1A8YQpIHxBAJbrQVhpl9LfFkmJ7xUc6Xs5j0Nv8+z2JGCnJI/D4nDJqYW+iCYtRWu6vUmbg0vGfaYWQFGRZRk8zWfHzHXBvHU8p0QsIjYgCLKiUaU2SRRD2P7JCjeTUrm3I1OI593iPsEH9J2PHCM9OMQ8/Fsdgd7lWgH6P9jLdGUwtb1hGaq8mg3JGrHFXcrVkUEBfeR7xljeSHD7j4YahYrua9EeR8nvq6CNaOr406AWyHse9SXhaOxt8qXRLoELpyQPsaLgafUpsdLjJqHz7J76Rp77NSOtXGplKjAtU1xj+d/agaAKYCjvUJC8/APJI2890Pn7VSXr/TPc5biPEIopyVYEHFqaT4e5nZW1Ku1HXC9gwUwUI9rITG4GzIH1WMEm7oFLNUaSMrdK/UTdTJZ66ENE3B9v9cTUpR0NTkbI+iGKDnc8GHPRlr2ZJwN4KFTxi+o/kkEOBjvRHR55nRh2+dke75LS/fzHQZw5wlyqBv5ZeUZfRA7QHfkj9acR0fJSqqNX25AUzZQnRL3oVpOxFWCMU7QVf5VpnRm9OIOd/5F5EoY7Be4doM/UV9U40F3E6XPZQ8S0GKQzrDjc7jKyGPLNPLUWTmGB39mTNDHZQHh5Xv5Q==',
139 version: '0.3',
140 creationDate: 'Mon Oct 27 08:58:49 CET 2008',
141 updateDate: 'Mon Oct 27 08:58:49 CET 2008',
142 accessDate: 'Mon Jan 19 16:09:39 CET 2009'
143 },
144 'b57a2d2ffafa8029123362071c09709bb9192f06a17140440f0e41d22143148f': {
145 header: '####',
146 data: 'PQ53T2Vo2D8PoLI1qNX//jLaVZFTDTYk6geT9+4RoThTxvlJ+beDPnQzgYhd9iASaF9GQEEL8JxsBnNpEPa6JPOY4ndFLmDLyFDKXMprxq1UIbzFV6kFoYAk3uCCCa3UCDzdr1KXB2CiiF9HrilaA+xkm8krAvH8I5kZD+j23gByz5cAFvXg7A77KEURpjujURL65DW5M+ceIjo6OXaPW9VO03xhqGt/M47ayObpoEGJZn+X9C8s0SE5wOXHbn38YZlRI480OMvtDAxbEYUeQKMmzu6lO4Nw5hhOUjoPSLr/i3tmDx3nPcDwnSafx6jyA4y31eW6yazqTEOP5I5ArC5mUrF7mAAiFvbHIsMoF8PLj6MONlRIOZgbf9HzCpFdt8xBrX/TXp3LaSAj2XTWgSTFI2cgmU3qqPyibvIfUsB5cVHQCXi692JpC+B85axJ0FLyMl5w3vq0txlPkf6q+dadPYDaLHGZEmDjkWScA1GM5xPJHWFwqGE7ejgXKG0sMYsMKWYk+F2LEUmMHtEvSlpgJBntvcQ1ZjYQxeu4hg5txu1ykkif6fXgkXF6wn6qu+5caeJeNhWtAB4q7WVD47111woYMdkmX7AnDTXSAQ==',
147 version: '0.3',
148 creationDate: 'Fri Oct 17 16:57:17 CEST 2008',
149 updateDate: 'Fri Oct 17 16:57:17 CEST 2008',
150 accessDate: 'Fri Oct 17 16:57:17 CEST 2008'
151 },
152 'b713e0a1e2664ac7bfa7ba887329ea023204d10298973e322983b82b222debf6': {
153 header: '####',
154 data: 'H3gIieYrH7Oy8LEWCZpl9vGp9qYdHNCoBNGijYqlcfXt+1JYvPj1abPp12xLNrDUHfaOZklU2Ip4tOf0CDNhgAan7LYyPqFoy9ss2f9/5RLcbjwiIwSduySIL322HTAwqlzlBt/qaJdHHPUrczmu0fb7fT+0dO4gCL/e/IjcHLefUUgNPAbpHG0Nv0+4lNwKZkIQM3tLRtfJyFBIgWKcMcP1XMic33kr24rwybR8Pb0CHZrOOvvUiGqyoED3ZTZf1twUDVNXO7MWCAC5dBc6/Mk/vSmbbGhppXAH02N0g8G5qzZfp3UVikls55VNhRYLHByVsgpkbIrKXyZnBPTwzm7qefpYAXDOgO+164L66/Art2FYGqZQRZLuh5r8oF38',
155 version: '0.3',
156 creationDate: 'Fri Oct 17 16:58:00 CEST 2008',
157 updateDate: 'Fri Oct 17 16:58:00 CEST 2008',
158 accessDate: 'Fri Oct 17 16:58:00 CEST 2008'
159 },
160 'c4cea1cd88a86b05f48a99896a37967c3456228283a0406331ca9f67c6f29f97': {
161 header: '####',
162 data: '1znWPwc9JwCe7iOFiUd2iGm4xJd+824B4VRqEtzCQkW46tg25RWfo7XagvK46USB7t6pC8WMLU0M/EC47KucsfpWUqHGbseoXT/8g8E8GoLnIsk9qFyJG7LGd1sUvqBgszLZwjWWG3t9zifmpW5nY9GialBYNmeSLS3bg5xDH+eCEilUUfDe7zGuVSuu/XkHacv/DYUst97e+6u44F7H8Kv8dTywJZpqbmveNPeWfCej2aBXdVV616J5lIRaj2uIYuQYG7blYJh9KZ7yLStdPndl6h65hIJpfWo0PM8nLJuo0lWNHz7misrutnmxJEjkwVIZ5YAmqp1Zz3VC8zw4IxkXrC/sPmp4PaNXgKz9ZJRaY2KV69WmHf7BUQ3QneGngbT0tN526SS5qDFwTGiuIlnYGWvTB2jVrbns68n/d8Fps8sSWfJBvvXJUEkaZB+1WqNilOPGXvyJ5k2O/iucFbRlxwlEHDny+AgsbtXZdp8cHQ4C/O4G0mnUMZuS38gn6e2kQ55mUhxKeORM+J6Rx1y4Iiu9KKNbxyS5eBpAlFB4xS/o35CS4g309vyOEhi37F24bpp4pM0xEPG4mcc/IyChHzaHUGEp1IX1ZO/r3ut9RIN2QWrGLUlZV/9rFKpLLAy6BkY/g8VYNrV8PztOL3rqy/qwqNZouONwPw8w8SA=',
163 version: '0.3',
164 creationDate: 'Fri Oct 17 17:01:59 CEST 2008',
165 updateDate: 'Fri Oct 17 17:01:59 CEST 2008',
166 accessDate: 'Mon Oct 27 08:57:58 CET 2008'
167 }
168 }
169 },
170 '13a5e52976337ab210903cd04872588e1b21fb72bc183e91aa25c494b8138551': {
171 data: '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',
172 version: '0.2',
173 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
174 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
175 accessDate: 'Mon Jan 19 16:09:25 CET 2009',
176 currentVersion: '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854',
177 versions: {
178 '106a1116d22c2395906a346da4d830c7afbd2da9a46210d0b7a11de238016783': {
179 header: '####',
180 data: 'jgDUvByveAFnchBQKhiHGYDNDtj/7Aja2RePMer0FCOkkEu5GRAiLkxA3/DD3eiU+g+mCxnjnOaEIYL1O5o0+JP08XapsblZHTRKfveeFfs6sWwuqEHGYULBaXx4XSfK2B12HgpBwa5aD49489AkuyXi7t/aAXcKKJcLB1sC61DI3NsmajUaXHBi31Sp7nKAUpMuiWyguW0JVfH6KUPqyldVDBTBqHAis37c1qoR6aFHFfGgAfb35+syfmPRgemujMRkj2XO6dbt9zAYlHVSYFp9393rwPZoyBfXMMdDtSTmq7H9qbmx31GecHZlFN3NymtPPDYUbQ9mpPVRbxE9NjtiPrI5eGFvb++OdOx75PKjYjCAPWWFZ+4aryNn+h+yqab7pAuoG03ACVVrAFIOn09g1ssol/vqvalulEf3hAIviedyiNAC9D0UDHtzUwyIiELvR9qouXLZ',
181 version: '0.2',
182 creationDate: 'Tue Apr 17 19:13:41 CEST 2007',
183 updateDate: 'Tue Apr 17 19:13:41 CEST 2007',
184 accessDate: 'Tue Apr 17 19:13:41 CEST 2007'
185 },
186 '111a8a4b6b912b808a93cf5e8785ca223112628d05f0bfc5dfe1eb40cb72ed8a': {
187 header: '####',
188 data: 't524etHmXljCnLC+IM+WPD8Q5VE7wDsSHVNZzFU4hQzk119t/N/vhtfHYz5HgNstU5T8c7h7RHKvFk5f+4ZwgNgDqSH7H2PrH+7/bV8+uuqbe+/3GYOvELjTF7v3xMyYs1B7ruHpT+291HVNZqxajqCl/+9nbG0e5feqNsTXWUTdLzF0szJuCTNr2I+fhxAO0LRVaf8h+MBPYyuBDnfFDuKm899IsgF9YoYRvjaYO69DkElvf4VP2jrXIJsRnGIUfUaIS/wQ54+X4JBZM/9M09MVOw1SVe+cwG+P3xyPUkqnSb77ECo86C0MktzeYFmPnPv2SM2KFA6slctXsyudoaNlReh1k+6no5J5BjaawTfqYjYrAtWSPsuhxYVsZym/X2CVbkz4rMSn+J5Uio9N5uZ6AqgCKdhAJlwzVb3fIIJwvFpVpy/0LMskb7aG2i4eAxwzx1H6rD3Y',
189 version: '0.2',
190 creationDate: 'Wed Mar 14 14:53:11 CET 2007',
191 updateDate: 'Wed Mar 14 14:53:11 CET 2007',
192 accessDate: 'Wed Mar 14 15:24:35 CET 2007'
193 },
194 '144d6eff3eb5f1cb70c8906741d88018cdeeae3a618ac4066598ad6b04242364': {
195 header: '####',
196 data: 'NPgSZF0eSOzy0/Ns+15Nz4bjSwh4o7fWYgKgwXLRFrF8y3EdbiOH7AiEmmPrCpT1raeYLWCcDIrRTz+/9uvIrz6kK6BjU2emr8YdyLai+PTCRY0SafWS3QiYixX6DJiKIt0SC2F6dfmSHwNsbfTHilFhVXn6wXTJpWvC+sRzw+h42cYpQp0BoLSuFV7vPz/+wtuQdl28BiBgLzGsrtPud0tPcfldGox6Ia/1SrOPcqUr0tnFlNQiUvPU7N0JZgRNyr1PfpAEhmYRI7aEJidsZ36vGQpE0ZQMmQE/9tLS/InALRZT1YXfMsytf0o3y4QlgJrvRgBL7fGiQOZJpU7igLk15xAwU+OLIaYIbr2xlKDJvndHOcrFoYKry9/A/aZSnEYv79wsaf64bBgIVD2WJGLuSFFmzlFnbg/O4kGTin3A8XBpvFA9V6iCMvnEMkrqxD3Qgf7WhxFE1A==',
197 version: '0.2',
198 creationDate: 'Wed Mar 14 15:33:00 CET 2007',
199 updateDate: 'Wed Mar 14 15:33:00 CET 2007',
200 accessDate: 'Tue Apr 17 19:12:56 CEST 2007'
201 },
202 '1f1bdb7a21440ac20c6d913d676aa30dc360252d27059e77df51a1be36b2e263': {
203 header: '####',
204 data: 'TaOHH6IoHPKLLoyLyvsBszgsPPcDs6CiLVXzXuXjFSTrhPxzUw9suSsisgDRRs0ncjZ6BCyqoCxMnw6QVvGN4viUwYVR8AWdCg0NMQZ+LkNfq/2WN0M3KyASI8sIdMCwTb57NzOn9soB1HmmmETZfjr7HpY2cc+lS5/4f5rxI8XTEK60lLed+aEuJamAjeZUdgIyu30mMKKjxPfY3Y9iWMwn1OD0zF0mAW+hyEoMhhK7EYlWKCy+4qN0QM+yNFXQyERb04o2n4XrM+qr9df1GtbQMH8igK5VzXIrKjdHjKoLo9G7D7mfx6mRLsmoAJuE0R8gyzotgdBpOgWasHJ82iWEa1dLRKBHJ1d0Lnumv22tvYfasx2DIR5Tmx3kIQ3hFieLSXq48cYMiaZH/IbLiapIOlMgtWDow8JuySBLei/8FAV8jCxSc1Ui/SjbuK/kCvywaSOhDVIxGw==',
205 version: '0.2',
206 creationDate: 'Wed Mar 14 15:26:35 CET 2007',
207 updateDate: 'Wed Mar 14 15:26:35 CET 2007',
208 accessDate: 'Wed Mar 14 15:26:35 CET 2007'
209 },
210 '70720f026f37b571e9765d27c51d3d60c7be0293c3266f1f987c8de9c6b5c416': {
211 header: '####',
212 data: 'NYaYljcgfzrlN1DVgrbyj4AeVhXGjXPho3IQwEKD3ZOx/yEZxldCNSyFsrk7PoRB8Q1T/6VV4CGa4HLRSB7QVCrtVqWyu4KbbmFoX8NIQ0H3xv+TSo3S/b3dldUeyW32ScaGbspaf8nFf0CffsgpGusd+kHdiE3gSLJvH9y5j47KgpyyX4TteVzqgez4dcXIs5tdzJq2eUlknwU4651QeKIuRSmRaDRhhOP4yRgUo/qXMlTJFmHviCh+IumvBdmDoPe3Vc1vZ1r8PxpDJLvDoB8GTDE42NhqHfVrew9ym1xlTD9wswwIEikfOyTq3JM857qPOHRqSqthEvr4WHbm1VW5PReIyse0lugGyOzqtCnADp9NvNI440VjaTd4NBQqF7XrRm56+1u1uTdfYGFV5BRiH1KmrM1sxXQ6PlOF9Lou45ALo20xxvJOLKG0RKLMr8gmVT2bNtOSJw==',
213 version: '0.2',
214 creationDate: 'Wed Mar 14 15:30:09 CET 2007',
215 updateDate: 'Wed Mar 14 15:30:09 CET 2007',
216 accessDate: 'Wed Mar 14 15:30:09 CET 2007'
217 },
218 '88943d709c3ea2442d4f58eaaec6409276037e5a37e0a6d167b9dad9e947e854': {
219 header: '####',
220 data: 'xI3WXddQLFtLVzxJaZWQaw8wAgSuXLjLnyoNXnFuLecTH0BzU36PatglVh2HK3LM8aDLzzbHILdlLNnJ9CY+YnhmGh8hswF9oKTgq0Wsesgdc20QhSMNFFjmMljY1LSXmcAYK04Q5mIzi6Pe/04DRdj+e4zbe5QI4vEBhp/ohEpxZnNqc4BoX6J0eVf6LA1pwrKWvxzMxorWsJrrr+mn3svdlF437n+MMr89k5sQJogufes2GZ9tTvVZ4247ITxXqxgAhwXtbuIs/A5UqqnNdsxlHfpLKG5KjxB6F0h7TtFA3gkZCve5UmAibBnoBCFaIVWQyVq+VO9iqDm3DeXsK2pepvgIvpSID8Poy+uwN7T95mivAsHG5p7MtgN9KwQzNW3Iu+BfO9FlPBMngSk8L29So2CIXe6lEsXSGEi5Yrgyo6hZi6IkGCXwIQ7TCEMnlQEGyKnnAVik',
221 version: '0.2',
222 creationDate: 'Tue Apr 17 19:17:52 CEST 2007',
223 updateDate: 'Tue Apr 17 19:17:52 CEST 2007',
224 accessDate: 'Mon Jan 19 16:09:25 CET 2009'
225 },
226 '9588b523f39cdfc14efa1e15ea7716c2d8eac45d8efd7bfeb19d716f9df72d66': {
227 header: '####',
228 data: 'q6DKkxhgDFs1XkqOYf6dvojPF+yhJbniTLFpSOS+I1sum3EZIJfYxJXyi2Jx3KOVNBMILw1+vrSLe/fh5SSWj8ZBoeppkPPLjyRNdiUyd4IfcRM5OSv2YcTxCubKCH2kIMFAzY/29A6ZGPG+AN8/kxkEHc1fxKaNcj2Cs8qejNR8yK1iKT1Ut9VfEee+Eqy2Ohgdq8wL/xAD5mUzdqHeQl8BY16pXGIYncLxMzR+EJ8E5jJTuGv3O41UbO31lvBSfCt2pfz2MrtsuqNoI8LBHJkcR6t17Bj+rHZUniHlyxSW/1rQJ1NnwpPgUJ1fhfQJZM8Faoif+0bvWFY4xWs/tCCD7oEvf0xM0I3FfcJLbYX8M+wyO08t9BmGdEjnr3VUcuS9qKaJRpdpMP7aQf+vJvioeQDXdOJ6Ceo3BDFc6JdNta1Qc+agGzN2KPbIPrLDL+08hWl61yu3GQ==',
229 version: '0.2',
230 creationDate: 'Wed Mar 14 15:27:35 CET 2007',
231 updateDate: 'Wed Mar 14 15:27:35 CET 2007',
232 accessDate: 'Wed Mar 14 15:27:35 CET 2007'
233 },
234 'e5b71df0d4d79a195c7ec3288dd7738069837a7c4da3bccc1ebc05d8e4f19d79': {
235 header: '####',
236 data: '1NvK9Y5r0Q880BfB1W5IqdOR77mmqQU0d1GL1XUeQT75R2EgYE9rK1X1jLygCXboPhxzegEe7TDhUsn5XcHN0LkXcLYz8gD/7+He2HiTFxoHd2oQbI3ceBxDJ7+5kWA6Aiqy42QSCuA+TWIQcDVthSyFU7nNdqNxeBYeXiI4jgwcH3xvm0+pBf1OYLtywjUK1JwntP6o68b1LMQJFinDG+sqRcm25ggaZyxDtoLh1IBdSpmXk0papRnyyTGNgsws78dLxnH0Iqxb7FhqYfgLDIvN3i7+IALI0lF0EuTS0hSPlr/1fTz1/6bVt++wI9GpUsrdafUJJMPerXoCK+gAP8EMneLq4f5487HIkwWh1qON6Hvpg+tB95NOSJpqE72VpVxN4+wTQWyDMhfjqXBuQ1wKvTsD/mUsdinU0Wb/YT/zIWBNZPdqur0rjOC+mrOtSdlYSCH89Jj2',
237 version: '0.2',
238 creationDate: 'Tue Apr 17 19:15:09 CEST 2007',
239 updateDate: 'Tue Apr 17 19:15:09 CEST 2007',
240 accessDate: 'Tue Apr 17 19:17:01 CEST 2007'
241 }
242 }
243 },
244 '36ec1a41118813ced3553534fa2607d781cba687768db305beed368a8e06e113': {
245 data: '6fhueIibbxKRA7Mtb9TPcWiUKajnikM3D7PbOROBkE39Vw9E/nG8KrtJlwwPQeOGCFhssO/KX3ymYehCR8rfaEL1f9pfdh5x69mSxKRlOmtEknWqUgPzcb1yPenRbQagERadh0LF4zu91M4WjXK9qynEHoxI/pBhwQb1IsnhwtXl4ELtajudv+2Hv3p75v4XOXFsGQMsHPY+Zw7dkFFA8EXhvuxjiGvnxCUkFwNICFRdHTEovkW3VSerLdrYo5lDgjY6ebr/g7wDGuu4RLfUK4+HpzFwZ0+aOrjpFq2ePg2xObvkkMNNjZ2PcR6Cue0sf+aNqzIHIlFPpY2Hmrob8+bwxocKA6aagBu7z5GiUmZNXGE/Vtr/WWBV2+xIJyzXZPet0MLmSnGiALjPJveeKnnFdDtA929ydcAb8efc0/snfU/uDoXDiO5SWEQ8DDNjj1bSo7VPTtvZyFormE1KjqimqSwaUJzbIS4CxPnoDezaBtQmlG4z8mc8jXq1HfPu7s9PUzcbG30gbF0ch2pDj4h47AhE0ZoeiV+VYZTaYateSifQXKBQKjPcuh9PQyDI0HVua3itbbwxXpRubEM4fbvlcd+7gu+Zq03slYICD07fP0I6XGrRHVTfYpDbEb4GJBvRIeZLwRTQzOeFbPLpBU9Lv3zXxfHfcHy9oK+giIxefPdY1ZR2ZFPKOO0xYJsTr0vmTuXeXzy56bKl+yP2lFst5l9QG8j2JcQEotDV1KQS6mbcLjfIpEnltu5fc2t10Q25Noh+F3kF+LcMIYsDjwanojYlOC93mZl01hmSJdimRTk9otjlRTyC7NWwiyy7fe5IyVi7ACNPZyeUYJUPtKWcPbT73Vtf8W3/+HdhmyYNyMQ9PDCBb9WKMon+qW2+ZVH5yv/KqMHRY1fflAfxpHNhrCkwqcAAGw+G/cetbvQjpkfVT2/u/uLupMsITN2Tgvr/8D2IMm3cyDBUCshrp0AfzARRygHFK4x/0uLfCtQSNjw6zMK8mn80R5aS5bZi5gRS8JBMZ4Q0iG4kBlLpIYtsXSBwl8faljjdl/4XvNNWWrdGJn2k0eM4cESlOFFk4s3Yu0Zspo17nKAHINjHAiP3VlhuKSnk5C9hMU5i3vZO8anQmx9UEwUgQVm22azCjyNtUl6jVPYSNsal7A==',
246 version: '0.3',
247 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
248 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
249 accessDate: 'Mon Jan 19 16:09:35 CET 2009',
250 currentVersion: 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463',
251 versions: {
252 '381201fd3b67549bd6630841e8902be1499f3ff0c3514dd464ad9679f22f3561': {
253 header: '####',
254 data: 'DgjIW4YcJAYnckuEUzBFkfEC841LuanGopPgp+YkyMn3xuzdpGq/ObLFMVQaeAuyErh1B0REHPbq0E/SRUZbeXLXWN720GU4GXvY5bnen2h7pHvl/H4yz+kvyKh3EHJmmBjuz8s0kclFJQB48lter+G93TEmUaFke9c9m0IkKlgzwZ/PQKZyIyfZA09KFaozdSxdFRbswZj2Vq8Df2PQsKLapZWX1wYQ3lXOcyvNdTULy9MCXwPwX6te6hTLWxQOiSPsvB8LItlhQUsSbrJcJEvWPlBupPu5SeI25zDnqKDETPep63Ks2GWf45nXZzYYmQMzL0l2cenYFxlE18TcOd1Ms24TQ/iDKMhi60zZoo13qjVT5AKZ80KNu46t08qbACxjv/LeK2aM5TNycTFixGskPywpnb6MCo8ibRe5rs1WcTJRMD04sNoiuriivO2fiyo4rxjfdyfueMlOz+Zeztk=',
255 version: '0.2',
256 creationDate: 'Wed Mar 14 18:39:55 CET 2007',
257 updateDate: 'Wed Mar 14 18:39:55 CET 2007',
258 accessDate: 'Mon Oct 27 09:07:56 CET 2008'
259 },
260 '99dc86ebeb20a3db0c5393d6d94bc1150187b04316a876970dbbcf517b55d6f2': {
261 header: '####',
262 data: 'AJwqCWNKC9z8DC4TUI0hWnqHvQ40Y/x+jXylnVAkyO2QYQcqg51odLFSfgP0GiGEGPYwDc+kUxRrfO+ITgTNm+hHi2iIWkP/ljAC+AQ56MAEKsU/USTbvl6ShZ0XTAdRpwI/oqqOhYThVs6jTm/J8+lx4tWoMtNj835py88c/9eW26pLQubr7VysLSWuIMi+iDp7zXZZz/0gxGKDe5xNq4MGIYw8/OK1iJCOsjBdrRygLlS/Mz9sRlKkwdrDsohtRG0F/NdsIoaU4FttGs/rY91SCedvHy6ovh0zXhxOO44O6MiMbP085D1jCjWJn9S1RBxjxc368MGfMJeZja87nuvgSnLS2tGDL6zFtVJMNcH/7GqQPXZv/sNEykDNWpypchCnwYUJxvBVb45FcUzagPm+SSiekWK1hrEntZkZuEhQZp7Ud9RcENpa5h7wXUJSV1vPl8xBylx9HWmxez7D9OYRqbOlCRAEDqup4ahNhYB9',
263 version: '0.3',
264 creationDate: 'Mon Oct 27 09:09:11 CET 2008',
265 updateDate: 'Mon Oct 27 09:09:11 CET 2008',
266 accessDate: 'Mon Oct 27 09:15:58 CET 2008'
267 },
268 '9fbfcd3e7fe30d549a813f0e6c1be58ed45c3ae7305d7367bffefa097b424ee6': {
269 header: '####',
270 data: 'nZ+Lc5LWWLxnPvUrRrHhxG35PHq7GMbVENHfV1oS0Qw7/63NecssNoEbiOwFVMjAshvfUK7IjnzyvfQhNtFRbj2yzHOTWCd0eJ0O0MmvGzjpUntSDu9/G8RFeEu9jDKugwi/NhOa5legjT9pcsEAqR4s4NN/Ac6juQb6D/Z6Wd6wO0JQhT5/QPk1KllDpDeo2i/GPUKvEi/dXpik0KQcVLVylU82rf6hwEgvRQi+j0O5hnFW1E4ttxClrnPBEBv60jkNwcIpD0r+rvomDe8+398xUuB4DVDJoM+WUYfu6Sm3qI0yBfET+tJvjn8WsHhKTgZpOc2BXC7EdF99nNEg6kV5pSxV6AUA1XUz5kW+YfcSzAXzUH74OqroC0SucHe4+BtRKnbJy4h5vRfjTD+FJaj1Va02cxSR55tQhxm/k67z0QeyB98dnU1l/pPHwBlIWa1eR74gswNSeQ2jrzu5JeQ=',
271 version: '0.2',
272 creationDate: 'Wed Mar 14 18:39:35 CET 2007',
273 updateDate: 'Wed Mar 14 18:39:35 CET 2007',
274 accessDate: 'Wed Mar 14 18:39:35 CET 2007'
275 },
276 'a96a6d8b9ac73fcdf874d8a8534ffb2d43da8f5222e96a4a29bd2ae437619463': {
277 header: '####',
278 data: 'm3yhZu81UAjCY6U2Knrgg8mK+LX35Y/iZgIEm8MuRDAlg6UUz9Z1Anu63COFV08YyYQRuBzTgR9YQ8wrUD1S9FG2ZmtCDemqvd+5OUMgdn4sK7G3CuzAc5osOa5neU2m4y19WuobkGnhO78ko7pVVjO42q0DeMT92uFL6KE/2UCkWlq5SdFyS5qXEJEWs2IO5C8nVpdlO/eZ36Pl2+v+afl3QQMTthCVIUR4/zVP2ajbO48yjDXhYxzskFjtXMYLApEn0wO0dcifcsYhPkozz6Locrt/R6IZXnfZfuW5XXHbqhutoJFPK6L6t0Ib3B2r1TNkPaMsVs2g5V1g3ENRd0IlbG/uBk2o5tgeu6gOYlA1scEiL+/ad9ZxiqYB2ENCGZ8DXA4VNMnzxVPbO96OIUCb9suV0fldGOg=',
279 version: '0.3',
280 creationDate: 'Mon Oct 27 09:16:14 CET 2008',
281 updateDate: 'Mon Oct 27 09:16:14 CET 2008',
282 accessDate: 'Mon Jan 19 16:09:35 CET 2009'
283 }
284 }
285 },
286 '507f38b06d587d8889698ae1ebbba7ef8f0539b82550dd25779fd9ee88fc0c7a': {
287 data: 'ncSFmp/+n1pYUKi2fwhMCevSwFYO5irdcpOlSxC6YPOKYavK4iUbtBsilYWd0hpvUHW2ItaDwiyNFxs2Lwegex6dawKrpMYkPBcaZQDa746yACGgCkhz4MAGnUn5HCmz6xhpCVXMMKe3w2nEOjRB+pOMOeJt2n7aw0hCJ9tQ9JTFNrZOxeXrqoexrd210Rmr9FnKhLIvhNTN1/vXRqP0ys10omJ2mowzF4KoEVmz3ET6pS2d7tGjt9M/OYsH/ETWWc92doF5PO84g5/3HePaCo8NCqq4ul7AWJEbdnkxxmd7urJzIscPQPcoLxL7GfG5LhHTFyHlfFz9dNlccfA+OPftjyfjXTjLYZzbxxbi/nAB9Esqj5AoHfqaJM1ZOrZ+qAvm8Am3+HAXrqtiybDITrCLmGH9ukWDsx7R3lYTlvjArwORBUH+4w4/uYGscVm9kOYj/Rmz/ZMH9JibYFcPcOnr3rWXPFUL/XsXTrm9lzOvPyEYJmkENzd54AHC4Lr5vHpeuipWFLiJOrtn2WcgDG/DdLaYGKsmISXj74XDtP6Ee5lKOtbwwcmVNrl11UCQBEFHNybhXvpil5laKddOauLJDKtaDL/mKYPbr5YSk7HPCzRyE7HM2dC1MpBHuJ8g+hDkgU3wQcxYduKLRpuC0uOqrODigGWhVrdiKdZanlWUq9EkE3eH+E2A/CA8mHl7UNaH89XSvgV7uZyOmK7iZ+1kd9OzhBLQdJnK9qqP467Y14KsTt1E1+tqlqVAuK79QMnllaR0e3ztBRAQsyf5SD0KuSGXWz+z9/RjbhamW1s0UFRGh3voQMypU5RcYfYUA5KVg0BiVKFaiZBZKLo213hKbrgE2KoqVDEmIBFmwsu/S3EDzUY22tTB+o8ZKQiYesAUafGtnvsOLa+h6weF1ZvQVBerbD3fhb2o+d4ZyPkoRAsop+5it0QxsWuZL+J2oWybaikxIP/1ZM2ow4QZLaAVqihyHxqhF5UxZ9zrWxfp34BIPzzU9esSifrD0gXZ3mwutaCukZoijnGODJZtFOy9Rl1gyS1IbpyRbwz5O/YRl4BsD2aOk4InajT13Sa1BLPblQcrau13aeg/IzQhcUJ6n7enkrqiJFTP8N1aFAuYv8ilu0V2ymIuCLUtc4cbo7KyA+gnHhZA+DjjrhG/izOyWtQY/WtDsqvo/6ILwFk37JDjHfkchPEVcdl9qT7goG/4zTGX+lx8UTKKZJjJhLjA',
288 version: '0.2',
289 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
290 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
291 accessDate: 'Mon Jan 19 16:10:11 CET 2009',
292 currentVersion: '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b',
293 versions: {
294 '395eb58606138588dcd7e659065db48775610cc1e90cbd03368c063e02e55c8b': {
295 header: '####',
296 data: 'sgq3FGcsnlbhTLetMa3TQQE6uFZv/JL6Awha1066IimKoAtQGbAr6E1+mxRmvJle91sL7oRfi6suvDanYHfAI+rrG6qCOtESn70ssS+aGFyO3XwFgypzG/Qa34bjxJ16Aqd93H8IdhzdtOxs2Qmou3CjyxbT7Cq+YW/fAo1WfctL4yE4GBNPWC5lfebxSmINlBY+zTjhv9Pf2aK6vL4p3obHl+zhz0YdKAMBwbDyCLa9tYvhGBnq/W6lFUsyZCPVJJP3bQCQww0TNCcLJLm+SYVSiC0NwCQJq+yNqDkWTvv41p5EDB06eOQ2VqC7l4i/JLE/ql9h9Z++gck74/Qs3ppdVdG7sTzWyPya4v3RW2OTc1awFRZipAX5Zd7I97dyw6Yym4y+/9UT8z8iMDYykQ4+QnOhksDIE9a8q6agDF/rbZ/BCRcMWbFylGTdudk26mu0GdPiuLDu',
297 version: '0.2',
298 creationDate: 'Wed Mar 14 16:01:24 CET 2007',
299 updateDate: 'Wed Mar 14 16:01:24 CET 2007',
300 accessDate: 'Mon Jan 19 16:10:11 CET 2009'
301 }
302 }
303 },
304 '5cdac63b317f3942da38f3a3de3b7f0e5d6678200951c6216230295550f63fb4': {
305 data: 'Xs+z3VzIqsWa7dGBqepwq75lTsx3yemNhTdRYYDDc3Kzpycyp961SgnKXHjE51266mfmj85ASFi/FKCOwk17lbD5UT3iawtc3TdgrQ18vBhBsmOA2F4JAa4yC58bTaXbyld3c4izDp7i9+iyRaFN52NWJznN82SXuRtPdWRtAxXB1V5Tyg==',
306 version: '0.3',
307 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
308 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
309 accessDate: 'Mon Jan 19 16:10:21 CET 2009',
310 currentVersion: '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d',
311 versions: {
312 '00b3a4cd7400cfc1e7f7b369bdc3dcdaa50d6020233e131b30d755c89249ea9d': {
313 header: '####',
314 data: 'uGAV9pZTjrTwBy24TX/OUQwGmgzTnXv1JBIxdGkeoLCUhP9tAjbpUVylrUI5+VRrFYkXYyZ0o2HEgKrun2f3PODTxlmAbfkUldOV5tyV/EUxN0vYSBtgsMpqQm3bOKRIAo/uzrhSE3iwMjvKOTH2jUrkmX6hmqhXWZfa4X231GovrnOjek8c7t+LUBmmIjXEr2GSc/UbBoFnni+Q7ZArwtU68xoeCjLame1e8Y9wvCO8gIfAzXQAHsDgzn1MVeiWIqiCBTs8YKCO1yaxZpkzXV0yWzX+bHyXlKWwAk7Fu9w0CuaRULZmRCQhv+MMDw8DEXciTm0R5dRiVmSCFBy8cL9qlSeSX0GlnKl8E4/TSqvhMJblwJJsgmGSZ9cEt2u0E08tHxKuoeaaT1rpAOoiqx+z7BdhqjWOQZOGM4gR3EwqvOQoNYFUaXjAdmiUzW+e+TgE1IBQ8udRFl/D2zCcqFO90Hgc7hHsTDI3aGYvi6bHADu8hFpmZtJAjOMv1JgCX4Hm4n+SsbHd0DIfkEUMeGlVO47lcGWBZNRRm7xl8luZ4sZn',
315 version: '0.3',
316 creationDate: 'Mon Jan 05 17:45:25 CET 2009',
317 updateDate: 'Mon Jan 05 17:45:25 CET 2009',
318 accessDate: 'Mon Jan 19 16:10:21 CET 2009'
319 }
320 }
321 },
322 '6026370f3db3860d2c46a08e389a7e906dc14f98c8444b21be9a7e9f405a2728': {
323 data: '3oUg1TD+Lu4ou06j/MddOTXDqRM+qSKD+6Iuzia1Hop1w7v/BXidqeoKJZQI2VY9oO9B70Nr3B3wDROF+ycy6Rq+FM/xqUGHKXn1lAaSc6Wgj6TLQ6eRF6YZKSPqTj7TDWyw/2pEWk4HjcT8drTrCaC02tzAXMhYWlYPQPW4fUdq4hawoHIdopUN3vafQuFjY47OhqXKav3bNao=',
324 version: '0.2',
325 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
326 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
327 accessDate: 'Mon Jan 19 16:09:33 CET 2009',
328 currentVersion: 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc',
329 versions: {
330 'bf8d46022179715d9d27e0a256b56b50828a771c3c6b46fe36fb2982dcb3b4cc': {
331 header: '####',
332 data: 'fehYRMkg/wFj2t/aWu7szbXwrCyCDpjQN4UNck4/OiDlth70a2ve6ow5lAi2jgdlV9WiFrPejfa8dD0Z1g19jx+BBsuUYnBEKD0K+NapdJBBeI0We2nj9nYIij2dfZVx7cuvhy8sN6+DdylUQLsFHbga+Gi5hWcMuULT4GOAIy2WanSQL1RSR4ruA6zm/t+VVboEkkm7PPT+w3LuRl3wRaD4a8ZwYiSV/SzgWooFrh2S3YOUeshdaGCiYpTbXscsOxsCxc11i6wQGBqYSjksmtZDvEegdQdzCmxvq4jaVWJElYYS3av612nD5K/w7Zei6RccBiODBPATjrIczYg7HwmQxIM/6QI9/LQn0LP0yqRVUUtfzaODf0uWNpFzml9l/1lwXuBJyQFBp7H7Th46ekw9yEuPD00oZ+eXvKwbwfUU0JshT4hnEBtIjM8fH974PU0y95f0yLAJ1+M6DVXCxGsBix2aKJx9fuZP4KGpaXg6qCb/6327rph7MGomcrGPIiDjYwD/NTMdGluc55OZfGXtOZUaJCUM6nihqDwU7Ly1ZzYorgcvkX/t/0RNcOkFzGYNByp7mdcotyiHqCDKspqz9mEXAd7Noz3HO5GFpPqbRo7htDigGU1f7dvgbbfRoTz17Bt9Mw==',
333 version: '0.2',
334 creationDate: 'Tue Apr 17 16:36:08 CEST 2007',
335 updateDate: 'Tue Apr 17 16:36:08 CEST 2007',
336 accessDate: 'Mon Jan 19 16:09:33 CET 2009'
337 }
338 }
339 },
340 '6c25be8e145efb26a1abd59590522f73fb2e3dbc139af2217074d9e2ba92c16a': {
341 data: 'b2mcYUi59l434kGl7ij6dBu3063UL1dToMIu3Zsa9RV9RzeLKnezJhLKunqoAm7KwiJeqDo/REexHI1cshGYtHasVXXuyJfMx1grH7yhoWnkSRF4Sax6w5E5wnGkEpGJHOxXJ9rOjWHZ7yqCUUCB/dqLw4FwPOtRb/ynkBEYztEJA6EKGJuz0vrrTOsT8HMXtj/w6MEZ7qI3fPs=',
342 version: '0.2',
343 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
344 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
345 accessDate: 'Mon Jan 19 16:10:08 CET 2009',
346 currentVersion: '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3',
347 versions: {
348 '2f60193c0fc0e3f2f178955e1c68759675acdf691bcb918cfad329a5a97cfaf3': {
349 header: '####',
350 data: 'pZEWSdYIkrX8/r6OYmO0GEuKG9baUgn40Bmw7hXZBd/kfWuRjWsL4/pc5F5Ojrx+N0dxmQn5ZqKAzOOri29Rm4ruxnCbyK+oDsCDyMSnWy/VJcvystnDKzKmBRQVAOSEJtzEb3OtGzvqm0PQ1Dhx1YUAx7L6KlXysmG9h9+MjOcErRL9/1x1LZ33ytR+zK4LvTAb7gN5/9QgwysFyCkNP8bG4nyCzPMiUrBnP0odMTUvDkJDlY0Oia6VjGW6oNxnGIgA5fDraRrW4JH2oejQcrL7+X+jpCp05g==',
351 version: '0.2',
352 creationDate: 'Mon Apr 02 19:12:44 CEST 2007',
353 updateDate: 'Mon Apr 02 19:12:44 CEST 2007',
354 accessDate: 'Mon Jan 19 16:10:08 CET 2009'
355 }
356 }
357 },
358 '6d45c2fec275b7482d41c76b20507100cfb6ab49922b876f9dd3040d361f4a18': {
359 data: 'jzjPgxRHApIJA/6hiY4XCtb5+eKzHlOeoiGwfVDvip95zU7ThHbdmxOUomeyCOZ3S1SGPT4lHvqZgfVG5m5RvH3JaAIa8EY1ZElRohoX3rETVPJzI/Ov5Rp3lZjtWlu5meNrcJz811HBHrtBuJxAmSjYcY3CCal+oC2zcK2fLZR/iOQ+69ONVFhdV9KiOqzNf8IisIa1sIgFopqsdHXiZ9oLe0a7Y56q+OplyU3A+TmxKLI+Qq+WkjvdMzZDDqzYH47me5niugYPdkQwN6WQUE0sK9QPs0uU4TOwqCwN9nPH/DoQ6oXWAu2+R4iCyt6ZjLNkClbps4s8Cwz6wfFQ+4T8bcldjveJenmrYwiUzxSd/4xa34yFVXVw2OD0n8yZhtvNFvfoPy+X9z+Y4f5HlM0qzL9zYya4KwWjFQzhOxFjni9JyGM2PJ1BctB+q1J+CHuhlVjUF0Y5zIS3zFTET8jjDGBZDWB+Ao9E8fUD+0OJJUdKJ4kUfn4ZUZUG20eLBjmJqWBGYZX7UFaPv8ksahoK26Ol6FnBE4KpPStQeDgXZDzGsiLlEsxHJLUFkNtAUXozw38bWWQvi2VIFtkw/ZViPIenmSNT14kUVWdrlKQC8x0+wECeh5ffv0i8UUw3v8QC2ZE7GV0OMl4ySlRCuDCfZ53YFoB3HIR1hSZMhHlHJDPUz8JOuXdHcUQaJeNrfWoC2KkKb0ZecBj9iXooDh9yGi0g7TS7eyhlz1LHpzEWB0CPsZqhNGMxmfFWur7v2hrYzoHQOeB19ZSmWzfUwd4dRpqMp0x1lZaF97jr+yyYhnuQvuO6lru15Pg6FqjzhsNiLtaqtyoaMiHZ9veZs04qZZ9Fn3U7HeJzjZSAssdLnvopXi363cXm9JqoClyV2OemnVoRwOZN2gdSZxGeOefKR7U+lrBAbJwViMnmT0Nd7AC8C1k34iEt8HJmpztXeOgX5CQpwUPENMCUPsookFbIh7e4aByllEQy0gBbxUz8JMIWYyw98hdASnZ4s8bQfSmiMM8Iw3YxCexKB62LYYJn1UY51NSnwCtwRep+NhaKDk2d6SLh9owxnFbjhw22RriPd5f1InJycjtpvMzWLavl/hDsjjj1kWpnCUBTM46LbERmjz+s4x7fSf2FhhguBT36elz69ivXoiXI+7p0E8f8HsSwm8sgN/AA5m1svsXsdWeZFUiWtAwLg0tI8YNHlazbvFCXfIC6Uhq9eDv04iqdZ3rn2c1rwSx336A7ySTBFdxOCJ46F7ShIhNKm2N+5Qf0K5B2L882fbwqiLsa64+X9aKvufKTsd11vyf19Zivg/Ze0FWoGC8D63Nh91k6Hu32RT+uAtJIjQIZxu9yXJM9lMaRA8ieER+ghrLHaGQqF9J3WmueER3UzU1midvTynOV6g==',
360 version: '0.2',
361 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
362 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
363 accessDate: 'Mon Jan 19 16:10:15 CET 2009',
364 currentVersion: 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5',
365 versions: {
366 'e85f085a8ed42d2def7adc796b66a2e0a4c3c88d9f3e785eb12a6f5619d945c5': {
367 header: '####',
368 data: 'BbXNAy0GcKKyDPiwhP1Jk9mIi3uXMHQdhuxpDvoR2C3YITOUBpurxGhhvmCg+a9pS+fKJdZPxL2mPbJj6GfWTEsm7K/ECEjrVkSTHi6PTUUgYVbCumq9EHjUspos+7VrifZry3c73+qAvIKamvUlNB86TchMpOXVJIyx8UgRX+bdhrxk9ZCEVOiLCG1zGPX8IzmcxPmBRZFlHYqE4ibhl/CLEzWXZBYCofTusClhOh7YM/jBgvDt64W7aIN2y2KiKwmFySkFZdnOvbAb34tXVimwqjqWPvPwd6MujQeX1bmaDD7Y0kXac8CJxqasIezLo2WqzLUbEXdIHGilkaPT2ZKpKhKkpHJHFrV2lVuQJVqwPUr0Gf9qMKgVnsyU8kUfq9ox+fhH70+v7BQSjT7bxxDLs0UesQeL7G4SqvNet5hPI4GQEpOY8p5MUFReIBTRm72NQEU=',
369 version: '0.2',
370 creationDate: 'Wed Mar 14 19:09:05 CET 2007',
371 updateDate: 'Wed Mar 14 19:09:05 CET 2007',
372 accessDate: 'Mon Jan 19 16:10:15 CET 2009'
373 }
374 }
375 },
376 '7bb69b6366a8012f181c01e368ba18d4f7a82bcabb4959189736ad124c4bbfbb': {
377 data: 'wYPZIt0UHiNVefNwtGc7z7Lu3YoQrXdfKmWqilZp8yeIrNfSLB9p60DLMrL3GDq/CsvDYkGAZgj1C/6NVnzVsXsJKq7NDZn1UPOGt+hCnw3lEVbD7zHkoMM4VgFDn1sZdjLe8wdpIFfdlQESTipT3GVXv3swG2qX2O2yuwtlopR8yZQTLg==',
378 version: '0.3',
379 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
380 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
381 accessDate: 'Mon Jan 19 16:10:18 CET 2009',
382 currentVersion: '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b',
383 versions: {
384 '23f5fb503e54c0cafe3d4944ddaf40bc74fab8b5d96e2bbddf693b1afb225e5b': {
385 header: '####',
386 data: 'IpYj+7t3DhSVD8r9PkLbF5xpGrHhg8omY014P1vkT2KkGDEUj+ekQAbQ1g66Z7oNhRDpjS1/dcDjzH0IIQLjGuQ0oRfL0xZefVTx3N88ZLE39m3cJz10K2xyg3xp06jFBmdNJuCkgRhMzeUXeEJujw4lS2kv7cO04Uh2Maui6jDR7E498rgePY3L32vG1S66li/xU1vPjNn06aFTqSYxUL17/mlJNbgp3XWjGC+l0dXLLfXy1wOm+/I3zp2caTs+a2zDUZ15s+3XeaAWpBH7QCaQsvsQmoBqPbMvkjOQwW3taDvV7Hvkh+qTjCEcLjRFwhZkMNn3N2ewcLWQa2aVIjxt6Z0F4s/1URztWlKVzCfto8RmrLajYRn3ggG12kX2xDJFjNPNfs/7A3tMn+FqXQCCNG5GI06JZ32aQfpnjtmXScUuEs8UeFgsNeYclQhcm5R0sUwISK+D345B8859w+4+9OTY38NgYQQ9o/tmpCjWj1tLYLx/m/GcR2em7iyDpBdcnWUb+tK6Ah89qvXriHwPLSNzhOH2wxmi7nXTRQWMv7g2',
387 version: '0.3',
388 creationDate: 'Mon Jan 05 17:44:30 CET 2009',
389 updateDate: 'Mon Jan 05 17:44:30 CET 2009',
390 accessDate: 'Mon Jan 19 16:10:18 CET 2009'
391 }
392 }
393 },
394 '8b18e8593b5bc2f7ea39a5fab222047034ef2f380fee05be0fa6e1c0972fea39': {
395 data: 'pOMTY3PnUAbwMLDEYNJCMzp4iIA42YWr6gqoomg+P40e7LFUtbt/RQRelQwNIztyUSVLl0rilkZZkBUVvxrtTqvibKITCjJQGQIzvcb+Yl4mNosl2Rpp0xxMU03f1+G7eGbuCc5hJXYVAglhEYplaAPzHbRWXMY8iZXZPBuLVf5PN+rdpgAfkGeZ7Uf9RsQ9p/EglrWXYnTwXi3saUfzIjfvSHm5C+dXTY3FHpIc1YkjFrdVgMkhYQGV60JtZcwFtCEL2NpVljAbRgHoIXTOkzUvep4vxrtfBBWWMuAWEI06432gtnH6IQbrR6jOpwuMt7k/09qy/fARPHs3r4qTJ9r2uqWHJ7tjJw+IChQPC+3l5HcPpFURiw8LGAN1NyY1hUrF6N84RSn7AKS0bLa5qN++5lcjjxn/k8+JqmeUqN1/SYIbGwNnJeZ0vA8yvOxnD20iVADX5kOVqJDwXRPLaF6Oz9KkbOrmANCh+PmGw1i6PduB+FgAU4HViYCw5IGOUZ30Pm1NJofqfbhXvgzn7ey2+kUIAwDyOUpJ9fW+9jW/JU4rcawmzwBYN2V8apOoyc3wQJICm2984wIfVBpygCOZM0QDyVgNo57qKtYH3yMDQSkKvpEUmuhklMYhcV+4X5ggdqx7lYXO9IMDnFf2ZDiZyieTlOlRv/nNVecUB177Xpnq2e+X/ik2rCQWVrIymiV6ltr1DEv0krXKfvXGG/FMZHUmo3m+B5bG4xVhmt0GnHseqvY2Vrl9NksLgq3hTDOGSGIy5Nv8kfrd8B4/6Tavh0SumiyXnrTXyYXzCK9E7IqO/0KAln63VkcHsbOtS8mj1drN0YQ2KKaeIW+Yr3Gm0pbcODsgA6aFfz1itZVeovBqUklhXS+/Es8J8xOSvvSyD/TmlFjuErHa+wwNQvftosfwk9ZTt0eIJS5aLHdU2QsCjdfSy0DEPkk2siGhBX5ZhRzqyIAyXApSmy+e7PIqn/dDR51+D1ZHwoTQyTrd+F08jBWZgU/OvS8MRxNZSxQwsi7bcWZG+w0utrIDB8eSOMVBXI5XBeJb4h5Bzut18C1shGHeGkSJp04=',
396 version: '0.2',
397 creationDate: 'Tue May 01 01:10:17 CEST 2007',
398 updateDate: 'Tue May 01 01:13:27 CEST 2007',
399 accessDate: 'Mon Jan 19 16:10:02 CET 2009',
400 currentVersion: 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8',
401 versions: {
402 '8a032b53f7356e2d8b28665211abbe2cf1c79fd8eee4752e83cebdced1c19911': {
403 header: '####',
404 data: 'OXpNHHSkdsaD91hw2LER+9XKpf8+bh/O+OcLSgG/gAx228UpifOCD4HTAOs0C7IJ5zhAq1L9NjCGb1QWWTFErYEtDEBRBV4kogscP9HWPxYyZHxjwPI0wE7Ri2eD4Rma76Utb+xVnXWuT+vNb8eRUCK8Ur1rlhYafS0uzAYvVqHDNfZaICksxeVQojil/kSPZDMu8ASz5pMNFNCF4SlwDKPRrJJDbNZ62A3px59YJtsla91DGVyOLhb7VNRxEwnXyxENfP78yA6OjvQDc2KhKFUpHbZws54IolLK1I1mY/Z8BiDXPSnOa694Q1eZxy1Kx/jLINZUIPgGg1++YWITx213awOISdf7Oy0/dUpu10Vr1hgAqCVlDp0IuGK01CswRzEdLVpUk1DaGHuin1rryZx9vThUkEJgQQc3ivr8',
405 version: '0.2',
406 creationDate: 'Tue May 01 01:10:17 CEST 2007',
407 updateDate: 'Tue May 01 01:10:17 CEST 2007',
408 accessDate: 'Tue May 01 01:10:17 CEST 2007'
409 },
410 'd175358ea0b9d32c23e4bceff2020eae9a8459466abc18d4399d988e733fc0f8': {
411 header: '####',
412 data: 'tvSUu+NPKHkwt/ZLXdLGdDm4jSxTEtJfsecdpjJ9UGN3Y2EBCmijU5i7q+hMfNDqBJ4/m5Ayju4zYDAKGp2pt8l1TFoDurITdFcV12jL8j3dc4TTD//uC6OtowRN+altgC1Xc0LsSvEPabjAlwfVC5xqirfm5t2mVmnFZ/GALkGLGxRJRduylT6goPwfunkVGwUdqMa3md+9mwYn2gm7CyC0lpcKX8AZ3B4Oa656yRa9m3Wjgb007TtorLIpZO2MzVwxcHBqqy7YpN+zpmZz6Md9VK3L4F724tuXXWnDeVzGxBO7aZVr62hwPMXM6ibCjUScsaS4f0chivA/tBJoyx7OqKhBxREGeGjpHTeLxyHcekbwXhXyeqxBuwG93yGKutUhGLVYcXwe8/+xSeaBGj/j2RWutKbNKG2yQyNPGj2cxJWsR4YfOQJTSOSWT3K6Mmf+r6hLhIo=',
413 version: '0.2',
414 creationDate: 'Tue May 01 01:13:27 CEST 2007',
415 updateDate: 'Tue May 01 01:13:27 CEST 2007',
416 accessDate: 'Mon Jan 19 16:10:02 CET 2009'
417 }
418 }
419 },
420 '9dcd2a8a0fcb7e57d234dc4fea347f020a6a01793e40cf56a0d22379e590e291': {
421 data: 'xXZUJjgxn62OqnzAvScHJNo4WjYEFp1vQ4ueBe1sk8dH4pXZUKV6m9c1d2cLUgBj4rUNP5cC66GiFHV7G5BDZGLrfrxUlYU6BWvzAz4eG463pRDhHXQgPrhlIGDlK6ovaIsjwaifvHaEfLREoXvLFluqu406KG58guhtWdIFK0rLypyRo8uyltGbTz8wZdu8atY/JYQnb8NaAf4=',
422 version: '0.2',
423 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
424 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
425 accessDate: 'Mon Jan 19 16:10:01 CET 2009',
426 currentVersion: '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7',
427 versions: {
428 '5da9ecc65677d03f4f31c0f12f000caa4930394a99af8187c05e74b99c851aa7': {
429 header: '####',
430 data: '7wg/yWfSasUjJKV/5ygFfteazVSdqEJ8xGAqtS7m/W2q3rOR+2fr99Il2TzxXCnOe5zV+iir2tOqPQt6BCGbVf0NVwZtvfO/lvfMc7DIwyWuhZ0sS44LBTD9VY9fruuIegktVHSNBoJTCIfAHN/ut1iB80+51An+TdpYT3SGAVM4RdenQ9IdvDOnQo2KE0E7BzHekga800VJrbqI8aJEtmm5mOjte2xHYSPFDCtwURQclwxbNv32hAY/IUkaejqg93WGIzHIIK0+SSDzQwHYQo4yzVGCKKy75eghpvGyg1zbzlv372bND+OuA3laocARFfe4rRd5I5nh8vmSJ+vybh3EIJJzloD+qWk6hsEagkYI0RYu9I2uOfA8drmZ02GV5/ySDsBHX7uhaTPGx4J22rNJoj8s1L7UoaohUHFvUerBvQTir2LPbzqT+B07wZOU0ibtHlaN5C2XMKRxfvGATeR+2J3l7WisCIoRdpQcPFHA7nlTTShBiCVstLxolvd7MMzPOilsi3ecxXLQSeWara4JILqXQCJ4yLbQCMnSpIrZ3TXbwbPZ8fjKjogHNUaBPnmd1hWoc7IVvK9RSFBEdCh9U/hbyPMCiSjdsUCTclmhFmhiVIlB73IyWixmLwHSWSl/ckMxcUK6rB0IPuWcT8iJkxfqOziFhMvC/cNydpN5Nj4WX21c/1M7lVlX10FRx6NIYH5szEXULmLnkfEwr35G9mKJwR2pgZ272UiW2cH64/+M+Kh7XnPbQKxTwVR3FOhR/qdSHeA8MTc9FDslFaTT6YSeJEPoQiLg4c4UdbB7w5nA0o4qg82hiiJbTfT2zFHZeeWOpVO1z4V8SidJrQkh8aL1/Is7KaDVNfL+Lx73gfO6tdSviCJJhD29iTgn+MW4MlGwpeLKpvq+LkXNXi/CVjIa1VqtR/Flk2BqwT2hccgw6E1ML+QdW1n3TvTtdLIvSGheOM5kLdnF76e8Nj0kHDFbnxQMlO7lutngaNBRAvhvSLccT76TMG4OTxNZk5aOre6AIOuUfrFD3KDeOqWie5zpkvTOd/JK/JDFYgbYQh8AqhwJ7VWUH49vfd6AqfwHwdNWymI05F6/0Co4xoQ6qN+iYNConUXz78Uo7AraJuBDQ3a24+wL2mLjnc8jUDFUaAKM6gZUv9+bx1vk6zVdaZcuqgZc6dcyo5Oy8lmbJ/SmRb8BF/Q2nW3SDv77R+p0bKPLmjcytczlMNct58Q1LoiLnGck5v0wByQ0XIMd',
431 version: '0.2',
432 creationDate: 'Wed Mar 21 16:29:06 CET 2007',
433 updateDate: 'Wed Mar 21 16:29:06 CET 2007',
434 accessDate: 'Mon Jan 19 16:10:01 CET 2009'
435 }
436 }
437 },
438 'c0ce9130ca365bb02418d4305ea1d29e49c3f0e96d44b9d3cb6b4b6843d25065': {
439 data: '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',
440 version: '0.3',
441 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
442 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
443 accessDate: 'Thu Feb 12 12:54:37 CET 2009',
444 currentVersion: '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a',
445 versions: {
446 '36a2e190796c4c8bf2340fe6d7f1d032b4ca40eaf42b9ba537e1dd06a638b26a': {
447 header: '####',
448 data: '/mnLRePyLGwPaZ+EkbTRHdE4jz4gY99jnHcIp7AeMfcktEpPmUVNWLwGSJUH3ANP/cO1znxACVQPzC+g8IVIK0muJ/lZ4Iw+HkpsfPtBjPZc+bfhsY5Mud00YBsImleIMlbbJGv3l79eSPcea49OwG30xro6b6I0KK3BmSgr+BG2AmBrKVlFRTPFCHRbO+hG/LgW/xqYgwd9f1dnbeVYCm5lA2zdAnwmMwlUIi/J73MbnsSO0Qg858iF1SPQ2Ne9Q8SCyKKEZwBY/YeSgDzoO76Wvqbzk8uPdmZldaF4zql3ffBeb9ZS9KIyyk2vJcLk7c3DUc65vaT+w25+2GSpEXD4YIV6VSr6Brz4w4gzcDMeLve0U6oruqWijz3CDe40yhd4mMt6wTVs4xo0KHc6yKjTuC1ZUQwZvuCiS8T5czaGpc0+fLyfuE+pVBxTlpOjkoZqzk6NsH5lcKMzB1TCscJ8fbOdtJso7DRUvijIE5+ayY9IktZhMeHsk2zurKV95A==',
449 version: '0.3',
450 creationDate: 'Thu Feb 12 12:54:37 CET 2009',
451 updateDate: 'Thu Feb 12 12:54:37 CET 2009',
452 accessDate: 'Thu Feb 12 12:54:37 CET 2009'
453 },
454 '4ebfe3bec6d419d61eb68a1f25407824e404e3439c23fccde1ac19225b40cb06': {
455 header: '####',
456 data: '6VvjRN9LKi7tt/HsgqmU0bUdZQNVjVAYNLdCrfKdRJCx3W/GZHHR/AQF0FcvuXIn0MWMUypHpTZW86V459OEoV4W18HXEisQKEiqBnUCBaxBd1NKZDpYsThISXXOhZSbXylbLoB+kBaYzT+Fc7utDheVvVPeMo+iEb3ih42B3En3ZXcgUAdEjfbRUm6st9Jiaz4onwXWknVhkF5QewA0GXDhT2JdakFxfUDay75wKvspq5IszbEYwsu+TEgsbuO4/R/bktgsQUrbhtKIEIiNSccDNx1JkUKvIxrRfp1m0Ar3XJsDfv7YSJSLdyVheOEdIpBkeZ40LN83uzGRMZw1bQsKf+XOFTfacYZBBzwVj8e1rJC6AWlH6Fbn0jXw3JcEljA4zUh5IrYhWtyIZW338UVsMSIp91USeM4uCvPsOLAdyCXiWu5H8MMYGz1rJxVlTbMiq0tn1w1f+CL14v8EiUft7l8kfZzBZzdLvzdedD/wHQ==',
457 version: '0.3',
458 creationDate: 'Thu Feb 12 12:45:43 CET 2009',
459 updateDate: 'Thu Feb 12 12:45:43 CET 2009',
460 accessDate: 'Thu Feb 12 12:45:43 CET 2009'
461 },
462 '7ef137cf242e00136e57ddd262edfe6b418b6f57f3b5e5e15f3ec1232867f6c8': {
463 header: '####',
464 data: 'N5eWFfsQGHR1WytyXuVySzJ3zenJEB6IaKr2vgWRHTlJFzexXzJmSLoozTP9Z4TumDOLsNrp+EUeIa3Yo+RqSyQKQRFDHXlUYa6c9PPLPXdexSA9JO3AHzMSpL6K0E4gN3BybjL2rbcQwUqJLvCKy44OdiJvORGfIIpTPx2LQ1o4P+chcpOwwe/ZhgLWmNC6FmkTvsU/xJlNuApyD7tPX7Cj3lP8WBfYEPr68BqTKAa9cxai6ZF4BRC//rFob/4pQNHE+7qjOSY9HOnV5uCtZehPYBwfpBiDYhaxWJxXN6sxtpe7GC5CM7gAAHs5lgVaFSWffOAL3zeX7I4vh3j1nYdXoh5KowZJVVUUfhwqJo2T3YDVsaXNibZIaPd9GlbeBBk2HL6c/ao6B8QNwRU7GvMHAdJKta2I9mtU2NCnr0Uwi4rZRR05V4k0HIMLEJxRo/IYAysAYETNIAXzk0twIokOF5JPjP4uTXRZ8LdiS6JqfoUu3Jv/7yq8wrKZM7DaQA==',
465 version: '0.3',
466 creationDate: 'Thu Feb 12 12:47:39 CET 2009',
467 updateDate: 'Thu Feb 12 12:47:39 CET 2009',
468 accessDate: 'Thu Feb 12 12:47:39 CET 2009'
469 }
470 }
471 },
472 'ca01bcb7691f70818feed46c9a2a91883ac543997a395535aedbb49de166690c': {
473 data: 'zbQlGR1fT8HoH6KvOPBoaIjMUsVMh8MSNIzPO2muIMJDVfXB2rEcPnIFl8fNv9BtE9OLecuex3BQVJKGXdVGFYVNiSS0SgPoEpyD6GJntEIOaB7GnhVflTm8fT7Ba8ArS4r+fIL32Jx9F8sYrL6jKPWeuImGHK+x3X32uORI6znkRac7J727TiTPlbj03X/Fj3Of6Bp9Wa4xbVMwzi+R6NRKD4A6Za3mqhoSpYFeHWld8+ChJU/w2wFkj292OjPBzvvz/SR2Zth+AXTChreQ3Zl1hWNGmU2Ep8ijFCYwcamgPkQwh4vBk9NJlzIgadORcb/0EPDxn638VNA0dbpW8MZUCIMWVe3A8VgdllWxei7dDy1ri6xsKlFovLYjRRPXgAqRSqVATqwyXqhBWhoV6VZ5NaSUGvM8okC2GQSweLuz29py0F987MISmLjav4gdvcMA1wn7FOIaFTNg7oy2CxZefGhHT3sHfX/PIvs/ovfj+7TewI0k+HR414az2D5reo7S5I4+roCm1QLVpPNcXUxbAmEbjF8JCsTtECZ4kdpG39dN6BaMlHoHSN3wu05uTSn+sL7g3Cg0pVLlnHo9baw3fUnVJp3MCEgZJELaiI/WF1Om2y2S9UeLur18z5T7hHFv3Px28D7c22HEDdF2CObeh2uOlZGAa06lp7YlYeoNtb4CqLlZAMK0xIHfNUceC4OMNvqyGswd5WJsYQEnMry20OkxY6YinnQfjAml54B6WlvNVlg/YaKjw5AVinUHjzEFfQbcBFnFGpqg5qJk9hZmb1VI6Ujhq73fPydSfkvfScTImqxCNPD/BR8ovoaJtNpE2gmcoX9A5zhZgu5xUnUnXoaQu0l7K9kWof/UmCCl0O1A6j41aebWr+aoFMalaOPzNJ02vfLuW155IwjFQvRuAp6EuktZ2dFKyFl3QnLbwsMnitReXMoW30cqTYg7ODQnopE73RIb41Nj07qdx6FQMzw4gAIEFBe1iRvlMHQazZCb2ndVvgtK3ZcPNtDoahuPRxMLaKZlRnpa8E5F4o8NHYNivshawZi36Hk6w0dOimCiuk/zvJ1mtx8hhX7B5dsXlNcKxLSvI1onEm2x9HL318xJeT0y29alzPYVFuQs5kq1+UV3h2hL4E/H8h+5mWtTLf/MjaTZ09okW/etuHFFjCmLoKwugk70z2yLWEJGmbjw',
474 version: '0.2',
475 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
476 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
477 accessDate: 'Mon Jan 19 16:10:12 CET 2009',
478 currentVersion: '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926',
479 versions: {
480 '3895963f82854530ff754c8e2d1eaef8d884a8cba7cd058b8b7adcdc12be3da8': {
481 header: '####',
482 data: 'rXmjQYZgxv9jpFus3T/qa9Qc1lxt+mDF+dmZeDmDG3IiE/LnonGt2MqL+YlbFzisF99Uv0IQGOZCPigtBwOXB9m6R6R3lEy/YhD/C6b10s80OBj3yr3PoTsoTmbnmZMYd4r+qx8SaoLLkR0aK6NADYZXebR5QgVtwF/a01EifI6YxH1wm1RX3kyRhIrMzOtL8zHbstPvW4sRtv2YpZqlZqBTdoiqztDUZTKEcCcU5QLnHYMNAVpDHE7D9WvQy8Il1taAbxg97Ir+2ktZLjqfJdKhU7ZLv8fcJiRgnQKPqDWcqpjA+CXM6Ak1HCf9SRJh6Hl64+fk3jEVAPmHvry/xq2RPCG2YnVNWZ+uL3QNuH4zt+IbP4FnrxkCAprmEiNwvuEefMgliGRd+FowIaiFWXcEtYxxQvRDujZN6eoTUU0KVnuy85PKi3ih0ZECoDM88MFhztwCG9/nJQ==',
483 version: '0.2',
484 creationDate: 'Wed Mar 14 15:51:17 CET 2007',
485 updateDate: 'Wed Mar 14 15:51:17 CET 2007',
486 accessDate: 'Wed Apr 25 10:37:27 CEST 2007'
487 },
488 '5311936f6a95cf123007ef867388adb5c1ec5b2cf1173d66e501daa16488e42e': {
489 header: '####',
490 data: '+VirbcZ59SiN9UJKrQkjQx0Z4avHIhvw12Hq7fs+Qnoz4RgCS17fqzYyJe+jYorjlMPjzUcALYOTobqJJp4Sp8v5nOilHW64Gny2XRp59PQPg0zE4TP22l1PzK04+qJusR5NLPU39hYbW+InkDapdIhdf+nIruqeA311bRLg90A8xmpzio6PkZxXmhZMabbEVfXsYFBQKVBFloTMusBG2eaxTjeK0hOAk0uEc9RGOEwCOvZvjRFCP8DyZ5T6QV1pYYgBFBwSFrB/koXmBmObj8zscJXQ4H4UWC0yw1B3ABbhNX7vC9q+vgZTxnGqI6GvzLcrzaXKTEyfa9twq+vKFX1hqDmM0UVLw0dPOy0/3tabJjFrYbz5EEKVin9UqWhuy5YIvHEJlMkH190Zo+lPMuHvD8TiAU1M/n1bTQSBQb/8STD6uqefbKS/s/bXcS+bdVKBmSgCuutBznYO',
491 version: '0.2',
492 creationDate: 'Wed Apr 25 10:39:26 CEST 2007',
493 updateDate: 'Wed Apr 25 10:39:26 CEST 2007',
494 accessDate: 'Wed Apr 25 10:39:26 CEST 2007'
495 },
496 '55ab21a3c8f10df776aaaf923f439b7080d9fcc71b192a51cd0f1e17139a1926': {
497 header: '####',
498 data: 'P1LfM+8PA/kyelFsojabLfBW9D0Aey5qDClz0OTdSamMT2Mv1U35eKcr6ilUrbtW+dKJotAzs3B1dYGzaEQ1j9HnhiL2pk4wgT1JWGe5c9frmFX/3YGO63c2ngnaC/Rrv3LC251cLVS1aoWNPskWkjZLzF7EiWbAeNYTplSa6MWm2LdHAm6xq2dcgYx53RJVvjnsCzpghQdzL96G8ScJjnUx8FC8mHW4Ds0rkHTeoM344Ao8J3o1XwoFqFFJ2X8+lSkj8LVVdjff1EHIicjrMM0oJG8VyxK2TxMvg4mnLWP4ALfh24Wrb9XmrM0NjhQXBo07tL9dwa7sHHKiBrM74644vBR7NB0+Laedg8D+6FmgNoR6icB+qvxCIIvAhOpJ0er9f0CGDDS06knx/lDtVVNewzxx4ATuG0HQn8M61eU83EfbKWG4Mg+9jtRcW0/bdFW/FQr/OeKg',
499 version: '0.2',
500 creationDate: 'Wed Apr 25 11:14:05 CEST 2007',
501 updateDate: 'Wed Apr 25 11:14:05 CEST 2007',
502 accessDate: 'Mon Jan 19 16:10:12 CET 2009'
503 },
504 '5c622bec0fb939da012beb98a858a4e16bd670b3e6fe1f7c92a247f88a65c747': {
505 header: '####',
506 data: 'XGlplDTD1xamZO04H6RiqcLd7XaPwxI3MqpKTCVHPBoMEkwE4A1izGjFKdPqHbQIuYYcT9xDgPOknlkP89jDTfcR4UfENtKHFgFaMee4orSER+MhldJRxMwPLorZmMNNZzVmTmwJS7FI9jYiXEvDbcyw41kN+SA0mxzWpc9emaX4TmZHzlBpY2zXKJLyN3otYYzcTWzuu7DJejWrB+CnNp925X9vVomBPfp/Gt4tiOFsE2ZyEf1B/7cDmMszlQgEgGJONS+C8Qyr+X3GEh5iPoYsGpMNmF7aYnZNciE/B5lP/ABVbZIi2KfmRlSf7Cc+kMkUXyHxOeZHuVv1ZlzfIe3gXlD0/yUJFHNju8ai+F3hpSkhMatf71mLQzD5oFrTmKatH+zQZhGPP9dQxG1cgZRcjbyUQJMazo+0TJuNXNndi/oiRzRJjYRUbZKsfRzIAEU=',
507 version: '0.2',
508 creationDate: 'Wed Apr 25 10:51:49 CEST 2007',
509 updateDate: 'Wed Apr 25 10:51:49 CEST 2007',
510 accessDate: 'Wed Apr 25 10:51:49 CEST 2007'
511 },
512 'bad48f8ab053804a02bec678db01baf24de35ef04a17b90e1362e67fa352e4a4': {
513 header: '####',
514 data: 'SXl3D4C5Yt81L/117xsHYjZxT/fANq09VZsMNAz3Gcn2+2gopG+1K0JFg/1Mbjt4EMbe5Or42zBlJPo5EAldAfWu4MoTkQzo/wKPzgOWlIi3A9QwZegw3yCuHvJv8iNcpjGfpY0OCzTZKNomTtwc75l+8FqgwPDW4wDkPG98275ERDR8mFSZfUAiQxlTnCbskFneUQ6hdN2gywkyJKuTEcrMkIpzwe9uqPaQg8GjUvvy162/LVaSQAVRIiTbW5URCD+hT5cKOkmFeBejHar8zR3SQQ+tIJlKERBwfE0sNR+RebSboYxWPECYPp0DMj30FnHbfYIVTgRCIlepy2hfis0+9C7dop0jK2nFREjcxSIqonF+juCrfJDt4cTlpn2SmcoMJQsUOedSh6ZoWweXm7lu8buCbA2Q6SY1L6jz7okwIikIinxGDq3qT1pWSgpntI8wvYZ8RD0umJsoAzPYH9zlfQ==',
515 version: '0.2',
516 creationDate: 'Wed Apr 25 11:01:21 CEST 2007',
517 updateDate: 'Wed Apr 25 11:01:21 CEST 2007',
518 accessDate: 'Wed Apr 25 11:01:21 CEST 2007'
519 },
520 'c03d1fcf5b6981741f5d4787315534641c61daee9aa3c063540fbb704989ded6': {
521 header: '####',
522 data: 'sbn5IDJM7VtYov3sqW9+/0USxZEw2xq8di1XVPMMZ6kN6oZZrAY7ukxXHYh+mfuIa1/uV4i4v1YCaKZQShLgUS4cchlK4nnNVL8zejGwB+PaY0E8Um/Jg6E4UAFAZ+haZwzWLQS8lJ1r4hNMTeFqsDRUhC30awJRz8e0rBejLZiS2Hk/jgpH3i8Za1GwDzogw11iHXejYI7MaQGB0E9eQsYYTxGjmzcLfVYkd4AKj5pSEHvsKZklSuWIyDzwaFiIO7xqcJmS/8Wkm63JGNOW3nLR5Ao9V/2vthFHBqS2lQNRnkPWXbmNK3v7vi57zu461w1Nn1U/70EvhHRMk8BdML3XI/U6WgDARjQuVsB8FnTkzapaORG5vUd7nTtWjPdyQzOqacm2YKWpAiG6fUQTZiBusEd8jdnv8BioGUTbXgNVG23zcRbbbEdjKc1aizXHQE1LnROvoHZHkwg=',
523 version: '0.2',
524 creationDate: 'Wed Apr 25 10:59:57 CEST 2007',
525 updateDate: 'Wed Apr 25 10:59:57 CEST 2007',
526 accessDate: 'Wed Apr 25 10:59:57 CEST 2007'
527 },
528 'dbc283f49de6e303c06a52725b8187f344ba7b433b0158d704f094edba782710': {
529 header: '####',
530 data: 'fbNrpIoYF+gpMUjSxoOc9Y68qRlE2yk7FPPkrHTu07HHWkAWy7H7nFw4BwGiFViMkyEC2orUrMeDYhKmMYFj8DEcALk6452BtNutGZSoqDhD8xnSEPF6fP2Xyy+vZHp4JWDXZt/xHk4vPbxcwTTlmRz5aO8ChXIH5iqfRL9+Dx+gJDKgKmCRMZYMT1pyOUewmsT6QDYdGFJTRRiDmoLfCVAXhJRtqQSBcx3kN3kuf8gyOMAeJnFGISTAj7THzo7eGuQol1omTMgGbDZoL7WJNfZIDamiT9TWwzp3UmQcKIsRvA2ZKtePWRmpWyq6WydJgFXHUuUDVpwT+kc1Rn9Wq2zwm1VBw6gqKCp6W9bZO86rRMs2CtuLT+agSpqb4kz4SEYDCW0+aUsJDCYBXx5yWRM26r0XAbU6X0D+xopGuaVzsV5G7chkCO8mUsjHzZCK7hOAz6OgjR2+',
531 version: '0.2',
532 creationDate: 'Wed Apr 25 10:38:17 CEST 2007',
533 updateDate: 'Wed Apr 25 10:38:17 CEST 2007',
534 accessDate: 'Wed Apr 25 10:38:17 CEST 2007'
535 },
536 'ec525dd942f72b71b5fa1aca0a36a9960b71608bb27f32bc7923713bde021b12': {
537 header: '####',
538 data: 'AHP4MFiGukFCCnjLDGoqJUDEr6QNL+KoZlcwOqJIYusRtl5qmhZSsODHbAEpmadxLGogDPrWoH5/XLZ85ASGRF5ALzDgrFKP47/bSEzKVTDABY5BJSqvKgS/lCf2LdR7+0HWUVJ6Z3GOb9GqsXC70pMxDo/RfclOQPa+k/sXCW5u0TmLb/0i/dZEM8N++4umXsyy2WPLtUVzQZ/VdTMDwl50FeQxu3aNGy4qYd4XFk/7gxBH9skBD6/GqpNajHJrcbi/WZt7PZiN9skoVZHhm3YLmteP5hJnrcCGBFJHWuQpXfB7NR8rNmd2c6maemKYmUlX25wQF7JPcROOcyT8iYpF4Hk/eSPs0CSkaDdqSD0Nj9E4kqZrHfVGMwBbDFyAzdHTN3EyGuC4cBXdfNZbdBqwghuB1x7RLXs/pbXg1xqukjRdPLTxUogPdaQBHGo=',
539 version: '0.2',
540 creationDate: 'Wed Apr 25 10:56:58 CEST 2007',
541 updateDate: 'Wed Apr 25 10:56:58 CEST 2007',
542 accessDate: 'Wed Apr 25 10:56:58 CEST 2007'
543 },
544 'fda6581f0137dd641387a7be193b06edea4451835817bcda38d22ee24ebeb77c': {
545 header: '####',
546 data: 'QwDMobl0Kds+J8mknphumnONOIF9gH+pC/AJpxGmuy/rvKfHSeEuuWAZ/yWj8J/I4V7OjpyTs9/uCWeKs9khpdkcxtObB36IfcbWBHGOgFjvqKgwMa7eZSIUPZz9k1NsqJC9nU9U7w5EBzQKVIjJaey1EdhsggdtNOpQTzt7iu2mWKo33dJKQCQ5VEwhpGh6SH1TgKFbdMkOJJY8d5xPYUxR66LVFpFzgHP0ML5M5U53PK+apT95UIAlqf7N32BjPK63Nsj1WPsnuuL0vWA3KmefHzwKGeatTdsgck+1mwnCDJncPWv7hTwMLGPUaY+Yww3K3YPihuyCUtUdV3fer2VHVAn++JdzerHiLI/86T8gHiLAi/anFFh6i2kMMVxqzREh+62n34MrgdMqbSFQb0V4Dhm45FVJH43uuEaoe3OJPtyvj1HbcSR4VEVgGkDeced8aAK+Dg==',
547 version: '0.2',
548 creationDate: 'Wed Apr 25 10:58:33 CEST 2007',
549 updateDate: 'Wed Apr 25 10:58:33 CEST 2007',
550 accessDate: 'Wed Apr 25 10:58:33 CEST 2007'
551 }
552 }
553 },
554 'd5f700b9c3367c39551ea49e00a9ab20dae09dd79d46047b983fc7c4bfaa050d': {
555 data: '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',
556 version: '0.2',
557 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
558 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
559 accessDate: 'Mon Jan 19 16:10:23 CET 2009',
560 currentVersion: 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf',
561 versions: {
562 '12bd9887eb84b99ad40c1e413cccaa9ffd4deed340c71fe53610088faff349bd': {
563 header: '####',
564 data: 'MiAIw+S6GDmLLMcGtkl+wveV7dZAFrL1zGZh/FPvG4kpOBbnyaolRynNrL1yeUbEp4gLL2cK2BGYiVc9196PMOvKPHR5Rqp6GlT6h4RUJ+nFFF5/3LNGzQtJbiY0rrYKptqyPBC8mhlqtdK7sQkQonj5LPhKeCX6AyE3juBPEuFYhvTv9a/iRPub7BdlAocz+bb8ObpbVHnNvbGhiRpx9MpUg44JRxLQYhtDUMi2UFtURidKaK0k2lP81ckPDCgVgxy65FjCq05vSaCW0hanNrIwl+zAgi+3ChriqmflvsZYC7TQzUBPXrAQ8bKmzppZWlArIOppRF7+paWrHA3Qcz4uO5Sw3DvMwbgl+XINnmkE/EbA6VJOjrWYJjsibvbCw6vNr4q1A4Yxwy0a7EXbjFiwpEr+jMUhsq8+d0DxP3tQTusV0l9wcT2OWrDRKdjDUXLQOV9BVw==',
565 version: '0.2',
566 creationDate: 'Wed Mar 14 17:27:40 CET 2007',
567 updateDate: 'Wed Mar 14 17:27:40 CET 2007',
568 accessDate: 'Wed Mar 14 19:00:21 CET 2007'
569 },
570 '35af99615d1be9d9841b4a37488fde9aac291c73c8c3aaa570cd05b3fd0baf5d': {
571 header: '####',
572 data: 'lv0pIfnhZZ6ktahFGl3AgAfdcveIcUyAh9x0iVOCzmQ9VjelBztlvxZEo+uByaFh1ptM+eqOFT/Vk9IKhNjRWTXrDXioP7oZ8IZ1kLfk/XuMFH9AgYzm3H1T/yLq5lg1WqqZ+OfO9m37Z4kbTjK9+adIAJ3TwsMxIDpIHYz+qbznjJocubYCbi+DC+4wo6qu5C44gf8n5QF8DOCGaBCyamxFvkqrSMo/Y+3SG3yt98MSgeMScGESuwKKGDHZX0v3ZXvl4UFbxywUtdbipDv4PAlzh0aadMsGqYwO8bPKEUElCWBXd6kASugaqiJaZFtb02EnC+nncv33ZSx+WyJqwKIBk/Kpd3/YDJnX9t3QU60j0YKf0my9oX1746F5u0XGX1DNRaw/1g95zRHoMu6j2cSTTX7CJglzIlTU8kglSO1LOasxm3Gt8iT+8+Lhh4Dw86ugqHXl',
573 version: '0.2',
574 creationDate: 'Wed Mar 14 16:09:07 CET 2007',
575 updateDate: 'Wed Mar 14 16:09:07 CET 2007',
576 accessDate: 'Wed Mar 14 16:39:40 CET 2007'
577 },
578 '7cc6c6f2eccd8bdefddca21a59669655d7515f440b025144b9ba6b18472cf189': {
579 header: '####',
580 data: '3W8FqWzBVaEbMZRukwXcm03WbvITt8WVKKuJlcSszN0dCJEsIZ9vLAiDp6dfsFF4PEPcSkiy9Ww4FiBYSg5OLW6snRNdA7Wo62dJ3lqn8TjBzv/Rt+khf9mj/WwJZZ4wum+qdwTRPyaoZcAWgA6PAPPVp85iDBP8UBdiFOs+y5kz9GiB3psvOvqC9LZ/RyK3J+H7ierfWecnbqB9LT5Yuhfi8SO/gw+5vve6z1v8sVcexI0o8gk97rDV1W2gZz2WNtO7K5+233Z7aZlzouEbDZEOGG+zEYh6SctWCspgUATElf8vZ29fABsk3uZQO2tnBvINChs6jCRxnbmnjb2Y9R8u2QRtHjjvRro9E+zhQf3laJc0G0ZJp1zN0wwKx+sL7uM6kG1aszNJkzpykR/Uz8bKvoOfG9vkz9+4Pczh5xR+k9rCE8nbu6Yt4EMiUfdfjZJHAhST',
581 version: '0.2',
582 creationDate: 'Wed Mar 14 19:01:05 CET 2007',
583 updateDate: 'Wed Mar 14 19:01:05 CET 2007',
584 accessDate: 'Tue Apr 17 19:20:33 CEST 2007'
585 },
586 '95ef5754f9a4514e5bf883436d60c38c3cbb15c3f5452d512a05839ce20125ca': {
587 header: '####',
588 data: 'Rko0V7wG9GEmH9pZtXSfxKGDLRhZr65ef/DjkwhsPoYfLryET/ViMjcZcM2blyiLKOxjiS/avGGcXUmInz2AyD5dAFTGge3qAZ3QtxTcNn/fvfJeN+JyGJPIsTIQ7P+jd0uJAb3vPuymISGJluTsP0MZ8zxahSSRUV/VIYwm10tiMVvWEq0+8FynKfWDqJ1eU4pnI47CAdN9CuWhxi12RkMBYgiUzNzTh/tbPTFMc7DIyRfR+si6TuPS3PmtnKt4FMFAX3FznGBCNsonUFf/n7Zy+EYEU/B8wJO+18mqbui5YvmPCPPKiW/pfVuaWarF7zcIcthYoKQfTaCaulO0VRtTA+Wg2LtJv+QcWWWTiY2A9FC/PppLZ8+nFDeng6LqJYKoGnn6qwtSVH38s3Inzbs4r8mSOR099tqwfCnZc9zZHisdIbVm82H3gnqelPmc3IXb3nHb',
589 version: '0.2',
590 creationDate: 'Wed Mar 14 17:17:20 CET 2007',
591 updateDate: 'Wed Mar 14 17:17:20 CET 2007',
592 accessDate: 'Wed Mar 14 17:22:06 CET 2007'
593 },
594 'cc7ee01d38e4f1de010d2a235e3b76e838ca05fe70223b8358a5e41975bf2b7b': {
595 header: '####',
596 data: 'TJ5ClYK5JmZvEuNCA+/UeUJQ2rGXbPnFqWP31GAGXqhZmC0RuDNjl3sv0nFKmcdMa/BzvLSywJhkidoRhfKGwN8nZc8M0VpujFkpvdXgNsod6x+5LTMP67qCyvD67pkYMa7O+aosKi/ZWWnYBavZSdhyuWnU1wPxxk+wwcjjIrA5Tm5zTXM/68nLLnIWs2bQbUtcwHgLrBEUshG5oTUFGxrs8zYwodsYUuT1CVwODZrzMxvvbHfH6Lqt94m4hBF0oIrDCd1cSaXghS4PiZkJWQVxJNSsuYF/4PlPrV4ATZS3Jm+DqOxLOOnU2Xu1Qe9DxBppnXjs/WpohYuMV5YeD8iOJLXTQbFKhBJNSCoLp73QywWazuKkasC6cbBrTHYykEKXpt74iE6oKg67YrPkIZJ/jKEGnZ7wsY4ObeDTS7OUbHKxPHRM3ZrmB672R/8ktglg',
597 version: '0.2',
598 creationDate: 'Wed Mar 14 16:06:54 CET 2007',
599 updateDate: 'Wed Mar 14 16:06:54 CET 2007',
600 accessDate: 'Wed Mar 14 16:06:54 CET 2007'
601 },
602 'cf70cadd4ae3e7f658a705ff124ddb24de78083a57bfe4fe2855ae2be2fcf8cf': {
603 header: '####',
604 data: 'CiJDd/ShGw3rE0xCNZspkdH6hRzvSyaNiuQeMBI0NR1MReaa9uVMV6Ymj+BWVQ8FaOziQ94aolsWre51EKwDWC1otdovPXWHxBXBBI/Y5A4dyQisBeR5E456juUwDtLKX5En4iIuOL14IGt+keUtb5JyfBGuTTA+EnohYzvDxu9MDh/7nzCcWzUxh2zHEBSyowfOwJhx7G2xEvbBgTg+TkejMudbq9k3Owebe9QNdhU9rsY1UMxjL8+HgJmgyo0C0SA91tZXBB3i5ePvg++ze/SW/r+XO/nnVzcEwCJE2UWAL+vNh8tUm+sEbWaqyKwjHNSquxV4cYOG2Lzo45Wp/vZwiUR/8MK9THf0FO1mn3QCd/37AMMneI1Gqk0TNwNtoQKgLVBNhhgX7dIVpRxB2iiSBYyUK6N9LlFahW2QVDS7kdnKH3vk1cP50dj21E45jEhhd75v',
605 version: '0.2',
606 creationDate: 'Tue Apr 17 19:23:41 CEST 2007',
607 updateDate: 'Tue Apr 17 19:23:41 CEST 2007',
608 accessDate: 'Mon Jan 19 16:10:23 CET 2009'
609 },
610 'd65b23008b22e5000726db3fd22b074b08553fe82245c3526f708b8d89f70963': {
611 header: '####',
612 data: '0y9WhoXwZSfzfxuql8LBc5/RiclPKQxcBYjcdGv7v6B+WuGrB6uu6d8pjNoUtsZnFv/25sefW3ggVgDuI5iZNg2lBQVIwgcvK5jPM5foit49d3RSWl74XdHY2XqykRNDbboKAiNfro+abo/YYQXjkhNBOC0dWSUUw+HmgK/Bm5NmJD4fDTV7OYFsvX4ExjnX9pktaB6aiLZWN1cZruW3Lsszx/ryHpDtcPrmK2hgLQ4FjRSXunbqXKJLOADQiMbGZ8DKZchB5NcEWlE3AfL6ybJzTyr4jXuS7A9PyitxYNKFHAHpJEhxGkyuhUE66QMt1n9NKzkNx6yhhGdIUF2zVGsBUb/pRrL2gt0X2lsZ+CnWFu4jRAeSi3KfK4VrvnoYkVlJImxPiLrzJAvqkuA6TyQRpJ4yFVJ0dgxBoxZVSN1fp9Yvkph+Os8LZscJtpYPPwVDlCnC',
613 version: '0.2',
614 creationDate: 'Tue Apr 17 19:22:08 CEST 2007',
615 updateDate: 'Tue Apr 17 19:22:08 CEST 2007',
616 accessDate: 'Tue Apr 17 19:22:08 CEST 2007'
617 }
618 }
619 },
620 'd620764a656bfd4e1d3758500d5db72e460a0cf729d56ed1a7755b5725c50045': {
621 data: '+iiHiN91FfHKOXC8Z/tg+YynPECa5sgYGGofcoJeXt3FAAkAFu3NsLuwjYIaddJiB3MIxFccrCrB5eDDL0SzOS+j63GcoMCeeiXss9YfVunA4RQTTktiU1BknPYfsfHj8EOPDSVHkPFs7KhAnBlgyaDiQPjYko5Np1H2i7F7pRmfC8W5LGdisaqxFDa+1ghu8K6a54QIpbfOmolQU3w7T5qiOdoZv8GLDDoORvMMb4P09IzXpk/yDEZe1GJ4g1a9t+lHAhiKSvdnZf+MhK0jvs6R6ALlmO84lRP34DmT/35Fr5C7D6EJl0OxXkWgYWelTlfU4b8+SStYP5LPYeD38fodSmObpKmpp653T1v2yaTybI1hojgLbH2DuA5VcQAM5JHMjoSy6s76mf2AZZeRnej1dqdvIOTf1Q6CR+ZNIqnkukrtGq/6elF3eZZh1Ln1EZDiTzsMxUHBngtiRmRDofqRSJUGbEAjw90dBoiaIO/WwLAy4cTec0nJxwYd5M7nchEly8Cb+zz7naP+vEGEAWq991u9NFZhrw7WgNgHnG0E3km+X+SYvv0i2MkqjYs6ItDkBNyi0Udnc4CqfWuKa9q04t8mZiy49LU34Ho4/ijuez3rdOeCO/oIwkRkLZYfFO6IxO56tAI3d6iJqmXY+DX0YUZrJ6FT7bDsUj0umV1htuj/uEgQZyOnKOyA8cSjOTMRIkodI12HrtdrIA966BDznsKW4F7f31VaSxI5ezHsdiYEsTqwaZlFQMsjfZX62EvDLJksJTe3JG15BNgsDUUh1mqIDCmVswFTpUTTb+50ap56c/uERSET0iXP8mb4hKwJkmngrBEir3btuMEMS0xSFQ2jTRjlnWRQr9eZT2biarzgEhKHyu2qCUtsUj7TiieQJY09EXCP3g3Da+61nBMoAwi/VqTI6vQaLGtuDrA2+VYGc8x1SiahmAkRPpQS+5N9qPvxxFRbKforMOvmeboFVxdKesub7BHIXQsSOKsHFZnFHswa/oLBITomp3ewfp125RjBUf1C3hMBNg/tmE5pgLqPfQqWK7IOnfdyt0jc391XWb6H3CVcgC8DcPKJ68o7DBucg9xTNwlIxBTafupsBa9JUkBigqYOW8729lNjj/QTvTUaCxWub9SDT6/y1wQUI1wyyg+EaR0fHqumMhIMbuvIPd/SvKMmZ4TXtBc1U3H3IGbkqIfx0f5rI6AuNMD7/pXTAy2Ot1ZBohnQmEotXRvDwxPMqBvPU74t3USTrysyXfJqeFtHi8GTR5X0m/PYQKWCCHgKvjw3d1CJk7tTe3iV2ulk5cnO7tOydTMJFgPuT2oyDDDTp5jYJPRE0OzZcpAzvRSjELfJ111sFBOEzTqtBUHA/E4BnTIM13md0ZaMr33E7ii8rS7vaKrQAI5moonAtAEOVbx/ZrcZ3kGzHpRCISeteHgnM4I90x391HqDkc1A7b+iDQF8OY0H/0as/3gaVaqs5jsuhIByj0+KmoXsdq3ZBhEQRW151QDCdMKdulNUxbKTYV/t92z3slU6lO8fiy+ON/6sTtS6jgnM+oCLxTfpfBdz0uKG7jiSOyunj27QxNjLyu1nF2+mAcDhtMN18QkJGLXKYv39kx7ny1H74i5rba32/QEAFl5eLJNIQbJZfZG3HzKMVS19ZGwgsYNqV1G52x5+bZUTR8YcrLWmPTJ322UxlhTmyjQv+fVCnpksBtjLGntsGloemFF5YVlcl1AfyHb+KlXiAZn+8vpfVVBddFFMeehokzYE1G8Doa/3huhqdtC9qvAtpP54G2p3',
622 version: '0.2',
623 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
624 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
625 accessDate: 'Mon Jan 19 16:09:28 CET 2009',
626 currentVersion: '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130',
627 versions: {
628 '0bea892da673bf4b3d3e4e97cd3e1645eb177a8423dc761583b876c5ffb1e2ca': {
629 header: '####',
630 data: 'BmZz8j6Khuz7Q11xPA5zSECcqn7BOcMtLx8AmX2iE4OrIwKWcZ+u4B5kCBxtFPRZWLdWcxAF8VfaedkHx5jxPNeWNIa7NEXXcFLYQv9lwUaxmtqodYtVapAg7N+onw28UnV1vB/h7ll26u263jWYohtd5eMnXhEjIEbrQYpf84jQYlpMKjUDhsVQeZvTI/KfiXa6O38ygO9R+xlq8xKgPPX2bkXfPJiyzlA+GoLSORc0tdqseGGOK4BFyp1V/KRUQ/7uQmGs1yNWt/ijaQtJXpWkWXmjHyTjXsi0z+1s0KH8TwSOfu8yjVshMyIyEDd+EsmZeK0QwMCm96v311cRhMgAkQOqL8xc2uRpGygtTkV2frthF237GOV5vwO9IoMZQFlvKZreV5mPPPBeqfP+o4QRpdnJRRCaP8Ds/MmzGBqE13ntwmo1UVX1k408ZtMCO7h1eQVTgCZ/Y2RD',
631 version: '0.2',
632 creationDate: 'Wed Mar 14 16:51:02 CET 2007',
633 updateDate: 'Wed Mar 14 16:51:02 CET 2007',
634 accessDate: 'Wed Mar 14 16:51:02 CET 2007'
635 },
636 '335e2fc3f76b3db69d7575194a8313bc3ad031d441b6f2f81cecba6d3d630130': {
637 header: '####',
638 data: '++u0MEaILPK8riF0UzCnb+MnC51GYcdqCFRKOP7XYt5QvzWtxhDMOvq8ugCDF8G9sYPAoBLiCxFcuCtnkG4fp563VeEeC/dRnArzMDvjILYKAETgpnLQAfyIR+D8RfUkCbr+aOJ4XEKcy9a240OQJFDT0whoTKuX/6XVzVM/D7F0r+hJiOD1ELsVEi/+U+dXXO/VDxoyjFxfa1+M+Ygk8ewecX4nVqwOiFWHNK2lXW90inip0p8yqDsADx0KhE2tjARWVsjoNdf5RSUOYr0Sb0syyjBMi7oF4jpbLvHpu9fe8vpIcve+aSA/MF0Acxh0/gToDcO8ER3K4wcJgNPIs9lXiSrmuklK7kmS+uhz/rWCtZZH/OB/ov5sez5H51EYLmSNQbx5wZGZhtJWNN+AkJobg/Nt4XKRTe98CutbeiiYUGPxQvwG431Erg4y/q216n55FmCBIHZcUsa6Hk7ezF66c52EuAnVEkn7TZLl7vvym+sv9lKev31xpAGwX5Gy0tx2A7cSE55ZoyqOS9kf1s5Kwprx6RSBzfy7sffLSWHxyOSBnd7B1MNZglVSsbB1r4gMgZdYG//MZ/3IhTFbUqqw2xXHzTvBPA2Hl96g5Xzx0dVx2wHWcPcTSH23VrLscQCwyiDVINwmIzyG4CVSW/6gzA5VM4QYOrUDX2ZA5ligkZpWs0HTqmCB4SoqYJUpafaF2sEtCWHUjuVdw+rQiTBCcRTr8f1Vah2q2xbXMedLCRS3Vq4vlT0a/3wGgVD05CsAom31ZzmHQm94hZrx3FTPenhxLtTOHtDYXnbzYWufWEBSJs6VNtG9F5Md63NZvzEZiggfxTREDRZ7I9MBOPhrxz/3tAo+xInwvLXOEnTNOHVATm9u50kDs1qkJgqiXlxi9pZKmrTu4BeXS8cOxJ8O+Yb0Nh9bExfw+CC8X5xiWE58OwalxY2qlvuoR6mOqdcd+L7YPbGq+hJ/7WgJlrvtQe8IjGF1sJg6jfO8ZeGaPMF5NnbQVxGAq39g00on/z6dW0BLZyA6uglv99si8aRLpMk=',
639 version: '0.2',
640 creationDate: 'Mon Jul 09 15:10:15 CEST 2007',
641 updateDate: 'Mon Jul 09 15:10:15 CEST 2007',
642 accessDate: 'Mon Jan 19 16:09:28 CET 2009'
643 },
644 '63760358c7f5783d11fd769c78ca3f1ce787113368743655ade89bfa67d0d30a': {
645 header: '####',
646 data: '7lG/UvX5KjLbN+OrHbDeqXmweYeOL+0p3/UoLi2K93mCYdwsvx8mg+zghxwg5ITKPiZ9D/QWIShqiPpl+dvQJGWgs9EcP5W7k32CS2RNFaZ7U820rSpahHP561HDcBU1++5wHWszLnqFFiCuDja3OU90dsCTLI3g0igFgqpaRbjLcRTddI/1N48xNfV1YieC5Kei+jZ34zzrfKRn1f0F7mTkCqCSfygjnpRBgZyo9BfJ9rHULBvplvpslUUfFTShkLnCx0UbWPXog7DIZUCOwvPr3KJvmcZtCJp/1nW7gm0E5PaueJF10+ZlB6pKvueu+5yEgVmVu/lctmPX/UwTYZDgY5VWSWS3C+JNAvV87ZQKKmp8N6aMFMNOLCsOYL5hFN9uWGtMmvtgawqt7OhO9HukSUs8pDTgNeXoWyrorLM0cH2fa6a78GxNs3nCSUmqSQchJf5eWmASZgvI5xXmHXsNbuc4w5R9BaEPzyrrSAIa6r9D3rpFbUhMm+qPv9pZE2HF9liJVdWCBOSF8ZfCjsq5suyYz+YCsFHnwwpYmKAqJNXUMIhxkjgOTi5lNIsvS/iNSN9kdkeWINZk5iQFta34uJbGgjUhRy930ZGMBEV36T+Vb5tz50M6/MnlzAoUDeZAu54btKcrIpIq1Se+8zldwd6UKGq5nG+dMPk7CyKfZ5LkM065KGbgEJfHO651AMWp1sMAsbIAM6h1gVKbRjNyNwO+UK8eDpIX1nXHVj8bDVh96160cFbZj7htsUnXZh2AWuY6ahwdrGwYeSFoVAnd6xUF2oH+zFz2coLmLjD4Xm9IuQFsFO0U1Vo7EKUJHkPgIsXUT9He9tl8/K7UYQMXGgPTpercQFQ1ctFEqlPbFoVNO0j7Z9lmeSBcLdvY67CCbsoBDVJzj/wLRdBQStfeSUe7bEI6ff8+0gVkEFFACc48fWWA6NLLtvJkYjdojjA+C/Xf6EGNeXU/VENMJokB10EJUTueVWKHCLGI/JDBQBBB3HKX2VNFcEMJxES7Gfcbhysm5bdmltyRUJAIdXvw',
647 version: '0.2',
648 creationDate: 'Wed Mar 21 12:56:43 CET 2007',
649 updateDate: 'Wed Mar 21 12:56:43 CET 2007',
650 accessDate: 'Wed Apr 25 09:59:58 CEST 2007'
651 },
652 '6e0dbb3c582039d985e80e10d94f424a63f0cb5b2ffac6388fd806ef89c1da40': {
653 header: '####',
654 data: 'f5hBUeedsvb1VBTpmpQ+XgGbnuVDMVEAdbEN7ZLK5k++4Iuw7l52zX6AHCWUFMDRfT6joiD2DMj0O8B2g55SeOQIAtZb4PZnbf3+ZEqKMOOI7iYSfo2PctLbzzzztma8EUXYkg7sJKCuZuyXhkWZxikBqVQIp9WE/bhRxa/atnB0jJyttnDMdTAN8kxIizrHFfT25hSbcPI1cSzsmF2nLabO6hLlm7mdLZCOD6DSv9hMeOXgqXo7XdfLA4k8swnOA/85HZFmhaYjTyoDGsK8yoJny/xBbiaRij1HQcHkbG6k2QKcs96pjmiJPoCv2dmsU3Bh06l1O4OEXl/RL4qBGJBKsDW/TXy7Qqa5y6LCEnlFAfefTHVgzuEQjJ2qb/z//oIrmujt+8hEa8F7Jyn6+FGqMNRxDvIQn5Ty/CPUStS1lNL1PEb7TA3ChYkYvnuhNVq8HHf47neGMpUwC5ppk5Zzb/5zEP0XH4XXkNbR5/TYjcb0Df3egNLSQLdO13CO3mKeoccmtfcmaFCtOLXWc2xNNcu09s+/QlZMuiu1TAzhWXU2CAXT7K794mTXHXjgGEaEe86Pj1nO1zHN7QhKDN92WMEdYasRAVDu/XYdzpsKJZ3POhNJp6pynotVBOkPk+2g04S8uujLVSIPZIwu7p3RmPQGGvfMviswhyPvSsPqND77j5msYOLCnXXjeXhOe0E7fIRpxPK1F6/N0R4tZCYNJe9Zo248XdqBvl5ZQWDC6aQH1E4djPK/08CS7/kAECqGqOCDPRvvMUNkGOnxsMx5eofr1YR7zWOZajr2GnfhA9fjrLv6KxXPVU0z702aS/Mfnf87ckGpOKA8/ssJiyZ4fzP6uN4pEb6wEta2DnnacUDd96nMvB9HvGCDoYZH646+n4oev+AnkYTy+ZRpmnsG6/3Z85iH3RwN6P2I3DWvGuN2e+1zQ2kaBMDms8qeXVY1+8qWr75ihizHCJr6E8Rd2Sw7xM0+6mKpu6gVGIi09auHg1+6Q6PlCr8Hy/pc4Exj9Hx1m14WKSF2SB1SYOnm',
655 version: '0.2',
656 creationDate: 'Sat May 19 11:26:44 CEST 2007',
657 updateDate: 'Sat May 19 11:26:44 CEST 2007',
658 accessDate: 'Mon Jul 09 15:08:39 CEST 2007'
659 },
660 '84f3b8571428014d04d7c05528af73c89cedf17e23b1f9541fe7060512f4c1a3': {
661 header: '####',
662 data: '2/zsq97zQBq8wE0oAC15HW5pbbzgokoDkLSEGniP1VL+sW3b+tXYOQV+VSFJo8ERNlCSoy679G7N8tPKgA+rO2/roGP/iKEuE38et9R6v9nhCPfo1vKt7XpvzJYow/qDwdStylXbfW9QN12Yx12r/nkPldVTXCYQDF0Vs0h/I1XMjbILpq1smbNXAUdn9I3W9o8KpREvac2H1ir2vYOzq9Ubhq4jggX/9s+FGm40f5MX/OM+lJGdRPCMG3rfWVeFeWEGWpmg0AXpV7eEuKH7sPrWy+QLXD1IwNE03QLhuOh0qEPsEi6kcCaZyLlCHYlzJ/hIAR1CBlCtGm+vqD+WRr0mGQtl81MMl6/BoW40dya/6aIKNOWfmYNgdfplknkVqxFsJnwVqjQJWfCzbW1KqBvMHx/7oPNjbMS0KKhd8ctOsTLSvq4zFI+mvR6BggwT8rwcfa66shJIaDDC',
663 version: '0.2',
664 creationDate: 'Wed Mar 14 16:38:54 CET 2007',
665 updateDate: 'Wed Mar 14 16:38:54 CET 2007',
666 accessDate: 'Wed Mar 14 16:38:54 CET 2007'
667 },
668 'a4218c7ece0287ebad7f3cdd6510f424245a4d7d42ceb083b664a4335bcb7690': {
669 header: '####',
670 data: 'hQ123ZhZ4AiXD25P/0Laq3MtRO2oSIrY+GoYe3UAiyEHc9HZDCvR+POEEaARXNyh+U6z8S12P1GvQbzo23ZCt5byhqC+UmbfF3Y4FikM7WmHaRPtWjv8JNf3X0iJ9a2IBLA1BlqgJolnVDtrLsFx+6rBIU9r8pI2jdcsw9w9feRbE9/0S0filh66azojT5RM1qLcIUVWGixROY6PALSnA9PCjA6IG5WUa/DX7DyRrosZ9V4ZheMlzlz8CgEKBTN/HREIbPrEocBOvmnbupIEpOvH3OXKDXf39KAGVBAU2IIkOrGyWfT12p9dK+Zf+MQUl4DDIdAbF81Lus+LQmqtQ1ieyV0nNiqFhPuglLvKRj7QZRFfHNyejkMTZQWjQhBdHRmfSxyEgmFrM17yVVz4cMis/44g3szHMgAAfFIc79wq09oNDEV+ZUMS2xyBCALjRmhedqYIMGRCAG15',
671 version: '0.2',
672 creationDate: 'Wed Mar 14 16:36:20 CET 2007',
673 updateDate: 'Wed Mar 14 16:36:20 CET 2007',
674 accessDate: 'Wed Mar 14 16:38:12 CET 2007'
675 },
676 'c6613ccf0c1c6b65798c6f35657a10d4c6033aa32204a90d9d0274783a1098ed': {
677 header: '####',
678 data: 'ATU61Uq3Fe24JAEauMRtY8vMjzaQcPtnt1fshTD4dGuptFH9XoZ4bMC4XKHI7JKbx1NUEbR2ySOj9K/NJuWEGZjRgZbNI/KtuxNedlm/7jEpHQx4ZfhXQ8OiUDd+2bB9g6V0Ck2T1gM4IyaZMJ1QfOlYmGGv8n4flhHC5kUzL2OIiAxNHvKQjdEOccnEsk25Gg6FveKHD6NqVunsiCqhxJ84VBNzHJscuCTRcbt6KwR1+dw7Y+nhTjdDFq9UidlxTO0BKYsqj9F4Kq1LXORkSyab7zKooFH5kNd8torb5UFto8dfI8/+DOVHMxNRh2aWSn3O9bzwi1PfYO1nky2O6OKR48Y65Hp1sm3Xj4AAVHWSGakYUSV5M5XxKKzvoKY6Qqhz8GhbkzM2FC0IKTEcmINMvzXdzKRTqBFg6i0t7Qo80i3sQSoju3/4CYRozI2RrF8W4f3/0XgJf21oUAdTXOmSePSZoqhdejXeNQAgb89v+ZextxA6NJNYqvrx1NjdKmWKJIU+o3AgPYj4UIwWHwVADHITKrIWl/SbOsGP5aERtSiLnC+xqfRUOpgfkAYLcytspouHxvQjgNY4I1U/2S1DThG/N2EzuPl7GLYQ+Y3RAvLObFbrV8S3DS6vXIkigxyJT++MotIKoPBq0xDq0ck6joyvwvg4jXUMKlJa8/LQewJlbH8Lszx7SwjynzEQUJcpCnmxixzSNfRzpzgEBQSiClEEqArYykew3rjz9lc9nkdXUCzz81WYsvk6rGJ6ZdDsfKsG9+kaybuLL8huE0ERhznKDJW44ehDGQLr0phO3CI8n/9Px0PhPeZ1hvoiiH8CFSW5f45ZrFaaQG8hNyzWCpCFoX0/dNsNPsAkOJnO4v0PvO0HDOif1JjgPjCS51vBzxu8gYhkWlPo2hZxHhnnrbhxeBUU9jhLAx+NmxxfTjIWkbtHtVjm3ea/D2nuL1YrZKmQ3Qs6GamKlh3WwkRWRAVU3+/mbSGOISxo0u5v8QSmh/IPIXltniaQgWweqGNnCLWluuTyhoqnqDo0II7q',
679 version: '0.2',
680 creationDate: 'Wed Apr 25 10:04:29 CEST 2007',
681 updateDate: 'Wed Apr 25 10:04:29 CEST 2007',
682 accessDate: 'Sat May 19 11:22:01 CEST 2007'
683 },
684 'dd2b4cdeaedfc97c384f79c2878fca9a981efde6ebe212138db235e51b80c64a': {
685 header: '####',
686 data: 'd7ZpqQ4CTF00+/UnTvNnnkMXB2Ow/K9dys8V09Nedq4sgMUk08E1vqi9mdWbzNfRD7aV3blru8PfoRrxXRLTG/bjQ6xncecQoAJeUtSplKEO8fhuzGqbMqz47/y3aQDHBbygMAGV3wLgJO2Pv8p+8U/P3cEJisd9OqTNE+EYQz4eiq9dllMNUQjDY9aLHE8H0ny/5r9uohGNjXX/LfFMshjeS4rToCG5mzRaJPaRs1jkjzSntpF0RLxfU1acpJX4pNSuaLscdJ1lIwc17vygg6f3xexqvCeeFZBot1RwwbztZKbMfap4pRF5KoftD9bXJwoFMXigeMGLy0scpzsp1s8zBIwLhwUxEE0IBh7qeStg/3eRSW9slazuIR452O3Rysb+n/jWMyAhIOCSrnncjjH4XHbzV5GgT2d4f8jfBPmOT7l7C1ev41D3FGFxEb5TZGcJTaIW6ofLi5T5',
687 version: '0.2',
688 creationDate: 'Wed Mar 14 16:52:12 CET 2007',
689 updateDate: 'Wed Mar 14 16:52:12 CET 2007',
690 accessDate: 'Wed Mar 21 12:16:29 CET 2007'
691 }
692 }
693 },
694 'de13c0d036234c44214062bc0a89e5f127470c464333493a485729f43cdc26e4': {
695 data: 'ZYvHAVCnw96hB+0XxnBY6p+vwvup1BopHUeepu7yOOSdYNFFOFEvtCbxXXoyVaKZAeSd2Vd7YEwRP4TTJjjWNPapT0D65AFqM8x+0rEjhmVfQGZAS4L3QctzRAgBoR1qTr0iqI/46ETkNq6vHz9mPLHEL3MQ/zoh4Pp0T+uMsY5ptzuMPcG0YwajSm5J8XXV2V5ZBEANpgL91xjgh1I9LiKJa/Lv3R9HAZG1uuCvzqjA2LWYeH+6ZcSpadk/UPxDw9c78FUnSNbHAcjuYZ/yI3v5SaZTjEzsB1MtAh6AFiHtvKIMWpqoOs7XQPhz1xXPoGZ7VR64A+/bN2h+Uqn49bQrKjTRGegqkEWFcBwhFH/ZkYfSHCGmZQTVqOakqyofJ22tS0ief45gYaO54YvIliTNTY7SZMRCEhUzz6dz8ENqP7FxhUVcQRbBr0JTmaf6DAwu86iDgkvcp1cY2trnUmlvrgz2GW6TgXoFjFlchUkHIByFeIJ02olfJg4zP8PzgYp2zhwmXL8iXHXnwzuP9bQKq5j8o+UhR11zn4MFvWQyD1UEplK6vphMdS8iXDViLrOwuMz1XUf7RxNdW0gqXwx+qLU+CeypyWLMIlgTlOr1pBqD/S5Jx+Gbn5GHQViuFZHJUjJsU0xel001KjB2Wf1Y15OSdLZ5l0tn/4HYKmZLufTYpub0xrss5r3Z72RYz3wvAWFXzkxWa+oBiRQiF6+ix8DBPTc3tm+ORnQBYcV/VNVRziimV3MFSsD1nHgIF1zu+eXIKE7/b3lzY19KpvtiBio94dejWoA/WO7KXWv2sHH0JoZnRh6lzu0HRFgYqVm/052nCGVA6XSfrFtfIupxdBs22C9wrwC5/Rwanf1S8BQIXpm25P4dv9Y9cS6c2/DUHcle4tsUJlqC+LpRGKXRdolFkiL9r01V09Kev/K2oXaWGYmBLbRfIyvEHyHNeNXv5fnaZ3pTlIwXjJ9K9yKA/1AKAsAEuKlM3N5ep9pfyuyfOWj1I6RvBwVqKvcBZtYJ4u8n9jrxiyq3ZZ35eB62D+ceOAD2s5+LL2IylYjiJA1OO2qpu4x9rt1NHXM6LYJAruBnUrJ0Ylqz/ElcJn/lXAzY6RLqVcZ+tuV580AUkFiaXFEDcqdJbbzh0R15g9DtaeiQZd1PG0a8Xblj9aMQoRDRJeksw1GWO7TfrJX1Cu4k+sgARWRzZ0DvB0SJAxPcmhg2iBByn2ESlcxPvMOpzuJI11BUQsZZ7dcynubeMvdqBeKsC6HMcm+8DLEUPmzsC3HIfARlNbt1fOrGJNuKaLvF1AAdwllELoPf3lQ6EVZI120=',
696 version: '0.2',
697 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
698 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
699 accessDate: 'Mon Jan 19 16:10:06 CET 2009',
700 currentVersion: '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28',
701 versions: {
702 '201725aba7b4dd93531e40ee08eb8156e3aecd3db4f11e54d4d88ed5508c72a2': {
703 header: '####',
704 data: '4ndloDtoW1Mhat41ZlW+nN+WkdEriCn/z/oclyBFQSljJRlMwUFvzE/OCVYc2fQx1D1GBedY/O13v+SCAiJXUrr0dgrMDOfmYy7ZtNo0hYshjaYQucJovt7UQLeFAuLO6rNK9CrsYA/AWoiT878z2iCYCqVq41sL8juCm9n+d9aR0eyjXAKj8QJzVz/uvdudoGQ5xL18x2yUZnemY5gQklYlm0u9zzCJ3rLOENnnAggFnSJ0oysNjB2UwQY6P53bqXzF8E+u6Rv3OoIbmCIZMaoK1G5ivnWHwhLzp9UVdIj8ipfLsTJnGMk+aZ3nnEJ7wQCaaLy/lY2RYmSeUTTZt2ImK4ZLrSxRC21QkD+juyIiaEBJdhP8UOfcqE8Hw+etc/Cl0QgBtv9AgXD4BiZs3HUTXsV/PhIzP+6TGyr3/A2kt8dv33V7Gh2Ba+28wtsG/+HwCMk=',
705 version: '0.2',
706 creationDate: 'Wed Mar 14 16:45:40 CET 2007',
707 updateDate: 'Wed Mar 14 16:45:40 CET 2007',
708 accessDate: 'Wed Mar 14 16:45:40 CET 2007'
709 },
710 '59b84967035465bdf84c8aab3c43aec6cf60e1e2857e978b205a2cfda7546f28': {
711 header: '####',
712 data: 'eSAwxBi9CLckMV3o9PxBjVZZ47g2AOIsbPt8QMPta7U+6KKUm58cXHV7BDfRkbin3JYQJGYfu4HYHmayGt4IcX4RD3riftxnG3UFNqG4LQQ8+fwA3xTMBisnUSq0JYc/PKdBKzxH9x8moSqZC/cgFWe90p0PxdY13otjd1qvDL2ALAgY/uEDboTcLTbSEhpGIYQHtQ1ZjDG+KXI8J7atuMvS0KFreNUm9+uMZT0yCXwNpGy+ez2+ZDXTEjZUKaFPLI7g/vyySn6VMXmlqJftGXZ+fW5UWGaxb7WFa1hh/nI2okPuRlUQh50xXQJXVvanw1ATJbN1PRfYEfvQKLlAAwYuoB/qL0y0vU+3OktAbgBvwt9prs3IsqjwMeaejVTo3Yj9pQPJ14a+6lxQZQRFUaLePIPdYvq9NRM7chkNYminW0JN6umi6bvJ4KKTyjAglBQ6X4s=',
713 version: '0.2',
714 creationDate: 'Wed Mar 14 16:47:01 CET 2007',
715 updateDate: 'Wed Mar 14 16:47:01 CET 2007',
716 accessDate: 'Mon Jan 19 16:10:06 CET 2009'
717 },
718 'c7398bb27021058c9965a332d678b0070287b8ad12694bc8732346e6d84fe9a9': {
719 header: '####',
720 data: 'L+wk8k9ejeUeVz0offdItFpy8drMl1hi0FODBMKlPIAmEcNjnHU/IktOlyLrK0YHj66DaplXw2EyRkJNcMIbfACUtavxhWBH9VTftOPepsbsrU19aP6Xk7R1pr1sC76w1TgKCjE6IyBnK5qk1oHqcGv71GJLMmiqGivKyYOXQ45SH9tbHC4GUrg0YxoAYRwXqg+SlwRHpSZkX55NzPCEZn9eatGKCznTZs7pg0uBoM546fOIEBMgGndNk6gnsAH7At8yYxDMnkGHUctsSExL1O+W3bDDDx7D3uPkkjtd9se0exPru0fmsfcKPrcRkx8b8MAdgcylOtMdYvSudPdR6foSIqKMqktH35QlH6Rr5E/ire3O632QlmCieKDoPk/cB/qL3gKedxT1NxtC7SNR3aumKBAKOBDTVSjWWq3sIImQPZz+RUdRajeqkryNDVVPLFyjdC0=',
721 version: '0.2',
722 creationDate: 'Wed Mar 14 16:20:58 CET 2007',
723 updateDate: 'Wed Mar 14 16:20:58 CET 2007',
724 accessDate: 'Wed Mar 14 16:43:46 CET 2007'
725 }
726 }
727 },
728 'eeda70e0392261967bda71c3764da78989c45bbd2bb7be6b941b90f81d9b81b5': {
729 data: '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',
730 version: '0.2',
731 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
732 updateDate: 'Thu May 10 15:01:21 CEST 2007',
733 accessDate: 'Mon Jan 19 16:09:54 CET 2009',
734 currentVersion: 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec',
735 versions: {
736 '157b5933272bb6b8a70bbabb7fa0369eb2660f7f0848dcc653f592f5afd4f2a4': {
737 header: '####',
738 data: 'z8BUTeAbrs5GeJ+SxaV9ceaAoqxtW/touC8xhjkEqbG6+IgMrfuz6ABRn+vwiN1/Vmfw/tyad4kB2SyzKgaYPH7rXyBir1mzJi73/oHsXv5wWNhEePmjZginGGcWQ0P4AnrAoxlaI8tXo3fbsz8e40x1b56N5J6zIdvX3eewgIMU+J+iomZVPDQq5DNu0aGUL1xs797FNm4vLQbVRF+mzrZlT4XZNzOr/W/Br4vG/Ureoq1QRjAjj+8HRt7ojmzrpDX3RtmSbWqUPQqx/KpFGqVUNw0zs09MomVIYilRawe/zegW2KZKK4rmqoUm+mnWQTf/I31FYO2N8dLrI7OV71EWlVN4FSO2A7NRUd92uVxHzItMQPS3CSQ57FYAC+WhJh7k+/ikJumVSf18pZRSRaEeKPxbJZFJqrWsWk+SsqBIJ4EklAnBBU7zLmMVe3GO/ml3',
739 version: '0.2',
740 creationDate: 'Wed Mar 14 13:35:58 CET 2007',
741 updateDate: 'Wed Mar 14 13:35:58 CET 2007',
742 accessDate: 'Wed Mar 14 13:35:58 CET 2007'
743 },
744 '1835468626573e6189e5302f6f354628f49900efe08adc931990d1c11fd522ef': {
745 header: '####',
746 data: 'Bv0je7USknogpb1ng86CEx6GbHlysuN3e5Iy43kg1iN83AgRm0Hp6/yMivQe/mEmQb+67cjHfKKrznAESYzY8uv3b+ystxoIaQL7tKJ5HYu2NUVvZxRC+PE7AkBhc+O28OzpZEHXXz62uZFsjRDw2hC/KP1XfYW+Deuulnpz6sgjuyWIYXF2486DzaycCqX0NmYXKE7oXAthOlbo+Zsm8Y5MWh5ploJFrzhAm0CCzjsGSa7NBOBWU2o6vN0NFMcOG2pdjZGWpWo1QQ5G9tx9UvM5pTamwcg5TOr4yOd16JmYTDjK2Fd5mdUuG3zIxFR8StIKI/Sd1ah8U+DGbNlVYAVb5OREJxQxVv6I5dxGC43CGWbpx3fB5wuFT3Jek6tv+LgBJaI9Ika79NFJQrLVMFbQgD0qU8YgCmLbxIJ4gxMBUgTN+v6PraIDHleYlpW3KVIiNxv2Ztc=',
747 version: '0.2',
748 creationDate: 'Wed Mar 14 19:24:49 CET 2007',
749 updateDate: 'Wed Mar 14 19:24:49 CET 2007',
750 accessDate: 'Wed Mar 14 19:24:49 CET 2007'
751 },
752 '47f73115ba2079f4b3703f502e3455498900a21941625c25d52ebb7da31055f7': {
753 header: '####',
754 data: 'pK+wAHWg4IJcixnFodLQ5EH+SFQIOMOrthx52u21WZ1ziRWJLSYGwA8CNNK8/welwzPHOPWu2El+zE6cwLHrzmL8EARLvvJ2fEK11ZIvF2C3R06uNrA7QFZr7iu6t67osrpfljqbjKQrMECUCUDrBywRvlpaeIlThfA3XByezK2HtbyHD1/xnyQSenUFu/6Zq1EkVdm9iCkbej2KxZSxA6qMl1WcnplBdOqBSmeGGJ0+Ikn3LZ7t4ztqflsug7QYyQlrmI+d0UB8MFWpf6jYjZQwf1rMH5XHFvrWUCi5IbFNJBUPF3n3IfUlrnjUSBEcW3tmodJa16/biK9/iKqh5ImlnpbQgK7CStgQ8ByJqddJre1idCiK/dyR1z+IXHTu4qm24cJeGUk7la4WMG2O5U/otFbXG5wTVgbLsxfXlE6fzxHAzvEftEE1ZPNOBpRZ+LVYEHKFESIz',
755 version: '0.2',
756 creationDate: 'Wed Mar 14 17:41:15 CET 2007',
757 updateDate: 'Wed Mar 14 17:41:15 CET 2007',
758 accessDate: 'Wed Mar 14 17:41:15 CET 2007'
759 },
760 '6564169ac5bce1a632c602c51e9e5d637bfd4e87c1fa276e2cf65f39405fc4c9': {
761 header: '####',
762 data: 'fs5hydWDsT/FxWTb57K6zYKwVF310zjHHHtRS/AeBN8XZqTcirhV9oxJW6G6TdDkD7nQfWf53AbsivXn46Tx7oarzoU4R+1mz94TRCkEe5X2X7Wa3HbTj38+QwbkomF7np4MUkVc06aRPqkUE5hvSDbGn4SyKCjo/AnGhuW/QJIqnWVj70tf7CNTb+GR/y41JhJd7yk6U3cIP6Imik+DAvM5pE0KqxGLfLs4c1ChuTFNHfiQbYjs3tANqJCO185t4S8UIY5VxMRcnqgRoloFK3uFACIXoyDGG3FjILgxRCw2ePFsrm2Jtxv+JX4BsM+KDk67OsN91rjQnK5vBP72SzSge4EDCKJXYKdA8KJGYNwRIzk5d5ycbZgW4YCizVw8v7sLMn60v7YrDfBwXAJvvlTP1chA7HoE+WALqXkfBW29AOCNodE3eTXbI7iWz3vcWOCPvSm3hho=',
763 version: '0.2',
764 creationDate: 'Wed Mar 14 19:25:28 CET 2007',
765 updateDate: 'Wed Mar 14 19:25:28 CET 2007',
766 accessDate: 'Thu May 10 15:00:47 CEST 2007'
767 },
768 '7674ea33b650e84f9a461a91928bfc259de5549ce905339fc3b23623c6cfd09e': {
769 header: '####',
770 data: 'D7mLcDpylLnklOtIw/kvYX0M+CR6Si2t8CB9bTT3ZR+bTpXP88OtI19g1k9iPEUPdgbtFKPVw4oNmynP3x+pc8R/zzn4v697SvVtQxdF39Jmry5dnB4SMx6oRkuaISs0nxvTrHJe8U+s5ehzvQ2WWxWZ+LaoBWaYR7slgUFKLdJFyWEalPwMPVu//DoLZeWg19n2C/0Sy8u0DGdYHJVserWrQqxxg0h0m0x1wuKhF7IGvqgyJ31T5w00nMHNZbs89cUuqB/2doMgoUD9BqV7F/53AveuBDcdCc6jlEe8NOdoUyMuhwwwTyKONfjY5e5Cu5W9I36o7GpeKlckoKrTIWFO+NLG8XZvP/f2WJCsIOrCk/LI3C+bxBP+bK4tHRH13iXLeJYUlMK4ibcf8WI445qNoggJSbZzGr7Dav23KZWPcxzRxhI2u6j25/kKGnu4kcMB8ke5N+4=',
771 version: '0.2',
772 creationDate: 'Wed Mar 14 14:46:36 CET 2007',
773 updateDate: 'Wed Mar 14 14:46:36 CET 2007',
774 accessDate: 'Wed Mar 14 17:40:01 CET 2007'
775 },
776 'b454ac54afb60c9bb6a1791843aaefadd8483630611c2bbd0ea37658985c62ec': {
777 header: '####',
778 data: 'u9HEcfobxZhG9BY3dVG68ZUYkREFcZ4q1o/xWyt3qje3icA+Nu9yCrZip/4fqe1daUX/MHyzUQdulIfjSwATjj3vvDSPjuGvrtx8oUjJ/K6GFsL366ozi45LkqkOaH02/nVrb+ik2HWIgcne/OzNrwf1mWLJoBF+8ZwQ44xqQK7ikG1mblNWWbZFFQE1B0QPmE/I/1ovm2hAr1ZsNj1l+N96hwGsdsdVFTzn+S7Sg8GTbxEFAxDQkBYEw1k/R8i9EIBndPoDZCebr8vP+c8qSEk/YmBXJ1MGVVvic0/Utn67iNLz9aBnv2z31DvvBj8bIwOxQpB+tom5Ivwe84tFkwwvpxFqYccrEg4bbMcevUo67TBVe+Lb2wzcK0zOr7iHhswbXaLzzOEQ6uF/v2ibTbATP2zNq09AIJjynoSDmrisGHsBrHgeXjiDspc9U70PVC83EsjPRwA=',
779 version: '0.2',
780 creationDate: 'Thu May 10 15:01:21 CEST 2007',
781 updateDate: 'Thu May 10 15:01:21 CEST 2007',
782 accessDate: 'Mon Jan 19 16:09:54 CET 2009'
783 },
784 'e699fa287c2de3d483144b48064a47cd0bc56a436431ce23b48cb8d8c42ce851': {
785 header: '####',
786 data: 'hVD8NOt8g/DIe48JbUUo77e2hMf2UBN6ah23PrIzGTpq0LifC2K/0/s0yeL/PHUOncdT56NccKpF8Fp6EWJqDKoKZPWASuB1vHCEkdbcxlqzqo98VS3A7p2JFwQzSv+5t6y909hhbxobXMCUfZ10HBqGo6TaFc6+pkYqQ/d7MEnj2NuAXC9X9TLLuZSrZ96NCKGr8YVKzxinxHdiF3TdRvIppFByXPlbZ3xiielEnYm6pu/GffW7Hkwd7Vou6jwyggxVqvoVtuAdiIy67l8GX0gQUGipFkvvrAkXfm0sgtWGQvpgDuV/bXq/L5vX/sFpWI2u066lMUOsJQmptNP/Nkp31+ZNk1nCcUIYDDa6vcOy/gRrOFcenPTUQjRkE95KPaCqYBSIWsjoFE0EIB+iBnBCTK3laBSC7pplOtuLCY1YJcJuOkzCVQCVXjhWrNJM77s7a5OyTuE=',
787 version: '0.2',
788 creationDate: 'Wed Mar 14 17:43:29 CET 2007',
789 updateDate: 'Wed Mar 14 17:43:29 CET 2007',
790 accessDate: 'Wed Mar 14 19:23:51 CET 2007'
791 }
792 }
793 },
794 'f215d89bf4583c12f5ed4f4330f488dad3fffa448f4dc784f15ef135dda2c732': {
795 data: 'vxOgJv/v3pP8GFqbFLTcgtBqw8V3zhCN9rRXUuWAfatABtr3pySWvt74ITeGw+sDtApBsu+zTY/95BFVtK3y0QJkC5cjJYhLDwvMwpqa0lRfCXWSYmuEhbPETwkW1MN0kAEOMqsUD9cQCH9GDD4A17W89AoTG5Ce//X03YBG0cDjbotgENsWjQpK88LXABHBQAoTF0BPDjN+xai2QPCgN0l1IVpUzI87oZJS7x/4r6DjGTOgcc3+vtEujr+8dGNaq9xTEfAFs1kv6GMeT+R/VkIQLVO+vSxi2fd+954EAXQplt047+aZ3c0c78N6B+GhSi9DgNnbTLu6sl332Zdgo9R09uucS8nvRp3HcTzxriKpx0ZMDh9K9ig5NT9Z2H49pDjCJKTukDU7b2ktOEUNZt58s+uIlw1bMFY1TMETGAHbTq+hld8Szg8f7nJGDQF10kV2ykVEQ2oUBMC9y9VCLyYD0BWId6DUcTNXyI+MqAC4j8pp0NhURY8VSjtnV4Rlq+b48ahP/ifJdq+xrSiT9ykGqc/EyebC1uCTIZewk9MtIAndVYPckMIe0xQ2xhX6/m2bdNboVa3dnS5eKFdbd++un6FD+QAjgtcBkXQnwfptottZoghclKL5h5gPePCQL/66CLYy5+3xctfCG9u+VkH97JKL2hW+XZ/KuxLPFkIAYmbFKsNdIizfpbk5WJvoSzacpo1mwNjZ53zn9xhy/VkSIz3lGl83a6FyoHuR9VklyhTaKrj2JNWzjLaQPiR9Sv2eFNjLTivxtxLwKae5Tz14WU2QlXATC5xdcLeF9nK7yYVarcKlRsYkkvetrVpRiWUVfy9mZQIHOWJtY5AcptKso2Q0v4CuD1C/wV18DMDXzwMXeOq0cKxCsZOuWjO6RwWKzfeZnJ99S+EsFmdI/wxqiu9slJ0xXvgLvjiJhJ03qWwZV45peU1qmvKQrXS80QqLp3kUfRGLbZNOvkZbyf5OK96MA7lok8PuCZGg5jZHFX4B3vxSQ32P7VGSWO5CqHpF45YwtlONZKB0cuvKTRazZ+B2zJfwMYRQloj6sL5501oPqmjVtDg+0aoqKe5DmTf+fHV4FwAxQ8RuW7/BVL+lwf+zjtd31I/yrlDdb/Scs6yayLV026yuHxdQRl+ByogtrXbY4ViuU3NCkVrme7K7meRHnQdXyidhjzHdoJnRPa0IoI4VW3VwWNENRRNDTta2whOdIKsQYtscWBWZnQplRmDChGikERYQVCWejDNgvnbnGrlyQYPF0/vcv6PoDpIvh7Pze9y0MLBU8DnWqAhpdqHPNVdjdq51OKlSitUk5TSN9kxePe0KNFZueLjxZHUFIZ+SIkTxoCoaRWYMJIWvYkcT5S9Y/7NbdapuUaLZNGDc6tgD+LVYRRvGEdPWaOHb7G+qOmdtx8vYxZUqq5mtwnIBRzEllTJyKwwK/kOfAxiRjLxf7SOXsubPuA7bHR9fI5rROSR5rcU+nOfSV9Wf4wZkYBlSmQYqzQfmwl0UCiipJVa1DwYwLimgo2RqhI0M38gEH+mrknnevE8zlUIaEWzxoOnyWbtCecakXS2XvE9j64dswJ3bbeQ3fDQr1308x9qKSjFdDl3eNcJx2e9YwC7wZnTmHeHzRXnZwXsJXqMPDQV99wEDBr71BjlDjMx7vG9bOWrhsyJ37EOvO2X41Ij3j0X4MYpbNgxBFP6zJSu3gILrtqQRpQq6mQJ1bWHyCN1ge1zKNT9pG6rGTRPE9LqHROQuROpgFM1R+DqW4XnGOBYSOtznnsnj5fxfdpGeFq+v/ftvVuN5XsgX6dnT8R77iNUs86Iz2mkxLaQokkNzXl5o1rnQIse9+kcKVZ72mf5SG9s9DD7cZ7bOtmkuZCexJpieIosqLV8jc0IA',
796 version: '0.3',
797 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
798 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
799 accessDate: 'Mon Jan 19 16:09:41 CET 2009',
800 currentVersion: '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74',
801 versions: {
802 '33ce5a03b6d36f59d0fbc9445dd01a515cb56eccc6d854cffbf8aa66f3e4a45f': {
803 header: '####',
804 data: 'pwMmqFOwpW/uSys3hm/AcoERF3eDj4dO+O5SdYsR2mJtmEfXcjhS9altLhVOsck0KMQJdxE3rNDFbduF35yVetXuQrrL+bSRlXMq03EXETyrRzIVhFEM4BjoCSS9nKGgixp04Ve9WSuwD4cXRmcN/L9kCJSCqflXqhkYkjAywQoj1KxHPdAqMaGRpEWioUIfX+NiWbO/qtOu/USAhHmWFXla6/A9kKQeU2d+P3zl9KF2Zm8qm8NXjPKmh2dkd70ATbdzxt9P3BafoRf/Ud8zLIVdQYTbv0pn6UMIiUDRK1ryvgfSY180zg4qkP5pBnxhEgOxbjT8JO6hCl8n2jUCRJLdUXHwgpeuHcKYDyZizc+p9Kbc4+d8K/2UEKgSR6gza6Cpw5TQbZQq+2LxWUoVb3HM3lTqBKUPM0FdY2/3twZm/1bI1uBMPnyp9x/JsQV+xOpu0ZulTA==',
805 version: '0.2',
806 creationDate: 'Wed Mar 14 17:39:39 CET 2007',
807 updateDate: 'Wed Mar 14 17:39:39 CET 2007',
808 accessDate: 'Tue Apr 17 19:09:44 CEST 2007'
809 },
810 '686ea579db132287e8e322194652ec57cba6e60274c00f734db7a0b36702c817': {
811 header: '####',
812 data: 'ilf8U30hSq2mqje9kZkKQAMiEFV0aptXrm8fOtoOR8pp36V29kXyUX6FEOh5eXSRr/jbqGytxKENJeAGxnsv5U+8GgbvlYaR4MPM8lbKcpAoBCc0+CCOiwnp4XCoXFCNttbTzfb6qgR7wqdK7YLnrvfzJieQqJukQZvtWtsVZB/Tis+5niomz8Ca8lo/FjFOIjAq6xtwrW4CS12+yZdTKNbj8e+HwoUcesF9RbCKQlpVHuwhZ/8ghdzDgjEE8z44rDepEv3Lx/aUi+67velLH3j+1crnxBUz7wP/dWzftwWgIxDkCR/vW63yY2Xebt77swDg8g1Qj5OJdYiAq231HKaZjxr10y88JI5HC1EvbbduDN6pknKUgM+qEdojpi2BmjK+9MtV7sVhJoWqwHG8q9z03kgGoFnWEb53HyMVes1n6HYfzwnw+idPFWGZJ4IB25WfJLfQuQ==',
813 version: '0.2',
814 creationDate: 'Tue Apr 17 19:12:39 CEST 2007',
815 updateDate: 'Tue Apr 17 19:12:39 CEST 2007',
816 accessDate: 'Wed Feb 13 15:27:04 CET 2008'
817 },
818 '6cc9ed382347f8ac5b5073f459428897d36cc9913947d003da874dfaee5a7b74': {
819 header: '####',
820 data: 'l18dnf2TRfinuu9KDraIo41yvG3mNFqiSCOkyMI6WZZD4RnF8R2Ob19fJ8zXv04eDx7TYyyGP1IlFWEdT3LBrOmmbtUmIvtYanIfKTkT6UGHNH2jh1HyHqJbpgIlr67mOm6Es/AgF44BiyJrk5R1y9tA90oeUQynMufiM2MFLpdalDYWEh+W7GV9WCmbBIU/soioTJ1ep2gvy4kJvTSrXENaxHevKfYwn8ucocvY+hjkWB4GWOR40qtaG06wWMLeRsrTBH1jBG9srzbBa4u2IQ0+NJjQrYdiu7nfu6Uyu7Ya/4bxV3Sukao91XvXSFIhcI2OuKl0njUshv6BDEfHwXIQuPtn7KaTx2uYl1pUeTv/tAFvf8Ng9OFNgK0siIMkeg1thFwRiGSmxjP0QZipDtcCekIxj2k=',
821 version: '0.3',
822 creationDate: 'Wed Feb 13 15:29:04 CET 2008',
823 updateDate: 'Wed Feb 13 15:29:04 CET 2008',
824 accessDate: 'Mon Jan 19 16:09:41 CET 2009'
825 },
826 '7ee6a662d1980467eea86a58cd7299ee02000740693df2a7ab9dd64347dbbaa4': {
827 header: '####',
828 data: 'ZnwtGdkg72+TQKCJQhZQIqP9sz79FcptnmH8VJEDQY9xTburh4cyhgbgROBis+awp1C5OyiAAoWfPnuRAN8Ai3d9f8M8yjnDGJ4BAJ6OjQ5r4RDQxNycCApXWO3mJpBrx56wMsCVWT6Z8a4khzPrf5HlDtus4lRV4GRdhU9FMpwuaCfgVD38MhlYXDaPgyu/8N+6eQHuFxquXjOJmptfO6tVhP1+/tEHo6iUAX3sXMZAionssRgPllQJxfzrsu7GQk3h66PakRzgStTHUCcdyoEe9c4VnvUgaasTbhENA4x8xPrxjo24zwxfFpWNEb1+pe8N3+dOXTsIdd3CMKrxQ5KkwzyN/Bj9jXNk9YX8PC0geJiR3bCGtPsAd7aEFB7E6y0RVX/RL5f6x0utSYw8mg6lfprlr5A=',
829 version: '0.3',
830 creationDate: 'Wed Feb 13 15:28:28 CET 2008',
831 updateDate: 'Wed Feb 13 15:28:28 CET 2008',
832 accessDate: 'Wed Feb 13 15:28:28 CET 2008'
833 },
834 'c860f9bbcab5fa70854212e18c11a3e9bdc2382f91cfbd25636955c443a05f8e': {
835 header: '####',
836 data: '1rztZ6mKVFVjlL1kEoUsXEMketdElGbOpYK9iy3g1/WeMcTd4D/UjgHvmQHzzNuYJc/yx6cCMMU9dofLe3vWLKhqDAPAVCo49qiH527hP9rQE+0SNO1v2Ymk80hL/gqBfju51bIYxPKAD0uYA+GMX7OdL+S7qdealebERcnVa0K1AHiVU8lu5yIKk55U8zwitk0u86J1zwcraiM3RGXir/x3oZRIKDwT+lhUJPr8GbVjgKlPu07Ii8OdrAGdHefETDlyNnaKPJHTbGXkd3HZ2CYhJCQZGn1Hwfs46iRd5aO+3UErYtgIHl6CXuXd4E+DNW4UJZedP9YV860DBkpqMiQokEMYTh8Y2sOUyf3ZEOshfGvJUhj8O5p7rNm4+2BYO3XhREdV39tn4vUj56wYj+GL5CekEl0c4Mx7ViTQA+gLvk52V2w/5gFyFNQ9U+jUQpb2n+d9cw==',
837 version: '0.2',
838 creationDate: 'Tue Apr 17 19:11:33 CEST 2007',
839 updateDate: 'Tue Apr 17 19:11:33 CEST 2007',
840 accessDate: 'Tue Apr 17 19:11:33 CEST 2007'
841 }
842 }
843 },
844 'fe21497ef7435d31f9746c132e4b5ecf5aac5f13b5961ddb55d2bdc3409f28f6': {
845 data: '4zgqvaaWm7nJO09LKN6o5hbWwGzOv7VVmXDu5T+JCHTSOXbteogax2Zrv0uKLkfooGFThJBk0rXfXxE64vMOq3AeHXGw7Chg7hz8Z2Lpjr4FfE6q7Em7UuAlAuL1PiyXXJJK5iSsRY9tkizuYl19aXW+CgpPznYD/PyXgeYxqt9WLqK8cl5iAU87R0cQDhwl16ivzVgiiFeaB6B5FQqWBAHCEgXhqTsaw2gv4snbmPOqcUZbHy/Vb9hv4lPBJwGFNxQzeZUad92VBC8YbIjmbohDsXjteqD2/k1qOgpUB/U5BpyVwsi+5ahgb8gbS+AqYoRDYzkaj83ksPI4JzWyZhpqjhDauaI6M7hGnJ4GB8UZc0M3WPgrlf1r+TXCgpcfembqL1MyteM+C+ItPRP/QdaIXxLOmvGFOBKQYEI7UceUWBCSEzORlS2S2lltlqt+K4B8QTULiKaXCfRmF/u60FpJufIkUX0pE/rQVChxswSWvh7uJFDBIDx8MplTX724A7DN5d4/Ad4Yi2cj3V8X/DEErnHTvirP3tZ2F2oAe7kIdu+JuCqKcMaGB4hVijzv+yim2TCPvrGTFaMmg9PvcWHpik9jEIabCkdqAR8EGIkD29+yvG4vD0DTRKv2vPIfr60ZQnsgs8nlPPoNa6lNHvI/EO0nBGBYBc1TW+syV5h/zOG3rHX0XCHhISZmDMjra7eUETWChncR88P7ciC4yJQtzXFGzeXp2ktzZ8m5g1EQfgtlUVZsHN8e4OQ9DjKt0unfq5RFBj2jlG8TBZn6ZpebxWR2qOxp81KQLHJND9zRTy3h65+k5wo3MnnxE3GbeXg2dFIORRvGUT6bWsqW1fqR/pg1GO8KNtrt3CryZofgE52kuk6hlcmSk9974JR5523+1/hbts8n5VrTi1C6GWhnxpiJb1XIvICdag5g7C2iYppzLKVzbJcFMegwDUrapbmGhkqnGwSY1EQSDyagPr2xlziWhdWdCOVAYcyw8dOpdD97QhVef0OWrJ8nbgFKD6wn21475OFxooheWiMCyZwXqESVG1cVCjeaCsymBtEVPpmQdSkOfMdXpKVF+3osb4K2XDpPeU1zPWVozeMp68YhLztQ/g==',
846 version: '0.2',
847 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
848 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
849 accessDate: 'Mon Jan 19 16:09:30 CET 2009',
850 currentVersion: '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a',
851 versions: {
852 '1b12c771a7f5f13d13f12016ad4132e9707be2ff00d72f77356204f0f86fc08a': {
853 header: '####',
854 data: 'QfC77EWgmmnxz9JqLdn9Tw7mNztfQZPdNpaML03EdFpphsjgLloqBRX0UZ21oozjQGHpcUMMOsaJgzCuDlfh7T7ePVV60Ps4AJtzv7bHSVGKsj1iALU1qjtesOYJayp8bA/3peo4HEnVgP86jc5NTwJxpsUhNG0Ae93xVu4lPF0gL0/yjgZUHqYZXkb+oXrcybL0BSOjRnB9fRpA1dEhcwJwoelLTvg7il354qp/Wo+S9Cz5E/K+xnlJAuSXCRXboWea/ZZ9TX88q5uUcY5jLF7Xi2HoFVZw2f5tbycxwGtT1CKXp+OAKn6mQaBAYM51zoMNDT7MvBDXD3v4Cidjgh24GZ2zndfkYT0kHCtY7OVIVSTsXTR+5/XMedojVvDlX9LBa9ST99NLCUy7Di94rJtX72ev3Ei3I1w3qPvCl3jgD2VbIwLogCzqLtY+2IkLAa8M2EpX/D+h',
855 version: '0.2',
856 creationDate: 'Wed Mar 14 18:43:29 CET 2007',
857 updateDate: 'Wed Mar 14 18:43:29 CET 2007',
858 accessDate: 'Mon Jan 19 16:09:30 CET 2009'
859 }
860 }
861 }
862 }
863 }
864 }
865 },
866
867 //-------------------------------------------------------------------------
868
869 'test_test_offline_copy_data': {
870 users:{
871 'catchAllUser': {
872 __masterkey_test_value__: 'masterkey',
873 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
874 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
875 },
876 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
877 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
878 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
879 version: '0.2',
880 maxNumberOfRecords: '100',
881 userDetails: '{"records":{"index":{"8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13":"0"},"data":"Ki9chN/ker5c+7zB5NinstllVq1Vs+N5pezZIohKVVa15VLSIyre3DRilRoldy/94LbGaEM3SZsMlf28hYbWySln3ekNMIB+MItaYb8urw+8U6n8+QaRMAClHXukfi8te2d1OIlgjbrBQNMmzBorjIs="},"directLogins":{"index":{},"data":"54KM7x3emxWZH4CQDLBj4SkT"},"preferences":{"data":"AwOQXmReKkLpp8qZa4zjaWcY"},"oneTimePasswords":{"data":"YgSYIsDeVT87bfiASQqXA2E9"},"version":"0.1"}',
882 statistics: '6Kupec1ZD7Dw0WzK7pPesnLE',
883 userDetailsVersion: '0.3',
884 records: {
885 '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13': {
886 data: 'dXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
887 // data: 'bXql3HZJQRpvwOe56SgzbbpMoYWRBjEp+E8uMJT7tprzYJ109H1SnxRWWiXlDOzH2XfoXahP3S59K7rHeJ+/icX+ZrsOvp3YEW7wdoEDosyvrQuxrmHdusZ3BeaFIhQMmK9wqpAzpKCRrz30l/yi81zNpLgTXLLK9fiAyksmsfQL3VHgQg==',
888 version: '0.3',
889 creationDate: 'Tue May 05 01:28:36 PDT 2009',
890 updateDate: 'Tue May 05 01:28:36 PDT 2009',
891 accessDate: 'Tue May 05 01:28:36 PDT 2009',
892 currentVersion: 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d',
893 versions: {
894 'a22bad10653a70ec3287917bc23d642fe698042cabbcc1074b60122cf2bb9d4d': {
895 header: '####',
896 data: 'Pc18C1A9NwNlecbOtOOAEymNZD5oq20ZvPqMfiCyNhkcmaN9sEnifF31epZSjpDw4XM4ex3HFhhITttXlCrossDVYB8z00k6XsFruCkdwFRmBjb2PdrdZFAkGQeS/8xTarYWgiflkfGocGqVm6EUq1gh8QLE173Jzo15LOSuzuSS90BTMvcsqzzRrIEe+9jwF9/ehLyQ5yYxNImFGQQ2jkW0KiZsjyEbQAGry7B1/AiSUBaGYHYzcB3bFgXnzC3ecPwL+ENZ+azpTd143WneuVMUJrWNp3S+9ZRzboRzcYV6Ax3nOLPS7LTc+e9j9s4CrPvc1L6pG23AzNByDWst0JrqhN37yp67EVVrFQfUDWcKgZyyA/M82q1TVScx+I4A+g9ASC+PdQ3+M5+EOtEfClkgYJFqzXqwPKYwBv4CBKxikS2Vt8x40271kjmVYyGQOIRTo1UKn6u07TS5hxdEgEI+WdukG52813USiD8bQFbN0r4VhjFSqKMAJoItjqvafBNBl+OXYQ1p1zRCXP7wHS4/F7mvrK98gSuIsBgfL+/q9rExXaxIZJNSbs1HGAXR1TxYSvyKZvLa',
897 version: '0.3',
898 creationDate: 'Tue May 05 01:28:36 PDT 2009',
899 updateDate: 'Tue May 05 01:28:36 PDT 2009',
900 accessDate: 'Tue May 05 01:28:36 PDT 2009'
901 }
902 }
903 }
904 }
905 }
906 }
907 },
908
909 //-------------------------------------------------------------------------
910
911 'test_test_offline_copy_data_withExtraVersion': {
912 users:{
913 'catchAllUser': {
914 __masterkey_test_value__: 'masterkey',
915 s: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00',
916 v: '112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00'
917 },
918 '9a984e219b07f9b645ef35f4de938b4741abe2e0b4adc88b40e9367170c91cc8': {
919 s: '55a27b18e8fdf1fb5e5bcf859cfa50fcbc69c9a41f04e371606a86411a98f460',
920 v: '983a6c79e7d5d490c3f13645c49760180fca05cc677914bf60fee009ead5a65d',
921 version: '0.2',
922 maxNumberOfRecords: '100',
923 userDetails: '{"records":{"index":{"75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53":"0"},"data":"YjlNzXUO9m0EXdi5fUguA6RjR5jc2mwuHkpMsHAheExR2zpoV6OJx8tBTdUGqDBAlbIn6xUx2TT+dzgjic/XubgKNsv6JpTvnfiW6ZMWiebKXVigoZw7L5EvmcHjVLI8aoIhVEj4ADwkh9qHm0Kt1zFGQPwwJfo="},"directLogins":{"index":{},"data":"4W5csD8DxlxeXVRROk7wVbXi"},"preferences":{"data":"/DjOoFcgquxUbW5ye2LrpsKM"},"oneTimePasswords":{"data":"DEqkd74lLAGtG4YKRPniBNBU"},"version":"0.1"}',
924 statistics: 'EkRr9wEXi/WOlZfCXphn9kfx',
925 userDetailsVersion: '0.3',
926 records: {
927 '75b61c51726a35d1c12ac553947ff9e974d1a29339f87fbeee0d831b59938a53': {
928 data: '/gtNfde5l2J9eeg+rlBHZtqO4RDaWNQwaMEluOVowKdUlGAYjo9FU0NwKsA9CM3ST4sTYl0mylP3C/AGybO8/9sTCkEn20wi0slharA61Rk8uB2lNjCICZB4l3ZGvD4AHKucu8YQzxpWop5dTN8f4us5eJ2VjvJPLqUzSKZL4g+6MiKbjQ==',
929 version: '0.3',
930 creationDate: 'Tue May 05 18:47:53 CEST 2009',
931 updateDate: 'Tue May 05 18:48:59 CEST 2009',
932 accessDate: 'Tue May 05 18:48:59 CEST 2009',
933 currentVersion: '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b',
934 versions: {
935 '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564': {
936 header: '####',
937 data: 'MZGx+tQAecxJNl6UbWHIM8g416Qa8DfWtGo7f2vLkPBbhsr20xnZ233oPqIGceG5/6WMssQd9c8U81urISK+4Ar8zHGUxTdIYLZaDq33Q0uF5vO7OsaBcjL7m+tX7zB+e/eu0ABbqvt+saMsZKKSdIZv2KNbAg5VTiL7GjWuowM23tWgiUBgX3eO5fnUUQWVkBygk0qy2O45oNfb1XcbsGMCfS4YPF9GB/wGSQKG8keMoy1ZWZh4nG+Pdx2ymIrYKLv8T+i7jtWEbyhvEglb7TadCMBBF0pnkYvG3F29skWooZC92dy5213o+3/uSKi0od5tAbvSYZHjT5hDulUtmjRFGq4ZRERLqvrZs9Sg8G2mjtf8Ta99Hob8WLxyGF9x7s1LcLPERtdsP9qCD+I0WtwrDiodl/sPQ/5s3G2S+M/YejKXBvG3AWwoO1gkdhec3+d3meFNvCr0hKNzotrHmDLC4tGyZIaAcBmPQ8xSD5KmNJJFU+V0QIdiEYKnPjo95oSmKyK1UtIoPrWCahfYSKXh+aW53XnzY4JKHRER9vWwdJzz',
938 version: '0.3',
939 creationDate: 'Tue May 05 18:47:53 CEST 2009',
940 updateDate: 'Tue May 05 18:47:53 CEST 2009',
941 accessDate: 'Tue May 05 18:47:53 CEST 2009'
942 },
943 '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7': {
944 header: '####',
945 data: 'Y38v4jhKwcsW8LDTigIhtdLJ2zgv+1rSutqyu0AilBQeSTe4D0rnapZZTW/mNnD5IGpWKFoEl8+WGj1zvGzleNdkOa08nWJEYDNe2h0+FjBSHBUAgH5fraezomRWzJ/Z5HHFiZuFfpjt2BHd0Y3Not6AuL3aBgjjkEai90r2o59Xr70maUwo1UqmtVg3gvX067MC3hlqhNIp390J8LFiSj8Z4US9x/WzVR5Xx069+0PFMBwipq9WJPrcfTPwvP6xVa+J8BCJk3HtboRutq1ZhhHpibm+TY3Xl3gFTTCHWDZCSJ4Rm1dWkyqpx51u/AVg2TC+ljFLKv7hq3euVZNMLNMY2BqoCkcb+w6dFLDs3WfPAW0aQN2P++GFa/eVpN90YxAeXufjsXKaArTMjGWKiHqyU1iVVI8N1QEiFYjjBV1GvkJxog5PjtAzJF++qwHDIa+gJ+NnOfenVF0wIRMCEnpGyvbg3SkUoenKFoHO0IcSP2CW2RWV/GAmiEZEuVD393mKi5B6fpjdO9JVPNyz0i0kW++dtzInwPnglhOAY1ywT0ExOBLIEr8=',
946 version: '0.3',
947 previousVersion: '0311012a897262b85b60a316f086f0576caa3c11a34779c02ad9e60232c79564',
948 previousVersionKey: 'f45/Sx3jMC8CgdT8cjfcC4ApA8xMXABFO48jiTh5VjJfTlVqw3NnHRO2KDBIhy0znPvP2AKlpKQHruW8LQno7YLyhEIXh4ChjMUjJsFFwB/LUg==',
949 creationDate: 'Tue May 05 18:48:11 CEST 2009',
950 updateDate: 'Tue May 05 18:48:11 CEST 2009',
951 accessDate: 'Tue May 05 18:48:11 CEST 2009'
952 },
953 '2c913151cec0422dfa51c5bccbca6ad09d8e195bff144d2b5f7a2da3bf55c11b': {
954 header: '####',
955 data: 'tkiW41JHOfbYOt2KHx1HtDJEzxbfVS1Y2HJQqdQZ73zhvxnkWLw/X6FMiBexLeoKXO1H9NIWS884MzEO782vg8QRxTizg66Yye+q1Hox+QsaEoaD4UQ54XV1duTOB/XS5P0P9DFvtIz9msEu8GJrvizAdxu/7FG2b5XfENDkwqIzydI7JMfGC0JzDnfGvYkWqoL8jx3Joxa7TNqN4he4v771Ho1ZoUv3Pp7ZGwBU+btl6Q9mcycSf5KXdTw+6nDjfQh8qyts/u7O5xPFh2Yn8zS48x95I4SA4yFKtERU3pLAxIkcZWVb17xT8xlbPESreZ0RyYSR0CgW0wPMxkLHH1uqWycTa7yIxUhyn+JK9jCl4eDa/KUSGbN1yb6pOyjGuev1vHEZv3bOmO52RVVIdMHTe3LezCKY8xpDqtQKSfAvFg1TmabugXePXB+KvPbDDWI5otDEIwLYhDFcSn2FyqUEATSzeU2o1uXO+ffbU3QBrwr27tsreughWSP7905FQbEEshsRUc2Xt92WhTnVM6W74Y0bMLWjTrXbu+hNsjtFYYN6gtezcltnB58MVw==',
956 version: '0.3',
957 previousVersion: '214d184d75418af71d18f412bc6bb153fd6435a4a675af6bf2a744ecbd7a53b7',
958 previousVersionKey: 'XtJ8Ub99GXIkxErIPr0HaIrRqlAO0Naa/tPwUA51K2D5R6R3CR6QbHd3GpkCnu+y+bcEIRYrQqgabi3LROYT+1SZ9B9FctX6FyaTjYEazFdCvg==',
959 creationDate: 'Tue May 05 18:48:59 CEST 2009',
960 updateDate: 'Tue May 05 18:48:59 CEST 2009',
961 accessDate: 'Tue May 05 18:48:59 CEST 2009'
962 }
963 }
964 }
965 }
966 }
967 }
968 },
969
970 //-------------------------------------------------------------------------
971 'syntaxFix': ""
972}
diff --git a/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js b/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js
new file mode 100644
index 0000000..458f2ef
--- a/dev/null
+++ b/frontend/delta/tests/tests/Components/CardDetail/cardDetail_test.js
@@ -0,0 +1,51 @@
1/*
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22*/
23
24Clipperz.PM.RunTime = {};
25MochiKit.DOM.addLoadEvent(function () {
26 var deferredResult;
27 var proxy = new Clipperz.PM.Proxy.Test({shouldPayTolls:true, isDefault:true, readOnly:false});
28
29 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
30 Clipperz.PM.Strings.Languages.initSetup();
31
32 Clipperz.PM.RunTime.mainController = new Clipperz.PM.UI.MainController();
33 Clipperz.PM.RunTime.mainController.run({'shouldShowRegistrationForm':false});
34
35 deferredResult = new Clipperz.Async.Deferred("CardDetail_test.init", {trace:false});
36
37/* * /
38 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['test_test_offline_copy_data']);
39 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'doLogin', {username:'test', passphrase:'test'});
40 deferredResult.wait(1);
41 deferredResult.addCallback(function () { console.log("SHOW RECORD");});
42 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'showRecord', '8280842f41162b673335b63860637e8472e8bbff0efa2bc78b0dbc5e09712e13');
43/ **/
44 deferredResult.addMethod(proxy.dataStore(), 'setupWithEncryptedData', testData['joe_clipperz_offline_copy_data']);
45 deferredResult.addCallback(MochiKit.Signal.signal, Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
46/**/
47
48 deferredResult.callback();
49
50 return deferredResult;
51});
diff --git a/frontend/delta/tests/tests/Components/CardDetail/index.html b/frontend/delta/tests/tests/Components/CardDetail/index.html
new file mode 100644
index 0000000..7f4752c
--- a/dev/null
+++ b/frontend/delta/tests/tests/Components/CardDetail/index.html
@@ -0,0 +1,169 @@
1<!--
2
3Copyright 2008-2013 Clipperz Srl
4
5This file is part of Clipperz, the online password manager.
6For further information about its features and functionalities please
7refer to http://www.clipperz.com.
8
9* Clipperz is free software: you can redistribute it and/or modify it
10 under the terms of the GNU Affero General Public License as published
11 by the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14* Clipperz is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17 See the GNU Affero General Public License for more details.
18
19* You should have received a copy of the GNU Affero General Public
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21
22-->
23
24<html>
25<head>
26 <title>Card Dialog NEW - test</title>
27
28 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
29 <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- user-scalable=no, maximum-scale=1.0 -->
30
31 <meta name="apple-mobile-web-app-capable" content="yes" />
32 <meta name="apple-mobile-web-app-status-bar-style" content="black" />
33
34 <meta name="HandheldFriendly" content="True">
35 <meta name="MobileOptimized" content="320">
36
37<!-- link rel="apple-touch-icon-precomposed" ... -->
38 <link rel="apple-touch-icon" sizes="114x114" href="data:image/png;charset=utf-8;base64,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">
39 <link rel="apple-touch-icon" sizes="72x72" href="data:image/png;charset=utf-8;base64,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">
40 <link rel="apple-touch-icon" href="data:image/png;charset=utf-8;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAIAAAADehTSAAAD8GlDQ1BJQ0MgUHJvZmlsZQAAKJGNVd1v21QUP4lvXKQWP6Cxjg4Vi69VU1u5GxqtxgZJk6XpQhq5zdgqpMl1bhpT1za2021Vn/YCbwz4A4CyBx6QeEIaDMT2su0BtElTQRXVJKQ9dNpAaJP2gqpwrq9Tu13GuJGvfznndz7v0TVAx1ea45hJGWDe8l01n5GPn5iWO1YhCc9BJ/RAp6Z7TrpcLgIuxoVH1sNfIcHeNwfa6/9zdVappwMknkJsVz19HvFpgJSpO64PIN5G+fAp30Hc8TziHS4miFhheJbjLMMzHB8POFPqKGKWi6TXtSriJcT9MzH5bAzzHIK1I08t6hq6zHpRdu2aYdJYuk9Q/881bzZa8Xrx6fLmJo/iu4/VXnfH1BB/rmu5ScQvI77m+BkmfxXxvcZcJY14L0DymZp7pML5yTcW61PvIN6JuGr4halQvmjNlCa4bXJ5zj6qhpxrujeKPYMXEd+q00KR5yNAlWZzrF+Ie+uNsdC/MO4tTOZafhbroyXuR3Df08bLiHsQf+ja6gTPWVimZl7l/oUrjl8OcxDWLbNU5D6JRL2gxkDu16fGuC054OMhclsyXTOOFEL+kmMGs4i5kfNuQ62EnBuam8tzP+Q+tSqhz9SuqpZlvR1EfBiOJTSgYMMM7jpYsAEyqJCHDL4dcFFTAwNMlFDUUpQYiadhDmXteeWAw3HEmA2s15k1RmnP4RHuhBybdBOF7MfnICmSQ2SYjIBM3iRvkcMki9IRcnDTthyLz2Ld2fTzPjTQK+Mdg8y5nkZfFO+se9LQr3/09xZr+5GcaSufeAfAww60mAPx+q8u/bAr8rFCLrx7s+vqEkw8qb+p26n11Aruq6m1iJH6PbWGv1VIY25mkNE8PkaQhxfLIF7DZXx80HD/A3l2jLclYs061xNpWCfoB6WHJTjbH0mV35Q/lRXlC+W8cndbl9t2SfhU+Fb4UfhO+F74GWThknBZ+Em4InwjXIyd1ePnY/Psg3pb1TJNu15TMKWMtFt6ScpKL0ivSMXIn9QtDUlj0h7U7N48t3i8eC0GnMC91dX2sTivgloDTgUVeEGHLTizbf5Da9JLhkhh29QOs1luMcScmBXTIIt7xRFxSBxnuJWfuAd1I7jntkyd/pgKaIwVr3MgmDo2q8x6IdB5QH162mcX7ajtnHGN2bov71OU1+U0fqqoXLD0wX5ZM005UHmySz3qLtDqILDvIL+iH6jB9y2x83ok898GOPQX3lk3Itl0A+BrD6D7tUjWh3fis58BXDigN9yF8M5PJH4B8Gr79/F/XRm8m241mw/wvur4BGDj42bzn+Vmc+NL9L8GcMn8F1kAcXjEKMJAAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAALFElEQVRoge2aeWxcxR3Hv/OOvbKHvWuv7V0fcQK5E+wEm1w1OZ0Ek1BCARUhWpUCalGl0pMeIKBIFBVVolWJkGhpGiBAoCE0FaQBnEKUg6QkzmUbO7bjIz7iY+9950z/2F1718eujd1KVflp9GTtzux83m9+v+/7zRsDX9qX9r9jZJrjTSaT1+vNOEsg4L927do055quVVVVhcPhUDAYCgYmauFwaNeuXdOfS5jmeFEULRYLpH6AgbHxO5mtRqNxmhNh+qyMMYBBk5NYk4kJwAAjm+g2pmLTZQUAMDAdjMYpR2MxMDr9xMAMsQJMA02wgoEBYAABAViMdQZshlipDqYjFg/ASBiwGKueGhhf0GYqBjTQGNCYqGUMVKN0Blw7U37VRvw64t2YMegqo9r0J5kJVqaD6aBaEmhykjFQFVSf/jwzoVm6CqrFWTGcScN5xqCrdCZYuXE/feihh3bsuM1kMk0GFroKpsUbVeNXmrgyFVRlk2N15+Y8+M17fvGjh8f9dhy/ulyup3/1VE6u6+yZs6/tfX3fvrfa2tomRAWjusrRGCtLqGxyhsXiNR0rx3GVK8ru3llza/W6OSUFPX1DL7+y72pPX2bWDRvW5+Q6ER0qW1Ja9uwTP/3B9/5+6IM9e179+JOjiqKMgWUs5leqgTGAxq/xkAVA07AW5Llrtqy/+/ZbKssX2mcZQDWq+l0O48abV+1540Bm1q/t/CqYChCoKqSwy8ru+/q2e+/YdvrspVffeHv/O3/r6OxMYqVUV/kUv9KRDIux0tE6wPP8qoryu3fWbNu4erYnm4cCGoEqgxM4jnBadEd1VWZWT0HBzWtXQY6OZAmliAQ5qlYu81aW/+TR7z9w8NCRV/a+fezESU3TNE1jusqoRtiwX2mKIDAKqlI9zur15G/fsuHO2zZXLJtrM1GoESjXQHgQHoSCUfACdLmibF5psbe1vSsda/WmDXl5LmgqGE1pABQZNFhgZw/cs/G+OzadPNO4e+9fg6GwpspiTLbiPUfhUqYpIs+trlx+713bt66rKMmzcHoQeg+iZIRyuIHxPHLsxuqbK1/csz+ZbXRJcWDfKzt2bIWOlIyOhePwH0wF1SAIIMY+n2YymWx6J2FanJKNZo0y24DssBlVh1mFEgDTQXiAAziQWOMTVx6EBydIkfCho5d2fvvnyQ+8FL+Wzi5ZXVkOHeBEEB5UBQOggepx1xIeHAElIIAqgwbcRqppANTRfk3CFamvwBDkmYoIAALCARSEgHBgMUQ91bvgiF62sGj+nML65vbxWbdVr8/JcUENINAI3wUEGhHpgNwPXQYA3gDBBmMOzB5YimD2QnSAiAKRErVLDFcfFbgCGGjSMhISJyYx1+pJuEIsDESBy57Fb6laMT4rx3E7ampY80ukcRekLgyLzKgwiekmBxjsmFWKrDJk3wBzAQgHqiTUIFHOji1qCQGLsZIEK5catTxACSfwUDevXfaHv7yravpo1gXz5t64uIjVPUrCXeABHhlMCUCuw0AdRAPsi+CugmMxiAAqJ1iTtDZlr5BgTYnX4SYAFIAosEWl7iXzis9cah3Nun1bdRa5SiId8X1HxkKeJPpQBYNnMXQW1jnI34ysJfEqMVkTRlaEgCERtSQBqiclFgUTQJnAw2bCrevKRrMSQsqXLdDMs0nFbtZ7hO//WIg0QddGgNJbrKwItaD5RWQtRcE2mPLBYsKX9BhLvtEUVi6W/oDONFVWqKIyVSNBmbjdbsIRRmP3lzCn07myYnnN1o1VK28sdpvFSBPp+yc/dEyMXAbVJwsNgAKiBflb4FwBpoMl14rDoCS+LnFKwigna1A0XtFFXwT1bYO1pxo/PHauvqlNVeThhRxtTqdz9U0rajavW1t5Q2GOUYw0kf6jou+kKLWC0klBx6icK5C/GYSPJ9xIJJD4VowQRoms87JmUJjZH+Xqr/hqT33+0fFzFxtbNHV07ZFuWpfLteam5bds+srqFUu8Tl6MNHEDxw3B06LckZDbtMQUsM2Bpwa8MYELEAYwSomsCbJuUmD1S2Jju6/29OcfHTt/obFVU+WJfm9S65qbm7OmsnzrhtUry+Z7sogQbuJ8n5ojdQalI8NICszywFMD3gSqM0ajqhDRTDpnD8jGxk7/kVNNHx4/f7GxdXih09jUtu3u3NzVlWV3bFvzleXzs/p2O/zvTyoeLF4UbAHHM13rCrp6Qta9hy/Unrx4oaFlMojDllFFUywciTQ0tawtv26l56pj4E1CJrGTJoAahOaHuZBAt/DhoMS/sLf21Lkmqk9tYzM1VgD337npkbuWZve8yLHoZMcQQB4CITDmcES2isqS+QtqT7f4gtJ/kLVy2dznfrgz37dbVLunFj4EkK7BmA3eJHIRu5n35hceOtGsalN4bzAF1lyn7YXHvrHI+LEl/NkXeT3FGFQ/THkANfIhd3YWL5g/qevMPHCqrDzHPfPIndULAnbfQZIBlFAIBGMcRgBNAsfDYCVMNZJQSYGnqz/a0D40w6z3377mO9tnu3yv8xizPUy1QbKwnyxxoG2c7wighWDMAnSel41cdG6R99OG/j7fpAJ3Uqw3LS155uENXukdA+1P31OB7QpZH0a+yHwWMjhOD6qDA0QDdMUgSiaBFeflfnimV1Iya0JmVrfT+rsf37bY8ukstSF9TwbSx6/5U23kRMPA0uvnWGinSMbIJwF0GQYDoIIpZjFkM5ntFsuRcwMZXydnYBV47unvVlfP92dLn2RMJx+bc6p3zs92HTle17ps0fW5DquDdI2jwUwHr4GLgoYJiZqFQK49Oxhlda3habF+a3v5g1vz3dL7PDK86JOo9YpW8fjuiw2tPZTq51t9VSvmmTjZJo5JHQYQBYISc63AR418qMjlvNQhdQ6kmyUd68rFnqfuX17Mao3wpwdl4K7qS187pv75YF3sE58/NBAVKhZ6zBg0CamREKvlhQQ3g8moCpBLXMLRejXN82FC1mK39TcPr1lkr7eztvSgIOhXPf/qKfzlHz+LSCNYTe39ue682bkGh+DjuVQJYwAHkEQVzmCzqERXPQ52tBHKBM4d/z0hgLmlhXm52QNyTlDPTqf8BBHV3Bkpev6dy/1DwVQg+vu3Lp7pntURsLGxP6EDNMFK0dWDQBAlhZ4cp3WiqSb0a1tX/6nmyLzrrjOYnLqqWIXguMAUXHu4eN9p8vJ7TWMPBWRFaerFqoUGMwI28+ibjDVVRWMbugeMJ7qLHnsj0t49Ybyli9eevsHDp686crwed25YglUMC1yqChL0hBxnel2P72mNRMev7voGgirvWlQg2Q2aUUxl5eHz41IL+iPZr551P7e/x+cPpOHJoAOSJB05feWabJtfmi/JTCSyWVSHJwtKwmW/49l3o+cvjyf7Catvj5QUed1Gv8vGOBIfy4D2bjR3kCsR77OHDQeOdlBdTfMjmVkBAKyhpedEs1Y622vkNUWR7CadcNApWgbJgXPmlw9dS38kxKh+oRMV1zstCDodAIGk4FILuodMx3qLntwfqm/tncyh0mTrgYGhwAdnhgyOAq9TDYQiVhN6/TjXY3/yTSkUyVzbhyNSV9ixvJDYBFlWceEy+mXnnnO5zx/sDgaDGYdPjRWAqionzve3h/PmFWVJIb8vKv72H5a6yxmkd9g6+0Imh6fYEuobRFvU++vDwnsnO6Z0ljTVfQFr7Rw62mwsLSmqv8q/dHhgKueX7GKHtHhe0WW//Yn9gab2/9a/ExiMZqt11hcYaLfbBHEGzue/tP9P+zclUOrCr+J20QAAAABJRU5ErkJgggo=">
41 <link rel="shortcut icon" href="data:image/png;charset=utf-8;base64,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">
42
43 <meta http-equiv="cleartype" content="on">
44 <meta name="apple-mobile-web-app-capable" content="yes">
45
46
47
48
49 <script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
50 <script type="text/javascript" src="../../../../js/React/react-0.4.1.js"></script>
51
52 <script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
53 <script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>
54 <script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
55 <script type='text/javascript' src='../../../../js/Clipperz/Date.js'></script>
56 <script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
57 <script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
58 <script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
59 <script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
60
61 <script type='text/javascript' src='../../../../js/Clipperz/Signal.js'></script>
62 <script type='text/javascript' src='../../../../js/Clipperz/Style.js'></script>
63 <script type='text/javascript' src='../../../../js/Clipperz/Visual.js'></script>
64 <script type='text/javascript' src='../../../../js/Clipperz/Set.js'></script>
65 <script type='text/javascript' src='../../../../js/Clipperz/KeyValueObjectStore.js'></script>
66
67 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
68 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
69 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
70 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
71 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
72 <script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>
73
74 <script type='text/javascript' src='../../../../js/Clipperz/PM/Date.js'></script>
75 <script type='text/javascript' src='../../../../js/Clipperz/PM/Toll.js'></script>
76 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
77 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.js'></script>
78 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Test.js'></script>
79 <script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy/Proxy.Offline.DataStore.js'></script>
80
81 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_defaults.js'></script>
82 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings/Strings_en-US.js'></script>
83 <script type='text/javascript' src='../../../../js/Clipperz/PM/Strings.js'></script>
84
85 <script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
86 <script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>
87 <script type='text/javascript' src='../../../../js/Clipperz/PM/PIN.js'></script>
88
89 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/EncryptedRemoteObject.js'></script>
90 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.js'></script>
91 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Legacy.js'></script>
92 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.RecordIndex.js'></script>
93 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.Preferences.js'></script>
94 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Header.OneTimePasswords.js'></script>
95 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/User.Subscription.js'></script>
96 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.js'></script>
97 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.js'></script>
98 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/Record.Version.Field.js'></script>
99 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLogin.js'></script>
100 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginInput.js'></script>
101 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginBinding.js'></script>
102 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/DirectLoginFormValue.js'></script>
103 <script type='text/javascript' src='../../../../js/Clipperz/PM/DataModel/OneTimePassword.js'></script>
104
105 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/Overlay.js'></script>
106 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/PageTemplate.js'></script>
107 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/LoginForm.js'></script>
108 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/RegistrationWizard.js'></script>
109 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/CardList.js'></script>
110 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/CardDetail.js'></script>
111 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/Components/ErrorPage.js'></script>
112
113 <script type='text/javascript' src='../../../../js/Clipperz/PM/UI/MainController.js'></script>
114
115
116 <script type='text/javascript' src='./User.data.js'></script>
117 <script type='text/javascript' src='./cardDetail_test.js'></script>
118<script>
119 Clipperz_IEisBroken = false;
120 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
121 document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')
122</script>
123
124<!--[if IE]><script>
125Clipperz_IEisBroken = true;
126</script><![endif]-->
127
128 <link rel="stylesheet" type="text/css" href="../../../../css/web.css" />
129
130</head>
131<body>
132
133<div id="mainDiv">
134 <div class="page" id="loadingPage">
135 <div>
136 <h1>clipperz</h1>
137 <h3 class="clipperzPayoff">keep it to yourself</h3>
138 </div>
139 </div>
140 <div class="page right" id="loginPage"></div>
141 <div class="page right" id="registrationPage"></div>
142 <div class="page right" id="cardListPage"></div>
143 <div class="page right" id="cardDetailPage"></div>
144 <div class="page right" id="accountPage"></div>
145 <div class="page right" id="preferencesPage"></div>
146 <div class="page right" id="errorPage"></div>
147</div>
148<div class="overlay" id="overlay">
149 <div class="spinner">
150 <div class="bar01"></div>
151 <div class="bar02"></div>
152 <div class="bar03"></div>
153 <div class="bar04"></div>
154 <div class="bar05"></div>
155 <div class="bar06"></div>
156 <div class="bar07"></div>
157 <div class="bar08"></div>
158 <div class="bar09"></div>
159 <div class="bar10"></div>
160 <div class="bar11"></div>
161 <div class="bar12"></div>
162 </div>
163 <span class="icon done" style="display:none">done</span>
164 <span class="icon failed" style="display:none">failed</span>
165 <span class="title">loading</span>
166</div>
167
168</body>
169</html>
diff --git a/frontend/gamma/html/index_template.html b/frontend/gamma/html/index_template.html
index ba7c311..b80a34f 100644
--- a/frontend/gamma/html/index_template.html
+++ b/frontend/gamma/html/index_template.html
@@ -1,79 +1,79 @@
1<html> 1<html>
2<head> 2<head>
3 <title>@page.title@</title> 3 <title>@page.title@</title>
4 <meta http-equiv="content-type" content="text/html; charset=utf-8" /> 4 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
5<!-- 5<!--
6@copyright@ 6@copyright@
7--> 7-->
8 8
9@css@ 9@css@
10 10
11 <link rel="shortcut icon" href="./clipperz.ico" /> 11 <link rel="shortcut icon" href="./clipperz.ico" />
12 12
13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." /> 13 <meta name="description" content="Login to your web accounts with just one click. Never type a password again! Use multiple complex passwords and forget them. A password manager that enhances your online security." />
14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" /> 14 <meta name="keywords" content="password manager,gestor de contraseñas,gerenciador de senhas,Kennwortmanager,passwords,security,privacy,cryptography" />
15<script> 15<script>
16 Clipperz_IEisBroken = false; 16 Clipperz_IEisBroken = false;
17 Clipperz_normalizedNewLine = '\n'; 17 Clipperz_normalizedNewLine = '\n';
18 Clipperz_dumpUrl = "/../dump/"; 18 Clipperz_dumpUrl = "@dump.path@";
19 Clipperz_version = "@application.version@"; 19 Clipperz_version = "@application.version@";
20 "use strict"; 20 "use strict";
21</script> 21</script>
22 22
23<!--[if IE]><script> 23<!--[if IE]><script>
24Clipperz_IEisBroken = true; 24Clipperz_IEisBroken = true;
25Clipperz_normalizedNewLine = '\x0d\x0a'; 25Clipperz_normalizedNewLine = '\x0d\x0a';
26</script><![endif]--> 26</script><![endif]-->
27 27
28@js_LINKED@ 28@js_LINKED@
29 29
30</head> 30</head>
31<body> 31<body>
32<div id="mainDiv"> 32<div id="mainDiv">
33 <div id="loading"> 33 <div id="loading">
34 <div> 34 <div>
35 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a --> 35 <!-- a href="http://www.clipperz.com" target="_blank"><div id="logo"></div></a -->
36 <h1>clipperz</h1> 36 <h1>clipperz</h1>
37 <h3 class="clipperzPayoff">keep it to yourself!</h3> 37 <h3 class="clipperzPayoff">keep it to yourself!</h3>
38 <!-- h5>loading ...</h5 --> 38 <!-- h5>loading ...</h5 -->
39 </div> 39 </div>
40 </div> 40 </div>
41 41
42@js_EMBEDDED@ 42@js_EMBEDDED@
43 43
44</div> 44</div>
45<!-- div id="applicationVersionType" class="@application.version.type@"></div --> 45<!-- div id="applicationVersionType" class="@application.version.type@"></div -->
46 46
47<script> 47<script>
48 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@}); 48 Clipperz.PM.Proxy.defaultProxy = new Clipperz.PM.Proxy.JSON({'url':'@request.path@', 'shouldPayTolls':@should.pay.toll@});
49 /*offline_data_placeholder*/ 49 /*offline_data_placeholder*/
50 50
51/* * / 51/* * /
52 MochiKit.DOM.addLoadEvent(function () { 52 MochiKit.DOM.addLoadEvent(function () {
53 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose(); 53 Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
54 MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'j', passphrase:'j'}); 54 // MochiKit.Signal.signal(Clipperz.Signal.NotificationCenter, 'doLogin', {username:'joe', passphrase:'clipperz'});
55 }); 55 });
56/ * */ 56/ * */
57</script> 57</script>
58 58
59<!-- --> 59<!-- -->
60<!-- div id="javaScriptAlert"> 60<!-- div id="javaScriptAlert">
61 <div class="mask"></div> 61 <div class="mask"></div>
62 <div class="message"> 62 <div class="message">
63 <div class="header"></div> 63 <div class="header"></div>
64 <div class="body"> 64 <div class="body">
65 <div class="alertLogo"></div> 65 <div class="alertLogo"></div>
66 <div class="alert"> 66 <div class="alert">
67 <h1>Attention!</h1> 67 <h1>Attention!</h1>
68 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p> 68 <p>If you can read this message, the chances are that your browser does not properly support JavaScript? or you have disabled this functionality yourself.</p>
69 <h3>Javascript is required to access Clipperz.</h3> 69 <h3>Javascript is required to access Clipperz.</h3>
70 <h5>Please enable scripting or upgrade your browser.</h5> 70 <h5>Please enable scripting or upgrade your browser.</h5>
71 </div> 71 </div>
72 </div> 72 </div>
73 <div class="footer"></div> 73 <div class="footer"></div>
74 </div> 74 </div>
75</div --> 75</div -->
76<!-- --> 76<!-- -->
77 77
78</body> 78</body>
79</html> 79</html>
diff --git a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
index 85d55c0..72460ba 100644
--- a/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
+++ b/frontend/gamma/js/Clipperz/PM/Strings/Strings_en-US.js
@@ -125,65 +125,65 @@ Clipperz.PM.Strings.Languages['en-us'] = {
125 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials", 125 'userLoginPanelUpgradingUserCredentialsMessageTitle': "Verifying credentials",
126 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema", 126 'userLoginPanelUpgradingUserCredentialsMessageText': "Upgrading your credentials to a new authentication schema",
127 'userLoginPanelConnectedMessageTitle': "User authenticated", 127 'userLoginPanelConnectedMessageTitle': "User authenticated",
128 'userLoginPanelConnectedMessageText': "Successfully logged in", 128 'userLoginPanelConnectedMessageText': "Successfully logged in",
129 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials", 129 'userLoginPanelTryingAnOlderConnectionSchemaMessageTitle': "Verifying credentials",
130 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema", 130 'userLoginPanelTryingAnOlderConnectionSchemaMessageText': "Trying an older authentication schema",
131 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated", 131 'userLoginPanelLoadingUserDataMessageTitle': "User authenticated",
132 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz", 132 'userLoginPanelLoadingUserDataMessageText': "Downloading encrypted card headers from Clipperz",
133 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated", 133 'userLoginPanelDecryptingUserDataMessageTitle': "User authenticated",
134 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers", 134 'userLoginPanelDecryptingUserDataMessageText': "Local decryption of card headers",
135 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated", 135 'userLoginPanelDecryptingUserStatisticsMessageTitle': "User authenticated",
136 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics", 136 'userLoginPanelDecryptingUserStatisticsMessageText': "Local decryption of usage statistics",
137 137
138 //Registration page - splash alert 138 //Registration page - splash alert
139 'splashAlertTitle':"Welcome to Clipperz!", 139 'splashAlertTitle':"Welcome to Clipperz!",
140'splashAlertText': "\ 140'splashAlertText': "\
141 <!-- FIX CSS DONE! -->\ 141 <!-- FIX CSS DONE! -->\
142 <p>Some security advice</p>\ 142 <p>Some security advice</p>\
143 <ul>\ 143 <ul>\
144 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\ 144 <li><p>Storing your data at Clipperz is as secure as the passphrase you choose to protect them. Nobody can access them unless they know your passphrase.</p></li>\
145 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\ 145 <li><p>If you are going to use Clipperz for safeguarding sensitive and critical information please make sure to use a strong passphrase. The longer the better!</p></li>\
146 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\ 146 <li><p>Clipperz will not be able to recover a lost passphrase!</p></li>\
147 </ul>\ 147 </ul>\
148 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>", 148 <p>For any further information, please refer to <a href=\"http://www.clipperz.com\" target=\"_blank\">Clipperz</a> website.</p>",
149 'splashAlertCloseButtonLabel':"Ok", 149 'splashAlertCloseButtonLabel':"Ok",
150 150
151 // Registration page - form 151 // Registration page - form
152 'registrationFormTitle': "create your account", 152 'registrationFormTitle': "create your account",
153 'registrationFormUsernameLabel': "username", 153 'registrationFormUsernameLabel': "username",
154 'registrationFormPassphraseLabel': "passphrase", 154 'registrationFormPassphraseLabel': "passphrase",
155 'registrationFormRetypePassphraseLabel': "re-enter passphrase", 155 'registrationFormRetypePassphraseLabel': "re-enter passphrase",
156 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.", 156 'registrationFormSafetyCheckLabel': "I understand that Clipperz will not be able to recover a lost passphrase.",
157 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>.", 157 'registrationFormTermsOfServiceCheckLabel': "I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>.",
158 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?", 158 'registrationFormDoYouAlreadyHaveAnAccountLabel': "do you already have an account?",
159 'registrationFormSimplyLoginLabel': "simply login", 159 'registrationFormSimplyLoginLabel': "simply login",
160 'registrationFormButtonLabel': "Register", 160 'registrationFormButtonLabel': "Register",
161 161
162// Registration page - warning messages 162// Registration page - warning messages
163 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.", 163 'registrationFormWarningMessageNotMatchingPassphrases':"Your passphrases don't match, please re-type them.",
164 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.", 164 'registrationFormWarningMessageSafetyCheckNotSelected':"Please read and check all the boxes below.",
165 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.", 165 'registrationFormWarningMessageTermsOfServiceCheckNotSelected':"You need to agree to the Terms of Service.",
166 166
167 // Registration page - message panel 167 // Registration page - message panel
168 'registrationMessagePanelInitialTitle': "Creating account …", 168 'registrationMessagePanelInitialTitle': "Creating account …",
169 'registrationMessagePanelInitialText': "---", 169 'registrationMessagePanelInitialText': "---",
170 'registrationMessagePanelInitialButtonLabel': "Cancel", 170 'registrationMessagePanelInitialButtonLabel': "Cancel",
171 'registrationMessagePanelRegistrationDoneTitle': "Registration", 171 'registrationMessagePanelRegistrationDoneTitle': "Registration",
172 'registrationMessagePanelRegistrationDoneText': "Done", 172 'registrationMessagePanelRegistrationDoneText': "Done",
173 'registrationMessagePanelFailureTitle': "Registration failed", 173 'registrationMessagePanelFailureTitle': "Registration failed",
174 'registrationMessagePanelFailureButtonLabel': "Close", 174 'registrationMessagePanelFailureButtonLabel': "Close",
175 175
176// Registration page - message panel - connection 176// Registration page - message panel - connection
177 'connectionRegistrationSendingRequestMessageText': "Verifying credentials", 177 'connectionRegistrationSendingRequestMessageText': "Verifying credentials",
178 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials", 178 'connectionRegistrationSendingCredentialsMessageText':"Sending credentials",
179 179
180// Registration page - splash panel 180// Registration page - splash panel
181 'registrationSplashPanelTitle': "Security advice", 181 'registrationSplashPanelTitle': "Security advice",
182 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>", 182 'registrationSplashPanelDescription': "<p>These are your Clipperz credentials, take good care of them. Clipperz will never display your username and passphrase a second time!</p>",
183 'registrationSplashPanelUsernameLabel': "username", 183 'registrationSplashPanelUsernameLabel': "username",
184 'registrationSplashPanelPassphraseLabel':"passphrase", 184 'registrationSplashPanelPassphraseLabel':"passphrase",
185 185
186 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase", 186 'registrationSplashPanelShowPassphraseButtonLabel':"show passphrase",
187 187
188 //Header links 188 //Header links
189 'donateHeaderLinkLabel': "donate", 189 'donateHeaderLinkLabel': "donate",
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
index 06746d1..cd5faa6 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/NewUserCreationComponent.js
@@ -126,65 +126,65 @@ Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.NewUserCreationComponent, Cli
126 {tag:'div', cls:'header', children:[ 126 {tag:'div', cls:'header', children:[
127 {tag:'div', cls:'title', children:[ 127 {tag:'div', cls:'title', children:[
128 {tag:'h3', id:this.getId('title'), html:"Create new user"} 128 {tag:'h3', id:this.getId('title'), html:"Create new user"}
129 ]} 129 ]}
130 ]}, 130 ]},
131 {tag:'div', id:this.getId('body'), cls:'body', children:[ 131 {tag:'div', id:this.getId('body'), cls:'body', children:[
132 {tag:'div', cls:'tabContainer', children:[ 132 {tag:'div', cls:'tabContainer', children:[
133 {tag:'ul', cls:'tabs', children:[ 133 {tag:'ul', cls:'tabs', children:[
134 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]}, 134 {tag:'li', id:this.getId('credentialsTab'), children:[{tag:'span', html:"credentials"}]},
135 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]}, 135 {tag:'li', id:this.getId('checkCredentialsTab'),children:[{tag:'span', html:"credentials check"}]},
136 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]}, 136 {tag:'li', id:this.getId('termsOfServiceTab'), children:[{tag:'span', html:"terms of service"}]},
137 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//, 137 {tag:'li', id:this.getId('createUserTab'), children:[{tag:'span', html:"create user"}]}//,
138 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]}, 138 // {tag:'li', id:this.getId('loginTab'), children:[{tag:'span', html:"login"}]},
139 ]}, 139 ]},
140 {tag:'ul', cls:'tabPanels', children:[ 140 {tag:'ul', cls:'tabPanels', children:[
141 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[ 141 {tag:'li', id:this.getId('credentialsTabpanel'), cls:'tabPanel credentials', children:[
142 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]}, 142 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREDENTIALS.description')}]},
143 {tag:'ul', cls:'credentials', children:[ 143 {tag:'ul', cls:'credentials', children:[
144 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]}, 144 {tag:'li', children:[{tag:'span', cls:'label', html:"username"},{tag:'input', type:'text', id:this.getId('username')/*, value:'test'*/}]},
145 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]} 145 {tag:'li', children:[{tag:'span', cls:'label', html:"passphrase"},{tag:'input', type:'password', id:this.getId('passphrase')/*, value:'test'*/}]}
146 ]} 146 ]}
147 ]}, 147 ]},
148 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[ 148 {tag:'li', id:this.getId('checkCredentialsTabpanel'), cls:'tabPanel checkCredentials', children:[
149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]}, 149 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CHECK_CREDENTIALS.description')}]},
150 {tag:'ul', cls:'credentials', children:[ 150 {tag:'ul', cls:'credentials', children:[
151 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]} 151 {tag:'li', children:[{tag:'span', cls:'label', html:"re-passphrase"},{tag:'input', type:'password', id:this.getId('re-passphrase')/*, value:'test'*/}]}
152 ]} 152 ]}
153 ]}, 153 ]},
154 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[ 154 {tag:'li', id:this.getId('termsOfServiceTabpanel'), cls:'tabPanel termsOfService', children:[
155 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]}, 155 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.TERMS_OF_SERVICE.description')}]},
156 {tag:'ul', cls:'termsOfService', children:[ 156 {tag:'ul', cls:'termsOfService', children:[
157 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]}, 157 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('awareOfUnrecoverablePassphrase')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('awareOfUnrecoverablePassphrase'), html:"I understand that Clipperz will not be able to recover a lost passphrase."}]},
158 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='http://www.clipperz.com/terms_of_service' target='_blank'>Terms of Service</a>."}]} 158 {tag:'li', children:[{tag:'input', type:'checkbox', id:this.getId('readTermsOfService')/*, checked:true*/}, {tag:'label', cls:'label', 'for':this.getId('readTermsOfService'), htmlString:"I have read and agreed to the <a href='https://www.clipperz.com/terms_service' target='_blank'>Terms of Service</a>."}]}
159 ]} 159 ]}
160 ]}, 160 ]},
161 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[ 161 {tag:'li', id:this.getId('createUserTabpanel'), cls:'tabPanel createUser', children:[
162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]}, 162 {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.CREATE_USER.description')}]},
163 {tag:'ul', cls:'createUserStates', children:[ 163 {tag:'ul', cls:'createUserStates', children:[
164 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]}, 164 {tag:'li', cls:'creating', id:this.getId('creatingRegistering'), children:[{tag:'span', html:"registering user"}]},
165 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]}, 165 {tag:'li', cls:'done', id:this.getId('creatingDone'), children:[{tag:'span', html:"done"}]},
166 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]} 166 {tag:'li', cls:'fail', id:this.getId('creatingFailed'), children:[{tag:'span', html:"fail"}]}
167 ]} 167 ]}
168 ]}//, 168 ]}//,
169 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[ 169 // {tag:'li', id:this.getId('loginTabpanel'), cls:'tabPanel login', children:[
170 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]}, 170 // {tag:'div', cls:'wizardStepDescription', children:[{tag:'span', html:Clipperz.PM.Strings.getValue('Wizards.NewUserWizard.LOGIN.description')}]},
171 // ]} 171 // ]}
172 ]} 172 ]}
173 ]} 173 ]}
174 ]}, 174 ]},
175 {tag:'div', id:this.getId('footer'), cls:'footer', children:[ 175 {tag:'div', id:this.getId('footer'), cls:'footer', children:[
176 {tag:'div', cls:'buttonArea', children:[ 176 {tag:'div', cls:'buttonArea', children:[
177 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"}, 177 // {tag:'div', cls:'cancel', id:this.getId('cancelButton'), html:"cancel"},
178 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"} 178 // {tag:'div', cls:'save disabled', id:this.getId('saveButton'), html:"save"}
179 ]} 179 ]}
180 ]} 180 ]}
181 ]}, 181 ]},
182 {tag:'div', cls:'clear'} 182 {tag:'div', cls:'clear'}
183 ]}); 183 ]});
184 184
185 this.tabPanelController().setup(); 185 this.tabPanelController().setup();
186 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent'); 186 // MochiKit.Signal.connect(this.getId('panel'), 'onkeydown', this, 'handleKeyEvent');
187 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent'); 187 MochiKit.Signal.connect(MochiKit.DOM.currentDocument().body, 'onkeydown', this, 'handleKeyEvent');
188 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 188 MochiKit.Signal.connect(this.getId('awareOfUnrecoverablePassphrase'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
189 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange'); 189 MochiKit.Signal.connect(this.getId('readTermsOfService'), 'onchange', this, 'handleTermsOfServiceCheckboxChange');
190 }, 190 },
diff --git a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
index df3ca0c..1f183dc 100644
--- a/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
+++ b/frontend/gamma/js/Clipperz/PM/UI/Web/Components/PageFooter.js
@@ -20,46 +20,46 @@ refer to http://www.clipperz.com.
20 License along with Clipperz. If not, see http://www.gnu.org/licenses/. 20 License along with Clipperz. If not, see http://www.gnu.org/licenses/.
21 21
22*/ 22*/
23 23
24Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); 24Clipperz.Base.module('Clipperz.PM.UI.Web.Components');
25 25
26Clipperz.PM.UI.Web.Components.PageFooter = function(args) { 26Clipperz.PM.UI.Web.Components.PageFooter = function(args) {
27 args = args || {}; 27 args = args || {};
28 28
29 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments); 29 Clipperz.PM.UI.Web.Components.PageFooter.superclass.constructor.apply(this, arguments);
30 30
31 return this; 31 return this;
32} 32}
33 33
34//============================================================================= 34//=============================================================================
35 35
36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { 36Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, {
37 37
38 //------------------------------------------------------------------------- 38 //-------------------------------------------------------------------------
39 39
40 'toString': function () { 40 'toString': function () {
41 return "Clipperz.PM.UI.Web.Components.PageFooter component"; 41 return "Clipperz.PM.UI.Web.Components.PageFooter component";
42 }, 42 },
43 43
44 //------------------------------------------------------------------------- 44 //-------------------------------------------------------------------------
45 45
46 'renderSelf': function(/*aContainer, aPosition*/) { 46 'renderSelf': function(/*aContainer, aPosition*/) {
47 this.append(this.element(), [ 47 this.append(this.element(), [
48 {tag:'div', cls:'footerWrapper', children:[ 48 {tag:'div', cls:'footerWrapper', children:[
49 {tag:'div', cls:'footerContent', children:[ 49 {tag:'div', cls:'footerContent', children:[
50 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'}, 50 {tag:'canvas', id:this.getId('footerStarIcon'), cls:'footerStarIcon'},
51 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'}, 51 {tag:'span', cls:'copyright', html:'Copyright &copy; 2009-2013 Clipperz Srl'},
52 {tag:'a', href:'http://www.clipperz.com/terms_of_service',target:'_blank', html:'terms of service'}, 52 {tag:'a', href:'https://www.clipperz.com/terms_service',target:'_blank', html:'terms of service'},
53 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'}, 53 {tag:'a', href:'http://www.clipperz.com/privacy_policy',target:'_blank', html:'privacy policy'},
54 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'} 54 {tag:'div', cls:'applicationVersion', htmlString:'application version: <a href="https://github.com/clipperz/password-manager/tree/' + Clipperz_version + '" target="github">' + Clipperz_version + '</a>'}
55 ]} 55 ]}
56 ]} 56 ]}
57 ]); 57 ]);
58 58
59 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e"); 59 Clipperz.PM.UI.Canvas.star.normal(this.getElement('footerStarIcon'), "#7e7e7e");
60 }, 60 },
61 61
62 //------------------------------------------------------------------------- 62 //-------------------------------------------------------------------------
63 63
64 __syntaxFix__: "syntax fix" 64 __syntaxFix__: "syntax fix"
65}); 65});
diff --git a/scripts/builder/backendBuilder.py b/scripts/builder/backendBuilder.py
index b4ee990..ad6595c 100755
--- a/scripts/builder/backendBuilder.py
+++ b/scripts/builder/backendBuilder.py
@@ -39,67 +39,70 @@ class BackendBuilder(object):
39 raise NotImplementedError() 39 raise NotImplementedError()
40 40
41 # -------------------------------------------------------------------------- 41 # --------------------------------------------------------------------------
42 42
43 def sourceFolder (self): 43 def sourceFolder (self):
44 return os.path.join(main.projectBaseDir() , 'backend', self.relativePath(), 'src') 44 return os.path.join(main.projectBaseDir() , 'backend', self.relativePath(), 'src')
45 45
46 46
47 def tempFolder (self): 47 def tempFolder (self):
48 return os.path.join(self.projectTargetDir, '.tmp', self.relativePath()) 48 return os.path.join(self.projectTargetDir, '.tmp', self.relativePath())
49 49
50 50
51 def frontEndTempFolder (self): 51 def frontEndTempFolder (self):
52 return self.tempFolder() 52 return self.tempFolder()
53 53
54 54
55 def developmentTargetFolder (self): 55 def developmentTargetFolder (self):
56 return os.path.join(self.projectTargetDir, 'development') 56 return os.path.join(self.projectTargetDir, 'development')
57 57
58 58
59 def targetFolder (self): 59 def targetFolder (self):
60 return os.path.join(self.projectTargetDir, self.relativePath()) 60 return os.path.join(self.projectTargetDir, self.relativePath())
61 61
62 62
63 # -------------------------------------------------------------------------- 63 # --------------------------------------------------------------------------
64 64
65 def writeToFolder (self, folder, filename, content): 65 def writeToFolder (self, folder, filename, content):
66 file = open(os.path.join(folder, filename), 'w') 66 file = open(os.path.join(folder, filename), 'w')
67 file.write(content.encode('utf-8')) 67 file.write(content.encode('utf-8'))
68 file.close() 68 file.close()
69 69
70 70
71 def configureIndexContent (self, indexContent, requestPathPrefix = ".."): 71 #def configureIndexContent (self, indexContent, requestPathPrefix = ".."):
72 def configureIndexContent (self, indexContent):
72 result = indexContent 73 result = indexContent
73 result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] ) 74 # result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] )
75 result = result.replace( '@request.path@', self.settings['request.path'] )
76 result = result.replace( '@dump.path@', self.settings['dump.path'] )
74 result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] ) 77 result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] )
75 78
76 return result 79 return result
77 80
78 81
79 def formatMAC (self, value): 82 def formatMAC (self, value):
80 x = iter(value) 83 x = iter(value)
81 return ' '.join([reduce(add, tup) for tup in izip(x, x, x, x)]) 84 return ' '.join([reduce(add, tup) for tup in izip(x, x, x, x)])
82 85
83 86
84 def logChecksums (self, content, message): 87 def logChecksums (self, content, message):
85 md5Digest = self.formatMAC(hashlib.md5(content.encode('utf-8')).hexdigest()) 88 md5Digest = self.formatMAC(hashlib.md5(content.encode('utf-8')).hexdigest())
86 shaDigest = self.formatMAC(hashlib.sha1(content.encode('utf-8')).hexdigest()) 89 shaDigest = self.formatMAC(hashlib.sha1(content.encode('utf-8')).hexdigest())
87 sha256Digest= self.formatMAC(hashlib.sha256(content.encode('utf-8')).hexdigest()) 90 sha256Digest= self.formatMAC(hashlib.sha256(content.encode('utf-8')).hexdigest())
88 print "-----" 91 print "-----"
89 print message + ": " + md5Digest + " (md5)" 92 print message + ": " + md5Digest + " (md5)"
90 print message + ": " + shaDigest + " (sha1)" 93 print message + ": " + shaDigest + " (sha1)"
91 print message + ": " + sha256Digest + " (sha256)" 94 print message + ": " + sha256Digest + " (sha256)"
92 print "=====" 95 print "====="
93 96
94 97
95 def shouldCompileCode (self): 98 def shouldCompileCode (self):
96 return ('debug' in self.versions) or ('install' in self.versions) 99 return ('debug' in self.versions) or ('install' in self.versions)
97 100
98 101
99 def run (self): 102 def run (self):
100 print self.name() + " - RUN" 103 print self.name() + " - RUN"
101 104
102 if self.shouldCompileCode(): 105 if self.shouldCompileCode():
103 self.compileCode() 106 self.compileCode()
104 107
105 for frontend in self.frontends: 108 for frontend in self.frontends:
diff --git a/scripts/builder/backends/phpBuilder.py b/scripts/builder/backends/phpBuilder.py
index c928aa0..c928aa0 100755..100644
--- a/scripts/builder/backends/phpBuilder.py
+++ b/scripts/builder/backends/phpBuilder.py
diff --git a/scripts/builder/frontendBuilder.py b/scripts/builder/frontendBuilder.py
index e52c31e..b72179f 100644
--- a/scripts/builder/frontendBuilder.py
+++ b/scripts/builder/frontendBuilder.py
@@ -6,125 +6,129 @@ import cssmin
6import jsmin 6import jsmin
7import codecs 7import codecs
8import shutil 8import shutil
9import StringIO 9import StringIO
10import urllib 10import urllib
11 11
12import main 12import main
13 13
14#=============================================================================== 14#===============================================================================
15 15
16class FrontendBuilder(object): 16class FrontendBuilder(object):
17 17
18 def __init__ (self, frontend, settings, repositoryVersion): 18 def __init__ (self, frontend, settings, repositoryVersion):
19 if '.' in frontend: 19 if '.' in frontend:
20 moduleComponents = frontend.split('.') 20 moduleComponents = frontend.split('.')
21 self.module = moduleComponents[0] 21 self.module = moduleComponents[0]
22 self.submodule = moduleComponents[1] 22 self.submodule = moduleComponents[1]
23 else: 23 else:
24 self.module = frontend 24 self.module = frontend
25 self.submodule = frontend 25 self.submodule = frontend
26 26
27 self.settings = settings 27 self.settings = settings
28 self.projectDir = main.projectBaseDir() 28 self.projectDir = main.projectBaseDir()
29 # self.repository = repository.repositoryWithPath(self.projectDir) 29 # self.repository = repository.repositoryWithPath(self.projectDir)
30 self.repositoryVersion = repositoryVersion 30 self.repositoryVersion = repositoryVersion
31 self.processedFiles = {} 31 self.processedFiles = {}
32 32
33 #--------------------------------------------------------------------------- 33 #---------------------------------------------------------------------------
34 34
35 def name (self): 35 def name (self):
36 raise NotImplementedError() 36 raise NotImplementedError()
37 37
38 def projectResourceTypes (self):
39 raise NotImplementedError()
38 40
39 def copyStaticResources (self, targetFolder): 41 def copyStaticResources (self, targetFolder):
40 raise NotImplementedError() 42 raise NotImplementedError()
41 43
42 #--------------------------------------------------------------------------- 44 #---------------------------------------------------------------------------
43 45
44 def log (self, message): 46 def log (self, message):
45 module = self.module 47 module = self.module
46 if (self.module != self.submodule): 48 if (self.module != self.submodule):
47 module = module + "." + self.submodule 49 module = module + "." + self.submodule
48 print "frontend [" + module + "]: " + message 50 print "frontend [" + module + "]: " + message
49 51
50 52
51 def absolutePathForSources (self): 53 def absolutePathForSources (self):
52 return os.path.join(self.projectDir, 'frontend', self.module) 54 return os.path.join(self.projectDir, 'frontend', self.module)
53 55
54 56
55 def absolutePathForSourceFile (self, basePath, file): 57 def absolutePathForSourceFile (self, basePath, file):
56 return os.path.join(self.absolutePathForSources(), basePath, file) 58 return os.path.join(self.absolutePathForSources(), basePath, file)
57 59
58 60
59 def absolutePathForTargetFile (self, folder, basePath, file): 61 def absolutePathForTargetFile (self, folder, basePath, file):
60 return os.path.join(folder, self.module, basePath, file) 62 return os.path.join(folder, self.module, basePath, file)
61 63
62 64
63 def filterFiles (self, files): 65 def filterFiles (self, files):
64 result = [] 66 result = []
65 67
66 for file in files: 68 for file in files:
67 if file.startswith('--'): 69 if file.startswith('--'):
68 pass 70 pass
69 else: 71 else:
70 result.append(file) 72 result.append(file)
71 73
72 return result 74 return result
73 75
74 76
75 def copyResources (self, sourceFolder, destinationFolder, fileType): 77 def copyResources (self, sourceFolder, destinationFolder, fileType):
76 if fileType in self.settings: 78 if fileType in self.settings:
77 for file in self.filterFiles(self.settings[fileType]): 79 for file in self.filterFiles(self.settings[fileType]):
78 src = self.absolutePathForSourceFile(fileType, file) 80 src = self.absolutePathForSourceFile(fileType, file)
79 dst = self.absolutePathForTargetFile(destinationFolder, fileType, file) 81 dst = self.absolutePathForTargetFile(destinationFolder, fileType, file)
80 main.createFolder(os.path.dirname(dst)) 82 main.createFolder(os.path.dirname(dst))
81 shutil.copy2(src, dst) 83 shutil.copy2(src, dst)
82 else: 84 else:
83 srcFolder = os.path.join(self.absolutePathForSources(), fileType) 85 srcFolder = os.path.join(self.absolutePathForSources(), fileType)
84 dstFolder = os.path.join(destinationFolder, self.module, fileType) 86 dstFolder = os.path.join(destinationFolder, self.module, fileType)
85 if not(os.path.exists(dstFolder)): 87 if not(os.path.exists(dstFolder)):
86 shutil.copytree(srcFolder, dstFolder) 88 shutil.copytree(srcFolder, dstFolder)
87 89
88 # try: 90 # try:
89 # shutil.copytree(srcFolder, dstFolder) 91 # shutil.copytree(srcFolder, dstFolder)
90 # except: 92 # except:
91 # pass 93 # pass
92 94
93 95
94 96
95 def copyResourcesToFolder (self, targetFolder): 97 def copyResourcesToFolder (self, targetFolder):
96 self.copyResources(self.projectDir, targetFolder, 'css') 98 # self.copyResources(self.projectDir, targetFolder, 'css')
97 self.copyResources(self.projectDir, targetFolder, 'js') 99 # self.copyResources(self.projectDir, targetFolder, 'js')
98 self.copyResources(self.projectDir, targetFolder, 'images') 100 # self.copyResources(self.projectDir, targetFolder, 'images')
101 for resoureceType in self.projectResourceTypes():
102 self.copyResources(self.projectDir, targetFolder, resoureceType)
99 self.copyStaticResources(targetFolder) 103 self.copyStaticResources(targetFolder)
100 104
101 105
102 def loadFilesContent (self, basePath, files): 106 def loadFilesContent (self, basePath, files):
103 result = "" 107 result = ""
104 108
105 for file in self.filterFiles(files): 109 for file in self.filterFiles(files):
106 try: 110 try:
107 fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8') 111 fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8')
108 except: 112 except:
109 print "FILE: " + file 113 print "FILE: " + file
110 114
111 result += fileHandler.read() + '\n' 115 result += fileHandler.read() + '\n'
112 fileHandler.close() 116 fileHandler.close()
113 117
114 return result 118 return result
115 119
116 120
117 def template (self): 121 def template (self):
118 processedFile = 'html_template' 122 processedFile = 'html_template'
119 if not self.processedFiles.has_key(processedFile): 123 if not self.processedFiles.has_key(processedFile):
120 #self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html']) 124 #self.processedFiles[processedFile] = self.loadFilesContent('html', ['index_template.html'])
121 self.processedFiles[processedFile] = self.loadFilesContent('html', [self.settings['html.template']]) 125 self.processedFiles[processedFile] = self.loadFilesContent('html', [self.settings['html.template']])
122 126
123 return self.processedFiles[processedFile] 127 return self.processedFiles[processedFile]
124 128
125 129
126 def cssminCompressor (self, css): 130 def cssminCompressor (self, css):
127 # package found here: 131 # package found here:
128 # - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777 132 # - http://stackoverflow.com/questions/222581/python-script-for-minifying-css/2396777#2396777
129 # actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4 133 # actual downloaded version: http://pypi.python.org/pypi/cssmin/0.1.4
130 return cssmin.cssmin(css) 134 return cssmin.cssmin(css)
@@ -214,113 +218,66 @@ class FrontendBuilder(object):
214 ('isLoginForm', 'ilf'), 218 ('isLoginForm', 'ilf'),
215 ('findLoginForm', 'flf'), 219 ('findLoginForm', 'flf'),
216 ('findLoginForm', 'flf'), 220 ('findLoginForm', 'flf'),
217 ('formParameters', 'fp' ), 221 ('formParameters', 'fp' ),
218 ('pageParameters', 'pp' ), 222 ('pageParameters', 'pp' ),
219 ('serializeJSON', 'sj' ), 223 ('serializeJSON', 'sj' ),
220 ('reprString', 'rs' ), 224 ('reprString', 'rs' ),
221 ('logFormParameters', 'lfp'), 225 ('logFormParameters', 'lfp'),
222 ('loadClipperzBookmarklet','lcb'), 226 ('loadClipperzBookmarklet','lcb'),
223 ('loginForm', 'lf' ), 227 ('loginForm', 'lf' ),
224 ('parameters', 'p' ), 228 ('parameters', 'p' ),
225 ('inputElementValues', 'iev'), 229 ('inputElementValues', 'iev'),
226 ] 230 ]
227 result = self.compressJS(bookmakeletCode, version + " bookmarklet") 231 result = self.compressJS(bookmakeletCode, version + " bookmarklet")
228 232
229 result = re.sub('\n', ' ', result) #Fit all in a single line 233 result = re.sub('\n', ' ', result) #Fit all in a single line
230 # result = re.sub('\s+', ' ', result) #Collapse "redundant" spaces. WARNING: this could have some evil side effects on constant strings used inside to code!! 234 # result = re.sub('\s+', ' ', result) #Collapse "redundant" spaces. WARNING: this could have some evil side effects on constant strings used inside to code!!
231 # result = re.sub('\s?([,\+=\(\)\{\};])\s?', '\\1', result) 235 # result = re.sub('\s?([,\+=\(\)\{\};])\s?', '\\1', result)
232 236
233 for replacer in replacers: 237 for replacer in replacers:
234 result = re.sub(replacer[0], replacer[1], result) 238 result = re.sub(replacer[0], replacer[1], result)
235 239
236 # <!-- escaping required to handle the bookmarklet code within the javascript code --> 240 # <!-- escaping required to handle the bookmarklet code within the javascript code -->
237 result = re.sub('\://', '%3a%2f%2f',result) 241 result = re.sub('\://', '%3a%2f%2f',result)
238 result = re.sub('/', '%2f', result) 242 result = re.sub('/', '%2f', result)
239 # result = re.sub('"', '%22', result) 243 # result = re.sub('"', '%22', result)
240 result = re.sub('"', '\\"', result) 244 result = re.sub('"', '\\"', result)
241 result = re.sub('\"', '%22', result) 245 result = re.sub('\"', '%22', result)
242 result = re.sub('\'', '%22', result) 246 result = re.sub('\'', '%22', result)
243 result = re.sub('\\\\', '%5c', result) 247 result = re.sub('\\\\', '%5c', result)
244 result = result.strip() 248 result = result.strip()
245 result = 'javascript:' + result 249 result = 'javascript:' + result
246
247 # replacers = [
248 # ('aForm', '_1' ),
249 # ('inputFields', '_2' ),
250 # ('passwordFieldsFound','_3' ),
251 # ('aDocument', '_6' ),
252 # ('aLevel', '_7' ),
253 # # ('result', '_8' ),
254 # ('documentForms', '_9' ),
255 # ('iFrames', '_c' ),
256 # ('anInputElement', '_d' ),
257 # ('options', '_f' ),
258 # ('option', '_12'),
259 # ('aLoginForm', '_13'),
260 # # ('action', '_17'),
261 # ('radioValues', '_18'),
262 # ('radioValueName', '_19'),
263 # ('inputElement', '_1a'),
264 # ('elementValues', '_1b'),
265 # ('radioValue', '_1c'),
266 # ('values', '_1d'),
267 # ('objtype', '_21'),
268 # ('useKey', '_27'),
269 # ('bookmarkletDiv', '_28'),
270 # ('someParameters', '_29'),
271 # ('anException', '_2a'),
272 # ('newDiv', '_2b'),
273 # ('base_url', '_2c'),
274 # ('help_url', '_2d'),
275 # ('logo_image_url', '_2e'),
276 # ('background_image_url','_2f'),
277 # ('close_image_url', '_30'),
278 # #('bookmarklet_textarea','_31'),
279 # ('innerHTML', '_32'),
280 # ]
281 # for replacer in replacers:
282 # result = re.sub('([^\.])' + replacer[0], '\\1' + replacer[1], result)
283
284 # replacers = [
285 # ('headNode', '_1' ),
286 # ('clipperzScriptNode','_2' ),
287 # ]
288 # for replacer in replacers:
289 # result = re.sub('([^\.])' + replacer[0], '\\1' + replacer[1], result)
290
291 # result = re.sub(';', ';\n', result)
292 250
293 return result 251 return result
294
295 252
296 253
297 def bookmarklet (self): 254 def bookmarklet (self):
298 cacheKey = 'bookmarklet' 255 cacheKey = 'bookmarklet'
299 if not self.processedFiles.has_key(cacheKey): 256 if not self.processedFiles.has_key(cacheKey):
300 result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js']), "regular") + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js']), "IE") + '";' 257 result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js']), "regular") + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js']), "IE") + '";'
301 self.processedFiles[cacheKey] = result 258 self.processedFiles[cacheKey] = result
302 else: 259 else:
303 result = self.processedFiles[cacheKey] 260 result = self.processedFiles[cacheKey]
304 261
305 return result 262 return result
306 263
307 264
308 def replaceTemplatePlaceholders (self, pageTitle, copyright, css, code, jsLoadMode, version, versionType): 265 def replaceTemplatePlaceholders (self, pageTitle, copyright, css, code, jsLoadMode, version, versionType):
309 result = self.template() 266 result = self.template()
310 267
311 result = result.replace('@page.title@', pageTitle) 268 result = result.replace('@page.title@', pageTitle)
312 result = result.replace('@copyright@', copyright) 269 result = result.replace('@copyright@', copyright)
313 result = result.replace('@css@', css) 270 result = result.replace('@css@', css)
314 #result = result.replace('@bookmarklet@', bookmarklet) 271 #result = result.replace('@bookmarklet@', bookmarklet)
315 result = result.replace('@application.version@', version) 272 result = result.replace('@application.version@', version)
316 result = result.replace('@application.version.type@',versionType) 273 result = result.replace('@application.version.type@',versionType)
317 result = result.replace('@js_' + jsLoadMode + '@', code) 274 result = result.replace('@js_' + jsLoadMode + '@', code)
318 275
319 result = re.sub('@js_[^@]+@', '', result) 276 result = re.sub('@js_[^@]+@', '', result)
320 277
321 return result 278 return result
322 279
323 280
324 def assembleCopyrightHeader (self): 281 def assembleCopyrightHeader (self):
325 processedFile = 'copyright' 282 processedFile = 'copyright'
326 if not self.processedFiles.has_key(processedFile): 283 if not self.processedFiles.has_key(processedFile):
@@ -359,62 +316,66 @@ class FrontendBuilder(object):
359 def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType): 316 def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType):
360 cacheKey = version + "-" + versionType 317 cacheKey = version + "-" + versionType
361 if not self.processedFiles.has_key(cacheKey): 318 if not self.processedFiles.has_key(cacheKey):
362 result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType) 319 result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType)
363 self.processedFiles[cacheKey] = result 320 self.processedFiles[cacheKey] = result
364 else: 321 else:
365 result = self.processedFiles[cacheKey] 322 result = self.processedFiles[cacheKey]
366 323
367 #self.log("# cacheKey:\n" + result) 324 #self.log("# cacheKey:\n" + result)
368 return result 325 return result
369 326
370 327
371 def assemble (self, assemblyMode='INSTALL', versionType='LIVE'): 328 def assemble (self, assemblyMode='INSTALL', versionType='LIVE'):
372 329
373 if versionType == 'LIVE': 330 if versionType == 'LIVE':
374 pageTitle = "Clipperz - " + self.module 331 pageTitle = "Clipperz - " + self.module
375 else: 332 else:
376 pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]" 333 pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]"
377 334
378 if assemblyMode == 'INSTALL': 335 if assemblyMode == 'INSTALL':
379 copyright = self.assembleCopyrightHeader() 336 copyright = self.assembleCopyrightHeader()
380 css =self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css']))) 337 css =self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css'])))
381 js =self.scriptTagForContent( 338 js =self.scriptTagForContent(
382 self.bookmarklet() + 339 self.bookmarklet() +
383 '\n' + 340 '\n' +
384 self.compressJS(self.loadFilesContent('js', self.settings['js']), "application") 341 self.compressJS(self.loadFilesContent('js', self.settings['js']), "application")
385 ) 342 )
386 jsLoadMode = 'EMBEDDED' 343 jsLoadMode = 'EMBEDDED'
387 344
388 elif assemblyMode == 'DEBUG': 345 elif assemblyMode == 'DEBUG':
389 copyright = self.assembleCopyrightHeader() 346 copyright = self.assembleCopyrightHeader()
390 css =self.cssTagsForFiles('./css', self.filterFiles(self.settings['css'])) 347 css =self.cssTagsForFiles('./css', self.filterFiles(self.settings['css']))
391 js =self.scriptTagForContent(self.bookmarklet()) + \ 348 js =self.scriptTagForContent(
392 '\n' + \ 349 self.bookmarklet()) + \
393 self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js'])) 350 '\n' + \
351 self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js'])
352 )
394 jsLoadMode = 'LINKED' 353 jsLoadMode = 'LINKED'
395 354
396 elif assemblyMode == 'DEVELOPMENT': 355 elif assemblyMode == 'DEVELOPMENT':
397 copyright = "" 356 copyright = ""
398 css =self.cssTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'css')), self.filterFiles(self.settings['css'])) 357 css =self.cssTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'css')), self.filterFiles(self.settings['css']))
399 js =self.scriptTagForContent(self.bookmarklet()) + \ 358 js =self.scriptTagForContent(
400 '\n' + \ 359 self.bookmarklet()) + \
401 self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js'])) 360 '\n' + \
361 self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js'])
362 )
402 jsLoadMode = 'LINKED' 363 jsLoadMode = 'LINKED'
403 versionType = 'development' 364 versionType = 'development'
404 365
405 else: 366 else:
406 raise NotImplementedError() 367 raise NotImplementedError()
407 368
408 return self.assembleVersion( 369 return self.assembleVersion(
409 pageTitle = pageTitle, 370 pageTitle = pageTitle,
410 copyright = copyright, 371 copyright = copyright,
411 css = css, 372 css = css,
412 js = js, 373 js = js,
413 jsLoadMode = jsLoadMode, 374 jsLoadMode = jsLoadMode,
414 version = self.repositoryVersion, 375 version = self.repositoryVersion,
415 versionType = versionType 376 versionType = versionType
416 ) 377 )
417 378
418 379
419 380
420 381
diff --git a/scripts/builder/frontends/betaBuilder.py b/scripts/builder/frontends/betaBuilder.py
index c5a3e76..9b32404 100644
--- a/scripts/builder/frontends/betaBuilder.py
+++ b/scripts/builder/frontends/betaBuilder.py
@@ -1,14 +1,17 @@
1from frontendBuilder import FrontendBuilder 1from frontendBuilder import FrontendBuilder
2import shutil 2import shutil
3 3
4class BetaBuilder(FrontendBuilder): 4class BetaBuilder(FrontendBuilder):
5 5
6 def name(self): 6 def name(self):
7 return "/beta builder" 7 return "/beta builder"
8 8
9 def projectResourceTypes (self):
10 return ['js', 'css', 'images']
11
9 def copyStaticResources (self, targetFolder): 12 def copyStaticResources (self, targetFolder):
10 for file in self.filterFiles(self.settings['staticResources']): 13 for file in self.filterFiles(self.settings['staticResources']):
11 src = self.absolutePathForSourceFile('staticResources', file) 14 src = self.absolutePathForSourceFile('staticResources', file)
12 dst = self.absolutePathForTargetFile(targetFolder, '', file) 15 dst = self.absolutePathForTargetFile(targetFolder, '', file)
13 shutil.copy2(src, dst) 16 shutil.copy2(src, dst)
14 17
diff --git a/scripts/builder/frontends/deltaBuilder.py b/scripts/builder/frontends/deltaBuilder.py
new file mode 100644
index 0000000..a341a83
--- a/dev/null
+++ b/scripts/builder/frontends/deltaBuilder.py
@@ -0,0 +1,16 @@
1from frontendBuilder import FrontendBuilder
2import shutil
3
4class DeltaBuilder(FrontendBuilder):
5
6 def name(self):
7 return "/delta builder"
8
9 def projectResourceTypes (self):
10 return ['js', 'css']
11
12 def copyStaticResources (self, targetFolder):
13 pass
14
15 def bookmarklet (self):
16 return "" \ No newline at end of file
diff --git a/scripts/builder/frontends/gammaBuilder.py b/scripts/builder/frontends/gammaBuilder.py
index a6ecb7b..c56fb1b 100644
--- a/scripts/builder/frontends/gammaBuilder.py
+++ b/scripts/builder/frontends/gammaBuilder.py
@@ -1,27 +1,30 @@
1from frontendBuilder import FrontendBuilder 1from frontendBuilder import FrontendBuilder
2import shutil 2import shutil
3 3
4class GammaBuilder(FrontendBuilder): 4class GammaBuilder(FrontendBuilder):
5 5
6 def name(self): 6 def name(self):
7 return "/gamma builder" 7 return "/gamma builder"
8 8
9 def projectResourceTypes (self):
10 return ['js', 'css', 'images']
11
9 def copyStaticResources (self, targetFolder): 12 def copyStaticResources (self, targetFolder):
10 resourcesToCopy = [ 13 resourcesToCopy = [
11 # {'folder': 'html', 'source': 'exit_template.html','target': 'exit.html'}, 14 # {'folder': 'html', 'source': 'exit_template.html','target': 'exit.html'},
12 {'folder': 'html', 'source': 'exit_template.html','target': 'logout.html'}, 15 {'folder': 'html', 'source': 'exit_template.html','target': 'logout.html'},
13 {'folder': 'css', 'source': 'static.css', 'target': 'static.css'} 16 {'folder': 'css', 'source': 'static.css', 'target': 'static.css'}
14 ] 17 ]
15 18
16 for resource in resourcesToCopy: 19 for resource in resourcesToCopy:
17 src = self.absolutePathForSourceFile(resource['folder'], resource['source']) 20 src = self.absolutePathForSourceFile(resource['folder'], resource['source'])
18 dst = self.absolutePathForTargetFile(targetFolder, '', resource['target']) 21 dst = self.absolutePathForTargetFile(targetFolder, '', resource['target'])
19 shutil.copy2(src, dst) 22 shutil.copy2(src, dst)
20 23
21 # src = self.absolutePathForSourceFile('html', 'exit_template.html') 24 # src = self.absolutePathForSourceFile('html', 'exit_template.html')
22 # dst = self.absolutePathForTargetFile(targetFolder, '', 'exit.html') 25 # dst = self.absolutePathForTargetFile(targetFolder, '', 'exit.html')
23 # shutil.copy2(src, dst) 26 # shutil.copy2(src, dst)
24 27
25 # src = self.absolutePathForSourceFile('css', 'static.css') 28 # src = self.absolutePathForSourceFile('css', 'static.css')
26 # dst = self.absolutePathForTargetFile(targetFolder, '', 'static.css') 29 # dst = self.absolutePathForTargetFile(targetFolder, '', 'static.css')
27 # shutil.copy2(src, dst) 30 # shutil.copy2(src, dst)
diff --git a/scripts/builder/frontends/gamma_mobileBuilder.py b/scripts/builder/frontends/gamma_mobileBuilder.py
index f2e80c9..677a2b0 100644
--- a/scripts/builder/frontends/gamma_mobileBuilder.py
+++ b/scripts/builder/frontends/gamma_mobileBuilder.py
@@ -1,9 +1,12 @@
1from frontendBuilder import FrontendBuilder 1from frontendBuilder import FrontendBuilder
2 2
3class Gamma_MobileBuilder(FrontendBuilder): 3class Gamma_MobileBuilder(FrontendBuilder):
4 4
5 def name(self): 5 def name(self):
6 return "/gamma.mobile builder" 6 return "/gamma.mobile builder"
7 7
8 def projectResourceTypes (self):
9 return ['js', 'css', 'images']
10
8 def copyStaticResources (self, targetFolder): 11 def copyStaticResources (self, targetFolder):
9 pass 12 pass
diff --git a/scripts/proxy/main.py b/scripts/proxy/main.py
index 107ba16..8ce4989 100755
--- a/scripts/proxy/main.py
+++ b/scripts/proxy/main.py
@@ -1,95 +1,102 @@
1from twisted.internet import reactor 1from twisted.internet import reactor
2from twisted.web import proxy, server, http, resource, static 2from twisted.web import proxy, server, http, resource, static
3from posixpath import basename, dirname 3from posixpath import basename, dirname
4 4
5import copy 5import copy
6import sys 6import sys
7import os 7import os
8import pprint 8import pprint
9 9
10#-------------------------------------------------------------------- 10#--------------------------------------------------------------------
11 11
12def scriptDir (): 12def scriptDir ():
13 return os.path.dirname(sys.argv[0]) 13 return os.path.dirname(sys.argv[0])
14 14
15def projectBaseDir (): 15def projectBaseDir ():
16 return os.path.abspath(scriptDir() + '/../..') 16 return os.path.abspath(scriptDir() + '/../..')
17 17
18def projectTargetDir(): 18def projectTargetDir():
19 return projectBaseDir() + '/target/' 19 return projectBaseDir() + '/target/'
20 20
21#-------------------------------------------------------------------- 21#--------------------------------------------------------------------
22 22
23class ClipperzTestSite(server.Site): 23class ClipperzTestSite(server.Site):
24 24
25 def __init__(self, resource, logPath=None, timeout=60 * 60 * 12): 25 def __init__(self, resource, logPath=None, timeout=60 * 60 * 12):
26 server.Site.__init__(self, resource, logPath, timeout) 26 server.Site.__init__(self, resource, logPath, timeout)
27 27
28 28
29 def getResourceFor(self, request): 29 def getResourceFor(self, request):
30 if request.uri.startswith('/json') or request.uri.startswith('/dump'): 30 uri = request.uri
31 uri = uri.split("?", 1)[0]
32 uri = uri.split("#", 1)[0]
33 if uri.startswith('/json') or uri.startswith('/dump'):
31 request.site = self 34 request.site = self
32 request.sitepath = copy.copy(request.prepath) 35 request.sitepath = copy.copy(request.prepath)
33 result = resource.getChildForRequest(self.resource, request) 36 result = resource.getChildForRequest(self.resource, request)
34 37
35 else: 38 else:
36 pathParts = request.uri.split('/') 39 pathParts = uri.split('/')
37 version = pathParts[1] 40 version = pathParts[1]
38 41
39 if pathParts[2].startswith('index.'): 42 if pathParts[2].startswith('index.'):
40 contentType = 'text/html' 43 contentType = 'text/html'
41 absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2]) 44 absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2])
42 result = static.File(absoluteFilePath, contentType) 45 result = static.File(absoluteFilePath, contentType)
43 46 elif pathParts[2].endswith('.webapp'):
47 contentType = 'application/x-web-app-manifest+json'
48 # absoluteFilePath = os.path.join(projectTargetDir(), 'dev', version, pathParts[2])
49 absoluteFilePath = os.path.join(projectBaseDir(), 'frontend', version, 'properties', pathParts[2])
50 result = static.File(absoluteFilePath, contentType)
44 else: 51 else:
45 #http://homer.local:8888/beta/css/clipperz/images/loginInfoBackground.png 52 #http://homer.local:8888/beta/css/clipperz/images/loginInfoBackground.png
46 #pathParts: ['', 'beta', 'css', 'clipperz', 'images', 'loginInfoBackground.png'] 53 #pathParts: ['', 'beta', 'css', 'clipperz', 'images', 'loginInfoBackground.png']
47 try: 54 try:
48 imagePathIndex = pathParts.index('images') 55 imagePathIndex = pathParts.index('images')
49 resourceType = 'images' 56 resourceType = 'images'
50 for _ in range(2, imagePathIndex): 57 for _ in range(2, imagePathIndex):
51 del pathParts[2] 58 del pathParts[2]
52 except: 59 except:
53 resourceType = pathParts[2] 60 resourceType = pathParts[2]
54 61
55 basePath = projectBaseDir() + '/frontend' 62 basePath = projectBaseDir() + '/frontend'
56 if resourceType == 'images': 63 if resourceType == 'images':
57 fileExtension = os.path.splitext(request.uri)[1] 64 fileExtension = os.path.splitext(uri)[1]
58 if fileExtension == '.png': 65 if fileExtension == '.png':
59 contentType = 'image/png' 66 contentType = 'image/png'
60 elif fileExtension == '.jpg': 67 elif fileExtension == '.jpg':
61 contentType = 'image/jpeg' 68 contentType = 'image/jpeg'
62 elif fileExtension == '.gif': 69 elif fileExtension == '.gif':
63 contentType = 'image/gif' 70 contentType = 'image/gif'
64 else: 71 else:
65 print "ERROR - unknown image extension: " + fileExtension 72 print "ERROR - unknown image extension: " + fileExtension
66 73
67 absoluteFilePath = basePath + '/'.join(pathParts) 74 absoluteFilePath = basePath + '/'.join(pathParts)
68 else: 75 else:
69 resourceType = pathParts[2] 76 resourceType = pathParts[2]
70 77
71 if resourceType == 'css': 78 if resourceType == 'css':
72 contentType = 'text/css' 79 contentType = 'text/css'
73 elif resourceType == 'js': 80 elif resourceType == 'js':
74 contentType = 'text/javascript' 81 contentType = 'text/javascript'
75 else: 82 else:
76 contentType = 'text/html' 83 contentType = 'text/html'
77 84
78 absoluteFilePath = basePath + request.uri 85 absoluteFilePath = basePath + uri
79 86
80 result = static.File(absoluteFilePath, contentType) 87 result = static.File(absoluteFilePath, contentType)
81 88
82 89
83 return result 90 return result
84 91
85 92
86 93
87def main (): 94def main ():
88 site = ClipperzTestSite(proxy.ReverseProxyResource('localhost', 8084, '/java-backend')) 95 site = ClipperzTestSite(proxy.ReverseProxyResource('localhost', 8080, '/java-backend'))
89 reactor.listenTCP(8888, site) 96 reactor.listenTCP(8888, site)
90 reactor.run() 97 reactor.run()
91 98
92 99
93if __name__ == "__main__": 100if __name__ == "__main__":
94 main() 101 main()
95 102