131 files changed, 59632 insertions, 79 deletions
@@ -80,41 +80,39 @@ When executed, this script will start listening on localhost:8888. | |||
80 | 80 | ||
81 | All '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')`). | 81 | All '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')`). |
82 | All 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. | 82 | All 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 | ||
84 | The only file that needs to be `build`, and not read directly from the file system, is the `index.html` file. | 84 | The only file that needs to be `build`, and not read directly from the file system, is the `index.html` file. |
85 | 85 | ||
86 | In order to build this file, the following command should be executed: | 86 | In 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 | ||
91 | Once 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: | 91 | Once 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 | ||
117 | This 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!** | 115 | This 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> |
22 | Clipperz_IEisBroken = true; | 22 | Clipperz_IEisBroken = true; |
23 | Clipperz_normalizedNewLine = '\x0d\x0a'; | 23 | Clipperz_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 © 2008-2013 Clipperz Srl - | 96 | Copyright © 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 | - | 99 | - |
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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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+AQQBCgCqARABFgEcASIBKAEuAPIBNACYAToBQAFGAUwBUgFYAV4AmACYAWQBCgDCAJgBCgEcAJgBWACeAWoA5gDa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) 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/gD0AKEA0ACtAKwArACsAK8AtwCvAK0A7ADVAP4A9AChANAArQCsAKwArACwALcArwCtAOwA1QD+APQAoQDQAK0ArACsAKwArwC3AK8ArQDsANUA/gD0AKcAiQCOAKcArAC1AIkAoADGAJUArwCvAIwAvQDEAIIArwCOAKwAiQDzAKIApACfAJMAUgCfAIwAkgCgAKAAmgCJAIkArwA6AFUATQA1ADoAcQAxAGAATgAvACsAbQArAFQAYABsADgAHAAcABwAGgAwABwAHAAmABwAHAAcABwAHAAcAFUAVQBmAFUA2ABVAHgAawBVAFUAVQBvAFUATABMAFUAJ//8AE0ATAC6AD4AJAAdAEYANAB1ABoAEQAhAB0AIQDJAJ8AdwCmACYAJgBIAEgAJgAmACEAIf/n/+f/+gBNAGIBAACoANEA2QD1ANsAuQDrAKgAqAD5ALEA6QC4APkAngCWALEAqgDPAMoA6gDeAOoAuQCpAOsA+QCoAKQAngCbALEAsACqALEA6gDzAJYApQDsAOwAzwDPAMoAvwCoAKQAbABsAPcA/QEjAOoApQDXANcA0gDqAOoArgCwAKgAqACoAKgAqACkAKgAqAC4AKwAuACsALgArACpAKgArgCyAK4AsgCuALIAqQCnALAArAEGAOcAAAAAAAAAAP/Z/9kBBQDeACEAIQEFAN4AEgASAQUA3gEFAQUA3gDe/9n/2f/Z/9kBBQEFAN4A3v/Z/9n/2f/ZAQUBBQDeAN4A3gDeAN4A3v/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/ZAEsASwEFAN7/2QC3AQUAtwC3/9n/2f/ZAQUAtwC3/9n/2f/ZAQUAtwC3/9n/2f/Z/9n/2f/Z/9n/2f/Z/9n/2f/ZAQX/2f/ZAQX/2f/Z/9n/2QEFAQUBBf/ZAN4BBQDe/9kA3v/ZAN4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAACDQAAASwAAAAAAAAAAAAAASwAAAAAAAEAAAAMAAAAAAC+AAIAHQACADUAAQBLAEwAAQBnAGcAAQBuAG4AAgB+AH4AAQChAKMAAQCpAKkAAQDNAM4AAQDmAOYAAQD8APwAAQEEAQQAAgEYARgAAQEcARwAAgEfAR8AAgEuAS4AAgEvATAAAQE1ATUAAgFVAVcAAQFdAV0AAQFsAWwAAgGCAYMAAQGaAaoAAQGtAa0AAQHDAcQAAQHIAcgAAgLNAs0AAQLXAtcAAQLdAxwAAwMeAx4AAwACAAMC3QL4AAEDAwMcAAEDHgMeAAEAAQAAAAoAbAIaAAJERkxUAA5sYXRuADgABAAAAAD//wAQAAAAAgAEAAYACAAKAAwADgAQABIAFAAWABgAGgAcAB4ABAAAAAD//wAQAAEAAwAFAAcACQALAA0ADwARABMAFQAXABkAGwAdAB8AIGFhbHQAwmFhbHQAymNhc2UA0mNhc2UA2GNjbXAA3mNjbXAA7GRub20A+mRub20BAGZyYWMBBmZyYWMBEG51bXIBGm51bXIBIG9udW0BJm9udW0BLG9yZG4BMm9yZG4BOHNhbHQBPnNhbHQBSnNpbmYBVnNpbmYBXHNzMDEBYnNzMDEBaHNzMDIBbnNzMDIBdHNzMDMBenNzMDMBgHNzMDQBhnNzMDQBjHN1YnMBknN1YnMBmHN1cHMBnnN1cHMBpgAAAAIAAAABAAAAAgAAAAEAAAABABAAAAABABAAAAAFAAMABAAFAAYABwAAAAUAAwAEAAUABgAHAAAAAQAJAAAAAQAJAAAAAwAIAAoACwAAAAMACAAKAAsAAAABAAgAAAABAAgAAAABAA8AAAABAA8AAAABAAwAAAABAAwAAAAEABEAEgATABQAAAAEABEAEgATABQAAAABAA4AAAABAA4EBAABABED/gABABEECAABABIEAgABABIEOAABABMEMgABABMESAABABQEQgABABQAAAABAA4AAAABAA4AAAACAAwADQAAAAIADAANABcAMAA4AEAASABQAFoAYgBqAHIAegCCAIoAlgCeAKYArgC2AL4AxgDOANYA3gDmAAEAAAABA/oAAwAAAAEEsAACAAAAAQCuAAYAAAABAMwABgAAAAIA1gDqAAQAAAABAPIABAAAAAEBZAAGAAAAAQIqAAEAAAABAjQAAQAAAAECTgABAAAAAQJoAAYAAAADAmYCeAKKAAEAAAABApIAAQAAAAECygABAAAAAQLkAAEAAAABAv4AAQAAAAEC/AABAAAAAQL+AAEAAAABAwYAAQAAAAEDOgABAAAAAQNOAAQAAAABBNwAAQAAAAEE5gABBT4ABAAOABQAGgAgAAIABgLhAAIAEALhAAIAIALhAAIAKgLhAAMAAAABBRgAAQUkAAEAAAACAAMAAAACBRgFHgABBSQAAQAAABUAAwAAAAEFFgABBRAAAQAAABYAAQUKAAMADAA2AFgABQAMABIAGAAeACQDDQACAt0DCwACAt8DEQACAuMDGwACAucDDwACAu0ABAAKABAAFgAcAxUAAgLdAxMAAgLfAxkAAgLjAxcAAgLtAAQACgAQABYAHAMJAAIC3QMFAAIC3wMDAAIC5QMHAAIC8wABBJoAEAAmADAAOgBEAE4AWABiAGwAdgCAAJIAnACmALAAugDEAAEABABLAAIC/wABAAQAZwACAv8AAQAEAG4AAgLjAAEABAB+AAIC/wABAAQAqQACAv8AAQAEAM0AAgL/AAEABAD8AAIC/wABAAQBBAACAvMAAQAEARgAAgL/AAIABgAMAR8AAgLjARwAAgL9AAEABAEuAAIC/wABAAQBNQACAvMAAQAEAV0AAgL/AAEABAFsAAIC8wABAAQBggACAv8AAQAEAcgAAgL9AAMAAQPwAAEEEgAAAAEAAAAWAAIEPAAOAkQCRQJGAkcCSAJJAkoCSwJMAk0CUAJRAk4CTwACBBoADgI2AjcCOAI5AjoCOwI8Aj0CPgI/AkICQwJAAkEAAQQOAIMAAwABBA4AAQQYAAAAAQAAABYAAwABBA4AAQQeAAAAAQAAABYAAwACBCAEFgABBAwAAAABAAAAFgACBBQAHQJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnEAAgN6AA4CGgIbAhwCHQIeAh8CIAIhAiICIwImAicCJAIlAAIDWAAOAigCKQIqAisCLAItAi4CLwIwAjECNAI1AjICMwABA6YACgABA6oAAQAAAQAAAgPeAAMCFwIYAhYAAAEBAAID2AAZAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwJTAnIAAAECAAIDuAAJAcQBxQHGAccByAHJAcoBywJzAAABAwABA7L/owACA7IAXAJWAlcCWAJZAloCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAm8CcAHFAcYBxwHIAckBygHLAnECFwIYAhYCFAJTAnICcwIZAt4C4ALiAuQC5gLoAuoC7ALuAvAC8gL0AvYC/gMAAwQDBgMIAwoDDAMOAxADEgMUAxYDGAMaAxwAAQOwABAAJgAsADIAPgBKAFYAYgBuAHoAhgCSAJ4AqgC0AL4AyAACAlUBrQACAlsBxAAFAkQCNgIaAigB1wAFAkUCNwIbAikB2AAFAkYCOAIcAioB2QAFAkcCOQIdAisB2gAFAkgCOgIeAiwB2wAFAkkCOwIfAi0B3AAFAkoCPAIgAi4B3QAFAksCPQIhAi8B3gAFAkwCPgIiAjAB3wAFAk0CPwIjAjEB4AAEAlACQgImAjQABAJRAkMCJwI1AAQCTgJAAiQCMgAEAk8CQQIlAjMAAQCEAAEACAABAAQBLwACAv8AAgLuAC0DIQEvAjYCNwI4AjkCOgI7AjwCPQI+Aj8CQAJBAkICQwLeAuAC4gLkAuYC6ALqAuwC7gLwAvIC9AL2Av4DAAMEAwYDCAMKAwwDDgMQAxIDFAMWAxgDGgMcAyIAAQAEAFkAkwEKAUcAAQABAucAAQABACQAAQABAv8AAQABAt8AAQABAS4AAQADAuEC5wLrAAEAEAACAAYACAAKABAAFgAcAB8AIAAiACQAJwAqAC8AMAHEAAIABQACABsAAAA2AEwAGgBOAHgAMQB6AJYAXACYAOYAeQABABwC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwACAAMBzQHWAAAB4QHiAAoB/wIAAAwAAQABAgUAAgABAkQCTQAAAAEAAgABAx8AAgACAjYCQwAAAoYCiAAOAAIAAQJEAlEAAAACAAECNgI/AAAAAQACAyEDIgACAAMAHAA1AAABCAEJABoBoQGhABwAAgABAc0B1gAAAAEAHQITAt0C3wLhAuMC5QLnAukC6wLtAu8C8QLzAvUC/QL/AwMDBQMHAwkDCwMNAw8DEQMTAxUDFwMZAxsAAQADAfYB9wIJAAIABAAcABwAAADnAPwAAQJSAlIAFwJVAlUAGAACAAMAIgAiAAABGQEfAAECWwJbAAgAAQABAnYAAQBcAB0AHgAfACAAIQAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1AOcA6ADpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APkA+gD7APwBCAEJARkBGgEbARwBHQEeAR8BoQH2AfcCCQITAlICVQJbAnYC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwACAAUAHAAcAAAAIgAiAAEBzQHWAAIB4QHiAAwB/wIAAA4AAQAtAAEBLgJEAkUCRgJHAkgCSQJKAksCTAJNAk4CTwJQAlEC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwMfAAAAAQAAAAoAOACSAAJERkxUAA5sYXRuAB4ABAAAAAD//wADAAAAAgAEAAQAAAAA//8AAwABAAMABQAGbWFyawAmbWFyawA2bWttawBGbWttawBMc2l6ZQBSc2l6ZQBWAAAABgAAAAEAAgADAAQABQAAAAYAAAABAAIAAwAEAAUAAAABAAYAAAABAAYAUgAAAE4AAAAHABAAGgAiACoAMgA6AEIAAQAAAAIARABOAAQAAAABAEwABAAAAAEDGgAEAAAAAQNaAAQAAAABBQ4ABAAAAAEFOAAGAQAAAQWiAGQAAAAAAAAAAAABBpoABf7U/agAAQaaAAT9qAABBpwGsgABAAwA6gA3AAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABngAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngBfAMYAzADSANgA3gDkAN4A2ADGAOoA6gDwAMYA9gDGAPwBAgEIAQ4A2ADYANgAxgEUAMYA/AEaASABJgEsATIBOAE+AUQBSgFKAVABVgFcAWIAwAEaAWgBbgF0AXoBgAFoAMAAwAGGAYwAxgGSAN4AxgEUAZgA2ADGANgAxgGeARoBMgGkAaQAwAGqAMAAwAGAAYABIAGkAbABPgEyAbYBvADAAcIByAGAAc4B1AFoAMABdAHaAT4BPgE+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/6gABArQCugABAAwAEgABAAAADgADAA4AFAAaAAEBLAH0AAEBqgKAAAECBAKUAAEBngH0AAECkgKaAAEADAAWAAIAAAAkAAAAJAAMACAAJgAsABoAGgAyADgAPgA4ADIARABKAAEBLAAAAAEB7AAAAAEBogAAAAEBGgAAAAEBlAAAAAEBjAAAAAEBYgAAAAEBJQAAAAEBqAAAAAEBHgJQAAEADADqADcAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADmAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAMAFAAaABoAAQEsAgoAAQEsAqAAAQEsAuQAAQEsAtoAAgABAoYCiAAAAAIAAQLdAx4AAAACAAMC3QL4AAADAwMcABwDHgMeADYAAgATAAIANQAAAEsATAA0AGcAZwA2AH4AfgA3AKEAowA4AKkAqQA7AM0AzgA8AOYA5gA+APwA/AA/ARgBGABAAS8BMABBAVUBVwBDAV0BXQBGAYIBgwBHAZoBqgBJAa0BrQBaAcMBxABbAs0CzQBdAtcC1wBeAAEAAgL9Av4AAQAGAAQAFAAVAB4ALgAvAAEABQL6AvsC/AMBAwIAAgAMAAIAEQAAABMANQAQAKMAowAzAM4AzgA0AOYA5gA1ATABMAA2AVcBVwA3AYMBgwA4AZoBmgA5AZwBqgA6Aa0BrQBJAcQBxABKAAEAAQL5AAEAAwAQABYAKgABAAIC/wMAAAEADAACAAYACgAQABYAIAAkACoBMAGgAaEBrQABAAMC4QLpAusAAAABAAAACAAAAAQADgACaWRlb3JvbW4AAkRGTFQADmxhdG4ADgAGAAAAAAABAAIACAAMAAH/VgABAAAAAAAAAAEAAQABAAAAAQAAIEQAAAAUAAAAAAAAIDwwgiA4BgkqhkiG9w0BBwKggiApMIIgJQIBATELMAkGBSsOAwIaBQAwYQYKKwYBBAGCNwIBBKBTMFEwLAYKKwYBBAGCNwIBHKIegBwAPAA8ADwATwBiAHMAbwBsAGUAdABlAD4APgA+MCEwCQYFKw4DAhoFAAQUDWOwCnxZgI3jhtORuER8z1PsTCSgghsPMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+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/RFQSvmE1J7WgwCQYFKw4DAhoFAKCBmDAUBgkrBgEEAYI3KAExBwMFAAMAAAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIgYKKwYBBAGCNwIBDDEUMBKhEIAOd3d3LmFkb2JlLmNvbSAwIwYJKoZIhvcNAQkEMRYEFL/QEoPJyRePVeacn0st03e8wj6wMA0GCSqGSIb3DQEBAQUABIIBAAf8l/EScHqllkifiSOwrmEDemwxUcaIT9XRY1+r6yZtqK5z0U47eVlBO3NDLNF+59dYat4pmiGZ6hE2n+DFAFen1Dz8hLWfm5Qz2QvsW4m4wwiVcCDc0pyTeCw1Q8V6cCBgOawav1uy85anXYJZjMP4WBaUMrl8ZsSb/yt++m7N6PRfb2uwtWjqmRlTCOCfHOLhgvCUE1gh1ZitEby1N46ga+fwp013Bp/1F9D6bCG4y1fAbIXu9yrBbnSTyBYpHKkqlNrlewYAPCRLpqvSmJfnX3EFaqeoXo8oVmcZIhLVrCl+NQo6BQk74kYDZnC571r/Cj9t8lZwh1ZLTqYi2BGhggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTExMTkyNTMwWjAjBgkqhkiG9w0BCQQxFgQUKUgspiGAWwjavzbWCM6oIXrsfCkwDQYJKoZIhvcNAQEBBQAEggEAadeXZP1KXZCd3+PxMvj9oDa4csedro9Ptb+WcSkaym5Dby/lDKj0AgND5AYiIwhS3X79jAYpfDrJT/+WH5lwPLFgNu33ETyaBDLlNgMWmrSPFA8w6PX94+rTBZ6tdZtMO+D8bI9mjDnXM592Fc1fI5871SfDUhJUOxO3nbgTi1cBuslx3E0tPg3ZbijMetTQqn9cRnsKYkV6RyLrPWFrXi8ZgKCLafSrYgwezZLBkOHJVDyAck5DsVj3HXbOrlLiAglgUpPKyhFWONuaRJyk3x9kBmo68SCgwbOTEYJ2K1XGSDx8H8/JRsYdnrONwdSmDircY9nXmlff7HxqKHopfw==) 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,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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+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWds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) format('truetype'); | ||
85 | } | ||
86 | div.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 | } | ||
100 | div.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 | } | ||
112 | div.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 | } | ||
136 | div.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 | } | ||
158 | div.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 | } | ||
180 | div.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 | } | ||
190 | div.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 | } | ||
227 | div.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 | } | ||
239 | div.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 | } | ||
251 | div.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 | } | ||
263 | div.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 | } | ||
275 | div.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 | } | ||
287 | div.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 | } | ||
299 | div.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 | } | ||
311 | div.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 | } | ||
323 | div.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 | } | ||
335 | div.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 | } | ||
347 | div.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 | } | ||
359 | div.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 | */ | ||
563 | body { | ||
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 | } | ||
568 | a { | ||
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 | } | ||
590 | div.page { | ||
591 | padding: 0px; | ||
592 | margin: 0px; | ||
593 | width: 100%; | ||
594 | } | ||
595 | div.page div.header h1 { | ||
596 | font-size: 36pt; | ||
597 | font-weight: 900; | ||
598 | color: #ff9900; | ||
599 | margin: 0px 10px; | ||
600 | } | ||
601 | div.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 | |||
1134 | THREE 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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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,iVBORw0KGgoAAAANSUhEUgAAAJAAAACQCAYAAADnRuK4AAAQRUlEQVR4Ae1dCZAU1Rn+33IJeGuBG6OhMFqaKAJqEiMoAmqpMR4gRkgssAy7IEaoJBqrjAQTj1ixiDHuzkyqVBRyWCzZ1SRGJQqeJEaNRxkrCXhFAYMKKsQAuy/f370rvbM9Pd3z+ngz87+t2b7e8f/f+/p/92ultSZxgkClCDRUGlDCCQKMgBBIeGCEQH+j0DYHzqlhEG+uJSK2ULN+xxJZYhWjdglENAz2dWGsaFUaWRctR9CaJJAUYZWSQsI5CAiBhAhGCAiBjOCTwEIg4YARAkIgI/gksBBIOGCEgBDICD4JLAQSDhghIAQygk8CC4GEA0YICIGM4JPAQiDhgBECQiAj+CSwEEg4YISAEMgIPgksBBIOGCEgBDKCTwILgYQDRggIgYzgk8BCIOGAEQJCICP4JLAQSDhghIAQyAg+CSwEEg4YISAEMoJPAguBhANGCAiBjOCTwEIg4YARAkIgI/gksBBIOGCEgBDICD4JLAQSDhghUBmBlFJGqUpg+xCoME8r26EsT09TQa0jTW3USb+nufoj+xARicoi0KJ2p350JimaQnkaCf/Hlg1T5CE6gQrqcMRxjPNTdD71p48prx7A9XIIch/N1luK0pBLmxAoqL3w4p8FkaYi707DcbdPxOO8na1f+eQ6xEl0Amk6F0Txut1wfTZu8G87yLSy2zJ10KX6Xa9HOc8IgdvUfrA0ZzuWRtFkHAf6SsJ5S3SD77MSN6MTiOicEnHx7YEQ7ozuXx7F3CriDSb/R+10ud4YEE4exY3ALWo4DUJeNTiWZgLyJExec95GIpCKtFN9Th0Igd5EIr1tUDnlNWik6DHHMmlagS1v3yoXxPh5Th0JWV80jieOCLroKOj8UhxRBcbB+aPoPPymAOvxOEZtJHFOHRQlf8KwcpfMblEVjTwc2lXkJBz5dwuKuTW4uxxKMpleYy/iKkQgp0YA0/MQeiro8iUc3fyJnkssgMIfV0Va+CKMi0ogLiNNHQt5PCI5HsebQaa/4tjmWKcm/U/TyOsifF4dCszYykwBaSK3nAIxUk49KDSBwhdhP1V70xBns+wBgQKYPXwBwdkytVGTftkoqlorwvLqcw5p2NIQjTLCJjjwDtqGTdrn683B3tyn4S3QYPoKgiRJHpaIgRkFoK5FBfzvDpGYUE36eX5Ydy6vjobOUx3iKDoiJf0HkJvXS8OkF55AKrD1FSatqH6OAHBXI9DVINNakGk5Oi3b0Gn5dNSIqsp/izoOTe4p0J2Jc0gmsrt5HYpA4YqwRWo3aqRNUGZoJgr1TvR1XK6gnSDUpfQUlWpGVksRxkMIt6E+2N8pmrgy/Jne6mZytZXW0/60UH9cLvVwFugAOgUR2UAe1ocBXgDAF6D7/W1YpxVoerbRw+gmuEd3sgfr3TTVjyaimd0AS5N3WlCfskzmoeTm+X3l5ApngfLqdpjTWeUiy/S5dir47ZBhOW2gR2g4HY4MsqcfaCO9gkw5GfJxJfgc4Mmfo7LXaboDdc+LywlYnkD8tkxGlhBMWvW491BnWoNMOsMKkTX9AbJwH82+VsgTTohNtBKUL2PVyxOoVZ2ESt2qcGmKr5pCoJMm0By9Okin8l3dDam3voLklWdpIhAi78sTKHjwNE11JK30EQgaOHekCSZQixqNsntE+nJLilYgwHnPHAhwwQTq54yLBASXRzWPQBkOBBMo/d7nms+PqlOwDAdKt8Ja1Ui0vtZWncIicPwIdGJIZY5e5xdxaQsUogbuF6Hcq0EEArhQmkDuvJAaRENUioxAABf8i7CcGobW13r8ShMsshQSoGoR4ImuGsPpzfqdYh38CdJAXxXyFENVx9dsSJgTPs6fQNJ56ANV3d/y7VTsW4S5qxU3wQINqnvIBIBdCGgszurEgHrRKuS+Fqg/nS7k2YWbnHUjwAaFuVHk+hLIXZ1Y5E0uBQEg4MONvgQi2gceuwQwQaAXAi4n9ul1Dxd960Dsg5fFDnYWmJ0DMk2UIq0Ytjq55nqPwmRhwtL0/1KH3/J0fwJ58eFKNZd92iEUr3vvw0KvdzmvcgQ0vQ8NeAZlBxYu3F9caS7WrjyBvCEWqf6Y5MjLk7lJx/0CB3sfy3nVIvAGJL8XRqIdk5dXYzXGzrCaRCNQcawFNdaxTC6hklwtWZyyXJsj8IJDGLY0s/WzlUZnRiBvqrzInwfd3KJuHKxUuCVD3jjkPDkENAokosedoqkLliamTS3iI5BX9cVqX6yj56XQvHzlVBxtWVPmlbIezrfihX4QirZjvfvvaIF+L26lkyGQV0pe1eouUuNtQ84CoexeD+WVvRrP3fVxvCCwA/WZh8KsLjVRM3kCeaVbpBqw4I+3deFKOG+5dqj3sZxXiIAm3hanw6nTbMRy74U6tX68dAlUjA9vWeLurchF3XE4V8Ve5NoXAQ2y8CYT7fh1GG+F45tEuJvZEsgrY0E1dlfA2TJNxCP/jSC9YerrfDvw4U69DuDDLaf1NqhvD4G8aNyk9qA9nUFdtky8PHkv7+M6Ot8M0tyPXzt9gOMV+kPbdLeTQF6UCmoAAJyAW2yZuCL+ae/jGjz/N/TtgF5saVbB0uywWUf7CVSMXqs6xulvUnQZHtWKZdoC0tyKIex2rH54plhlm6+rj0CMZl6diP+P4A31m01gM97+svFIdxes7Bz9mL8He+9WH4FuVXtiahNvxmnDTl7x5aym17DP/9F0mf4gvkiTj6n63uCB2BCu1sjD+czr0AfRz5LP8nhTqC4LlFPTUGj9Jl4ILIuN935u0issk6qkONVDIHcb/xfxptb6fKRNGPY8CvNweFc46111FGG8k6miJXVAHibM/pjHcLv1zOkWsDoI1ErzQZ5J1QJqDHKejt1n58QQT+JR2F+E8X7Pivh7GvW2Tm0b7aAx+ObaPxJngUECdlugW9UgVJqX1SF5OEuHoCi7m3gascXObgINouuAXf1OlVX0BUx/4c89WOvsLcIK6mSg9if86nuKB09F1XQCpqD+xUYW2Ukg/rTUYPQ2K3w9TxwjwPWgMRhY3WYbHHYWYYPxxTwhj5crh8EK3ey9Ycu5fRaooKYDnGW2AGSVHJ2YGzVH32+TTHYRqEUdhJYHD5TubRNI1siiMU1+Jx1p0+fU7SnCeMJ9P7pLyBNAV4X1Lf2pEOAj9Uf2EKiRvo16z4TUEai2BPkLzTk10xax7SjC+NugiriZKhPpwzBDY4a0xtyhmFaXhkmylJ/sLRAvPFROpVnIUyqXiu8rLDngwWUu9jN2mQuAUv0GYPD5jHGovuQVnQjsvpu14NkSqFVNxpt0edYgBKTPKyQyz6SS8vHn0d1Pg5f0kvSD7AjEGzA00J1Q0M6hCh5C2EkXYHbgTyDjL5POiArj52J/KfGgc0YuOwINpRyoc2BGeodJ9krMCnzS8biZmnH8V5hAqftR6BcaSNennm53gtm0wvLqIqcSmJXW5dLlhX1NmjeA2OV4My3CxgV2thQ15JqEsbJHdgmczln6Fog3oiIsorPXvYoNJWf2EY938dL0nT737bihINsSzGJMfaFlugTiZqdCbzM3Q+1027Eb+/k0X2/2Fa9JM/Hv9X2W9U0efNbOkqdUJUmXQI10BcgzPlUNoyU2v+zS4q00Cxn1ZrRoU/KtaAZ6qaellJqTTHp1ILcOsQapDkhTwdBpaaw3a9JfC+W/oMbB3yr8+oXyn66n97DC9Siap99OI9l0LNBiNRjKLMXPTvLwhK0t9M3QgM/Wj8PvNaH9p+txX7TK7iBeCpWCS4dAQ+km6HJECvpET0Kjykw0NfLeO+vpRhRlPOXWRncqOknmpSFY8kVYTp2GDsM/pqFMRWlouhhF1x0VhW1RB6AQex71Ovs2DuUXQ9FYNO1fqUi3kIGStUC3qf1AnsoyJ6QCht6WVEweTpiXH2u6CGfcD2OXU5hVztUG3qArQZcsgdzJT40Jyl951JpeQuC5lUfQHbJZPwD6cBFtozsGQi1MUrDkCJRXs2BCz0tS+Irj1vQRZDs/tlUOG7B2SxO3MG1038OA6/FJCZZMHahVjUTd4G8Qeo+kBDeKV9N0FF2/MoqjODD3sDfQc7ht43zutRgYHl3uyzvFKoW5jt8CTVP9QJ67kbid5CFqjZ08jDTPDuyiS8KAnoGfQzCXenES6cZPoEl0FQT9chLCxhDns/iE2oIY4vGPolm3oShr8X+Y+d1LUJSdFbcU8RZheXUsBHwK9QsbNwTYgnGusRiqWBc3iL3i4ym6jfRn3LNvTT9/R0Ojl7pZv9NLZoOL+CxQQQ0BcXgnDRvJQyheZiVOHs6Ihfpj/L8Av618aZXj/qoG+kWcMsVHoC6s3SZrJ4gtxlv32ziBC4zL7by7NNBPdg/Hom8otq6V+AjUrJ+AeWQS8UdA7HFu8/rK1AWarZcAj6WppxuUoKblKMZHoftifZC3KM/irQNxyu6nCRbh7EoUZ/ERNIpWPX41vQvAxqD5ms30C/eDxc9AnMN6RMrkyP1eGosXmnXsey/GT6AehFrVSaDP3SBRVlu0aJDnzMw3I8ipMcCAGxZZTXx/Gn1A0/ESJTKnOzkLMUevxnDeKDD/nh5OpXrswnozG3ayaNbPAYP0p8Ly5xM0MFiPLpWEyMP5mZwF8rKF13IrzINWtLv3doLnq2klJpnfozsTTCNa1AXFlfjeE/WjxRDF9xsgzzfQYfpolECV+E3OAnmladZ3gjyjcYv7R5J2G5HAhVaRhzXuxLQRojf4NFHHFn8b1s2nQB7WIx0L1IMY7zjaSD/A23EVCBU/eV2zfQoqiw/3JGnVMadOgN6r8Euir+xDFFrfgu53pqlzugTq0axVjcd4GTdxD+65FdPxGjRRfxhTXMlEk1f88lwfc+Rs2WdA97Uxx1s2uvitQNkk4cH9LhZ39f86jPeQfh5EhfG6kH6z87aBfozEV8YkQCes+Y+g97gsyMM6ZGOBvOi5q1R/jluVj95regsrEcbgW1v/8UZt7fktajjmCz4P+YYbyPg6wn4dxHncIA7joNlYIK/YTfouVDBH402qbEKWu4/yBVVDHtb9cr3RaSVVOhVWE89lOjpr8rAq2ROIpeAR8g1YcKixXQm3V6K5q1BxfCJaEAt8N+mHIAUXZ1EcV5QvQgtrOsizJUrApPxmX4QVa+a2VJaiojmi+JHP9b3UhL4Vre2b1O4jbJ9b3Co9gB6FruWnnGr0Zu9ARXmefrVPPBnesMMCeQFga8LfDi23Jw9/Y7STZlYteVjnhZr3ILoQlvd9LwRF51xRvhYr0MbbRh6W0z4L5EUvp2bg7eRd64s3Y9gO4Mehi96ukX+v7FHOc+pcVCZW9AniviQzoOeTfZ5ZcsM+C+QFplkvw9vH1qg3gF3YErhWyMP68lyl4p01NCbnsSW2mDwsut0WiCVkxxP1JzufPfo+gG5DJZJn/NWW423qBqElqmkkfnNBqmXVoGB1EKgHyYL6Im2mlyOvY+8Jb/uxRX0WRdlOkOc120Xtka+6CNQjtRytQcDuOpA1MIkgpRAQApVCRu6HQkAIFAom8VQKASFQKWTkfigE/g/bLvzSA1vrjQAAAABJRU5ErkJggg=="> | ||
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,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"> | ||
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> | ||
69 | Clipperz_IEisBroken = true; | ||
70 | Clipperz_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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | |||
27 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
28 | if (typeof(Clipperz.Async) == 'undefined') { Clipperz.Async = {}; } | ||
29 | |||
30 | Clipperz.Async.VERSION = "0.1"; | ||
31 | Clipperz.Async.NAME = "Clipperz.Async"; | ||
32 | |||
33 | Clipperz.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 | |||
49 | Clipperz.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 | |||
292 | Clipperz.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 | |||
327 | MochiKit.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 | |||
424 | MochiKit.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 | |||
705 | CLIPPERZ_DEFERRED_LOGGING_ENABLED = true; | ||
706 | CLIPPERZ_DEFERRED_TRACING_ENABLED = false; | ||
707 | CLIPPERZ_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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Base) == 'undefined') { Clipperz.Base = {}; } | ||
26 | |||
27 | Clipperz.Base.VERSION = "0.2"; | ||
28 | Clipperz.Base.NAME = "Clipperz.Base"; | ||
29 | |||
30 | MochiKit.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, "<"); | ||
255 | result = result.replace(/>/g, ">"); | ||
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,"<"); | ||
425 | result = result.replace(/>/img,">"); | ||
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]|\/)))/); | ||
483 | MochiKit.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 | ||
486 | MochiKit.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 | |||
489 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | |||
26 | //============================================================================= | ||
27 | |||
28 | Clipperz.ByteArray_abstract = function(args) { | ||
29 | return this; | ||
30 | } | ||
31 | |||
32 | Clipperz.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 | /* | ||
674 | Clipperz.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 { | ||
692 | Clipperz.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 | |||
714 | Clipperz.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 | |||
861 | Clipperz.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 | |||
929 | Clipperz.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 | /* | ||
1060 | Clipperz.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 { | ||
1079 | Clipperz.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 | |||
1102 | Clipperz.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 | |||
1239 | Clipperz.ByteArray = Clipperz.ByteArray_array; | ||
1240 | //Clipperz.ByteArray = Clipperz.ByteArray_string; | ||
1241 | //Clipperz.ByteArray = Clipperz.ByteArray_hex; | ||
1242 | |||
1243 | //############################################################################# | ||
1244 | |||
1245 | Clipperz.ByteArray.byteToHex = function(aByte) { | ||
1246 | return ((aByte < 16) ? "0" : "") + aByte.toString(16); | ||
1247 | } | ||
1248 | |||
1249 | |||
1250 | Clipperz.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 | |||
1277 | Clipperz.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 | |||
1301 | Clipperz.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 | |||
1341 | Clipperz.ByteArray.exception = { | ||
1342 | InvalidValue: new MochiKit.Base.NamedError("Clipperz.ByteArray.exception.InvalidValue") | ||
1343 | }; | ||
1344 | |||
1345 | //############################################################################# | ||
1346 | |||
1347 | Clipperz.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 | |||
1359 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | |||
26 | |||
27 | Clipperz.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 | |||
47 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
33 | if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } | ||
34 | |||
35 | //############################################################################# | ||
36 | |||
37 | Clipperz.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 | |||
59 | Clipperz.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 | |||
131 | Clipperz.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 | |||
153 | Clipperz.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 | |||
288 | Clipperz.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 | |||
297 | Clipperz.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 | |||
495 | Clipperz.Crypto.AES.VERSION = "0.1"; | ||
496 | Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES"; | ||
497 | |||
498 | MochiKit.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 = [ | ||
519 | 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, | ||
520 | 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, | ||
521 | 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, | ||
522 | 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, | ||
523 | 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, | ||
524 | 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, | ||
525 | 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, | ||
526 | 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, | ||
527 | 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, | ||
528 | 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, | ||
529 | 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, | ||
530 | 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, | ||
531 | 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, | ||
532 | 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, | ||
533 | 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, | ||
534 | 0x8c, 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 | |||
857 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
33 | if (typeof(Clipperz.Crypto.AES_2) == 'undefined') { Clipperz.Crypto.AES_2 = {}; } | ||
34 | |||
35 | //############################################################################# | ||
36 | |||
37 | Clipperz.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 | |||
59 | Clipperz.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 | |||
131 | Clipperz.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 | |||
153 | Clipperz.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 | |||
288 | Clipperz.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 | |||
297 | Clipperz.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 | |||
495 | Clipperz.Crypto.AES_2.VERSION = "0.1"; | ||
496 | Clipperz.Crypto.AES_2.NAME = "Clipperz.Crypto.AES_2"; | ||
497 | |||
498 | MochiKit.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 = [ | ||
519 | 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, | ||
520 | 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, | ||
521 | 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, | ||
522 | 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, | ||
523 | 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, | ||
524 | 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, | ||
525 | 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, | ||
526 | 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, | ||
527 | 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, | ||
528 | 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, | ||
529 | 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, | ||
530 | 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, | ||
531 | 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, | ||
532 | 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, | ||
533 | 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, | ||
534 | 0x8c, 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 | |||
841 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.Crypto.Base depends on Clipperz.Base!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||
29 | if (typeof(Clipperz.Crypto.Base) == 'undefined') { Clipperz.Crypto.Base = {}; } | ||
30 | |||
31 | Clipperz.Crypto.Base.VERSION = "0.1"; | ||
32 | Clipperz.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 | */ | ||
43 | var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ | ||
44 | function 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 | } | ||
49 | function S (X, n) {return ( X >>> n ) | (X << (32 - n));} | ||
50 | function R (X, n) {return ( X >>> n );} | ||
51 | function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));} | ||
52 | function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));} | ||
53 | function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));} | ||
54 | function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));} | ||
55 | function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));} | ||
56 | function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));} | ||
57 | function 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 | } | ||
79 | function 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 | } | ||
86 | function 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 | } | ||
95 | function 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 | |||
378 | function 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 | |||
391 | function integer(n) { | ||
392 | return n % (0xffffffff + 1); | ||
393 | } | ||
394 | |||
395 | function 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 | |||
408 | function 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 | |||
420 | function 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 | |||
429 | function 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 | |||
449 | function 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 | |||
469 | function 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 | |||
489 | function not(a) { | ||
490 | a = integer(a); | ||
491 | return 0xffffffff - a; | ||
492 | } | ||
493 | |||
494 | /* Here begin the real algorithm */ | ||
495 | |||
496 | var state = new array(4); | ||
497 | var count = new array(2); | ||
498 | count[0] = 0; | ||
499 | count[1] = 0; | ||
500 | var buffer = new array(64); | ||
501 | var transformBuffer = new array(16); | ||
502 | var digestBits = new array(16); | ||
503 | |||
504 | var S11 = 7; | ||
505 | var S12 = 12; | ||
506 | var S13 = 17; | ||
507 | var S14 = 22; | ||
508 | var S21 = 5; | ||
509 | var S22 = 9; | ||
510 | var S23 = 14; | ||
511 | var S24 = 20; | ||
512 | var S31 = 4; | ||
513 | var S32 = 11; | ||
514 | var S33 = 16; | ||
515 | var S34 = 23; | ||
516 | var S41 = 6; | ||
517 | var S42 = 10; | ||
518 | var S43 = 15; | ||
519 | var S44 = 21; | ||
520 | |||
521 | function F(x, y, z) { | ||
522 | return or(and(x, y), and(not(x), z)); | ||
523 | } | ||
524 | |||
525 | function G(x, y, z) { | ||
526 | return or(and(x, z), and(y, not(z))); | ||
527 | } | ||
528 | |||
529 | function H(x, y, z) { | ||
530 | return xor(xor(x, y), z); | ||
531 | } | ||
532 | |||
533 | function I(x, y, z) { | ||
534 | return xor(y ,or(x , not(z))); | ||
535 | } | ||
536 | |||
537 | function rotateLeft(a, n) { | ||
538 | return or(shl(a, n), (shr(a, (32 - n)))); | ||
539 | } | ||
540 | |||
541 | function 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 | |||
548 | function 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 | |||
555 | function 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 | |||
562 | function 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 | |||
569 | function 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 | |||
664 | function 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 | |||
675 | function 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 | |||
692 | function 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 | |||
792 | var keySizeInBits = 256; | ||
793 | var 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] | ||
802 | var 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] | ||
807 | var shiftOffsets = [ ,,,,[,1, 2, 3],,[,1, 2, 3],,[,1, 3, 4] ]; | ||
808 | |||
809 | // The round constants used in subkey expansion | ||
810 | var Rcon = [ | ||
811 | 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, | ||
812 | 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, | ||
813 | 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, | ||
814 | 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, | ||
815 | 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ]; | ||
816 | |||
817 | // Precomputed lookup table for the SBox | ||
818 | var SBox = [ | ||
819 | 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, | ||
820 | 118, 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, | ||
821 | 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, | ||
822 | 216, 49, 21, 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, | ||
823 | 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, | ||
824 | 179, 41, 227, 47, 132, 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, | ||
825 | 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, 67, 77, 51, 133, 69, | ||
826 | 249, 2, 127, 80, 60, 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, | ||
827 | 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, 19, 236, 95, 151, 68, | ||
828 | 23, 196, 167, 126, 61, 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, | ||
829 | 144, 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, | ||
831 | 141, 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, | ||
833 | 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, 225, | ||
834 | 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, | ||
835 | 140, 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 | ||
839 | var SBoxInverse = [ | ||
840 | 82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, | ||
841 | 251, 124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, | ||
842 | 233, 203, 84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, | ||
843 | 250, 195, 78, 8, 46, 161, 102, 40, 217, 36, 178, 118, 91, 162, 73, | ||
844 | 109, 139, 209, 37, 114, 248, 246, 100, 134, 104, 152, 22, 212, 164, 92, | ||
845 | 204, 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, | ||
847 | 228, 88, 5, 184, 179, 69, 6, 208, 44, 30, 143, 202, 63, 15, 2, | ||
848 | 193, 175, 189, 3, 1, 19, 138, 107, 58, 145, 17, 65, 79, 103, 220, | ||
849 | 234, 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, | ||
852 | 198, 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, | ||
854 | 127, 169, 25, 181, 74, 13, 45, 229, 122, 159, 147, 201, 156, 239, 160, | ||
855 | 224, 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, | ||
857 | 125 ]; | ||
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 | |||
864 | function 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 | ||
871 | var Nk = keySizeInBits / 32; | ||
872 | var Nb = blockSizeInBits / 32; | ||
873 | var Nr = roundsArray[Nk][Nb]; | ||
874 | |||
875 | // Multiplies the element "poly" of GF(2^8) by x. See the Rijndael spec. | ||
876 | |||
877 | function 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 | |||
887 | function 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 | |||
902 | function 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 | |||
915 | function 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 | |||
928 | function 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 | |||
950 | function 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 | |||
964 | function 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 | |||
998 | function Round(state, roundKey) { | ||
999 | byteSub(state, "encrypt"); | ||
1000 | shiftRow(state, "encrypt"); | ||
1001 | mixColumn(state, "encrypt"); | ||
1002 | addRoundKey(state, roundKey); | ||
1003 | } | ||
1004 | |||
1005 | function InverseRound(state, roundKey) { | ||
1006 | addRoundKey(state, roundKey); | ||
1007 | mixColumn(state, "decrypt"); | ||
1008 | shiftRow(state, "decrypt"); | ||
1009 | byteSub(state, "decrypt"); | ||
1010 | } | ||
1011 | |||
1012 | function FinalRound(state, roundKey) { | ||
1013 | byteSub(state, "encrypt"); | ||
1014 | shiftRow(state, "encrypt"); | ||
1015 | addRoundKey(state, roundKey); | ||
1016 | } | ||
1017 | |||
1018 | function 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 | |||
1029 | function 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 | |||
1049 | function 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 | |||
1073 | function 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 | |||
1088 | function 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 | |||
1103 | function 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 | |||
1119 | function 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 | |||
1140 | function 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 | |||
1158 | function 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 | |||
1200 | function 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 | |||
1222 | function 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 | |||
1268 | function 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 | */ | ||
1431 | var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ | ||
1432 | var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ | ||
1433 | var 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 | */ | ||
1439 | function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} | ||
1440 | function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} | ||
1441 | function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} | ||
1442 | function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } | ||
1443 | function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } | ||
1444 | function 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 | */ | ||
1449 | function 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 | */ | ||
1457 | function 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 | */ | ||
1555 | function 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 | } | ||
1559 | function md5_ff(a, b, c, d, x, s, t) | ||
1560 | { | ||
1561 | return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); | ||
1562 | } | ||
1563 | function md5_gg(a, b, c, d, x, s, t) | ||
1564 | { | ||
1565 | return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); | ||
1566 | } | ||
1567 | function md5_hh(a, b, c, d, x, s, t) | ||
1568 | { | ||
1569 | return md5_cmn(b ^ c ^ d, a, b, x, s, t); | ||
1570 | } | ||
1571 | function 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 | */ | ||
1579 | function 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 | */ | ||
1599 | function 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 | */ | ||
1609 | function 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 | */ | ||
1618 | function 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 | */ | ||
1630 | function 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 | */ | ||
1642 | function 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 | */ | ||
1657 | function 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 | |||
1682 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (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 | ||
180 | bpe=0; //bits stored per array element | ||
181 | mask=0; //AND this with an array element to chop it down to bpe bits | ||
182 | radix=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 | ||
185 | digitsStr='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_=!@#$%^&*()[]{}|;:,.<>/?`~ \\\'\"+-'; | ||
186 | |||
187 | //initialize the global variables | ||
188 | for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform | ||
189 | bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt | ||
190 | mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits | ||
191 | radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask | ||
192 | one=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 | ||
196 | t=new Array(0); | ||
197 | ss=t; //used in mult_() | ||
198 | s0=t; //used in multMod_(), squareMod_() | ||
199 | s1=t; //used in powMod_(), multMod_(), squareMod_() | ||
200 | s2=t; //used in powMod_(), multMod_() | ||
201 | s3=t; //used in powMod_() | ||
202 | s4=t; s5=t; //used in mod_() | ||
203 | s6=t; //used in bigInt2str() | ||
204 | s7=t; //used in powMod_() | ||
205 | T=t; //used in GCD_() | ||
206 | sa=t; //used in mont_() | ||
207 | mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() | ||
208 | eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() | ||
209 | md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() | ||
210 | |||
211 | primes=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 | ||
217 | function 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 | ||
239 | function 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. | ||
288 | function 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 | ||
297 | function 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. | ||
304 | function 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. | ||
311 | function 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. | ||
318 | function 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. | ||
325 | function 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. | ||
332 | function 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 | ||
339 | function 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. | ||
346 | function 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 | ||
353 | function 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. | ||
361 | function 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. | ||
369 | function 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 | ||
503 | function 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. | ||
518 | function 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. | ||
571 | function 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 | ||
642 | function 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. | ||
660 | function 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? | ||
729 | function 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 | ||
737 | function 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) | ||
753 | function 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. | ||
778 | function 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. | ||
836 | function 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. | ||
853 | function 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. | ||
864 | function 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. | ||
877 | function 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 | ||
927 | function 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 | ||
939 | function 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? | ||
958 | function 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. | ||
968 | function 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 | ||
993 | function 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). | ||
1001 | function 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. | ||
1011 | function 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. | ||
1021 | function 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. | ||
1040 | function 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 | ||
1057 | function 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. | ||
1066 | function 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. | ||
1086 | function 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 | ||
1105 | function 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. | ||
1117 | function 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. | ||
1135 | function 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. | ||
1153 | function 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. | ||
1171 | function 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 | ||
1190 | function 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. | ||
1207 | function 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. | ||
1223 | function 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. | ||
1235 | function 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. | ||
1247 | function 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. | ||
1260 | function 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 | ||
1283 | function 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. | ||
1293 | function 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 | ||
1356 | function 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 | |||
1413 | Clipperz.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 | |||
1440 | MochiKit.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 | |||
1717 | Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) { | ||
1718 | return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize)); | ||
1719 | } | ||
1720 | |||
1721 | //############################################################################# | ||
1722 | //############################################################################# | ||
1723 | |||
1724 | Clipperz.Crypto.BigInt.ZERO = new Clipperz.Crypto.BigInt(0); | ||
1725 | |||
1726 | //############################################################################# | ||
1727 | |||
1728 | Clipperz.Crypto.BigInt.equals = function(a, b) { | ||
1729 | return a.equals(b); | ||
1730 | } | ||
1731 | |||
1732 | Clipperz.Crypto.BigInt.add = function(a, b) { | ||
1733 | return a.add(b); | ||
1734 | } | ||
1735 | |||
1736 | Clipperz.Crypto.BigInt.subtract = function(a, b) { | ||
1737 | return a.subtract(b); | ||
1738 | } | ||
1739 | |||
1740 | Clipperz.Crypto.BigInt.multiply = function(a, b, module) { | ||
1741 | return a.multiply(b, module); | ||
1742 | } | ||
1743 | |||
1744 | Clipperz.Crypto.BigInt.module = function(a, module) { | ||
1745 | return a.module(module); | ||
1746 | } | ||
1747 | |||
1748 | Clipperz.Crypto.BigInt.powerModule = function(a, b, module) { | ||
1749 | return a.powerModule(b, module); | ||
1750 | } | ||
1751 | |||
1752 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||
26 | |||
27 | if (typeof(Leemon) == 'undefined') { Leemon = {}; } | ||
28 | if (typeof(Baird.Crypto) == 'undefined') { Baird.Crypto = {}; } | ||
29 | if (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 | // | ||
186 | Baird.Crypto.BigInt.VERSION = "5.0"; | ||
187 | Baird.Crypto.BigInt.NAME = "Baird.Crypto.BigInt"; | ||
188 | |||
189 | MochiKit.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 | ||
199 | for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform | ||
200 | bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt | ||
201 | mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits | ||
202 | radix=mask+1; //2^bpe. a single 1 bit to the left of the first bit of mask | ||
203 | one=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 | ||
207 | t=new Array(0); | ||
208 | ss=t; //used in mult_() | ||
209 | s0=t; //used in multMod_(), squareMod_() | ||
210 | s1=t; //used in powMod_(), multMod_(), squareMod_() | ||
211 | s2=t; //used in powMod_(), multMod_() | ||
212 | s3=t; //used in powMod_() | ||
213 | s4=t; s5=t; //used in mod_() | ||
214 | s6=t; //used in bigInt2str() | ||
215 | s7=t; //used in powMod_() | ||
216 | T=t; //used in GCD_() | ||
217 | sa=t; //used in mont_() | ||
218 | mr_x1=t; mr_r=t; mr_a=t; //used in millerRabin() | ||
219 | eg_v=t; eg_u=t; eg_A=t; eg_B=t; eg_C=t; eg_D=t; //used in eGCD_(), inverseMod_() | ||
220 | md_q1=t; md_q2=t; md_q3=t; md_r=t; md_r1=t; md_r2=t; md_tt=t; //used in mod_() | ||
221 | |||
222 | primes=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. | ||
583 | function 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 | ||
654 | function 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. | ||
672 | function 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? | ||
741 | function 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 | ||
749 | function 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) | ||
765 | function 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. | ||
790 | function 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. | ||
848 | function 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. | ||
865 | function 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. | ||
876 | function 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. | ||
889 | function 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 | ||
939 | function 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 | ||
951 | function 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? | ||
970 | function 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. | ||
980 | function 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 | ||
1005 | function 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). | ||
1013 | function 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. | ||
1023 | function 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. | ||
1033 | function 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. | ||
1052 | function 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 | ||
1069 | function 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. | ||
1078 | function 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. | ||
1098 | function 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 | ||
1117 | function 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. | ||
1129 | function 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. | ||
1147 | function 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. | ||
1165 | function 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. | ||
1183 | function 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 | ||
1202 | function 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. | ||
1219 | function 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. | ||
1235 | function 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. | ||
1247 | function 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. | ||
1259 | function 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. | ||
1272 | function 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 | ||
1295 | function 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. | ||
1305 | function 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 | ||
1368 | function 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 | |||
1425 | Clipperz.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 | |||
1452 | MochiKit.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 | |||
1610 | Clipperz.Crypto.BigInt.randomPrime = function(aBitSize) { | ||
1611 | return new Clipperz.Crypto.BigInt(randTruePrime(aBitSize)); | ||
1612 | } | ||
1613 | |||
1614 | //############################################################################# | ||
1615 | //############################################################################# | ||
1616 | //############################################################################# | ||
1617 | |||
1618 | Clipperz.Crypto.BigInt.equals = function(a, b) { | ||
1619 | return a.equals(b); | ||
1620 | } | ||
1621 | |||
1622 | Clipperz.Crypto.BigInt.add = function(a, b) { | ||
1623 | return a.add(b); | ||
1624 | } | ||
1625 | |||
1626 | Clipperz.Crypto.BigInt.subtract = function(a, b) { | ||
1627 | return a.subtract(b); | ||
1628 | } | ||
1629 | |||
1630 | Clipperz.Crypto.BigInt.multiply = function(a, b, module) { | ||
1631 | return a.multiply(b, module); | ||
1632 | } | ||
1633 | |||
1634 | Clipperz.Crypto.BigInt.module = function(a, module) { | ||
1635 | return a.module(module); | ||
1636 | } | ||
1637 | |||
1638 | Clipperz.Crypto.BigInt.powerModule = function(a, b, module) { | ||
1639 | return a.powerModule(b, module); | ||
1640 | } | ||
1641 | |||
1642 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | //} | ||
27 | if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||
28 | if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||
29 | |||
30 | Clipperz.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 | |||
46 | Clipperz.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 | |||
251 | Clipperz.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 | |||
302 | Clipperz.Crypto.ECC.StandardCurves = {}; | ||
303 | |||
304 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | //} | ||
27 | if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||
28 | if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||
29 | |||
30 | Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) { | ||
31 | args = args || {}; | ||
32 | this._modulus = args.modulus; | ||
33 | |||
34 | return this; | ||
35 | } | ||
36 | |||
37 | Clipperz.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 | |||
246 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | //} | ||
27 | if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||
28 | if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||
29 | |||
30 | Clipperz.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 | |||
38 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | //} | ||
27 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
28 | if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||
29 | if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||
30 | if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||
31 | |||
32 | Clipperz.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 | |||
80 | Clipperz.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 | |||
173 | Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); | ||
174 | Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); | ||
175 | |||
176 | Clipperz.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 | |||
200 | Clipperz.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 | |||
212 | Clipperz.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 | |||
260 | Clipperz.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 | |||
309 | Clipperz.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 | |||
344 | Clipperz.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 | |||
361 | Clipperz.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 | |||
376 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | |||
31 | Clipperz.Crypto.ECC.StandardCurves = {}; | ||
32 | |||
33 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PRNG depends on Clipperz.ByteArray!"; | ||
26 | } | ||
27 | |||
28 | try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { | ||
29 | throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; | ||
30 | } | ||
31 | |||
32 | try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { | ||
33 | throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; | ||
34 | } | ||
35 | |||
36 | if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } | ||
37 | |||
38 | //############################################################################# | ||
39 | |||
40 | Clipperz.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 | |||
49 | Clipperz.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 | |||
89 | Clipperz.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 | |||
102 | Clipperz.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 | |||
157 | Clipperz.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 | |||
169 | Clipperz.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 | |||
211 | Clipperz.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 | |||
225 | Clipperz.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 | |||
303 | Clipperz.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 | |||
315 | Clipperz.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 | |||
387 | Clipperz.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 | |||
417 | Clipperz.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) { | ||
490 | Clipperz.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 { | ||
560 | Clipperz.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 | |||
751 | Clipperz.Crypto.PRNG.Random = function(args) { | ||
752 | args = args || {}; | ||
753 | //MochiKit.Base.bindMethods(this); | ||
754 | |||
755 | return this; | ||
756 | } | ||
757 | |||
758 | Clipperz.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 | |||
789 | Clipperz.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 | |||
836 | Clipperz.Crypto.PRNG.exception = { | ||
837 | NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy") | ||
838 | }; | ||
839 | |||
840 | |||
841 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.BigInt) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; } | ||
29 | |||
30 | Clipperz.Crypto.RSA.VERSION = "0.1"; | ||
31 | Clipperz.Crypto.RSA.NAME = "Clipperz.RSA"; | ||
32 | |||
33 | //############################################################################# | ||
34 | |||
35 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PRNG depends on Clipperz.ByteArray!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||
29 | if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; } | ||
30 | |||
31 | Clipperz.Crypto.SHA.VERSION = "0.3"; | ||
32 | Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA"; | ||
33 | |||
34 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PRNG depends on Clipperz.ByteArray!"; | ||
26 | } | ||
27 | |||
28 | try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { | ||
29 | throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!"; | ||
30 | } | ||
31 | |||
32 | try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { | ||
33 | throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!"; | ||
34 | } | ||
35 | |||
36 | if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; } | ||
37 | |||
38 | Clipperz.Crypto.SRP.VERSION = "0.1"; | ||
39 | Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP"; | ||
40 | |||
41 | //############################################################################# | ||
42 | |||
43 | MochiKit.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 | //============================================================================= | ||
83 | Clipperz.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 | |||
108 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.DOM) == 'undefined') { Clipperz.DOM = {}; } | ||
26 | |||
27 | Clipperz.DOM.VERSION = "0.1"; | ||
28 | Clipperz.DOM.NAME = "Clipperz.DOM"; | ||
29 | |||
30 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Date) == 'undefined') { Clipperz.Date = {}; } | ||
26 | |||
27 | Clipperz.Date.VERSION = "0.1"; | ||
28 | Clipperz.Date.NAME = "Clipperz.Date"; | ||
29 | |||
30 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | |||
26 | |||
27 | Clipperz.KeePassExportProcessor = function(args) { | ||
28 | args = args || {}; | ||
29 | |||
30 | return this; | ||
31 | } | ||
32 | |||
33 | //============================================================================= | ||
34 | |||
35 | Clipperz.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] | ||
95 | Group Tree: | ||
96 | UserName: | ||
97 | URL: | ||
98 | Password: | ||
99 | Notes: test | ||
100 | UUID: 525f62430079bae48b79ed2961924b05 | ||
101 | Icon: 0 | ||
102 | Creation Time: 2007-06-26 17:56:03 | ||
103 | Last Access: 2007-10-25 16:23:51 | ||
104 | Last Modification: 2007-10-25 16:23:51 | ||
105 | Expires: 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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | |||
26 | //############################################################################# | ||
27 | |||
28 | Clipperz.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 | |||
38 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base.module('Clipperz'); | ||
25 | |||
26 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
26 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
27 | |||
28 | Clipperz.PM.BookmarkletProcessor = function(aConfiguration) { | ||
29 | this._configuration = aConfiguration; | ||
30 | |||
31 | this._editableFields = null; | ||
32 | this._favicon = null; | ||
33 | |||
34 | return this; | ||
35 | } | ||
36 | |||
37 | Clipperz.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 | / * | ||
106 | Clipperz.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 | |||
161 | Clipperz.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 | |||
173 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (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 | |||
33 | Clipperz.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 | |||
47 | Clipperz.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 | |||
184 | if (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 | |||
191 | Clipperz.PM.Connection.SRP['1.0'] = function (args) { | ||
192 | Clipperz.PM.Connection.call(this, args); | ||
193 | |||
194 | return this; | ||
195 | } | ||
196 | |||
197 | Clipperz.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 | |||
488 | Clipperz.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 | } | ||
502 | Clipperz.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 | |||
572 | Clipperz.PM.Connection.SRP['1.1'] = function (args) { | ||
573 | Clipperz.PM.Connection.SRP['1.0'].call(this, args); | ||
574 | |||
575 | return this; | ||
576 | } | ||
577 | |||
578 | Clipperz.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 | |||
607 | Clipperz.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 | |||
614 | Clipperz.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 | |||
627 | MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, { | ||
628 | 'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion] | ||
629 | }); | ||
630 | |||
631 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; } | ||
27 | |||
28 | Clipperz.PM.Crypto.VERSION = "0.2"; | ||
29 | Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto"; | ||
30 | |||
31 | Clipperz.PM.Crypto.encryptingFunctions = {}; | ||
32 | |||
33 | MochiKit.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) { | ||
323 | console.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 | |||
542 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base.module('Clipperz.PM.DataModel'); | ||
25 | |||
26 | Clipperz.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 | |||
63 | Clipperz.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 | |||
1057 | Clipperz.PM.DataModel.DirectLogin.exception = { | ||
1058 | 'WrongBookmarkletConfiguration': new MochiKit.Base.NamedError("Clipperz.PM.DataModel.DirectLogin.exception.WrongBookmarkletConfiguration") | ||
1059 | }; | ||
1060 | |||
1061 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | |||
29 | //############################################################################# | ||
30 | |||
31 | Clipperz.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 | |||
42 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | |||
29 | //############################################################################# | ||
30 | |||
31 | Clipperz.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 | |||
43 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | //############################################################################# | ||
29 | |||
30 | Clipperz.PM.DataModel.DirectLoginInput = function(args) { | ||
31 | this._args = args; | ||
32 | |||
33 | return this; | ||
34 | } | ||
35 | |||
36 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.KeyValueObjectStore) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.EncryptedRemoteObject depends on Clipperz.KeyValueObjectStore!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
29 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
30 | |||
31 | Clipperz.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 | |||
83 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | |||
29 | //############################################################################# | ||
30 | |||
31 | Clipperz.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 | |||
50 | Clipperz.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 | |||
295 | Clipperz.PM.DataModel.OneTimePassword.computeKeyWithUsernameAndPassword = function(anUsername, aPassword) { | ||
296 | return Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aPassword)).toHexString().substring(2); | ||
297 | } | ||
298 | |||
299 | Clipperz.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 | |||
305 | Clipperz.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 | |||
329 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
28 | Clipperz.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 | |||
38 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.Record) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.Record.Version depends on Clipperz.PM.DataModel.Record!"; | ||
26 | } | ||
27 | |||
28 | Clipperz.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 | |||
38 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | |||
29 | Clipperz.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 | |||
66 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.User.Header.Legacy depends on Clipperz.PM.DataModel.User!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } | ||
29 | |||
30 | Clipperz.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 | |||
42 | Clipperz.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 { | ||
159 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.User.Header.OneTimePasswords depends on Clipperz.PM.DataModel.User!"; | ||
26 | } | ||
27 | if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } | ||
28 | |||
29 | //----------------------------------------------------------------------------- | ||
30 | |||
31 | Clipperz.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 | |||
41 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.User.Header.Preferences depends on Clipperz.PM.DataModel.User!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } | ||
29 | |||
30 | Clipperz.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 | |||
37 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.User.Header.RecordIndex depends on Clipperz.PM.DataModel.User!"; | ||
26 | } | ||
27 | |||
28 | if (typeof(Clipperz.PM.DataModel.User.Header) == 'undefined') { Clipperz.PM.DataModel.User.Header = {}; } | ||
29 | |||
30 | Clipperz.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 | |||
69 | Clipperz.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 { | ||
237 | Clipperz.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 | |||
674 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.DataModel.User) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.DataModel.User.Subscription depends on Clipperz.PM.DataModel.User!"; | ||
26 | } | ||
27 | |||
28 | Clipperz.PM.DataModel.User.Subscription = function(args) { | ||
29 | this._attributes = args; | ||
30 | return this; | ||
31 | } | ||
32 | |||
33 | |||
34 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.DataModel) == 'undefined') { Clipperz.PM.DataModel = {}; } | ||
27 | |||
28 | |||
29 | //############################################################################# | ||
30 | |||
31 | Clipperz.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 | |||
62 | Clipperz.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 | |||
805 | Clipperz.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 | |||
822 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Date) == 'undefined') { Clipperz.PM.Date = {}; } | ||
27 | |||
28 | Clipperz.PM.Date.VERSION = "0.1"; | ||
29 | Clipperz.PM.Date.NAME = "Clipperz.PM.Date"; | ||
30 | |||
31 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.PIN) == 'undefined') { Clipperz.PM.PIN = {}; } | ||
27 | |||
28 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | |||
27 | //============================================================================= | ||
28 | |||
29 | Clipperz.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 | |||
47 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | |||
27 | //============================================================================= | ||
28 | |||
29 | Clipperz.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 | |||
37 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.Proxy.Offline) == 'undefined') { throw ""; }} catch (e) { | ||
25 | throw "Clipperz.PM.Proxy.Offline.DataStore depends on Clipperz.PM.Proxy.Offline!"; | ||
26 | } | ||
27 | |||
28 | //============================================================================= | ||
29 | |||
30 | Clipperz.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 | |||
43 | Clipperz.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 | |||
791 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
30 | Clipperz.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 | |||
45 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
30 | Clipperz.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 | |||
43 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | |||
27 | //============================================================================= | ||
28 | |||
29 | Clipperz.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 | |||
39 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Proxy) == 'undefined') { Clipperz.PM.Proxy = {}; } | ||
27 | |||
28 | //============================================================================= | ||
29 | |||
30 | Clipperz.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 | |||
44 | Clipperz.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; | ||
143 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } | ||
27 | if (typeof(Clipperz.PM.Strings.Languages) == 'undefined') { Clipperz.PM.Strings.Languages = {}; } | ||
28 | |||
29 | //----------------------------------------------------------------------------- | ||
30 | /* | ||
31 | Clipperz.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 | |||
102 | Clipperz.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 | |||
147 | Clipperz.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 | |||
164 | Clipperz.PM.Strings.inputTypeToRecordFieldType = { | ||
165 | 'text': 'TXT', | ||
166 | 'password': 'PWD', | ||
167 | 'checkbox': 'CHECK', | ||
168 | 'radio': 'RADIO', | ||
169 | 'select': 'SELECT' | ||
170 | }; | ||
171 | |||
172 | //----------------------------------------------------------------------------- | ||
173 | |||
174 | Clipperz.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 | |||
190 | Clipperz.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 | |||
237 | Clipperz.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 | |||
257 | Clipperz.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 | |||
271 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } | ||
27 | |||
28 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | if (typeof(Clipperz.PM.Strings) == 'undefined') { Clipperz.PM.Strings = {}; } | ||
27 | if (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 | |||
35 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | |||
30 | Clipperz.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 __ip__, apparently from __country__, using __browser__ on __operatingSystem__.", | ||
915 | 'latestConnectionText': "Your latest connection was __elapsedTimeDescription__ (__time__) from ip __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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; } | ||
26 | |||
27 | //============================================================================= | ||
28 | |||
29 | Clipperz.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 | |||
40 | Clipperz.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 | |||
166 | Clipperz.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 | |||
188 | Clipperz.PM.Toll.numberOfCloseLoopIterations = 50; | ||
189 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 () { | ||
78 | console.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base.module('Clipperz.PM.UI.Components'); | ||
25 | |||
26 | Clipperz.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 | |||
37 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base.module('Clipperz.PM.UI'); | ||
25 | |||
26 | Clipperz.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 | |||
33 | MochiKit.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 | |||
240 | Clipperz.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 | |||
249 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.Base.module('Clipperz.PM.UI'); | ||
25 | |||
26 | Clipperz.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 | |||
52 | MochiKit.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) { | ||
351 | console.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) { | ||
366 | console.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { | ||
26 | Clipperz = {}; | ||
27 | } | ||
28 | |||
29 | //############################################################################# | ||
30 | |||
31 | Clipperz.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 | |||
46 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Signal) == 'undefined') { Clipperz.Signal = {}; } | ||
26 | |||
27 | Clipperz.Signal.VERSION = "0.1"; | ||
28 | Clipperz.Signal.NAME = "Clipperz.Signal"; | ||
29 | |||
30 | MochiKit.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 | |||
65 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Style) == 'undefined') { Clipperz.Style = {}; } | ||
26 | |||
27 | Clipperz.Style.VERSION = "0.1"; | ||
28 | Clipperz.Style.NAME = "Clipperz.DOM"; | ||
29 | |||
30 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (typeof(Clipperz.Visual) == 'undefined') { Clipperz.Visual = {}; } | ||
26 | |||
27 | Clipperz.Visual.VERSION = "0.1"; | ||
28 | Clipperz.Visual.NAME = "Clipperz.Visual"; | ||
29 | |||
30 | MochiKit.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 */ | ||
129 | Clipperz.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 | |||
137 | Clipperz.Visual.Resize.prototype = new MochiKit.Visual.Base(); | ||
138 | |||
139 | MochiKit.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 | |||
229 | Clipperz.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 | |||
296 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (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 | */ | ||
34 | Clipperz.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 | */ | ||
356 | Clipperz.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 | }; | ||
365 | Clipperz.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 | */ | ||
469 | Clipperz.YUI.DomHelper.Template.prototype.apply = Clipperz.YUI.DomHelper.Template.prototype.applyTemplate; | ||
470 | |||
471 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||
25 | if (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 | */ | ||
39 | Clipperz.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, > <. | ||
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 | */ | ||
709 | Clipperz.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | if (typeof YAHOO == 'undefined') { YAHOO = {}; }; | ||
25 | if (typeof YAHOO.util == 'undefined') { YAHOO.util = {}; }; | ||
26 | if (typeof YAHOO.util.Dom == 'undefined') { YAHOO.util.Dom = {}; }; | ||
27 | |||
28 | YAHOO.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 | |||
45 | YAHOO.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 | |||
54 | YAHOO.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 | |||
72 | YAHOO.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | */ | ||
28 | var 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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Async 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Async', '1.5', ['Base']); | ||
35 | |||
36 | /** @id MochiKit.Async.Deferred */ | ||
37 | MochiKit.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 | |||
49 | MochiKit.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 | |||
246 | MochiKit.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 */ | ||
531 | MochiKit.Async.DeferredLock = function () { | ||
532 | this.waiting = []; | ||
533 | this.locked = false; | ||
534 | this.id = this._nextId(); | ||
535 | }; | ||
536 | |||
537 | MochiKit.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 */ | ||
576 | MochiKit.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 | |||
604 | MochiKit.Async.DeferredList.prototype = new MochiKit.Async.Deferred(); | ||
605 | MochiKit.Async.DeferredList.prototype.constructor = MochiKit.Async.DeferredList; | ||
606 | |||
607 | MochiKit.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 */ | ||
626 | MochiKit.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 */ | ||
639 | MochiKit.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 | |||
658 | MochiKit.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 | |||
731 | MochiKit.Async.__new__(); | ||
732 | |||
733 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Base 1.5 | ||
27 | |||
28 | See <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) | ||
36 | var MochiKit = MochiKit || {}; | ||
37 | if (typeof(MochiKit.__export__) == "undefined") { | ||
38 | MochiKit.__export__ = true; | ||
39 | } | ||
40 | MochiKit.NAME = "MochiKit"; | ||
41 | MochiKit.VERSION = "1.5"; | ||
42 | MochiKit.__repr__ = function () { | ||
43 | return "[" + this.NAME + " " + this.VERSION + "]"; | ||
44 | }; | ||
45 | MochiKit.toString = function () { | ||
46 | return this.__repr__(); | ||
47 | }; | ||
48 | |||
49 | |||
50 | // MochiKit.Base module | ||
51 | MochiKit.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 | */ | ||
67 | MochiKit.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 | |||
86 | MochiKit.Base.module(MochiKit, "Base", "1.5", []); | ||
87 | |||
88 | /** @id MochiKit.Base.update */ | ||
89 | MochiKit.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 | |||
104 | MochiKit.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(/\&\;|\&\#38\;|\&|\&/); | ||
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 */ | ||
1299 | MochiKit.Base.AdapterRegistry = function () { | ||
1300 | this.pairs = []; | ||
1301 | }; | ||
1302 | |||
1303 | MochiKit.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 | */ | ||
1346 | MochiKit.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 | */ | ||
1372 | MochiKit.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 | */ | ||
1396 | MochiKit.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 | |||
1426 | MochiKit.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 | |||
1510 | MochiKit.Base.__new__(); | ||
1511 | |||
1512 | // | ||
1513 | // XXX: Internet Explorer blows | ||
1514 | // | ||
1515 | if (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 | |||
1523 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Color 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito and others. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Color', '1.5', ['Base', 'DOM', 'Style']); | ||
35 | |||
36 | /** @id MochiKit.Color.Color */ | ||
37 | MochiKit.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 | |||
52 | MochiKit.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 | |||
253 | MochiKit.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 | |||
406 | MochiKit.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 | |||
692 | MochiKit.Color.__new__(); | ||
693 | |||
694 | // Full table of css3 X11 colors <http://www.w3.org/TR/css3-color/#X11COLORS> | ||
695 | |||
696 | MochiKit.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 | |||
846 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.DOM 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'DOM', '1.5', ['Base']); | ||
35 | |||
36 | MochiKit.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, "&" | ||
798 | ).replace(/"/g, """ | ||
799 | ).replace(/</g, "<" | ||
800 | ).replace(/>/g, ">"); | ||
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 | |||
1192 | MochiKit.DOM.__new__(((typeof(window) == "undefined") ? this : window)); | ||
1193 | |||
1194 | // | ||
1195 | // XXX: Internet Explorer blows | ||
1196 | // | ||
1197 | if (MochiKit.__export__) { | ||
1198 | withWindow = MochiKit.DOM.withWindow; | ||
1199 | withDocument = MochiKit.DOM.withDocument; | ||
1200 | } | ||
1201 | |||
1202 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.DateTime 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'DateTime', '1.5', ['Base']); | ||
35 | |||
36 | /** @id MochiKit.DateTime.isoDate */ | ||
37 | MochiKit.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 | |||
53 | MochiKit.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 */ | ||
56 | MochiKit.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 */ | ||
102 | MochiKit.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 */ | ||
120 | MochiKit.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 */ | ||
134 | MochiKit.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 */ | ||
148 | MochiKit.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 | |||
157 | MochiKit.DateTime._padTwo = function (n) { | ||
158 | return (n > 9) ? n : "0" + n; | ||
159 | }; | ||
160 | |||
161 | MochiKit.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 */ | ||
173 | MochiKit.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 */ | ||
186 | MochiKit.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 | |||
193 | MochiKit.DateTime.__new__ = function () { | ||
194 | MochiKit.Base.nameFunctions(this); | ||
195 | }; | ||
196 | |||
197 | MochiKit.DateTime.__new__(); | ||
198 | |||
199 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.DragAndDrop 1.5 | ||
26 | |||
27 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
28 | |||
29 | Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) | ||
30 | Mochi-ized By Thomas Herve (_firstname_@nimail.org) | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'DragAndDrop', '1.5', ['Base', 'Iter', 'DOM', 'Signal', 'Visual', 'Position']); | ||
35 | |||
36 | MochiKit.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 */ | ||
133 | MochiKit.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 | |||
141 | MochiKit.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 | |||
282 | MochiKit.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 */ | ||
362 | MochiKit.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 | |||
370 | MochiKit.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 | |||
783 | MochiKit.DragAndDrop.__new__ = function () { | ||
784 | MochiKit.Base.nameFunctions(this); | ||
785 | }; | ||
786 | |||
787 | MochiKit.DragAndDrop.__new__(); | ||
788 | |||
789 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Format 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Format', '1.5', ['Base']); | ||
35 | |||
36 | MochiKit.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 */ | ||
83 | MochiKit.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 */ | ||
139 | MochiKit.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 */ | ||
156 | MochiKit.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 */ | ||
167 | MochiKit.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 */ | ||
179 | MochiKit.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 */ | ||
192 | MochiKit.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 */ | ||
205 | MochiKit.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 */ | ||
211 | MochiKit.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 */ | ||
222 | MochiKit.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 | */ | ||
244 | MochiKit.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 | */ | ||
272 | MochiKit.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 */ | ||
304 | MochiKit.Format.percentFormat = function (aNumber) { | ||
305 | return MochiKit.Format.twoDigitFloat(100 * aNumber) + '%'; | ||
306 | }; | ||
307 | |||
308 | MochiKit.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 | |||
317 | MochiKit.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 | |||
330 | MochiKit.Format.__new__(); | ||
331 | |||
332 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Iter 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Iter', '1.5', ['Base']); | ||
35 | |||
36 | MochiKit.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 | |||
775 | MochiKit.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 | |||
802 | MochiKit.Iter.__new__(); | ||
803 | |||
804 | // | ||
805 | // XXX: Internet Explorer blows | ||
806 | // | ||
807 | if (MochiKit.__export__) { | ||
808 | reduce = MochiKit.Iter.reduce; | ||
809 | } | ||
810 | |||
811 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Logging 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Logging', '1.5', ['Base']); | ||
35 | |||
36 | /** @id MochiKit.Logging.LogMessage */ | ||
37 | MochiKit.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 | |||
44 | MochiKit.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 | |||
58 | MochiKit.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 */ | ||
102 | MochiKit.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 | |||
113 | MochiKit.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 | |||
232 | MochiKit.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 | |||
283 | MochiKit.Logging.__new__(); | ||
284 | |||
285 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.LoggingPane 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'LoggingPane', '1.5', ['Base', 'Logging']); | ||
35 | |||
36 | /** @id MochiKit.LoggingPane.createLoggingPane */ | ||
37 | MochiKit.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 | */ | ||
54 | MochiKit.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 | |||
335 | MochiKit.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 | |||
346 | MochiKit.LoggingPane.__new__ = function () { | ||
347 | MochiKit.Base.nameFunctions(this); | ||
348 | MochiKit.LoggingPane._loggingPane = null; | ||
349 | }; | ||
350 | |||
351 | MochiKit.LoggingPane.__new__(); | ||
352 | |||
353 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.MochiKit 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | var MochiKit = MochiKit || {}; | ||
35 | |||
36 | /** @id MochiKit.MochiKit */ | ||
37 | MochiKit.MochiKit = MochiKit.MochiKit || {}; | ||
38 | |||
39 | MochiKit.MochiKit.NAME = "MochiKit.MochiKit"; | ||
40 | MochiKit.MochiKit.VERSION = "1.5"; | ||
41 | MochiKit.MochiKit.__export__ = false; | ||
42 | MochiKit.MochiKit.__repr__ = function () { | ||
43 | return "[" + this.NAME + " " + this.VERSION + "]"; | ||
44 | }; | ||
45 | |||
46 | /** @id MochiKit.MochiKit.toString */ | ||
47 | MochiKit.MochiKit.toString = function () { | ||
48 | return this.__repr__(); | ||
49 | }; | ||
50 | |||
51 | /** @id MochiKit.MochiKit.SUBMODULES */ | ||
52 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.MockDOM 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | var MochiKit = MochiKit || {}; | ||
35 | |||
36 | MochiKit.MockDOM = MochiKit.MockDOM || {}; | ||
37 | |||
38 | MochiKit.MockDOM.NAME = "MochiKit.MockDOM"; | ||
39 | MochiKit.MockDOM.VERSION = "1.5"; | ||
40 | MochiKit.MockDOM.__export__ = false; | ||
41 | |||
42 | MochiKit.MockDOM.__repr__ = function () { | ||
43 | return "[" + this.NAME + " " + this.VERSION + "]"; | ||
44 | }; | ||
45 | |||
46 | /** @id MochiKit.MockDOM.toString */ | ||
47 | MochiKit.MockDOM.toString = function () { | ||
48 | return this.__repr__(); | ||
49 | }; | ||
50 | |||
51 | /** @id MochiKit.MockDOM.createDocument */ | ||
52 | MochiKit.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 */ | ||
60 | MochiKit.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 | |||
82 | MochiKit.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 */ | ||
121 | MochiKit.MockDOM.EXPORT_OK = [ | ||
122 | "mockElement", | ||
123 | "createDocument" | ||
124 | ]; | ||
125 | |||
126 | /** @id MochiKit.MockDOM.EXPORT */ | ||
127 | MochiKit.MockDOM.EXPORT = [ | ||
128 | "document" | ||
129 | ]; | ||
130 | |||
131 | MochiKit.MockDOM.__new__ = function () { | ||
132 | this.document = this.createDocument(); | ||
133 | }; | ||
134 | |||
135 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Position 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005-2006 Bob Ippolito and others. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Position', '1.5', ['Base', 'DOM', 'Style']); | ||
35 | |||
36 | MochiKit.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 | |||
235 | MochiKit.Position.__new__ = function (win) { | ||
236 | MochiKit.Base.nameFunctions(this); | ||
237 | }; | ||
238 | |||
239 | MochiKit.Position.__new__(this); | ||
240 | |||
241 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Selector 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito and others. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Selector', '1.5', ['Base', 'DOM', 'Iter']); | ||
35 | |||
36 | MochiKit.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 | |||
43 | MochiKit.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 | |||
363 | MochiKit.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 | |||
414 | MochiKit.Selector.__new__(); | ||
415 | |||
416 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Signal 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2006 Jonathan Gardner, Beau Hartshorne, Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Signal', '1.5', ['Base', 'DOM']); | ||
35 | |||
36 | MochiKit.Signal._observers = []; | ||
37 | |||
38 | /** @id MochiKit.Signal.Event */ | ||
39 | MochiKit.Signal.Event = function (src, e) { | ||
40 | this._event = e || window.event; | ||
41 | this._src = src; | ||
42 | }; | ||
43 | MochiKit.Signal.Event.__export__ = false; | ||
44 | |||
45 | MochiKit.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. */ | ||
416 | MochiKit.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. */ | ||
441 | MochiKit.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. */ | ||
514 | MochiKit.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 | }; | ||
523 | MochiKit.Signal.Ident.__export__ = false; | ||
524 | MochiKit.Signal.Ident.prototype = {}; | ||
525 | |||
526 | MochiKit.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 | |||
896 | MochiKit.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 | |||
912 | MochiKit.Signal.__new__(this); | ||
913 | |||
914 | // | ||
915 | // XXX: Internet Explorer blows | ||
916 | // | ||
917 | if (MochiKit.__export__) { | ||
918 | connect = MochiKit.Signal.connect; | ||
919 | disconnect = MochiKit.Signal.disconnect; | ||
920 | disconnectAll = MochiKit.Signal.disconnectAll; | ||
921 | signal = MochiKit.Signal.signal; | ||
922 | } | ||
923 | |||
924 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) | ||
26 | Mochi-ized By Thomas Herve (_firstname_@nimail.org) | ||
27 | |||
28 | See scriptaculous.js for full license. | ||
29 | |||
30 | ***/ | ||
31 | |||
32 | MochiKit.Base.module(MochiKit, 'Sortable', '1.5', ['Base', 'Iter', 'DOM', 'Position', 'DragAndDrop']); | ||
33 | |||
34 | MochiKit.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 | ||
584 | MochiKit.Sortable.Sortable = MochiKit.Sortable; | ||
585 | |||
586 | MochiKit.Sortable.__new__ = function () { | ||
587 | MochiKit.Base.nameFunctions(this); | ||
588 | }; | ||
589 | |||
590 | MochiKit.Sortable.__new__(); | ||
591 | |||
592 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Style 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005-2006 Bob Ippolito, Beau Hartshorne. All rights Reserved. | ||
31 | |||
32 | The MochiKit.Style.getElementPosition function is adapted from | ||
33 | YAHOO.util.Dom.getXY v0.9.0. which is copyrighted by Yahoo! Inc. | ||
34 | |||
35 | ***/ | ||
36 | |||
37 | MochiKit.Base.module(MochiKit, 'Style', '1.5', ['Base', 'DOM']); | ||
38 | |||
39 | |||
40 | /** @id MochiKit.Style.Dimensions */ | ||
41 | MochiKit.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 | |||
49 | MochiKit.Style.Dimensions.prototype.__repr__ = function () { | ||
50 | var repr = MochiKit.Base.repr; | ||
51 | return '{w: ' + repr(this.w) + ', h: ' + repr(this.h) + '}'; | ||
52 | }; | ||
53 | |||
54 | MochiKit.Style.Dimensions.prototype.toString = function () { | ||
55 | return this.__repr__(); | ||
56 | }; | ||
57 | |||
58 | |||
59 | /** @id MochiKit.Style.Coordinates */ | ||
60 | MochiKit.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 | |||
68 | MochiKit.Style.Coordinates.prototype.__repr__ = function () { | ||
69 | var repr = MochiKit.Base.repr; | ||
70 | return '{x: ' + repr(this.x) + ', y: ' + repr(this.y) + '}'; | ||
71 | }; | ||
72 | |||
73 | MochiKit.Style.Coordinates.prototype.toString = function () { | ||
74 | return this.__repr__(); | ||
75 | }; | ||
76 | |||
77 | |||
78 | MochiKit.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 | |||
583 | MochiKit.Style.__new__(); | ||
584 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Test 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Test', '1.5', ['Base']); | ||
35 | |||
36 | MochiKit.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 | |||
45 | MochiKit.Test.Suite = function () { | ||
46 | this.testIndex = 0; | ||
47 | MochiKit.Base.bindMethods(this); | ||
48 | }; | ||
49 | |||
50 | MochiKit.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 | |||
158 | MochiKit.Test.__new__ = function () { | ||
159 | var m = MochiKit.Base; | ||
160 | this.Suite.__export__ = false; | ||
161 | m.nameFunctions(this); | ||
162 | |||
163 | }; | ||
164 | |||
165 | MochiKit.Test.__new__(); | ||
166 | |||
167 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Text 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2008 Per Cederberg. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.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 | */ | ||
46 | MochiKit.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 | */ | ||
60 | MochiKit.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 | */ | ||
75 | MochiKit.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 | */ | ||
90 | MochiKit.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 | */ | ||
110 | MochiKit.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 | */ | ||
132 | MochiKit.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 | */ | ||
158 | MochiKit.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 | */ | ||
182 | MochiKit.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 | */ | ||
209 | MochiKit.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 | */ | ||
242 | MochiKit.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 | */ | ||
260 | MochiKit.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 | */ | ||
344 | MochiKit.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 | */ | ||
377 | MochiKit.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 | */ | ||
418 | MochiKit.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 | */ | ||
457 | MochiKit.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 | */ | ||
514 | MochiKit.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 | */ | ||
549 | MochiKit.Text.FormatPatternError = function (pattern, pos, message) { | ||
550 | this.pattern = pattern; | ||
551 | this.pos = pos; | ||
552 | this.message = message; | ||
553 | }; | ||
554 | |||
555 | MochiKit.Text.FormatPatternError.prototype = new MochiKit.Base.NamedError("MochiKit.Text.FormatPatternError"); | ||
556 | MochiKit.Text.FormatPatternError.constructor = MochiKit.Text.FormatPatternError; | ||
557 | |||
558 | // | ||
559 | //XXX: Internet Explorer export fix | ||
560 | // | ||
561 | if (MochiKit.__export__) { | ||
562 | formatter = MochiKit.Text.formatter; | ||
563 | format = MochiKit.Text.format; | ||
564 | formatValue = MochiKit.Text.formatValue; | ||
565 | } | ||
566 | |||
567 | |||
568 | MochiKit.Base.nameFunctions(MochiKit.Text); | ||
569 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | MochiKit.Visual 1.5 | ||
27 | |||
28 | See <http://mochikit.com/> for documentation, downloads, license, etc. | ||
29 | |||
30 | (c) 2005 Bob Ippolito and others. All rights Reserved. | ||
31 | |||
32 | ***/ | ||
33 | |||
34 | MochiKit.Base.module(MochiKit, 'Visual', '1.5', ['Base', 'DOM', 'Style', 'Color', 'Position']); | ||
35 | |||
36 | MochiKit.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 | |||
62 | MochiKit.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 */ | ||
349 | MochiKit.Visual.roundElement = function (e, options) { | ||
350 | new MochiKit.Visual._RoundCorners(e, options); | ||
351 | }; | ||
352 | |||
353 | /** @id MochiKit.Visual.roundClass */ | ||
354 | MochiKit.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 */ | ||
364 | MochiKit.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 | |||
391 | MochiKit.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 */ | ||
402 | MochiKit.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 | |||
420 | MochiKit.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 */ | ||
428 | MochiKit.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 | |||
448 | Transitions: define functions calculating variations depending of a position. | ||
449 | |||
450 | ***/ | ||
451 | |||
452 | MochiKit.Visual.Transitions = { __export__: false }; | ||
453 | |||
454 | /** @id MochiKit.Visual.Transitions.linear */ | ||
455 | MochiKit.Visual.Transitions.linear = function (pos) { | ||
456 | return pos; | ||
457 | }; | ||
458 | |||
459 | /** @id MochiKit.Visual.Transitions.sinoidal */ | ||
460 | MochiKit.Visual.Transitions.sinoidal = function (pos) { | ||
461 | return 0.5 - Math.cos(pos*Math.PI)/2; | ||
462 | }; | ||
463 | |||
464 | /** @id MochiKit.Visual.Transitions.reverse */ | ||
465 | MochiKit.Visual.Transitions.reverse = function (pos) { | ||
466 | return 1 - pos; | ||
467 | }; | ||
468 | |||
469 | /** @id MochiKit.Visual.Transitions.flicker */ | ||
470 | MochiKit.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 */ | ||
475 | MochiKit.Visual.Transitions.wobble = function (pos) { | ||
476 | return 0.5 - Math.cos(9*pos*Math.PI)/2; | ||
477 | }; | ||
478 | |||
479 | /** @id MochiKit.Visual.Transitions.pulse */ | ||
480 | MochiKit.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 */ | ||
491 | MochiKit.Visual.Transitions.parabolic = function (pos) { | ||
492 | return pos * pos; | ||
493 | }; | ||
494 | |||
495 | /** @id MochiKit.Visual.Transitions.spring */ | ||
496 | MochiKit.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 */ | ||
501 | MochiKit.Visual.Transitions.none = function (pos) { | ||
502 | return 0; | ||
503 | }; | ||
504 | |||
505 | /** @id MochiKit.Visual.Transitions.full */ | ||
506 | MochiKit.Visual.Transitions.full = function (pos) { | ||
507 | return 1; | ||
508 | }; | ||
509 | |||
510 | /*** | ||
511 | |||
512 | Core effects | ||
513 | |||
514 | ***/ | ||
515 | |||
516 | MochiKit.Visual.ScopedQueue = function () { | ||
517 | var cls = arguments.callee; | ||
518 | if (!(this instanceof cls)) { | ||
519 | return new cls(); | ||
520 | } | ||
521 | this.__init__(); | ||
522 | }; | ||
523 | MochiKit.Visual.ScopedQueue.__export__ = false; | ||
524 | |||
525 | MochiKit.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 | |||
615 | MochiKit.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 | |||
630 | MochiKit.Visual.Queue = MochiKit.Visual.Queues.get('global'); | ||
631 | MochiKit.Visual.Queue.__export__ = false; | ||
632 | |||
633 | MochiKit.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 | |||
645 | MochiKit.Visual.Base = function () {}; | ||
646 | |||
647 | MochiKit.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 */ | ||
758 | MochiKit.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 | |||
767 | MochiKit.Visual.Parallel.prototype = new MochiKit.Visual.Base(); | ||
768 | |||
769 | MochiKit.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 */ | ||
799 | MochiKit.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 | |||
807 | MochiKit.Visual.Sequence.prototype = new MochiKit.Visual.Base(); | ||
808 | |||
809 | MochiKit.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 */ | ||
847 | MochiKit.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 | |||
855 | MochiKit.Visual.Opacity.prototype = new MochiKit.Visual.Base(); | ||
856 | |||
857 | MochiKit.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 */ | ||
892 | MochiKit.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 | |||
900 | MochiKit.Visual.Move.prototype = new MochiKit.Visual.Base(); | ||
901 | |||
902 | MochiKit.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 */ | ||
963 | MochiKit.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 | |||
971 | MochiKit.Visual.Scale.prototype = new MochiKit.Visual.Base(); | ||
972 | |||
973 | MochiKit.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 */ | ||
1094 | MochiKit.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 | |||
1102 | MochiKit.Visual.Highlight.prototype = new MochiKit.Visual.Base(); | ||
1103 | |||
1104 | MochiKit.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 */ | ||
1182 | MochiKit.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 | |||
1190 | MochiKit.Visual.ScrollTo.prototype = new MochiKit.Visual.Base(); | ||
1191 | |||
1192 | MochiKit.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 | |||
1236 | MochiKit.Visual._CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; | ||
1237 | |||
1238 | MochiKit.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 | |||
1246 | MochiKit.Visual.Morph.prototype = new MochiKit.Visual.Base(); | ||
1247 | |||
1248 | MochiKit.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 | |||
1332 | Combination effects. | ||
1333 | |||
1334 | ***/ | ||
1335 | |||
1336 | /** @id MochiKit.Visual.fade */ | ||
1337 | MochiKit.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 */ | ||
1362 | MochiKit.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 */ | ||
1389 | MochiKit.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 */ | ||
1429 | MochiKit.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 */ | ||
1455 | MochiKit.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 */ | ||
1486 | MochiKit.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 */ | ||
1527 | MochiKit.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 */ | ||
1562 | MochiKit.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 */ | ||
1600 | MochiKit.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 */ | ||
1659 | MochiKit.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 */ | ||
1713 | MochiKit.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 */ | ||
1741 | MochiKit.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 */ | ||
1847 | MochiKit.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 */ | ||
1932 | MochiKit.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 */ | ||
1957 | MochiKit.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 | |||
1998 | MochiKit.Base.nameFunctions(MochiKit.Visual); | ||
1999 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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; | ||
28 | return (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 | |||
48 | var ge = require("./ge"); | ||
49 | var 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 | */ | ||
63 | function $(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 | |||
74 | module.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 | */ | ||
100 | var 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 | */ | ||
118 | var 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 | |||
160 | var CSSProperty = { | ||
161 | isUnitlessNumber: isUnitlessNumber, | ||
162 | shorthandPropertyExpansions: shorthandPropertyExpansions | ||
163 | }; | ||
164 | |||
165 | module.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 | |||
189 | var CSSProperty = require("./CSSProperty"); | ||
190 | |||
191 | var dangerousStyleValue = require("./dangerousStyleValue"); | ||
192 | var escapeTextForBrowser = require("./escapeTextForBrowser"); | ||
193 | var hyphenate = require("./hyphenate"); | ||
194 | var memoizeStringOnly = require("./memoizeStringOnly"); | ||
195 | |||
196 | var processStyleName = memoizeStringOnly(function(styleName) { | ||
197 | return escapeTextForBrowser(hyphenate(styleName)); | ||
198 | }); | ||
199 | |||
200 | /** | ||
201 | * Operations for dealing with CSS properties. | ||
202 | */ | ||
203 | var 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 | |||
264 | module.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 | |||
288 | var 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 | */ | ||
299 | var 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 | |||
357 | module.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 | |||
380 | var EventConstants = require("./EventConstants"); | ||
381 | var EventPluginHub = require("./EventPluginHub"); | ||
382 | var EventPropagators = require("./EventPropagators"); | ||
383 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
384 | var SyntheticEvent = require("./SyntheticEvent"); | ||
385 | |||
386 | var isEventSupported = require("./isEventSupported"); | ||
387 | var keyOf = require("./keyOf"); | ||
388 | |||
389 | var topLevelTypes = EventConstants.topLevelTypes; | ||
390 | |||
391 | var 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 | */ | ||
403 | var activeElement = null; | ||
404 | var activeElementID = null; | ||
405 | var activeElementValue = null; | ||
406 | var activeElementValueProp = null; | ||
407 | |||
408 | |||
409 | /** | ||
410 | * SECTION: handle `change` event | ||
411 | */ | ||
412 | function shouldUseChangeEvent(elem) { | ||
413 | return ( | ||
414 | elem.nodeName === 'SELECT' || | ||
415 | (elem.nodeName === 'INPUT' && elem.type === 'file') | ||
416 | ); | ||
417 | } | ||
418 | |||
419 | var doesChangeEventBubble = false; | ||
420 | if (ExecutionEnvironment.canUseDOM) { | ||
421 | // See `handleChange` comment below | ||
422 | doesChangeEventBubble = isEventSupported('change') && ( | ||
423 | !('documentMode' in document) || document.documentMode > 8 | ||
424 | ); | ||
425 | } | ||
426 | |||
427 | function 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 | |||
443 | function startWatchingForChangeEventIE8(target, targetID) { | ||
444 | activeElement = target; | ||
445 | activeElementID = targetID; | ||
446 | activeElement.attachEvent('onchange', manualDispatchChangeEvent); | ||
447 | } | ||
448 | |||
449 | function stopWatchingForChangeEventIE8() { | ||
450 | if (!activeElement) { | ||
451 | return; | ||
452 | } | ||
453 | activeElement.detachEvent('onchange', manualDispatchChangeEvent); | ||
454 | activeElement = null; | ||
455 | activeElementID = null; | ||
456 | } | ||
457 | |||
458 | function getTargetIDForChangeEvent( | ||
459 | topLevelType, | ||
460 | topLevelTarget, | ||
461 | topLevelTargetID) { | ||
462 | if (topLevelType === topLevelTypes.topChange) { | ||
463 | return topLevelTargetID; | ||
464 | } | ||
465 | } | ||
466 | function 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 | */ | ||
484 | var isInputEventSupported = false; | ||
485 | if (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 | */ | ||
497 | var 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 | |||
515 | function 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 | */ | ||
526 | var 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 | */ | ||
542 | function 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 | */ | ||
559 | function 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 | */ | ||
578 | function 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 | */ | ||
594 | function 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. | ||
606 | function 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. | ||
632 | function 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 | */ | ||
660 | function 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 | |||
670 | function 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 | */ | ||
689 | var 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 | |||
753 | module.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 | |||
780 | var Danger = require("./Danger"); | ||
781 | |||
782 | var insertNodeAt = require("./insertNodeAt"); | ||
783 | var keyOf = require("./keyOf"); | ||
784 | var throwIf = require("./throwIf"); | ||
785 | |||
786 | var NON_INCREASING_OPERATIONS; | ||
787 | if (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 | |||
794 | var MOVE_NODE_AT_ORIG_INDEX = keyOf({moveFrom: null}); | ||
795 | var INSERT_MARKUP = keyOf({insertMarkup: null}); | ||
796 | var 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 | */ | ||
809 | var _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 | */ | ||
834 | var _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 | */ | ||
854 | var _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 | |||
883 | var 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 | */ | ||
895 | var DOMChildrenOperations = { | ||
896 | dangerouslyReplaceNodeWithMarkup: Danger.dangerouslyReplaceNodeWithMarkup, | ||
897 | manageChildren: manageChildren | ||
898 | }; | ||
899 | |||
900 | module.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 | |||
927 | var invariant = require("./invariant"); | ||
928 | |||
929 | var 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 | }; | ||
1024 | var 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 | */ | ||
1039 | var 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 | |||
1136 | module.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 | |||
1160 | var DOMProperty = require("./DOMProperty"); | ||
1161 | |||
1162 | var escapeTextForBrowser = require("./escapeTextForBrowser"); | ||
1163 | var memoizeStringOnly = require("./memoizeStringOnly"); | ||
1164 | |||
1165 | var processAttributeNameAndPrefix = memoizeStringOnly(function(name) { | ||
1166 | return escapeTextForBrowser(name) + '="'; | ||
1167 | }); | ||
1168 | |||
1169 | /** | ||
1170 | * Operations for dealing with DOM properties. | ||
1171 | */ | ||
1172 | var 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 | |||
1256 | module.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 | |||
1281 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
1282 | |||
1283 | var throwIf = require("./throwIf"); | ||
1284 | |||
1285 | var DOM_UNSUPPORTED; | ||
1286 | var NO_MARKUP_PARENT; | ||
1287 | var NO_MULTI_MARKUP; | ||
1288 | if (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 | |||
1302 | var validateMarkupParams; | ||
1303 | if (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 | */ | ||
1314 | var 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 | */ | ||
1322 | var 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 | }; | ||
1332 | markupWrap['optgroup'] = markupWrap['option']; | ||
1333 | markupWrap['tbody'] = markupWrap['thead']; | ||
1334 | markupWrap['tfoot'] = markupWrap['thead']; | ||
1335 | markupWrap['colgroup'] = markupWrap['thead']; | ||
1336 | markupWrap['caption'] = markupWrap['thead']; | ||
1337 | markupWrap['th'] = markupWrap['td']; | ||
1338 | |||
1339 | /** | ||
1340 | * In IE8, certain elements cannot render alone, so wrap all elements. | ||
1341 | */ | ||
1342 | var defaultWrap = [1, '?<div>', '</div>']; | ||
1343 | |||
1344 | /** | ||
1345 | * Feature detection, remove wraps that are unnecessary for the current browser. | ||
1346 | */ | ||
1347 | if (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 | */ | ||
1375 | function 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 | */ | ||
1402 | function 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 | */ | ||
1424 | function 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 | */ | ||
1453 | function 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 | */ | ||
1471 | function 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 | |||
1483 | var Danger = { | ||
1484 | dangerouslyInsertMarkupAt: dangerouslyInsertMarkupAt, | ||
1485 | dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup | ||
1486 | }; | ||
1487 | |||
1488 | module.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 | |||
1511 | var DOMProperty = require("./DOMProperty"); | ||
1512 | |||
1513 | var MUST_USE_ATTRIBUTE = DOMProperty.injection.MUST_USE_ATTRIBUTE; | ||
1514 | var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; | ||
1515 | var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; | ||
1516 | var HAS_SIDE_EFFECTS = DOMProperty.injection.HAS_SIDE_EFFECTS; | ||
1517 | |||
1518 | var 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 | |||
1649 | module.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 | */ | ||
1683 | var 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 | |||
1693 | module.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 | |||
1717 | var EventConstants = require("./EventConstants"); | ||
1718 | var EventPropagators = require("./EventPropagators"); | ||
1719 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
1720 | var SyntheticMouseEvent = require("./SyntheticMouseEvent"); | ||
1721 | |||
1722 | var ReactMount = require("./ReactMount"); | ||
1723 | var keyOf = require("./keyOf"); | ||
1724 | |||
1725 | var topLevelTypes = EventConstants.topLevelTypes; | ||
1726 | var getFirstReactDOM = ReactMount.getFirstReactDOM; | ||
1727 | |||
1728 | var eventTypes = { | ||
1729 | mouseEnter: {registrationName: keyOf({onMouseEnter: null})}, | ||
1730 | mouseLeave: {registrationName: keyOf({onMouseLeave: null})} | ||
1731 | }; | ||
1732 | |||
1733 | var 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 | |||
1802 | module.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 | |||
1826 | var keyMirror = require("./keyMirror"); | ||
1827 | |||
1828 | var PropagationPhases = keyMirror({bubbled: null, captured: null}); | ||
1829 | |||
1830 | /** | ||
1831 | * Types of raw signals from the browser caught at the top level. | ||
1832 | */ | ||
1833 | var 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 | |||
1867 | var EventConstants = { | ||
1868 | topLevelTypes: topLevelTypes, | ||
1869 | PropagationPhases: PropagationPhases | ||
1870 | }; | ||
1871 | |||
1872 | module.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 | */ | ||
1897 | var 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 | |||
1935 | module.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 | |||
1958 | var CallbackRegistry = require("./CallbackRegistry"); | ||
1959 | var EventPluginRegistry = require("./EventPluginRegistry"); | ||
1960 | var EventPluginUtils = require("./EventPluginUtils"); | ||
1961 | var EventPropagators = require("./EventPropagators"); | ||
1962 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
1963 | |||
1964 | var accumulate = require("./accumulate"); | ||
1965 | var forEachAccumulated = require("./forEachAccumulated"); | ||
1966 | var 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 | */ | ||
1972 | var 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 | */ | ||
1980 | var 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 | */ | ||
2018 | var 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 | |||
2123 | if (ExecutionEnvironment.canUseDOM) { | ||
2124 | window.EventPluginHub = EventPluginHub; | ||
2125 | } | ||
2126 | |||
2127 | module.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 | |||
2151 | var invariant = require("./invariant"); | ||
2152 | |||
2153 | /** | ||
2154 | * Injectable ordering of event plugins. | ||
2155 | */ | ||
2156 | var EventPluginOrder = null; | ||
2157 | |||
2158 | /** | ||
2159 | * Injectable mapping from names to event plugin modules. | ||
2160 | */ | ||
2161 | var namesToPlugins = {}; | ||
2162 | |||
2163 | /** | ||
2164 | * Recomputes the plugin list using the injected plugins and plugin ordering. | ||
2165 | * | ||
2166 | * @private | ||
2167 | */ | ||
2168 | function 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 | */ | ||
2212 | function 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 | */ | ||
2237 | function 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 | */ | ||
2253 | var 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 | |||
2373 | module.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 | |||
2396 | var EventConstants = require("./EventConstants"); | ||
2397 | |||
2398 | var invariant = require("./invariant"); | ||
2399 | |||
2400 | var topLevelTypes = EventConstants.topLevelTypes; | ||
2401 | |||
2402 | function isEndish(topLevelType) { | ||
2403 | return topLevelType === topLevelTypes.topMouseUp || | ||
2404 | topLevelType === topLevelTypes.topTouchEnd || | ||
2405 | topLevelType === topLevelTypes.topTouchCancel; | ||
2406 | } | ||
2407 | |||
2408 | function isMoveish(topLevelType) { | ||
2409 | return topLevelType === topLevelTypes.topMouseMove || | ||
2410 | topLevelType === topLevelTypes.topTouchMove; | ||
2411 | } | ||
2412 | function isStartish(topLevelType) { | ||
2413 | return topLevelType === topLevelTypes.topMouseDown || | ||
2414 | topLevelType === topLevelTypes.topTouchStart; | ||
2415 | } | ||
2416 | |||
2417 | var validateEventDispatches; | ||
2418 | if (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 | */ | ||
2442 | function 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 | */ | ||
2467 | function executeDispatch(event, listener, domID) { | ||
2468 | listener(event, domID); | ||
2469 | } | ||
2470 | |||
2471 | /** | ||
2472 | * Standard/simple iteration through an event's collected dispatches. | ||
2473 | */ | ||
2474 | function 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 | */ | ||
2487 | function 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 | */ | ||
2520 | function 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 | */ | ||
2542 | function hasDispatches(event) { | ||
2543 | return !!event._dispatchListeners; | ||
2544 | } | ||
2545 | |||
2546 | /** | ||
2547 | * General utilities that are useful in creating custom Event Plugins. | ||
2548 | */ | ||
2549 | var 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 | |||
2560 | module.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 | |||
2583 | var CallbackRegistry = require("./CallbackRegistry"); | ||
2584 | var EventConstants = require("./EventConstants"); | ||
2585 | |||
2586 | var accumulate = require("./accumulate"); | ||
2587 | var forEachAccumulated = require("./forEachAccumulated"); | ||
2588 | var getListener = CallbackRegistry.getListener; | ||
2589 | var 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 | */ | ||
2599 | var 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 | */ | ||
2621 | function 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 | */ | ||
2633 | function 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 | */ | ||
2655 | function 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 | */ | ||
2671 | function 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 | */ | ||
2687 | function accumulateDirectDispatchesSingle(event) { | ||
2688 | if (event && event.dispatchConfig.registrationName) { | ||
2689 | accumulateDispatches(event.dispatchMarker, null, event); | ||
2690 | } | ||
2691 | } | ||
2692 | |||
2693 | function accumulateTwoPhaseDispatches(events) { | ||
2694 | if (true) { | ||
2695 | injection.validate(); | ||
2696 | } | ||
2697 | forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); | ||
2698 | } | ||
2699 | |||
2700 | function 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 | |||
2714 | function 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 | */ | ||
2734 | var EventPropagators = { | ||
2735 | accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, | ||
2736 | accumulateDirectDispatches: accumulateDirectDispatches, | ||
2737 | accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches, | ||
2738 | injection: injection | ||
2739 | }; | ||
2740 | |||
2741 | module.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 | |||
2766 | var 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 | */ | ||
2774 | var 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 | |||
2786 | module.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 | |||
2811 | var EventConstants = require("./EventConstants"); | ||
2812 | |||
2813 | var emptyFunction = require("./emptyFunction"); | ||
2814 | |||
2815 | var 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 | */ | ||
2825 | var 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 | |||
2852 | module.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 | */ | ||
2882 | var 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 | |||
2893 | var 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 | |||
2904 | var 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 | |||
2915 | var 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 | |||
2926 | var 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 | |||
2936 | var DEFAULT_POOL_SIZE = 10; | ||
2937 | var 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 | */ | ||
2948 | var 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 | |||
2959 | var PooledClass = { | ||
2960 | addPoolingTo: addPoolingTo, | ||
2961 | oneArgumentPooler: oneArgumentPooler, | ||
2962 | twoArgumentPooler: twoArgumentPooler, | ||
2963 | threeArgumentPooler: threeArgumentPooler, | ||
2964 | fiveArgumentPooler: fiveArgumentPooler | ||
2965 | }; | ||
2966 | |||
2967 | module.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 | |||
2990 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
2991 | var ReactComponent = require("./ReactComponent"); | ||
2992 | var ReactDOM = require("./ReactDOM"); | ||
2993 | var ReactMount = require("./ReactMount"); | ||
2994 | var ReactPropTypes = require("./ReactPropTypes"); | ||
2995 | var ReactServerRendering = require("./ReactServerRendering"); | ||
2996 | |||
2997 | var ReactDefaultInjection = require("./ReactDefaultInjection"); | ||
2998 | |||
2999 | ReactDefaultInjection.inject(); | ||
3000 | |||
3001 | var 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 | |||
3017 | module.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 | |||
3042 | var getReactRootElementInContainer = require("./getReactRootElementInContainer"); | ||
3043 | var ReactCurrentOwner = require("./ReactCurrentOwner"); | ||
3044 | var ReactDOMIDOperations = require("./ReactDOMIDOperations"); | ||
3045 | var ReactMarkupChecksum = require("./ReactMarkupChecksum"); | ||
3046 | var ReactMount = require("./ReactMount"); | ||
3047 | var ReactOwner = require("./ReactOwner"); | ||
3048 | var ReactReconcileTransaction = require("./ReactReconcileTransaction"); | ||
3049 | var ReactUpdates = require("./ReactUpdates"); | ||
3050 | |||
3051 | var invariant = require("./invariant"); | ||
3052 | var keyMirror = require("./keyMirror"); | ||
3053 | var merge = require("./merge"); | ||
3054 | |||
3055 | /** | ||
3056 | * Prop key that references a component's owner. | ||
3057 | * @private | ||
3058 | */ | ||
3059 | var OWNER = '{owner}'; | ||
3060 | |||
3061 | /** | ||
3062 | * Props key that determines if a component's key was already validated. | ||
3063 | * @private | ||
3064 | */ | ||
3065 | var IS_KEY_VALIDATED = '{is.key.validated}'; | ||
3066 | |||
3067 | /** | ||
3068 | * Every React component is in one of these life cycles. | ||
3069 | */ | ||
3070 | var 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 | |||
3087 | var 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 | */ | ||
3098 | function 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 | */ | ||
3140 | function 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 | */ | ||
3179 | var 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 | |||
3608 | module.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 | |||
3631 | var ReactComponent = require("./ReactComponent"); | ||
3632 | var ReactCurrentOwner = require("./ReactCurrentOwner"); | ||
3633 | var ReactOwner = require("./ReactOwner"); | ||
3634 | var ReactPropTransferer = require("./ReactPropTransferer"); | ||
3635 | var ReactUpdates = require("./ReactUpdates"); | ||
3636 | |||
3637 | var invariant = require("./invariant"); | ||
3638 | var keyMirror = require("./keyMirror"); | ||
3639 | var merge = require("./merge"); | ||
3640 | var mixInto = require("./mixInto"); | ||
3641 | |||
3642 | /** | ||
3643 | * Policies that describe methods in `ReactCompositeComponentInterface`. | ||
3644 | */ | ||
3645 | var 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 | */ | ||
3683 | var 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 | */ | ||
3880 | var 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 | |||
3896 | function 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 | |||
3923 | function 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 | */ | ||
3942 | function 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 | */ | ||
3995 | function 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 | */ | ||
4028 | var 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 | */ | ||
4054 | var 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 | |||
4452 | var ReactCompositeComponentBase = function() {}; | ||
4453 | mixInto(ReactCompositeComponentBase, ReactComponent.Mixin); | ||
4454 | mixInto(ReactCompositeComponentBase, ReactOwner.Mixin); | ||
4455 | mixInto(ReactCompositeComponentBase, ReactPropTransferer.Mixin); | ||
4456 | mixInto(ReactCompositeComponentBase, ReactCompositeComponentMixin); | ||
4457 | |||
4458 | /** | ||
4459 | * Module for creating composite components. | ||
4460 | * | ||
4461 | * @class ReactCompositeComponent | ||
4462 | * @extends ReactComponent | ||
4463 | * @extends ReactOwner | ||
4464 | * @extends ReactPropTransferer | ||
4465 | */ | ||
4466 | var 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 | |||
4525 | module.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 | */ | ||
4557 | var ReactCurrentOwner = { | ||
4558 | |||
4559 | /** | ||
4560 | * @internal | ||
4561 | * @type {ReactComponent} | ||
4562 | */ | ||
4563 | current: null | ||
4564 | |||
4565 | }; | ||
4566 | |||
4567 | module.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 | |||
4591 | var ReactNativeComponent = require("./ReactNativeComponent"); | ||
4592 | |||
4593 | var mergeInto = require("./mergeInto"); | ||
4594 | var 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 | */ | ||
4611 | function 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 | */ | ||
4631 | var 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 | |||
4754 | var injection = { | ||
4755 | injectComponentClasses: function(componentClasses) { | ||
4756 | mergeInto(ReactDOM, componentClasses); | ||
4757 | } | ||
4758 | }; | ||
4759 | |||
4760 | ReactDOM.injection = injection; | ||
4761 | |||
4762 | module.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 | |||
4785 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
4786 | var ReactDOM = require("./ReactDOM"); | ||
4787 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
4788 | var EventConstants = require("./EventConstants"); | ||
4789 | |||
4790 | // Store a reference to the <form> `ReactNativeComponent`. | ||
4791 | var 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 | */ | ||
4799 | var 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 | |||
4816 | module.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 | |||
4842 | var CSSPropertyOperations = require("./CSSPropertyOperations"); | ||
4843 | var DOMChildrenOperations = require("./DOMChildrenOperations"); | ||
4844 | var DOMPropertyOperations = require("./DOMPropertyOperations"); | ||
4845 | var ReactMount = require("./ReactMount"); | ||
4846 | |||
4847 | var getTextContentAccessor = require("./getTextContentAccessor"); | ||
4848 | var invariant = require("./invariant"); | ||
4849 | |||
4850 | /** | ||
4851 | * Errors for properties that should not be updated with `updatePropertyById()`. | ||
4852 | * | ||
4853 | * @type {object} | ||
4854 | * @private | ||
4855 | */ | ||
4856 | var 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 | */ | ||
4868 | var textContentAccessor = getTextContentAccessor() || 'NA'; | ||
4869 | |||
4870 | /** | ||
4871 | * Operations used to process updates to DOM nodes. This is made injectable via | ||
4872 | * `ReactComponent.DOMIDOperations`. | ||
4873 | */ | ||
4874 | var 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, ' '); | ||
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 | |||
5003 | module.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 | |||
5027 | var DOMPropertyOperations = require("./DOMPropertyOperations"); | ||
5028 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
5029 | var ReactDOM = require("./ReactDOM"); | ||
5030 | |||
5031 | var merge = require("./merge"); | ||
5032 | |||
5033 | // Store a reference to the <input> `ReactNativeComponent`. | ||
5034 | var 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 | */ | ||
5052 | var 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 | |||
5121 | module.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 | |||
5144 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
5145 | var ReactDOM = require("./ReactDOM"); | ||
5146 | |||
5147 | // Store a reference to the <option> `ReactNativeComponent`. | ||
5148 | var option = ReactDOM.option; | ||
5149 | |||
5150 | /** | ||
5151 | * Implements an <option> native component that warns when `selected` is set. | ||
5152 | */ | ||
5153 | var 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 | |||
5173 | module.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 | |||
5196 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
5197 | var ReactDOM = require("./ReactDOM"); | ||
5198 | |||
5199 | var invariant = require("./invariant"); | ||
5200 | var merge = require("./merge"); | ||
5201 | |||
5202 | // Store a reference to the <select> `ReactNativeComponent`. | ||
5203 | var select = ReactDOM.select; | ||
5204 | |||
5205 | /** | ||
5206 | * Validation function for `value` and `defaultValue`. | ||
5207 | * @private | ||
5208 | */ | ||
5209 | function 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 | */ | ||
5234 | function 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 | */ | ||
5268 | var 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 | |||
5333 | module.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 | |||
5356 | var DOMPropertyOperations = require("./DOMPropertyOperations"); | ||
5357 | var ReactCompositeComponent = require("./ReactCompositeComponent"); | ||
5358 | var ReactDOM = require("./ReactDOM"); | ||
5359 | |||
5360 | var invariant = require("./invariant"); | ||
5361 | var merge = require("./merge"); | ||
5362 | |||
5363 | // Store a reference to the <textarea> `ReactNativeComponent`. | ||
5364 | var textarea = ReactDOM.textarea; | ||
5365 | |||
5366 | // For quickly matching children type, to test if can be treated as content. | ||
5367 | var 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 | */ | ||
5384 | var 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 | |||
5473 | module.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 | |||
5496 | var ReactDOM = require("./ReactDOM"); | ||
5497 | var ReactDOMForm = require("./ReactDOMForm"); | ||
5498 | var ReactDOMInput = require("./ReactDOMInput"); | ||
5499 | var ReactDOMOption = require("./ReactDOMOption"); | ||
5500 | var ReactDOMSelect = require("./ReactDOMSelect"); | ||
5501 | var ReactDOMTextarea = require("./ReactDOMTextarea"); | ||
5502 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
5503 | var ReactEventTopLevelCallback = require("./ReactEventTopLevelCallback"); | ||
5504 | |||
5505 | var DefaultDOMPropertyConfig = require("./DefaultDOMPropertyConfig"); | ||
5506 | var DOMProperty = require("./DOMProperty"); | ||
5507 | |||
5508 | var DefaultEventPluginOrder = require("./DefaultEventPluginOrder"); | ||
5509 | var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin"); | ||
5510 | var ChangeEventPlugin = require("./ChangeEventPlugin"); | ||
5511 | var EventPluginHub = require("./EventPluginHub"); | ||
5512 | var ReactInstanceHandles = require("./ReactInstanceHandles"); | ||
5513 | var SimpleEventPlugin = require("./SimpleEventPlugin"); | ||
5514 | var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin"); | ||
5515 | |||
5516 | function 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 | |||
5546 | module.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 | |||
5572 | var EventConstants = require("./EventConstants"); | ||
5573 | var EventListener = require("./EventListener"); | ||
5574 | var EventPluginHub = require("./EventPluginHub"); | ||
5575 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
5576 | var ReactUpdates = require("./ReactUpdates"); | ||
5577 | var ViewportMetrics = require("./ViewportMetrics"); | ||
5578 | |||
5579 | var invariant = require("./invariant"); | ||
5580 | var 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 | */ | ||
5632 | var _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 | */ | ||
5642 | function 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 | */ | ||
5660 | function 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 | */ | ||
5679 | function 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 | */ | ||
5707 | function 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 | */ | ||
5793 | var 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 | |||
5899 | module.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 | |||
5924 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
5925 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
5926 | var ReactMount = require("./ReactMount"); | ||
5927 | |||
5928 | var getEventTarget = require("./getEventTarget"); | ||
5929 | |||
5930 | /** | ||
5931 | * @type {boolean} | ||
5932 | * @private | ||
5933 | */ | ||
5934 | var _topLevelListenersEnabled = true; | ||
5935 | |||
5936 | /** | ||
5937 | * Top-level callback creator used to implement event handling using delegation. | ||
5938 | * This is used via dependency injection. | ||
5939 | */ | ||
5940 | var 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 | |||
5992 | module.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. | ||
6018 | function getActiveElement() { | ||
6019 | try { | ||
6020 | return document.activeElement; | ||
6021 | } catch (e) { | ||
6022 | } | ||
6023 | } | ||
6024 | |||
6025 | function 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 | */ | ||
6035 | var 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 | |||
6179 | module.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 | |||
6203 | var invariant = require("./invariant"); | ||
6204 | |||
6205 | var SEPARATOR = '.'; | ||
6206 | var SEPARATOR_LENGTH = SEPARATOR.length; | ||
6207 | |||
6208 | /** | ||
6209 | * Maximum depth of traversals before we consider the possibility of a bad ID. | ||
6210 | */ | ||
6211 | var 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 | */ | ||
6220 | var 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 | */ | ||
6229 | function 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 | */ | ||
6241 | function 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 | */ | ||
6252 | function 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 | */ | ||
6266 | function 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 | */ | ||
6280 | function 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 | */ | ||
6293 | function 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 | */ | ||
6332 | function 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 | */ | ||
6368 | function 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 | */ | ||
6411 | var 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 | |||
6493 | module.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 | |||
6516 | var adler32 = require("./adler32"); | ||
6517 | |||
6518 | var 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 | |||
6548 | module.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 | |||
6571 | var invariant = require("./invariant"); | ||
6572 | var getReactRootElementInContainer = require("./getReactRootElementInContainer"); | ||
6573 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
6574 | var ReactInstanceHandles = require("./ReactInstanceHandles"); | ||
6575 | |||
6576 | var SEPARATOR = ReactInstanceHandles.SEPARATOR; | ||
6577 | |||
6578 | var ATTR_NAME = 'data-reactid'; | ||
6579 | var nodeCache = {}; | ||
6580 | |||
6581 | var $ = require("./$"); | ||
6582 | |||
6583 | /** Mapping from reactRootID to React component instance. */ | ||
6584 | var instanceByReactRootID = {}; | ||
6585 | |||
6586 | /** Mapping from reactRootID to `container` nodes. */ | ||
6587 | var containersByReactRootID = {}; | ||
6588 | |||
6589 | if (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 | */ | ||
6598 | function 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 | */ | ||
6613 | function 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 | |||
6635 | function 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 | */ | ||
6648 | function 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 | */ | ||
6664 | function 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 | */ | ||
6681 | function 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 | |||
6698 | function 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 | */ | ||
6730 | function 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 | */ | ||
6749 | var 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 | |||
7129 | module.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 | |||
7153 | var 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 | */ | ||
7163 | function 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 | */ | ||
7181 | var 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 | |||
7335 | var ReactMultiChild = { | ||
7336 | Mixin: ReactMultiChildMixin | ||
7337 | }; | ||
7338 | |||
7339 | module.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 | |||
7364 | var CSSPropertyOperations = require("./CSSPropertyOperations"); | ||
7365 | var DOMProperty = require("./DOMProperty"); | ||
7366 | var DOMPropertyOperations = require("./DOMPropertyOperations"); | ||
7367 | var ReactComponent = require("./ReactComponent"); | ||
7368 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
7369 | var ReactMultiChild = require("./ReactMultiChild"); | ||
7370 | var ReactMount = require("./ReactMount"); | ||
7371 | |||
7372 | var escapeTextForBrowser = require("./escapeTextForBrowser"); | ||
7373 | var flattenChildren = require("./flattenChildren"); | ||
7374 | var invariant = require("./invariant"); | ||
7375 | var keyOf = require("./keyOf"); | ||
7376 | var merge = require("./merge"); | ||
7377 | var mixInto = require("./mixInto"); | ||
7378 | |||
7379 | var putListener = ReactEventEmitter.putListener; | ||
7380 | var deleteListener = ReactEventEmitter.deleteListener; | ||
7381 | var registrationNames = ReactEventEmitter.registrationNames; | ||
7382 | |||
7383 | // For quickly matching children type, to test if can be treated as content. | ||
7384 | var CONTENT_TYPES = {'string': true, 'number': true}; | ||
7385 | |||
7386 | var DANGEROUSLY_SET_INNER_HTML = keyOf({dangerouslySetInnerHTML: null}); | ||
7387 | var STYLE = keyOf({style: null}); | ||
7388 | |||
7389 | /** | ||
7390 | * @param {?object} props | ||
7391 | */ | ||
7392 | function 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 | */ | ||
7413 | function ReactNativeComponent(tag, omitClose) { | ||
7414 | this._tagOpen = '<' + tag; | ||
7415 | this._tagClose = omitClose ? '' : '</' + tag + '>'; | ||
7416 | this.tagName = tag.toUpperCase(); | ||
7417 | } | ||
7418 | |||
7419 | ReactNativeComponent.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 | |||
7699 | mixInto(ReactNativeComponent, ReactComponent.Mixin); | ||
7700 | mixInto(ReactNativeComponent, ReactNativeComponent.Mixin); | ||
7701 | mixInto(ReactNativeComponent, ReactMultiChild.Mixin); | ||
7702 | |||
7703 | module.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 | |||
7726 | var PooledClass = require("./PooledClass"); | ||
7727 | |||
7728 | var 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 | */ | ||
7742 | function ReactOnDOMReady(initialCollection) { | ||
7743 | this._queue = initialCollection || null; | ||
7744 | } | ||
7745 | |||
7746 | mixInto(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 | |||
7798 | PooledClass.addPoolingTo(ReactOnDOMReady); | ||
7799 | |||
7800 | module.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 | |||
7823 | var 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 | */ | ||
7855 | var 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 | |||
7948 | module.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 | |||
7971 | var emptyFunction = require("./emptyFunction"); | ||
7972 | var joinClasses = require("./joinClasses"); | ||
7973 | var 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 | */ | ||
7982 | function 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 | */ | ||
7995 | var 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 | */ | ||
8020 | var 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 | |||
8068 | module.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 | |||
8091 | var createObjectFrom = require("./createObjectFrom"); | ||
8092 | var 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 | */ | ||
8142 | var 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 | |||
8157 | var ANONYMOUS = '<<anonymous>>'; | ||
8158 | |||
8159 | function 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 | |||
8177 | function 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 | |||
8191 | function 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 | |||
8204 | function 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 | |||
8228 | module.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 | |||
8252 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
8253 | var PooledClass = require("./PooledClass"); | ||
8254 | var ReactEventEmitter = require("./ReactEventEmitter"); | ||
8255 | var ReactInputSelection = require("./ReactInputSelection"); | ||
8256 | var ReactOnDOMReady = require("./ReactOnDOMReady"); | ||
8257 | var Transaction = require("./Transaction"); | ||
8258 | |||
8259 | var 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 | */ | ||
8265 | var 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 | */ | ||
8281 | var 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 | */ | ||
8305 | var 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 | */ | ||
8326 | var 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 | */ | ||
8346 | function ReactReconcileTransaction() { | ||
8347 | this.reinitializeTransaction(); | ||
8348 | this.reactOnDOMReady = ReactOnDOMReady.getPooled(null); | ||
8349 | } | ||
8350 | |||
8351 | var 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 | |||
8386 | mixInto(ReactReconcileTransaction, Transaction.Mixin); | ||
8387 | mixInto(ReactReconcileTransaction, Mixin); | ||
8388 | |||
8389 | PooledClass.addPoolingTo(ReactReconcileTransaction); | ||
8390 | |||
8391 | module.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 | |||
8414 | var ReactMarkupChecksum = require("./ReactMarkupChecksum"); | ||
8415 | var ReactReconcileTransaction = require("./ReactReconcileTransaction"); | ||
8416 | var ReactInstanceHandles = require("./ReactInstanceHandles"); | ||
8417 | |||
8418 | /** | ||
8419 | * @param {object} component | ||
8420 | * @param {function} callback | ||
8421 | */ | ||
8422 | function 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 | |||
8439 | module.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 | |||
8465 | var ReactComponent = require("./ReactComponent"); | ||
8466 | var ReactMount = require("./ReactMount"); | ||
8467 | |||
8468 | var escapeTextForBrowser = require("./escapeTextForBrowser"); | ||
8469 | var 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 | */ | ||
8486 | var ReactTextComponent = function(initialText) { | ||
8487 | this.construct({text: initialText}); | ||
8488 | }; | ||
8489 | |||
8490 | mixInto(ReactTextComponent, ReactComponent.Mixin); | ||
8491 | mixInto(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 | |||
8529 | module.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 | |||
8552 | var invariant = require("./invariant"); | ||
8553 | |||
8554 | var isBatchingUpdates = false; | ||
8555 | |||
8556 | var 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 | */ | ||
8562 | function 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 | */ | ||
8606 | function 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 | |||
8631 | var ReactUpdates = { | ||
8632 | batchedUpdates: batchedUpdates, | ||
8633 | enqueueUpdate: enqueueUpdate | ||
8634 | }; | ||
8635 | |||
8636 | module.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 | |||
8659 | var EventConstants = require("./EventConstants"); | ||
8660 | var EventPropagators = require("./EventPropagators"); | ||
8661 | var SyntheticEvent = require("./SyntheticEvent"); | ||
8662 | var SyntheticFocusEvent = require("./SyntheticFocusEvent"); | ||
8663 | var SyntheticKeyboardEvent = require("./SyntheticKeyboardEvent"); | ||
8664 | var SyntheticMouseEvent = require("./SyntheticMouseEvent"); | ||
8665 | var SyntheticMutationEvent = require("./SyntheticMutationEvent"); | ||
8666 | var SyntheticTouchEvent = require("./SyntheticTouchEvent"); | ||
8667 | var SyntheticUIEvent = require("./SyntheticUIEvent"); | ||
8668 | var SyntheticWheelEvent = require("./SyntheticWheelEvent"); | ||
8669 | |||
8670 | var invariant = require("./invariant"); | ||
8671 | var keyOf = require("./keyOf"); | ||
8672 | |||
8673 | var topLevelTypes = EventConstants.topLevelTypes; | ||
8674 | |||
8675 | var 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 | |||
8842 | var 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 | |||
8872 | var 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 | |||
8973 | module.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 | |||
8997 | var PooledClass = require("./PooledClass"); | ||
8998 | |||
8999 | var emptyFunction = require("./emptyFunction"); | ||
9000 | var getEventTarget = require("./getEventTarget"); | ||
9001 | var merge = require("./merge"); | ||
9002 | var mergeInto = require("./mergeInto"); | ||
9003 | |||
9004 | /** | ||
9005 | * @interface Event | ||
9006 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9007 | */ | ||
9008 | var 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 | */ | ||
9039 | function 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 | |||
9065 | mergeInto(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 | |||
9111 | SyntheticEvent.Interface = EventInterface; | ||
9112 | |||
9113 | /** | ||
9114 | * Helper to reduce boilerplate when creating subclasses. | ||
9115 | * | ||
9116 | * @param {function} Class | ||
9117 | * @param {?object} Interface | ||
9118 | */ | ||
9119 | SyntheticEvent.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 | |||
9133 | PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler); | ||
9134 | |||
9135 | module.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 | |||
9159 | var SyntheticUIEvent = require("./SyntheticUIEvent"); | ||
9160 | |||
9161 | /** | ||
9162 | * @interface FocusEvent | ||
9163 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9164 | */ | ||
9165 | var 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 | */ | ||
9175 | function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9176 | SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9177 | } | ||
9178 | |||
9179 | SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); | ||
9180 | |||
9181 | module.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 | |||
9205 | var SyntheticUIEvent = require("./SyntheticUIEvent"); | ||
9206 | |||
9207 | /** | ||
9208 | * @interface KeyboardEvent | ||
9209 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9210 | */ | ||
9211 | var 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 | */ | ||
9233 | function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9234 | SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9235 | } | ||
9236 | |||
9237 | SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); | ||
9238 | |||
9239 | module.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 | |||
9263 | var SyntheticUIEvent = require("./SyntheticUIEvent"); | ||
9264 | var ViewportMetrics = require("./ViewportMetrics"); | ||
9265 | |||
9266 | /** | ||
9267 | * @interface MouseEvent | ||
9268 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9269 | */ | ||
9270 | var 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 | */ | ||
9320 | function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9321 | SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9322 | } | ||
9323 | |||
9324 | SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); | ||
9325 | |||
9326 | module.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 | |||
9350 | var SyntheticEvent = require("./SyntheticEvent"); | ||
9351 | |||
9352 | /** | ||
9353 | * @interface MutationEvent | ||
9354 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9355 | */ | ||
9356 | var 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 | */ | ||
9370 | function SyntheticMutationEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9371 | SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9372 | } | ||
9373 | |||
9374 | SyntheticEvent.augmentClass(SyntheticMutationEvent, MutationEventInterface); | ||
9375 | |||
9376 | module.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 | |||
9400 | var SyntheticUIEvent = require("./SyntheticUIEvent"); | ||
9401 | |||
9402 | /** | ||
9403 | * @interface TouchEvent | ||
9404 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9405 | */ | ||
9406 | var 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 | */ | ||
9422 | function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9423 | SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9424 | } | ||
9425 | |||
9426 | SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); | ||
9427 | |||
9428 | module.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 | |||
9452 | var SyntheticEvent = require("./SyntheticEvent"); | ||
9453 | |||
9454 | /** | ||
9455 | * @interface UIEvent | ||
9456 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9457 | */ | ||
9458 | var 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 | */ | ||
9469 | function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9470 | SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9471 | } | ||
9472 | |||
9473 | SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); | ||
9474 | |||
9475 | module.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 | |||
9499 | var SyntheticMouseEvent = require("./SyntheticMouseEvent"); | ||
9500 | |||
9501 | /** | ||
9502 | * @interface WheelEvent | ||
9503 | * @see http://www.w3.org/TR/DOM-Level-3-Events/ | ||
9504 | */ | ||
9505 | var 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 | */ | ||
9534 | function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) { | ||
9535 | SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); | ||
9536 | } | ||
9537 | |||
9538 | SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); | ||
9539 | |||
9540 | module.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 | |||
9563 | var 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 | */ | ||
9629 | var 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 | |||
9782 | var 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 | |||
9793 | module.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 | |||
9817 | var 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 | |||
9832 | module.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 | |||
9855 | var 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 | */ | ||
9864 | function 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 | |||
9888 | module.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 | |||
9911 | var 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. | ||
9917 | function 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 | |||
9927 | module.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 | */ | ||
9955 | function 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 | |||
9983 | module.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 | |||
10004 | var 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 | */ | ||
10029 | function 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 | |||
10048 | module.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 | |||
10072 | var 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 | */ | ||
10083 | function 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 | |||
10107 | module.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 | |||
10128 | var copyProperties = require("./copyProperties"); | ||
10129 | |||
10130 | function 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 | */ | ||
10141 | function emptyFunction() {} | ||
10142 | |||
10143 | copyProperties(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 | |||
10152 | module.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 | |||
10176 | var invariant = require("./invariant"); | ||
10177 | |||
10178 | var ESCAPE_LOOKUP = { | ||
10179 | "&": "&", | ||
10180 | ">": ">", | ||
10181 | "<": "<", | ||
10182 | "\"": """, | ||
10183 | "'": "'", | ||
10184 | "/": "/" | ||
10185 | }; | ||
10186 | |||
10187 | function 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 | */ | ||
10197 | function 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 | |||
10214 | module.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 | |||
10248 | var 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 | |||
10262 | ex._prefix = '<![EX['; | ||
10263 | ex._suffix = ']]>'; | ||
10264 | |||
10265 | module.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 | |||
10288 | var invariant = require("./invariant"); | ||
10289 | var 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 | */ | ||
10296 | function 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 | */ | ||
10312 | function flattenChildren(children) { | ||
10313 | if (children == null) { | ||
10314 | return children; | ||
10315 | } | ||
10316 | var result = {}; | ||
10317 | traverseAllChildren(children, flattenSingleChildIntoContext, result); | ||
10318 | return result; | ||
10319 | } | ||
10320 | |||
10321 | module.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 | */ | ||
10351 | var 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 | |||
10359 | module.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 | */ | ||
10389 | function ge(arg, root, tag) { | ||
10390 | return typeof arg != 'string' ? arg : | ||
10391 | !root ? document.getElementById(arg) : | ||
10392 | _geFromSubtree(arg, root, tag); | ||
10393 | } | ||
10394 | |||
10395 | function _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 | */ | ||
10431 | function _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 | |||
10437 | module.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 | |||
10461 | var 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 | */ | ||
10470 | function 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 | |||
10480 | module.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 | */ | ||
10508 | function getReactRootElementInContainer(container) { | ||
10509 | return container && container.firstChild; | ||
10510 | } | ||
10511 | |||
10512 | module.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 | |||
10535 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
10536 | |||
10537 | var 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 | */ | ||
10545 | function getTextContentAccessor() { | ||
10546 | if (!contentKey && ExecutionEnvironment.canUseDOM) { | ||
10547 | contentKey = 'innerText' in document.createElement('div') ? | ||
10548 | 'innerText' : | ||
10549 | 'textContent'; | ||
10550 | } | ||
10551 | return contentKey; | ||
10552 | } | ||
10553 | |||
10554 | module.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 | */ | ||
10588 | function 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 | |||
10611 | module.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 | |||
10633 | var _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 | */ | ||
10644 | function hyphenate(string) { | ||
10645 | return string.replace(_uppercasePattern, '-$1').toLowerCase(); | ||
10646 | } | ||
10647 | |||
10648 | module.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 | */ | ||
10677 | function 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 | |||
10696 | module.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 | |||
10727 | function invariant(condition) { | ||
10728 | if (!condition) { | ||
10729 | throw new Error('Invariant Violation'); | ||
10730 | } | ||
10731 | } | ||
10732 | |||
10733 | module.exports = invariant; | ||
10734 | |||
10735 | if (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 | |||
10775 | var ExecutionEnvironment = require("./ExecutionEnvironment"); | ||
10776 | |||
10777 | var testNode, useHasFeature; | ||
10778 | if (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 | */ | ||
10801 | function 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 | |||
10828 | module.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 | */ | ||
10859 | function 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 | |||
10874 | module.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 | |||
10898 | var 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 | */ | ||
10918 | var 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 | |||
10934 | module.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 | */ | ||
10965 | var 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 | |||
10977 | module.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 | */ | ||
11007 | function 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 | |||
11018 | module.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 | |||
11041 | var 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 | */ | ||
11050 | var merge = function(one, two) { | ||
11051 | var result = {}; | ||
11052 | mergeInto(result, one); | ||
11053 | mergeInto(result, two); | ||
11054 | return result; | ||
11055 | }; | ||
11056 | |||
11057 | module.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 | |||
11082 | var invariant = require("./invariant"); | ||
11083 | var keyMirror = require("./keyMirror"); | ||
11084 | |||
11085 | /** | ||
11086 | * Maximum number of levels to traverse. Will catch circular structures. | ||
11087 | * @const | ||
11088 | */ | ||
11089 | var 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 | */ | ||
11097 | var isTerminal = function(o) { | ||
11098 | return typeof o !== 'object' || o === null; | ||
11099 | }; | ||
11100 | |||
11101 | var 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 | |||
11196 | module.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 | |||
11220 | var mergeHelpers = require("./mergeHelpers"); | ||
11221 | |||
11222 | var 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 | */ | ||
11230 | function 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 | |||
11243 | module.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 | */ | ||
11269 | var 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 | |||
11279 | module.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 | */ | ||
11314 | function 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 | |||
11328 | module.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 | |||
11351 | var throwIf = function(condition, err) { | ||
11352 | if (condition) { | ||
11353 | throw new Error(err); | ||
11354 | } | ||
11355 | }; | ||
11356 | |||
11357 | module.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 | |||
11380 | var ReactComponent = require("./ReactComponent"); | ||
11381 | var ReactTextComponent = require("./ReactTextComponent"); | ||
11382 | |||
11383 | var 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 | */ | ||
11402 | var 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 | */ | ||
11480 | function traverseAllChildren(children, callback, traverseContext) { | ||
11481 | if (children !== null && children !== undefined) { | ||
11482 | traverseAllChildrenImpl(children, '', 0, callback, traverseContext); | ||
11483 | } | ||
11484 | } | ||
11485 | |||
11486 | module.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | function _pm_logEvent(anEvent) { | ||
25 | //console.log("####", anEvent); | ||
26 | |||
27 | anEvent.preventDefault(); | ||
28 | } | ||
29 | |||
30 | function handleGenericDeferredError(anError) { | ||
31 | var result; | ||
32 | |||
33 | if (anError instanceof MochiKit.Async.CancelledError) { | ||
34 | result = anError; | ||
35 | } else { | ||
36 | MochiKit.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 | |||
45 | Clipperz.PM.RunTime = {}; | ||
46 | function 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 | |||
62 | MochiKit.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+c2FsdAFKc2luZgFWc2luZgFcc3MwMQFic3MwMQFoc3MwMgFuc3MwMgF0c3MwMwF6c3MwMwGAc3MwNAGGc3MwNAGMc3VicwGSc3VicwGYc3VwcwGec3VwcwGmAAAAAgAAAAEAAAACAAAAAQAAAAEAEAAAAAEAEAAAAAUAAwAEAAUABgAHAAAABQADAAQABQAGAAcAAAABAAkAAAABAAkAAAADAAgACgALAAAAAwAIAAoACwAAAAEACAAAAAEACAAAAAEADwAAAAEADwAAAAEADAAAAAEADAAAAAQAEQASABMAFAAAAAQAEQASABMAFAAAAAEADgAAAAEADgQEAAEAEQP+AAEAEQQIAAEAEgQCAAEAEgQ4AAEAEwQyAAEAEwRIAAEAFARCAAEAFAAAAAEADgAAAAEADgAAAAIADAANAAAAAgAMAA0AFwAwADgAQABIAFAAWgBiAGoAcgB6AIIAigCWAJ4ApgCuALYAvgDGAM4A1gDeAOYAAQAAAAED+gADAAAAAQSwAAIAAAABAK4ABgAAAAEAzAAGAAAAAgDWAOoABAAAAAEA8gAEAAAAAQFkAAYAAAABAioAAQAAAAECNAABAAAAAQJOAAEAAAABAmgABgAAAAMCZgJ4AooAAQAAAAECkgABAAAAAQLKAAEAAAABAuQAAQAAAAEC/gABAAAAAQL8AAEAAAABAv4AAQAAAAEDBgABAAAAAQM6AAEAAAABA04ABAAAAAEE3AABAAAAAQTmAAEFPgAEAA4AFAAaACAAAgAGAuEAAgAQAuEAAgAgAuEAAgAqAuEAAwAAAAEFGAABBSQAAQAAAAIAAwAAAAIFGAUeAAEFJAABAAAAFQADAAAAAQUWAAEFEAABAAAAFgABBQoAAwAMADYAWAAFAAwAEgAYAB4AJAMNAAIC3QMLAAIC3wMRAAIC4wMbAAIC5wMPAAIC7QAEAAoAEAAWABwDFQACAt0DEwACAt8DGQACAuMDFwACAu0ABAAKABAAFgAcAwkAAgLdAwUAAgLfAwMAAgLlAwcAAgLzAAEEmgAQACYAMAA6AEQATgBYAGIAbAB2AIAAkgCcAKYAsAC6AMQAAQAEAEsAAgL/AAEABABnAAIC/wABAAQAbgACAuMAAQAEAH4AAgL/AAEABACpAAIC/wABAAQAzQACAv8AAQAEAPwAAgL/AAEABAEEAAIC8wABAAQBGAACAv8AAgAGAAwBHwACAuMBHAACAv0AAQAEAS4AAgL/AAEABAE1AAIC8wABAAQBXQACAv8AAQAEAWwAAgLzAAEABAGCAAIC/wABAAQByAACAv0AAwABA/AAAQQSAAAAAQAAABYAAgQ8AA4CRAJFAkYCRwJIAkkCSgJLAkwCTQJQAlECTgJPAAIEGgAOAjYCNwI4AjkCOgI7AjwCPQI+Aj8CQgJDAkACQQABBA4AgwADAAEEDgABBBgAAAABAAAAFgADAAEEDgABBB4AAAABAAAAFgADAAIEIAQWAAEEDAAAAAEAAAAWAAIEFAAdAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQACA3oADgIaAhsCHAIdAh4CHwIgAiECIgIjAiYCJwIkAiUAAgNYAA4CKAIpAioCKwIsAi0CLgIvAjACMQI0AjUCMgIzAAEDpgAKAAEDqgABAAABAAACA94AAwIXAhgCFgAAAQEAAgPYABkBrQGuAa8BsAGxAbIBswG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwgHDAlMCcgAAAQIAAgO4AAkBxAHFAcYBxwHIAckBygHLAnMAAAEDAAEDsv+jAAIDsgBcAlYCVwJYAlkCWgJcAl0CXgJfAmACYQJiAmMCZAJlAmYCZwJoAmkCagJrAmwCbQJuAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMCbwJwAcUBxgHHAcgByQHKAcsCcQIXAhgCFgIUAlMCcgJzAhkC3gLgAuIC5ALmAugC6gLsAu4C8ALyAvQC9gL+AwADBAMGAwgDCgMMAw4DEAMSAxQDFgMYAxoDHAABA7AAEAAmACwAMgA+AEoAVgBiAG4AegCGAJIAngCqALQAvgDIAAICVQGtAAICWwHEAAUCRAI2AhoCKAHXAAUCRQI3AhsCKQHYAAUCRgI4AhwCKgHZAAUCRwI5Ah0CKwHaAAUCSAI6Ah4CLAHbAAUCSQI7Ah8CLQHcAAUCSgI8AiACLgHdAAUCSwI9AiECLwHeAAUCTAI+AiICMAHfAAUCTQI/AiMCMQHgAAQCUAJCAiYCNAAEAlECQwInAjUABAJOAkACJAIyAAQCTwJBAiUCMwABAIQAAQAIAAEABAEvAAIC/wACAu4ALQMhAS8CNgI3AjgCOQI6AjsCPAI9Aj4CPwJAAkECQgJDAt4C4ALiAuQC5gLoAuoC7ALuAvAC8gL0AvYC/gMAAwQDBgMIAwoDDAMOAxADEgMUAxYDGAMaAxwDIgABAAQAWQCTAQoBRwABAAEC5wABAAEAJAABAAEC/wABAAEC3wABAAEBLgABAAMC4QLnAusAAQAQAAIABgAIAAoAEAAWABwAHwAgACIAJAAnACoALwAwAcQAAgAFAAIAGwAAADYATAAaAE4AeAAxAHoAlgBcAJgA5gB5AAEAHALdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL1Av0C/wMDAwUDBwMJAwsDDQMPAxEDEwMVAxcDGQMbAAIAAwHNAdYAAAHhAeIACgH/AgAADAABAAECBQACAAECRAJNAAAAAQACAAEDHwACAAICNgJDAAAChgKIAA4AAgABAkQCUQAAAAIAAQI2Aj8AAAABAAIDIQMiAAIAAwAcADUAAAEIAQkAGgGhAaEAHAACAAEBzQHWAAAAAQAdAhMC3QLfAuEC4wLlAucC6QLrAu0C7wLxAvMC9QL9Av8DAwMFAwcDCQMLAw0DDwMRAxMDFQMXAxkDGwABAAMB9gH3AgkAAgAEABwAHAAAAOcA/AABAlICUgAXAlUCVQAYAAIAAwAiACIAAAEZAR8AAQJbAlsACAABAAECdgABAFwAHQAeAB8AIAAhACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AEIAQkBGQEaARsBHAEdAR4BHwGhAfYB9wIJAhMCUgJVAlsCdgLdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL1Av0C/wMDAwUDBwMJAwsDDQMPAxEDEwMVAxcDGQMbAAIABQAcABwAAAAiACIAAQHNAdYAAgHhAeIADAH/AgAADgABAC0AAQEuAkQCRQJGAkcCSAJJAkoCSwJMAk0CTgJPAlACUQLdAt8C4QLjAuUC5wLpAusC7QLvAvEC8wL1Av0C/wMDAwUDBwMJAwsDDQMPAxEDEwMVAxcDGQMbAx8AAAABAAAACgA4AJIAAkRGTFQADmxhdG4AHgAEAAAAAP//AAMAAAACAAQABAAAAAD//wADAAEAAwAFAAZtYXJrACZtYXJrADZta21rAEZta21rAExzaXplAFJzaXplAFYAAAAGAAAAAQACAAMABAAFAAAABgAAAAEAAgADAAQABQAAAAEABgAAAAEABgBSAAAATgAAAAcAEAAaACIAKgAyADoAQgABAAAAAgBEAE4ABAAAAAEATAAEAAAAAQM+AAQAAAABA34ABAAAAAEFSgAEAAAAAQV0AAYBAAABBd4AZAAAAAAAAAAAAAEG1gAF/tT9qAABBtYABP2oAAEG2AbuAAEADADqADcAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGeAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAAABpAAAAZ4AAAGkAAABngAAAaQAAAGeAF8AxgDMANIAxgDYAN4A5ADqAMYA8AD2APwAxgECAMYBCAEOAQIBFAEaAOoA6gDGASAAxgEIASYBLAEyATgBPgFEAUoBUAFWAVYBXAFiAWgBbgDAAXQBegGAAXoBhgGMAZIAwADAAZgBJgDGAZ4A2ADGARoBpADqAMYA6gDGAQgBJgGqAbABsADAAbYAwADAAYwBjAEsAbABvAGYAcIByAHOAdQB2gHgAeYB7AHyAZIAwAGYAfgBmAGYAf4CBAIKAAEBLAH0AAEBLAKqAAEBKAKqAAEBVgKqAAEBUgKqAAEBXQKqAAEBTAKqAAEBKwKqAAEBQAKqAAEBSQKqAAEAugKqAAEBMgKqAAEBPAKqAAEBKgK2AAEBOgKqAAEBKgKqAAEBLQKqAAEBPgH0AAEAgALaAAEBWQH0AAEByALaAAEBPAH0AAEBqgLkAAEBNgH0AAEAlwLaAAEBXgKgAAEAvALaAAEBJgLaAAEBOAHyAAEBQAH0AAEBNAH0AAEBKAH0AAEBWAH0AAEBBgJ2AAEBJgH0AAEBLQH0AAEBLgH0AAEB5AK2AAEBpAKqAAEBPQH0AAEBXgH0AAEBQgH0AAEBOAH0AAEBOgH0AAEBGAH0AAEBHgH0AAEBKQH0AAEBMAH0AAEBJAH0AAEBIgHyAAEBkgH0AAEA4AH0AAEBEgH0AAEBMgH0AAEBLALCAAEBLAK6AAEEagRyAAEADAAWAAIAAAAYAAAAGAAGABQAGgAOACAAJgAsAAEBLAAAAAEBWgAAAAEBQAAAAAEBVwAAAAEBPAAAAAEBegAAAAEEOgRIAAEADAAiAAUAAACuAAAArgAAAK4AAACuAAAArgBLAJgAngCkAKoAsAC2ALwAwgCYAJgAyADOAJgAmACYANQA2gDgAJgAwgDmAOwAwgCYAPIA+AD+AQQA7AEKAKoBEAEWARwBIgEoAS4BNAE6AJgBQAFGAUwA8gFSAVgBXgCYAJgBZAEKAMIAmAFqARwAmAFYAXABdgF8APIBggFwAYgBjgDCAZQBmgGgAV4AmAFkAaYBfAGsAAEBLP/qAAEBMf/qAAEBWv/qAAEBIv/qAAEBVv/qAAEAtf/qAAEBUP/qAAEBK//qAAEBXf/qAAEBZv/qAAEAjv/qAAEBQP/qAAEBNv/qAAEBL//qAAEBMP/qAAEBOP/qAAEBKv/qAAEBKP/qAAEBV//qAAEBPP/qAAEBNv8aAAEBP//qAAEBXv/qAAEA6f8cAAEBWP/qAAEBev/qAAEBOf/qAAEBPv/qAAEAgv8mAAEBxP8mAAEAxv/qAAEBhP/qAAEBQv/qAAEBLf/qAAEBCv8OAAEBOv/qAAEBMv/qAAEBRP/qAAEBLv/qAAEBQf/qAAEBHf/qAAEBzv8mAAEBI//qAAEAZP/qAAEBav/qAAEA+v/qAAEB0P8mAAECwALGAAEADAASAAEAAAAOAAMADgAUABoAAQEsAd4AAQGgAooAAQHvAp4AAQGcAd4AAQKeAqYAAQAMABYAAgAAACQAAAAkAAwAIAAmACwAGgAyADgAPgBEAD4ASgBQAFYAAQEsAAAAAQHwAAAAAQGtAAAAAQESAAAAAQErAAAAAQGWAAAAAQF7AAAAAQFaAAAAAQGMAAAAAQEdAAAAAQGeAAAAAQEeAlAAAQAMAOoANwAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOYAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAADsAAAA5gAAAOwAAADmAAAA7AAAAOYAAwAUABoAGgABASwB9AABASwCqgABASwC2AABASwCogACAAEChgKIAAAAAgABAt0DHgAAAAIAAwLdAvgAAAMDAxwAHAMeAx4ANgACABMAAgA1AAAASwBMADQAZwBnADYAfgB+ADcAoQCjADgAqQCpADsAzQDOADwA5gDmAD4A/AD8AD8BGAEYAEABLwEwAEEBVQFXAEMBXQFdAEYBggGDAEcBmgGqAEkBrQGtAFoBwwHEAFsCzQLNAF0C1wLXAF4AAQACAv0C/gABAAYABAAUABUAHgAuAC8AAQAFAvoC+wL8AwEDAgACAAwAAgARAAAAEwA1ABAAowCjADMAzgDOADQA5gDmADUBMAEwADYBVwFXADcBgwGDADgBmgGaADkBnAGqADoBrQGtAEkBxAHEAEoAAQABAvkAAQADABAAFgAqAAEAAgL/AwAAAQAMAAIABgAKABAAFgAgACQAKgEwAaABoQGtAAEAAwLhAukC6wABAAAACAAAAAQADgACaWRlb3JvbW4AAkRGTFQADmxhdG4ADgAGAAAAAAABAAIACAAMAAH/VgABAAAAAAAAAAEAAQABAAAAAQAAIEQAAAAUAAAAAAAAIDwwgiA4BgkqhkiG9w0BBwKggiApMIIgJQIBATELMAkGBSsOAwIaBQAwYQYKKwYBBAGCNwIBBKBTMFEwLAYKKwYBBAGCNwIBHKIegBwAPAA8ADwATwBiAHMAbwBsAGUAdABlAD4APgA+MCEwCQYFKw4DAhoFAAQUqOSLV+drf40bkGaugiTOHAvtOCigghsPMIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+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/RFQSvmE1J7WgwCQYFKw4DAhoFAKCBmDAUBgkrBgEEAYI3KAExBwMFAAMAAAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIgYKKwYBBAGCNwIBDDEUMBKhEIAOd3d3LmFkb2JlLmNvbSAwIwYJKoZIhvcNAQkEMRYEFAjZoAR3iHG3FGaaa5VKDOJq2mnyMA0GCSqGSIb3DQEBAQUABIIBALGz82VesC0ba9FY1YRiIn/8o9gsfvcQebP/LG6ZAGMH7V8c+pjKIoBHV8K6pxZKg4oVYArDyACz7jiydFlcQQjao4Jdc/rT6/24cm7PY7jG9hh/iSRgERNksSs3BhpgcTQcV51GtxMv+c8XPrnRO/vnAIlA1sZeuyn2FCH0feW2ZrPi9VnZzv7Jw0ORU7SiGBuBCG7yd08+8EOK5EN1I+I/bgXLOoGLV8QIsmhbZHhf2skXeytWMP4EnUCeBi1dou2FaJ5bfESZRxg7JZ+TGcK+8xneT9neQr9mJ9jowsSINdQFP6S6pJp9IMj+tYQMmMW/QqD+3w3i8vnd4NZUKPihggILMIICBwYJKoZIhvcNAQkGMYIB+DCCAfQCAQEwcjBeMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAuBgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2VydmljZXMgQ0EgLSBHMgIQDs/0OMj+vzVuBNhqmBsaUDAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwMTExMTkyNTQxWjAjBgkqhkiG9w0BCQQxFgQUWoN3Ii1Fb/USVTnePw/aNz90huMwDQYJKoZIhvcNAQEBBQAEggEAa7c3PXGK1jU5/FjwDqvWPBHKPicXDDD/HPc7daqSIDvZO1qGZwuubueeW8Q+7c6Hiopk0Mpm0rP0CoGIRjhSVOW5VgDxTug3udqPFcqwUkhku/u/YefYZ6KffyMIgvB6xg9PIBChIUUU0SZRLo/Zlp4V1yo0wz2scGjJXv71HuZYPXJszz39eDpuZZC33yswvUKq3dQnBwOCmbTmt47EOks1sP2JP3Ro3rZcmIHoQLHMhDEcjdHpPtqzBHCwnNs2zCqCKejN+t0WV3/D5nySWr80SK6HOQ0k9YrvoJ8NGcdHGIfeYK8rzXyUMXkBvPS8iSQ18rYnWonpCqYCkYSPKw==) 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//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+hYBFggWDxYWFh0WIhaCFscW3BbrQW1hY3JvbkFicmV2ZXVuaTAxQ0R1bmkxRUEwdW5pMUVBMnVuaTFFQTR1bmkxRUE2dW5pMUVBOHVuaTFFQUF1bmkxRUFDdW5pMUVBRXVuaTFFQjB1bmkxRUIydW5pMUVCNHVuaTFFQjZBb2dvbmVrdW5pMDI0M0NhY3V0ZUNjaXJjdW1mbGV4Q2Nhcm9uQ2RvdGFjY2VudERjYXJvbnVuaTFFMEN1bmkxRTBFRGNyb2F0RWNhcm9uRW1hY3JvbkVicmV2ZUVkb3RhY2NlbnR1bmkxRUI4dW5pMUVCQXVuaTFFQkN1bmkxRUJFdW5pMUVDMHVuaTFFQzJ1bmkxRUM0dW5pMUVDNkVvZ29uZWtHY2lyY3VtZmxleEdicmV2ZUdkb3RhY2NlbnR1bmkwMTIyR2Nhcm9udW5pMUUyMHVuaTAwNDcwMzAzSGNpcmN1bWZsZXh1bmkxRTI0dW5pMUUyQUhiYXJJdGlsZGVJbWFjcm9udW5pMDEyQ0lkb3RhY2NlbnR1bmkwMUNGdW5pMUVDOHVuaTFFQ0FJb2dvbmVrSmNpcmN1bWZsZXh1bmkwMTM2TGFjdXRlTGNhcm9udW5pMDEzQkxkb3R1bmkxRTM2dW5pMUUzOHVuaTFFM0F1bmkxRTQyTmFjdXRlTmNhcm9udW5pMDE0NXVuaTFFNDR1bmkxRTQ2dW5pMUU0OE9tYWNyb251bmkwMTRFT2h1bmdhcnVtbGF1dHVuaTAxRDF1bmkxRUNDdW5pMUVDRXVuaTFFRDB1bmkxRUQydW5pMUVENHVuaTFFRDZ1bmkxRUQ4T2hvcm51bmkxRURBdW5pMUVEQ3VuaTFFREV1bmkxRUUwdW5pMUVFMnVuaTAxRUFSYWN1dGVSY2Fyb251bmkwMTU2dW5pMUU1QXVuaTFFNUN1bmkxRTVFU2FjdXRlU2NpcmN1bWZsZXh1bmkwMTVFdW5pMDIxOHVuaTFFNjB1bmkxRTYydW5pMUU5RVRjYXJvbnVuaTAxNjJ1bmkwMjFBdW5pMUU2Q3VuaTFFNkVVdGlsZGVVbWFjcm9uVWJyZXZlVXJpbmdVaHVuZ2FydW1sYXV0dW5pMDFEM3VuaTAxRDV1bmkwMUQ3dW5pMDFEOXVuaTAxREJ1bmkxRUU0dW5pMUVFNlVvZ29uZWtVaG9ybnVuaTFFRTh1bmkxRUVBdW5pMUVFQ3VuaTFFRUV1bmkxRUYwV2dyYXZlV2FjdXRlV2NpcmN1bWZsZXhXZGllcmVzaXNZZ3JhdmVZY2lyY3VtZmxleHVuaTFFOEV1bmkxRUY0dW5pMUVGNnVuaTFFRjhaYWN1dGVaZG90YWNjZW50dW5pMUU5MnVuaTAxOEZhbWFjcm9uYWJyZXZldW5pMDFDRXVuaTFFQTF1bmkxRUEzdW5pMUVBNXVuaTFFQTd1bmkxRUE5dW5pMUVBQnVuaTFFQUR1bmkxRUFGdW5pMUVCMXVuaTFFQjN1bmkxRUI1dW5pMUVCN2FvZ29uZWt1bmkwMTgwY2FjdXRlY2NpcmN1bWZsZXhjY2Fyb25jZG90YWNjZW50ZGNhcm9udW5pMUUwRHVuaTFFMEZkY3JvYXRlY2Fyb25lbWFjcm9uZWJyZXZlZWRvdGFjY2VudHVuaTFFQjl1bmkxRUJCdW5pMUVCRHVuaTFFQkZ1bmkxRUMxdW5pMUVDM3VuaTFFQzV1bmkxRUM3ZW9nb25la2djaXJjdW1mbGV4Z2JyZXZlZ2RvdGFjY2VudHVuaTAxMjNnY2Fyb251bmkxRTIxdW5pMDA2NzAzMDNoY2lyY3VtZmxleHVuaTFFMjV1bmkxRTJCaGJhcml0aWxkZWltYWNyb251bmkwMTJEdW5pMDFEMHVuaTFFQzl1bmkxRUNCaW9nb25la2lvZ29uZWsuZGpjaXJjdW1mbGV4dW5pMDEzN2tncmVlbmxhbmRpY2xhY3V0ZWxjYXJvbmxkb3R1bmkwMTNDdW5pMUUzN3VuaTFFMzl1bmkxRTNCdW5pMUU0M25hY3V0ZW5jYXJvbnVuaTAxNDZ1bmkxRTQ1dW5pMUU0N3VuaTFFNDluYXBvc3Ryb3BoZW9tYWNyb251bmkwMTRGb2h1bmdhcnVtbGF1dHVuaTAxRDJ1bmkxRUNEdW5pMUVDRnVuaTFFRDF1bmkxRUQzdW5pMUVENXVuaTFFRDd1bmkxRUQ5b2hvcm51bmkxRURCdW5pMUVERHVuaTFFREZ1bmkxRUUxdW5pMUVFM3VuaTAxRUJyYWN1dGV1bmkwMTU3cmNhcm9udW5pMUU1QnVuaTFFNUR1bmkxRTVGc2FjdXRlc2NpcmN1bWZsZXh1bmkwMTVGdW5pMDIxOXVuaTFFNjF1bmkxRTYzdGNhcm9udW5pMDE2M3VuaTAyMUJ1bmkxRTZEdW5pMUU2RnVuaTFFOTd1dGlsZGV1bWFjcm9udWJyZXZldXJpbmd1aHVuZ2FydW1sYXV0dW5pMDFENHVuaTAxRDZ1bmkwMUQ4dW5pMDFEQXVuaTAxREN1bmkxRUU1dW5pMUVFN3VvZ29uZWt1aG9ybnVuaTFFRTl1bmkxRUVCdW5pMUVFRHVuaTFFRUZ1bmkxRUYxd2dyYXZld2FjdXRld2NpcmN1bWZsZXh3ZGllcmVzaXN5Z3JhdmV5Y2lyY3VtZmxleHVuaTFFOEZ1bmkxRUY1dW5pMUVGN3VuaTFFRjl6YWN1dGV6ZG90YWNjZW50dW5pMUU5M3VuaTAyMzd1bmkwMjUwdW5pMDI1MXVuaTAyNTJ1bmkwMjU5dW5pMDI2MXVuaTAyNjV1bmkwMjZGdW5pMDI3OXVuaTAyODd1bmkwMjhDdW5pMDI4RHVuaTAyOEV1bmkwMjlFYS5hYWdyYXZlLmFhYWN1dGUuYWFjaXJjdW1mbGV4LmFhdGlsZGUuYWFkaWVyZXNpcy5hYW1hY3Jvbi5hYWJyZXZlLmFhcmluZy5hdW5pMDFDRS5hdW5pMUVBMS5hdW5pMUVBMy5hdW5pMUVBNS5hdW5pMUVBNy5hdW5pMUVBOS5hdW5pMUVBQi5hdW5pMUVBRC5hdW5pMUVBRi5hdW5pMUVCMS5hdW5pMUVCMy5hdW5pMUVCNS5hdW5pMUVCNy5hYW9nb25lay5hZy5hZ2NpcmN1bWZsZXguYWdicmV2ZS5hZ2RvdGFjY2VudC5hdW5pMDEyMy5hZ2Nhcm9uLmF1bmkxRTIxLmF1bmkwMDY3MDMwMy5hemVyby5vbnVtb25lLm9udW10d28ub251bXRocmVlLm9udW1mb3VyLm9udW1maXZlLm9udW1zaXgub251bXNldmVuLm9udW1laWdodC5vbnVtbmluZS5vbnVtdW5pMDBBRHVuaTIwMTV1bmkyMTE3dW5pMjEyMGF0LmNhc2Vhc3Rlcmlzay5haHlwaGVuLmF1bmkwMEFELmFkb2xsYXIuYXplcm8uc3Vwc29uZS5zdXBzdHdvLnN1cHN0aHJlZS5zdXBzZm91ci5zdXBzZml2ZS5zdXBzc2l4LnN1cHNzZXZlbi5zdXBzZWlnaHQuc3Vwc25pbmUuc3Vwc3BhcmVubGVmdC5zdXBzcGFyZW5yaWdodC5zdXBzcGVyaW9kLnN1cHNjb21tYS5zdXBzemVyby5zdWJzb25lLnN1YnN0d28uc3Vic3RocmVlLnN1YnNmb3VyLnN1YnNmaXZlLnN1YnNzaXguc3Vic3NldmVuLnN1YnNlaWdodC5zdWJzbmluZS5zdWJzcGFyZW5sZWZ0LnN1YnNwYXJlbnJpZ2h0LnN1YnNwZXJpb2Quc3Vic2NvbW1hLnN1YnN6ZXJvLmRub21vbmUuZG5vbXR3by5kbm9tdGhyZWUuZG5vbWZvdXIuZG5vbWZpdmUuZG5vbXNpeC5kbm9tc2V2ZW4uZG5vbWVpZ2h0LmRub21uaW5lLmRub21wYXJlbmxlZnQuZG5vbXBhcmVucmlnaHQuZG5vbXBlcmlvZC5kbm9tY29tbWEuZG5vbXplcm8ubnVtcm9uZS5udW1ydHdvLm51bXJ0aHJlZS5udW1yZm91ci5udW1yZml2ZS5udW1yc2l4Lm51bXJzZXZlbi5udW1yZWlnaHQubnVtcm5pbmUubnVtcnBhcmVubGVmdC5udW1ycGFyZW5yaWdodC5udW1ycGVyaW9kLm51bXJjb21tYS5udW1yb3JkZmVtaW5pbmUuYWEuc3Vwc2Iuc3Vwc2Muc3Vwc2Quc3Vwc2Uuc3Vwc2Yuc3Vwc2cuc3Vwc2guc3Vwc2kuc3Vwc2ouc3Vwc2suc3Vwc2wuc3Vwc20uc3Vwc24uc3Vwc28uc3Vwc3Auc3Vwc3Euc3Vwc3Iuc3Vwc3Muc3Vwc3Quc3Vwc3Uuc3Vwc3Yuc3Vwc3cuc3Vwc3guc3Vwc3kuc3Vwc3ouc3Vwc2VncmF2ZS5zdXBzZWFjdXRlLnN1cHN1bmkwMjU5LnN1cHNhLnN1cGFnLnN1cGFFdXJvdW5pMDE5MmxpcmF1bmkyMEE2cGVzZXRhZG9uZ3VuaTIwQjF1bmkyMEIydW5pMjBCNXVuaTIwQjl1bmkyMEJBdW5pMjIxNXNsYXNoLmZyYWN1bmkyMjE5bGVzc2VxdWFsZ3JlYXRlcmVxdWFsbm90ZXF1YWxhcHByb3hlcXVhbHBpaW5maW5pdHl1bmkwMEI1cGFydGlhbGRpZmZpbnRlZ3JhbHJhZGljYWx1bmkyMjA2dW5pMjEyNnN1bW1hdGlvbnByb2R1Y3R1bmkyMTEzZXN0aW1hdGVkdW5pMjE5MGFycm93dXB1bmkyMTkyYXJyb3dkb3dudW5pMjVBMHVuaTI1QzZ1bmkyNUM5dW5pMjc1MnRyaWFndXB1bmkyNUIzdW5pMjVCNnVuaTI1Qjd0cmlhZ2RudW5pMjVCRHVuaTI1QzB1bmkyNUMxdW5pMjYxMHVuaTI2MTF1bmkyNzEzdW5pMjY2QWxvemVuZ2V1bmkyMDMydW5pMjAzM3VuaTAyQkJ1bmkwMkJDdW5pMDJCRXVuaTAyQkZ1bmkwMkM4dW5pMDJDOXVuaTAyQ0F1bmkwMkNCdW5pMDJDQ3VuaTAzMDB1bmkwMzAwLmNhcHVuaTAzMDF1bmkwMzAxLmNhcHVuaTAzMDJ1bmkwMzAyLmNhcHVuaTAzMDN1bmkwMzAzLmNhcHVuaTAzMDR1bmkwMzA0LmNhcHVuaTAzMDZ1bmkwMzA2LmNhcHVuaTAzMDd1bmkwMzA3LmNhcHVuaTAzMDh1bmkwMzA4LmNhcHVuaTAzMDl1bmkwMzA5LmNhcHVuaTAzMEF1bmkwMzBBLmNhcHVuaTAzMEJ1bmkwMzBCLmNhcHVuaTAzMEN1bmkwMzBDLmNhcHVuaTAzMEZ1bmkwMzBGLmNhcHVuaTAzMTJ1bmkwMzEzdW5pMDMxQnVuaTAzMjN1bmkwMzI0dW5pMDMyNnVuaTAzMjd1bmkwMzI3LmNhcHVuaTAzMjh1bmkwMzI4LmNhcHVuaTAzMkV1bmkwMzMxdW5pMDMwODAzMDR1bmkwMzA4MDMwNC5jYXB1bmkwMzA4MDMwMXVuaTAzMDgwMzAxLmNhcHVuaTAzMDgwMzBDdW5pMDMwODAzMEMuY2FwdW5pMDMwODAzMDB1bmkwMzA4MDMwMC5jYXB1bmkwMzAyMDMwMXVuaTAzMDIwMzAxLmNhcHVuaTAzMDIwMzAwdW5pMDMwMjAzMDAuY2FwdW5pMDMwMjAzMDl1bmkwMzAyMDMwOS5jYXB1bmkwMzAyMDMwM3VuaTAzMDIwMzAzLmNhcHVuaTAzMDYwMzAxdW5pMDMwNjAzMDEuY2FwdW5pMDMwNjAzMDB1bmkwMzA2MDMwMC5jYXB1bmkwMzA2MDMwOXVuaTAzMDYwMzA5LmNhcHVuaTAzMDYwMzAzdW5pMDMwNjAzMDMuY2FwdW5pMDMwMjAzMDZ1bmkwMzAyMDMwNi5jYXB1bmkwMzBDLmF1bmkwMzI2LmF1bmkwMEEwdW5pMjAwN3NwYWNlLmZyYWNuYnNwYWNlLmZyYWN1bmkyNTAwdW5pMjUwMXVuaTI1MDJ1bmkyNTAzdW5pMjUwNHVuaTI1MDV1bmkyNTA2dW5pMjUwN3VuaTI1MDh1bmkyNTA5dW5pMjUwQXVuaTI1MEJ1bmkyNTBDdW5pMjUwRHVuaTI1MEV1bmkyNTBGdW5pMjUxMHVuaTI1MTF1bmkyNTEydW5pMjUxM3VuaTI1MTR1bmkyNTE1dW5pMjUxNnVuaTI1MTd1bmkyNTE4dW5pMjUxOXVuaTI1MUF1bmkyNTFCdW5pMjUxQ3VuaTI1MUR1bmkyNTFFdW5pMjUxRnVuaTI1MjB1bmkyNTIxdW5pMjUyMnVuaTI1MjN1bmkyNTI0dW5pMjUyNXVuaTI1MjZ1bmkyNTI3dW5pMjUyOHVuaTI1Mjl1bmkyNTJBdW5pMjUyQnVuaTI1MkN1bmkyNTJEdW5pMjUyRXVuaTI1MkZ1bmkyNTMwdW5pMjUzMXVuaTI1MzJ1bmkyNTMzdW5pMjUzNHVuaTI1MzV1bmkyNTM2dW5pMjUzN3VuaTI1Mzh1bmkyNTM5dW5pMjUzQXVuaTI1M0J1bmkyNTNDdW5pMjUzRHVuaTI1M0V1bmkyNTNGdW5pMjU0MHVuaTI1NDF1bmkyNTQydW5pMjU0M3VuaTI1NDR1bmkyNTQ1dW5pMjU0NnVuaTI1NDd1bmkyNTQ4dW5pMjU0OXVuaTI1NEF1bmkyNTRCdW5pMjU0Q3VuaTI1NER1bmkyNTRFdW5pMjU0RnVuaTI1NTB1bmkyNTUxdW5pMjU1MnVuaTI1NTN1bmkyNTU0dW5pMjU1NXVuaTI1NTZ1bmkyNTU3dW5pMjU1OHVuaTI1NTl1bmkyNTVBdW5pMjU1QnVuaTI1NUN1bmkyNTVEdW5pMjU1RXVuaTI1NUZ1bmkyNTYwdW5pMjU2MXVuaTI1NjJ1bmkyNTYzdW5pMjU2NHVuaTI1NjV1bmkyNTY2dW5pMjU2N3VuaTI1Njh1bmkyNTY5dW5pMjU2QXVuaTI1NkJ1bmkyNTZDdW5pMjU2RHVuaTI1NkV1bmkyNTZGdW5pMjU3MHVuaTI1NzF1bmkyNTcydW5pMjU3M3VuaTI1NzR1bmkyNTc1dW5pMjU3NnVuaTI1Nzd1bmkyNTc4dW5pMjU3OXVuaTI1N0F1bmkyNTdCdW5pMjU3Q3VuaTI1N0R1bmkyNTdFdW5pMjU3RnVuaTI1ODB1bmkyNTgxdW5pMjU4MnVuaTI1ODN1bmkyNTg0dW5pMjU4NXVuaTI1ODZ1bmkyNTg3dW5pMjU4OHVuaTI1ODl1bmkyNThBdW5pMjU4QnVuaTI1OEN1bmkyNThEdW5pMjU4RXVuaTI1OEZ1bmkyNTkwdW5pMjU5MXVuaTI1OTJ1bmkyNTkzdW5pMjU5NHVuaTI1OTV1bmkyNTk2dW5pMjU5N3VuaTI1OTh1bmkyNTk5dW5pMjU5QXVuaTI1OUJ1bmkyNTlDdW5pMjU5RHVuaTI1OUV1bmkyNTlGdW5pMDI1OHVuaTAyNTQxLjAwMFNvdXJjZSBpcyBhIHRyYWRlbWFyayBvZiBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQvb3Igb3RoZXIgY291bnRyaWVzLkNvcHlyaWdodCAyMDEwLCAyMDEyIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgUmlnaHRzIFJlc2VydmVkLlNvdXJjZSBDb2RlIFBybyBMaWdodFNvdXJjZSBDb2RlIFBybwETAgABAD8AgAC3ANoBJQFtAb4B9wIlAkYCSgKJAscDAgMMAzQDSwNsA3QDgwONA7QD2wP3BBwEVQRdBHMEiwSiBNMFFwUmBaoFrwXIBdEF2wXuBfkF/wYHBiQGOQY/BkQGVQZ2BoIGhwblBv8HEQcZBx4HSgdRB1UHWQeNB74H0gfgB+UH/wgRCCAIJAg9CFcIfAjCCMsIzwjfCPcI/AkDCSUJRQlUCVwJYAlkCXoJgwmQCZcJnAmjCacJqwnACc4J0wnjCeoJ/goDChAKQgpZCmAKZApuCncKiwq3CuMK8wsBCxELOgtPC3ULiwuRC5cLqwvAC9kL4gvuC/0MAwwJDBIMFgwhDCUMRgxWDF8MZwxvDIIMmQyeDK8MswzEDM0M2QziDOgM7g0IDRcNHQ0iDTsNRA1PDVYNXQ1iDWcNfw2VDZ4NpQ2tDbMNyA3LDdYN7A3+DgMOCg4UDh4OJQ4qDj8OUg5mDnYOhg6YDqoOtg7CDsoO0g7YDusO9A79DwIPBw8NDxIPGQ8gDzIPPg9JD1QPWw9hD2YPcQ94D3sPiw+VD54PqA+wD7gPwA/HD80P0Q/gD+8P/BAEEAkQFxAlEDMQQRBKEFMQXBBlEGsQcxB2EHsQgRCGEJMQoBCtELoQxxDNENgQ3xDjEOoQ7xD0EPkQ/hEHERMRHxErETURPhFGEU0RVRFdEWIRaBFuEXMReBGDEY4RmRGkEa8RuhHFEc0R0hHXEdwR4dj3gxX7MfcHLfce38Gnp7ceea0FbF5Ydksb+xE34vcNiR/4KwaNl4uXlxr3Hjff+xf7DvsKK/sxHrmqMx0L98B/Ffck8fcb92X3ZCX3F/sk+yQl+xf7ZPtl8fsb9yQftQT7Cjv3C/dL90rb9wf3CvcK2/sH+0r7Szv7C/sKHwvO9ysK9i/3EvcS9uf3M/c1IOf7EvsSIC/7NR66FvcT2eL3APcA2TT7E/sSPTX7APsAPeH3Eh4LkEMFsPfHBvJW3fsVNjdfcGUen2oFp7PRsNMb9wKrQjyMHwuGVAWJBrNeV6ZPG/sNIS37LPsy4TP3Es7Lsre0H/sKByqKT08jG1VSmq5YH/c190kVIEre9xD3Cd3l8L29d1jBH/uTB1JWU2xTGwva+z4Vf2QFhZmjh58b8Mfa26cf93b4sAVgBvsR+8J6YndYeGAZhwZ0tnO/eLP7IPfCGF0G9338fXphBUJuXFVBG3p5j49/Hwu5A9fiFVHB2WLwG/cZ4tfw8EW0PKwfKLcFV6FDqNca08m56NHDcGK0HqaqBbZgSK83G/sHNUgsKd1iyHIf714F0W7GcDkaPUhVIDpDrsFZHgv3Ei4Vrp+uxaoehKGmiaMb9wYG37R6VU88TPsY+wxQt8UfYYwVN9VU9yr3L+7c3thWqvsOHvsLBgv3qRa594YG93b4NQVeBvsG+21vWG9XbVYZhwZtwHK/bb37CfduGFwG93b8NQUL9Ba49+wG1NC6rs8b6rNXIB/7ubj3vwf3FlPK+wk+Ul4LZAo4ChWVfY9/fhpibnhOgh59/CsG+z49VzEzPr/3Ph74K138MAf7XPBQ9wL3A+/G91we+BYHwJe8o8kan4Scfp0eDgPT998V+2b3BvsZ9zfgx6/FvR5wqAVVW1lwSBv7IjH3CvdL90vl9wf3Jce7cGOuH6epBbRnULE/G/s9pgoLA+L3Kwr3Ay/3KdbKqrm8HnSqBWNgVW5KG/sVNfcQCuPi9xTGuXFltB+lqQWxY1auOxv7JPsKL/s1HwsB2Ln4ArYDIB0L6Pk9FfdG/KwG+wG+W+a6rZmbsh59rgV5ZG2DbBtHZ6/XH/jY+3IHC/YW+Baz+z741/c+s/wWY/c+/Nf7PgYLSF+guaWeo6ecH3yorISoG+3a0O2/cLVtqB/3JrD7XAYLAfcRHQMhHQsV9waZ4dHqG/LPTPsNHwsBzrr4CLoDIh0LFZ+bmKGhe5l3d3x9dXWafp8f9zIWn5qYoaF8mXd3e311dZt+nx8LsKUd96C2t7kT2JgnHRPYWDEdE9I4RQoTuFhZChPYmLsKE9U4PR0L6hrIabBjZ3JwZmmjca6VlY+RlR6GQWZQUmUIC/dM+LsVlX6Pfn4aZXF0RoIemmxok2Yb+xIgL/s1+zP2L/cSHwsVaqitb8gbz72yy8xcr0l0doaAeB+Y5QX3Iq77QwZ5+yuiewWcoaCXqBu9qXFdYGtvXF1voql0Hw6yBtHNBUcdC/cQ+yIVd2gFar3LeM8b9xXb1fcHHwvLh8eJyx6NBtL7FveV/GYFu/knX/wpBgv3Z/esFUFPwdrZx8TV1MhSPTxOVUIfC7sD6xb3LAb3Xev3GPdc91sr9xT7Xh/7Kwa5/QAV+NnwB/dF2PsJ+z/7QD77DftFHwsVXmOpxoMfrKymlqwbvp9vZmNxb14f8feeFZp0c5dmGzpIVvsVMMhXz8y4uMLAa7VEZWp8dG4f7I+9ssQbp6CAfp0fDuz4ThX3hfxOt/h0+7EGC3+w+OGwEtO3j7b3uLZ6uBPk9wj3OhXaxrfZsR73EGPzcyAaQk5R+wf7CkTJ2h4T2PeF9z0VIawzr+Ya0MS93+6/T0RUalpKXx4T5Pux+z8VJuVA9yL3IdzV6OhSr0KvHo8HE9jEs7jGyBrrRtL7ECE8Sy9HulnAbR6HBxPkRGs+Vi0aDh9qSAoLFfsAPfcQCtni9wD3ANk0+xP7Ej01+wAfC2V8VIMeknEKC6afnamod55wOApLj0yNSx6JBkT3FvuV+GYFWwYLjwbRSQWyBjDvBQv3f7a3tgt293ay9/O2C9esxbmRH2oGaIVzZlcbV3OwroUfagZdkaxR1xsOaIN0aVgbWHStroMfbAZeka5U0xsL0L+RWB0LAVYKAwtqpLtvvBvMu6nGt2ulYpMfCxXO3b3Nex2HQwU/B+EWWfdUaQb7OftdBXf3Nzuv270HDhWmn56oqHfiHfUKC3b4WbIL95Cs96CsAfdDs/dJswP3Q/fpFVC6bcK3taGlrh6MBo5jBa33XAbUasA5VVlzenAenG8Fm6Wyn7cbyptfW4wf+yp7RGlFGrONFbq9p/cXmR4nB21laHpnG2VpnLQfDtEW+GWz/C4G+Cf45AWn/Dxk+AUH/Cf85QULFfer9xYH9wnMZygqSlz7CR8Lsfdkr/dMsQtSCkq3CxX3dqz7NQbc08q8xhrMZK5HX2Nxa3IepXYFpp+onqsbuKRxYVhWYfsJLB8OQh1qBleRC39mCgvWZwoLmx33TPg3Fdi8w8l8HWEWIMJP37axoaWnHowGj2MFrffSaQaIbQWJBqRsbZhkGzxGSyQfDrgT3c73gxX7NuEy9xLOybK3tR6NBhO9kEQFsfljXvtaBo4qBbZYXKRNGxPdTAoT3wv3Lwr3Hx1UoEmOhQqp9xwdZ4AeCwP3Khb4GbP77fj/XwYLaR1jBgsVoMwddnd8fHd3mnufH/cyFp+bm5+fe30KC4Gnfm0ab2Z8VIMekW0FzK8dC5ttaY9rGys9VT9XH4kGC39VHQuxBpH1ntTk7Qij+3pq90wHRDZvQ4T7AwgOFUFhWDosGk6uZ7KvpKavrnOkaYCBh4WBHgsV2KWml63EujHXG7i5peKoH2yZBTxxcIFpUlzlPxteXXEybh8LtgPmFrX4YQa3h8aJuB6NBrP7CvcH+8sFqwb3BvfLsfcKBY4GiV6IUF8a/GG2+SdQB/sB+8dl+wkFhwZk9wn7AvfHBVAGCxVRBi8hBbMGCwZaHQsVuKK7t44fbgZph3t1dhsL9ucVWphfnK4ap6WgtbqjdW9zfnZqeB4LdB2crgsVVgYvwh0L+Nn3Hgr3RKn3UKkTcPdE+NkVvwoT8LQdh352dhsTcJwKDhUrsUfNTx6lowVMxXTJ2xrcosnKxR5xowVJT2VHKhoO9yTx9xv3ZfcTZe1NxB8LwR2Gf3Z1Gwt/wgoL+8AGDlWucLmgqJWYmh57pQWBfn6HehtycwsVsQYvgQpWBg7EmbOowBqfhJ1/nR4OVgoBSB0DC3gKUgoLe3h0dJt5CxWxWwoFjwYLqqiAcKwe+0cHa2tre2gbSGW+3B8LSB3MCvfWFffAX/vAYAuihh10C/epFrn4//d5s/yMY/d5Bgv7BvsX+2ULqvebqhL3SLFysfcgsHGxE+T3bgu+CnIKC/cS9uf3M+ln0VO2HwsVVQb3ASEFsga1IxWfmpihoXyZd3d7fXV1m36fH/syFp+bmKGhe5l3d3x9dXWafp8fDlEVsJe1nbkau/cuHYj3LB19bRp0dn4Lm52ionueC/tm6wtSCgH3qrcD7x0LZQr3lfwkFeELsAoTusDtCnx8dRsTv0BoebhalQoB+Ea5A+jtFUGy0mfVG/ctvev3DB/4XPvhZPez/DEH+wxcUPsBU1WpzGUeCxX3dqz7Ngbd08q8xhrMY65HX2Rxa3EepnYFpp6onqsbuKVxYVhVYfsILB8LsffBbAZyfXOBY4QIbt0HDhWtBt6BCl4GyPseywoO3avPvpDuClVvt7eFH20GCwP3Bxa693cG9xz3Lfdw/BAFwAb7hfgz92n3iAVVBvvZ/AIFifgCXAYL+PKvAfdP93YD90/48hX3dq/7dgYOFbiwq728ZqxeXGhqWlmua7ofpQRudJ6wrqKgqKajdmhmc3hwHw5wuaCnlZibHnulBYF9f4d6G3F0na0LyQr3lRULdHkdoh8LFdv1BVoGSCEF9yUWrwbb9QVaBg4VpKD7Evc39xL3NXKi+yL7NwVhBwuxmZ6jshrAY6dQYmJ5bnQeoXQFo5+ttAoL7h1xdnhu9w8d7h1wd3hubp94ph8O95Cu952tAfcitfdgtAMLUAoSzroLr60djh8Lbt0HL/y0LgoLA28KCwFIHQP3f/wkFbYLfh10CwP4EvnDFWiFc2ZXG1dzsK6FH2oGXZGsUdcb16zFuZEfCxXcq8++kR9sBl+Fb19V5B2JqvccHWaAHg4S37WAtWK4CxtcdmRliB8LeApWChOg7x0GE2D5OvfAt/vACxW7mLn3Hx1VoEmO6QrBiar3HB1ngB4OgQpmwwqr9xmp7asB90uv9zmxA/fNC/cpCg54HRNgcgr3q/064QYToNgKC6VTuxu8nbq2C6j3KLcB9+mvA/d0C/cbHW+da5YeC4cd9xt2C/cDCn93CxrUwMXxzbZxaqweqKYFsWlWrDkb+w8/SiIL9+X5WRUv9QVRBvcCIQULnR1tBmgLBuqBCguXqAVvkW+XqhqmsZrCkx6EqQVLg05yVxoL9ycK/Tr7lQYO98D5OmD9D/uVBgv7b7T5JncL5xa3+CwGC7wd+OwLA/tcBAsD9775oRWPBtZDBbMGK/UFYQYrIQWzBgv3PdQVoJuYoaF7mnZ2e3x1dZt+oB8Oi734EcT3QHcLs/j/9xAdC7q2jh9tBmgL+x4FsQYL93a8Afcg99QD9yD3dhX31Lz71AYOeOIK1AoTUHIKE2D3qwvPvpEfagZghXBgVhtVcba2hR9qBlgLnboauvcuHYj3LB1+bBp0dn4L5x3Ougv4MfnDaB0L+FUB9423A/eNC/hVAffHtwP38wuam5+ffJoLoPcSCgv3MMvAnrC8HnenBWxkXHpPG/shJgv3drwBn/jEA5/3dhX4xLz8xAYOsQHct/cM9wL3DLcD98B/Ffcf2wtdCrj3Eh3Bu8+o916oz7sLYwrk9x4KzrrJqfdQqcm6C/AH90XY+wn7P/tAPvsN+0UfDhX4kI0G+4/4cQWHBvuR/HEFDvty+qgBdbf4wLcDCxWvBp/3bgXkPzIHCxX7eWf3eQYOsoGnfm0abwv3q/0l4Qvl9xuBH9LL0aXCG/bBUCYwSEQLFbAGMIEKVQYO0AH3y64D958LrxWwCgtWCmUKC2gKtG6gC1IKZQoLWJGqR90bC55wcXZ4bgsb+x77Ei77oPtW6PsA9yT3AQsbVHC3t4UfbAbhHQ73lf0Ptvk6+8AGCxWpBvve+LoFWQcLWgr3d3cSC/vA+SVfC3b4TrEL1lQKsAYtgQpjBgtnemxyYhoOzQoOAZ33BbD3BbD3BbD3BQOdCxWloJ6oqHaecQv3Hh33wP0ltwsGQCYFhwZA8AULcn10gWOECAsVthwFeGAGC7b7wLf3wLYLEuK399O3C/k696u3C/zsBg73kK73na0B90q091+2Awu2p7KsrR74dPuxZfeFBwsaPmZAMWEecPhHswcOE2D9OvurBw4B9xO5C/tc+nwSi/fAi/fAE8ALFWK6yV73CBv3CfcE2AsB98D3wAP3wPtcFffAC6X3BKUB926p8qoD98ALsvgzsQH3dbcL1AH3TdTf1AMLAfcJuffMugMLdvhWtXeff3cL9yf3HAoLhx3xtfjrtQv1Cg539y4KC8G7+CC7C6+grhILEvdm9xjuuXW5E/TOC5yqG9WmVUE4XlVKcgugnJukonqbdnZ6e3QLoHb4dHf3l3cB9w+4CwGs9xrN9xrN9xoDrAuHHfFQCgv5Ol/9OgYTwHYGDuX3AwVdBg5oCrMLe20abnB8C6tG3RsOdfeVFQugvxq+C/labR0LzQq4oru3jh8LGlSxcLmhp5aYmx4LB/dY5wWvB/tYLwULsrJwoG9vcHZkZKYL+wcbVlydrmYfDveVFffs4fcEChX3Bbf7BQYL9wMK93d3C3cB5Ln3CukLAfeR6QP3wAuv9y8dC24Fu4miC/cDKa8SC1z3OwoLq5irEgsT3PcXXQcT7PsXC4F+f4d5G3JxnK4L+yyp+BSr+BSpAQsB1vcq9yr3KgPWCwH4RrcD3Rb4RLMLsb+xAeb4NgP3Dgv5W6rE7AH3T6oDC2L3Gwq0tW4Lvgr3qguiqXcfDrL5IrELsfhAsQsBAAEAACIZAEIZAK4AAKsBALAAAK0AAYcBAK8AAYkNAIoAAZcAALEAAZgHALUAALIBAaAAALQAAaEWALkAALYBAbgAALgAAbkPAIwAAckCALoAAcwDAL4AALsBAL8AAL0AAdAKAI0BAdsOAMAAAeoJAMQAAMEBAfQAAMMAAfUWAMUAAgwAAMYAAg0EAMcAAhIBAJoAAJ0AAhQAAMsAAMgBAM0AAMoAAhUBAMwAAhcNAJAAAiUAAM4AAiYHANIAAM8BAi4AANEAAi8WANYAANMBAkYAANUAAkcGAJEAAk4JAJIAAlgCANcAAlsEANsAANgBANwAANoAAmAKAJMBAmsOAN0AAnoDAJUAAn4FAOEAAN4BAoQAAOAAAoUWAOIAApwAAOMAAp0EAOQAAqIBAKcAAKIAAqQDBGEABGAAAqgJAG0BArIeAAcAABEJAtEJAA8AAA0AABsBAHkAAAIAAGAAACAAAHsAAGgAAAMAAEEAAAgAAGkAAHcAAHUBAGsBAGoAAHgAAA4AAtsAAG8AAIkAAToAAtwAAHIAAHQAAEAAAAkBADwAAD4AAFwAAF4AABAAAF0AAD0AAKAAAAsAAHABAGYAAHMAAKoAAt0AAKUAAJkAAt4AACEAAt8AAAQAAuA7AIsAAxwAAI8AAx0eAKEAAGcAAAUAAGIAAGQAAzwAAGEAAz0AASwAAz4IAGMAA0cBAAYAAHoAAJ4AAJsAAKMAAUQBAUADAAwAAKYAAKgAAJ8AA0kAAB4AAB0AAB8AA0oBAJwAAD8AA0wAAF8AA00AAJcAA04mAHwCAIgAA3UEAH8AAIMAAIABAIQAAIYAAIIAAIUAAIcAA3rlA8MCAAEAUgBTAGEAxADMANkA4wEEARABIAEnAS8BOAE+AU4BYgFnAacCFgIwAjkCQwJPAoACiQLZAuAC7QL+AzUDPQNxA3YDsgPaA/MECgQlBCsEMQRIBFwEYQSpBN4E5ATtBPUFCgU7BT4FjQWXBaMFtQXHBdgF9wYtBkkGWgaPBrUGwwbUBwEHLwdsB6wHwQfjCAYIHwhlCHwI5AktCakKAQoSCiMKMgpVCmkKfwqXCpkKqQrACtILBAsYCysLPgtRC2cLfAu4C98L/gwUDEMMYQydDLIM5Az6DR4NMQ1IDZANqA28DeIOJQ4zDkIOUg5zDosOmQ6tDsMO0Q7pDwMPRw9YD3YPjw+eD7cP3Q/uEAoQHBBIEGAQfhCbEMwQ+REYETcRVhFhEW4RexGQEaURuxHPEdoR5RIBEhgSOhJUEm0SnRK6EzMTghO3E8YT1RQWFFsUmxUGFSgVWhWEFaQV4hYCFhsWLxZBFqwWzxbkFvcXWRdpF5kXuhfQF+MX9RgJGB0YMhhHGFsYcBiIGJoYrRjPGPUZERkpGT4ZVBmkGbUZyRndGfMaChojGjIaQxpUGmUachqBGpAapxq8GtIa6RsJGyIbVhtqG38bgRvNHCocQBxXHHUcuxzuHQ8dOR1/HZ0dwh3hHg0ePh5qHqMe0h8GHzkfiR/DH/8gTSDvIVEhoyG1Ickh5yIDInEigiKVIwEjCyMVIykjOSNXI24jliOsI8Mj2SQKJDEkViSVJNIk+SVTJWAlniXNJgYmEyZIJqEm0Cb0JyMndCeCJ5EnpifRJ/IoDCgtKEIoWCh3KKko0CjaKPMpDCk/KVQpaSmzKdIp6ioKKiYqaCqUKq0qzysMKzIrUitxK5Ar2yvlK/Ar/CwWLDQsTyxsLHgshCydLLUs1yz7LSMtaS2LLgAuhS6eLr8u6S8SL0Uvbi/LL9Yv7zAZMEMwgDCiMLEwxTDZMUMxWjFwMYQx5jIEMlwydzKIMqQy5DL+MxgzNTN6M6wzzjP3NCQ0RjRkNJY0yTUFNU41bDWdNdM19TYTNjo2aDasNtY23TbqN1433jftN/04Fjg5OEs4Yjh7OKY4uDjPOOM49zlzOcY51Do8Ok86qTrvO0I7nDuzO/I8SjyNPMw8/z1uPcg+AD5APoU+mD6wPsg+5z8jP1E/cz+nP+1ADUAtQExAdECaQNxBKEFYQZVB0UITQnNCr0L+QxVDOUNuQ5BDvUPiRAVEQkTRRRpFQEWCRcVGDEZSRpdGxEbGRwZHTUdzR7NH9kg6SIBIxUjxSPNJNEk+SU1JbUmbSeZKHUpSSqlLAUsRSypLQUtWS3xLlUupS8FLz0vdS/NMCUwLTA1MD0wRTBNMFUwqTEtMXEyXTM9M7U0KTWdNw03VTeFN804ITkNOY06kTzFPWE+kT+dQVVCYUR5RWFGQUfRSK1ItUi9Sv1LHUtBS2FLgUuhS8FL4UwFTCVMRUxlTIVMpUzFTOVNBU0lTUVNXU19TZ1NvU3ZTfVOEU4tTk1ObU6FTqFPXU91T5FPqVEBUR1RNVFRUW1RiVGhUblR2VH9Uh1TFVM1U1VTdVOZU7lU4VV5VhFWMVZRVllWYVZpVnFXTVhNWR1ZTVoxXRldTV3NXrlfeWBBYV1hkWGZYmVjNWQFZWFmTWcpZ+lpbWqda91sgWzlbUlukW6ZcEFxIXLpdGl1dXbheNl6WXwNftWAdYJpg+WFiYeNiR2KqYwtjZmNzY4BjjWQYZHdkwGTfZUxleWWrZfVmZ2brZ0lnamdsZ6Nn1mf3aBZoPmhmaJZoyWj3aSBpYGlqaX1plGnwanJqzWsxa41rw2v0bE9sgWydbQVtiW2ybdxuBm4vbkZuY261buJu7m8HbxNvLG9Fb25vim+0b91wS3CMcNhxGnEzcVxxc3GIcbBx2HHocepx+XIIciJyJHI0ckRyXXJfcnhyenKRcqhyuHLCct9y/XMNcxxzHnMqczlzSXNLc2VzZ3N3c45znXOnc7VzznPZc+hz8nQJdBJ0InQxdEB0T3R0dJZ0w3TwdRp1I3VTdXN1kHWrdcl16nYTdiJ2O3ZTdm12iHardr128Xb+dxt3Pndhd3x3mneqd8J35Xf7eBV4KnhDeHR4g3ipeOB5EnlEeVR5iHmJeYp5i3mMeZp5qXm6ecd56noNeix6VXpxeo16unrpevh7CHsTex57Knsxez57SHtWe2R7cnuBe4l7lnufe6d7uHvJe+R7+HwDfCF8PHxIfFR8W3xtfH98jHyffK98uHzGfNB83HzlfPB9CH0UfRx9Jn1EfWB9bn16fYl9n32qfbt9yX3WfeF9934Kfhp+LH5IfmJ+f36Wfqd+t37Afsx+5X7+fxN/Kn9Df1Z/W39xf4x/mH+vf8V/13/qgACAC4AVgCqAM4BNgGqAeYCSgKaAwYDXgPaBEoEfgTaBTIFmgYSBpYHFgeeCCIIagiyCX4JqgnmChoKVgqCCsYK+gsmC3YL1gwuDKoM8g0aDUINag2SDboN4g4KDjIOag6iDtoPCg9CD3oPpg/SEDIRIhPCFAoUThSGFKoU6hUaFYIVwhYSFl4Wthb2LsvjYtAHZuPf0ugPZFvhQ+Sj8UAa4/NQV+JgH9yf7mAXHFvcl95gF/JgH++FeFer3OMj0ex3GIuj7OAX7MPfhFVXnNPcvBfewBjX7L1YvBQ4OoEkdAbj4kgP3S/edIQqLsfe6sPeQsRL3B7n3trmGuRP09wcW90YG9ynrzPcT5k7BKpkfjwcT+NmfssLQGvcCN737GR77OQa5+7YV95D1B/cNymc2NFVf+xsfJvvfFfe69wwHE/T3GthdLSE7W/sXHw5dCgHTuywdDouy+NmyAeu59/c+HQ6LWAr3BB0DKAoOoHb30bP3mrMB9yq4A/cqFrj30feys/uy95r36LP8FQYOoQoBxrv4CbgDJQoOoHb33rP3tXcB5Ln33msKDsEK9AowHQ5/tPjksosdDs0dAfcHupAdDovAHV4dDqB290jC+Aq9Aea19+FnHQ6L9yQK99y3E1y6HRNsPB0TnEYdDl0KMh0OoHb3r7L3vrIB9wq599W7A/cKFrn3r/caBvcn48r3FfccM7v7Jx/7SAa5++UV9773Dgf3Gsxp+wP7AEte+xsfDvsttu6y+PCzAcS6+By5A/P34BX3Stf3CvcM9wvY+wr7SvtKPvsO+wv7DD/3DvdKHvg9/EYVhn98iHcbOVavynUf9xaa4vcY91ga92Qp9xj7JPslKfsY+2T7V+L7GPcWex47qMtN9wEboZ6OkaAfDqDVCvfMugP3N/fpVB33hvvpFftK98YFOQoOf/cNCvfaJh0OoHb4/7P0Cn8dDnIdAeS59+G2AyQKDovA+PJ3Acb4dgP3qBa9Bvdr+ScFXQb7DvwVcjt5TnA7GYcGcNt6yHLb+w74FRhaBg6/HQGZ+NApCg7NHQHW+FYD1ha6BvcI916drJyroLMZjwajY55rnWr3CPteGL0G+1v35/dN99QFXAb7AftWem1+c3hnGYcGda99o3mp+wH3VhhZBvdN+9IFDs0d9AooHQ6Ls/jZsgHR+GUDUx0OVQq6ChO4KgoTeCMdE7gjCg5/5x30uPfkuhN89BawBhO89wAK6/c39ylH6/scTUdpWVcfjvIF92ReB7j9ARXRCiRjTZ++Ux8OYwoB4rotHQ5/yB335LgTvM73gxX7NuEy9xLOybK3tR6NBhN8kEQFsfljXvtaBo4qBbZYXKRNGxO8TAoOYx0uHQ61CvdpsQH3mLUD+NL5UhWiWmCRYBv7DFBD+w0fUQf7JYcFafcl/E61+E73c7H7c8kH5LLJ8Linhne4Hg5GCqUd96C2t7kT2TAnHRPYsDEdE9JwRQoTuLBZChPZMLsKE9RwPR0OoPcoHQH0uPfTuAMpHU1PHo73EgX3ZF4HDrUK9wjrEvfC6VG3E+hAHRPw95D3CJgK+3mx+Q2x9wjrEvfC6VG3E8hcChPw95D3CJgK9xYdjwoO8AoDLx0O8QoS1rb3QLP3QbYT3G0KE7yGzAVnBg6grwr307gT2CkdUFQehwYTuOgKDmMKNB0O7wp/dxL0uPfkuhPs9ynDFWC8y3K5G/cM9Ov3N/cpR+v7HE1GaF1bH4kGE9yG0AVl/U2490MG9yAEE+zRCiIfE9xlTZ++Ux8O7wp/d/MKE+zO94MV+zbhMvcSzsexuboeiCwF+1a4BxPc+U1mBxPshlQFiQa1W1qkThtMCg6gqQpNCg5/9wkK988mCg5/9wkdAywKDn+gCvfTtxO4+IL4dBVfIgoTeIYKDou0+Et3Acn4cAP3qha6Bvdp+HQFYAb7GfvBdlt5XXhfGYcGebd3uXW7+xj3wRhdBg4wCg6gdvh0dwHb+EwD2xa8Bu73FaKroKeiqRmPBqJvo2mgcPH7Fhi+BvtW94v3R/d9BVoGMfsMeHF0bXZwGYcGdqZ3p3ilLvcOGFgG90X7ewUOuR0Bx/h0AyUdDouy+CexAdP4Wk8KDqBJHb31Abj4kgOzHfsG/FAhCqBJHb31Abj4kvcHCvsM/FAhCqBJHfcOrQG4+JK9HWP8UCEKoEkdxPcSHfc+qPdeqBfWChPuOgoT/vchHfuL/LMhCqBJHc33Ch34D/lpFaCamaGifJl2dnt9dHWbfaAf+zIWoJuZoaJ7mXZ2fH10dZp9oB9l/GAhCqBJHdavAfdO93gD+DL5lhX7eGf3eAb7e/xpIQqgSR2/qwH3TayiHft8/LohCqBJHbT3CB352hWmo3ZoZnN4cG50nrCuoqCoH/seBLiwq728ZqxeXGhqWlmua7of+wn8RyEKoEkdva0BuPiSA/fV+VkV6/UFYwZAQwWHBkDTBWMG6yEFK/xQIQr7Zuv3G0kd9yod+wY7CqBJHfdAqwH337OfHTb8ZCEKoEkd9wP1Jq0SuPiSE/T4hvoAFVsGE+xEIQWsBvsGkBX3GAowJwWyBl78UCEKoEkd9wP1Jq0SuPiSE/T4WPmWFUP1BVwG4SEFE+z7DZAV9xgKMCcFsgZe/FAhCqBJHfcIrcaqAfhPsQP4JvmJFbGUtJ65GrpcnVCOHoZsBbuJpIFtGnR0f2+EHi2CFfcYCjAnBbIGXvxQIQqgSR33CK2vq5jdChf4HfouFW2He3x2GxP3aHi4WqYdqAawChP/rp5evBu6oLKxjh/7IvsFFTAnBTod+x38tCEK+2br9xtJHfcOrQH3kem9Hdj9yzsK5ArE7AH3T6oD+B36FBVaBjwqBawG35cVSx25Cvt6/LYhCuQKxOwB90+qA/fj+bMVPOwFWgbqKgXblxVLHbkK+3r8tiEKoHb3drL387a/iwr3AX4VSx25Cvt6/LYhCuQK8Kuc3QoT+/gd+jAVbYZ8eHUbE//3IQqoBqmPm56gGxP79yIK+3/7BRVeka5U0xu5CmwGaIN0aVgbWHStroMfaPy2IQr7Zuv3G0kdv6sB902srumiHfsH/jU7CvthsPdRSR0B+E2zA/dL950VtfcPpdmj0KLcGY8GojqiRqY9tfsPGPcy/DcVgX1/h3kbcnKcrrSru7WmH/t8+ScFXQb7fP0nBbkG2fd2BfeZBtf7dgWSBmdyZ1tZGlSxcLqgqJaYmh4Oi7P3RbHWs/eNswH31bcD9zP3kxXF9xqt2q3Wq9cZj/wABrf7axX3tvc3s/s39433arP7tQf7tv0nBb0G6PdtBfdG+233oLMGDouw9yGs9xCu95CwEvcIuffBuYa4E/r3NrAV9yH3OKz7OPcQ9xcH9xrYXSsgOlr7Fh/7F/jdFfcJBhP89w3KZzY0VF/7Gx/7AwYT+vd6fhUT/Nifs8HPGvcCNr37GB77RPxUBj2HBW7Z+0b3UQcT+vcp6sz3FOdPwSqZHw6AtPjrtQHTu/eCsgP4mfcDFVVbWXBIG/siMfcK90v3S+X3B/clx7twY64fp6kFtGdQsT8b+z2AHftb8vsW9yl+H2pMBdgdRB2zb51rlh6htduOxK67wxkOXQqx9QHTuywd+BT4ePcOCg5dCvcCrQHTuywd91b4Di8KDl0Ksa0B07ssHffw+HgyCl0KvdsB07v3S9wsHfej+BoVoZ6bpKJ4m3V2eHt0cp57oB8Oi7L42bK9rQHruff3Ph33GvmcMgqHHfcGsvjZsgHrufDp9zQ+Hbr7jSod+zSv9xCy+NmyAeu5rPd46T4d9zT7N6oKXgqLWAq99fcEHQMoCvdivZEKi1gKY/dYEvcTuRPoKAoT2PfW9zBoHQ6LWAr3Dq33BB0DKAr3GL0vCg6LWApj91ghrRL3E7kT5CgKE9T3svcwFRPsQEMFhwYT1EDTBWMGE+zrIQW1BhPU6/UFDotYCs3U9wQdu9Tf1AMoCvcWzTMKi1gK1q/3BB2893gDKArq1qQKDotYCr+r9wQdu6wDKAr3Zb8VSh2LWArJ2/cEHfcP2wMoCvdlyUMKhx33BlgK9wQd9wvpAygK92j9+RVFHYtYCvdAq/cEHfdWswMoCvdNtjEKDotYCmP3US/3Eh33E7msqPdeqBPngCgKE++A96DEFRPTgLiiu7eOH24GE++AaYd7dXYbE+eAOgoT74DsHYtYCvcD9SatEvcTuRPsKAr3tPcDFawGE/Th9QVbBhPs+5n7OzYKDotYCvcD9SatEvcTuRP0KAr3tfdt9wsKE+z7m042Cg6LWAr3CK3GqvcEHffGsQMoCvfL7U4Ki1gK9wit9ysd9xO5tKj3TqgT9wAoCu29NgpC3R0T/4Cunl68aQoT9wBoeLhalQqHHfcGWAr3Dq33BB33C+kDKAr3GL0vCvcM/isVRR37YbD3PFgK9wQd922zA/cTFvfkBmRyaV1XGlSxcLqgqKMKxb28uJQfjbP79ve297az+7b3jffss/waBg6hCvcCrQHGu/gJuAMlCvdY+A4vCg6hCrOrAca79wKr93u4AyUK96X4EBXWrcW5kR9qBmiFcmZYG1dysK6FH2sGXZGsUdcbDqEKvdsBxrv3Tdv3ALgDJQr3pfgaQwr7Zan3O7X3k7L3xbUBxrv3i7PhuAMlCveP/BJECszfHVSWHg6hCrGtAca7+Am4AyUK9/L4eDIKoQrKrwHGu/cD93ituAMlCvcz+CekCg6hCrj3Eh3Gu+qo916nnrgT7oAlChP/gPff+BUVuKK7t44fbwZph3t1dRsT7oBjccNXG150XF73EQqtj5uioBsT/4C0pFK/Gw6gdvfes/e1d/cirQHkuffeawr3Gr0vCg6wHffes/e19ykd9wprCvdn/fkqHftfrPdTdvfes/e1dwHkubms90CsuWsK92f98hXdqsYdkapH3RsOoHb33rP3Eaxq9zgS5Ln33rkT7Phl+AYV+973EffeBvcNrBVABvcwHfveB/cwHQdAhwVu1vyDuffe99773rn4g9YHDsEKvfX0CjAd91L5MZEKwQq99fQKMB33xvmbaB0OwQr3Dq30CjAd9wj5MS8KDsEKxPcSHfc+qNm52agT3jAdE/73kPk4ah0T3joKE/7sHcEKzdQS903Unrme1BPIMB0T/PcG+UEzCsEK1q/0CjAd2vlKpAoOwQq/qwH3TazGuQMwHfdV+TMVSh3BCsnbEveY20y5E8gwHRPw91X5PUMKwQq9rfQKMB33ovmbMgrBCvdAqxL3qbmTsxPwMB0T+Pc9+SoxCg6HHfcGs/jXsxL3kulEuRNoMB0T8PdW+44qHfthsPc8s/jXsxL3dLKZuRPo9hYT+PdGBmppb2hVGlSwcLqhp6MKt6StrrEf9z6zBhPo+z741/c+s/wWY/c+/Nf7PgYOf7T45LL3Da2LHfcF+N0vCg77Zan3XPcSCgH3B7r3XrOQHfdh/VpECszfHVSWHg6Ls/j/d9H19y4KXh33KvcwFVEGLyEFtAYOi8Ad91iwXh33oPsi9wIK+2Wp90fAHfdHs14d90f9WkQKzN8dVJYeDouz95Tq96D3EB33ROleHfef+/8VpaCdqKl2nXFxdnltbqB5pR8Ohx33BsAd9wbpXh33Yf35Kh2HHfcGs/j/d+qv9y4K9wbpXh0+1qQK967+aCod+zSv9xDAHbn3eF4d99L9o6oKi8AdA/dWsxX3dgf3gfcPBbMH+4H7DwX39V/8Cgc2XgVjB+C4BfuJ+BmzBw6wHfdIwvgKvQHmtfcM6fcLZx33Zf35Kh2LlgrR9RLnt/fctxNeuh0TbjwdE55GHffb9zBoHQ6LlgrRrRLnt/fctxNeuh0TbjwdE55GHfe39zAyCouWCtj3Eh3nt7Oo916op7cTV0C6HRNnQDwdE5dARh0TX8D3pcRqHRNXQDoKE1/A7B2L9yQK90uy9bcTXrodE248HROeRh33S/1aFX5uBaiFp39sGnBEHbRuoFWWHg6Llgrd2xLnt/cW2/cKtxNduh0TbTwdE59GHfdqyUMKhx33BvckCvcJ6fcJtxOtuh0TtTwdE89GHfdk/fkqHfs0r/cQ9yQKvPd4vrcTrbodE7U8HRPPRh331f2jqgpdCrH1Mh2I+TuRCl0KsfUyHfcF+aVoHQ5dCvcCrTIdPvk7LwoO0R0T3yEdE//G+UJqHRPfOgoT/+wdXQrB1AHBu97U39TeuwMhHTz5SzMKXQrKrwHBu9/3eN+7AyEd+wb5VKQKDl0Ks6sBwbverPesuwMhHfk9BEodXQqx9TIdU/k7lh1dCrGtMh3Y+aUyCvcOHQHBu/cr6fcruwMhHfuEBKWgnamodp5xOApdCvc0qwHBu/d5s/cTuwMhHXP5NDEKDl0K7vUmreEKE9whHdr5eBWsBhPs4fUFWwYT3PuZ+zs2Cg5dCu71Jq3hChPsIR3b+eL3CwoT3PubTjYKDl0K863GqhLBu/fpsZy7E/ohHRP+8flrTgpdCvOt9ysdwbvXqPdOqNe7E+6AIR37A/k7NgpC3R0T/4Cunl68aQoT7oBoeLhalQr3Dh33Aq0Bwbv3K+n3K7sDIR0++TsvCvcJ/isqHX+1gHb5C7WBd+EKE6z4W/imFaZZm0c7GvtLO/sL+wpVXaS4aR52qxVwvnvP3Br3Stv3B/cKwblzYK0eE5z3Ae4VE2xuoFQ6BbhiVKRMG/skJfsX+2QnojmzTx9NLwUTnKd2xN8FXLXCccob9yTx9xv3Ze503WPFHw6Ls/e2s/ePsgG0uvd7uAO09+AV+1zl+xj3Ph73tLP7dfe29ziz+zj3j/drsvuqBvs+MfsU+1wfuhb3QMv3CfckHqL82nQG+yRL9w33QB8OXQrhCmCzE/D3wKkV+wo79wv3S/dK2/cH9wr3Ctv7B/tK+0s7+wv7Ch8T6DQKE/BwHRPodQpdCrH14QpgsxP4yR2ISwpdCrH14QpgsxP4sx2OSwpdCvc0qxLBu/d5s/cTu2CzE/xvCqv9TxX7Cjv3C/dL90rb9wf3CvcK2/sH+0r7Szv7C/sKHxP6NAoT/HAdE/p1CtEdYLMT/wDWChPfADoKE/8A9yEd+xb9nhX7Cjv3C/dL90rb9wf3CvcK2/sH+0r7Szv7C/sKHxP+gDQKE98AcB0T3oB1CvcOHRLBu/cr6fcru2CzE/z3wGEK9yQE+wo79wv3S/dK2/cH9wr3Ctv7B/tK+0s7+wv7Ch8T+jQKE/xwHRP6dQr7YbD3MLX467UBwbv3JrL3Z7sD+BH7LhX3MR2yp7/Cox/3ALnP9wL3RRr3ZCX3F/sk+yQl+xf7ZPtC2Ps/90WMHmVsdWNj9yIdKfdnFfsKO/cL90v3Stv3B/cK9wrb+wf7SvtLO/sL+wofDqDXCr319wsd+Db5w/cOCvsm/ARUHfeG++kV+0r3xgU5Cg6g1wq9rfcLHffb+VkV6/UFYwZAQwWHBkDTBWMG6yEF+w78BFQd94b76RX7SvfGBTkKDqDVCvdEsuy6A/euOxWohad/bBpwRB20bqBVlh77GPgcVB3HaBU5CsEGDvtm6/cb1Qr3Aun3ALoD99RhCvsx+FtUHcdoFTkKwQYO+2br9xvXCtavEvcJuaj3d/sm6fcAuhP+gPg3+ZYV+3dn93cGE/2AKP3kFTUKLQof+zH4W1Qdx2gVOQrBBg77NK/3JdUKtfd4tboD92H7NKQKYfhlVB3HaBU5CsEGDl0KsfUB9wO599omHffU+UwVUQYvIQW0Bg5dCvcCrQH3A7n32iYd9xb44i8KDl0Ksa0B9wO599omHfew+UwyCvtkqfc69w0K90Cz9wa5A/et+BQVV6FDqNca08m56NHDcGK0HqaqBbZgSK83G/sHNUgsKd1iyHIf714F0W7GcDkaPUhVIDpDrsFZHm1rv1TUY+qHGWpNBbFhHaG2BfcNk9jU6hrwRbQ8rB4Of/cNCvdAsvcHJh33R/s+FX5uBaiFp39sGnBEHbRuoFWWHg5dCr3bAfcDufcI2/cWJh33Y/juQwr7Zuvx9w0K9en3EiYd92D73Sodf7SDdvkKtBLiuvgOvRN44ha6+DEG9yvRzfcB0bhhVqIe+yP7Po5oBfc5b69OQBoTuDxeUTxUYqG6ZB5tawVZsshvzRvw09jx6FfY+yqlH/ck9z4F3mdSwisb+yo9IvsgHw6gdvj/s72t9Ap/He73WDIK+2Sp91t2+P+zEvepuX+zE3D31xb4//d5s/yMY/d5/P+SBxPoZEEFsWEdE3CnwQUO+2Wp91x2+P+zEvepuYezE3B/HRPoif0yRArM3x1Ulh4OsB34/7MS95LpRLkT6H8dE/Cj/dEqHfs0r/cldvj/s/QKfx33Hf17qgpyHdH1AeS59+G2AyQK92S9kQpyHdH1AeS59+G2AyQK99j3MGgdDnId9yKtAeS59+G2AyQK9xq9LwoO0AoT3yQKE//3osRqHRPfOgoT/+wdch3h1AHkub3U39TAtgMkCvcYzTMKch3qrwHkub73eMG2AyQK7NakCg5yHdOrAeS5vaz3jrYDJAr3Z78VSh1yHcil9wSlAeS53qnyquG2AyQK92e0kh1yHdH1AeS59+G2AyQK9y+9lh1yHdGtAeS59+G2AyQK97T3MDIKch3h0sWsAeS5vtLh0sG2AyQK7PdXFfd4rPt4Bq77NjUdDnId4dKs9QHkub7S4dLBtgMkCvdC9z4Vsgb3AfUFVQb7HPtmNR0Och3h0qytAeS5vtLh0sG2AyQK9xjNNR2J92YyCnId4dKs9QHkub7S4dLBtgMkCvcu96iEHYcd8bX5CfcpHfcNtgMkCvdn/fkqHXId91SrAeS591iz7LYDJAr3T7YxCg77YbD3MbT5CXcB5Ln3ALP3TbYD5PeLFfs/0jH3KY4ebW1nbVcaVLFwuqCoowqzsr3MqB/RqsHP9yUa+DBg/CsH+z47VzIyQL/3Ph74K10HDnIdAeS59+G2yLQD+ML5kysdch3R9QHkuffhtsi09wcK95PFKx1yHdH1AeS59+G2yLQDsx33mcUrHXId91SrAeS591iz7LbItJ8d97axKx3QCsi0F9YKE9+AOgoT/4D3IR33FGIrHYcd8bX5CfcpHfcNtsi0A/fAYQr3lvoFKx2/HdD1AZn40CkK96+8kQq/HdD1AZn40CkK+CP3L2gdDr8d9yGtAZn40CkK92W8LwoOvx3g1AH3TdTf1CkK92PMMwrNHdH19AooHZ/4Z5EKzR3R9fQKKB33HPjRaB0OzR33Iq30CigdVfhnLwoOzR3h1BL3TdSeuZ7UE+goHRP8U/h3MwrNHd3bEveY20y5E+goHRPwovhzQwqwHfkndxL3kelFuRPoKB0T8KL8WCodzR33VKsS96m5k7MT8CgdE/iK+GAxCg7NHdj3Eh33PqjZudmoE94oHRP+3fhuah0T3joKE/7sHYuz+NmyZPdWEtH4ZRPQUx0TsPf7+adoHQ6Ls/jZsmT3ViGtEtH4ZRPIUx0TqPfX+acVE9hAQwWHBhOoQNMFYwYT2OshBbUGE6jr9QUOi7P42bLI2wH3qNsDUx33ivlJQwqHHfcGs/jZsgH3nekDUx33hvuCKh1eCqB29zqy976yZPcwEvcKuffVuxPs9woWufc69xoG9yfjyvcV9xszvPsnH/saBhPc9wldB7n8WhUT7Pe+9w4H9xrMaPsC+wBLXvsbHw5/s/egsPe+swHMufgXuQP3A/e8FfgWBvs2gkAh+wYb+wBF8vc3gR+696QVs7C9pMUb9xPP+wn7SR/8RQaJi4mIGvtY4/si9yb3J+33G/dk92Uz9xf7LUJSa2FlHg5VCroKE7gqChN4Ix0TuCMK91r4VtsdVQq6ChO4KgoTeCMdE7gjCveh+OBtHQ5VCvdJsLoKE6wqChNsIx0TrCMKzPhWFbEGE7zqHQ5VCuT3HgrnuMKq91CpnrcTrIAqChNsgCMdE6yAIwoTroDC+F8Vqgavj5efoRsTvYC0HYZ/dnUbE66AaXDDWxtaeV1fhx8OVQr13hLnuL/Z7tqatxOpKgoTaSMdE6kjChO/5vhwFaKbnaKie/cgCvdGFn4dc3kdox8OVQr3Bq8S57jN93eptxO6KgoTeiMdE7ojChO+zfh4nQoOVQrfqxLnuMes90KsorcTuSoKE3kjHRO5IwoTv/dI+FoV3atMHapG3hsOVQq6pfcNpRLnuO2o9KnItxO/gCoKE3+AIx0Tv4AjCvdI+DUVuq6uvr9orlxcaGhXWK5ouh+lBG5zo6+wo6OoqPcaCm4fDlUK27C6ChOsKgoTbCMdE6wjChO89zT4VhWzBumpHYcd8bGGUR0S57j3B+n3BrcTWioKEzojHRNaIwoT3vc2++AVRR1VCvdQqxLnuPdnstS3E74qChN+Ix0TviMK9zD4QagdVQrACue499e3E6YqChNmIx0TpiMKE67Y+FYVrgbNQgpkBu1aFawGE7b3Gh1VCsAK57j317cTpioKE2YjHROmIwoTrtj4VhWuBs1CCmQGE7b3CMkVXAbm+wMFqwYOVQr3Mq/GqLoKYLETvioKE34jHRO+IwrY+FYVrgbNQgpkBhO99w+FHW6BHg5VCvcNHee4xaj3TaihtxO6QCoKE3pAIx0TukAjCtD4VBWvBtTQex3URgWvBjDvBWIGE79AQ68Vih2HHfGxhlEd90mwEue49wfp9wa3E1UqChM1Ix0TVSMKzPhWFbEGE9/qHY3+LBVFHVUK36rHpxLnuMiq90Sqo7cTtIAqChN0gCMdE7SAIwoTv4D3KPi1FawG4vcCBV0GYftdox1VCt+qx6cS57jIqvdEqqO3E7SAKgoTdIAjHRO0gCMKE7+A9x75IxVdBuH7AgWtBmswox1VCt+q902oEue4yKr2saqqo7cTv0AqChN/QCMdE79AIwr3SPhaFRO/wNyrz76RH2wGX4VvX1UbVHC3t4UfbAYTv0DhHXXuFbGXtMcdb4IeDlUK36ru9y8d57jFqPdNqKG3E7pAKgoTekAjHRO6QCMKE79A90j4WhXcqcYKkKlX3Rv7DvcWFagGih2HHfGxhlEd36sS57jHrKHpxayitxNcQCoKEzxAIx0TXEAjChNewPdI+FoV3atMHapG3hsT3UB5/aYVRR33LAqxenasUR0S57j3h7G1txPPKgoTr5BKBVxuY1pYGmwdHxOftq+7vaQe98cH8lbd+xU2N19wZR6fagWns9Gw0xv3AqtCPIwfE88jCg5/sfdkrfdOsQGct/dutfeCswOc9xAVMcBd1MHGsMnDHk2pu2bQG8K0oJ+pH3mqBXpwZ3pgGytf4/cMih/3qQaNnouZmBr3BV7uKkhYYEZsHsp8YbxIG01UbnZrH55rBaCov6KzG9mlSjMf+0B0MU4uGvfE9yQV9waPvdPaG9ukNScf/Ib7JBXWybf3MKMecAdekmGVaB5QX1FqYBtVZ6zMHw5/soV2+EWy9wGsavceEvS49+S6E7b3KvftFcfHyae9G/cKuTf7BPsQQDUkY02fvlMf+B0E5fd5rPt5BxOu9F4HE3YiBz+HBW7X/NmwBxO29wAK5/cx9yNH5/scTUdpWVcfDvtkqfc7sfg+sgHiuvd3swP3/38Vz5DFqLi2dKoYY2BVbkob+xU19xAK4+L3FMa5cWW0H6WpBbFjVq47G/sk+wov+zX7LPAw9x+EH2pMBbJhHQ5jCgHiui0d9+/4axVVBjDCHQ5jCvdJsAHiui0d9yP34RWxBtV0CmMK27AB4rotHfeC9+EVsrUdZQZAJgWHBkHwBWUGDmMK8+sB4rr3N+otHfeV9/kVpqCeqKh24h33Dx1/WgrD9z+LdxLLuvflt/8ALoAA/wAkgAATr8v3gxX7NuEy9xLPyLK3tR6OBhNvj0QFsfljX/taBo0qBbZYXKROGxOv+wwgKfsvH7oW9w3c6PC+vHdYwh77nwdTVVNrUxsgS+D3Ex8Tt/hc98m2Cocd8cgd9yTp7Vwd91P8VTcK+zSv9wTIHdb3eatcHffE+//XHX+yhXb4RbL3Aaxq9x7zChO2+Fb3BxVTVlNrUxsgS9z3DfcG3OXxvL13WMEf9wv3kBVBBhOu9F4HE7Yi+0xq90w7B44qBbZYXKRNG/sLIC37Kfsw4Tb3Es7Jsre1H40GE3aQRAWx+NkG1Y8FDmMdLh37L/fC2x1jHS4dN/hMbR0OYx33SbAuHfu098IVsQbWVAqwqx1jHduwLh37VffCFbIG6qkdYx313gHYucza7tq3tgMgHfuZ99wVfh1zeR2jH5AKYx33Bq8B2Lna93fHtgMgHfuz9+SdCg5jHd+rAdi51Kz3QqvBtgMgHftB98YV3avQv5Afa0gKagZXkKtG3hsOYx3z6wHYufcm6fcStgMgHftB99qaHYcd8VUdAdi59ybp9xK2AyAd+0H8dDcKYx33UKsB2Ln3dLLytgMgHftZ962oHWMd5PceCti5z6n3Uam8thPvgCAd+773y4QKE/+Ar6RTvBu7nnEdE++AaXDDWxtaxB1jHcAK2Ln4ArYT7iAd+6j3whWuBs1CCmQG7VoVqwYT9ub3AwVcBg5jHcAK2Ln4ArYT7iAd+6j3whWuBs1CCmQGE/b3B8kVXQbl9w8KYx33Mq/GqBLYufflsYK2E/0gHfuo98IVrgbNQgpkBhP+9w5RFbGXtZ25Grv3Lh2HbgW8iaJ9bRp0dn5ugR4OYx33DR3YudKo902ov7YT90AgHfuw98AVrwbU0Hsd00YFsAYw7wViBkPdHRP/wK6eXrtpChP3QGh5uFqVCocd8VUd90mwAdi59ybp9xK2AyAd+7T3whWxBtZUCrD3KQqf/iw3CvcsClUdAdi593mx7rYD+ILZFWxeWHZLG/sRN+L3DYkf+CsGjZeLl5ca9x433/sX+w77Civ7Mfsx9wct9x6rpo2Zrh5rcmNcVRpVrpMduai66M4f/Bn3djMdDkYK90k2HSf4FBWwWwpGCt+rpR2nrPdCrIu2t7kT2YYnHRPZRjEdE9MmRQoTuUZZChPZhrsKE9UmPR0T2TqZ+BgV3qvQv5BYHfcdHUYK8+ulHfDp1La3uRPYjCcdE9hMMR0T0ixFChO4TFkKE9iMuwoT1Tw9HZn4LJgKRgr3Q6mlHeSy9yC2t7kT2JwnHRPYXDEdE9I8RQoTuFxZChPYnLsKE9U8PR2x9/MVth1ip3bCgB4ORgrbNh2F+BSICmYGDkYK9wavpR2u93eRtre5E9mMJx0T2UwxHRPTLEUKE7lMWQoT2Yy7ChPVLD0dE9k0KPg2nQoORgrkraGtpR2jqfdQqoa2t7kT2MMnHRPYozEdE9KTRQoTuKNZChPYw7sKE9STPR0T2Jv7AvgdhAoT2ZWvpFO7G7yeuraOH2wGaId/dnUbE9ibaW/DWxtbxB2g9ygd9w6sAfS499O4AykdTU8ejvcSBfdkXgdkqBXW1MQKQgWzBiv1BWEGKyEFDvtm6/cb9ygdAfS49w3p87gDKR1NTx6O9xIF92ReB/dp/jU3CvtfrPdT9ygdAfS4u6z3QKysuAMpHU1PHo73EgX3ZF4H92j+LhXcq8YdkKtH3RsOoHb4RLP3Aaxq9x4S9Lj307gT7Pcq+H8V5fd5rPt5BxPc9F4HE+wiBz+HBW7X/Nm499gH1NC6rs8b6rNXIB/7pbj3qwf3FlPK+wk+Ul5NTx4OtQoB9+a3A0Ad96LndR21CgH35rcDQB336vd6lAq1CvdVsAH35rcDQB33HucVsAbWdAq1CvD3Hgr3danet8mpE95AHfcU8IQKE/6vpFO7G7yecR0T3mlvw1sbW8QdtQr3Ct4S93Hasbec2hP4QB33OPcKFX4dc3kdox8T/JAKtQr3Eq8S94D3d/sRtxPoQB0T8Pcf9xKdCg61CuurAfd6q9e3wawDQB33kOsV3qvQv5BCHWsGV5D3HR21CuewAffmtwNAHfd95xWyQQpmBg61CvdcqxL35reKshPwQB0T6Pd50qgKsB34TrH3COsS98LpUbcT9EAdE/j3kPcIUB39ugRFHftfrvdR6R33COsS966yeOlRtxPy9+YWkgYT+m1ramRYGlWvkx0fE/L3AR0T9Jb3LpgK+1+u91HpHRL3rrKctxPo9+YWkgYT+G1ramRYGlWvkx0fE+j3AR0OtQoB9+a3A0AdDvt5sfkNsfdVsAH35rcDXAr3HucVsAbWdAr3Fh33VLKPCvdV/ZZECsuTyKS/GrRv9x0KoHb4dHcB9w+4A/cPFrj3Ggb3H/cY92X7ngW+Bvt597r3WfdOBVQG+8r7tYmJBfe3XgcOf/c6HbT1AfejtwMvHffD9yf3DgoO8Ar/AE6AAP8AJIAAAy8d9937P7YKf7L3oOv3trEB94O34ukDx/k9FfdH/KwG+wG9W+a7rJmbsx58rgV5ZWyDbRtGaK/XH/jY+3MH9/n8PBWmn56oqXedcHF2eW33Dx3wCtuyAy8d95b9lhV+bgWohad/bBpwRB20bqBVlh4Ohx3x9zodEvejt5npE3AvHRP496/+NSodhx3x9zod9wevEvejt5npE3gvHeD3B50KE/z3Wv7MKh37NK/3BPc6HRL3mfd4+263E+gvHRPw+CD936oK8AoD+JvAFXlkbYNsG0dnr9cf944H9z/sBbYH+z8qBfez+3Jl90b7pgf7FkAFYAf3FtcF+3AH+wG+W+a6rZmbsh4O+2br9xuxHRLWtvch6kuz90G2E+ttChPdhswFZwb3e/1GFaagnamodp5wOAqgrwr307gT2CkdUFQehwYTuOgK98T3epQK8Qr3BLAS9Lj307gT3CkdUFQehwYTvOgK91fnFbJBCmYGDvEK9w33Hgr0uLip91GppLgTzoApHVBUHocGE66A6Arl8IQKE9+Ar6RTuxu8nnEdE86AaW/DWxsTroBbxB2grwr3TbLquBPcKR1QVB6HBhO86Ar3TvynRArLk8ikvxq0b/cdCvEK9xzrEvS49w7p8rgT2ikdUFQehwYTvugK92r3CJgK+2br9xuvCvcM6fS4E+opHVBUHocGE97oCvdo/UY3Cvs0r/clrwq+93myuBPqKR1QVB6HBhPe6Ar32fzw1x3xCvcI9xAS57m5uPe9txPemPgVFdW0vtw3Hfd+eRUTvobeBWX8dLgGE9739QfNzLesyxvisFomH/vCt/fIB/cQVsf7AEJWYlVXHg5jCjQd92D34XUdYwo0Hfen+GttHQ5jCvdJsDQd0vfheh3SHRPfIh3J9+oVvwoT/7Qdh352dhsT35wKDmMK9d4BzrrF2u3axboDIh3s9/sVopydoqJ6nnRXCmMK9wavAc661Pd21LoDIh3U+AMV93av+3YGDmMK36sBzrrNrPdCrM26AyId90735RXdq0wd9x0dYwrZ9x40HfP3344dYwrbsDQd9zr34XoKhx3xsvg+sgHOuvcg6fceugMiHfdP/FUqHWMK91CrAc66922z9we6AyId9zb3zF0dDmMKwArOuvgIuhPcIh3e9+EVrwbMQgplBuxaFawGE+z3Gh1jCsAKzrr4CLoT3CId3vfhFa8GzEIKZQYT7PcHyRVcBub3DwpjCvcyr8aoEs66996xj7oT+iId3vfhFa8GzEIKZQYT/PcOhR1vgR4OYwr3DR3Ousyn906nzLoT74AiHdb339oKQq8VqZCamqEbE/+Arp1evBu5obKxjR9vBm2GfHx1GxPvgGh5uFobXXVkZYkfDocd8bL4PrL3SbABzrr3H+n3H7oDIh3S9+EVsV8dn/4sKh1/sYV2+Fuxf3fgChOs+FD4EBWmZ5paUxr7Ej00+wBbYZypax51pRVwr3y7wxr3E9nj9wC7tXltqx4TnPcB1RUTbHGgVEwFrmNWnlIb+xIgL/s1QqJQr2EfUkkFE5yldsLKBWi0wHnDG/cS9uf3M9V1xma2Hw5/sPdlrfdOsQGVt/eQs/dpswPB94QV9xK549zWvTP7EvsSWTJAOl3k9xIeXxb7NNQv7su+ueGnHjWnwF3QG7ysoJ+nH3qqBXlwcHtmGzNh4/cMih/3jwaNn4uYmBr3B1/sMkRhWDdvHuFwV7xKGylCL/s0H/fjpxX3A5Ow1tQb06MzKR8OYwrgCmizE/D3wKZDHRPoOB0T8IMdE+h2HWMK2/ce4AposxP4+Bn3IB2d/LVDHRP0OB0T+IMdE/R2HWMK2/ce4AposxP49/j40BUvgQpWBvb7HgV5/LVDHRP0OB0T+IMdE/R2HWMK91CrEs66922z9we6aLMT/Peo+LtdHav8ukMdE/o4HRP8gx0T+nYd0h1osxP/APge+TMVaId+dnYbE98AnAq/ChP/AJ0d+xD9GEMdE/6AOB0T3wCDHRPegHYdhx3xsvg+shLOuvcg6fceumizE/z3wWEKivchQx0T+jgdE/yDHRP6dh33LAqy+D6yAc669xix9166A/eK+w4VbB21qbq4nx/1tc/O9x0a9zUg5/sS+xIgL/s1+zHzLfcWHnV5amFZGvsY9/0V9xPZ4vcA9wDZNPsT+xI9NfsA+wA94fcSHg6gqQpNCvei93qUCqCpCpSyTQoTzJX8p0QKy5PIpL8atG/3HQqg9wwd9wSwEvc3uBPMSgoTrJeyBRPMYh0TnIb3CgVlBvc15xWyQQpmBg77Zuv3G/cMHRL3LOk4uBPiSgoT0peyBRPiYh0Tyob3CgVlBhPkr/1GNwr7Zuv3G/cMHfcmrxL3LOk4uKH3dxPlAEoKE9UAl7IFE+UAYh0TzQCG9woFZQYT5YDO9xKdChPmAGz96DcK+zSv9yWpChPkSgoT1JeyBRPkYh0TzIb3CgVlBvcp/PDXHX/3CQr3zyYK96v4+m0dDn/3Ox33SbAB9wK5988mCtb4cHodf/c7HduwAfcCuffPJgr3Pvhwegp/9wkK90ay7bkD+Hb4RRWtXUGkSxv7FVBRRUvcYPcAcR/3IWmqa18aWFhfKChNprZXHnJrwGXVauWGGWpNBdgdRB2zcJ1qlh6htQX3CJDNyNAa0Fqx+yqwHiijTKm5GrittfbMwXZrtR4Of/cJCvdCsvEmCvdG+ydsCkQdtG/3HQp/9zsd8+sB9wK56un3EiYK91L4iJkdhx3x9wkK9wDp9wUmCvdf+8YVRR1/sYZ2+UmxEvO39x+4ybjXuBN+8xa3+JsG9wrEw97QsF9SHjEgayoaE777JPd4rfsfGllmW0BdZpqpYx50agVss7x4xBvlzsfaH/c7+3hr9wfb9q7yGtZSyC/7AT4/+w4eDn+y+DOxz/diAfd1t/8AgIAA/wAkgAADLAr3XfW2Cn+yZrD4M7ES93W39xOyE7j4IX8VucSXnbYff60Fe2VjglgbIXDD6B/3nveUsfuU9x9mB4X7H/smhwVp9yX7mgcTeCKsQvR/HmlLBdgdRB0TuLNwnWqWHg5/9wkd9xuyAywK9xv8gUQKy5PIpL8atG/3HQqHHfH3CR3R6QMsCvc1/SA3Cvs0r/cEsvgzsRL3dbeM93kT8CwKE+j3pvzK1x1/svgzsfeN3hL3GtqXt7baE8gsChP8WPezFaKbnqKie510c3t5dHSbeKMf90UWopyeoqJ6nXR0e3l0dJt4oh8Of6AK99O3E7j4gvh0FV8iChN4hgr7SvjQdR1/oAr307cTuPiC+HQVXyIKE3iGCvsC+VqUClkd92mw9B0TvPiC+HQVXyIKE3yGCvvO+NAVsFsKWR33DfceCuK3sqn3UKqqtxOvgPiC+HQVXyIKE2+Ahgr72PjZhAoTv4CurR2PH2wGaId/dnUbE6+AaW/DWxsTb4BaeeIKWR33Ht4S4reu2u7Zp7cTufiC+HQVXyIKE32GCvu1+OoV4woTu/dGFqKbnaKie/cgCg5ZHfcmrxLit733d7W3E7r4gvh0FV8iChN+hgr7zfjynQoOWR33CKsS4re2rPdCrK+3E7n4gvh0FV8iChN/hgr7XPjUFd6qTB33HR1ZHdql9w2lEuK33Kn0qNW3E7+A+IL4dBVfIgoTf4CGCvtccwqjc2Znc3NuHw5ZHfcC9x70HRO8+IL4dBVfIgoTfIYK+674zssKyPseywoOWR33BLD0HRO8+IL4dBVfIgoTfIYK+3D40IgKZgYOWR33HtLZrBLit7zS4dO0txO8gPiC+HQVXyIKE3+Ahgr7q/jqYB37VvcpFfd5rPt5Bg5ZHfce0rTtEuK3vNLh07S3E7yA+IL4dBVfIgoTf4CGCvuH+VoVrwbr7QVXBvsI+2ZgHQ5ZHfce0rSqEuK3vNLh07S3E7yA+IL4dBVfIgoTf4CGCvtw+VoVswbo7QVlBkJIBYcGQ84FZAat+2ZgHQ5ZHfce0rTtEuK3vNLh07S3E7yA+IL4dBVfIgoTf4CGCvuB+bwVVwbsKQWvBq77BBWfm5ufn3t9CvsyFqDMHXZ3fHx3d5p7nx8Ohx3xoAr3JOnctxPa+IL4dBVfIgoTvoYK+0D7ZjcKWR33cKsS4rf3V7LgtxO++IL4dBVfIgoTfoYK+3P4uxW6mLr3Hx1UoEmOHodrBcKkHfcsCrN4dqx2+HR3EuK394OxtbcTz/iC+HQVXyIKE6+QNQVXZWhjWBp0HZ2tHxOftqqywq0eDn+gCvfTt7yzE7z4pfjgFZV+j35+GmJqdleEHoMiChN8UwrFCvgT9yAd95GbFZV+j35+GmJqdleEHoMiChN+UwrFCvfy+NAVL4EKVgb2+x4F922bFZV+j35+GmJqdleEHoMiChN+UwpZHfdwqxLit/dWs+C3vLMTv/ei+LtdHfeflhWVfo9+fhpianZXhB6DIgoTf1MKWR33DfceCuK3sqn3UKmrt7yzE7/A+Bj5MxVoh352dhsTr8CcCr8KE7/AnR33AzgVlX6Pfn4aYmp2V4QegyIKE2/AUwqHHfGgCvcW6eq3vLMT3/fIYQr3cflSFZV+j35+GmJqdleEHoMiChO/UwowCvfH53UdMAr4D/d6FVUGL8IdDou0+Bq0k3f3abASlvjWE7j3GxbEBtX3uAUT2Ji8lLmVtwiPBpdclF+WXdf7uhjEBhO49w74dAVfBj/7y4FfgWKBYBmHBoC2gbSAtwgT2D73wwVaBj77w4BfgWKAYBmHBoO2gbSAtwgTuD73ywVcBvdC53odi7T4GrSTd/ce3hL3QNrt2hO89xsWxAbV97gFE9yYvJS5lbcIjwaXXJRfll3X+7oYxAYTvPcO+HQFXwY/+8uBX4FigWAZhwaAtoG0gLcIE9w+98MFWgY++8OAX4FigGAZhwaDtoG0gLcIE7w+98sFXAb3XPcKFaObnaKie55zVwq5HQHH+HQDJR33hvl62x25HQHH+HQDJR33zfoEbR0OuR33abABx/h0AyUd9wH5ehWxBtZUCrCrHbkd9x7eAfdC2u7aAyUd9xv5lBWhHXp4dHSceaIf90UW4woOuR33HOsB95TpAyUd93T5kpod+2+0bOv45XcS+B/pE7AlHRNw9/9kKh25HfdwqwH367IDJR33Zfll9wUKh2sFwqQduR33DfceCvdGqfdRqRPcJR3u+YOEChP8r6RTvBu7nnEdE9xpcMNbG1rEHYuy+CexAdP4Wk8K9+T5Qm0dDouy+Cex57AB0/haTwr3d/i4FbIG6qkdi7L4J7H3COsB96TpTwr3i/jQmh2HHfcGsvgnsQH3oelPCveI+34qHX+y+A2x9653Ac64+Aa4A/fAphUjN9r3Be7I4fcUxc9xQMAfjHqMenka+xFWKPsVHvdg+R0VfKb7GkZerlmpVKQZdW29c7hxsm0Z+x9Dm2/3KtnNUrpBnPsAGb9hS7BHG/shLzD7GPsk9wM09w33HuXz9zT3OlH3BDPdHw7vCvd3dwH0uPfkugP3KmEViu0FYb3Hcbwb9wr26/c39ylF6/sbTEppWVYfjukF921e/jy4B/fPBPefB8fHx6e+G/cJuzP7CvsWPjEkZE6fvlMfDvt5sfkNsQH35rcDXAoOf7L4P7F/dxL2t/fXuRPY+Jz3/RXlObQ1REFkXlQeiAYTuIfTBWX7xwYlwDj3FeHet6axHnesBW9kRWZCG/sCa9Tbih8T2PeZofcAvvcAGl2IFT49XfuJdR73LgfEz8upyRvMy3BGHw5/nB335LgTrCAKE1xAChOsJwoORwoS9Lj35LoTrPh694oV+xVAMSNjT56/Uh73nwfEwMqqwxv3Cboz+wsfuowV9ylH6/scR0ZkX2EeiQYTXIbSBWX8dLAGE6yQwQWNBmO8yXG9G/cL8+v3Nx8OYwoB+Ga6A/iV94MV9zX7BOf7HDFRaGVkHqRtBbG0v6XPG/cM3TT7E/sSNzX7EUhRqLNgH3RsBV28zmzYG/ck9wLn9zMfDmMdAc+2+AK5A/if94MV9zEo6/sX+w8lN/sef4t/jX8e+CsG+w6JNzX7ERtLWKCqXh95aQVvt8Fv3xv3HvcH6fcxH/wwqhX3DeLK6fTNRfsGmR4Of7H3V6/3WbEB2Lb4ArkD2PdvFfsq6Tr3EPck6Ov3Mfc0LOb7KDtRdHBfHp1pBaa4v57KG/cZzTb7BI0f/CsGiX+LfX8ato0V+AIG+w2DSkH7ChsoP8j3Gh8OYgoSzrn35bgT7DsdE9z4nGYHE+wkHQ77WHb3YbP4WHcB4bj307gD+IP4dBVe++wGQkZcaEcbLGO/9h/3uV77vwf7FsNM9wnYxLjJxx6I+xEF+0+4Bw5ZHRLCtvdAs/dBthO8+KL4dBVg+/4GT2tvbWAbXXOw0x/362P7/gdPbG9tXxtddLDTH/frYPvwByuwW87AqarBrR5SmKlvwBvBqKm6px+NBhN8kEoFrwYOf7V2dqx2+HR3EvgcuBOY+En4dBVe+8AG+wFJQmI7G2V5kJhoHxNYf2MFE5h7qa2Hqxvr2cHYvx+NBhM4kPsLBbEGDouy+DOxAffftwP4C/fBFfcGY9j7F11Rf3pgHpdpBZqxs5W+G/WmUi4f+537lGT3lPsfsAeR9x8F9yay+yUGDqB2+Eu0Acn4cAP31vh0FVwG+2n8dAW2BvcZ98Ggu526nrYZjwadYJ9coVv3GPvBGLkGDpO0b3b4S7QSlvjWE3D4Zfh0FVIGQfu4BROwflqCXoFeCIcGf7qCt4C5P/e6GFIGE3D7Dvx0BbcG1/fLlbeVtJW2GY8GlmCVYpZfCBOw2PvDBbwG2PfDlreVtJa2GY8Gk2CVYpZfCBNw2PvLBboGDqB2+UezgXcSx/h0E9D4ovk/FROwl7EFE9CRfHSPeBsrUj07cB/7hfzRBbYG9xH3wpy0n7+ethmPBqJfo1ieYvcg+8IYuQb7ffh9q9UF1Ka4wtAbnZqHh5gfDvtYdveCdvh0dwH4RLgD+HH4dBVe+xoG+x/7GPtl954FWAb3efu6+1n7TgXCBvfI97UFj/yOuAYOtQr3COuMsRL3JLf3YepFuBPa9yT4dBVJhwVpzZcK96b83xW4+HReBhPsofdoFXJ1eG1voXikpaGep6l1nnEfDn+yhekd92mxf3cS9ym392i4E7b3Kfh0FUmHBWnNBxN2lwoTrvfn/MIViYKHi4Ybf4OVoB/5KV79IwdXn3OympONjpQeDn+cHffkuBOsIAoTXEAKE6wnCg5/nB335LgTrCAKE1xAChOsJwr3kvfhdR1/nB335LgTrCAKE1xAChOsJwr32vhrlApHCvdpsPMKE6YgChNWQAoTpicK9w734RWwBhOu1nQKRwr3DfceCs66zKn3UamhuBOnQCAKE1dAQAoTp0AnCvcE9+qEChOvwK+kU7sbvJ5xHROnQGlww1obW8QdRwr3Ht4SzrrI2u7anbgTpIAgChNUgEAKE6SAJwoTr4D3KPf7FX4dc3kdox+QCkcK9yavEs661/d3rLgTrSAKE11AChOtJwoTr/cP+AOdCg5HCvcIqxLOutGr90KsprgTrIAgChNcgEAKE6yAJwoTr4D3gPflFd6r0L+QQh1rBleQ9x0dRwrapfcNpRLOuvap9KnLuBOvwCAKE1/AQAoTr8AnCveA98AVuq+uvr9nrlxdZ2hXWK9ouR+lBG50o6+woqOoqfcaCm0fDkcK9wSw8woTpiAKE1ZAChOmJwoTrvdt9+EVskEKZgYO9xgdEs669yTp7bgTVSAKEy1AChNVJwoT1/eC/FUVRR1HCvdwqxLOuvdxste4E68gChNfQAoTrycK92n3zKgKRwr3RfcDKa/zChOjIAoTU0AKE6MnChOnjArsWhWsBhOr5vcDBVwGDkcK90X3Aymv8woToyAKE1NAChOjJwoTp4wKE6v3B8kVXQbl9w8KRwr3Uq/GqBLOuvfhsWi4E66AIAoTXoBAChOugCcKjAoTrwD3DlEVsZe0nbkau133OwqHbgW8iaF9bRp0d35ugR4ORwr3R/ccCs66z6j3TaikuBOtICAKE10gQAoTrSAnCvcR998VsAbT0Hsd1EYFrwYx7wViBhOvoEPdHROtYK6dXrxpChOvoGh4uFuVCvcYHfdpsBLOuvcj6e64E1KAIAoTKoBAChNSgCcK9w734RWwBhPXgFodZAaf/iw3CkcK9wiqx6cSzrrSqfdEqqe4E6pAIAoTWkBAChOqQCcKE6/A92D4QBWtBuH3AgVdBmH7XRWPHViQq0fcGw5HCvcIqsenEs660qn3RKqnuBOqQCAKE1pAQAoTqkAnChOvwPdX+K4VXAbi+wIFrAZrMBWPHViQq0fcGw5HCvcIqvdNqBLOutKp9wCxqaqnuBOvoCAKE1+gQAoTr6AnCveA9+UVE6/gjx0Tr6BYkKtH3Bt27hWwl7XHHW6CHg5HCvcIqu73Lx3Ous+o902opLgTrSAgChNdIEAKE60gJwoTr6D3gPflFd2pv7qQH2wGaIVwalYbV3CsroUfawZckalX3Bv7DfcWFagGsAoTrWCunV68aQoTr6BoeLhblQr3GB33CKsSzrrRq7TpsqymuBNWICAKEy4gQAoTViAnChPX4PeA9+UV3qvQv5BCHWsGV5CrRt0bjP2mNwr3LAqyeXasUR1/dxLOuveUsbW4E8uAIAoTq4CQSwVXZWhjWBpVr3C4oaeVmJoee6UFgX5/h3kbcnOdrR8Tl4C2qrLDrR74dGYHE8uAJwoOYgoSzrn35bgT7DsdE9z4nGYHE+wkHQ5iCvdpsBLOuffluBPmOx0T1vicZgcT5iQdLvipFbAGE+7WdApiCvcIqxLOudWr90Kso7gT7IA7HRPcgPicZgcT7IAkHRPvgKD4rRXeq9C/kEIdawZXkPcdHWIK9xzrEs659ybp7LgT5TsdE9X4nGYHE+UkHRPvoPjBmApiCvdjqRLOufcasvc4uBPnOx0T1/icZgcT5yQduPiIFRPvth0T52KndsKAHg5iCvcEsBLOuffluBPmOx0T1vicZgcT5iQdE+6N+KkVskEKZgYOYgr3Jq8Szrnb93epuBPtOx0T3ficZgcT7SQdE+8v+MudCg5iCvcN9x4KzrnQqfdRqZ64E+dAOx0T10D4nGYHE+dAJB0k+LKEChPvwK+kU7sbvJ5xHRPnQGlww1obW8Qdf7H49a8BwLi2tPc3tAP3iqUVO0fE4sy7u8S4H7o30DjRSwhhY1puVRtL+IgVx628xcCdYGBHT1xJWh50vH27txr4GfyHFWaZYKResL7OseCl5QhgBnQ3a0JcT0jHR91d3gjVxNjD4BrQZL5DPFRNNlicU6dTHkZXS1M1GvsB30X01MOtvLsevGK6cLR8CA5/sfeJ9wz3ctAd9w/3Z/doO/cJ+x/7Hzv7Cfto+2fb+w/3Hx/5BQTz0ir7VvtWRCUjI0Tx91b3VtLs8x/76gSnpqD3JB12px8Oi7L4pqlt0fcwCvjsagcT0GZ6Wn1LgggTsG33H/ym+1Nk+DKyBw6Ls/jRsfc0HfuJBmNjiIljH/df91D3EvcO9xMa9wBC0vsRNU1iVlYeqG8Fu7fFr80b9wK7TTv7B/sI+wf7gPtpHw5/sve1sveWsfcTHdn3FQr3A+U7xjKcH48HE/jdo8q93xrtNMP7AjlIaGBbHqZtBbKzyqrNG+XJXEM+S033Ewo29yUKoHb3U7L38MmLdxL4FLYT2PH3ehUT6Pdv95ugp6Con6cZkQaJa4ppiWwI+48H9y4W+wP4LmgG+/L8OgVw9+r7U7b3U/cDBw5/svflsvdZsgH4arkDydX3Bh33HPcgLMn7EVFkfXdiH6D3ewX3xLL77AZz+7+qeAWlurCcxhv3BNBNJCQ3RiglVbKyXx8Of7H31rH3drIB4bj387gD99mlFfsOTtodMR/3UPjHFbBiWKRE4x3q3/cI9xU90PsOQUhoVFQf93+N8Nz3CBu/u3lorx8OoHb47LIB94m8A/eJFrwGlPePvfcz90P3Xwil/Fpk+CEH+y37Tkz7L4H7lwgOQR1/svd3sPfW9zYK97cVIFXH8ObP0eX3Dsgy+xuVvAr3oPdWLvb7JPsALDj7CPsV2Eb3D9XNrsHDH/uAiSU79yUdf7H3Z/cN90/QHfcA91X3UDv1+x/7Hzsh+1D7Vdv7APcfH/jBBPPSM/s8+0NEMyMjROP3Q/c80uPzH/vIBKemofckHXWnHw6LsvhhqmzS9zAK+KhqBxPQZnpafEuDCBOwbPcf/GH7U2T4MrIHDouz+Iyy9zQd+38GY2OIiWMf9173JPcJ9wX0GvcFQtT7ETVNYVZWHqhwBbu3xa7NG/cCu0s3L/sG+wb7gvs2Hw44sve2sveXsvcTHZL3FQr3BOY7xjKbH48HE/jdo8q+3xrtNMT7AjlIaGBbHqZsBbOzyqnNG+XJXEM+S0z3Ewo19yUK8LP4BMqLdxL4FLYTsPD3IRUT0Pdw96ugp6GqnqkZkQaJbIppiWsI+6MH9y4W+wP4Q2gG+/L8TwVv9+r7QLb3QPcDBw44svfmsvdaswH4arkDyY73Bh33HfcgLMn7EVFkfndiH6D3ewX3xLP77AZz+8CqeAWlurCbxhv3BNBNJCQ3RSglVbKyXx8Of7H31rH3drIB47j387cD99qlFfsOT9odMB/3UfjHFbBiV6RF4x3p3/cI9xU+0PsOQUloVVMf93+N8Nv3BxvAunlosB8O+KezAfeJvAP3iUQVvAaW95G79zP3Q/dfCKb8WmP4IQf7LftOTPswgfuYCA5BHTiy93ew99n3Ngr3cBUgVcjw58/S5fcOyTD7HJS8Cvei91Yu9wD7JPsALDf7CfsV2EX3D9XNrsLDH/uAiSU69yUdf/cW9wwKwBXSCov3CwH33boD93H7ZxWeCn/3FveM9xf3DAr4RBVh9xsKtbRuo2xsbnNiHvwPBNIKi/cL94v3FxL3hPcMbLoT4PfA+AIVqqijtbRuo2xsbnNiYahzqh88/NUVE9CeCn/3EgG+9wbZ9wbZ9wYDvr4VZKdzqKeoo7KzbqJvbm90Yx73VBZkp3OoqKejsrNvom5ub3RjHvdUFmSoc6eop6Oys2+ibm9udGMeDn/3EiJ2+T53EveG9wg8tRNo97D3bxWrBpD4EAXSYUQHE3Bm/Lj3NwoTsLRvoW0eE3Btb3ViHw74AvcSi3cS94b3CDy1E1D30PeZFWsGhvwQBUS10gcTYLD4uPcyChOgYqd1qR4TYKmnobQfDn/3EiJ2+SOyEvd49wjauBN495X3bxWzBnb3HvdUtfcXGuFKzfsBPlBqYGEeqHAFtLK+osMb5rRVTPsK+1RipfsoH277PPc3ChO4tG+hbR4TeG1vdWIfDvtesvil9xKLdxL3Grja9wgTuPft95kVYwag+x77VGL7GBo1zEn3AdfHrLa1Hm6mBWNkWHNTGzBiwcr3CvdUtHH3KB+o9zz3MgoT2GKndakeE7ipp6G0Hw74EffHAfea1wP3rvgR1h0O+BH3xwH3Mtf3GNcD90b4EdYd93j7btYdDvgV9w8B93S5A/fx+VBlHZDUsMbFsggO+NT3EAH32rkD94v4FRXVtL7cNx0O+BX3DwH3DLn3NrkD94n5UGUdkNSwxsWyCPdPqmUdj9SxxsWyCA741PcUCvgVFdW0vtw3Hfd4bRXVtL7cNx0Oa/cQAffauQP3i/tzFdW1vts3HQ5r9xQK+3MV1bW+2zcd93htFdW1vts3HQ7P+AQB92a0A/f0z5cdDs/4BAH38bQD93PkkgoOz/gEAfW09zu0A/eMz5cd9/L7N5cdDs/4BAH3ibT3O7QD9wvkkgrd+zeSCg6ZCpkKzgrPHc4Kzx33qvcX9wwK9+sV9zcdo2xsbnNhHg73D/eqAfc196oD98D3DxXSz8Hg4EfBRERHVTY2z1XSHw77EbkBx/h0A8c8FV34dLkHDvtC+hwB93S4A/hc+0IVpKcF+yT3A0f3H/dCGvdCz/cf9yT3Ax5ypwX7JCMz+yz7WBr7WOP7LPckIx4O+0L6HAH337gD9yT7QhX3JPPj9yz3WBr3WDP3LPsk8x5ybwX3JPsDz/sf+0Ia+0JH+x/7JPsDHg77LKn5tKkB94SyA/eE+ywV952p+3b5tPd2qfudBg77LKn5tKkB99WyA+r7DhVt95358Pudbfd2/bQHDvcyHfcV8rC7A/ehcxUnyG/3Dx6/qVEG+wVzqtIfzZLB0xrFeK1Jlx6PB82Xnq3Fy4TPxxrSo6r3BR7FqVcG+w9ObycfR5RBSxpjcmP7EB5rB/cQpGNjH0WCTUEaDvcyHfewubHxA+r7DhVtvwf3EMan7x/Vg8nRGrOks/cPHqsH+w9ys7Mfy5PVzxrvUKf7EB5XbcUG9wWlbEQfT4NHSxpRnGnOfx6HB0h/emlRQ5NVSRpEcWz7BR4O9zMK+Hr5WhVeBvvb/foFuAYO9yMK+44Vs/p8YwYO9zMK+E37NBW4Bvvb+foFXgYO9yMK96sVs/hrYwb8pgT8arP4agcO9w/4PwH3rbED90X3DxX3D/c99w/7Paig+wj3P/c80oCp+z9OhfdXBWsGhftX+z/IgG33PET7CPs/BQ74nf8AJ4AAAf8BGIAAsgP3qzsVtQaI+O73GIm9Co0FDv8AR4AAsvgvsgH/ARiAALID9yrRFfcYjoj7LQW1Boj3LfcYiAW1B/sYiI73Y4j3Y/cYiL0Kjoj7Y477Y/sYjgUOV7D5JrES8bSitvdNtaC0E+T4CPdIFTTD+yKZ9Bq/rqa/pR7gVPcie/sAGlRsc1V1Htr4VBWpY1miUBsT9C5gT1JomHKgdh8T7FRwYGRK+0r3uK/7HBpdZGROSWWhq2cebW8FZrTDcdQb182/065+pnegHxP0wqezrc73Tfu1avcXGrGlsc/Ar3dxrh4O+Sd3AeL3qMO1A/g3OxW1+XdhBlMWXwb7HSxR+yr7KfBR9ycfpwYOf6r0sPfLsPcFqQGwrtm29+OuA7D31moK2Rb7EdJC38GqoaapHninBXVxb3ljG0ddye7lvMfPq6B/daMfoqUFpnFunV4bNkBE+wgfDn+q94qt9zit9xGpAbCu9xe09ya26q4D91/3HBW09xXLBtHCtdzUVa9EHyIGtPtaFfc4wAfFrnRXTWhwUR/7mKJqCg732Kj3IabWp8enAfcKqt6r263UqgP3wPfYFe7e2PcI9wk42SgnOT37CfsI3T7vH6gEN0jQ6uvO0t/fzkQrLEhGNx9HzBWr17oGsj8FsAZa4QWhkp2jpBq9ZZlkHkYGqyQV1qsHr5d8dHF2gG0fDvg3uPc4u2iuEvWx9zKw91ivE7z3wvgFFbD3NQaG7Xsd3ftlBawGE9yxCgUTvFf3EgVYBvtY+8cVsfek9q77j2j1Bg73+aupuPc4u3CrEriw9wiwzrD3WK8Tn/cc9/kVybCztrd1omWdH1qkBXCYepqiGqWfobGio316nx6hpQWgdmqbahtSY21YXql1p30fvHEFrHqYhWwabXV3ZmZzmaRxHnRyBW+ksXm3G/c6lxWwBhPv9zUHhu17Hd37ZQWsBrEKV/cSBVgGDvsjr/dXr/hr9wgK+CAV9xlM8PsX+zn7EPsd+4j7jvcS+yLOHfcb9273cfcB9xT3HfcGuTL7AB99gAp9r/ckr/hG9wgK+GwV9wJN5PsX+zr7EPsQ+3D7bvcS+w/OHfcH90/3WfcC9wf3HfcFuUA0H3+ACqB292qv9z6v91Z3Aev4MQP3LhauBqT3agX3KgZx+2oFrgal92oF5a82BqD3PgXfrzoGpPdWBWgGcvtWBfsqBqT3VgVpBnH7VgUvZ+QGdvs+BTNn3gazrxWg9z4F9yoGdvs+BQ735vgKAfetsQP3WPfmFfP3KPP7KKifKvcs9yjEgKn7K1uF9zcFawaF+zn7K72AbfcoUir7LAUOwx3DHa2y+I6yAfcSuPe1uQP31vfJFdNuzWxKGkpXXSt/gIyMgB6b97gVSaVSpsIaysC025WVi4qUHrCEFa2BpHmocqWnGG6na6Ndl6T3HRhmkHL7HAWMgYCMgBskPFQxOdpn3GsfX/uFWZhipG2jGXNrrG+7cMR9GW/7K7CHpvcoBYqYl4qYG/cB48Xq6jGxNa0fDvhAmgr4QEkK+T3cCvhMFY0d+EyuCvhMVx34QIcK+H08Cvicrh34uU8d+ECfCvh9OR34QKod+GA/HflY2wr4TBVkHfhAgR34mCsK+ECOCvkiPwr4B8od+OdvHfgHyx34524K+ETfCvhqfgr4Stwd9+FRCvtKmgr7SkkK0twK+z4VjR37Pq4K+z5XHftKhwr7DTwKMa4dTk8d+0qfCvsNOR37Sqod+yo/He3bCvs+FWQd+0qBHS0rCvtKjgq3Pwr7g8odfG8d+4PLHXxuCvtG3wr7IH4K+0DcHfupUQp/mgp/SQr3hdwKFo0di64KFvd2rPs1BtzTyrzGGsxjrkheZHFrcR6mdgWmn6ieqxu3pXFhWFZh+wksHw5/hwq8PArbrh33AU8df58KvDkdf6v3GantqwH3Ta/3ObED98+fFV5jqceDH6utpparG76fb2ZjcW9eH/H3nhWadHOXZhs5SVb7FTDIV8/MuLjCwGu1Q2ZqfHRuH+yPvbLEG6eggH6dHw73oNsKFmQdf4Ed1ysKf44K92o/CkbKHfcvbx1Gyx33L24Kg98KqX4KidwdIFEK99qaCvfaSQr419wK9+YVjR335q4K9+ZXHffahwr4FxVOHRPwsZmfo7Iav2OoUGFieW50HqJ0BaOfrJmkG7ifdmxobnBKH28HE+jUr3diYm16YGJo9zkd+DauHfhTTx332p8K+Bc5Hffaqh33+j8d+PLbCvfmFWQd99qBHfgyKwr32o4K+LwVsqWnuLiybU6SHmxrcIFrG1h3prEfbPtaFXuio3+wG9zOwfcU5k6/R0peX1RWq2DSsKuZo6gfKoZcZFIbb3aWmHkfDvdcyh34PBUrsUfNTx6lowVMxXTJ2xrbosrKxR5xowVJT2VHKhoO91zLHfg8Fexlz0nHHnFzBcpRokw7Gjt0TUxRHqVzBc3Hsc/rGg73md8K979+Cvef3B33NlEKUh1bHXkKUh33AB33SveYFawGj6oFjQZzqrB89zQKMWNjdnFqH43HBfcZYge0/CwV90cHq6+u9xQdaZWmaR8O95Cu956sAfdPtAP3T/g3FSHPTua2spykqR54pgV4dGx8ZhtDW8Da2b/D0aqkfXihH6GnBZ9zbJ1cGzVATiEfDpsd9yL4NxUgwk/ft7ChpacejAaPYwWt+Gxi+xMGjlIFo2pwmWIbPEZLJB+1Fti7w8p8HQ73kKz3E6j3BKw+Cg74taz3FawB97WyA/iI+WgVl21wj20bN2NaPB9pBzmJBWzd+7Gy97H3H6z7H7AHwqSwy6afiIClHg73Aqj3Cq/Pqfcvq3WpEvcysHuvZ7P3N7GgsxP0wPdX918Vn5egrp4ehpqbipwb0gbApoFqZlhlOEBmprAfZokVUr5p7fbOv8W/ZqA4HhPygD4GX3KYp5uWmZyVH4OfnYafG86/t86qfKV6nB/nq/saBhPpgJF+fI16G0dVXUhlnW+geh+IBxPygHJ7fXR2GnGcepuDHogHE/TAaXd3b3MaE/GA9yP3UhVcaKy8u66uurivaFtaZ2peHw6KCmhmHo7VBfcZYgcO+LWs1NMS98vVU7MTkPdH+LUV9yr7sbP30vtSBhPgvh33BK34I6zU0xL3wNVTsxPI9zz4tRX3KvvGBlJ4Z0R0cZOWdx58bAV/oqqBqRvuqr/aH/fj+1IHE/C+HfeY+GwB92KzA/di95gVs+IG4Nv3D/s7BbkG+yP3VvcQ9xAFXAb7TvtIBYn34mMGDveQrvgwrAH3ubQD92D5TxXk++sGRalpxqiekpGiHoKsBYN0fYh6G2Z4n7gf+BD7FgcO+LuuAfcgsvOv87ID9yD3mBWy94AGr56d9zEKr/eAB6+dnvcxCrL3egfKcqxfZ3V3aHYesIN2nWkbZ3d3bXofiQaHtQVrBg6KCmloHogGiL8FaQYOeQr3AB33cve2FXOtrH33NAoyYWR2cmsfiQaHsQVp/F609wUG5gT3Rwersaz3FB1qlaZoHw6bHfci+DcVIMJP37awoKSpHohQBfsLtPheageHbgWJBqNrcJhiGzxGSyQftRbYu8PKfB0O+LmwAfeZswP3mfeYFbP3VAbSr7iluBujmIiDoh+UrgWVd3aOdBtUXGpXbR+JBojYBWkGDveQrPehqwH3UbP3RbMD9z/3vBVzrrx3xRvhura8yUicT50fXZlfmasap6WkxrGof3qlHqCmBZ9tYplhGzpeZFtVzHfFeR+4frx7ZxpsbHFPVGiao2oeDveQrfeXrAH3kbQD95H4ERU+qFflqayTl6QegqkFgXV2hW8bSHitxx/3OfcurPsu52kHhi84iQVs3AcO95CvAfc7tPdPswP4R/jWFWP7egZiZG14YxtTdanJH/daYvtfBzmuYtW8saWvqx6NBpBVBawGDveYrgH3Ofe0A/ey95gVuwb3C/fSBWMGRftTf2yCa4BuGYkGgaiBq3+qRfdTGGEGDveYr/eArgHc+BsD9zX3mBW7Brj3R5StkKmSqBmOBpJqkW6Sbbn7SBi9Btn30gVjBl37WIRuhm6EbxmIBoSnhaiEqFv3TRhlBl37TYRuhG6EbxmJBoWnhaiFqFz3WBhgBg73mPfSAfdI96ID90j3mBW1Br/cmJ+Wn5idGY0GmXmYd5d3wToYtwb7Avc28fcwBWAGXECAeYB6gHkZiAaAnX+cgZ1Z1hhfBvD7KwUO9wquAfcm98gD9zj3MhWCagWHlpmImRvMsL7Fnx/3HvfzBWMGQ/tRgW+AaoBuGYgGfql+rH+mOfdRGGIG9yT71YFwBV96b2phG4GAjo2DHw73mK33j6wB9yP3xwP3I/eYFffHrfuLBveD95sFoPulavdpB/uD+5sFDveQrPcTqPcErL/pPgow91kVrAZO6QVdBg73kKz3E6j3BKy/6T4Ka/e3FV4GTS0FrAYO95Cs9wqo9w2sAfcysfdjswP3MvgqFSnEU93gyMvz9U/HMVpnfXhuHppuBZ2nqJaxG9OyWUSNH/uFBomDioKCGrGIFfdjBkGEZ19MG09isdsfDlsd9wWr9wiu95StAfcitfdgtAP3S/dFFXttBXattX63G+W/u9gf9+hoB4duBYoGo21tmGQbPUVNJiTCUN+2saGkph+KSAVQaWZIaWeVoWke9fcLFUhlvtjUu8LKqqiAcKwf+z0Hamtre2gbDvhTq/dCqgH3Tq33NK0D98D4UxXGwrfV1lS3UFBUX0BBwl/GH6sEXGqwvL6ssLq6rGZYWmpmXB8O9x2w98qwAfcLt/emtwPt6RXg4wVuq7R7txu2tZuoqh/hM6anNeIFoquatLkau3y1dKse4eNwpzUyBadrYptgG19ie29sHzXkcG/gMwV0a31hWxpdmWKiax42NAXn92IV58rL1dXKSy8wTExBQUzK5h4OrrH4jrEB9xO49wiy9xi5A/h4+LYVZLBgqUCQCPcXZPsYBy6ER1Y3+zz34KX7JxpKV10rOEuvrmAec2u2Z89n24YZ+yWy9yUH75HZxOT3TPvhbvcZGsrAtNvVrXRluB4Oi7P3ka/3r7IS4Nx7tZ+zE/T3Fwqlh6KGoh73Uq8GE+j7XQZ5v3W6wLIdV6FZnFkf+wCIBWoHE/T3DAaRdJBzcvcCHYv3W2mt0qz35HcS96m3E3jM+RMV91r75AX7Q2r3UUT7UWn3UQYTuPs5twcTePc591Ot+1PS91Os+0UH91z35AVeBvsC+1VwX3NfcFoZhwZwvHO3crf7AvdVGA5/sfdwrNis93SxAfcSuwP4o/YVVV1ecEsbIUbg9xt5H/eprPutBoqZi5maGpeLloyWHvfVrPvSBvcfnNTg9wgbwrVwY68fqKYFtWlQr0cb+yAsKPs3dx9KhwVuyQeKgIt/fxp9i32MfR5NhwVuzQf7M6DlKPcUG97Cr8W7Hw7bsvgVsgH3Drn3J64D98/3DRUxmFLU8xrzyNThmR73MvvdFWtuYXRaiQj4FQe4ia53qXCjpxhsqWKnTY0I9wFo+wMHIX80O/seGvsd3Dn3BIAe+wGu9wAHxY28prKuCA4psvg/sPd3snV3Ev8BGIAAtxPY+KP5HRUT6Jd2b5VlGylfPfsRfR+ETAVYBkiHBWr3Bgdv+5oFLH9vRT0bdHaSk3gffmkFgaCjgakb87XY9w+aH6j3ngX3NrD7MQaSzgXckqja1xuqoIWAnx8OgLH43rGFd6B3EvW79zyqdaoTzPfr+PgVjJKSi5Ibm5uJhpkfRvzYc411kHeVGW6eFVC7auf3DBr3LcP08KUe91j8hxViW2NwVYbP+MoYoICeepx4qKYYd6NvommZmfcHGGwGE6x/IwUTzI97e416G4WEi4qFH5fuBWwGE5x/JAX7FnM7+wz7SRr7J777Ad9aHhPKfPsSBaoGmPcEoIOhh6OJGX8pBaoGl+7Uj72uuMEZDouz92KtzK33fbIS3fc4+zXce7WfsxP19xcKlIuTipMe90qtBhP4+08GhqKEoIOgCPdjrQYT8vtvBn+tgayush1olWmWah8T+DKIBWzwB5N2k3WQdQhuBi6GBW4HE/X3FQaDjIKD9wIdi8H3UazPqvdnwAH3G7T3jLQD+Dz3qBU3Bm/PBfcETAaU+3cVhwZA91EF0wb7jqwVz+gHp0cF+xb3yhWPBtf7UpR2BToG+ABsFapB95xi+5z7EQf7A/ecBVb7nAY+hwVw2EcHPocFbtj7h7T3h/cbB/D7hwXA94fVrEHPBg6gdvebr/cfr/cWrgH3HLb3kvcDA/dH978V9x/3kgcthEte+wIb98UE9wPLaSuRH/uS9xYG+AH7FhVJBvcLhDS5+w0b+xP7OQY6hgVs3PxKtveb3wf3DeHE9wqTH80GDout1LD3ubDirQH3DLb3j7QD9xYW9/et+/cG97D3QBVfYmJ5YRs6Xcbp2MXK1LunfGe3H7T3ZRXZYj37MGn3MF4Hjy4FqmVqn1QbMTlF+wH7DstJ8MK0pKurH48GkFwFrPhQBtyQBagHDqB295uv66vOqtquAfcctveTuAP3R/g/Fc73kAeNgIx+fhqAioGKgh77kfsUFev3igdKdVBsLxv3xQTjxnVSoh/7h9oG+AE8FUAG3XE9qyUb+xP7BgY6hwVw3EgHOocFb9z8H7b3m98H9Nq25KMf1KtIBoyVjJWVGpiKl4mXHs8GDoCx94uy98CxAem790ay9wm2A/ib980V+0pk9x/7WAZwclVzUhv7EUL3CPdH90bX9wX3GsG2cGOuH6imarNTrkqOGe1kJwf7H3s0+w/7URr7V+X7FPccgh4osu4HyY/Bo7e2CA6AsfjesQH1u/dIsAP34qYV+waWSfcG9z4a9zjM9wH3B5se90H8jBViW2JwVYYI+N4Hv4mzcK1lqKYYarRSrkqNCO5mJgf7IHwz+xD7URr7WOX7E/cegh4osO4H0pC9rrfACA6gdvetsvclrfGxaqwS+C73BxPs+KH5ExX8KgYT9GXdB/cJ1W5Cmh/7awZChwVt97cHJ4g+XvsVGzlk5wb3b/utBcAG+3L3r/cHltfHjvcDGdGtQwYT7IK8arNbnQj3NgYOf7b49HcB90u595a0A/d5qhX3qfcjHd33Ix33RV37Wwf7B1YFZwf3B78FOQf7B1cFZwf3B78F+70H90aI9zvT9zUaoIiZhaUeZX4FkXaLfHwa+xD7KFD7AooeDq744QGu+KYDzq4uCg6u+OEBrvimA86uLgoOrvjhAa74pgPOri4KDn+r95mrmKv3masSprL3U7KTsvdTshO99zb32hXZw8f081PDPTxTUyMiw0/aH6sEVWG74OG1tcHAtWE1NmFbVh8t+9cV9z73YXWf+0n7WQX4hvjFFfs/+2Ghd/dJ91kFE8P7E/z0FdrDx/TzU8M8PVNTIyLDT9kfqwRWYbvg4bW1wMG1YTU2YVtVHw5/qfddqvcgqfddqQHFsPcnsLWw9yewA/c9+BoVzbe64Nxfu0lIX1s6iQr4FuQV/E/7YJZ0+FT3UQX8Jvx3Fc23uuDdX7tJSF9bOYkK95ttFc23uuDdX7tJSF9bOYkKDov3AW6o9yi396ryCvewrxNu+Mn46BVrp/s/+2GhdwX7dU4VsPfBbAYTdvEdE25u3Qf7EPyY9zUK9yenChOuO68HE27bvKhaBw6LrPeLrPee8gr3w7IT3OYKE+zxHRPcnh37gPzojB0Oi/cBbqj3KLekq/cLp/cGqxL3brJ0svdjrxNdgPjt+OgVa6f7P/thoXcF++33ShUTXoCjn620ChNdgLMKcXMFTh0TfoCxmZ6jshq/Y6hQYmJ5bnQenfyx9zUK9wOnChOdgDuvBxNdgNu8qFoHDn+r9wun9war957yCve/snSyE+3mChP18R0T7Z4d+478txVOHRPumB0T7bMKDn+r9wun9warpKz3i6wS93Ky936ydLIT3b/35owdmvvbLgr7jvy3FU4dE/6YHRPdswoOf6r3m6r3nvIK9w/eChPcgOYKEygA8R0TnICeHftl/JwVp5+ks50ev3vAgF0aa2J0Yl1mpKseE0MAax0ThIB8ChNDAD0KE4SA6x1/qvebqpir9wun9warEvdusnSyud4KEyIAsfgXFU4dExwAsZmeo7Iav2OoUWFieW50HqJ0BaOfrLQKE7MgswqO/AwuCvtl/JwVp5+ks50ev3vAgF0aa2J0Yl1mpKseE0DAax0TgSB8ChNAwD0KE4Eg6x1/qvebqpir9yOo1a4S94Wyst4KE75AsfgXFWqorW/IG86+ssvMXK9JdHWGgHgfmOUF9yOu+0MGefsronsFnKCgl6gbvqlxXWBrb1xccKKpcx+O/AwuCvtl/JwVp5+ks50ev3vAgF0aa2J0Yl1mpKseE0GAax0TgkB8ChNBgD0KE4JA6x1/qvebqve5rBL3EbL3L94KE/n3EffmFbIGkPWf1OTtCKP7e2r3TAdFNm5DhPsDCFH7wy4K+2X8nBWnn6SznR6/e8CAXRprYnRiXWakqx4TRmsdE4l8ChNGPQoTiesd98uxAfertQP3q/cCFbX3XfdMsftM911h+137TGX3TAYOmQr3G/gaAfcE+AwD9x/3GxX3Nfc89zX7PKan+zX3O/c19ztwp/s1+z37Nfc9cG/3Nfs7+zX7OwUO9wHb9w6x9wzbAfea1wP3wPhpFfcVHXKce6AfZfvTFXKce6D3FR0e+zv3NRX4LrH8LgYO96r3FwH3f/cLA/d/9+sVYqdzq6qno7S1b6Nsa29zYR4O92Wx9zqxAer4LgPq+DEV+C6x/C4G+4YE+C6x/C4GDsX4uAH3D7YD9w/3zBX4AfuSBbsH+9b3dAWPB/fW93QFuwf8AfuSBQ7F+LgB+Ea2A/hx9/QV/AH3kgVbB/fW+3QFhwf71vt0BVsH+AH3kgUOi7AB6rkD6hb4LrD8Lgb3pwT4Lvs0BbYH+3vj+xm9BY8H9xm993vjBbYH/C77NAUOi7AB+F+5A+oW+C6w/C4G+C731RX8Lvc0BWAH93sz9xlZBYcH+xlZ+3szBWAH+C73NAUOi7D3pbAB96u1A/er9wEVtfdd90yw+0z3X2H7X/tMZvdMBvtM+8oV+C6w/C4GDvkGtwH3EvfwA/cS97YVtgbZ91++9xl7Hb77Gdn7XwW2Bvsr+BAFXQYO92Wx9zqxAer4LgP3E9sVtAba9xUF95ax+38G8fc6BfcZsfsDBtr3FQViBjz7FQX7lmX3fwYl+zoF+xll9wMGDvee9zUd959mHQ73OLG/sdf3NR34BWYdqvtsZh0O98uxAfhktAPq98sV+AX7XbT3g/wuBg5/svgxswH3KbT3brQD+CzdFUqjbsSelo+Qlx6ErwWHfIOJhRtrfZqtyI33R5H3EB/ks/w9BkiHBWfqB/skiPsoffsoHreIBZX3KI/3KfcmGvdzBor7DIf7RE0aDvc8t26x92i3drASjbL4mrITXPcW90sV1LrJuqcfjwYTnDq9umDVG+LF0unpT80zQVZTRWUfhwYTrMNtXsFHG0FNUTAfE1w4xk3QHhOc90L3KxXguLawwBvTtVRFSmRVSFVgqOhXHxNs+zz7BRVYX7fNzLOwwrixakGzH0lsYmRYGw6AsgHit/fTtAPi+0oVtwaH4Iq09wYaUqu8f8cb0Muw3b0fjQY2jZdothuYlI2OlB+ErwWJgYeLhxt+gJWg9x2N9yWM9yAfX/vWBvsHR098URstZMbvH/e5XwcOf7L34bL3frIB4bj35LgD95umFUROyebqvuD3DrzCdU3AH/sleEUj+wEbRPi9FayrtZ+3G+XORftcfYt+in0ful5RqVAb+yA9LvsV+wreROX3Le/3LPdz93A25PsGUlhzZGYfDvsysfn6sRL3prWOtBPQ92v7CBWEZwWHlJqJnhvkn+n3EB8T4PceX/d99yIa9wCW0MSZl4mJkx6SrwWPhHuNehsveCz7Dx8T0PsduPt/+yIa+wCBR1B9f42Ngh4OIscB2/iAA/dR+BQV+wFYmmzQq/cq/EsFswb3bvoxBWUG+1L9wYd6iXmHehmHBoach52FnAgOi7P4y78BvPiMA7wW+IymBvt4+QwFWwb7eP0MBb6YFfcO9+7Y93F7Hdf7cfcO++4FDouy+OK1Ab6708b3IMbTuwOxFvdUrQZFxE7t9zIa9zTT9w73FfcV0/sO+zT7Mk4pRVIeafdUsvsZjwfIycbr9yYa904s9x77LvsuLPse+077JsYryE0eh/sZBw77DLP5PLIS18ZbxhPg1zQVavhos/wtjwf3jfflBRPQ+4L34wWP+AOy/D5qB/eK++4FDvjrswHPufgGuwPP+wwVuflj+Ab9Y7v5i/xkBg5/svkjsQH3b7f3KLUD95v4pRXzsLy0s6luO/sATfsBNTEe91D7VxV0c3J2YhtWXrT3AB+xB/bw3vcZ9xMa6lu9S0dVVPsnHvu6B3J1cXZweaBsGJ6YnpmemwiBB/sIyk7VvrGopaYeDn+f98id98afAaX3Fve29xQD9zjPFYeRh5GTGvd0B42NjY0e+DIGjYuPjRr3TvsP9yr7K/sr+w/7KvtO+073D/sq9yvl2b/bwR5lBkddSV9FG1VZobFpH4f3nhWJiY2PH/dwB5KPlI+RHq+tvaHBG729d2mtH5GFj4ODGvt0B4eJiYceDvd9sQGe+LsDnveOFfeh+5ylpvt693AF+Hqx/HoG93r3cHGm+6H7nAUOc/i6AfetsQP3vviiFfuc+6Gmcfdw93sF/Hqx+HoH93D7e6al+5z3oQUO932xAaf4uwP41/eSFfuh95xxcPd7+3AF/Htl+HsG+3v7cKVw96H3nAUOc/i6AfetsQP3wnMV95z3oXCl+3D7ewX4emX8egf7cPd7cHH3nPuhBQ73QvdIAfdp90ID92n3QhX3QvdI+0IGDvce948B90L3kAP3wfceFfcR9xL7EfcR+xP7EQUO5q3e9wLgrAH3F7Ha89qxA/fA92QVpqSgrqxyoHBwcnZqaKR2ph/7CQTk28r3AvcAO8syMjtL+wD7AttM5B+tBElKvOXlzLzNzcxaMTFKWkkfDvcap/cwzQH3Rqn3KM0D92T3NhX3MPco+zAH+0ZvFfddBrbABfdZ+1MHVl8FDrv4cwG5+JADubvUHbuvAbn4kAP3Bd8V91D4A/dP/AMF/E5n1B2m+JAB2/hyA9um0wqm+JAB27ED9wrpFfgLB/f9+08F/CP7k9MKsPhxAbn4kAP3v7AVjwb3j/hvBY38kIkHDvhyrwG5+JAD+Hz4chX7T/wC+1D4AgVIrRX3kfxwex33j/hwBY38kAcOpviQAbX4cgO196wV+HD7kQWN+JCJBvxw+48FDqb4kAH4drED9w33rhX3/fdPBfwLB7H4TRWJBvxw+48Fhwf4cPuRBY0GDoGs+NnMAXSt+LXOA5aiFfjZ+LX82Qf812oV+O0GuMAF+Qb85QdWYAUOgaz/AFGAAP8AJ4AA+GDMAXSt+LXOA/jAohX8tfjZ+JEGJvsgNvs5XvsvCIcGcORb6VjaaHMYwjm8K68kw5IYvPdA4Pc68fcdCPcK910VZ2loZGlhCPyvBlZgBf0Q+O0HuMAF+QMHpqqnqKelCA7//++AAP8AJ4AAAYv47QP3X34V1PeW9y73iPc/9zRrqxj7PPs3+zD7lkT7gQiHBm3oWe1T3mlzGMY1vSix+wAIDnb3RgH3xLP3GLAD57wVX7Vxv9fdvO0e+EYH4XG5TEoaZ4l0gWoepoEFlaiXt7wa1HjDNMseWa+BlYCoCGv8uQaRgXGRcRsvUVZUHw6BsfjwsQH3AvgQA/engRW9Bvc59+j7OffoBVkG+zn76AX3UPvCFUf3Hz/3N9f3Nc/3IXsdz/sh1/s1P/s3R/sfBQ74dfdoAfekzQP3pPh1FagGpvceldUFYQYO+HX3aAH3XfdkA/dd+HUVqQal9x6W1QVgBvcK+2gVqAam9x6V1QVgBg74FfcPAfd0uQP38flQZR2Q1LDGxbIIDvjU9xAB99q5A/eL+BUV1bS+3DcdDviHo/c4pAH386oD95D4hxXbib20zhrOWbU7iR5yB9CpalpbbWlGHw74h6P3OKQB93WqA/f3+VwVO41ZYUgaSL1i240eowdGba27vKms0B8O+ND3HgH3Z/clA/fS+NB1HbIK+TWwAfdN93oD90340Hod+NCwAfdN93oD96z40HoK+Cz3uQH/ARCAAMID9674LBWvBp73uQVBBg6RHfjQ9x4B94f3JQP4GPlalAr40PceAfdl9yUD99D40HUd+4v3ugH/ARCAAMID99K6FWcGePu6BdUGDm4d+OreAfdA2u3aA/dn+OoVopydoqJ6nnRXCpEd+NSrAfdIrPdCrAP3wPjUFd2rTB33HR34r6X3DaUB926p86kD98BzCvcaCm4fDvjO9x4B9273jwP3bvjOjh346Ov3Kh346Jkd+2T3ZgH33LID95lBFdgdRB2zb51rlh6owwVoBg77X64B94qxA/eK+w4VbB22qba6rR9fBmduaF1YGg740PceAfdn9yUD99L40HUd+Vn1AfdP9yoD9735WZEKsgr5WfUB95v3KvcHCg75NbAB9033egP3TfjQeh35oa0B90v3fgP3c/lZLwoObh35YPcSHfc+qPdeqBf3+/lgah0TcDoKE/DsHZEd+XKvAfdO93gD9075cqQKDvjUqwH3SKz3QqwD98D41BXdq0wd9x0d+VurAfdNrAP3wPlbFUod+Ojr9yod+OiZHfll2wH3mNsD98D5ZUMK+OreAfdA2u3aA/dn+OoVopydoqJ6nnRXCvlp9wod93H5aTMK+TyrAfffswP3qPi7XR0O+dOrAfffs58dDvivpfcNpQH3bqnzqQP3wHMK9xoKbh8O+VD3CB35UJId+M73HgH3bvePA/du+M6OHflZ9QH3ZPeZA/eI+VmWHfjQsAH3Tfd6A/es+NB6CvlZrQH3S/d+A/gN+cMyCvjO9x4B9xf3jwP3yvlYFV4G3vseBa0G+2H3HhVdBt/7HgWtBg75WfUB9xf3mQP4HPlZFUj1BVoG2yEF+0T1FVoG2yEFrwYO+LbQAfeVqgP32/lhFVhxeGFhGmOadqWdmpaloniUe4iJi4qIHoyqmqaxoAgO+RzQAffLqwP3pfi1Fb2ln7a1GrN8oHF5fIBxdJ6Cmo6Oi4yNHopsfG9mdwgO+Ez3MgH4FrMD9774TBXWlcCoyhqfhJ1/nR5odwWUfpB+fhpjbXZLgx4Ohx33Kh37Ziod+1P3Ch33cftTFaCbm5+ge5t2dnx7dneae6Af9zIWoJqbn6B8m3Z2e3t2d5t7oB8O+2X3MgH307ID96dYFX5uBaiFp39sGnBEHbRuoFWWHg77ZPdmAffTsgP3kEEV2B1EHbNvnWuWHqjDBWgGDvtkqW33ZhL3y7MTYPeJQRUToLFhHajDBWgGDvtfrgH3irED94r7DhVsHbaptrqtH18GZ25oXVgaDvthsAH3i7ID99KPFWZuaV1X9yIdeqYF9zEdtae3ua0fDvtfrAH3Saz3QKwD98D7XxXdqs++kR9qBmCFcGBWG1ZwtraFH2oG4R0O+zSvAfdN93gD+DH7EKoK+OrS2aylCvdx+OpgCvtW9ykV93is+3gGDvlp0sWspQr3TvnqFfd4rPt4Bq77NjUdDvjq0rTtpQr3lflaFa8G6+0FVwb7CPtmYAoO+WnSrPWlCveb+dEVsgb3AfUFVQb7HPtmNR0O+OrStKqlCves+VoVswbo7QVkBkNIBYcGQ84FZAat+2ZgCg75adKsraUK93H5aTUdifdmMgr46tK07aUK95v5vBVXBuspBa8Gr/sEFZ+am5+ffH0K+zIWn5ubn597mnd3fHx3d5p7nx8O+WnSrPWlCveH+juEHfkRvAH3WffEA/dZ+NAVrwbMQgplBuxaFawG9xod+Zb1Jq0S91H3yRNg+A/5lhWsBhOg4fUFWwYTYPuZ+zs2Cg75EfctHfdZ96gTYPdZ+NAVrwbMQgplBhOg9wfJFVwG5vcPCvmW9SatEvdR95sToPgQ+gD3CwoTYPubTjYKDvker8aoAfhQsQP3WfjQFa8GzEIKZQb3DoUdb4EeDvmbrcaqAfhPsQP4JvmJTgr5E/ccCvdHp/dOpxO491H4ztoKQq8VjQr5m62vq5jdChO491H5WTYKQt0dE/iunl68aQoTuGh4uFqVCvcGCveg+S8VrQbh9wIFXQZh+117Cg73Nh33nfmzFawG6uwFWgZf+00VuQpsBksdDvcGCveW+Z0VXQbh+wIFrQZrMHsKDvc2HfeU+hQVWgbqKgWsBmgzFbkKbAZLHQ741Kr3TagB90mq9rGqqgP3wPjUewp17hWxl7Sduhq6Xfc7Cof3LB1+bBp0d35ugh4O+VuLCqb7BRW5CmwGSx0O+NSq7vcvHfdHp/dOpxO498D41BXdqMYKkahX3Rv7DfcWFacGjQr5W6rwq5zdChPY98D5WxW5CmwGSx0T+PsO9xgVqAapj5ueoBsT2PciCm4GbYZ8eHUbE/j3IQoO+ROqpqoS91WqF/dR+M7aChNgn6YV0au3tZAfbAZshnNzXBtcc6Oqhh9sBmGQq1/RGw75m62mqhL3T6oX91H5WTYKE2CfphXTrre1kR9sBmyDdHNYG1h0o6qDH2wGYZGuX9MbDvi492IB96GwA/e9+Lj3Agr4r/cybakS94SzE6D32PivFRNgl6gFb5Fvl6oaprCawpMehakFSoNOclcaE6BiqHbCgB4ODg4ODlYKAXX5GANyCvkYt/YKUgoBdfkYA/ceHfkY4fYK/CQcBXhfCvwkFbccBXhfBg78JBwFeIkdHAV4NQYOVgr3Fx33qhX3Grf7Ggb3XF8V9xq3+xoG91xfFfcat/saBg5SCvcXHfeVFfca4fsaBvdcNRX3GuH7Ggb3XDUV9xrh+xoGDvsl93JfCvslFbf3cl8G9wMEt/dyXwb3AwS393JfBg77Jfdy9wP3cvcD93JlCveV+yUV4fdyNQb3AwTh93I1BvcDBOH3cjUGDlYK7R33qvcnHfcqX/cnHfcqX/cnHfcqX/cnHQ5SCu0d95X3KAr3KjX3KAr3KjX3KAr3KjX3KAoO+z33UMn3UMn3UMn3UF8K+z0Vt/dQXwbJBLf3UF8GyQS391BfBskEt/dQXwYO+z33UMn3UMn3UMn3UGUK95X7PRXh91A1BskE4fdQNQbJBOH3UDUGyQTh91A1Bg73OB38JBW3+Tr3wLf3BApSCl8K/CQVt/kl98Dh9wQK96q3iR31HfwBBg73leGJHdgK/AEGDoId98D9Orf5ZvcECogd+Xv3BAqCCver/Trh+Wb8AQYOgwrZHfl7/AEGDvc4HfeqFffst/cqCgYOUgpfCveVFffs4egdBg7eHfeV96oV+AG35woGDuAd95X3lRX4AeH3LQoGDoId9+z5ZusKUgrMCveVFffs+XvPCoIK+AH5ZvcZCoMK+AH5e7gK9zgd/CQVt/k698C39yoKBg5SCl8K/CQVt/kl98Dh6B0GDsoKE8D3lfeqFROgoP06t/k698C3BhPA5woGDsoKE8D3lfwkFeH1HQYToPvA9xkd96q3iR31HecKBg5SCn8KE8D3lfeVFROgoP0lt/kl98DhBhPA9y0KBg5SCn8KE8D3lfwkFeHYCgYToOgd/SUGE8B2Bg73leGJHdgK9y0KBg6CHffA/Tq3HAV46wqIHRwFeM8Kkwr3wP06t/k6BhPAoPlm9xkKkwoTwPer/Trh+WYGE6B29zgKggr3q/064RwFePcZClIKlB33wP0lt/klBhPAoPl7uApSCpQdE8DZHfl7BhOgduoKgwrZHRwFeLgKgh33wP06t/k698C39gqnHQcToKD77AcOrAr77AcTYHb7wAcOiB35JffA4fYKggr3q/064fUd9gp4HROg9x4d2R0GE2D1HfurBxOgoPwBBw6sHfwBBxNgdvurBw6DCtkd2Ar2CoId+Ri3+8D3OAp4ClYKE6D3Hh337AYTYKD3wLf3KgoHE6D9JfvABw54ClYKE2ByCvfABhOgdvfs4egdBxNg/Tr7wAcOUgrMCveVFfkY4fvA6gqCCvkYt/ur+Tr3GQp4HROg9x4d+AEGE2Cgogp4HRNgcgr3qwYToHb4AeH3LQoH9wMdgwr5GOH7q/kluAqCHffA/Tq3+Tr3wLf7wPc4Cqcd+TpfBxOg/SX7wAcOrAroHQcTYP06+8AHDogd+SX3wOH7wOoKkwr3wP06t/k698C3BhPA+6v5OvcZCpMKE8D3q/064fUdBhOg+8D3OAqCCver/Trh9R37q/k69xkK1AoTkO8d+SUGE6CgBhNgoKIKxR0GE6B2BxOQoP0lt/kl98DhBhOg9y0KBvcDHfeV4Uq3lB3ZHQYTYPUd+6sHE6CgBxOQduoKxR39OuEGE6DYCgcTkOgd/SUGE6B2BhNgdvurBw5SCpQd98D9Jbf5JffA4QYTwPur+SW4ClIKlB0TwNkd2AoGE6D7wOoKeB0ToPceHdkdBhNg+TqiCqwd9y0KB/cDHYMK2R3YCvur+SW4ClYK9zMd96oV9yq3+yoG98BfFfcqt/sqBg5SCvczHfeVFfcq4fsqBvfANRX3KuH7KgYOQPmCXwpAFbf3jl8G944Et/eOXwYOQPeOZQr3lUAV4feONQb3jgTh9441Bg5IHQF1+RgDdffWFfkYtv0YBvsWBPkYtvYK/CQcBXigHRwFeGAG4hz6iPIdDq0K9wQK96q3oB35Orf9Orb5OveVt/vsBmAGDvd/tre2oB35ZvfstvwXBuL9kRW2+Q/3lbZzHX0d98D9D7f5kfcECncd99b8JBW2+Wb8F1/3lf06tvk6twYOcAp199YV9+z9Zrb5kfwXBvsWBOUdDkgdXwr3fxX37PMd+8D5D18GDncd93/3qhX4F7f7lfk69ycKBg5wCvd/938V+Be2++z5ZmAG4v06twoOfR337PmRX/0Pcx13HXIK+Bf5ZrcdcAp1938V+Bf5kWD9ZvvsBrcEuB0OrQr7wPkPXwYOdx331vwkFbb5OveVt/uV+TpgBjQc+ojyHQ73f7a3tqAdHAV4YAbi/Tq3Chz6iAS2+Q/3lbZzHX0d98D9D7ccBXhf/Q9zHXcdcgr3lf06thwFeGD9OvuVBvfs/WbyHQ5wCvfW/CTyHfvs/ZEV5R23BLgdDkgdzAr3fxX3wP0Pt/kP98C2/RgGtwT5GLb2Cncdcgr3lf06tvk6t/06tvk695W39gpwCnX3fxXlHffs/ToVtvkP95W2+8AG++y3FfkYtvYKSB3MCvfWFfkYtvvA+Q9f/Q/7wAb7FgT5GLb2Cncdcgr5GLf7lfk6tx1wCnX31hW4HffsYLcK++z9kRX5GLb2Cn0d98D9D7f5D/fA8x37wPkPX/0Pcx13HXIK95X9Orb5Orf9Orb5OveVt/uV+Tq3HXAKdffWFbgd+xYE5R337Le3Chz6iAS2+Q/3lbZzHfc4HfwkFbf4JAb3LfcR9xH3LR6ht3UG+0b7JPsk+0YfDr4K99YW90b7JPck+0YedV+hBvct9xH7EfstH/wktwcOvgr31vp8FV/8JAb7LfsR+xH7LR51X6EG90b3JPck90YfDvc4HfjsFftG9yT7JPdGHqG3dQb7LfsR9xH3LR/4JF8HDtUddftGFV+3B/js+nwFt18HDtUdofnKFV9fBvjs/nwFt7cGDtUdofnKFV9fBve0/HL7tPxyBV+3B/eq+GX3qvxlBbe3Bvu0+HL3tPhyBbdfB/uq/GUFDlYKAXX37AN19yYK96r5Zl8K96oVt/lmXwYOVgoB96r37AP3qvcmCvwk+WZfCvwkFbf5Zl8GDlIKAXX37AN19yYd96r5ZmUK95X3qhXh+WY1Bg5SCgH3qvfsA/eq9yYd/CT5Zokd+WY1Bg5WCgF1+RgDcgr3wHb37OH77HZzHfwkHAV4fwoTwPeV/CQV4flmBhOgdvcZHVYKAXX5GAP3Hh337KD3wLf7wKD3BAr8JBwFeH8KE8D3lfeqFROgoP06t/k6BhPAoPlmNQYO98D4iAGL+OwD98AE+Oz4iPYd+1z3EXcK9xH2Hftc9453CveO9h37XPgLdwr4C/Yd+1z4iHcK+Ij2Hftc+QV3CvkF9h37XPmCdwr5gvYd+1z5/3cK+f/2Hftc+nx3Cvp89h2bCvihvB34ofp8/KEGDpsK+Fa8HfhW+nz8VgYOmwr4C7wd+Av6fPwLBg6bCvfAvB33wPp8cx2bCvd1vB33dfp8+3UGDpsK9yq8Hfcq+nz7KgYOmwrWvB3W+nxABg77XPp89wcd+nxzHZsKqbwdqQZtvQX3wFnmHfjs/IjICscKDpsKqbwdqQZtvQX3KlkVqQb7SPfABVkH98D7juYd+Fb8iBWpBvx0+bQFWQf47P2CyAr3AQrHCvfA9xYKDpsKqbwdqQZtvQXWWRWpBiL3QwVZB/cq+xEVqQb7SPfABVkH93X7jhWpBvuT+D0FWQf3wPwL5h34C/yIFakG/Cn5NwVZB/hW/QUVqQb8dPm0BVkH+KH9ghWpBvy/+jEFWQf47P3/yAr9/xW9B/yD+c0FbQb4ofcBCv0FFb0H++340wVtBvgLxwr3wPwLFb0H+1f32QVtBvd19xYK9yr7ERW9B17WBW0GDvk39xEBi/jsA/k3BPjs9xH2HasK+KHWA/ih+1wV1vp8QAYO+1z4iAGL98C8HffA7Ar7XPiI9wcd7Ar3wPiIAYv3wAP3wAT3wOwKmwr3wLsd+Ij7wOwK9wUd+bQE/Ij3wPiIBxOg/IgE/Ij3wPiIBw6bCvfAvB33wPiI98D4iPYdqwr3wPfAA/fABPfA/Ij3wPp89h33wPiIAffA98AD98D3wBX3wOwK9wUd+1wE98D4iPvABhOg98AW98DsCqsK98D3wLsd+nz7wPyIcx1/l/h0l9qXw5eTl7uXBvt5lwd/l/h6l9eXv5eRl7eXCPttlwkeoGJfDAmLDAuzCrsLswwMuwwN+OwUxxMBEwIAAQAxAGQAhwCoAM8BEwFhAXQBjAHhAfICPAJyAnsCmAKqAxcDLwNDA2oDkQOaA6ADrAOwA80D4AQgBFgEbwS2BPoFAwUJBRYFKQU0BUcFWgVeBWoFkAWlBdEF9QYLBi0GSAZNBm4GcgaGBowGkgaWBqYGrga9BsIGxQbvBvUHMgc3B1UHXgdqB3AHdAd5B4AHiAeOB54H4Af4CAQIRQhlCGwIcwh5CH4IngijCLAIuwjCCMYI/gkDCRYJIwkvCUIJRgl6CX4JgwmJCZIJlwmdCa8JtAnNCfoKJgo2Cl8KcAqZCqYKrwrFCs4K2ArbCuQLCQsMCx8LLgsyCz0LRQtmC3QLeguDC5ELowurC7MLtwvVC94L5gvuC/QMCgwZDCUMKwwyDEwMXAxrDHoMfgyLDJYMnQykDKsMsgzKDOIM5wzwDPYM/A0BDQYNCg0XDS0NOg1HDU0NUg1bDV8NZQ14DX0NjQ2hDawNvg3DDcoN1g3eDeQN6Q37DgQODQ4WDh8OKA4vDjQOOA4/DkUOTw5aDmAOZg5rDm8OdA54DogOkA6aDqMOpw6vDrYOvA7CDsYO1Q7kDvEO9g76DwcPFQ8ZDycPLw84D0EPSg9TD1wPYg9oD20Pcg9/D4wPmQ+mD7MPuA+/D8YPzQ/SD9cP3A/oD+0P+RAFEBEQFxAhECoQMhA6EEEQRxBNEFMQWRBeEGMQbhB5EIQQjxCaEKUQsBC7EL8QxBDJEM73BveDFfcN3Ojwvb13WMEe+58HU1ZTa1MbIEvg9xMfXBb7NuEy9xLOybK3tR6NBgsVtfcPpdmj0KLcGY8GojqiRqY9tfsPGOT7nRW8Bvt8+ScFXQb7fP0nBbkG2fd2BfeZBg776wZASVlpRxssY7/2H/e5X/u/B/sWwkz3CdjHt8i/Ho8GC/uYdPsAWCAauI0V2Nq594ihHvsuB1JHS21OG0pKptAfC+T3ixX7XPBQ9wL3A+/G91we+DBg/CsH+z49VzEzPr/3Ph74K10HC8b33xX7ZvcD+xn3OODNqrezHveZ+1lk9yz7YQdrbFV5URv7JDX3CvdL90vm9wf3JdG4bWasH6apBbBpVbU0G/s+pgoLuQPeyxVixNto7hv3EtPK09BasfsqsB8oo0ypuRq4rbX2zMF2a7Ueo6sFrV1BpEsb+xVQUUVL3GD3AHEf9yFpqmtfGlhYXygoTaa2Vx4LhlQFiQa1W1qkTxv7DCAp+y8fC/cTFvgks/v297b3trP7tveN9+yz/BoGCwP3DxbCBub30JaxlLGVshmOBpVkk2WVZen70BjDBvX5KAVhBkf8V4RWg1aFVhmHBnzAe8B9wDf3qxhhBjn7q3xWe1d7VRmJBoXBgr+FwET4VxhgBgvn9wwVMNxi4dLVs7fDHo0GCxWnn6SynR6/e8CAXRprYnRiXWekqx4T2PXnFVqYX5yuGqeloLa5pHVvc352aXgeE+T7JC4VXbpi1M7AdgoT2D0KE+RoemtyYhoO93X3SBX7B7M+9xe5xZedth5/rQV7ZWOCWBshcMPoH/ee95Sx+5T3H2YHhfsf+yaHBWn3JQcLpaCdqah2nnELFfc/92F1n/tJ+1kF+Ib4xRX7P/thoXf3SfdZBQsV1tPECkMFswYr9QVhBishBQuLtPgatJN3Epb41hOw9xsWxAbV97gFE9CYvJS5lbcIjwaXXJRfll3X+7oYxAYTsPcO+HQFXwY/+8uBX4FigWAZhwaAtoG0gLcIE9A+98MFWgY++8OAX4FigGAZhwaDtoG0gLcIE7A+98sFXAYL9y8Kob8avVShSY2FCql8bBpvcHxngB4LFUBDBYcGQNMFYwbrIQW1Buv1BQ4VoJuZoaJ7mXZ2fH10dZp9oB/3MhagmpmhonyZdnZ7fXR1m32gHw73UflhFZR9kH9+GmRudk6DHp9qZZZhG/skJfsX+2T7ZfH7G/ckHwtxdnhubaB5pQsVOh1jBgtkCnB3eG5tn3mmHw41Ch8O8pnNx/Qa9xI1u/sXHvtQ/Se598P3IAb3RvvDBQticsNWG150XF73EQqtj5uioBsLFTUKLQof+wn4DxW19w+l2aPQotwZjwaiOqJGpj21+w8Y9x77nRX7fPknBV0G+3z9JwW5Btn3dgX3mQbX+3YFDhVOHRPwsZmfo7IawGOnUGFieW50HqJ0BaOfrJmkG7ifdmxobnBKH28HE+jUr3diYm16YGJo9zkdopmporIauF6uTFFaaV1ppHeoeh6HBwsB9zu092SwA/c7+DcVItNN47yum5unHnunBXtxboBnG0Nav9aIH/eGBo2TjJSUGudYwzc+QUwjHrShFdGSvbXBG8axZEIfCxWypae4uLJtTpIebGtwgWsbWHemsR9s+1oVfKKjfrAb3M7B9xTmTr9HSl5fVFarYNKwq5mjqB8qhlxkUhtvdpaYeR8OkEQFsfh0ZgYLtR1l8B0L2XsdzD0FrwY39wYFCxWhnZukonmbdXV5e3RynXuhHw5sCmZ8VIMekW0FC5N4do9xGyk6QyhRpWKqch+HBwv7e6/3VrV2dvcurveTsHOjc68Lf1AKC9kKXlUbVXC4t4UfCxXawsf081TDPDxUUyMiwk/aH6sEVWK74OG0tcHBtGE1NmJbVR8O9zcWuPfABvcBzdS02xuxnYZ/rh8L/TsV+wo79wv3S/dK2/cH9wr3Ctv7B/tK+0s7+wv7Ch8T9DQKE/hwHRP0dQr7CyAp+y8fuhb3Ddzo8L29d1jBHvufB1NWU2tTGyBL4PcTHwsTyEoKE6iXsgUTyGIdE5iG9woFZQYLFbGUtJ65GrpcnVCOHoZsBbuJpIFtGnR0f2+EHvtfQDYKDgPTFvhasvwXBvgM+DYFovwnZffkB/wM/DYFC1oKf3cLFbqfq7m8GrJ6n3B5eX5zdZ2BnY6Oi4yOHopldG9qfQgO95XhC5AuBbD4XQazlryjxxqfhJ1/nR4O8MQKJgULf7GGUR0L96q3C5Ud90YWoR16eHR0nHmiHw6z97az942zC2Vxd2lsGmOlcqN/HocHC7KFUR0LXx0O7PhOFfeF/HkGM25P+wRiYJibax55aAV5r719uBv3I7jV9wof+Jn7sQcLf7X467ULi7L3uaz3k7IB8bn397sD8Rb3LAb3Xev3GPdc91sr9xT7Xh/7K/u6Bj6HBW7YB7n7uRX3ufc4rPs495PTHU0d96oLFZ+bm5+fe5p3d3x8d3eae58f9zIWn5qbn598fQoL+wYVNQotCh8L+3mw91Sy+DKyf3cLf7L4PrILFS0KCwFSCgMLs4R2+HR3C1QKsQYsgQoLk8ikvxoLG7qgsrGOH24GbYd7fHYbCxX7XvcB+xj3Lvcu9wH3GPde9177AfcU+y77LvsB+xT7Xh6uFvdJ5vcL9x33Heb7C/tJ+0kw+w77HfsdMPcO90keC7kD5Ba599733vveufknXfu1+973tV0GCxV/bgWnhad/bBpwC9YWtvf+Bseqp6m3G7miZkMf++uz9/4Hx6unqbYbuqJmQx/767b38AfrZbtJVm1sVWgexH5tp1YbVm5tXG8fiQYLFexlz0nHHnFzBcpRok06Gjt0TUxRHqVzBc3Hsc/rGg73qPlSMQoLSB0BSB0DC20Fy2gKC3X3qhUL+K8Vuq6uvr9orlxcaGhXWK5ouh+lBG50o6+woqOoqAtnCmQGDsWYsqnBGp+EnH+dHg6wvbRtomiZHo8HCwGL+Oy7HQtWHRIL95Cu956sAfcotfdwtQP3KPg3FSHRTt3e0Mj19UbIODlFTiEetRbZuMPMzLhTPTxeVkpKXsDaHg6ICmUGDhXdqs++ke4KVHC3t4UfbAbhHQv7JC4VXbpi1M3BdgoLmnd3e3x3d5t7nx8LFXObfZ+fm5mjonuZd3d7fXQeDhJWHQsH+0l2L1cqGjjHYNC+xbCwqh6PBpBNBasG+6H3BhXTzbX3OKIe+ycHVl5acGMbUWWsxB8O9x4FC94dcgoL4B33Hh0L9zkKkJefoRsL6QrCiQuQLgWwBgur9wun9warEvf5snOyE+j3RAsVs0EKCza3XM4fqQRfba3Py6mut7apaEtHbWlgHwv4u64B906090+0A/dO95gVtPd7BrOzp5+zG8OibUwf+1q0918H3We0QVpocQuq9zupAfdPqvWxA/ev+bEVsZW0nbkau1ydUI0ehm0Fu4ikgW0adHSAb4MeC/cZ5QrNPQWuBjj3BgVkBgupkJqaoRsT+K6dXrwbuaGysY0fbwZthnx8dRsTuGh5uFobXXVkZYkfDqvtqvcYqwH3RrH3N7ED92wLA/cPFrj3HAb3H/cX92X7nwW+Bvt597r3WfdOBVQG+8j7tQWH+KReBgv3RRainJ2ionr3IAoOFbMGL/UFUQYOFaR29yL3NwW1B/si9zdydPcS+zUFC/eqt8kK96oVCxVVBjD7HgWwBg6mHQ7KYXb46MqLdwv8Trf4TvcDsfsD8wfQo7O/nZ6HgZ8el68FlXVykXQbP2BaLB8LUB0O98uxAer4LgPq98sV+C6x/C4GDqv3masB9zqy91KyA/fAC6sKiwtpb8NbG1p59zoKCxX3d6/7dwYL6LPJ2PcDGslzs11sbnhiY6R4rpKTjI2THogzYlU7ZAgOq/cjqNWuAfgPsgP3RAtmChLitwt/tfeTsvfFtQv3q7fnCgcToP0l+6sHDpaYmh57pgWBfX+HehtxcpyuCxX3eK/7eAYLAfdO0uHSAwuAHR8L+ysVzd2+zXsdh0MFPwev91QVaQb7OvtdBXf3OAcL9wUKiGsFwaQd9wwdEvc3uAsV+3hn93gGDvtc+nwBC3gKVgoTYHIK98D9OrcGE6D5JffA4QtIHV8K/CQVt/kP98DzHQus94usAff8sgP3UguxHRL0uAupj5uaoBsL3fdlex2HKQX7Na/3x1gHWfsSbTUFhwZs4Qv40PceAfeI9yUD+Bn3IB0O1K93YmJsemBjZ6Kpdx8LmaQbuJ52bGhvcEofbwcLoOkdCxWT9zAFvWUHjvtiBQ4V98C2+5X5D2AGCzX9JfurBg7TrsK4kR8LEue499e3C1drbmBlGgsfRUxFb1Ib+1T7hRVmtb5y0hv3HfcS6QsFtQf7GIiO9y0FYQaO+y37GI4FYQf3GAtWCk0dC6kGr4+Yn6AbC/cl9y0dC4uz+NezC7X5CXcL8B1lBg57HdYLWR33BPce9B28sxO+C7+6kR9sBmiFcGpWG1ZwrK6FH2wGXAv8iBW9B/ui+FYFbQYLFb0H/M76SgVtBvjsC38KE6B1C1YKfwoLFa0G34EKXQYLTR11C7SkUsAbC/d2vAHb+EwD2/d2FfhMvPxMBg5f/SVzHXId2PcSHeS5rqj3Xqixtgv3nwfHx8mnvRv3Crkz+wr7FkAxC/c3HaJsbG50YR4OFY0G+HD3kQWPB/xw948FiQYOeB1KtwvXCgH3CbkL+CX5vBVph3t1dhsLdvfDsfersgv5Jfer4QsGX4VwCxWvBtTQex3URgWvBjDvBWMGC6wB95yxA/ecC8cB972xA/e9C6sS90ao906oC7BzsfcfsXGxC9YB95zTA/ecCxLOuvgIugsS9xEdC/c6Cg6jhh1zlR0LoEkdv6oL9+EVrwbM2XsdC/cz9+YVsPfBbAYL+6v5OjULhucFZQYLHodrBQv5Jc8KX/06cx34iHMdrp5euxu6oLKxjh9uBm2HCx9s2QpfVBsL+1h292Gy+D6yC3/3Oh0B96O3C6CxHQuobscS9zOwCxLOuvfkuAsB96m5AwtuoHilHwv9GAYOkMEFjQZju8txvBv3CvQL/YIVvQf8OPlQBW0G+FYLFZT3MAW9ZQeN+2IFDnb4WLML++wGDhW7mLn3Hx1UoEmOHgv41KrHpwH3Sar3RKoDCwPJHQuuAcez9xm093qyA/izC/c7HQH3ArkLqHaecXF2eG4LFVwG4SEFrAYLAfeE9wwD94QLtfjrtQH3A7kLFVIGLiEFtAYL+wMFrAYO4fcS9xMLiB+oBgt2+Sd3C/s7H2QHE/T3RthPMwv3EAH3crn3NrkD9yMLFWC30Vz3Axv3DuzRC/uOFb0H+wz3XAVtBgv3OrMVjwfDt6m93hoLRx1jBgs1/Tr7qwYOonNmZ3RzC6hzqqqoowuq9ysdC6BUlh4OraGtEgsGMO8FYwYTYJ+mFQuedJUdC2h3vFwbXHZgZYgfC66fWrsbuaG2sY4fC/uO+nwB96yzA/esC5YKEue3C0BTKStNs7VhHw73qhX37Lf3BApg/Tpf+TpgCxX3BeH7BQYLBiyBCmQGC/vA+TpfC/eDFfszC/tfrvcwC/ur+SU1CwH3KrcLFbuYugsS97+3E7D367IVC56lG6eYdWAf+3YLFbNvom1tb3RjHgv7NPn6AfcG+AgDC6wb2NHL9wDuXsoLFatv9z/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+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'); | ||
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/A0cDZAOLA64DswPNA9cEDQQZBCkELQQ6BIIEmQThBOwFdAWBBYoFzQYJBgwGEQZOBmIGaQZ+BpMGogapBrIGzgbhBvYHUgdmB2sHcwd7B4AHigfSB+UH6QfwB/kIAAgKCBMIXwhiCG0IdAh7CIEImgi0CLoI5gj2CP0JAwkLCR4JJAkwCTUJOwl7CZsJuwnSCdoJ5wnsCfAKDgoZCh8KLQpVCmIKbAqACowKlQqyCsUKzQrUCtoLBAsRCx0LKgs5C0sLVQuBC4YLiwuUC5wLvAvmC/0MDAwyDDcMPgxEDEgMTwxaDH4MkQykDLMMuQzADMUMzgzvDPcNCA0bDSgNLQ02DUcNWQ1kDWwNdQ2CDY8NrQ2zDc0N0Q3hDeYN8g3+DgMOCw4SDhkOIA47DlYObg59DoMOiA6fDqoOtQ66DsAOxw7ODtMO6g8ADwUPDQ8TDxgPJg87Dz8PVQ9rD3gPfg+LD5UPmQ+dD6QPqw+yD7gPuw/AD8oP0Q/lD/cP+hABEA0QGRAgECgQLhA0ED8QUhBWEF0QYxBsEHMQehCBEIYQmBCcEKEQphCxELYQxxDYEOcQ6xD0EQQRChESERoRIhEnES4RNBE4ET4RTRFSEVcRZRFzEYERhhGMEZARlxGgEakRrxG0EbkRxhHLEdgR4hHpEfAR9xH+EgUSChIPEhQSIBIsEjUSPBJIElASXBJoEnQSgBKEEogSkBKYEqASphKsErESthK7EsYSyxLWEt8S5BLowveMFfs49w0r9y7N1aGvwx5b4wV1X2R/XhtCTqrVgR/34gaNl4+mpRr3Gzvy+y37GPsSKfs2HvcpwRXLmLmpwBvOqWVTHwvrCvcv9vcU92n3aCD3D/sv+y8g+w77aftp9vsU9y8f9xMER2De9xf3FrbZz8+2PfsW+xdgOEcfC5ZTBfcM97AG9yw20/sfNjxvZEcevysFp8O6nbsbzq1wXpAfRh0LX2lxfmYbVHqpzR/3s/sn+8YH+xG7PvcF0r+svbcejwYLhaClh6gb9xHGy/cRux/3WPiJBfsfBkL7aXxaelh+WhmHBnu/e715ujj3aRj7Jgb3a/x3gXEFZHtscVIbfn6Nj34fC73dFU3R5WvjG/c25un3AOdVwDWrHzytBUyiX5mzGrCsocTDtHhquB7W6AXDUDypPBv7ISk1+wAszVPUcB/fZwXKc7F+YhpkbXNHUk6ns1oeC8DLFWHK5mnkG/cz4NHl4TawKaUfRZ1SmqkapKOZyb+7d3C4Hs3jBaxXQa4zG/siNEwvPOVh4nMf23XAem0acW97SElSoq9SHgvpFvhM9xD7ufcq94T3D/uE9xf3r/cQ/EIGC/dATRWdlZqkmx6HnaGJrxvJBsSphGtpVHA8PVufsB/7DHUVMutl9xX3SPcH1vPkRK/7Fh4LA+EW9zsGpvc5lc+PtY+vGY8GkVaRXJJdp/s5GPc+Btj4hAX7GgZt+3qEWolbhFkZhwaEvYO7grxq9zgYJAZs+ziBXIRZhVkZiAaEvYi7hLxt93oY+yQGCzgK7fc7cB0TriAKE142ChNuMh0TrkwKE14LUmJlVVW0aMQLKx0fC9UW+Fj3EPss+Cj3LPcQ/Fj7EPcs/Cj7LAYLFcO0rsHBYvcqHRX3NvdbWLr7TvtBBfh/+J8V+zb7W75b9073QgULLwZRcZamm5KUmpYfhKSiiJ8b9wflv/cGpYCkf5of8Pb7XQYLN8pJ78vJqbG9Ho8GC39YBYcGt2NenlkbC2EKzfc7dR33OvcVUfcgE/YgKB0T9MAwHRPtQJNzb49tG/sEJ077C1GoXq9zH4cHE/TAaHNzZ2oaYaJxpnoehwcT9iBYcnFpYxoT7UBBHQvp9x33HvcdC9aRy6jQGsBervsPjh56QgXEh6GAeBp5d4Rzhh4L9zr5BRWSf5N7eRpkdH1ngx6fZ2KWXhv7LyD7Dvtp+2n2+xT3Lx8LRfw0Bj1tYE1NbrbZHs4K/CUH+z3aLfcz9zLX6fc9HvfvBwv3N/emC9h94oTTHo8Gw/si9x772QX3Kvkg+yH7ewYLdvcv9wf3ovcEC14K9xRMylPDU/dSHRN4wM4dE7jAMR0TeMAiHRO4wLgKE3TAucyNChN4wLpKBeUGO/cU9zAdCxVhHVwK91qiClwKDvcnE3yAUh0TvID72gcjHQt/RgoLBsDq3x0sBfYGJ7sKCxVouruEtBvUx7TGsHilXJgfE/CzmZmgrxrAVq9JVVt5c20etU0Fl5+jmKEbpJmAe3N0g2UfVAcT6L6hf3R3eIJ0b2qZmnYfDvd9994VYmqnwcCsp7S0rm9WVWhvYh8LAfco7vcW4wP3KPg8FfsB2EzvtLyZo7AeaMgFfXFyhHEbXmaeuoEf92kGjJOOm50a5FnRJjc5SCEe7q4VtZKonK0btpxyaR8L9xD3KvcP9xf3EAt/8fhb8RLI9xMn9xX3QvcN+wH3HRPk91D3RxW0pa2vpR7macl4URpWYnFQSlmswx4T2Pcv91MVQaRXpL8avLCjusWralpqe2xrbh4T5Puu+2QVJOZE9yf3L+HX7+FXukisHo8HE9i9q7S7xhr0OtD7E/sSMUj7AEizXcBmHocHE+RJa1VdPRoO9zod7/c7BSAGVvcGHft/fS9T+wMaCxWgmJehnaGBZ5MegHx7hHwbc36Wnx8v+0sVcqive7cb9sTa5O5T0C1DVllNTbJrx6ullZygH1+GeGlYG3N4k5l6Hw5ZChK69yn3TfcnE9w0ChPsKwoT3GJUlqVcH/c790MVUWO53R8T7N69ub2qpoJzph77RAcT3Ghwb35rGw4sHQ4V9j8dCxVouriEuBvYxLzIHxP4yGCvSX14iYeBHhO4j64F9xnj+2kGE/h9+zW2bgWWnZiQnxuknn9zdHd/c/c4HQ4/mS+SRh6HBlP3I/se99kF+yoGCzgd+2L3HgsV2wpWyAX7BQbr+wwF9yQG6/cMBQ5rg3p1XxtfeqGrgx9IBkOStlvhGwuvpaatrnHNHWhppXCvHwv3e/ceOQoL+KH4hBX7JwYL0Rb4a/cH+6AG95j3wwXZ/EP7B/d4B/uY+8IFC6n3DwWYbnSSXxs8QmQ6Wh+IBgv833sdE/Q2HRP4fAoT9MububLPUQr3kNr3TN0B9y7v6vMD9y738xVVtV7Kr66co6gejQaSagXg904G8la7NVZXeXFfHrBIBZ2sqpamG66ee3CNH/sdflFlRRrvlBWio53SlB5WB3t7d4F2G3R8lZ4fDvdUCmkbaXufpYUfOgZEk7Va4hsLfx3qkAv3BPTs6fcEC34d/CQV9x4LNB12HQsVxLSuwcFisVILqR33f/g9FciopqidoIV9nB77Fgd2e3mFdxtnc6bJHyCKFSDDSt6rr5yioh6NBpNrBd/33TsGgmoFiAancW2YaxtARkr7AB8OFUdpwuHhrcLPz61UNTVpVEcfC39NCgvEHfsPlAoLtKips7NuqWIL93v3HnYdC2dxcGlopXCvHwsB96r3JwM/CguL9wv3StL3NfcLAdL3KPdU9ysD0hb3Tgb3SPcR9Pd093T7Ee77UB/7RvusBkaGBUnQB/co+0oV90r20iD3NaAH8NFb+zD7MEVVJh8OUAoOFfYGwerfHfdBCgv3e/cefgoL908dqEoKC/cRL80KCxWsxq3JjQqFKLsd+wz7XAVY9zRO6ci+Bw4mtlDVw7OzyMJlr1aEhIqJhB6Qy7C30asIC3b4GPcMC/jT5mXlEvcV9+oToPcV+NMV1gYTYKsdE6DMChNgmR0ToKsKE2D3Hx0ToI0dE32Azh0TvYAxHRN9gCIdC8gK90v3JwuWRAX3DAux9yv3cvcrC/d2Fvco+KT3V/cQ/K77EPdXBgtnCr1spAsSv/cMKPce+xj3CAsBNB0DC4YellAFCxX7Y/cV+xP3LPcs9xX3E/dj92P7FfcP+yz7LPsV+w/7Yx7LFvc44vX3FvcW4iH7OPs4NPsB+xb7FjT3Afc4HgsV9GPWR9UePFsFwUyoRUIaQW5FVUwe2lsFz9Wz1vUaDhXaorjC1xrJca5eZ25yaGSpdqwejI2LjBtlcHVZex4OFUdg3vcX9xa22c/Ptj37FvsXYDhHHwv3Dx1G9zcVC48eekEFxIihgHgaeAs5Cvd7C1t3HQv3BAYTwJD0mszX4QjD+5w0BxOg9yYGUzxvU4UxCA7Im7ixzhqsfPcjCk0Kzfc7CxWSgJN6eRpXYINliR4L97b4K/tV91US987wE6D3hfe2FfcIwMXg9wEaE2CsCsGRkoyNkvdUHbwKdKmwhR9KBvcKCguAmdUd9xAd0BoLFeoGvcaNCr1QBeoGO/cDBfsaBgvZtHVLS2JqPR9DBgt3rLWGHzkGOgvMkL6ixhq3Zqz7Ao4efk8FvYeagXgaen2FeYceCxW8r6u4uGerWlpna15er2u8Hw6XHROg9xIdC05fXSp/Hw6SCjGUHgsVE9D3meIuBrWys7a5Gs9X9wcdyVMFopufl54bqJp7ch8ToGlLVThVHg740vc7Afdu94MDqQoOuUoF5gY69xT3MB0LuICY1R1cdx3p9wYKC6+kpq2ucs0daGmlcK8fC6+kpq2ucqZnZnJwaGmkcLAfC/tW9wg2dvk8dwsB+AX3JwPG6xU7xOBv0xv3SMr19xQf+EL8JvsP95P7uwcxaW5IYGCkumUeC/d78woLuaQdXQvIt7rrlx9ABguL9xD4KPcQC5Ed91hBFcuUwJ7NGrllqfsCjh5+TQW9iJqAeBp6f4QLA88W9yn3QwbX7/ce+6cF9zcG+2r4HPdX95gF+zYG+1X7nwWI95/7KQYL+0QG+1/9IAX3Kgaz9y8F91kGsvsvBQv45OgB9zb3qAP3NvjkegoVzrmxx8ZdskhIXWRQT7llzh/CBHR5m6alnZyioZ16cXB5e3UfDveerB0Ldh3p9y0KCxXWBqsdC1gKHwurrbi3a60L9xRMylPDU/cKEgtmG0NFSvsAH/aMFcinpqqdn4V9nB77Fgd2e3qFdhtldabJHw4VZqZwr6+mprCvcKhnZ3BuZx4OFb2uq7i4aKtZWmdrXl6va7wfDveQ3/dF3wH3FPb3BvIDCxXTBogdC7OUmJigGwvUFSgKC0vcB1H8kC8dC2j3EBXLk8CfzBq6Zaj7Ao8efk0FvYeagXgaeX+FeYceDhX7qC33qAYO908dqYOYtApcdx3pkN73RgoVSbpX0NC6v83MXL9GRlxXSh4Lwo0Kv1QF8wYs9wYFCzQdOQoL9wgW9yf3lgYLFe651tyOHzkGYYV4amL3Dh34C/lSFTr3DAX7MAb3DPsMBQuL9x/3U/cw9zp3C9P3J/dC9ycL9w8K/Qv7NwYOFffA9x37N/iC+x0GCwV1B/clFlj3TfsaBgsVwp6mpaYbE6jCrUDeG8nGs/O1HzO0BVR4cXFvGwv7XPp8AQtf96YVVk/3OgrHBfsFBuv7DAX3JAbr9wwFDhLFHQva0sSo4xL3XeC58xO49zkL+GKyCgvaEvfS8y/zE+j3OQt/9xP3GPcM9z73EwvFCl6tC7r3K/dg9ysL93z8x/emC+i2ztOOHwu/uLjmlR8LGsuyqcuxp31vph7a2wW/XFKoORv7GSw8+xILBfcKB/s1gpT3QQX7CgaU+0H7NZQF+woH9zUL9xYHnp6clKAbsZ1vUklwcWl6eY+aeh8O2r7Ky9oB9zjp3+wD95YLpmdncXALyPceFQv3W/cDAfcQ9/QD9xD3WxX39PcD+/QGDvcd+8D3HvfA9x0LdvgP9xV3n393Egs4HX4KC/se/Md3CuG2u9OSHwt9ehpxaH4L1gr47AvA9yiNCoD7BwUr3/fOJAdpLXdEBYcGC/dEuBWyqKOxr26lZGNvcWdlp3OzHw73DKQKC3WpsIUfSQYLdvgT9xELEsj3IQvHHUkGZoV1bV4bXdodC/db9wMB2/hMA9v3WxX4TPcD/EwGDo0KwAsS91z3XP//VYAA9yH//3+AAPcIE0gLW3pzbR61TAWYn6OXoRukmYF7c3SDC/yIFb0H+6L4VgVtBgugOh29zQsVvQf8zvpKBW0G+OwL+JEB967zA/gWC4kdjgtNHRIL9wH3wvcBC/t8+Mf7pgv3C/hy9wgLjwbATgULPx0OFvcNCg4Vw7WuwcFh9yodX2VoPIIfDvuhHARyAUb5dgPQ+fkV+x77HgYLFY0G+J/3pwWPB/yf96YFiQYOKAoObR1/d8gKC833DcsB99XpA/eUC/s3dvdA9wz3rPcMC/um/Mf3DArq9woF+wEGDvl29y4dC3b4EfcHC7UGcndjYlEatgoLzQakj5uYnKarZbkbt7Ov2ZQfC05gCg4r9zoK9yQd9wsdZh4LFfcF96b7BQYL+Qv3fPceC/vA+Qv7Hgu0PFVhcWQLBfsMBgu6q623uGutXF1raV5fq2m5Hwv3Fx0OOB05CgtYHd2pC/d/AfdM93wD90wLRvd7FQv3XQerqqiZqxvJqF4yJWBfC3CGfH96cGqyXhtfY2c9gh8LvaJ/dHd4gnRvaZmadx8O+Ih3Chtj5h24QO4bC3b4Ef8Ab4AA//+QgAD3BwsV90oKBgvLS+4S9yr2C/ce91D7HgYLFfeu6PuuBgv3O8gKC/cQ+Cn3Dwtvbb9aGwv87AYO9ww08x0L9wcB9/73IAPFFvhx9xALuUDuGw7rBSAGDvtc+nwSi/fAi/fAE8ALAffA98AD98D7XBX3wAv3KQH3ivcnA/gd9wsVC+cdOB0L90Yd+EoLsVNJHc0KEsn3JwsB9173WAP3wAt296T3FfePdwv3Hf12Bgt37fc7CwX7CQYLbMart5ifpB5tzQWFC1Ed93sLgcX4ruQBbsX4lOMDC/c3FfhK96b3IAq9bKQxlB4OXmVoPIMfDvt5xvdTdgtubJmadR8L9wv4MvcLCxX3EAYLfoB6GwsF+y4GC/jS07mgAfc196oDC1m/1mT3Ahv3F/cKC7a5Gs9Y9wsdC/cRL/crHQtVvNpn9wEb9xr3Cgv8JBwFeDkKC3/3AvdX8/cX9wsBC1Rp1jgbTVBjI2EfCxpPvmnLrrean6QeC/c3/IL3HfkL+8AGC/kL0gr4x9Md+3HG9wu6AQs4Bmp3doJYCwH3vvUD950L94wV+zkLyRX7AQYL+Mf7HgsVb1UFC733DAEL+wAaPcFN1MG0pQv3CogKC/ss2ffJ4ffJ2RILHoZMZV5GbAgOBfsPBgv7pgYOAQABAAAiGQBCGQCuAACrAQCwAACtAAGHAQCvAAGJDQCKAAGXAACxAAGYBwC1AACyAQGgAAC0AAGhFgC5AAC2AQG4AAC4AAG5DwCMAAHJAgC6AAHMAwC+AAC7AQC/AAC9AAHQCgCNAQHbDgDAAAHqCQDEAADBAQH0AADDAAH1FgDFAAIMAADGAAINBADHAAISAQCaAACdAAIUAADLAADIAQDNAADKAAIVAQDMAAIXDQCQAAIlAADOAAImBwDSAADPAQIuAADRAAIvFgDWAADTAQJGAADVAAJHBgCRAAJOCQCSAAJYAgDXAAJbBADbAADYAQDcAADaAAJgCgCTAQJrDgDdAAJ6AwCVAAJ+BQDhAADeAQKEAADgAAKFFgDiAAKcAADjAAKdBADkAAKiAQCnAACiAAKkAwRhAARgAAKoCQBtAQKyHgAHAAARCQLRCQAPAAANAAAbAQB5AAACAABgAAAgAAB7AABoAAADAABBAAAIAABpAAB3AAB1AQBrAQBqAAB4AAAOAALbAABvAACJAAE6AALcAAByAAB0AABAAAAJAQA8AAA+AABcAABeAAAQAABdAAA9AACgAAALAABwAQBmAABzAACqAALdAAClAACZAALeAAAhAALfAAAEAALgOwCLAAMcAACPAAMdHgChAABnAAAFAABiAABkAAM8AABhAAM9AAEsAAM+CABjAANHAQAGAAB6AACeAACbAACjAAFEAQFAAwAMAACmAACoAACfAANJAAAeAAAdAAAfAANKAQCcAAA/AANMAABfAANNAACXAANOJgB8AgCIAAN1BAB/AACDAACAAQCEAACGAACCAACFAACHAAN65QPDAgABAEwATQBbAL8AyADYAOMBCgEYASgBLwE5AUIBTgFkAXgBgQHBAioCSQJXAmACaQKiAqsC+wMCAw4DJANdA2cDwQPNBA0EWQRmBH0EmgSnBLME2ATxBPoFRgWeBboFyQXVBe4GIQYuBnoGkAafBrAGwgbbBvsHFQcxB04HggepB7sHzgg6CHQIoQkCCScJSwlxCYwJxAntCkEKngsQC3cLiQuiC7cL3Av3DBIMLwwxDEwMZAx9DJMMywzmDRINOg1RDYENwA3nDg0ORQ6PDrYO/A8SD0MPXg+DD58PvxABEB0QOhBiELcQxBDSEOQRChEcETQRSxFlEXIRjBGqEfcSERIlEkMSdhKNEqcSwBLgEwATNhNWE3cTlxPOE/IUFRQ0FF8UbxSBFJYUvhTbFPUVDhUeFS4VRxVjFYgVrBXIFhgWPxa3FxYXNhdHF1gXjRfIGAkYhRiqGOIZDhk2GYAZvhnVGesaBxqDGqMavhrZG0MbUhuHG6kbwxvVG+Ub9xwMHDwcchyAHJoctRzFHNYdIR1OHW0dsh3PHekeRx5uHoMemB7BHvgfHx8vH0EfVh9qH3YfhB+VH6Yfvx/YH/EgFyArIEQgWSBzIHUguSEaITUhWyF3Iash+iIeIk0ivSLYIv0jKSM6I0kjnyPiJBMkPyRpJLAlACU8JZ0mSiayJwUnFCcjJ0QnXCfgJ/MoByh3KIkomiitKL8o+ykSKTspUiloKYopwCnwKh4qRiqaKrsrLytFK3IrnSvHK9Er/Cx2LJEssCzbLTEtOC0+LUUtbC2HLZ8tuy3CLdst+S4kLkIuRy5fLnYuqC69LuUvOS9TL2wvly+4MAQwNzBWMHYwqjDpMRIxPTFfMc4x2zHpMfcyHDI3Mk4yazJ7MogyoDK5MuUzDzNKM4gzpzQRNKQ0vjTaNPk1JjVtNZY19TX7Njk2QDZpNq020jbpNv83GTeTN7c30zfuOGI4hTjnOQE5Gjk0OVk5djmROa857TocOjk6cjq1OuY7AztLO3I7oTvHO+g8EzxrPJY8xTz1PS49gD2wPcM91z3qPhI+OT5XPnU+lj66PuY/ET9DP1o/cT+PP6xAJUB1QIZA9kEPQWhBq0H6QlNCVUKZQvlDPkN/Q7REGUR3RLBFE0V1RY5FlkWeRaZF4UYfRkRGbEa0RrxG4EcOR1hHm0fWSEFIdEi5SPhJY0ncShBKjEqOSpZK5Er6Sw9LGUswS5hMMkyHTJlM0U0hTWRNsE4NTj5OQE6UTuZO+E8sT39PwFASUG9Qn1ChUPdQ/1EfUS9RZVGwUddSD1JcUrlSzVLqUuxS7lMIUzZTZFOXU6ZTtVPJU9xT3lPgU+JT5FPmU+hT8lQRVCVUY1SeVL1U2lU+VaFVu1XJVeJV+lYxVk1WklcoV1RXoFfgWFFYk1kaWYNZ6lo4Wm9acVpzWvZa/1sKWxZbIlsqWzJbPVtGW1FbWVthW2lbcVt5W4JbjFuYW6Rbq1uzW71bxVvPW9Zb3VvkW+xb9Fv7XARcPVxHXE5cVFypXLBcuVzAXMdczlzUXNtdCF0cXVBdj123XgdeVF55XulfPl9kX4pfo1/JX8tfzV/PX9FgDWBPYHVgf2C3YW9hgmGlYeRiHWJPYqtivmLAYvhjHWNRY6dj4mQYZElkqGT4ZUhlcWWKZaNl82X1ZmJmmmcPZ35n2Gg0aLBpCmmCajBqk2sMa2FrzGxObNNtPG2cbfVuAm4PbhxupW8yb31vyHBUcI1w9nEhcXpx23IhckRyRnJ8cr5yz3LucxlzRHN7c7Rz4nQVdFJ0jHSxdMp1LnW1dh92h3bmdyV3WHe8d+14Dnh1ePl5JHlQeXx5p3m+edl6L3pbemd6gXqNeqd6wHrqewZ7MHtQe6t75XwzfHN8j3y8fL58wHzqfRR9JH0mfTd9R31gfWJ9ZH10fYx9jn2hfaN9uH26fcp90332fhR+JH4yfjR+P35QfmN+ZX6Ifop+mX6ufsR+zX7dfvB++n8GfxJ/FH8dfy1/O39Lf1l/f3+lf9OAAYAsgDWAZICBgJuAsYDPgPOBHIEqgVeBfYGigcCB7IH9giGCR4JtgpGCtYLWgwiDIINbg6eDvYPZg++ECoQehC2EXISDhLWE54UDhS+FMIUxhTKFM4VDhVWFY4VwhaCF0YX+hh+GSoZ2hpuGwIbPht6G64b3hwaHEocdhyeHNodGh1WHZIdvh3eHgIeIh5mHqYfFh+GH7ogNiCqINohFiFGIY4hziH6ImIiwiLmIzIjjiPiJCIkTiSWJMok7iUmJXIluiXmJhomZiamJtYnKieeKCYobijKKRIpTinKKl4quis+K7osHixeLMos+i2CLg4ugi7yLz4vki+mMAYwhjC6MRIxcjG6MgYyYjKSMr4zFjM+M640HjRiNMI1HjV6NdI2RjauNuo3PjeeOAI4gjj+OX46BjqKOwI7Njv+PCY8ajyaPMo89j02PWo9lj3qPjo+lj7ePyo/Vj+CP64/2kAGQDJAXkCKQMJA+kEyQWJBmkHSQf5CKkKOQ5JGRkaSRtZHEkc6R35HskgaSF5IskkCSV5Jni+b4cecBru734O4Drhb4pvko/KYG7vyNFfgHB+n7TgX3JBbp904F/AcH+4xLFbLYtO2NCrQpsj4FN/fXFWDqbMYF9ywGa1BhLAUODqA6HQGU+NoD93n3oiEKi/cG9z/z9yn3BhLf9yf3LPck+wb3JBP03xb3cwb3IfcBxvcZ4lq8LpwfjwcT+NifrsrFGvcRI7D7Gx77YAb3J/ubFfcpvgfQq3daWm1sQx9Z+6cV9z/LBxP03LByUlBlbTsfDj4dAcL3Ky0KDov3OR0BzPco91T3KwNLCg6LQx0B6fcnAycdDqB295H3EPcr9xAB9wD3JwP3ABb3J/eR94X3EPuF9yv3r/cQ/EIGDsMdAbf3LPdv9xgDJQoOoPctHQHL9yf3RvcnA2sKDpodpAotHQ5/9xP4MvcPlh0O6goBz/cpnB0Oi/cfCgH29ycDYgoOoHb3Qvcx90X3JAHM9wn3fvcLA3EKDovACvdO9yETXLcKE2w5HROcTB0OPh0Bch0DIR0OoHb3cfcJ91n3CQHV9yf3XfclA9UW9yf3ceYG9x73Cc/3Lfcy+wa/+yEf+4IG9yf7zhX3Wd0H2bRyR0dlZzofDvtG9wr46fcTAa/3K/dw9yoD9734rRXPtT37FvsXYThHRmLe9xf3FrTZ0B/3lfzcFYR9eIV3G1xamrp0H/ayz/cJ9z8a92gi9w/7L/swIvsO+2n7SNb7C/cJah4ltONC9xMbtKyUl6EfDqDECgHR9yf3U/clA/dt+KuqHfgD+/QV+yf3mQVECg4+HQHX9yn3Q/crAyUdDqD3TAqkCnMdDl8KAZkKAyMKDov3H/sK9yQKEpr4zhNw92gW90UG91j5IAX7KgY++8QFE7B4RH1Jd0MIhwZ4037Nd9I998QY+zAGDrcdAY/45CkKDuoKAZ34yAOdFvcxBs/3GZutm6ybsxmPBp1jm2qdadL7GRj3OAb7Uvfc90f32AX7MgZR+w99bX1pe2IZhwZ3tHytfKlM9w8Y+zkG90f70QUO6gqkCicKDov3Hh0Bw/h/A1IKDn83CogKE3zOHRO8MR0TfCIdE7wkCg5/4wr3GwoTfNMW9wcGE7z3IQrt9z/3LD/u+xBbWHZnZB+P2QX3QPsnB/cn/MQV9xMdVXFrlKNvHw5fHQHO9ysDMAoOf8EK90v3JxN8uveMFRO8+zbeKfcSvb6mr7AejgYTfJZYBfcM+VH7J/s9BpA+BatoaKBSG/sAIyn7Nh8TvPcrjRXpubfBqKaCc6Ye+10HanFvfmobTmi37R8Of1kdAfgx9xkDIB0O1Qrw9wgB92n3JwP43flCFZlhWJhSG/svSDH7Bh9+B/sXhQX7AfcX/BH3J/gR9z/3B/s/mQfHqabKsa6Ef6oeDmEKdR33OvcVUfcgE/RAKB0T8YAwHRPqgJNzb49tG/sEJ077C1GoXq9zH4cHE/GAaHNzZ2oaYaJxpnoehwcT9EBYcnFpYxoT6oBBHQ6g2x33VXcBuB0DSAoO1QrU90kS94v3WPs59ycT6D8KE/CgHQ77WPcH+GL3B9T3SRL3i/dY+zn3JxPoYwoT8KAdDqDNCvd1dwHX9yebCg5/6h0B92L3JwMuCg6gowqrdxKv9x7V9wXV9x4UDhOerxb3HgYTzngKE66AyQX7AgYOoKMKErgdE7jTFvcnBhPYLwoTuIDN9wwdDl8dAcUdAyIKDvUdf3cS9xsKE9z3arUVaK+3eLcb9wPz7fc+HxPs9y1A7vsQVlRxZ2MeiAYT3IC9BfsM/Tz3J/clBvdIBBPs9xMdVB8T3HJrlKNvHw71HX93cB0T7Lr3jBX7Nt4p9xK6vKOsrh6FPwX7LfcnBxPc+Tz7BwcT7H9YBYcGt2JinlMb+wAjKfs2H/crjRXpubfBqKaCc6Ye+10HanFvfmobTmi37R8OoNEd9wj3JxOotB0TyH0KE6hUHROYf/cA9wwdDn/oHQHf9yb3OPcmAyYdDn/nCgH3QvcnAywKDn/3QB33PfcnE3hSHRO4+9oHIx0TeHEdBg6L9wH4F3cBqviuA/duFvc9BvdK+IQF+yEGPft+e1l+WHxXGYcGfL99vnu9Pfd+GPsoBg6L9wkKzXcBj/jkKR0OoM0KAbD4oQOwFvcuBrzdmqibqJqnGY8GnW+gbZ1vxDkY9zIG+0D3hfc295P3PB1fO35wfG1+bxmHBnqnd6h8p1jbGPsyBvc1+4IFDpUdEqr4sBOw6EMVE3Bx+wQFE7AkHQ6L9wf3nvcHAdH4awNTHQ6gOh33UB2U+NoDth1u/EQhCqA6HfdQHZT42gPBHfsF/EQhCqA6HfdQHZT42gP3vvmPFToK9wUGe/xEIQqgOh2+9xwB9xbW91LWA/gf+dsVSQr3AQrIHfuF/M0hCqA6Hbv0Cvgj+VAVYR1cCvtaogpcCqf8QiEKoDodz+gB9zP3rgP4TfnBFfuuLveuBvto/FYhCqA6HfdQHZT42gP3+PnKFVcd4rW80pMf+2T8vCEKoDoduPcwCvnaFaGdenFweXt1dHmbpqWdnKIf+yEEzrmxx8ZdskhIXWRQT7llzh9E/D8hCqA6HfdQHZT42gP4CPlSFev3DAX7BQbbClbIBfsFBuv7DAWM/EQhCvuR90noOh0B9173WAP3wENACqA6Hfc11PdLHflHFTUdcvxzIQrYCl33DBKU+N4T7Pjn+g4V+wYGE/RH+wwF3gb7Wn4Vjwa/VAXzBiz3BgX7EgYs+wYF8wZ6/EQVmseczJ3Xm9AZjwacR50+nEqaTxj7LvgSFftf/SAF9yoGs/cvBfdZBrL7LwX3MAb7X/kgBQ7YCl33DBKU+NoT7Piu+ZYVRvcMBfsFBu37DAUT9PswfhWPBr9UBfMGLPcGBfsSBiz7BgXzBnr8RCEK2Aq0xwH4XuoD+En5ghWKHfsUYxWPBr9UBfMGLPcGBfsSBiz7BgXzBnr8RCEK2Aqv12XWEvcryvdAyhP1+Bb6WRUT+XGF9zsdE/Zwb7BWGxP6XmVoPYMfygYT9qaRmJacGxP5pqdlwBsT9bixrtmTH/sr+2QVjwa/VAXzBiz3BgX7EgYs+wYF8wZ6/EQhCvuR90noOh299wwSlPja/Bn3WBN89775jxU6CvcFBhP6wv2aQArjHbOZAZT42gP4QvozFfsDBkv7CwXVBrOZFU8d1B37Y/y8IQrjHbOZAZT42gP37fm8FUv3CwX7Awbw+wsF7ZkVTx3UHftj/LwhCqB29y/3B/ei9wS9lgr3BWwVTx3UHftj/LwhCuMd3/cGAfc4vPc9zQP4EvpaFfcUHfcEHfuw+yQVQ5K2W+Eb1B1IBmuDenVfG196oauDH4n8vCEK+5H3Seg6Hb33DBKU+Nr8GfdYE/z3+PnKFVcd4rW80pMfE/r7Hf4SQAr7c+r3KTodAfge9gP3efeiFZrHncyc15vQGY8GnEedPpxKmk8Y92n8FBWEgX2EfBt2eZiks664wpAf+1/5IAWdHbMGanhbW00aT71py663mp+lHg6L9xCk9waX9xD3FfcQ+wP3AxL3y/cWE+z3d/ebFafom8SfypzMGY77qgYTtPcW+x8V9yv3CvcQ+wr3Ffcl9xD8EAf7Zf0gBfcrBhP0uPcpBfcKBhO0+yn3sPcQBw6L9NHSy+L3KfUS3/cn9zD3IPsA9yET+vd79BXR9dIhy80H3LRtRkZgZjwfSfhNFcEGE/zPrXdbVmpvRR9WBhP6909sFRP8156swsIa9womsvscHvti/CoGQIUFStb7Q/d1BxP69yL3Acn3Hudavy6dHw77ccb3RHb4tPcTAcL3K/cM9QP4fPdBFWhrZnRcGylH2fca9xfP2ue6rXhvqh/c5gW2X0mzOBv7Qvsd+xL7bPtU9wD7BPcgch9oRgW3gJnVHVuGHpZQBer3Bgpplh6Zq9KRyau8xBkOPh2x9wwBwvcrLQr4YfiITwoOPh2x9wwBwvcrLQr3h/gQFcHIBY8GwPcFHT4dsfcMAcL3Ky0K9/b4iBXbClVkCj4dsPcuAcL3K8n3Py0K97/4DxW8r6u4uGerWllna15er2u9Hw6L9zkd91AdzPco91T3KwNLCvcK+VMV2wpVZApUCtP3OR0SzPcodvdYnPcrE3RLChPsw/wIKgr7Uenq9zkdEsz3KE73qHT3KxP0SwoT6PdW+2qvHWUdi0Md91Ad6fcnAycd9029FfcJBjv3DAX7MQYOi0Md91Ad6fcnAycd+Br3PhX7MQY79zUKi0Md91Ad6fcnAycd90C9FcHIBY8GwPcFHYtDHfdQHen3JwMnHfev9z4V2wpVZAqLQx279yD3Tgoz9x/G9x8T6CcdE/b3FLsVtaeps7NvqWFib21jY6dttB/3Wxa0p6mzs2+pYlwKDotDHc/o904KTvevE/gnHRP04c8V96/o+68GDotDHfdQHen3JwMnHfd4vRXitbzSkh87BvdUCmkbaHufpYUfOwZEkrVa4xsOi0MdvPcu904Khvc/E+gnHRP093i8Fbyvq7i4Z6taWWdrXl6va70fDlQK00Md904KefdXE3gnHRP093f+HS4di0Md9zXUAen3J9r0Aycd91SyFdeRyqjQGsBfrvsQjh56QgXFh6GAeBp5d4Ryhh4Oi0Mdvvcc904KMdb3U9YT+icd97a+FcC3uOaWH0AGaoR8f3ptZ7hWGxP2Vl9eMIAfE/rWBqySmpecqa9ewBsOi0Mdvfc2Cun3JxP0Jx336PcKFd8GE+zu9wwF+wYGE/T76PtQhwoOi0Mdvfc2Cun3JxP0Jx0T7Pgh94IV+wYG7vsMBd8GE/T8IUeHCg6LQx299wa0xwHp9yf3g+kDJx34Ae0Vy5C+osYat2es+wKOHn1PBb6HmoF4Gnp9hXiHHvuwLIcKDotDHb33Bq/XZdb3Tgr3OssT9icd0L2HChP6da8VE/b3CAoT+6enZcAbE/e3sa7ZlB9LBhP7cYb3Ox0T9m9vsFYbE/pfZWg9gh8OVArTQx299wz3Tgp591cTfCcd90C9FcHIBY8GwE5gChP69zv+Ty4d+3Pq9xRDHQHp9yfp9wAD6Rb31AZpdl5cTvdFHWrVBYSBfoR+G3Z2l6W3s7e5jR+Q9xD7ufcq94T3D/uE9xf3r/cQ/EIGDsMdsfcMAbf3LPdv9xgDJQr3e/gQywrDHbH3DAG39yz3b/cYAyUK97L4EBXjtLzSkx87BvdUCmgbaXufpYUfOwZEkrVa4hsOwx2w9y4St/csvPc+i/cYE+olChP897L4D6gd+3nG9zL3E/cY9wz3PvcTErf3LPcK9Yb3GBN6JQoT/PeT/ABWCsMdsfcMAbf3LPdv9xgDJQr36viIFVVO9zoKZArDHcPoErf3LIT3r1L3GBP6JQoT9Pcl+CIV96/o+68GDsMdsvccErf3LGfW90j3GBP6JQr38fgRFcC3uOaVH0EGaoN9f3ptZ7hVGxP2V15eMIEf1gaskpqXnBsT+qmvXsAbDqD3LR3R9wwBy/cn90b3JwNrCvdIvRXAyAU6Cg77kfdJ6PctHfcLCoH3WIP3JxN6awoT9Pd//h2KCvtm2/cr9y0d9wsK9yXdWvcnE/prCvd//fL3Agp5payHHzkGE/r3NAqgdvek9xXg4gr3OvcLCvdG9ycTzvgZ+CUV+0bg90YGE9b3ZNIVTgYTzur7JwcT1iz7RgcTzur7JwcT5isHToYFE85KyPx69yf3pPdG+6T3J/h6yAcOmh292R0tHfdM+NaMCpodvdkdLR34GPlOTwoOmh292R0tHfc/+NYVwMgFOgoOmh2+9xwS9xbWoPcooNYT6C0d97X41xUT/MgdQAZJChsT6PcBCg6aHbv3JgoTyC0dE/T3E/jUPB2aHc/oEvcz9677a/coE+gtHRPw4Pjo9gqaHb3ZHS0d93b41hXitbzSkx86BlcdDpodvPcuEvdr9z77M/coE8gtHRPw93b41Ysdmh292R0tHfet+U5OHZod9zXUEvd29yg/9RPQLR33U/jLFRPoNR0OVArT9xD4KPcQEvde91j7QPcoE2gtHRPw93b8DYoK+3Pq9xT3EPgo9xAS91T2QvcoE2jVFhPw91QGbnZeX0v3GAqCfYR9G3d2l6WtoK3BoR/3LPcQBhNo+yz4KPcs9xD8WPsQ9yz8KPssBg5/9xP4MvcPvfcMlh33DviXFcHIBY8GwPcFHfc3HfkgdwHP9ynh9Zwd93D9SlYKi/cfCtH3DAH29ycDYgr3jvc+FfswBjr7DAX3CgYOi/cQ+Bb3Ivsi93I7dxL29yf/AIGAAOYTnGIKE8z36vsiFROspPcsjNEFLQYTzJD7cgUO+3nG9z73HwoB9vcnxPUDYgr3Uf1KsB2L9xD3IPdJ92N3Afb3J/H3VwNiCvfu/BjuClQK0/cfChL29yd391cT8GIKE+j3df4dLh1UCtP3Hwrj6BL29yd391cT+GIKVs/3HB0T9Peq/r4uHftR6er3HwoS9vcnTvepE/BiChPo9//9fxX7qS33qQYOi/cfCgH29ycD95L3EBX3Jgf3YvcFBfcGB/ti+wUF96D7J/voB0FiBfsGB9W0Bfta+En3EAcO6Qr3Qvcx90X3JBLM9wmf91id9wsT+nEKE/73f/4dKgqLdQrR9wwSzfch9073IRNetwoTbjkdE55MHfgm9z5PCg6LdQrR9wwSzfch9073IRNetwoTbjkdE55MHfe79z5OHYt1CtL3HBLN9yFE1vdK9yH7GdYTXQC3ChNtADkdE50ATB33w74VE1qAyB1ABkkKGxOdAPcBCg77ecb3PsAK1PST9yETrbcKE7U5HRPNTB0Tr/da/Ur3Tx2OHQ6LdQrQ9y4Szfchmfc+jfchE123ChNtOR0TnUwdE173hLyLHVQK08AKhvdYhvchE623ChO1OR0TzUwdE6r3fv4dKgr7UenqwApe96he9yETrbcKE7U5HRPNTB0TqvgI/X8VE637qC0GE6r3qAYOPh2x9wwBch0DIR1h+N+MCj4dsfcMAXIdAyEd9zb5V08KDj4dsfcMAXIdAyEdVPjfFcDIBToKDj4dsvccErH3K1DW91LWUPcrE/IhHcr44BUT7MgdQAZJChsT8vcBCg4+Ha/3IBKx9ytR9yDF9yBR9ysT8iEdE+wo+N08HT4dw+gSsfcrbfeubfcrE/QhHRPo+yH48fYKPh2x9wwBch0DIR343wTitbzSkx86BlcdDj4dsfcMAXIdAyEdZfjfjwo+HbH3DAFyHQMhHcL5V04dVArHRgoSsfcrmPdYmPcrE/QhHRP8/ATsCj4d9ynUErH3K/cB9ZL3KxP0IR1o+NQVE/g1HQ73UQpd9wzZChPsIR33BfkjFd4GE9zu9wwF+wYGE+z75/tQPgoO91EKXfcM2QoT7CEdE9z3PfmbFfsFBu37DAXfBhPs/CBHPgoO91EKtMfZCiPqE+whHfcd+Q8VE/qKHfuwLD4KDvdRCq/XZdYSsfcr91nKZfcrE+0hHfsy+N8+ChP1dK8VE+2mkZiWnBsT9qanZcAbE+64sa7Zkx9MBhP2cYX3Ox0T7XBvsFYbE/VeZWg9gx8OVArHRgqx9wwSsfcrmPdYmPcrE3ohHVT43xXAyAU6ChP+9zz+TyoKf/cTIXb4ufcTi3fZChOs+Cv4HRWOeIx1dBr7F2A4R3J2lp96HmHyFYejiaaoGvcWttnPpqN+dJ0eE5z3ZvciFRNsPb1WPgWqYlmcUhv7LyD7DvtpLp8+r1IfSy4FE5zZWb7UBW6yu3zBG/cv9vcU92njedNqwh8Oi/cL+wv3EPcq9w/3GPcP+wv3CxKe9yv3EPcXE3ae990V+3T3BiL3Lh73yPcQ+z73KvcN9w/7DfcY9zT3D/u2Bvsy+woo+3QfE673Kxb3MbW6zR6b/DJ7Bklhv/cyHw4+HdkKOvcGE/D3wPcHex0T6DYdE/B8ChPoy5u5ss9RCj4dsfcM2Qo69wYT+MEdYVUdPh2x9wzZCjr3BhP4th21VR0+Hfcp1BKx9yv3AfWS9ys69wYT9Ped+UcVE/g1HRP0uf0Oex0T8jYdE/R8ChPyy5u5ss9RCj4dsvccErH3K1DW91LWUPcrOvcGE+z4H/nbFUkK9wEKyB0T8vs+/Wh7HRPxNh0T8nwKE/HLm7myz1EKVArHRgoSsfcrmPdYmPcrOvcGE/zgChP0908ER2De9xf3FrbZz8+2PfsW+xdgOEcfE/I2HRP0fAoT8sububLPUQr7c+r3H3b4t/cTErH3K6H26PcrF/gg+wYVhIF/hH4bdXaXpaqes76hH/O50fH3Rhr3aCD3D/svHhP0+y8g+w77aftB1vsp9zV6HxP8bXFqYlcaT75py624mp+kHvsW98MVE/RHYN73F/cWttnPz7Y9+xYfE/z7F2A4Rx4OoMQK91Ad0fcn91P3JQP4ZbIK+xT7O6od+AP79BX7J/eZBUQKDqDECvdQHdH3J/dT9yUD+Ar5UhXr9wwF+wQG2wpVyAX7BAbr+wwFffs7qh34A/v0Ffsn95kFRAoO+3nG91PEChLR9yfe9I73JRP895QrFY4dSPjVFdMGE3qIHfdwMBVECvc5Bg77kfdJ6MQKEtH3J5D3WIH3JRP099RtChN6JPjzqh33cDAVRAr3OQYO+5H3SejECs/oEtH3J1P3r/ty91iB9yUTegD4UPnBFfuvLvevBhP5APsQ/awVKx3EtK7BwWKxUh8TfIAk+POqHfdwMBVECvc5Bg77Uen3CMQKEtH3J2j3qFn3JRP69234q6od+wkE2Ab3Eft/Bfc5Bvsn95kFVwoGaPtRFRP096jpBhP6+6gGDj4dsfcMAdf3KfdD9ysDJR334vkT9yoKPh2x9wwB1/cp90P3KwMlHfcJ+JvLCj4dsfcMAdf3KfdD9ysDJR33ePkTFVVO9zoKZAr7ccb3QXb4t/cTEtf3KcT0mPcrE/T34PglFUyiX5mzGrCsocTDtHhquB7W6AXDUDypPBv7ISk1+wAszVPUcB/fZwXKc7F+YhpkbXNHUk6ns1oeNiYFE/zGV9Vs1YJqSRi3hh20c6Fplh6ZrQUT9PcamtXi7BrnVcA1qx4O+3nG9zJGChLX9ynM9JD3KxP0JR0T+Pcf+3X3Tx2OHQ4+HbD3LhLX9ymI9z6T9ysT9CUdE+z3QPiaqB1UCsdGChLX9yl+91iD9ysT9CUdE+j3Q/xIKgp/9wsgv2x2+LX3CxLL9yv3WPcuEzjLFvcr+DoG3aW0xrGkb2yWHkD7EZU1BROcz3etZ2MaYHtudnx4lKR0HhNYPzIFE5xpp75t1Rv3B8Pe9u1Rv1CqH9P3DgX3AXY71fsHG/s/Rij7Dx8OoPdMCr3ZHXMd9xX3uk4d+3HG90v3TAoS93b3KCv1E/D4Chb4pPdX9xD8rvsQ91f8pAcT6KsGZT8Fkh1qlh4T8J22BQ73Nx34pPcQEvd29ygt9BPwcx0T6LL8zhVvVQWodB0ylB4O6Qr4pPcQEvde91j7QPcoE+hzHRPw1f2higr7Uen3CPdMCqQKcx33aP0Drx1fCtH3DAGZCgMjCvdWvYwKXwrR9wwBmQoDIwr4Ivc+TwoOXwrR9wwBmQoDIwr3Sb0VwMgFOgoO3AoT9CMK97++FRPyyB1ABmqEfX96bGi4VRtXXl4wgR8T7NYGrJKZl5wbE/T3AQoOXwrP9yD3Cwo79yDF9yBA9yIT8iMK9x27FRPqYR0fE/JcCvdaogofE/Ribm1jHxPyY6httB4OXwrj6AGZCgMjCurP9gpfCtH3DAGZCgMjCveAvRXitbzSkx86BlcdDl8KzMLhwvcLCnPT3NR49yIT+SMKE/b3gLifHV8K0fcMAZkKAyMK91q9jwpfCtH3DAGZCgMjCve39z5OHV8Kz/cPvND3CwpD9xAj964j9xBI9yIT+IAjChPyAOr3cBX3rtD7rgYT+IC1+4UVE/SAox0T+ICFCh8T+QBncXBpHxP4gGilcK8eDl8Kz/cPqvcM9wsKQ/cQ1fcQSPciE/kjCvc1914V9wkG9wr3DPc8HSL7po4KDl8Kz/cPqvcM9wsKQ/cQ1fcQSPciE/kjCvcdu44Kvh1fCs/3D6r3DPcLCkP3ENX3EEj3IhP5Iwr3evfWFfsuBvcK9x0Ko/suFaMdE/pncXBpHxP5aKVwrx77WhYT9aMdE/ljHQ5UCsf3E/itd/cLCoL3WIf3IhP0IwoT6PeA/h0qCl8K90nU9wsK4vWB9yIT9CMK912yFRP4NR0O+3Pq9wr3ESN2+Sp39wsKivcA1/ciE7rL948V+zHQLPchgh4T1np6XGNN90UdadUFhIJ+hH4bdnaXpaecrdiwH92ytdr3EBr4Jfsi/DQHPWxgTR4T2k5uttkfzgoHDl8KEpkKlfcGF/in+YwVkn+Te3kaV2GDY4keE/A3HRP40ZjBsdZRCl8K0fcMEpkKlfcGE/jBHRP891FvCl8K0fcMEpkKlfcGE/i2HRP896VvCl8K90nU9wsK4vWB9yKV9wYT9Ped+UcVE/o1HfepllMKE/bRmMGx1lEK3ArX9wYT8vgf+dsVaoR9f3psaLhVG1deXjCBHxPr1gaskpmXnPcBCsgdyDxTChP10ZjBsdZRClQKx/cT+K139wsKgvdYh/cilfcGE+rgCvd7+dRTChP20ZjBsdZRCrcd0fcMAY/45CkK95K9jAq3HdH3DAGP+OQpCvhe9z5PCg63HdH3DAGP+OQpCveFvRXAyAU6Cg63Hc/3IAH3F/cgxfcgKQr3Wbs8HeoK0dkdJwqr+HaMCuoK0dkdJwr3gPjuTwoO6grR2R0nCp74dhXAyAU6Cg7qCs/3JgoT6CcKE/Ry+HQ8HeoK0PcuEvdr9z77M/coE+gnChPw1fh1ix3pCvkgdxL3XvdY+0D3KBPoJwoT8NX8bSoK6gr3SdQS93b3KD/1E/AnCrL4axUT6DUdDuoK0vccEvcW1qD3KKDWE+gnCvcd+HcVE/zIHUAGSQobE+j3AQoOi/ceHfdQHcP4fwNSCvg4+XH3KgqL9x4d91Adw/h/A1IK9875cRVVTvc6CmQKi/ceHbz3LgH3efc+A1IK95b4+KgdVArT9x4dEsP4f/vi91cTcFIKE+j3kvvqQgplHaB29w/3CfdY9wnudwHU9yf3XfclA9QW9yf3D+YG9x73Cc73Lvcy+wa++yEfMO77Jwb3J/wwFfdY3QfZtHNHR2VnOh8Of/cR/wCWgAD/AGuAAPc89xEBxfcq91/3KQP4L/ecFSh/ZFdXG1Rlvu6EH3j3dxWlpayiuRvTslH7ApMf+/QGiXqKe3wa+2fw+xD3Kfcp8vcS92n3aSb3EPsnN1BsYV4eDl4K9zuIChN+zh0TvjEdE34iHRO+JArc+D2VCl4K9zuIChN+zh0TvjEdE34iHRO+JAr3nPjkFfsrBjL7OwX3AAYOXgr3O4gKE37OHRO+MR0TfiIdE74kClP4PUodDn83Cs7mMPcjiAoTd84dE7cxHRN3Ih0TtyQKSvg+oh0Te8wKE3eZHRN7qwoTd/cfHRO3jR1/NwrK9zHcHTr3Mcj3MfsA9ycTfIDOHRO8gDEdE3yAIh0TvIAkChN7AIj4OhW5rK24t2qtXV1raV9eq2m5H/duFrqkHVxda2lfXqtpuR8OfzcK3+jcHWv3qFH3JxN9zh0TvTEdE30iHRO9JAoTemv4T3oKXgrc3B1i3fcW3Uj3JxN8gM4dE7yAMR0TfIAiHRO8gCQKE3sA9fg9TgqOuEDuGw5/NwqzwunC3B2F0t3TavcnE75Azh0xHRN9QJZTBfcM97AG9yw20/sfNjxvZEcevysFp8O6nbsbzq1wXpAfE75ARh0kChN9gPX4IxXOubPJyV2zSEheY01NuGPOH8IEdXiep6eenqGinXhvb3l4dB8OXgr3O4gKE37OHRO+MR0TfiIdE74kCrf4PUUdVArHNwrcHZX3V3j3JxO9zh0T3TEdE70iHRPdJAoTvvcA/CYuHX83Cvc+1dwd8/Vz9ycTfc4dE70xHRN9Ih0TvSQK0vgsFRN+xQpfrfsQlAoOOx0TcsD3OVMV3QYTccD3AB07HRNxwPeD900dE3LA7wpeCvcUTMqwyYgKR+sTe4DOHRO7gDEdE3uAIh0Tu4C4ChN3gLnMjQoTe0C6SgXlBjv3FPcwHfdYQRXKlMGezRq5ZKn7AY4efU0FvoiagHgaen6EeYceDn83Csz3A6/XZdeICvskylUKYvg8hx18rxUTe4D3CAoTfUD3TQoTe0C4sa/Zkx9MBhN9QHCF9zsdE3uA9xEKE32A7x1UCsc3Cs33O9wdlfdXePcnE76Azh0T3oAxHRO+gCIdE96AJApT+D1KHRO/AMv+di4dXgrTuaB291IdVQrH+LMV1QYTe4Dk9woFIgZ/+4AVE32AiwraHRN7gPcKCg5eCtO5oHb3Uh1vHRO7gCQK6vkpFSEGE32A5PsKBdYGXPsKvAraHfcKCg5eCtND9x98muvJ3B3n64n3JxN1oM4dE7WgMR0TdaAiHRO1oCQK9fg9FccdSgYTeaBmhXRtXhsTdaBe2h0TtaD3CgoTc8CuHV4K0NjXP/cG3B1qxPc29yf7JMoTe0DOHRO7QDEdE3tAIh0Tu0AkChN6wPX4PZoKE30g900KE3sguLGv2ZMfTAYTfSBwhfc7HRN6wPcRCu8dVArHNwrN3NwdYt1s91dp3Uj3JxO+IM4dE94gMR0TviAiHRPeICQKE71A9fg9TgqOuEDuGxO+gI39zy4d+2bi9wP3Bjh2onb3e+PT9wncHfcm7lD3JxOegM4dE88AMR0TrwCXUQVyemBiUBp0Ch8TnoCporDMnR73sAf3LDbT+x82PG9kRx6/KwWnw7qduxvOrXBekB9GHRPOgCQKDn/3B/Hl6/cJ+wT3BBKb9xjo9wj3C/cJE96b9x4VOLtI5bi2osG/HlytuW3SG7XAnKmxH1npBXlwdINvG1xqrc+AH/d3Bo6Yj6OmGvcWVvcBJVFnc1ppHrd0aKhRG1JWdWpUHxPuvysFoK60mKYbsZpyXY8fE977K25BWCUa9+n3MRXQkqarrBuzl11UH/vc+yUVsaaozJkejHaNco9vk3YZdXlzf3gbbnqcqh8Of/cMNHb4BPcMz+IK9yUS9xsKE2f3b/fWFauqqJmrG8moYTkfE6crYGNVcWuUo28e+AQEuvdKBxNr0vtKBxNn1fsnBxNzQAdJhgUTZ0rN/MD3BwcTp/chCun3OfcmP+r7EFtYdmdkHw77ccb3Qnb4IvcLAc73K/H1A/gSgRXEk8ehvLRP6BhyaF91Vxs5UsLh4cbC4LCuf3CxH8/mBbJhSac9G/st+xos+zn7KOsw9xl5H2lIBZIdaZYeDnMKAc73KwMwCvhD+IFmHXMKAc73KwMwCvcD99rXCnMKAc73KwMwCvdo99r3Oh3v9zsFIAZWK/c6CusF+wAGDl8dyPdJEs73K6T3WBPwMAoT+Pem99XuHX9FCrP3Lfst93ISpPcq90z3J/8AIoAA/wBagAATd6T3jBUTt/s23Sn3E72+pq+vHo8GE3eWWAX3DPlR+yf7PQaQPgWraGegUxv7ACMp+zYfE7f3Ko0V6bq3wKmmgnOmHvtdB2pxb35qG05nt+0f+EP3vhUTb6P3LY3QBS0GE3eQ+3IFDlQKx8EKmPdYcV0KE773A/yLKgr7UenewQpw96hJXQoTuveN++2vHX/3DDR2+AT3DM/SRPclcB0TtvgR9y4VanFvfmobTmi05uK5tMOmpoF0ph/3afe4FUkGE27V+ycHE3ZB+y8HE65E9y9fB5A+BatoaKBSG/sAIy37MPsw3i33Er2+pq+wH44GE3aWWAX3DPjBBs2QBQ7DCvc7Afgx9xkDIB37EvekvgrDCvc7Afgx9xkDIB3E+EtmHcMK9zsB+DH3GQMgHfub96RnHQ7DCvc7Afgx9xkDIB37NveknQp/WR3K9zES9xD3Mcn3MTT3GRP6IB37ZvehFZgdXWppX16sabkfE/z3bha5rK24t2qtXV1raV9eq2m5Hw5/WR3f6BL3Q/eoZfcZE/RpCvuC97Z6CsMK3BL3Od33F91c9xkT+iAdJ/ekFRP87rixCnistYUfOQYT+jqO9yMdf1kdyPdJEvdr91eO9xkT5GkKJ/efLh1UCsdZHRL3a/dXjvcZE3RpCif8vy4df1kd9z7VEvfL9Yf3GRPkIB37G/eTFRP41pDLqc8awV6eCn9ZHc7mMPcjEvgx9xkT7CAd+6P3paIdE/TMChPsyLe665YfQAYT9GSCf351GxPscG2/WhuNHX/3BPTs6fcElwr4MfcZE/EgHfuD96QV5QYT6brMjQoT8ZEdE+X3OlMV3QYT4/cAHX/3BPTs6fcElwr4MfcZE/EgHfuD96QV5QYT6brMjQoT8ZEdE+P3hPdNHRPl7wrDCvcUTMqwyRL4MfcZQOsT8iAd+4P3pBXlBhPqusyNChP1mx15hx4Of1kdzPcDr9dl1xL4H8td9xkT+SAd+4v3oxXqBr3GjQq8UAXrBjr3AwX7GQZ7rxUT9aaRmJacGxP6pqFlwBsT9rfaChP6cIb3Ox0T9fcRChP59zYdVArHWR3N9zsS92v3V473GRP6IB37m/ekZx0T/Mn+di4d+2bi9wNZHRL31OyH9xkT9Phy9xoVdV9kf14bQk6q1YEf9+IGjZePpqUa9xs78vst+xj7Ein7Nh4T+Ps49w0r9y6alYuQoR5xdGxjWhpPuPcxHYF/hX4bc3iXpbKfqeTJH/vW95QVE/TLmLmpwBvOqWVTHw4zHfsj99wV9gbA6o0KwSwF9gYmuwoOYQrN3HUdZd33DvcV+wzdd/cgE/YIJgoT9ghYcnFpYxoT7SBBHRP0UJ733LUdYQrI90l1HZf3V2L3FVH3IBP2ECYKE/YQWHJxaWMaE+0gQR0T9ECe99dCCmEK9znGdR2j9LD3FVH3IBP2ECYKE/YQWHJxaWMaE+0gQR0T9WDB97+wCjMdYPfcFfcQrgphCt/odR1u96g69xVR9yAT9hAmChP2EFhycWljGhPtIEEdE/RA+wv37noKYQrO5jD3I3Ud9zr3FVH3IBPzECgdE/JgMB0T6qCTc2+PbRv7BCdO+wtRqF6vcx+HBxPyYGhzc2dqGmGicaZ6HocHE/MQWHJxaWMaE+qgQR37LPfdFdcGs5SXmKEbE/SgpqlWvBsT8qCZHRP0oKsKE/Kg9x8dE+qgjR2g2x33VXfQ9wwBuB0DSAqhvBXAx40KwU9gCg7pCvgT9xH3VXcS0/cngvdXf/cnE/pIChP093/+TkIK+2bb9yvbHfdVdxLT9yf3Jd1W9ycT+kgK93/+I/cCCnqlrIYfOQYT+vc0CqB29//3Ec/iCvclErgdE873b/iRFbr3SgcT1tL7SgcTztX7JwcT5kAHSYYFE85KzfzA9yf3ywetrqWdsxvBnm1JH/uf9yf3sgf3EVnY+wNAVWdlZB4OWgr3hdmVCloK+DzPCloK89lKHQ7VCtrmMPcjEveq9ycT2D8K6tqiHRPozAoT2JkdE+irChPY9x8djR3VCtb3MRL3MfcxZ/cnWvcxE+g/ChP09zHWOwrVCuvoEvdj96j7YfcnE+g/ChPw9xTregrVCtncEvda3Yn3J3zdE+g/ChP0957ZTgqN9yMdWgr3YNlFHdUK90rVEveq9yc59RPwPwr3e8gVE+hgHQ7pCvgR9wfU90kS94v3WPs59ycT9D8KE/igHf3K7Ar7ZuL3JPcCHdT3SRL3i/dY+1DuP/cnE/L3qhYT9PcDHRPyvQoT+M73UCoK+2bi9yT3Ah0S95PuP/cnE+j3qhYT8PcDHRPovQoO1QpkHQ77WPcH+GL3B9n3OwH3qvcnA2MK89lKHQ73Nx34hHf3dXcB1/cn3PWbCvdp/XtWCqDNCgHX9ycD1xb3J/cPBtXT9xX7VwX3Mwb7X/e491D3YAX7NQb7S/tYiIoF91n7JwcOf+odw/cMAfdi9ycDLgr4AfdETwoOf/cL+E33cvtN9wgS92L3J/8AOoAA5hO4LgoT2Pgz+y0VpPctjPcVCn/3C/cv90n3IvcIAfcw9yfR91gDl/jdFfck/BsG+xLMO/cQya+Wm74eavcABX9sdId0G2Fkn8gf+JX7twf4X/xLFcS0r8HBYrBSUmJmVVW0Z8QfDvt5xvcy6h0S92L3J3/1E/AuChPo95z9e7AdVArH6h0S92L3JzL3VxPwLgoT6PfA/k4uHVQKx+od8ekS9xn3qPtf9ycy91cT9C4KE/jS8RX3qOn7qAYT8vd5HPuCLh37Uene6h0S92L3J/sW96kT8C4KE+j4Sv2wFfupLfepBg5/6h0B92L3JwP4k/cPFX9sc4d0G2Jkn8gf9zUH9yjcBfcJB/soOwX3fvu3+wj3JPtTB/sFSwX7CQf3BcoFOQf7Ess79xHJrpabvx4O+5H3SeijCqt3Eq/3Hqr3WPst9wXV9x4TzYCvFvceBhPlgHgKE9aAgMkF+wIG95/9ge4doKMK7fc7ErgdE7zTFvcnBhPcLwoTvIDN9wwd+CXPCqCjCu33OxK4HRO80xb3JwYT3C8KE7yAzfcMHfdJ2UUdoKMK7uYw9yMSuB0TrtMW9ycGE84vChOugM33DB3T2qIdE7bMChOumR0TtqsKE673Hx2NHft5xvdTowoS0/cnzvWM9ycT2tMW9ycGE+ovChPcgM33DB33W/yu908dqIOZtApchh6VUAXqkN6pzxq9a/c5CqCjCuj3SRLT9yeJ91h39ycTutMW9ycGE9ovChO6gM33DB0TtPeH1CoK+5H3SeijChLT9yeB91eA9ycT2tMW9ycGE+ovChPagM33DB0T1Pd+/YFCCvtR6fcIowoSuB0T3NMW9ycGE+wvChPcgM33DB34CPzjrx2gowqn91USzfG79yf3GvcnE66E97YV9wnAxeD3ARoTvu9gx0BUY2NOVLBmwZGSjIySHoZNZV5GbAgTrvgdyxWAywX7DPyE9ycGE8734QerqJ2dqxuzmm5KH/u19yf3yAf3EF/XKB4TrkleaGJkHw5zCgHFHQMiCtj32pUKcwoBxR0DIgr3l/iBZh1zCgHFHQMiCk/32kodDl8dzuYw9yO/HRPcIgpG99uiHRPszAoT3JkdE+yrChPc9x8djR1fHcr3McgKNfcxyfcxNfcrE/IiChPshPfXOwpfHd/oyApn96hn9ysT9CIKE+hn9+x6Cl8dzdzICl7d9xbdXvcrE/IiChPs8ffaTgqN9yMdXx3M9ysBxR0DIgp099mRCnMKAcUdAyIKs/faRR1UCsdNCsgKj/dYj/crE/QiChPo8fyJigpfHfc+1cgK7/WJ9ysT9CIKzvfJFRP4YB0OXx2XCrr3K/dg9ysT4yIKZvfaFeUGE9O6zI0KE+OQChPL9zlTFd0GE8f3AB1fHZcKuvcr92D3KxPjIgpm99oV5QYT07rMjQoT45AKE8f3g/dNHRPL7wpfHc33FEzKsMm/HSzrE+4iCmb32hXlBhPeusyNChPtkAr3WEEVypTAns0auWWp+wGOHn1NBb6ImfdHCl8dzPcDr9dl18gK90zLX/crE+0iCl732YcdE/V8rxUT7fcIChP2900KE+632goT9nCG9zsdE+33EQoT9e8dVArHgh0Suvcrj/dYj/crE/oiCk/32kodE/TJ/nYqCn/3Bve49wYBxR0D+B/3yRWQeY12dRo1aU9Hc3eTmHseaMwVhp2Jn6Ea4a3Hz6OehH6bHvdH9RVUtl5VBaViW5haG/sX+w4s+zlCo1CwYB9dU8Jht8AFcbS7fb0b9xf3Dur3OdRzxmW3Hw5/9wf7B/cK7uXq9wr7BPcEEpf3GPcK7/cG9wgTd/ck94wV4Z/Dta+fUzU1d1NnYXfD4R77GBb7Odws8cawpr2oHlqoum+/G7S+nKmxHxO3WekFeXF1g3EbXGutz4Af93IGj6GNmqYa9xZU9wEoWmBsVHAev3NjrVIbE3clNyz7OR/38roVE2/QkaSrrRuxll1UHw5fHb8dOfcGE/D3wPZeHRPoNQoT8IIKE+iBHXMKvx059wYT+KkKcvxnXh0T9DUKE/iCChP0gR1zCr8dOfcGE/j4EvcXCqT8Z14dE/Q1ChP4ggoT9IEdXx33PtXICu/1ifcrOfcGE/T3nfjBFRP4YB0T9Ln8kF4dE/I1ChP0ggoT8oEdXx3O5mXlvx059wYT3Pgg+WIVE+yrChPc9x8dE+xOX10qfx/WBhPcqx0T7MwKE9zIt7rrlx/7P/z3Xh0T2jUKE9yCChPagR1UCsdNCsgKkPdYjvcrOfcGE+j3wW0KE/SK90deHRPyNQoT9IIKE/KBHftm4vcadvgj9wvICpvu5PcrF/dq+wsVdAqona27oR/zudHR9xga9zn7Der7GB4T9PsY+w0s+zn7K/Eu9wx9HxP8c3dsZFkaE/R7+AMV4a3Cz8+tVDU1aVRHR2nC4R4Oagr4Ec8K+3nG91PRHfcI9yc69RPUtB0T5H0KE9RUHRPMf/cA9wwdE9K+/K73Tx2pg5iBeBp0aYJbhh6WUAXqkN33RgpqCvc12UUd+5H3SejRHfT3WPtN9ycT0rQdE+J9ChPSVB0Tyn/3APcMHRPU4v2BKgrpCvgP9xV3n3939wjoEvT3WPtN9ydN96gT1QC0HRPlAH0KE9UAVB0TzQB/9wD3DB0T1IDg6xX3qOj7qAYT1gCN/j4qCvtR6fcI0R33CPcnE9S0HRPkfQoT1FQdE8x/9wD3DB33dfzjrx1/6B3N9zsB3/cm9zj3JgMmHffz+N1mHX/oHc33OwHf9yb3OPcmAyYdqvg23Qp/6B3N9zsB3/cm9zj3JgMmHfcY+DYV9w+uCvtxxvcr9wA0dvgu9wES3/cmyPSJ9yYTuvij+EwVrFdBrjMb+yI0TC885WHicx8T2tt1wHptGnFve0hJUqKvUh5JLwUTvMNm2GzahGpKGLiGHbRzoWmWHpqtBRO69w6azMraGuE2sCmlHkWdUpqpGqSjmcm/u3dwuB4O+3nG9zLoHRLf9ybE9I33JhN0Jh0T+Pct+1oVblUFkgoylB4Of+gdyPdJEt/3Jnz3V3v3JhP0Jh0T6PdV+DFCClQKx+gdEt/3Jnb3WID3JhP0Jh0T6PdQ/C0qCn/3ASqkh3b46fcIEsj3J9P3HD/3HWH3HBM6yBb3J/h6Bs+ktsGsn3BpHhM8Pk9uOxoTmfsY9y+JPxpxenpxcHCTn2weE1paJwUTmXO4sn7CG/cGx9TmHxM89yX7L5DNGhM6vsip6hrhT977FfstQS37EB4Of+cKv9sB90L3J/8AQoAA/wBagAADLAr3q/c7FaP3LY33FQr7ccb3K/cGMnb4GPcHEvdC9yer9BPY+DKAFb+OuZexlnH1GIFua4NlG0NrqNYf90L3ZvcH+2b3GPsNB3j7GPsYhQX7AfcR+0MHE7z7BLU69wR3HmlGBbiGHRPctHOhaZYeDvt5xvcy5woS90L3J6b1E/AsChP49zP8O1YKVArH5woS90L3J1n3VxPwLAoT6PdW/Q5CCvtR6d7nChL3QvcnMPeoE/AsChPo9+D8cK8df+cK92v3MRLZ9zFO9ydy9zET6CwKE/R5994V9w0d924W9w0dDmgK7fc7cAoTfFIdE7z72gcjHRN8cR0G+5P40r4KaArt9ztwChN8Uh0TvPvaByMdE3xxHQZDoQoOaArt9ztwChN8Uh0TvPvaByMdE3xxHQb8HPjSZx0OaAru5jD3I3AKE25SHROu+9oHIx0TbnEdBvwk+NOiHRN2zAoTbsi2uuuXH0AGE3Zkgn9+dRsTbnBsv1sbjR1oCur3MRLJ9ycm9zHI9zEi9ycTeVIdE7n72gcjHRN1cR0G++b4z/cEChN6927tHWgK9wjocAoTfFIdE7z72gcjHRN8cR0G/AP45HoKaArt3BLJ9ydO3fcX3Ur3JxN5Uh0TufvaByMdE3VxHQb7efjSFRN27rixCnistYUfOQYTdTqO9yMdaArTwunCEsn3J3HT3NNtPR0TeoBxHQb7efi4FRN7AM64s8nJXrNISF1jTR8TeoBNuWPOHhN7ANEKoZ14b295eHUfDmgK7PcrcAoTfFIdE7z72gcjHRN8cR0G+/f40RXlBuv3K/cwHfH7KxXlBuv3K/cwHQ5oCu33O3AKE3xSHRO8+9oHIx0TfHEdBvu3+NKdCmgK6vcPydASyfcnQfcPJvepJvcPPfcnE3xAUh0TvED72gcjHRN6QHEdBvvc+M8VlB0TfID3WhaTHRN5APuC900V96nQ+6kGDjwKE3qAcR0G+735dRXpBvcH9wMF+xIG+wb7qRWUHRN9APdaFpMdDjwKE3qAcR0G+7f5dRX3Dwbh9wMFKAZdUQWHBlzFBSgGvPupFZQdE30A91oWkx0OPAoTfIBxHQb7ifnkFfsSBvcI+wMF6QYTewCq+zoVkx37WhaUHQ73FAqX91dl9ycTulIdE9r72gcjHRO6cR0GE7z7YvuRLh1oCvde1RLJ9yfg9XX3JxN6Uh0TuvvaByMdE3pxHQb7nfjBFRN818cKXp4K+2bi9wP3ES12ovcrHfcV7lD3JxOdUh0TzfvaB19pcX5mG1R6qc0f97P7J/vGB/sRuz73BR4TztK/rL23H48GE66XQgVxeWFjUBqACpelHxOdqaGuzZ8eDn/3QB33PfcnevcGE3T4gfjwgx0TuFr72gYjHRN4cR34VgYTdMGbtrDMUQpoCu33O3AKevcGE3z4V6EKE3r3QqmDHRO8WvvaBiMdE3xxHfhWBhN6wZu2sMxRCmgK7fc7cAp69wYTfPgM9xcKE3r3dKmDHRO8WvvaBiMdE3xxHfhWBhN6wZu2sMxRCmgK917VEsn3J971d/cnevcGE3r3l/jBFRN9YB33iYCDHRO6WvvaBiMdE3pxHfhWBhN5wZu2sMxRCmgK7uZl5XAKevcGE274GvliFRN2qwoTbvcfHRN2Tl9dKn8f1gYTbqsdE3bMChNtyLe665cfp/sGgx0Trlr72gYjHRNucR34VgYTbcGbtrDMUQr3FAqM91hv9yd69wYTtffIbQr3Tfk4gx0T2lr72gYjHRO6cR34VgYTucGbtrDMUQqL9wkKzfcvHQGP+OQpHfej2b4Ki/cJCs33Lx0Bj/jkKR34WveJZh2L9wkKzfcvHQGP+OQpHfca2dcKi/cJCs136vcxAfcF9zHI9zEpHfdQ1vcECvduFpgdXWppX16sabkfDpUd7fc7Eqr4sBO46EMVE3hx+wQFE7gkHfdR+RoV9gYy9zsF+ysGDpUd7fc7Eqr4sBO46EMVE3hx+wQFE7gkHfgH+cFmHZUd7fc7Eqr4sBO46EMVE3hx+wQFE7gkHb/5GkodDpUd6vcxEvcL9zHJ9zETvOhDFRN8cfsEBRO8JB30+Rc7CpUd6PdJEqr4sPv+91gTuOhDFRN4cfsEBRO4JB0TtPdq+RUqCvuJ90n7FvcINnb5PHcSqvi9+1f3VxNY6EMVEzhx+wQFE1gkHROU+B37Qe4KlR33XtUS98T1E7joQxUTeHH7BAUTuCQd90b5CRXFCl+t+xB9HXiEcoceDpUd7uYw9yMSqviwE6zoQxUTbHH7BAUTrCQdtvkboh0TtMwKE6yZHRO0qwoTrPcfHY0di/cH9573B9n3OwHR+GsDUx34LvkqZh2L9wf3nvcH2fc7AdH4awNTHfdT+INFHYv3B/ee9wfU90kS0fhr+9D3WBPQUx0T6PeR+H4qClQK0/cH9573BxLR+Gv71fdXE3BTHRPo94z74C4df/cL94P3AQG69xr3fPcdA/fA9hVKVbXa27ix07awfGStH4yAi4B/GidfWEYe9274vxVlzPscRl6rWqZYohlLMq57qnqneRn7DE+xSvcp1rphq1ueTxmya12bWxv7CCI3+yP7J/cFLvcb9zTq9wn3NfcsUvcANdsfDvUd91V3AfcbCgP3b2QViNwFbK2zdLwb9wD17fc+9y0/7vsPWVp2Z2Mfj9cF90L7J/4J9ycH99kE910Hq6qpmakby6deMiVeX1ZyapSjcB8O+1j3B/hi9wcB96r3JwNjCg5/9wnT4/cV9wZ/dxLT9yf3TvchE9z4tvf7FRPs3kzNJ0tNbWVZHocGE9yAwwX7DPuwBvss4EP3H+Dap7LPHlfsBW9TXHhbG0hppriGH/d/mefD9wQaE+z7IX8VYGNs+yaDHt0Hpq6xn7cbtaZ8ax8Of/chHfdL9ycTrCAKE1w2ChNsMh0TrEwKDjgKEvcbChOs+Cb3jBUrXl9VcG2Uo3Ae910HrKWomK0byateLB/3K5UV9ys/7vsPUlRwZ2ceiAYTXIC+BfsM/IT3BwYTnJfBjQpgs7x0uBsTrPcE8+33QB8OXx0B+BL3KwP4qfeMFfc5+w/q+ys4Qm9kYB7PMAWmtLGXtRvawVQ1NU9UNVpioaRpH08uBVnE1XTRG/cw9xDq9zkfDn9ZHQHB9xkD+LX3jBX3NvsK7fsV+zE0JPsbcY9wjX8e9+IGQHxTbUIbXmSXoV8fWzMFZ8PVdc0b9y73Dev3OB/7+sEVw7CxzcKybUuXHg5/9wTr7PL3BAHC9xr3ZPcpA8L3eBX7Hdwk9y/3HfcK7vc19zYi7fsySUJ4Z1IevC8FobS4mLgb0rhsQ5gf++MGiX+HcHEa9xprFfdkBkiCYG5SG0lqssQfDkgd+zd290D3EfgTdwHH9yf3QvcnA/ik+IQV+yf73wZpaHF5YxtVeKnNH/ez+yf7xgf7Eb0+9wPWwa+xsh6DLAX7K/cnBw5oChKr9x7V9wXV9x4TfPjN+IQV+x4GE7z74wdrfX97eBt4gZqqH/fl+wX74wdrfn17eBt3g5qqH/fl+x778AcotE7Qw66wt50eVpeqb7YbxamstJ4fjwYTfJZNBfcCBg5/n3f3FSvNChL35fcnE5j4ePiEFfsn+5YGE1gyYUtrThtmd5CVbB8TmG37EAV+qKKEtxva1LPbvB+OBhM4l/sABfcMBg6L5woB96v3JwP4Pve2FfcXU+L7MktVfX5fHqUhBZWoq5OxG9OrbkAf+0L7ZvsH92b7GPcNB573GAX3GPcH+xEGDqB2+Bf3AQGq+K4D+BL4hBX7PQb7SvyEBfchBtn3fpu9mL6avxmPBppXmVibWdn7fhj3KAYOoHbN9wkKAY/45AP4lviEFfs7BnD7OYFHh2GHZxmHBoXAhbqEuW/3ORj7PgY+/IQF9xoGqfd6kryNu5K9GY8GklmTW5RarPs4GPIGqvc4lbqSvZG9GY4GklmOW5Jaqft6GPckBg6gdvjp9wiBdxKo+LAT0PiQ+OMVE7Cm9wQFE9CRdXOPbhv7DlJH+xBbH/tg/J0F9x8G1Pdpmrycvpi8GY8Gm1ebWZ1c3vtpGPcmBvtr+HeduAWym6ipwRuYlomHmB8O+zd292HNCgH4DfcnA/ig+IQV+yf7DwZBQ/sV91cF+zMG91/7uPtQ+2AF9zUG90r3WQWP/BH3JwYOoPcYHdT3TPsw9wiLdxLU9yf3Mvdf+0L3JxPKgNT4gxVJhgUTqoDKChOmgKb3AAUTqoCTdWeVYhv7Glo1Ih/34vyeFfcn+IT7JwYTswDT95UVUWBlVVW2ZcXGtrHBwWCxUB8Of/cLKXas9xgd8PcIf3erdxLY9yf3PfcnEzTA2PiDFUmGBRMswMoKEynApvcABROMwJN1Z5ViG/saWjUiH/iQ/DEViYKHi4Ybf3yVqh8TSsD4vfsn/LcHJ61J8K2jkJKbHg5/9yEd90v3JxOsIAoTXDYKE2wyHROsTAoOKh33hffalQoqHfg8+IFmHSod8/faZx0OOAru5jD3I3AdE6cgChNXNgoTZzIdE6dMChNX6/fboh0TW8wKE1fItrrrlx9ABhNbqwoTV3Bsv1sbjR04Cur3McgKQ/cxyPcx+wz3JxOsgCAKE1yANgoTbIAyHROsgEwKE1sA9zH31xW6pB1cXWtpX16rabkf92/tHTgK9wjoyAp196hE9ycTrSAKE102ChNtMh0TrUwKE1r3Fffsego4Cu3cyApr3fcX3Tv3JxOsgCAKE1yANgoTbIAyHROsgEwKE1sArwoOOArTwunCyAqO09zTXvcnE65AIAoTXkA2ChNuQDIdE65ATAoTXYD3n/fAFc64s8nJXrNIR15jTU24Y8/3RAqhnXhvb3l4dR8OKh33YffanQpUCsf3IR2f91dr9ycT1SAKE602ChO1Mh0T1UwKE673ofyJLh04Cvde1cgK9wb0Z/cnE60gChNdNgoTbTIdE61MCvd798kVE17XkMqpzxrBX54KOArtpR269yv3S/cnE6jAIAoTWMA2ChNowDIdE6jATAoTWMD3E/faFeYGE1TAusyNChNYwJEdE1LA9zlTFd4GE1HA6fcKBfsABg44Cu2lHbr3K/dL9ycTqMAgChNYwDYKE2jAMh0TqMBMChNYwPcT99oV5gYTVMC6zI0KE1jAkR0TUcD3hPdNHRNSwO8KOArt9xRMyrDJcB1T6xOrgCAKE1uANgoTa4AyHROrgEwKE1uA9xP32hXmBhNXgLrMjQoTW0CbHXiHHg44Cuz3A6/XZddwHfsYyxOrgCAKE1uANgoTa4AyHROrgEwKE12A9wv32RXrBr3GjQq8UAXrBjr3AwX7GQZ7rxUTW4CmkZeWnBsTXUCnoWW/GxNbQLjaChNdQHCFf4B6GxNbgPcRChNdgPc2HVQKx0MK7fcdHZ/3V2v3JxPWgCAKE66ANgoTtoAyHRPWgEwKE66A8/faZx0TrwDK/nZCCjgK7dO5oHb3CnAdE62AIAoTXYA2ChNtgDIdE62ATAoTXYD3cPhQFdUGE1uA5PcKBSIGgPuAFRNdgN0dE1uAQ462SOkbDjgK7dO5oHb3CnAdE62AIAoTXYA2ChNtgDIdE62ATAoTW4D3k/jGFSIGE12A5PsKBdUGXfsKFd0dQ462SOkbDjgK7dND9x98muvJyArx63z3JxOloCAKE1WgNgoTZaAyHROloEwKE1Wg95/32hXHHUkGE1mgZoV1bV4bE1WgXdodQ462SOkbE1PAaPcQFcqTwZ/MGrpkqPsBjx59TQW+h5qBeBp5f4V4hx4OOArt0NjXP/cGyAp0w/cq9yf7GMsTq0AgChNbQDYKE2tAMh0Tq0BMChNawPef99oV6LbDyo0fRgZxhXhzXxteeKOlhR9GBkyOtVPpG/sm9yYVygamkZeWnBsTXSCnoWW/GxNbILjaChNdIHCFf4B6GxNawPcRCvc2HVQKx0MK7dzICmvdbfdXad079ycT1iAgChOuIDYKE7YgMh0T1iBMChOtQK8KE66AjP3PQgr7ZuL3A/cMMnai8x33I+5Q9ycTyoD3WveOFem5t8GopoJzph77XQdqcW9+ahtOaLftH/sriRX7Nt8p9xEeE8cAu8Gmr68fjgYTpwCYVgVweWFjUBpPuvcxHYJ9hX4bdXeXpR8TloCpoa7Nnx74hPsHBxOagDIdE8qATAoOSB1HCvsn+E/dClkK7dwSuvcpad33F90/9ycT3IA0ChPsgCsKE9yAYlSWpVwf9zv3QxVRY7ndHxPsgN69ub2qpoJzph77RAcT3IBocG9+axsT2wCa+E+1HVkK6PdJErr3KZv3V3ExChPemvhKQgpZCvdZxhK69ymn9L8xChPfvfgysApHCl34TxX3D64KWQr3COgSuvcpcveoSTEKE9r7D/hhegpZCu7mMPcjErr3KfdN9ycT1zQKE+crChPXYlSWpVwf9zv3QxVRY7ndHxPn3r25vaqmgnOmHvtEBxPXaHBvfmsb+y/4UBXWBrOUl5ihGxPbp6hWvBsT15kdE9urChPX9x8dTl9dKoAfDn/3BPhn7BKi9x8/9w3f9wUT6Pc290sVppajnaEerlu2XrljCHx2doN1G1ZnrbwfE9i498sVuJ2npKmWd2xib25mcB5/pYSkoxr3ifsSFX9ReFlzYWCuYbNrtAjIu8q+3hrlUMUpKE09LmKaW6ZYHhPoU2JaVzUaJ9Q19xzUxqOyvB66bLl2uICu9wsYb5FtmWqgtc+o1J/aCA5/9wb3JPcs9xv3BvcDCvcJ92v3bCr3A/sn+ycq+wP7bPtr7PsJ9ycf+LUEyr1b+zn7OVlWTExZwPc59zm9u8of+7MEtaypublqqWFham1dXaxttR8Oi/cL+AP3Jx34mPcnCvwD90gKi/cQ+Cz3Ih37KwZqXYeHZx/3D/cA9wL3BvYa9w4w2/sZKUxpSEke2jz3UwpNMPsO+wD7SvstHw5/9wv3OvP3L/cHEvf/9yf7EvcnE+i12RX3QR3O9wrdTb87oB+PBxPw16i4uc0a9wMryvAKcV9YXWn7ER8jBxPo9ym2aFNbWXBGUVSmsGEfDqB29yz3BPeK9xEB9+n3HQP3RfecFev3HqGvpa+grxmPBoljiFBjGiAH920WO/gH+0YG+538EgUm98b7LPcd9yzbBw5/9wv3WfLz9xAB/wBpgAD3Fv8AlYAA9ycDudgV9z4d3Pch9xsmyfsJa3SHgG4flvcLBfea9xD8GQZ6+9X3QwppS0pYaUNPW6euYR8O90Mdx/cc92v3GgP3zu0VWVqr8HwfuLK0nLAbw7FwSkNdbFgf93L4bRW0YEauMRv7IPsaIPuB+3P3Ey/3FvcO9dz3GPcaNsn7A1tPcl9eH/cpkc6+2Ru1tnZzph8OoHb4k/cQAfdV9ygD91UW9ygGl/eMpPcL9zX3Rgjl/HH7EPfTB/sZ+ztg+xh/+2gIDkQdf/cL9xfz91f3KAr36hVSZabM07qqvb28ayebH11kYnpmG/tw+6oVY7fQZ+Ub9yD3Gfb3gfdSCjr7GPsa4U33A7rHpbe5H/sqhUdYPhthX6CjcR8Of/cG9wn3LPX3BfcDCvcC91f3Viry+yf7Jyok+1b7V+z7AvcnH/h9BMq9YPsh+yJZWkxMWbz3IvchvbbKH/uWBLWsqbm4aqphYWpsXl2sbbUfDov3C/fK9ycd+F/3Jwr7yvdICov3EPfz9yId+xEGal2Hh2cf9wrh5OLsGvcQMNv7GSlMaUlJHto791MKTED7Cif7TvsLHw4x9wqEdvdi8/c59wcS9//3J/sS9ycTdLUWE7T3QR3R9w/hTb07oR+PBxN416m4vNAa9wMrzfAKbl9TXWf7ER8jBxO09ym2aU9VWW1GUVSnsGEfDt73BPeX9xAB9+n3HQP3RfdXFez3KaKvo7CgsBmPBoliiFFiGvsLB/dtFjv4E/tGBvud/B4FJvfG+zX3Hfc12wcOMfcKg3b3hPL3BfcPEv8AaYAA9xb/AJWAAPcnE3y5ihUTvPc+Hd/3JvchJsj7CWt0iH9uH5b3FAX3mvcP/BkGevvd90MKakVEWGZDT1uormEfDvdDHcj3G/ds9xoD98/tFVlaq+97H7mytJywG8SxcEpDXGxZH/dy+G0VtF9GrjEb+yD7GSD7gftz9xIv9xf3DvXc9xj3GjXJ+wNcT3FfXR/3KpHPvtgbtrZ2c6UfDvhb9w8B91X3KAP3VT0V9ygGlveVpfcT9zX3Sgjl/HH7D/fTB/sa+0Bh+yN/+24IDkQdMfcK9xnz92v3KAr3nRVSZa7S2bqqvcC+aPsFmB9aZGB5Zhv7cPurFWK30GjlG/cg9xn3A/eS91IKOfsd+yHhRvcDucekuLof+y6ASVpBG2FfoaNxHw5/9xEd9BXxCvtt+ET7YfdhEvfM9wkToPdv+20V9x610+b3ExoTYL8Kf/d/4/cRHfhBsR372ATxCpX3Yev3fxL3TPd8I/cJE2D3wPfLFdC6v83MXL9GRlxXSkm6V9AfOvykFROQ9x610+b3Exq/Cn/3VAGK90yk90yk90wDit8VVbBhwsOvtcHBZ7VTVGZhVR73ZRZVsGHCwrC1wcFmtVRUZmFVHvdlFlWvYcPCsLXBwWa1VFNnYVUeDn/3XvtJduAd95D3kxXrBp/3rgUTUJD3GQX7JgaQ+xkFE6Br/FPtCvfG916Ld+Ad9/D3hRUrBnf7rgUTUIb7GQX3JgaG9xkFE6Cr+FMVx2C1UlJgYU9QtmLExLa0xh4Of/de+0l2+NP3CxL3TvdcbfchE2j3bveTFfcUBn/3CPc3nPcXGvcCMcD7BzxIZlZbHt1ABaapqp60G7WrdmFB+zRmofsaHxOwa/s57Qr7TvcL+An3Xot3EvL3IW73WxOw+BP3hRX7FQaX+wj7N3r7Fxr7AuVW9wfazrDBux461QVwbG14YRtha6G01fc0sHb3Gh8TyKr3ORXHYbVRUmFhT1C1YsTFtbTGHg73w/gSAf8A2YAA9zkD95P3w7UKDvfD+BIB/wBUgAD3OfD3OQP3DvfDtQr3wfuBtQoOhAqEHfe291QBvvD3OfAD93b3QgpsHfd42eQKbB0O+Iz3VQH3SfD3OfAD9wD3toYKwZGSjIySHoZNZV5GbAj3xT2GCsCSkYyNk/dUHft7+Cv7VfdVEvfO8BOg94X7exX3CMDF4PcBGhNgrArBkZKMjJIehk1lXkZrCA5691UB90jx9znwA/cA+3uGCsGRkoyMkR6HTWVeRmsI98U+hgrAkpGMjZMehkxlXkZrCA6k+FoB90P3fQP37qSfCg6k+FoB91T3fQP3VNucCg6k+FoBtfiHA/dppJ8K+En7Lp8KDqT4WgHG+IcDxtucCvcf+0CcCg6nCqcK3h3eCt4d3gr3gPcRHff2sR0O8PfWAfcc99wD98DwFejS0OfnRNAuLkRGLy/SRugfDvs49wIBx/h0A8dVFfsC+HT3AgcO+0f6JgH3SfcPA/gc+0cV3cwF+wv3CFj3CvcyGvcyvvcK9wv3CB45zAX7FvsHOvsu+1Aa+1Dc+y73FvsHHg77R/omAfe89w8D92T7RxX3FvcH3Pcu91Aa91A69y77FvcHHjlKBfcL+wi++wr7Mhr7Mlj7CvsL+wgeDvss2flU2QH3XfcEA/dd+ywV97vZ+0v5VPdL2fu7Bg77LNn5VNkB97P3BQP0QRU997v58Pu7PfdK/VQHDvdTHfX3LHL3ERPo932BFfsAxWn3FB7Y2WIGOHiZwx/BkLvIGtduqESXHo8H0peoqNfGhr7AGsOemd4etNk+BvsUUWn7AB9FlWRNGhPwaG5m+wCJHjUHE+j3AImoZmhMgWZEGg73Ux33h/cRcvcsE/D0QRU92Af3FMWt9wAf0oCwyhquqLD3AY0eE+jhBxPw+wGNbrCuyZay0Rr3AFGt+xQePj20Bt2efVMfVodYUBo/p27Tfx6HB0N/b24/To9bVRpTeH05Hg77NPn6AdX4WAP4ovlaFfsPBvvd/foF9w8GDvcxCvuOFfcW+nz7FgYO+zT5+gHV+FgD+Cf7NBX3Dwb73fn691UdDvcxCvfMFfcW+Er7Fgb8tgT8WvcW+FoHDub4bwH3k+UD90zmFfcI9yL3CPsiy7cq9zH3Lc900vs2YH/3RgU9Bn/7Rvs2tnRE9y1HKvsxBQ74Rv8AbYAA9xYK94U7FfcKBoL4mvc1g8odkwUO/wBYgAD/AGuAAPeE/wBrgAD3Fgrk3xX3NZSC+0EF9woGgvdB9zWCBfcKB/s1f5T3EoL3Evc1f8odl4L7EpT7Evs1lwUON/cAiHb42fcBEtL3EET3GNv3GEz3EBNy91f35RWjmJ+jmR7aZOl2TBpwf3lzfB49tSufyhr3tfe0FathTKw+GxNq+wRJTDFplnCddR8TtFlta1tZ+1D3nZI9GnJ4eWJjZZ2sah4TcjdABRO0UrjYcNQb9xHOz+WqgqR9oB8TasGrqbbF90n7pZHSGqSdma+vsnZwqh4O+SB3Abv3rL/3JgP4EDsV9yb5cPsmBlcWYQb7FvsAVPs8+y33ATz3Fx+zBg6CyNbh923h2scBnsvD9fekywOe99l4HcOKFfsN1D/vt6+cpKoeXM8FfXh7gXIbX3C2z8amuryemYJ8mh/CyAWmcGqhVxswOUD7CR8Ogsj3Rtf3C9rmxwGey+nz2PDFywP3RfcfFfPmowbe0rju60etNR/7FAbz+1oV9wucB7Kge2RfeHdiH/urnngdDvfLvPcIs8G2wLwB8MHKxb7IwsED97/3yxX3AuPf9wr3CjPf+wL7ATI3+wr7CuQ39wEfvAQ3T8fo6MfH39/HTy4uT083HzrDFcXHqAapTwXHBmHYBaOWlp+iGrhpoFweMgbFKhXBoAeflX99fIF+dh8O+D3hyfI04hLN6/cF3/cr3xO896f3/hXf6waA9weNCsH7KAXFBhPc1x0TvHbSaekFJAb7ZfvOFev3d9ni+5E02gYO9/LTjuHJ8k3UEpLhveO33/cr3xOf9vfyFdi6vcC8daJjnR9inwVzloCQmBqXlJWfoqF9faEeE6+3yAUTn6FvZJ1hG0FgXVVYqHKqfB+1dgWjf5WHexp9gYR4b3WboHQeWU8FarCue7cb9zyXFd/rBhNvgPcHjQrB+ygFxQbXHXbSaekFJAYO+yfk9ybr+Ajj9zwK+CMV9x5I9vss+zf7HfsM+6P7pPco+xT3PQp0ZGl8Txv7ASTu92T3cPHi6eS1SUEfewf7LHgqXvdRHbCkHo8GllgF2Qb7ffcYFbetoOiaHi8HdXV0fW4banedqR8OcuTj6vfc5Pc8CvhSFfcMSe37Jvs4+yMk+4n7e/co+wL3PQpzZGl9Txv7ASTb9z33VfcB0OjetVpUH4QH+yx3Kl/3UR2vpB6PBpZZBdkG+333FxW4raDomR4wB3V1dHxuG2p3nqgfDqB290/p9wLpAdH4ZAP3DhbgBqL3TwXyBnX7TwXgBqL3TwXq6TcGmPcCBebpPPc+CiP3PgowLdoGffsCBTYt1Qbs6RWY9wIF8wZ9+wIFDver+EUB95PlA/db96sV8PcS8PsSy7c59yD3GcN00/sia3/3LQU9Bn/7Lfsiq3RD9xlTOfsgBQ7PHc8drfcL9+73CwHe9yD3PPchA/fj944VrH2ifHQab3F6Wx5i95QVa5d2mJ4aqaSbtx7iexWfg55/oX3U3xhsqWekXpql9x0YM5Vy+xgFh4eLhxv7GTVJJiniYt1sH3b7BmmWaptnoBlLJ7JrwHO/fhlv+yvigaf3KQX3Ld/X7u0xtjioHw74QNq6CvhAZQr5IO/3GQr4TBW5CvhM4vcr4eEK+EyPHfhA2svCxsId+GpAHfiJ9B34y2sd+EDAHfhqSx34QNrKy/UK+I9uCvktqAr4TBWAHfhAz/daoAr4ozIK+EDMHfkgRx338+YK+PJ5Cvfz5R348nkd+ETQCviEpx34TeUK98p6HftK2roK+0plCrXv9xkK+z4VuQr7PuL3K+HhCvs+jx37StrLwsbCHfsgQB37AfQdYGsd+0rAHfsgSx37StrKy/UKJG4KwqgK+z4VgB37Ss/3WqAKODIK+0rMHbVHHfuX5gqHeQr7l+Udh3kd+0bQCvsGpx37PeUK+8B6HX/augp/ZQr3aO/3GQoWuQqL4vcr4RL3P/eY+wbyE6D3Pxb3mOIGE9AvBrSys/c/HWUeyVMFopyfl50bqJp7ch8ToGlLVTlVHg5/2svCxsIdqUAdyPQd9xNrHX/AHalLHX/aysu+2gH3Nuvg6QP3x84VeXWUroQfmJmakZsbo5mAd3d9f3Uf9xT3bBWjbWecYBv7AFM8MSnCRurTwL3JyGSsTmtxgHl2H7iQn66+G6Odgn2cHw73dagKFoAdf8/3WqAK4jIKf8wd92hHHTLmCvc6eQoy5R33Onkdg9AKw6cdjOUK+xZ6HffM2boK98wV4MrN8vJMyjY2TEwkJMpJ4B/ZBHJ0os/Qop2kpKJ5Rkd0dHIfDvis7vcZCvcHCmp3doJYhQhL3AcO99jh9yzg4Qr32BUT0PeZ4S4GtbKzt7kazlf3Bx3JVAWhm5+YnhuomnpyHxOgaUtWOFUeDvfM2cvDxcId9/UVabq7hLQb1Me0xbB4pVyYHxPws5mZoLAawFauSVXhHWUfUwcT6L6hgHN4eIF0b2qZmnYfDvgUzfcOygH31ekD95T4VhWsx63JjQqFJ7sd+wz7WwVX9zRP6ce+Bw73zNnTxKjiEvdd4LnzE7j3Off1FWm6uIS4G9jEu8kfE/jIYK9JfXiIh4EeE7iPrwX3GeL7aQYT+H37NbZvBZWdmJGfG6Sef3J0d39z9zgdDvfM2cvK9Qr4GhV5dZWvgx+WmpuSmhujmIB3dn5/dR/3E/dsFaRuZ5tfGyBSPDIow0fp08C8yshkq09rcYF6dh+3kJ6tvhujnoN9nB8O+LioCvfYFfcEBhPAkPSazNfhCML7nDQHE6D3JgZTPG9UhTEIDvfMz/dZoAr4LxWalZqblB6qgqJ/dhp7en90dHqXnh4T2MD1FXCUepSdGpqYlJyfmIB6gIV/foIeE+T7J/sHFVrCYtrawrS8u3GfaJwejwcT2KmZopyuGsFUr0RHUmdVY6F9qXgehwcT5G17bHdhGg73zNm/ysraAfc46d/sA/eW+KwVn5iXoZ2hgWiTHn98e4V8G3N+lp8fL/tMFXOor3u3G/bE2eXtU9AtQ1ZZTU6ya8erpZSdoB9fhnhoWBtzeJSZeh8O90HmCvg/FSKzQM9BHtq7BVXKbtHUGtWo0cHKHjy7BUdAY0EhGg73QeUd+D8V9WPVR9YePFsFwUyoRUEaQm5FVUwe2lsFz9Wz1vQaDveS0Ar30RVnpnCvr6amr7BwqGdncG5mHg73m+UK9xcV2qO4wtcayXGuXmducmdlqXasHoyNi4wbZHB2WXoeDlYdXR1/ClYd95Df90XfAfcu8/cF9gP3LveYFdwGlK4FjQZvpqp8qhvV0Mz3Be9Yzjhsan11cx+NvAX3BCMH8/wDFcsd95Dd90jeAfc+9QP3Pvg8FfsB2EzvsriYp64eYswFf3h2f3EbW2ivwcKtrr+cnIV+nB+7ywWhc2ebXhspM0v7AR8OqR33FPg8FSDCSuCrrZyiox6NBpNrBd/4YiT7AwaOWgWgdXSZph33kNnNysbaQh0O+JDcx9wB95XyA/iQ+VwVlG9plGQbIl5SQB+CB0GHBT7V+4zy94z3A9z7A5QHrJ+ds6SjhoSeHg73DsvH2bLK49ZO0BL3GeBE7C7d9OZg7RP0QPdu93EVlpGUmpQeiZeZiaMbswavoId4dmd7WFprlqMfNnsVUMxz4fcO2bzRxlqjMx4T8YBPBmV7kpyVj5CUkh+HnJmImBvax63YmoWbhJQfzNb7GwaQe3eOdxsT8oBAR2M7ZZ5tpXofiQcT8YBye3tzdhpvmnqegB6IBxP0QGl6eXVxGhPqgPcx93EVcnabrqygnaSloXlqaHV7cR8OpQprv0BbaHN0cx6QxwX3BCMHDviQ3Lj3EBL3qfcc+wvzE5D3PfiQFfcR+4zz9937eQYT4Ngd9xjc97vcuPcQEved9xz7CvIT6Pcx+JAV9xL7eQZdfHdee3iOl3IebUIFfqaqgbIb9w6t0tsf98b7eQcT8Ngd95j33fvd+GIS9zTzE2D3NPeYFfPcBri3BROg3PsRBfcEBvsZ91X3EPccBfsFBvsG+xEFifeWIwYO95Dd98fcAfeO8wP3SvkVFc/7jwY4sVTlsKCQk6keetsFhHl+h34bbHeXsx/35PtABw73mPflM+MS9wftt9u27hO49wf3mBXtBhN4928Hn5OTlZYbl5CDeR/7c9v3bwefk5SVlhuWj4N5H/tz7vd6B8xvtV1lc3JugB6ug3aebhtld3Rxfh+JBoO0BT0GDqUKar9BWmlzcW8eiAaEtQU2Bg5/CveQ3/dF3wH3LvP3BfYD95L3shV1pKV/qRvV0Mz3Be9ZzjhoaHl1cB+JBoSrBTb8VfPqBvcMBMsdqR33FPg8FSDCSuCpq5qfoh6HWgUp8vhVOgeDaQWIBqhwcZimHfiO5gH3avMD92r3mBXz9zwGxaSyn60bpJiIhaAfn+EFk3l7kW4bXF5xVW4fiAaD0wU1Bg73kNf3VNgB9zry4/ID9yX3vxVws8d3whvzw7rHx06iVZsfYpZolJ4ampmTrauogXqnHrrIBaBpXaFSGy5SYE5Ux3C/ex+0f7GBdxp7e4JkY2mXomceDveQ3PdD3AH3b/QD92/4IRU0slH2tK6UlKUeedUFhHp4h3UbXXacux/3AvcV3PsV4TQHfjVBhwU+0AcO95DjAfck8/PzA/hc+OEVI/tsBnB2fIVzG2qAnLQf91Mj+2AHOqtX1rqtoKuoHo0Gk14F4AYO95jXAfcK9/oD94P3mBX3DAb3CffdBSgGW/srgWmDaoFoGYkGgK6DrIGtW/crGCMGDveY3vcH3gHe+CMD9xz3mBX3Cwaa8ZG5jqaNohmOBo5okGyPbZwlGPcMBrz33QUtBnn7KIZqimuHahmIBoash6uFrHbvGEQGeCeEbIdph2oZiQaGrIqrh6x49ygYJQYO95j33QH3EPfyA/cQ95gV9wAGqL6UnpWflZ0ZjQaXeZh3l3itWBj3Awb7A/cz9Pc+BfsABnFYg3mBd4R4GYgGgJ5+n4KdbL4Y+wMG8/syBQ73GdsB9xX36QP3QvduFXk9BYeZmIigG9yvteCsH/cI990FKAZj+xyDa4Rsg2wZiQaCrISpgapc9xwYIwb3FvvThnoFdIJ7emobhIKOjYUfDveY3Pc73AH3K/fRA/cr95gV99Hc+0EG9zv3VQXC+7c69ycH+zv7VQUO95DZzcrG2rX3A0IdOPdIFdYGUPcDBSEGDveQ2c3Kxtq19wNCHbn3txUgBlD7AwXXBg73kNnHyszaAfco4/cU7QP3KPgvFTG8RvHh2M319kfNJmFefnJlHq5MBZmlpJOmG7eneVyUH/tmBomDiXt5GuN2FfcUBmCEcHppG2F5o68fDl0d9xraw933Nt8B9xT19wfyA/dM94EVaEgFcrLAgK8b9wPLueAf99g4B4NsBYkGpnJtl2sbRUFIJy3DSN6qqpefoR+JZQVuiXV2WxtxZ5ObbB/3A/cGFWdyqL7BqKepnaCFfZwf+wUHdnt5g3cbDvgi0fcn0gH3MNn3GtgD98H4IhXcysff30zHOjpLTzc3y0/cH9EEY3Cpt7amqbOzpm1gX3BtYx8O9xbx91jxAd73F/dA9xcD9wHKFeXmBXuqroOuG62vk5uqH+Uw1NU53QWhqZiwtxq2f7B1qB7c3ULVMjEFm2tolGgbaGeCe2wfMuVCQds5BXZuf2ZgGl+XZqFtHjo5BfdG91UVxrGyu7uxZFBPZWVbW2Wxxx4O+wL3m/ub+ev7iveKEub3IaLtqfcgE0j4lfipFWK1WapGlAgTKPcWKfsXBxO8JntMTjX7TPe4mjcab3F6W0xUorJMHksnBROIvV/Xb8yECPsm7fcpBxO89wOexs7f90r7t4LSGqmjm7jCsHpquh4Oi/cQ9yfm9zr3CxL3G/cfMvcTE+j3lvcQFY8Hsa+bqrsalIqVipQe9ybmBhPw+z0GhKOFo6PJHXGUcJVwHzeGBTUHE+j3BAaNgoyCghpEWlRGcB4w+Hf3EAcOi/dtRdHC0fe5dxL3dvcnE3iq+Q8V9zf7uQX7HUX3PVT7PUX3PQYTuPsn9ycHE3j3J/c+0fs+wvc+0fsdB/c397kF+ycGTvsZeGB4X3hfGYcGd7Z5t3i3TvcZGA5/9wb3Bda91fcL9wYB7vcnA/iK9zAVaGxoeF0bSl6z1HYf92bW+3IGipSLlZWSi5KSGveb1fuRBteet7bPG7aseXKqH9zaBb1aSadHG/sjIDb7KWofS4YFR8IHioKLg4IagouDjIIeVIcFRssH+ymr9D33GxvczqzGwR8OYvlMAev3I9PcA/fL90oVXJ9yuMcax6O3u6Ae9y37dhV3e3N9b4YI96QHnomdgp97zuUYbqlgoFeQCOg6Kgf7EHYwMvshGvsl4DD3FnoeLNzqB7iRu5+xrAgOK/cH97T29xn3CXh3Ern4jP/+yIAA9yET2Pi6+RkVE+iVdlyUbxsT5PseVk77JnUfhmAFcwZAhQUm4gd6+yZ7+wZ6cVWJGXmMeI56kHf7ABiCnK6Etxv3I7Tq9wuaH6L3UQX3E/b7BwaSwgW5k6OrvhuinYWFmh8OlXamdviu9waGd6R3Etr3J+69s/8AMYAAE2f3+PipFY6Pi48blZSKiZQfWfw+fY5+j3+SGV+3FXOwf8DOGu6m0b6oHvdG+/0Vcm5vemmFu/gsGJaElYSVg9zaGG+oaaBomJj3BRhZBn8nBYyAgYyAiImLiBuX7QVZBhNXfyQF+yZzLfsK+04a+zHMJO5gHn37DQW9Bpj0l4mYiZmJGROPfygFvQaX7tOQx6u9wRkOi/cQ6NW71vcG9wsB9xv3HwP3lvcQFY8HqqibpZCtCPcm1fspBoebhpuHmwj3Ntb7SQaKkouRkskdgoyBjYEfSIYFRuYHkXuRe497CG8GPIYFRvcEB4BRXl5PdAgw+Hf3EAcOi/cB9xPFu8X3EvcBAez191b1A/gp97oVXAZ7uwXGBqL7fRWHBmH3EwWsBvts9RW6BptbBVAGdPd8FY8GtfsSBWoG+BNRFcVG938h+39ABzL3fwX7HPt/BkWFBVfRWwdFhQVX0fuA9feA1gfk+4AF9xz3gNDFRrsGDqB292vn1ObT5wHk9x8D93j3xxXU9yMHXX1mcFEb94AExbB1WZgf+yLTBvfrQxVNBvcNdyi2+wob+0v7OQZHhgU2z/wQ9x/3a7cH9wnwvvcGnx/IBg6L1bXs90HuttUB5vcQ9y73DQPzFvg31fw3Bved90MVcXJ1gW0bXG2oyr6zqbSnoIR4ox/3DfeGFbz7DVr7LkH3LnwHj0gFpWxwmFobNTJI+wT7Ds5H87m0naeoH44GlGcF7/gmBtORBc8HDqB292vnssW4xa/nAeT3H/co9x0D93j4KBW49yYHjIOMgoEahYuFioUe+ycqFbL3EgdyeGx9YRv3gAS0qoBynh/7Ea8G9+tnFUQG6GoyriEb+0v7FQZIhgVXzl0HSIYFV8777vcf92u3B/PntOWsH9HFUAaMkYuRkRqUi5SKlB7GBg77AvdtLXb3jvcM9z/3aCN3oncSzvcn2+2a9xYTs4D33/eGFdf7DgaDf3aGdhs1VtX3HvcavNvitqx5bqofE2eA3NsFE2cAZLRXp1SUCBNzAPApBxNrACMH+xtwL/sJ+0sa+1Lq+wL3GHUeE6cAJe0HE2cA8QcTZ4DBlL2ktK8I98D7YgcOlnah9yQKoXcS2vcn7NwTXPfX9wIVTaNo1PcEGvcDrNXLoR73M/wGFXRxcnpthAj4OgelhKJ9oHrc2hhitVWmU5IIE6zmOi4H+yZ2KfsL+1Ea+1jx+wP3InoeJ9wHE1zwB8mVwKq3uwgOoHb3XfcJ0tXC9wlB1RLj+EcT7Pif+Q8V/EcGE/T7CdUH1bp9Ypwf+xcGOoUFR/dqB1x7W3M/G0H7CeEG9zj7XQX3Nwb7T/d006a/wJbgGdXVPwYT7IG0ca1mogj3KQYOlHb5G3cB9w33J/cy9xED96D3ERX3O/dFCsL3RQr3Evsn+1oHNmIFOgfgtAVUBzZiBToH4LQF+3wH96CE9zbt90oaloifhp8e+w1vBY98i4KFGkRAWTiDHg6n+OgBnPjKA+enLx0Op/joAZz4ygPnpy8dDqf46AGc+MoD56cvHQ5/2vdG2n/Z90baEqPw6vBh8OrwE733QPfMFeDLzfLyS8o2N0tMJCTLSd8f2QRydaLP0KGdpKSieUZHdHRyHzz7/hX3NvdbWLr7T/tBBfiA+J8V+zb7W75b9073QgUTw/sw/McV38vN8/JLyjc2S0wkI8tJ4B/aBHJ0os/Pop6kpKF4R0d1dHIfDn/J9xrK9yHK9xrJEqrf4t+o4OLfE/33MvgY9xAKVFw7O8JX0x/KBHV2nL+/oJihoqB+V1d2enQf+BbJFfxX+1qeX/hq9ygF/Dz8Q/cQClRcOzvCV9MfyQR1dp2/vqCYoaKgf1dXdnl0HxPD97FN9xAKU1w7O8NX0x/JBHR3nb++n5iioqB/V1d2eXQfDov3E0nN9w3L93T3Gh33U+kTrvjbyQr7GveaFdz7aPb3yzgGE7b3Ggr3zvxt9xMKWPdN+xoGE277DPtcBVj3NAcTrk7pBxNuyL4HDovi9yvh92j3Gh2195n7BvET2Pcq9wcKE+j3GgoT3K0d+7D8uxUT2veZ4i4GtbKy9z8dZh7IUwWinJ+Xnhunm3tyHxPcaUpVOVUeDov3E0nN9w3Li9nLw8XaEvdS8zDz9yLoE56A+OLJCvsQ96EVmJ+il6Ibo5mBe3N0g2YfUwcTnYC9ooBzeHiBdG9pmZp2H2JJBWn3KwrFsHilW5gfE66AtJmYoLAawFauSlRcenNsHvfp/HP3EwpX9037GQYTXoD7DPtcBVj3NAcTnoBO6AcTXoDIvwcOf9rLwsba92j3Gh33UfMw8xPs9yr3BwoT9PcaChPtrR37tvydFWj3KwrGsHilW5gfE+6mChPt9xUdf9rLwsbai+H3LOASt/eY+wXx9y3zMPMTnIC399gV95jhBhOagC8GtLKzt7kazlj3Bx3IVAWhnJ+YnRuom3pyHxOcgGlKVjlVHrv78y8d+7b8nRVo9ysKxrB4pVuYHxPrAKYKE9qA9xUdf8/3WtH3aPcaHbDpNunK6TbpE9gA9yr3BwoTKAD3GgoTnIBL3AdR/JBBCn/P91rRf9nLw8XaEvdT8y/0fek26crpNukTuSCx9/UVabq7hLQbEyIA1Mi0xbB3pVyYHxMcALOZmaCwGsBWrkpU4R1mH1MHEzIAvaGAc3h5gXRvaZmadj0Kf8/3WtF/2dPEqOIS1eC583zpNunK6TbpE64gsff1FWm6uIS4G9jEu8kfExYAyGCvSX14iIeBHhMMAI+vBfcZ4vtpBhM2AH37NbZvBZWdmZGfG6Oef3J0eH9ybmyZmnU9Cn/P91rR93TiEr33nPtj9wPX6Tbpyuk26RPsgPb32BX3AwYTMACQ9JrM1+EIwvucNAcTKAD3JgYT7IBTPG9UhjEIfPu8QQr3qvMB94r3AAP3iukV9wD3TPdE8/tE90z7APtM+0Qj90QGDqcK9wT4RwHf+EQD9zH3BBX3I/ck9yP7JNTV+yL3I/ci9yRC1fsj+yT7I/ckQkH3Ivsk+yL7IwUO1PcuvvO+9y4B92/3NgP3wPhFFbmuq7i4aKtdXWhrXl6ua7kfOvuvFV6ua7m5rqu4uGirXV1oa14e+yn3FBX3HgoO94D3fwH3S/d8A/dL9/axHQ73NvL3FvIB0fhgA9H4HxX4YPL8YAb75AT4YPL8YAYOqvjuAfcI9w0D9wj3rRX4FvuOBfcZB/ud9zoFjwf3nfc6BfcZB/wW+44FDqr47gH3//cNA/h4+BMV/Bb3jgX7GQf3nfs6BYcH+537OgX7GQf4FveOBQ6L8xLR9yn7KfhgE6DRFvceChPA91QE+GD7IgX3DQf7QLn7H60Fjwf3H633QLkF9w0H/GD7IgUOi/MS0fhg+yn3KRPA0Rb3HgoToPhg984V/GD3IgX7DQf3QF33H2kFhwf7H2n7QF0F+w0H+GD3IgUOi/P3UvMB94r3AAP3ivcyFfcA9xz3RPP7RPc8+wD7PPtEI/dEBvtE+7oV9x4KDvem+CD7GfcZEuH4QBOg4femFfcNBrn3FAUTYLj3G40KuPsbufsUBfcNBvsv+CAF+woGDvc28vcW8gHR+GAD47MV6AbT9w4F96ny+3AG1PcWBfcn8jIG0vcOBS4GQ/sOBfupJPdwBkL7FgX7JyTkBg73hPNv8xK/+IQTYPcg934Vwp6mpqYbE6DCrT/eG8nGtPO1HzO0BVN4cXFvGxNgVGnXOBtNUGIjYR8O9xDzbvPB827zEr/4hBOY9yD387wdE1j3RB3j+6a8HRNo90QdDveq8wH4OvcAA9H3qhX39PtM9wD3tPxgBg5/9wv3pfcIAfcC9x33BvcfA/f99zIVJLBI9wOtpJKTnB559wAFiYGFiYQbbnyWraKL9wqR4h/b9wj8hgZBhQX7AusH+wKE+xt5+xse9yeCBZT3GJH3H/cKGvcLBoo4h/sCbhoO9w33HPsC9vcR9xww9hJ+9vgw9hNc9xb3JxXItq29qR+PBhOcNsG8ctIb69ba9yD3AkLcMUdbbUVdH4cGE6zAbWGqTRsqSUL7ER8TXDHKO9seE5z3W/dfFb6prKKuG7uqalVgcGZeXm2qyW0fE2z7RisVaXSrra2dpK2opnlaoR9ieHN6bRsOf/cL+wb3DBLJ9yf3PfceE3DJ+1gV9ykGg9WKx4nbCHadpoelG7y2qsWmH48GE7BOnLBqzBurpJCSnB959wEFiYOHi4Ubd3yVqt6Q9ymQ9wgf+ygGE3D7xgdSbG13ZBtec6TSH/ez+ycHDn/3C/da9wT3HPcLAcf3G/dj9x8D96T2FWJnqMXWtK/Dr657X6cfJXZbZ1kbOfglFaiqq5uyG9qqR/sEH4WLhYYasmpboVwb+xEyLPsd+w3kP/b3O/cK9yz3efdKPfcN+y9FUXBcVR8O+zL3Avlt9wIS93L3GSz3GBPQ9zVfFX0hBYeWoYejG/cxqvX3IR8T4Pc5Zvch9y0a6Zayv5mXioiUHpr2BY6AdI90G/sxayH7IR8T0Ps5sfsh+y0aLIBlV31/jY2BHg479yT7JPoYEqz4zBNg92P4TBX7QkSlRtWqBROg9yr8LwXxBvds+hgFKQb7Mf02hXCGb4dwGYcGhaaEp4OmCA6L9xD4M/cFAZn40AOZFvjQ5Ab7WfjHBftFBvta/McF9zKuFc/3cML3V40KxPtX0PtwBQ6L9wv4NvcTEqf3K1D3HOP3HFD3KxPklxYT1PeI9QYT5FXKdNPxGvcFttzZ2bY6+wUldENVTB4T6CH3iPcL+wCPBxPktbe93vcAGvdJIPcR+zn7OSD7EftJ+wC9OLVfHof7AAcO+wz3EPiP9xABxviHA8ZqFTT4h/cQ+9GPB/dC9437O/eOBY/3svcQ/GU0B/dY+7cFDviP9xQBpPcn95T3JwOk+wwV9yf5B/eU/Qf3J/mH/LoGDn/3DviL9gH3QPck4vcKA/fQ+IUV4KKqpaGbdmFDblNRUx73PvtoFXZzbXRkG2Fopc0fpAf3JPbI5vcRGvVLyyr7ADtA+zwe+3AHbXdrd2h2wjEYm5WblJqVCCmh21rmG9HDsbK3Hw5/n/fInffGnwGl9xb3tvcUA/c4zxWHkYeRkxr3dAeNjY2NHvgyBo2Lj40a9077D/cq+yv7K/sP+yr7TvtO9w/7Kvcr5dm/28EeZQZHXUlfRRtVWaGxaR+H954ViYmNjx/3cAeSj5SPkR6vrb2hwRu9vXdprR+RhY+Dgxr7dAeHiYmHHg73VvcIAZj4vwOY944V96r7n9Ha+yr3GAX3+fcI+/kG9yr3GEXa+6r7nwUOcfi/AfeG9wgD9774pRX7n/uq2kb3GPcqBfv69wj3+gf3GPsq2tD7n/eqBQ73VvcIAar4vwP43veSFfuq959GPPcq+xgF+/r7CPf6Bvsq+xjQPPeq958FDnH4vwH3hvcIA/fCcRX3n/eqPNH7GPsqBff5+wj7+Qf7GPcqPEX3n/uqBQ73IveFAfdK94AD90r3IhX3gPeF+4AGDu333QH3G/feA/fA7RX3Ofc4+zn3Ofs5+zkFDsXVyPcfx9YB7dnF9xjF2QP3wPdVFbGnqbKzb6llZW9tY2SnbbEf+xsE9wbj3/cM9wwz4PsG+wYzNvsM+wzjN/cGH9UERlTA2NnCv9DQwlc9PlRWRh8O8bz3SdwB9ye890XbA/dY9ysV90n3RftJB/t2WhX3jgbDzgX3iPuEB0lSBQ6g+KABovi+A6Kg8gqg6gGi+L4D91H3CBX3A/dz9wT7cwX8GSzyCpD4vQHE+KEDxJDxHZD4vQHE6wP3Lfc+FfdzB/dy+wMF+9L7qfEdnvigAaL4vgP3vp4Vjwb3p/ieBY38vokHDvhT6wGi+L4D+DD4UxX7BPty+wP3cgX7OukV96f8n40K96f4nwWN/L4HDpD4vQGd+KEDnfesFfif+6cFjfi9iQb8n/umBQ6Q+L0B+FPrA/d1964V93L3AwX7cwfr+BgViQb8n/umBYcH+J/7pwWNBg73Mx2ouxX4rviU/K4H/M5RFfjlBszWBfj2/NwHQUoFDvczHfixuxX8lPiu+DUGSvsCUvsSZfsYCIcGcNZs1l3ULk4YyDC1PLAl9x6bGLj3OMr3HNH3AQjV96wVZWNlXWdXCPxeBkFKBf0A+OUHzNYF+OAHpKmlpqSjCA53+VgBe/kUA/erhxXc97T3Fvdb9xr3EzHZGPsb+x77DftxQ/uDCIcGa95j4FbdLk4Y0Si4NLX7BQgOb/duAfet3fcC3wPAxRVPxHHC9wzZ0PcWHvf9B9F0s09QGmeHcoFsHrx3BaOupMTDGttsxS3LHlmtgZR/ogg8/JgGkYNzkXEbLEBPQx8OgfcP+Eb3DwHZ+FAD94SBFfcMBvc29+j7Nvfo9wwd+zb76AX3cPttFVX3DV7ruOvB9w2NCsH7DbgrXitV+w0FDvf3998B93n3PQP3eff3FesGuvdOpfclBfsnBg739/ffAfcD+CkD9wP39xXrBrr3TqT3JQX7Jgb3a/vfFesGuvdOpPclBfsnBg6ECoQd+JDB9xzBAffU1AP3fviQFfcAh76/1RrVWL/7AIceVQfNn29jY3dvSR8O+JDB9xzBAfdl0wP4BPmEFfsAj1hXQRpBvlf3AI8ewQdId6ezs5+nzh8O+NL3OwH3I/eDA/en+NKVCpAd+NL3OwH3HvfYA/ce+NJKHQ740vc7Afce99gD94L40kUd+A33/wH3dPcsA/eT+A0V5Qaq9/8F+ywGDp4dkB340vc7Afci94MD96b40r4K+533/wH3dPcsA/ft7RUxBmz7/wX3LAYObh34z/cxAfcE9zHJ9zED91P4zzsKnh340twB9y3d9xbdA/fA+NJOCo33Ix2JCvjR9ysB90P3+AP3Q/jRkQr4zfdQCvjNKgr3SR33rfUD93M/FbiAmH16GnFpfn8d6fcGCmqWHp+6BTUGDvtm4gH3au4D92r7CxV0Cqmcp7CoHzgGcXlfX1AaDvjS9zsB9yP3gwP3p/jSlQr3Lgr3HveBA/eW+VKMCpAd9y4K93X3gQPBHQ740vc7Afce99gD9x740kodDvcuCvcY9+QD94n5UhXAyAU6Cg5uHflT9xwS9xbWQPfoQNYToPf/+VMVE9DIHUAGSQobE6D3AQoOnh35ZOgB9zP3rgP3M/lk9gr40twB9y3d9xbdA/fA+NJOCo33Ix35UvcMfgr3wPlSFeK1vNKTHzoGVx0O+M33UAr4zSoK+VH3LgH3a/c+A/fA+VGLHfjP9zEB9wT3Mcn3MQP3U/jPOwr5UPQK9135UDwd+TrV90sd+MEVYB0O+cHU90sd+UcVNR0OiQr5TfcwCvlNnx340fcrAfdD9/gD90P40ZEK9y4K9zf4BAP3mvlSjwr40vc7Afce99gD94L40kUd9y4K9xj35AP39/nKTh340fcrAdD3+AP3+floFfsJBur7KwXlBvuD9ysV+wkG6vsrBeYGDvcuCtD4BAP4SflSFUz3DAX7EQbk+wwF+yT3DBX7EQbl+wwF7gYO+LT3AQH3fMYD99/5iBVHcWxcUxpVoW63qKOhrqtyn2+JiIuKiR6PpqCesJgIDvkZ9wAB98bGA/ee+LEVz6Wqu8IawXSoYG5zdmdro3injo6LjI0eh3B2eGZ9CA74P/dnAff59wYD98H4PxXokNix4xqsfah8nR4mXwWTgJN6eRphcH5jhB4O+5H3UAr7kSoK+2z0Cvdd+2wVtKips7JuqmJibmxkY6httB/3Wha0qKmzsm6qYmJubGRjqG20Hw77ecZQ908S96z0E2D3nGEVE6BvVQWpZwoTYPc1HfdJHfes9AP3cT8VuIYdtHOhaZYen7oFNQYO90kd96r1A/dwPxWSHWqWHp+6BTUGDvtm4gH3au4D92r7CxV0Cqmcp7CoHzgGcXlfX1AaDvtz6gH3Z/YD97KNFW94XFpM9xgKgX6Efht2dpelqaGsr6gfDvtm2wH3Nd33Bt0D98D7ZhXots3Ujh85BmqHeXFoG2h5payHHzkG9zQK+1HpAfc296gD+Eosrx34z/cPydAS9x/3ECb3qCb3EBPo9134zxVQHfdaFlAdE9D7gfdNFfeo0PuoBg75UPcPvNAS9x/3ECP3riP3EBNQ9zP5/BX3rtD7rgYT6LX7hWYKDvjP9w+29wOzCvd8+XUV6Qb3B/cDBfsSBvsG+6kVUB33WhZQHQ75UPcPqvcMswr3dfnqFfcJBvcK9wz3PB0i+6ZmCg74z/cPtvcDswr3gvl19zod4fcDBScGXVEFhwZdxQUnBrz7qRVQHfdaFlAdDvlQ9w+q9wyzCvdd+VBmCr4d+M/3D7b3A7MK97H55BX7Egb3B/sDBekGqvs6FVAd+1oWUB0O+VD3D6r3DLMK97r6YhX7Lgb3CvcdCqP7LhVYCmMd+1oWWApjHQ740vcUU/cKEvc1+DsToPc1+NIV5Qa6zI0KkAr3OVMV3QYTYPcAHflS9zYK9yL4WROg+DH5lhXeBhNg7vcMBfsGBhOg++f7UD4KDvjS9xRT9woS9zX4GBOg9zX40hXlBrrMjQqQChNg94P3TR3vCvlS9zYK9yL4IBNg+Gn6DhX7BQbt+wwF3wYToPwgRz4KDvjS9xSwyQH4XusD9zX40hXlBrrMjQqQCvdYQRXKlMCezRq5Zan7AY4efU0FvoiZ90cK+VL3BrTHAfhe6gP4SfmCFYod+7AsPgoO+NH3A6/XZdcS9y33ukrLE7D3LfjRhx0T0HyvFROw9wgKE8j3TQoTqLfaChPIcIb3Ox0TsPcRChPQ7x35UvcGr9dl1hL3IvfQQ8oTsPci+VI+ChPQdK8VE7CmkZiWnBsTyKanZcAbE6i4sa7Zkx9MBhPIcYX3Ox0TsHBvsFYbE9BeZWg9gx8O9z0d95L5SBXVBuT3CgUhBoD7gIUdDvc/CveT+bwV1Qbw9wsF+wMGePt1FdQdSAZPHQ73PR33tfm+FSEG5PsKBdUGXfsKhR0O9z8K9636MxX7Awbw+wsF1QZeIRXUHUgGTx0O+NLTv5rryQH3susD98D40oUdrh35UpYKt/srFdQdSAZPHQ740tDY1z/3BhL3NcT3OMsTuPfA+NKaChPY900KE7i32goT2HCG9zsdE7j3EQrvHflSzd/3BgH3OLz3Pc0D98D5UhXUHUgGTx37LfcqFfcEHUkG9xQdDvjR9wOu0AH3Lfe6A/ct+NGHHc6uFeC0v8qOH0YGcYZ6d2UbZXqfpYYfRgZMjrRX4BsO+VL3Bq3NAfci99AD9yL5Uj4Kyq0V4ba30pIfSAZtg3p4Xxtfep6pgx9IBkSStl/hGw74uPdyAf8A/4AA/wBagAAD99X4uBWj9y2N9xUK+TXGAfdq9QP34/i1FafBBW6SfZadGqKulbuQHoDGBSyGOGxHGlmrcuSDHg4ODg4OdgpG+XYD9xId+Xb3HvdVCjgdAUb5dgNG9zcV+Xb3pvdVCvwkHAV4Wh0cBXj7HgYO/CQcBXiDChwFePdWHXYKrPcazfcazfcaA6z3exX3Gvce+xoG91z7HhX3Gvce+xoG91z7HhX3Gvce+xoGDjgdAaz3Gs33Gs33GgOs9zcV9xr3pvsaBvdc+6YV9xr3pvsaBvdc+6YV9xr3pvsaBg77Jfdy9wP3cvcD93J+HfslFfce93L7Hgb3AwT3Hvdy+x4G9wME9x73cvseBg77Jfdy9wP3cvcD93KYCvslFfdLCvcDBPdLCvcDBPdLCg52Cp33BbD3BbD3BbD3BQOd93v3LAr3Kvse9ywK9yr7HvcsCvcq+x73LAoOOB0BnfcFsPcFsPcFsPcFA533N/cIHfcq+6b3CB33Kvum9wgd9yr7pvcIHQ77PfdQyfdQyfdQyfdQfh37PRX3Gx3JBPcbHckE9xsdyQT3Gx0O+z33UMn3UMn3UMn3UJgK+z0V9xwKyQT3HArJBPccCskE9xwKDvd79x5aHfkL98D3HvcgCvc396ZaHfjH98D3pvcgCvd79x6DCvcJHfyOBg73N/emgwrGCvyOBg5RHfcSHffA9zsK+ZX3IAp8HffA9y8K+dn3IApbCvc3CvmV/I4GDnsKxh352fyOBg73Mh33exX4Svce9wodBg73Dx33e/c3FfhK96bUCgYOaB33N/d7FfiO9x7oCgYO0h33N/c3FfiO96bpHQYOUR33Eh34SvmV0gp8HfhK+dnTHVsK+I75lfcACnsK+I752fYd93v3Hlod+Qv3wPce9wodBg73N/emWh34x/fA96bUCgYOlx0TwPc393sVE6DP9zsK+Qv3wPceBhPA6AoGDpcdE8D3N/wkFfem9wkdBhOg9wod/QsGE8BHBg73e/cegwr3CR3oCgYOOB0STR0TwPc39zcVE6DP9y8K+Mf3wPemBhPA6R0GDjgdEk0dE8D3N/wkFfemxgoGE6DUCvzHBhPARwYO9zf3poMKxgrpHQYOUR33Eh33wPc7ChwFeNIKfB33wPcvChwFeNMdjB33wPc7CvkLBhPAz/mV9wAKjB0TwPc3CvmVBhOgR/dHHVsK9zcKHAV49wAKOB0STR0ToEb3NxX3wPcvCvjHBhPAz/nZ9h04HRJNHROgRvc3FRPAxh352QYToEf3SB17CsYdHAV49h1RHfcSHffA9zsK+Qv3wPce91UKUR1G9zcV98D3Lwr5C/fA9x77wM/3IApRHfcSHffA9zsK+Mf3wPem/EpHdwp8HffA9y8K+Mf3wPem91UKWwr3Nwr3CR33VQpoHUb3NxXGHfcJHft8z/yOBg5bCvc3CsYK/I5H9wwKewrGHcYK91UKUR33Eh35dvce+8D3Rx1RHUb3NxX4Ss/3wPce+8D5C9MdUR33Eh33wEf4Svem+8D4x9IKfB35dvem+8D3SB1bCvl29x77fPkL9wAKaB1G9zcV+I7P93z3Hvt8+Qv2HVsK93xH+I73pvt8+Mf3AAp7Cvl296b7fPjH9h1RHfcSHffA9zsK+Qv3wPce+8D3Rx3nHTMKE6D3QAoTYPkL98D3HvcKHQcToPzH+8AHDucdMwoTYPcSHffA9zsKBhOg+Mf3wPem1AoHE2D9C/vABw58HffA9y8K+Mf3wPem+8D3SB2MHffA9zsK+Qv3wPceBhPA+3z5C/cACowdE8D3Nwr3CR0GE6D7wPdHHVsK9zcK9wkd+3z5C/cACpMKE5D3QAoTUPjHz8/3fPceBxNg6AoGE6D8x/t8Bw6TChNQ9xId93xHz/cvCgYTkPjH98D3pgcToOkdBhNg/Qv7fAcOkwrfCgcTUPt8z0f3Th0GE5D8x/vABw6TChNQ9xIdE2D3NwoGE6DGCgcTkNQKBhNQ/MdHR/t8Bw44HRJNHROgRvc3FffA9y8K+Mf3wPemBhPA+3z4x/YdOB0STR0ToEb3NxUTwMYdxgoGE6D7wPdIHfcoHd8K6AoHE6D8x/t8Bw73KB0TYPcSHfc3CgYToMYK6R0HE2D9C/t8Bw57CsYdxgr7fPjH9h12Ctb3Kvcq9yoD1vd7Ffcq9x77Kgb3wPseFfcq9x77KgYOOB0B1vcq9yr3KgPW9zcV9yr3pvsqBvfA+6YV9yr3pvsqBg5A9473jveOfh1AFfce9477Hgb3jgT3HveO+x4GDkD3jveO946YCkAV96b3jvumBveOBPem9473Vh00HQFG+XYDRvgFFfcBHfwwBNMK/CQcBXihHRwFePsdBvenHPqI9wUKrQr3IAr3e/ceoR35C/ce9zgK9zf3HvxKBvsdBg5bHen8JBX3HfmV+Er3HfzTBven/h4V9x34gvc39x13CmwK98D8gvce+h73IApiHfgF9y0K+ZX80/se9zf3OAr3HgYOWx1G+AUV+Er9lfcd+h780wb8MAT3Rh0Osx33e+kV+ErQHfvA+IL7HgYOYh3p93sV+NP3Hvs3+Qv3DwoGDlsd6ekV+NP3HfxK+ZX7HQb3p/0Luh0ObAr4Svoe+x78gncKYh33Eh340/mVuR1bHUbpFfjT+h77Hf2V/EoG9x4EwgoOrQr7wPiC+x4GDmId+AX3LQr5C/c39x77N/kL+x0G+6cc+oj3BQpbHen8JPcZHfen/Qu6HRz6iAT3HfiC9zf3HXcKbAr3wPyC9x4cBXj7HvyCdwpiHfcSHfc3/Qv3Sgr9C/s3BvhK/ZX3BQpbHfgF/CT3GR38Sv4eFfdGHfceBMIKDrMdRukV98D8gvce+IL3wPcuHfceBNMKYh33Eh33N/c4Cvce9zgK9zf3HvdVClsdRukV9ykd/QsV9x34gvc39x37wAb8SvceFdMKsx1G+AUV+Xb3HfvA+IL7HvyC+8AG/DAE0wpiHfcSHfl29x77N/kLuR1bHUb4BRXCCvhK+x26HfxK/h4V0wpsCvfA/IL3HviC98DQHfvA+IL7HvyCdwpiHfcSHfc39zgK9x73OAr3N/ce+zf5C7kdWx1G+AUVwgr8MAT3KR33HrodHPqIBPcd+IL3N/cddwr3e/ceWh34JAb3FPLy9xQe0PceRgb7YPs5+zn7YB8OUR34BRb3YPs59zn7YB5G+x7QBvcU8iT7FB/8JPceBw5RHfgF+nwV+x78JAb7FCQk+xQeRvse0Ab3YPc59zn3YB8O9zId+OwV+2D3Ofs592Ae0PceRgb7FCTy9xQf+CT7HgcO+6EcBHIBRvl2A0b7FxX7HvceB/js+nwF9x77HgcO8B347P58Bfce9x4GDvAd95f8Q/uX/EMF+x73Hgf3e/gW93v8FgX3HvceBvuX+EP3l/hDBfce+x4H+3v8FgUOdgpG+EoDRvczCvd7+ZV+Hfd7Ffce+ZX7HgYOdgr3e/hKA/d79zMK/CT5lVod+ZX7HgYOOB0BRvhKA0b3NB33e/mVmAr3exX3pvmV91YdOB0B93v4SgP3e/c0Hfwk+ZWDCvmV91YddgpG+XYD9xId98BH+Er3pvxKR3cK9yUK/CQV96b5lUf5C/se/QtHBg52Ckb5dgNG9zcV+ErP98D3HvvAz/cgCvclCvd7Fc/3Owr5C8/5lfdWHffA+IgBi/jsA/fABPjs+Ij3IB37XPcRgQr3EfcgHftc946BCveO9yAd+1z4C4EK+Av3IB37XPiIgQr4iPcgHftc+QWBCvkF9yAd+1z5goEK+YL3IB37XPn/gQr5//cgHftc+nyBCvp89yAdqgr4odYK+KH6fPyhBg6qCvhW1gr4Vvp8/FYGDqoK+AvWCvgL+nz8CwYOqgr3wNYK98D6fHcKqgr3ddYK93X6fPt1Bg6qCvcq1gr3Kvp8+yoGDqoK1tYK1vp8QAYO+1z6fPcmHfp8dwqqCqnWCqkGbb0F98BZ9w4K+Oz8iOQd4h0Oqgqp+Dj3KtYKqQZtvQX3KlkVqQb7SPfABVkH98D7jvcOCvhW/IgVqQb8dPm0BVkH+Oz9guQd9yIK4h33wPcyCg6qCqn4OPcq1gqpBm29BdZZFakGIvdDBVkH9yr7ERWpBvtI98AFWQf3dfuOFakG+5P4PQVZB/fA/Av3Dgr4C/yIFakG/Cn5NwVZB/hW/QUVqQb8dPm0BVkH+KH9ghWpBvy/+jEFWQf47P3/5B39/xW9B/yD+c0FbQb4ofciCv0FFb0H++340wVtBvgL4h33wPwLFb0H+1f32QVtBvd19zIK9yr7ERW9B17WBW0GDvk39xEBi/jsA/k3BPjs9xH3IB29Hfih1gP4oftcFdb6fEAGDvtc+IgBi/fA1gr3wPcWHftc+Ij3Jh33Fh33wPiIAYv3wAP3wAT3wPcWHaoK98DWHfiI+8D3Fh33JR35tAT8iPfA+IgHE6D8iAT8iPfA+IgHDqoK98DWCvfA+Ij3wPiI9yAdvR33wPfAA/fABPfA/Ij3wPp89yAd98D4iAH3wPfAA/fA98AV98D3Fh33JR37XAT3wPiI+8AGE6D3wBb3wPcWHb0d98D3wNYd+nz7wPyIdwp/l/iEl9GXuJeQl7CXBvtYlwd/l/h6l9eXv5eRl7eXCPttlwkeoGJfDAmLDAv3Bwr3Kgv3BwwM9yoMDfjsFMsTAS0CAAEAMQBlAJkAvgDXARwBTAF6AYUB3QHgAgcCQAJ/AqkCzQMFAzkDoAOlA78D5gPxA/wEAAQFBBYENwRNBMUEzwTfBQ0FfgWKBY8FmwWhBagF5wYVBi0GNAZgBmgGbwaCBosGkQaXBrMGxQbKBtIG3QbyBvsHCQcRBxcHIQd2B3sHggeSB6AHrgfXB+gIDggWCB0IIQgmCEwIZgh1CIMIxwjiCOsJLwk3CTsJQAlMCVAJVAmUCbQJvAnDCdIJ3wnkCiAKLgo1CkMKSwpjCmsKdwqBCogKtgrCCs4K2greCvcLEAsdCzMLNws/C0cLUgt+C4ILhwuOC7YL4Av3DAYMGwwxDEEMRgxKDE8MVgx8DKEMsQzADMUMyQzQDNwM7AzzDQMNIw0xDTYNQA1HDVkNZA1sDXUNgQ2ODZUNmQ22DcEN2w3iDegN9A35DgMOBw4ODhUOGg41Dk8OWA5eDmMOaA5wDnsOhg6MDpAOlg6bDqAOpQ6sDrAOuA6+DtAO2w7wDv8PBA8RDx4PJQ8vDzkPQw9KD1EPVg9bD2APYw92D4kPkA+kD7YPyA/OD9oP5g/qD/EP9xAKEBsQIBAkEC0QNhA9EEQQSxBQEFQQYBBrEHYQgRCHEIwQnRCkEK0QvRDNEN0Q5RDtEPQQ/BEDEQoREBEUESIRMRE2ETsRQRFPEV0RaxFvEXcRgBGJEY8RlRGaEacRtBHBEcsR0hHWEd0R5BHrEfAR9RH6EgYSEhIeEioSNRJAEkUSURJVEmESZxJxEnsSgxKLEpMSmRKfEqQSqRKvErUSwBLLEtAS1Pda944V6bm3waimgnOmHvtdB2pxb35qG05ot+0f+yuJFfs23yn3EbvBpq+vHo4GCxWax5zMndeb0BmPBpxHnT6cSppPGND7ohX3MAb7X/kgBftEBvtf/SAF9yoGs/cvBfdZBg6690wd9w4s9xf3F/cO6vc59zn7Dur7F/sX+w4s+zke9ysW4a3Cz8+tVDU1aVRHR2nC4R4Ly/ePFfs92i33M/cy1+n3PR74Jfsi/DQHPW1gTU1uttkezgoHC/chlhW2s6r3JpMeOQdwaGV3XxthcJqrHwu399YV+2/3GPsH9zve2LG0tx73wPt3+wzq+wQHfn1yhHIbJFfZ9xr3F8va4L+peG+nH9zmBbVhTrQzG/s9+xj7EPtuHwsoHRP0oDAdE+0gk3Nvj20b+wQnTvsLUaher3MfhwcT9KBoc3NnahphonGmeh6HBwv3dhb3KPdwBvdm+ET3PB1J+zF3WXdcdlcZhwZ3v3e6eL1J9zEY+zIG92b8RAULxLSuwcFisVIsHQsD5hb3Kway92GTtJG4j7IZjgaOZJJek2K0+2EY9y4G3PkgBfsgBnj774lVilOJUxmHBoHDfcSBwGD3SRgyBl77SYBUfVOBVBmIBorCicKKw3b37xj7KgYLFfIdf1gFhwa1ZV6gVxv7BiYo+yz7I98m9xG6wJ+rrB+ISwVchmVoQhsL90L3YhX7FsMz9zLLwZmYtx5x9QWBbmuDZRtDa6jWH/dC92b3B/tm9xj7DQd4+xj7GIUF+wH3EQcLA8L31hX7b/cg+wf3PN3RrMrBHjrkBWhrZnRcGylH2fca9xfP2ue6rXhvqh/c5gW2X0mzOBv7Qvsd+xL7bB8LyfjdFfck/BsG+xLLO/cRya6Wm78eavcABX9sc4d0G2Jkn8gf+JX7twcL998Hra6lnbMbwZ5tSR/7s/cn98YH9xFZ2PsEQVVnYWAehwYLzvdMHfcMLPcwz9iivcceT+gFcmhfdVcbOVLC4eHGwuCwrn9wsR/P5gWyYUmnPRv7LfsaLPs5Hwv3JxPdNAoT7SsKE91iVJalXB/3O/dDFVFjud0fE+3evbm9qqaCc6Ye+0QHE91ocG9+axsLFZqVm5uTHqqCooB2Gnp6f3R0epeeHhPYwPYVcJR6lJ0amZiVnJ+Yf3t/hX9+gx4T5Psn+wcVWcJi2trCtby7cZ5onR6PBxPYqZminK0awlSvREdSZ1RjoX6pdx6HBxPkbXtseGEaDvd79x4L9xNfFVonBWbF2nzCG/c95Nn3Gh/4dPsHBwv3L/h7FZOAk3p5GmJxfmODHppqZ5JnG/sX+w4s+zn7OfcOLPcXHwuWWAX3DPiE+wcGC/cGOnb3e+PT9wkLf0MKCwEzCgML6x33BQYr9wwF+yQGK/sMBQsVmB1damlfXqxpuR/3bha5rK24t2qtXV1raV9eq2m5Hw5oCur3D7b3AxLJ9ydB9w/W9w89PR0LH5j8Gy8dE4Eg+1f8ZBWalpuakx6qgqOAdhp6eX90dXmXnh4TQMDA9hVwlHqUnRqZmJWdnph/e3+Ff36DHhOBIPsn+wcVWcJi2trDtby7cJ5onR6PBxNAwKmZopytGsJVr0NHUmdUY6J+qHcehwcTgSBte2x4YRoOFfMGv7Id+xIGC9r4ERX3W/wR9yf4hPvuBgsVKx3EtK7BwWKxUh9E9+oVmseczJ3Xm9AZjwacR50+nEqaTxih+BIVnR33MAYOLx37V/xkFZqWm5qTHqqCo4B2Gnp5f3R1eZeeHhNDAMD2FXCUepSdGpmYlZ2emH97f4V/foMeE4SA+yf7BxVZwmLa2sO1vLtwnmidHo8HE0MAqZminK0awlWvQ0dSZ1Rjon6odx6HBxOEgG17bHhhGg5cHVNiZVVVtGjDHw5FCn93C1cK93/YBvcR+38FC/cMNG0dC/cT+Dr3EwtZCu33OxK69yn3TfcnE940ChPuKwoT3mJUlqVcH/c790MVUWO53R8T7t69ub2qpoJzph77RAcT3mhwb35rGwvTFvcn998Gra6lnbMbwZ5tSR/7s/cn98YH9xFZ2PsDQFVnZWQek+oF90D7JwcLaoR9f3psaLhVG1deXjCBH9YGrJKZl5wLg5m0ClgdC8wW900G90n3EfT3dPd0+xHu+1Ef+0UG9yj8qRX4MqAH8dBb+zD7MEZVJR8L+wQkKfs2Hwv3C/eu9wsLFe651tyNHzkGYYZ3amMbY4kdCxX7MAY69x0KCxX7KnIKCxqsffcjCsMW+H/3EPvJBvfF+EsF5Pxe+w/3qQf7xvxMBQsVkn+Te3kaV2GDY4keE/Q3HQv7kfdJC28dE72AJAoLaR3eqc8avWv3OQrQqrrI6xr3L/sGu/seHvt7/SD3JwuvpaaurXGmZwv7WPcH6fcK95X3DH93C9UK2fc7ZB0LaB33Eh0LYm5tY2OobbQfC/cnE72694wVE937Nt4p9xK9vqavsB6OBhO9llgF9wz5Ufsn+z0GkD4Fq2hooFIb+wAjKfs2HxPd9yuNFem5t8GopoJzph77XQdqcW9+ahtOaLftHwt/NwrNC3/3E/itdwsF9wQGK/cMBfsjBiv7DAUL+2fn7/cEy+T3I/Y07gv2FvhJ9xD7tvik+ycGC9r4ERX3W/v5BkN2akRua5GdYx5gIgV3trx9yBv3SL309w0f+Gb77gcLyAX7BAbr+wwF9yMG6/cMBQ4V4MrN8/JMyjY2TEwkI8pJ4B/aBHJ0os/Pop6kpKJ4R0d0dHIfDhVYCoUKYx0LSgrdqc8aC39qHQsgHRP4C6B2+A/3FXeff/cvHRL3CPcnE6y0HRPMfQoTrFQdE5x/9wD3DB0Lyxb3J/ek90b7pPcn+SD7J/uP+0b3j/snBguzHUb4BRX3wPse+8D7HQtDFSsdxLSuwcFisVIfCxV5dZWugx+XmpuRmhujmIB3d35/dR/3E/dsFaNuZ5xfGyBSPDEpw0bp08C9ychkrE9rcYF5dh+3kJ6uvhujnoJ9nB8OxRWSf5N7eRpXYYNjiR4T+DcdE/zRmMGx1lEKEsn3J/c99ycLzBb3CfdpBtJ/9y6E0R6PBrz7R737LwXMBr33L773RwWOBoRFf/suRBr7afcL+SD7JwdM+3t1MQWIBnXlSfd7BfsnBgsGMvs7BfYGC3+CHQuACpamC/dM+zd2+Gf3TYt3CzMKAQv7wAYO9+MHq5mXm54bnpV8bB/75fcF9+MHq5iZm54bn5N8bB/75fce9/AH7mLIRlNoZ155HsB/bKdfG1JtamJ4H4cGCxUhs0DPQR7auwVVym7R1RrUqNHByh48uwVHQWNAIhoOFfeo6PuoBg7SHUb3NxUL9y/29xT3afcBbuFbxB8L5LXLq8gbsJ+GgqofCwE4HQML95Dd90jeAfcZ9fcO9QP3Gfg8FfsB2kzj49rK9wH3ATzLMzM8S/sBHvUWwp6utbadaFRVeWdgYXivwR4OtgpszQWFgn6Ffht2dgsBi/js1h0L9xf3Dur3Odxuy163HwuYCvwkFfemC/e291T7VPgrEvdM8BNg9/v3QgoToGwdDmMd91oWWAoLFfcIwMXg9wEarAoLFfMGwLId+xMGC9wd9073Jwv4uMLpwgH3T9Pd0wP3wPi4Fc65s8nJXbNISF1jTU25Y873RAqinXhvb3l4dB8OXB1TYWVVVbVowx8Oxx1KBmaFdG1eG14LFfcJBjr3DAX7MAYOBY8GCxUT9aMdE/mFCh8T+mdxcGkfE/lopXCvHgsV5PcMBfsRBkz7DAX3RxbuBuX3DAX7EQYOukoF5QY69xQF+wgGCxXlBur3K/cwHfH7KxXmBur3K/cwHQ6pdB0L9ygd+2L3Hgt9HXeEc4ceCxX2BjL3OwX7KgYOzbGb5sgB97XpA/eg+boVy5C+osYat2as+wGPHn1OBb2Hm4F4Gnp9hXiHHgvNpR0Lfgr3NwvL9xIK9yILFei2w8qOH0YGcYV4c14bXnijpYUfRgZMjrZT6Bv7JvcmFcsG9wgKCwPXFvcn9xEG1Nj3FvteBfczBvtf97j3UPdgBfs1BvtK+1wFh/gp+ycGCxXJVPc/9y4F9yYH+z/3Lk1U9xP7QAULFfcP90kKVisFhwZV9yQdrfsQjx56QQXFiKGAeBp4d4Ryhx4OFcnC+xP3QPcT90BNwvs/+y4F+yYHC9ES9zrpNunK6TXpE+T3mAv5eVAKCxZhHQvbHX93CwH3dvcoAwv4keMB9zDz9PMD9zD3mBXz928GnqCalqMbrJd5Yh/7UvP3XwfdC7SZmKCvGsBWr0pUXHlzbB62TQWXn6KYohukmIB7c3WDZR9UBwv3qvMB0fhgA9H3qhX3HgoO4hL3Rfec+2T3BBOg930L+F2hCgu9HYsLZIJ+fnYbC+9hx0BUYmNOVLFmC+n3Hfce9x1aHfiC98DQHQv3SQpV9wYd95/32hXtubEK5h25QO4bCxWowQVtkn2WnRqirpW7kB6AxgUshjlsRxpZqnLkgx4O1tyOHzkGYYZ3amMbYgv5yk8KCwH3H/cQ1fcQAwuBeBp0aIILFeUGrveBkPclBfs+BpD7JQULT7psxqq3mJ+lHgvNFvch93sGCyQKavg9FeYGC/b3zPdKHYQIS9wHDvdG2gH3LO/r7wP3wAv3OwX7EAYLFYsKC2zNBYWAgIV+G3V3l6Wpna7Anx/4hPvu+wf3WwcLFfYGM/c7BfsrBg73AGHLOU1ZYk1Jv2fDj46LjI8eTGBaNG0eDnUKEs33IQvjCrr3Kwv3wPkL+x38gvs3Bgt/WR3NC3b3f/cJ90v3CQvWxwoL+Mf3fPemC5DLqc8awQsSuvcrC/i7FUDU+zb7W75bBfwQ+6gV1kL3NvdbWLoFC/sBzfwR9yf4EeX3BzGpB76gn6+bnoeFmx4LFcDIjQrB9wUdp6hWvRsLdviEdwv4NPsnC/eJFfsrcgoO9xUB94H3EgP3gQvCBHR5nqennZ6iC/se/Qt3CvcBHQ77wPdOHQug9wIdCwP7XAQLFfcA7B2gOh299wYLEnIdC7Gv2ZQfSwYLVk4FhwYLXwrS9xz3Cwo61vdR9yL7IdYLFfYGwOqNCsH3KQr3W/cDAZ/4xAOf91sV+MT3A/zEBg4ToEb3NxXGHQYTYPcJHQv3wG0KCxL3QPeZ+wbyE6D3QAv/AEOAAP//vIAA0kQLRQr3VXcSCxX7CVZRNvsBGgv3DAH3xNAD940L+JEB92rzA/dqC/cH96r3Bwv7fPkL+6YLVArodgug9yQKC/fAfxULBPIdFU+2YcTEtrXHxmC0UlJgYlAeDhXEtK/BwWKwUlNiZlVVtGfDHw7q+woF3QYO+x45Q2xZTR7VMQWut7SgvRvFrwtJuljQ0Lq+zc1cv0ZGXFdJHg4V+L6NBvun+J4Fhwb7p/yeBQ73HhJNHQv3IAH3F/cgxfcgAwu+2gH3Nezf6QP3xwv3HB0O+6b9C/cMCqquXsEbCxXot83UjR8T/DkGaod6cWcbaAsBw/cXsfcqsfcXA+sK9yfsCxX3DQoL9xkdDpDeqdAatHKhC/fYFfb3yzgGC6aQmJacGwv3C/dU9wsLQ462SOgbCxLL9ycL+3wGDpgdXGtpX16rabofCxWpBvve+LoFWQcL+x39C/se+Qv7HQsV1MK/29tUukJDC292sVYbC/cn90sLFazGrckFjgaGKAV1B/clFgtUCsf3QB0L0AUtBpD7cgUO/wCogAB3Af8A9YAA9wEDC/jSFTL3OwX7Kgb3GPs7BQsaT75pyq63mp+lHmnVBYQLAfep9gP3qQtrd3WCWIUIC9P3Egr3Kwv3pvdQ+6YGC/sMBfcJBgv4YPP8YAYL9xD4pHcL/EoGDpfBjQpgtLt0uRv3A/ML/YIVvQf8OPlQBW0G+FYLqHydHg52+SB3C/dCHfc3C/cgEvcX9yBe9yhe9yAL+wAHXHBaeUF+CDD3Fwv3AgHA9xr3bPcbA/euC/dBCg4V+zAGO/c1Crq7hLUb08i0CxX3Bfce+wUGC/wkFfcdC/lS9wwBC/zH9x4LwuHCAfdP09zUA/fAC/uO+nwB93/3FgP3fwv7jhW9B/sM91wFbQYL93sV+Er3HvcgCkKOtknoGw73HQoO9wZd9wwSC/d8/Qv3pgv9C/cd+QsLpDKUHg4FhwZWC/0L9x4LAarw2fb3E/UD+LoL9zTSwKCswx5h1AULBp/3OQU3Bnb7OQUL+VLNs5kB9zj3pAMLRvc3FffA9y8KBgssBfYGJvc791UdC/lN5AoLzGEFo7ahk7UbzrwLH9EKCwf3NNgF3Af7ND4FC6nPGvc1HYB4Gnp/hHmHHg77OPsL+Fv3CwcOBvD3OwUgBgv3HRwFePsdC/em93L7pgYLdvik9xALp6BlwBsLEun3Jwv3WhavC/dJ9ywdCz4dsfcGC/dz+xLn+xf7DiELBa2vtKq+G82xaQtxhXt3C/12Bg4CWAAjAAAACQBUADcAQQBeAGwALABAAEoAOwBEAGsAQQBCACYASgAkAEYAMgAfAEAADwAEABIAEAA4AD0ASABDAC8ANwBSADQASABPACoATAA+ACQASAAvAEgALwB0ADUAMQA+AB8ABAAlAB8ARgAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJ//0ACQA3ADcANwA3ADcAQQBBAEEAAgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4ALAAsACwALAAsACwALABAAEAAQAADAEoASgBKAEoASgBKAEoASgBKAEoASgBKADsARABrAGsAawBrAGsANgBrACEAQQBCAEIAQgBCAEIAQgBCACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAJgAmACYAHgATACYAJgAmACYAJgAmACYARgBGAEYARgBGAEYAMgAyADIAMgAyADIAMgBAAB8AHwAfAB8AHwBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAABAAEAAQABAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAACAEkAOgA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9AD0APQA9ABAABgBDAEMAQwBDAEMAGQAvAC8ALwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANwA3ADcANAA0ADQANAA0ADQANP/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+Bn8GgAaBBoIGgwaEBoUGhgaHBogGiQaKBosGjAaNBo4GjwaQBpEGkgaTBpQGlQaWBpcGmAaZBpoGmwacBp0Gngd1bmkwMDBEB3VuaTAwQTAHdW5pMDBBRAlvdmVyc2NvcmUDbXUxB0FtYWNyb24HYW1hY3JvbgZBYnJldmUGYWJyZXZlB0FvZ29uZWsHYW9nb25lawtDY2lyY3VtZmxleAtjY2lyY3VtZmxleARDZG90BGNkb3QGRGNhcm9uBmRjYXJvbgZEc2xhc2gHZG1hY3JvbgdFbWFjcm9uB2VtYWNyb24GRWJyZXZlBmVicmV2ZQRFZG90BGVkb3QHRW9nb25lawdlb2dvbmVrBkVjYXJvbgZlY2Fyb24LR2NpcmN1bWZsZXgLZ2NpcmN1bWZsZXgER2RvdARnZG90CEdjZWRpbGxhCGdjZWRpbGxhC0hjaXJjdW1mbGV4C2hjaXJjdW1mbGV4BEhiYXIEaGJhcgZJdGlsZGUGaXRpbGRlB0ltYWNyb24HaW1hY3JvbgZJYnJldmUGaWJyZXZlB0lvZ29uZWsHaW9nb25lawJJSgJpagtKY2lyY3VtZmxleAtqY2lyY3VtZmxleAhLY2VkaWxsYQhrY2VkaWxsYQxrZ3JlZW5sYW5kaWMGTGFjdXRlBmxhY3V0ZQhMY2VkaWxsYQhsY2VkaWxsYQZMY2Fyb24GbGNhcm9uBExkb3QEbGRvdAZOYWN1dGUGbmFjdXRlCE5jZWRpbGxhCG5jZWRpbGxhBk5jYXJvbgZuY2Fyb24LbmFwb3N0cm9waGUDRW5nA2VuZwdPbWFjcm9uB29tYWNyb24GT2JyZXZlBm9icmV2ZQlPZGJsYWN1dGUJb2RibGFjdXRlBlJhY3V0ZQZyYWN1dGUIUmNlZGlsbGEIcmNlZGlsbGEGUmNhcm9uBnJjYXJvbgZTYWN1dGUGc2FjdXRlC1NjaXJjdW1mbGV4C3NjaXJjdW1mbGV4CFRjZWRpbGxhCHRjZWRpbGxhBlRjYXJvbgZ0Y2Fyb24EVGJhcgR0YmFyBlV0aWxkZQZ1dGlsZGUHVW1hY3Jvbgd1bWFjcm9uBlVicmV2ZQZ1YnJldmUFVXJpbmcFdXJpbmcJVWRibGFjdXRlCXVkYmxhY3V0ZQdVb2dvbmVrB3VvZ29uZWsLV2NpcmN1bWZsZXgLd2NpcmN1bWZsZXgLWWNpcmN1bWZsZXgLeWNpcmN1bWZsZXgGWmFjdXRlBnphY3V0ZQRaZG90BHpkb3QFbG9uZ3MHdW5pMDE4RgVPaG9ybgVvaG9ybgVVaG9ybgV1aG9ybgd1bmkwMUNEB3VuaTAxQ0UHdW5pMDFDRgd1bmkwMUQwB3VuaTAxRDEHdW5pMDFEMgd1bmkwMUQzB3VuaTAxRDQHdW5pMDFENQd1bmkwMUQ2B3VuaTAxRDcHdW5pMDFEOAd1bmkwMUQ5B3VuaTAxREEHdW5pMDFEQgd1bmkwMURDCkFyaW5nYWN1dGUKYXJpbmdhY3V0ZQdBRWFjdXRlB2FlYWN1dGULT3NsYXNoYWN1dGULb3NsYXNoYWN1dGUHdW5pMDI1ORRjb21iaW5pbmdncmF2ZWFjY2VudBRjb21iaW5pbmdhY3V0ZWFjY2VudBRjb21iaW5pbmd0aWxkZWFjY2VudBJjb21iaW5pbmdob29rYWJvdmURY29tYmluaW5nZG90YmVsb3cFdG9ub3MNZGllcmVzaXN0b25vcwpBbHBoYXRvbm9zCWFub3RlbGVpYQxFcHNpbG9udG9ub3MIRXRhdG9ub3MJSW90YXRvbm9zDE9taWNyb250b25vcwxVcHNpbG9udG9ub3MKT21lZ2F0b25vcxFpb3RhZGllcmVzaXN0b25vcwVBbHBoYQRCZXRhBUdhbW1hB0Vwc2lsb24EWmV0YQNFdGEFVGhldGEESW90YQVLYXBwYQZMYW1iZGECTXUCTnUCWGkHT21pY3JvbgJQaQNSaG8FU2lnbWEDVGF1B1Vwc2lsb24DUGhpA0NoaQNQc2kMSW90YWRpZXJlc2lzD1Vwc2lsb25kaWVyZXNpcwphbHBoYXRvbm9zDGVwc2lsb250b25vcwhldGF0b25vcwlpb3RhdG9ub3MUdXBzaWxvbmRpZXJlc2lzdG9ub3MFYWxwaGEEYmV0YQVnYW1tYQVkZWx0YQdlcHNpbG9uBHpldGEDZXRhBXRoZXRhBGlvdGEFa2FwcGEGbGFtYmRhAm51AnhpB29taWNyb24DcmhvBnNpZ21hMQVzaWdtYQN0YXUHdXBzaWxvbgNwaGkDY2hpA3BzaQVvbWVnYQxpb3RhZGllcmVzaXMPdXBzaWxvbmRpZXJlc2lzDG9taWNyb250b25vcwx1cHNpbG9udG9ub3MKb21lZ2F0b25vcwZvbWVnYTEJYWZpaTEwMDIzCWFmaWkxMDA1MQlhZmlpMTAwNTIJYWZpaTEwMDUzCWFmaWkxMDA1NAlhZmlpMTAwNTUJYWZpaTEwMDU2CWFmaWkxMDA1NwlhZmlpMTAwNTgJYWZpaTEwMDU5CWFmaWkxMDA2MAlhZmlpMTAwNjEJYWZpaTEwMDYyCWFmaWkxMDE0NQlhZmlpMTAwMTcJYWZpaTEwMDE4CWFmaWkxMDAxOQlhZmlpMTAwMjAJYWZpaTEwMDIxCWFmaWkxMDAyMglhZmlpMTAwMjQJYWZpaTEwMDI1CWFmaWkxMDAyNglhZmlpMTAwMjcJYWZpaTEwMDI4CWFmaWkxMDAyOQlhZmlpMTAwMzAJYWZpaTEwMDMxCWFmaWkxMDAzMglhZmlpMTAwMzMJYWZpaTEwMDM0CWFmaWkxMDAzNQlhZmlpMTAwMzYJYWZpaTEwMDM3CWFmaWkxMDAzOAlhZmlpMTAwMzkJYWZpaTEwMDQwCWFmaWkxMDA0MQlhZmlpMTAwNDIJYWZpaTEwMDQzCWFmaWkxMDA0NAlhZmlpMTAwNDUJYWZpaTEwMDQ2CWFmaWkxMDA0NwlhZmlpMTAwNDgJYWZpaTEwMDQ5CWFmaWkxMDA2NQlhZmlpMTAwNjYJYWZpaTEwMDY3CWFmaWkxMDA2OAlhZmlpMTAwNjkJYWZpaTEwMDcwCWFmaWkxMDA3MglhZmlpMTAwNzMJYWZpaTEwMDc0CWFmaWkxMDA3NQlhZmlpMTAwNzYJYWZpaTEwMDc3CWFmaWkxMDA3OAlhZmlpMTAwNzkJYWZpaTEwMDgwCWFmaWkxMDA4MQlhZmlpMTAwODIJYWZpaTEwMDgzCWFmaWkxMDA4NAlhZmlpMTAwODUJYWZpaTEwMDg2CWFmaWkxMDA4NwlhZmlpMTAwODgJYWZpaTEwMDg5CWFmaWkxMDA5MAlhZmlpMTAwOTEJYWZpaTEwMDkyCWFmaWkxMDA5MwlhZmlpMTAwOTQJYWZpaTEwMDk1CWFmaWkxMDA5NglhZmlpMTAwOTcJYWZpaTEwMDcxCWFmaWkxMDA5OQlhZmlpMTAxMDAJYWZpaTEwMTAxCWFmaWkxMDEwMglhZmlpMTAxMDMJYWZpaTEwMTA0CWFmaWkxMDEwNQlhZmlpMTAxMDYJYWZpaTEwMTA3CWFmaWkxMDEwOAlhZmlpMTAxMDkJYWZpaTEwMTEwCWFmaWkxMDE5MwlhZmlpMTAwNTAJYWZpaTEwMDk4B3VuaTA0OTIHdW5pMDQ5Mwd1bmkwNDk2B3VuaTA0OTcHdW5pMDQ5QQd1bmkwNDlCB3VuaTA0OUMHdW5pMDQ5RAd1bmkwNEEyB3VuaTA0QTMHdW5pMDRBRQd1bmkwNEFGB3VuaTA0QjAHdW5pMDRCMQd1bmkwNEIyB3VuaTA0QjMHdW5pMDRCOAd1bmkwNEI5B3VuaTA0QkEHdW5pMDRCQgd1bmkwNEU4B3VuaTA0RTkFc2hldmEKaGF0YWZzZWdvbApoYXRhZnBhdGFoC2hhdGFmcWFtYXRzBWhpcmlxBXRzZXJlBXNlZ29sBXBhdGFoBnFhbWF0cwVob2xhbQZxdWJ1dHMGZGFnZXNoBW1ldGVnBW1hcWFmBHJhZmUFcGFzZXEHc2hpbmRvdAZzaW5kb3QIc29mcGFzdXEEYWxlZgNiZXQFZ2ltZWwFZGFsZXQCaGUDdmF2BXpheWluA2hldAN0ZXQDeW9kCGZpbmFsa2FmA2thZgVsYW1lZAhmaW5hbG1lbQNtZW0IZmluYWxudW4DbnVuBnNhbWVraARheWluB2ZpbmFscGUCcGUKZmluYWx0c2FkaQV0c2FkaQNxb2YEcmVzaARzaGluA3Rhdglkb3VibGV2YXYGdmF2eW9kCWRvdWJsZXlvZAZnZXJlc2gJZ2Vyc2hheWltCWFmaWk1NzM4OAlhZmlpNTc0MDMJYWZpaTU3NDA3CWFmaWk1NzQwOQlhZmlpNTc0MTEJYWZpaTU3NDEyCWFmaWk1NzQxMwlhZmlpNTc0MTQJYWZpaTU3NDE1CWFmaWk1NzQxNglhZmlpNTc0MTcJYWZpaTU3NDE4CWFmaWk1NzQxOQlhZmlpNTc0MjAJYWZpaTU3NDIxCWFmaWk1NzQyMglhZmlpNTc0MjMJYWZpaTU3NDI0CWFmaWk1NzQyNQlhZmlpNTc0MjYJYWZpaTU3NDI3CWFmaWk1NzQyOAlhZmlpNTc0MjkJYWZpaTU3NDMwCWFmaWk1NzQzMQlhZmlpNTc0MzIJYWZpaTU3NDMzCWFmaWk1NzQzNAlhZmlpNTc0NDAJYWZpaTU3NDQxCWFmaWk1NzQ0MglhZmlpNTc0NDMJYWZpaTU3NDQ0CWFmaWk1NzQ0NQlhZmlpNTc0NDYJYWZpaTU3NDQ4CWFmaWk1NzQ0OQlhZmlpNTc0NTAJYWZpaTU3NDUxCWFmaWk1NzQ1MglhZmlpNTc0NTMJYWZpaTU3NDU0CWFmaWk1NzQ1NQlhZmlpNTc0NTYJYWZpaTU3NDU3CWFmaWk1NzQ1OAd1bmkwNjUzB3VuaTA2NTQHdW5pMDY1NQlhZmlpNTczOTIJYWZpaTU3MzkzCWFmaWk1NzM5NAlhZmlpNTczOTUJYWZpaTU3Mzk2CWFmaWk1NzM5NwlhZmlpNTczOTgJYWZpaTU3Mzk5CWFmaWk1NzQwMAlhZmlpNTc0MDEJYWZpaTU3MzgxCWFmaWk1NzQ2MQlhZmlpNjMxNjcJZ2x5cGgxMzIwCWdseXBoMTMyNAd1bmkwNjcwB3VuaTA2NzEHdW5pMDY3Mgd1bmkwNjczB3VuaTA2NzUHdW5pMDY3Ngd1bmkwNjc3B3VuaTA2NzgHdW5pMDY3OQd1bmkwNjdBB3VuaTA2N0IHdW5pMDY3Qwd1bmkwNjdECWFmaWk1NzUwNgd1bmkwNjdGB3VuaTA2ODAHdW5pMDY4MQd1bmkwNjgyB3VuaTA2ODMHdW5pMDY4NAd1bmkwNjg1CWFmaWk1NzUwNwd1bmkwNjg3B3VuaTA2ODgHdW5pMDY4OQd1bmkwNjhBB3VuaTA2OEIHdW5pMDY4Qwd1bmkwNjhEB3VuaTA2OEUHdW5pMDY4Rgd1bmkwNjkwB3VuaTA2OTEHdW5pMDY5Mgd1bmkwNjkzB3VuaTA2OTQHdW5pMDY5NQd1bmkwNjk2B3VuaTA2OTcJYWZpaTU3NTA4B3VuaTA2OTkHdW5pMDY5QQd1bmkwNjlCB3VuaTA2OUMHdW5pMDY5RAd1bmkwNjlFB3VuaTA2OUYHdW5pMDZBMAd1bmkwNkExB3VuaTA2QTIHdW5pMDZBMwd1bmkwNkE0B3VuaTA2QTUHdW5pMDZBNgd1bmkwNkE3B3VuaTA2QTgHdW5pMDZBQQd1bmkwNkFCB3VuaTA2QUMHdW5pMDZBRAd1bmkwNkFFCWFmaWk1NzUwOQd1bmkwNkIwB3VuaTA2QjEHdW5pMDZCMgd1bmkwNkIzB3VuaTA2QjQHdW5pMDZCNQd1bmkwNkI2B3VuaTA2QjcHdW5pMDZCOAd1bmkwNkI5B3VuaTA2QkEHdW5pMDZCQgd1bmkwNkJDB3VuaTA2QkQHdW5pMDZCRgd1bmkwNkMwB3VuaTA2QzEHdW5pMDZDMgd1bmkwNkMzB3VuaTA2QzQHdW5pMDZDNQd1bmkwNkM2B3VuaTA2QzcHdW5pMDZDOAd1bmkwNkM5B3VuaTA2Q0EHdW5pMDZDQgd1bmkwNkNEB3VuaTA2Q0UHdW5pMDZDRgd1bmkwNkQwB3VuaTA2RDEHdW5pMDZEMgd1bmkwNkQzB3VuaTA2RDQJYWZpaTU3NTM0B3VuaTA2RDYHdW5pMDZENwd1bmkwNkQ4B3VuaTA2RDkHdW5pMDZEQQd1bmkwNkRCB3VuaTA2REMHdW5pMDZERAd1bmkwNkRFB3VuaTA2REYHdW5pMDZFMAd1bmkwNkUxB3VuaTA2RTIHdW5pMDZFMwd1bmkwNkU0B3VuaTA2RTUHdW5pMDZFNgd1bmkwNkU3B3VuaTA2RTgHdW5pMDZFOQd1bmkwNkVBB3VuaTA2RUIHdW5pMDZFRAlhZmlpNjI4NDMJYWZpaTYyODQ0CWFmaWk2Mjg0NQd1bmkwNkZBB3VuaTA2RkIHdW5pMDZGQwd1bmkwNkZEB3VuaTA2RkUGV2dyYXZlBndncmF2ZQZXYWN1dGUGd2FjdXRlCVdkaWVyZXNpcwl3ZGllcmVzaXMJQWRvdGJlbG93CWFkb3RiZWxvdwpBaG9va2Fib3ZlCmFob29rYWJvdmUQQWNpcmN1bWZsZXhhY3V0ZRBhY2lyY3VtZmxleGFjdXRlEEFjaXJjdW1mbGV4Z3JhdmUQYWNpcmN1bWZsZXhncmF2ZRRBY2lyY3VtZmxleGhvb2thYm92ZRRhY2lyY3VtZmxleGhvb2thYm92ZRBBY2lyY3VtZmxleHRpbGRlEGFjaXJjdW1mbGV4dGlsZGUTQWNpcmN1bWZsZXhkb3RiZWxvdxNhY2lyY3VtZmxleGRvdGJlbG93C0FicmV2ZWFjdXRlC2FicmV2ZWFjdXRlC0FicmV2ZWdyYXZlC2FicmV2ZWdyYXZlD0FicmV2ZWhvb2thYm92ZQ9hYnJldmVob29rYWJvdmULQWJyZXZldGlsZGULYWJyZXZldGlsZGUOQWJyZXZlZG90YmVsb3cOYWJyZXZlZG90YmVsb3cJRWRvdGJlbG93CWVkb3RiZWxvdwpFaG9va2Fib3ZlCmVob29rYWJvdmUGRXRpbGRlBmV0aWxkZRBFY2lyY3VtZmxleGFjdXRlEGVjaXJjdW1mbGV4YWN1dGUQRWNpcmN1bWZsZXhncmF2ZRBlY2lyY3VtZmxleGdyYXZlFEVjaXJjdW1mbGV4aG9va2Fib3ZlFGVjaXJjdW1mbGV4aG9va2Fib3ZlEEVjaXJjdW1mbGV4dGlsZGUQZWNpcmN1bWZsZXh0aWxkZRNFY2lyY3VtZmxleGRvdGJlbG93E2VjaXJjdW1mbGV4ZG90YmVsb3cKSWhvb2thYm92ZQppaG9va2Fib3ZlCUlkb3RiZWxvdwlpZG90YmVsb3cJT2RvdGJlbG93CW9kb3RiZWxvdwpPaG9va2Fib3ZlCm9ob29rYWJvdmUQT2NpcmN1bWZsZXhhY3V0ZRBvY2lyY3VtZmxleGFjdXRlEE9jaXJjdW1mbGV4Z3JhdmUQb2NpcmN1bWZsZXhncmF2ZRRPY2lyY3VtZmxleGhvb2thYm92ZRRvY2lyY3VtZmxleGhvb2thYm92ZRBPY2lyY3VtZmxleHRpbGRlEG9jaXJjdW1mbGV4dGlsZGUTT2NpcmN1bWZsZXhkb3RiZWxvdxNvY2lyY3VtZmxleGRvdGJlbG93Ck9ob3JuYWN1dGUKb2hvcm5hY3V0ZQpPaG9ybmdyYXZlCm9ob3JuZ3JhdmUOT2hvcm5ob29rYWJvdmUOb2hvcm5ob29rYWJvdmUKT2hvcm50aWxkZQpvaG9ybnRpbGRlDU9ob3JuZG90YmVsb3cNb2hvcm5kb3RiZWxvdwlVZG90YmVsb3cJdWRvdGJlbG93ClVob29rYWJvdmUKdWhvb2thYm92ZQpVaG9ybmFjdXRlCnVob3JuYWN1dGUKVWhvcm5ncmF2ZQp1aG9ybmdyYXZlDlVob3JuaG9va2Fib3ZlDnVob3JuaG9va2Fib3ZlClVob3JudGlsZGUKdWhvcm50aWxkZQ1VaG9ybmRvdGJlbG93DXVob3JuZG90YmVsb3cGWWdyYXZlBnlncmF2ZQlZZG90YmVsb3cJeWRvdGJlbG93Cllob29rYWJvdmUKeWhvb2thYm92ZQZZdGlsZGUGeXRpbGRlB3VuaTIwMDAHdW5pMjAwMQd1bmkyMDAyB3VuaTIwMDMHdW5pMjAwNAd1bmkyMDA1B3VuaTIwMDYHdW5pMjAwNwd1bmkyMDA4B3VuaTIwMDkHdW5pMjAwQRJ6ZXJvd2lkdGhub25qb2luZXIPemVyb3dpZHRoam9pbmVyD2xlZnR0b3JpZ2h0bWFyaw9yaWdodHRvbGVmdG1hcmsHdW5pMjAxMAd1bmkyMDExCmZpZ3VyZWRhc2gJYWZpaTAwMjA4DXVuZGVyc2NvcmVkYmwNcXVvdGVyZXZlcnNlZAd1bmkyMDJBB3VuaTIwMkIHdW5pMjAyQwd1bmkyMDJEB3VuaTIwMkUHdW5pMjAyRgZtaW51dGUGc2Vjb25kCWV4Y2xhbWRibAlyYWRpY2FsZXgHdW5pMjA1Rgd1bmkyMDZBB3VuaTIwNkIIdW5pMjA2QzsHdW5pMjA2RAd1bmkyMDZFCHVuaTIwNkY7CW5zdXBlcmlvcglhZmlpMDg5NDEGcGVzZXRhDW5ld3NoZXFlbHNpZ24IZG9uZ3NpZ24ERXVybwlhZmlpNjEyNDgJYWZpaTYxMjg5CWFmaWk2MTM1MgNPaG0JZXN0aW1hdGVkCG9uZXRoaXJkCXR3b3RoaXJkcwlvbmVlaWdodGgMdGhyZWVlaWdodGhzC2ZpdmVlaWdodGhzDHNldmVuZWlnaHRocwlhcnJvd2xlZnQHYXJyb3d1cAphcnJvd3JpZ2h0CWFycm93ZG93bglhcnJvd2JvdGgJYXJyb3d1cGRuDGFycm93dXBkbmJzZQd1bmkyMjA2Cm9ydGhvZ29uYWwMaW50ZXJzZWN0aW9uC2VxdWl2YWxlbmNlBWhvdXNlDXJldmxvZ2ljYWxub3QKaW50ZWdyYWx0cAppbnRlZ3JhbGJ0CFNGMTAwMDAwCFNGMTEwMDAwCFNGMDEwMDAwCFNGMDMwMDAwCFNGMDIwMDAwCFNGMDQwMDAwCFNGMDgwMDAwCFNGMDkwMDAwCFNGMDYwMDAwCFNGMDcwMDAwCFNGMDUwMDAwCFNGNDMwMDAwCFNGMjQwMDAwCFNGNTEwMDAwCFNGNTIwMDAwCFNGMzkwMDAwCFNGMjIwMDAwCFNGMjEwMDAwCFNGMjUwMDAwCFNGNTAwMDAwCFNGNDkwMDAwCFNGMzgwMDAwCFNGMjgwMDAwCFNGMjcwMDAwCFNGMjYwMDAwCFNGMzYwMDAwCFNGMzcwMDAwCFNGNDIwMDAwCFNGMTkwMDAwCFNGMjAwMDAwCFNGMjMwMDAwCFNGNDcwMDAwCFNGNDgwMDAwCFNGNDEwMDAwCFNGNDUwMDAwCFNGNDYwMDAwCFNGNDAwMDAwCFNGNTQwMDAwCFNGNTMwMDAwCFNGNDQwMDAwB3VwYmxvY2sHZG5ibG9jawVibG9jawdsZmJsb2NrB3J0YmxvY2sHbHRzaGFkZQVzaGFkZQdka3NoYWRlCWZpbGxlZGJveAZIMjIwNzMGSDE4NTQzBkgxODU1MQpmaWxsZWRyZWN0B3RyaWFndXAHdHJpYWdydAd0cmlhZ2RuB3RyaWFnbGYGY2lyY2xlBkgxODUzMwlpbnZidWxsZXQJaW52Y2lyY2xlCm9wZW5idWxsZXQJc21pbGVmYWNlDGludnNtaWxlZmFjZQNzdW4GZmVtYWxlBG1hbGUFc3BhZGUEY2x1YgVoZWFydAdkaWFtb25kC211c2ljYWxub3RlDm11c2ljYWxub3RlZGJsB3VuaUUwMDAKdmF2c2hpbmRvdA1maW5hbGthZnNoZXZhDmZpbmFsa2FmcWFtYXRzCmxhbWVkaG9sYW0QbGFtZWRob2xhbWRhZ2VzaAlhZmlpNjI4ODEJYWZpaTU3MzkxC2NvbW1hYWNjZW50EHVuZGVyY29tbWFhY2NlbnQHdW5pRjAwNgd1bmlGMDA3B3VuaUYwMDgHdW5pRjAwOQd1bmlGMDBBB3VuaUYwMEIHdW5pRjAwQwd1bmlGMDBEB3VuaUYwMEUHdW5pRjAwRgd1bmlGMDEwB3VuaUYwMTEHdW5pRjAxMgd1bmlGMDEzB3VuaUYwMTQHdW5pRjAxNQd1bmlGMDE2B3VuaUYwMTcHdW5pRjAxOAd1bmlGMDE5B3VuaUYwMUEHdW5pRjAxQgd1bmlGMDFDB3VuaUYwMUQHdW5pRjAxRQd1bmlGMDFGB3VuaUYwMjAHdW5pRjAyMQd1bmlGMDIyB3VuaUYwMjMHdW5pRjAyNAd1bmlGMDI1B3VuaUYwMjYHdW5pRjAyNwd1bmlGMDI4B3VuaUYwMjkHdW5pRjAyQQd1bmlGMDJCB3VuaUYwMkMHdW5pRjAyRAd1bmlGMDJFB3VuaUYwMkYHdW5pRjAzMAd1bmlGMDMxB3VuaUZCMUQHdW5pRkIxRQd1bmlGQjFGB2FsdGF5aW4Lc2hpbnNoaW5kb3QKc2hpbnNpbmRvdBFzaGluZGFnZXNoc2hpbmRvdBBzaGluZGFnZXNoc2luZG90CWFsZWZwYXRhaAphbGVmcWFtYXRzCWFsZWZtYXBpcQliZXRkYWdlc2gLZ2ltZWxkYWdlc2gLZGFsZXRkYWdlc2gIaGVkYWdlc2gJdmF2ZGFnZXNoC3pheWluZGFnZXNoCXRldGRhZ2VzaAl5b2RkYWdlc2gOZmluYWxrYWZkYWdlc2gJa2FmZGFnZXNoC2xhbWVkZGFnZXNoCW1lbWRhZ2VzaAludW5kYWdlc2gMc2FtZWtoZGFnZXNoDWZpbmFscGVkYWdlc2gIcGVkYWdlc2gLdHNhZGlkYWdlc2gJcW9mZGFnZXNoCnJlc2hkYWdlc2gKc2hpbmRhZ2VzaAh0YXZkYWdlcwh2YXZob2xhbQdiZXRyYWZlB2thZnJhZmUGcGVyYWZlCWFsZWZsYW1lZAd1bmlGQjUxB3VuaUZCNTMHdW5pRkI1NAd1bmlGQjU1CWFmaWk2Mjk1OAlhZmlpNjI5NTYJYWZpaTUyOTU3B3VuaUZCNUIHdW5pRkI1Qwd1bmlGQjVEB3VuaUZCNUYHdW5pRkI2MAd1bmlGQjYxB3VuaUZCNjMHdW5pRkI2NAd1bmlGQjY1B3VuaUZCNjcHdW5pRkI2OAd1bmlGQjY5B3VuaUZCNkIHdW5pRkI2Qwd1bmlGQjZEB3VuaUZCNkYHdW5pRkI3MAd1bmlGQjcxB3VuaUZCNzMHdW5pRkI3NAd1bmlGQjc1B3VuaUZCNzcHdW5pRkI3OAd1bmlGQjc5CWFmaWk2Mjk2MQlhZmlpNjI5NTkJYWZpaTYyOTYwB3VuaUZCN2YHdW5pRkI4MAd1bmlGQjgxB3VuaUZCODMHdW5pRkI4NQd1bmlGQjg3B3VuaUZCODkJYWZpaTYyOTYyB3VuaUZCOEQJYWZpaTU3NTY3CWFmaWk2Mjk2NAlhZmlpNTIzMDUJYWZpaTUyMzA2CWFmaWk2Mjk2NwlhZmlpNjI5NjUJYWZpaTYyOTY2B3VuaUZCOTcHdW5pRkI5OAd1bmlGQjk5B3VuaUZCOUIHdW5pRkI5Qwd1bmlGQjlEB3VuaUZCOUYHdW5pRkJBMQd1bmlGQkE1B3VuaUZCQTYHdW5pRkJBOAd1bmlGQkE5CWFmaWk1NzQ3MAd1bmlGQkFGB3VuaUZCQjEHdW5pRkJENAd1bmlGQkQ1B3VuaUZCRDYHdW5pRkJEOAd1bmlGQkRBB3VuaUZCREMHdW5pRkJERgd1bmlGQkUxB3VuaUZCRTMHdW5pRkJFNQd1bmlGQkU2B3VuaUZCRTcJYWZpaTU3NTU1CWFmaWk1MjM2NAlhZmlpNjI4ODIJYWZpaTYyODgzCWFmaWk2Mjg4NAlhZmlpNjI4ODUJYWZpaTYyODg2CWFmaWk2NDA2MAlhZmlpNjQwNjEJYWZpaTY0MTg0CWFmaWk1MjM5OQlhZmlpNTI0MDAJYWZpaTYyNzUzCWFmaWk2Mjc1NAlhZmlpNjI3NTUJYWZpaTYyNzU2CWFmaWk2Mjc1OQlhZmlpNjI3NTcJYWZpaTYyNzU4CWFmaWk2Mjc2MAlhZmlpNjI3NjMJYWZpaTYyNzYxCWFmaWk2Mjc2MglhZmlpNjI3NjQJYWZpaTYyNzY3CWFmaWk2Mjc2NQlhZmlpNjI3NjYJYWZpaTYyNzcwCWFmaWk2Mjc2OAlhZmlpNjI3NjkJYWZpaTYyNzczCWFmaWk2Mjc3MQlhZmlpNjI3NzIJYWZpaTYyNzc2CWFmaWk2Mjc3NAlhZmlpNjI3NzUJYWZpaTYyNzc5CWFmaWk2Mjc3NwlhZmlpNjI3NzgJYWZpaTYyNzgwCWFmaWk2Mjc4MQlhZmlpNjI3ODIJYWZpaTYyNzgzCWFmaWk2Mjc4NglhZmlpNjI3ODQJYWZpaTYyNzg1CWFmaWk2Mjc4OQlhZmlpNjI3ODcJYWZpaTYyNzg4CWFmaWk2Mjc5MglhZmlpNjI3OTAJYWZpaTYyNzkxCWFmaWk2Mjc5NQlhZmlpNjI3OTMJYWZpaTYyNzk0CWFmaWk2Mjc5OAlhZmlpNjI3OTYJYWZpaTYyNzk3CWFmaWk2MjgwMQlhZmlpNjI3OTkJYWZpaTYyODAwCWFmaWk2MjgwNAlhZmlpNjI4MDIJYWZpaTYyODAzCWFmaWk2MjgwNwlhZmlpNjI4MDUJYWZpaTYyODA2CWFmaWk2MjgxMAlhZmlpNjI4MDgJYWZpaTYyODA5CWFmaWk2MjgxMwlhZmlpNjI4MTEJYWZpaTYyODEyCWFmaWk2MjgxNglhZmlpNTc0MTAJYWZpaTYyODE1CWFmaWk2MjgxOQlhZmlpNjI4MTcJYWZpaTYyODE4CWFmaWk2MjgyMglhZmlpNjI4MjAJYWZpaTYyODIxCWFmaWk2MjgyNQlhZmlpNjI4MjMJYWZpaTYyODI0CWFmaWk1NzQ0NwlhZmlpNjI4MjgJYWZpaTYyODI3CWFmaWk2MjgyOQlhZmlpNjI4MzAJYWZpaTYyODMzCWFmaWk2MjgzMQlhZmlpNjI4MzIJYWZpaTYyODM0CWFmaWk2MjgzNQlhZmlpNjI4MzYJYWZpaTYyODM3CWFmaWk2MjgzOAlhZmlpNjI4MzkJYWZpaTYyODQwCWFmaWk2Mjg0MQd1bmlGRkZDCWFmaWk1NzQ1OQlhZmlpNTc1NDMJYWZpaTU3NDk0CWFmaWk2NDI0MAlhZmlpNjQyNDEJYWZpaTYzOTU0CWFmaWk1NzM4MglhZmlpNjQyNDIJYWZpaTU3NTA0CWFmaWk1NzM2OQlhZmlpNTczNzAJYWZpaTU3MzcxCWFmaWk1NzM3MglhZmlpNTczNzMJYWZpaTU3Mzc0CWFmaWk1NzM3NQlhZmlpNTc0NzEJYWZpaTU3NDYwCWFmaWk1MjI1OAlhZmlpNjI4ODkJYWZpaTYyODg3CWFmaWk2Mjg4OAlhZmlpNjM3NTMJYWZpaTYzNzU0CWFmaWk2Mzc1OQlhZmlpNjM3NjMJYWZpaTYzNzk1CWFmaWk2Mjg5MQlhZmlpNjM4MDgJYWZpaTYyOTM4CWFmaWk2MzgxMAlhZmlpNjI5NDIJYWZpaTYyOTQ3CWFmaWk2MzgxMwlhZmlpNjM4MjMJYWZpaTYzODI0CWFmaWk2MzgzMwlhZmlpNjM4NDQJYWZpaTYzODQ2CWFmaWk2Mzg0OQlhZmlpNjM5MDQJYWZpaTYzOTA1CWFmaWk2MzkwNglhZmlpNjM5MDgJYWZpaTYzOTEwCWFmaWk2MzkxMglhZmlpNjI5MjcJYWZpaTYzOTQxCWFmaWk2MjkzOQlhZmlpNjM5NDMJYWZpaTYyOTQzCWFmaWk2Mjk0NglhZmlpNjM5NDYJYWZpaTYyOTUxCWFmaWk2Mzk0OAlhZmlpNjI5NTMJYWZpaTYzOTUwCWFmaWk2Mzk1MQlhZmlpNjM5NTIJYWZpaTYzOTUzCWFmaWk2Mzk1NglhZmlpNjM5NTgJYWZpaTYzOTU5CWFmaWk2Mzk2MAlhZmlpNjM5NjEJYWZpaTY0MDQ2CWFmaWk2NDA1OAlhZmlpNjQwNTkJYWZpaTYyOTQ1CWdseXBoMTAyMQthZmlpNTc1NDMtMgthZmlpNTc0NTQtMgthZmlpNTc0NTEtMglnbHlwaDEwMjUJZ2x5cGgxMDI2C2FmaWk1NzQ3MS0yC2FmaWk1NzQ1OC0yC2FmaWk1NzQ1Ny0yC2FmaWk1NzQ5NC0yC2FmaWk1NzQ1OS0yC2FmaWk1NzQ1NS0yC2FmaWk1NzQ1Mi0yCWdseXBoMTAzNAlnbHlwaDEwMzUJZ2x5cGgxMDM2C2FmaWk2Mjg4NC0yC2FmaWk2Mjg4MS0yC2FmaWk2Mjg4Ni0yC2FmaWk2Mjg4My0yC2FmaWk2Mjg4NS0yC2FmaWk2Mjg4Mi0yC2FmaWk1NzUwNC0yC2FmaWk1NzQ1Ni0yC2FmaWk1NzQ1My0yCWdseXBoMTA0NglnbHlwaDEwNDcLYWZpaTU3NTQzLTMLYWZpaTU3NDU0LTMLYWZpaTU3NDUxLTMJZ2x5cGgxMDUxCWdseXBoMTA1MgthZmlpNTc0NzEtMwthZmlpNTc0NTgtMwthZmlpNTc0NTctMwthZmlpNTc0OTQtMwthZmlpNTc0NTktMwthZmlpNTc0NTUtMwthZmlpNTc0NTItMwlnbHlwaDEwNjAJZ2x5cGgxMDYxCWdseXBoMTA2MgthZmlpNjI4ODQtMwthZmlpNjI4ODEtMwthZmlpNjI4ODYtMwthZmlpNjI4ODMtMwthZmlpNjI4ODUtMwthZmlpNjI4ODItMwthZmlpNTc1MDQtMwthZmlpNTc0NTYtMwthZmlpNTc0NTMtMwlnbHlwaDEwNzIJZ2x5cGgxMDczC2FmaWk1NzU0My00C2FmaWk1NzQ1NC00C2FmaWk1NzQ1MS00CWdseXBoMTA3NwlnbHlwaDEwNzgLYWZpaTU3NDcxLTQLYWZpaTU3NDU4LTQLYWZpaTU3NDU3LTQLYWZpaTU3NDk0LTQLYWZpaTU3NDU5LTQLYWZpaTU3NDU1LTQLYWZpaTU3NDUyLTQJZ2x5cGgxMDg2CWdseXBoMTA4NwlnbHlwaDEwODgLYWZpaTYyODg0LTQLYWZpaTYyODgxLTQLYWZpaTYyODg2LTQLYWZpaTYyODgzLTQLYWZpaTYyODg1LTQLYWZpaTYyODgyLTQLYWZpaTU3NTA0LTQLYWZpaTU3NDU2LTQLYWZpaTU3NDUzLTQJZ2x5cGgxMDk4CWdseXBoMTA5OQlnbHlwaDExMDAJZ2x5cGgxMTAxCWdseXBoMTEwMglnbHlwaDExMDMJZ2x5cGgxMTA0CWdseXBoMTEwNQlnbHlwaDExMDYJZ2x5cGgxMTA3CWdseXBoMTEwOAlnbHlwaDExMDkJZ2x5cGgxMTEwCWdseXBoMTExMQlnbHlwaDExMTIJZ2x5cGgxMTEzCWdseXBoMTExNAlnbHlwaDExMTUJZ2x5cGgxMTE2CWdseXBoMTExNwlnbHlwaDExMTgJZ2x5cGgxMTE5CWdseXBoMTEyMAlnbHlwaDExMjEJZ2x5cGgxMTIyCWdseXBoMTEyMwlnbHlwaDExMjQJZ2x5cGgxMTI1CWdseXBoMTEyNgthZmlpNTc0NDAtMgthZmlpNTc0NDAtMwthZmlpNTc0NDAtNAlnbHlwaDExMzQJZ2x5cGgxMTM1CWdseXBoMTEzNglnbHlwaDExNDcJZ2x5cGgxMTQ4CWdseXBoMTE1NAlnbHlwaDExNTUJZ2x5cGgxMjkyCWdseXBoMTI5MwlnbHlwaDEyOTQJZ2x5cGgxMjk1CWdseXBoMTMyMQlnbHlwaDEzMjIJZ2x5cGgxMzIzCWdseXBoMTMyNQlnbHlwaDEzMjYJZ2x5cGgxMzI3CWdseXBoMTMyOAlnbHlwaDEzMjkJZ2x5cGgxMzMwCWdseXBoMTMzMQlnbHlwaDEzMzIJZ2x5cGgxMzMzCWdseXBoMTMzNAlnbHlwaDEzMzUJZ2x5cGgxMzQzCWdseXBoMTM0NQdnbHlwaDQ3CWdseXBoMTM0OQlnbHlwaDEzNTEFZ2x5cGgJZ2x5cGgxMzY3CWdseXBoMTM2OAlnbHlwaDEzNjkJZ2x5cGgxMzcxCWdseXBoMTM3MglnbHlwaDEzNzMJZ2x5cGgxMzgzCWdseXBoMTM4NAlnbHlwaDEzODUJZ2x5cGgxMzg3CWdseXBoMTM4OAlnbHlwaDEzODkJZ2x5cGgxMzk5CWdseXBoMTQwMAlnbHlwaDE0MDEJZ2x5cGgxNDA5CWdseXBoMTQxMQlnbHlwaDE0MTMJZ2x5cGgxNDIxCWdseXBoMTQyMwlnbHlwaDE0MjYJZ2x5cGgxNDI5CWdseXBoMTQzMQlnbHlwaDE0MzMJZ2x5cGgxNDM1CWdseXBoMTQzNwlnbHlwaDE0MzkJZ2x5cGgxNDQxCWdseXBoMTQ0MglnbHlwaDE0NDMJZ2x5cGgxNDQ1CWdseXBoMTQ0NglnbHlwaDE0NDcJZ2x5cGgxNDQ5CWdseXBoMTQ1MAlnbHlwaDE0NTEJZ2x5cGgxNDUzCWdseXBoMTQ1NAlnbHlwaDE0NTUJZ2x5cGgxNDU3CWdseXBoMTQ1OAlnbHlwaDE0NTkJZ2x5cGgxNDYxCWdseXBoMTQ2MwlnbHlwaDE0NjQJZ2x5cGgxNDY1CWdseXBoMTQ2OAlnbHlwaDE0NjkJZ2x5cGgxNDcwCWdseXBoMTQ3MglnbHlwaDE0NzMJZ2x5cGgxNDc0CWdseXBoMTQ4MAlnbHlwaDE0ODEJZ2x5cGgxNDgyCWdseXBoMTQ4OAlnbHlwaDE0OTAJZ2x5cGgxNDkyCWdseXBoMTQ5MwlnbHlwaDE0OTQJZ2x5cGgxNDk2CWdseXBoMTQ5NwlnbHlwaDE0OTgJZ2x5cGgxNTAwCWdseXBoMTUwMQlnbHlwaDE1MDIJZ2x5cGgxNTA4CWdseXBoMTUwOQlnbHlwaDE1MTAJZ2x5cGgxNTEyCWdseXBoMTUxMwlnbHlwaDE1MTQJZ2x5cGgxNTIwCWdseXBoMTUyMQlnbHlwaDE1MjIJZ2x5cGgxNTI4CWdseXBoMTUyOQlnbHlwaDE1MzAJZ2x5cGgxNTMyCWdseXBoMTUzMwlnbHlwaDE1MzQJZ2x5cGgxNTM2CWdseXBoMTUzNwlnbHlwaDE1MzgJZ2x5cGgxNTQwCWdseXBoMTU0MQlnbHlwaDE1NDIJZ2x5cGgxNTQ0CWdseXBoMTU0NQlnbHlwaDE1NDYJZ2x5cGgxNTQ4CWdseXBoMTU0OQlnbHlwaDE1NTAJZ2x5cGgxNTU2CWdseXBoMTU1NwlnbHlwaDE1NTgJZ2x5cGgxNTYwCWdseXBoMTU2MglnbHlwaDE1NjMJZ2x5cGgxNTY0CWdseXBoMTU3MQlnbHlwaDE1ODMJZ2x5cGgxNTg3CWdseXBoMTU4OQlnbHlwaDE1OTAJZ2x5cGgxNTkxCWdseXBoMTU5MwlnbHlwaDE1OTkJZ2x5cGgxNjI5CWdseXBoMTYzMAlnbHlwaDE2MzEJZ2x5cGgxNjMzCWdseXBoMTYzNAlnbHlwaDE2MzUJZ2x5cGgxNjM3CWdseXBoMTYzOAlnbHlwaDE2MzkJZ2x5cGgxNjQ1CWdseXBoMTY0NglnbHlwaDE2NDcJZ2x5cGgxNjQ4CWdseXBoMTY0OQlnbHlwaDE2NTAJZ2x5cGgxNjUxCWdseXBoMTY1NAlnbHlwaDE2NTYJZ2x5cGgxNjU3CWdseXBoMTY1OAlnbHlwaDE2NTkJZ2x5cGgxNjYwCWdseXBoMTY2MQlnbHlwaDE2NjIJZ2x5cGgxNjYzCWdseXBoMTY2NAlnbHlwaDE2NjUJZ2x5cGgxNjY2CWdseXBoMTY2NwlnbHlwaDE2NjgJZ2x5cGgxNjY5CWdseXBoMTY3MAlnbHlwaDE2NzEJZ2x5cGgxNjcyCWds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) 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 | |||
3 | div.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 | |||
44 | body { | ||
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 | |||
50 | a { | ||
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 | |||
80 | div.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 | |||
671 | THREE 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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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 | testData = { | ||
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":"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"},"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: 'HxkHstm/nWfD4tTwtaDqycSrP6vR7O9JUQrVXp90Z+prnnvuUMH3SbOlv+AQZFJotuM9VVOh52yWcl8TuSJ5SYR6pwmZVcK9GJd3aRH48wBRrsi9do+pgyxmzfpBm+CMnUtI63LMPfyz/zPndUQSke5+G/Q1b8ZddaShjYHWHEifjdswmKg68FOSu7RuElR/FwRCBwuT02vMRdrjwxSxxM5zWB3vqzN4xKi/jkvqGgIc21m8adTQoxAJARleZiyWXzfPO/MpUs3vA6nxH6ZO1kEayGw3ZAR3nFBiW0UjjdXCBI2b4PcUP0nSJKetRSiudo2cUKfYxsWgEPoG+PM/CQFdnlfGcPf4d0QYnkU+JHff99mLJRmz7VWH7ZeW10NTxzTEr47diHLpyufZ4knnRgfhfKtwOvgmG1n1lXyXDRVTeyfCCX+mB5qdB79ujqon1BiLOGQfLWZ8bDyTZAakpcRJb8qk3zP004XwN5BpO+jC2waMcUEuH62gSQeelGZ19pzBiRz8kn3ZZ8iviX46Wwk3X1TTke9teF7t6Pop4pRkaAj2z2ji0mqWtv4T/3QW4Xgf1mKaT2t8ZaucGvZ3jrxm0CW/Ra3Cy1v1APwRPvKnY5i/WPDS1elq3vNF0NY7EQbXrxBX7hgGpUGRcHSKYsuftIquJFv0HV31jRhd99nZz6Otx82xidWbroIS+37o2Rr56X/AwkLn3DgH+V/YAK24z3Otku+lbaorXnv6C8ZDUhcce2CjgEuCFPmv928YOahgmE0Q0uKniwVXgXACevvACEsduvW32JhI4D4cjRWcSzB6YhqXE8QYCQwK97OykJ30Szd/ZYykiXjdjymyqFOmI9tZqi/PUOKRJ9NhYZaVAeLEFUunvKJWHNs50CqElw6z7nAvBwYyEVvvc+rSpMb2Z/KAWLMzv5R3MeITVUph/RlRlMIrJr0lBhmghnLRt6cGRQcDA2Si3tGAm34K+BpxVbTK0ilTrwzCfaE3Q+dvBTFRcZzMcPFLHL7Mho1/kNMb5S0izIpsNPCb26yH/gueYghVmhRL76HQAH79k00uJcyXt57AYlOYQM7FKDHWciWtJDOMNjVFDYQJJSAS39HukwrLnAdqCNrabrS+AuWhX+CqmMlKQ0PRszjtT7oQaAcgJd0uPOVz3IsjyZ/CmrzSxM+c4iPXugkiiyS2HYU7EEz9IEDvoqwv3Djcy4+3oxPUdmIJGMz2Mk5UXMDyMpqfuujirZI5r5WQWWQLivD9mid5RWDiQp2NYwpnQ/J0emEpWFlf/XkmXW+Em/A0+DOeJtHB729WsKYEvMWOB1nuITkqPJShf8FVEunHzUuLKsG3Hf5yEc3isB5rWGO8hPCueVUKgiS/NSCxQ+iinBTO3gUl+hzK+yaajQUomCx7+N9/n5HTLM5kFsUxZ8gfG3LMEK1iaza4KZeS8Hmb58NU3e3MI0FvlZHa787LqNO226awx3sX/nuTMX+LXx9v8/AMrkRdbzlcYbe6xWRWcBGiTirbTV/CXMgCdop60xfRqCskQPbfj89zpHQS/GiTJjhUwh6XKc/TpbjQJ6OZ6dAQBDxexPa+sjr70kLARxeUhvDUytp/zd/A5OBpuZ0aUz530aQEj8BCAk18vdUks7TWcpiw+/Lq//QLu/9uLU/rLanu2DFUYGXo7bJzy2QpzuoHqKDqa3anK9Gs34NfcIjUbeMUyCzd6CFj+1vGNIk4zZi44PZvmqxZXI8XcxboTpnheNRksjw36FbhIKWMWksIIq+mh4XMnkQcS83PB9rwMHsYY4nKfCwddYfRlbVjcjX+jSlz0r6Oh3KxVDP6dt37CPo8DGMvXSeU4LFMcYBkZ/Q57sH3/gyblyHK8OqYX3pzbnkCqoaOwAseBrQYMel3OgSLt1nAxzhN+ZicCLhpSYHCcHYDcg9xoa/1u4uEMJ0JC+/OzU7xp3nC4OgSYxVzL+gBNnqX4Plep7oikvE7+qymqwtoEhEEuaO5pbOdPG4I7NknL+u/RazjXdy3IGyfUPCCQKsjAEbAkD6OBZZf4St21e4sSgV/anAYFGr87fHMPtXhBxH6QTQPgWqrK75Lr/RaOLihrQHgVhcQHYcTD7nTtPNelbJKx5aGOFtcqykaVizLzrflZWXnk+QAjHo6Hsn/edm7Hbna+JTlyVsttp2vcs8kHQk6xcCpi2kR7nJwb+6kntEEPZAyuFQVwvdkqyC5nAecdg==', | ||
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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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.PM.RunTime = {}; | ||
25 | MochiKit.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 | |||
3 | Copyright 2008-2013 Clipperz Srl | ||
4 | |||
5 | This file is part of Clipperz, the online password manager. | ||
6 | For further information about its features and functionalities please | ||
7 | refer 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,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"> | ||
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> | ||
125 | Clipperz_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> |
24 | Clipperz_IEisBroken = true; | 24 | Clipperz_IEisBroken = true; |
25 | Clipperz_normalizedNewLine = '\x0d\x0a'; | 25 | Clipperz_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 | ||
24 | Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); | 24 | Clipperz.Base.module('Clipperz.PM.UI.Web.Components'); |
25 | 25 | ||
26 | Clipperz.PM.UI.Web.Components.PageFooter = function(args) { | 26 | Clipperz.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 | ||
36 | Clipperz.Base.extend(Clipperz.PM.UI.Web.Components.PageFooter, Clipperz.PM.UI.Common.Components.BaseComponent, { | 36 | Clipperz.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 © 2009-2013 Clipperz Srl'}, | 51 | {tag:'span', cls:'copyright', html:'Copyright © 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 | |||
6 | import jsmin | 6 | import jsmin |
7 | import codecs | 7 | import codecs |
8 | import shutil | 8 | import shutil |
9 | import StringIO | 9 | import StringIO |
10 | import urllib | 10 | import urllib |
11 | 11 | ||
12 | import main | 12 | import main |
13 | 13 | ||
14 | #=============================================================================== | 14 | #=============================================================================== |
15 | 15 | ||
16 | class FrontendBuilder(object): | 16 | class 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 @@ | |||
1 | from frontendBuilder import FrontendBuilder | 1 | from frontendBuilder import FrontendBuilder |
2 | import shutil | 2 | import shutil |
3 | 3 | ||
4 | class BetaBuilder(FrontendBuilder): | 4 | class 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 @@ | |||
1 | from frontendBuilder import FrontendBuilder | ||
2 | import shutil | ||
3 | |||
4 | class 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 @@ | |||
1 | from frontendBuilder import FrontendBuilder | 1 | from frontendBuilder import FrontendBuilder |
2 | import shutil | 2 | import shutil |
3 | 3 | ||
4 | class GammaBuilder(FrontendBuilder): | 4 | class 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 @@ | |||
1 | from frontendBuilder import FrontendBuilder | 1 | from frontendBuilder import FrontendBuilder |
2 | 2 | ||
3 | class Gamma_MobileBuilder(FrontendBuilder): | 3 | class 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 @@ | |||
1 | from twisted.internet import reactor | 1 | from twisted.internet import reactor |
2 | from twisted.web import proxy, server, http, resource, static | 2 | from twisted.web import proxy, server, http, resource, static |
3 | from posixpath import basename, dirname | 3 | from posixpath import basename, dirname |
4 | 4 | ||
5 | import copy | 5 | import copy |
6 | import sys | 6 | import sys |
7 | import os | 7 | import os |
8 | import pprint | 8 | import pprint |
9 | 9 | ||
10 | #-------------------------------------------------------------------- | 10 | #-------------------------------------------------------------------- |
11 | 11 | ||
12 | def scriptDir (): | 12 | def scriptDir (): |
13 | return os.path.dirname(sys.argv[0]) | 13 | return os.path.dirname(sys.argv[0]) |
14 | 14 | ||
15 | def projectBaseDir (): | 15 | def projectBaseDir (): |
16 | return os.path.abspath(scriptDir() + '/../..') | 16 | return os.path.abspath(scriptDir() + '/../..') |
17 | 17 | ||
18 | def projectTargetDir(): | 18 | def projectTargetDir(): |
19 | return projectBaseDir() + '/target/' | 19 | return projectBaseDir() + '/target/' |
20 | 20 | ||
21 | #-------------------------------------------------------------------- | 21 | #-------------------------------------------------------------------- |
22 | 22 | ||
23 | class ClipperzTestSite(server.Site): | 23 | class 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 | ||
87 | def main (): | 94 | def 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 | ||
93 | if __name__ == "__main__": | 100 | if __name__ == "__main__": |
94 | main() | 101 | main() |
95 | 102 | ||