├── README.md
├── community_college_list.txt
├── dropbox.py
├── selenium
├── chrome.py
└── tor.py
├── url_redirector
├── index.js
└── redirect.json
└── ygkkk
├── CFwarp.sh
└── endip.sh
/README.md:
--------------------------------------------------------------------------------
1 | uy9822
2 | ======
3 |
4 | first_repo
5 |
--------------------------------------------------------------------------------
/community_college_list.txt:
--------------------------------------------------------------------------------
1 | Alamo Community College District
2 | Austin Community College
3 | Bergen Community College
4 | Bunker Hill Community College
5 | Butler County Community College
6 | Cape Cod Community College
7 | Central Piedmont Community College
8 | Chattanooga State Community College
9 | Clinton Community College
10 | Coast Community College District
11 | Colorado Community College System
12 | Community College of Philadelphia
13 | Contra Costa Community College District
14 | Cuyahoga Community College
15 | Delaware County Community College
16 | Des Moines Area Community College
17 | Eastern Shore Community College
18 | Fayetteville Technical Community College
19 | Front Range Community College
20 | Glendale Community College
21 | Grossmont-Cuyamaca Community College District
22 | Guilford Technical Community College
23 | Harford Community College
24 | Henry Ford Community College
25 | Highline Community College
26 | Hillsborough Community College
27 | Houston Community College System
28 | Howard Community College
29 | Iowa Valley Community College District
30 | Ivy Tech Community College of Indiana
31 | Jackson Community College
32 | Kankakee Community College
33 | Lansing Community College
34 | Lincoln Land Community College
35 | Loraine County Community College
36 | Los Angeles Community College District
37 | Los Rios Community College District
38 | Monroe Community College
39 | Moraine Valley Community College
40 | Mt. San Antonio Community College
41 | Nassau Community College
42 | Northampton Community College
43 | Oakland Community College
44 | Oklahoma City Community College
45 | Palomar Community College
46 | Pima Community College
47 | Portland Community College
48 | Prince George's Community College
49 | Rio Hondo Community College
50 | Roxbury Community College
51 | Salem Community College
52 | San Bernardino Community College District
53 | San Mateo County Community College District
54 | Santa Monica Community College District
55 | Sinclair Community College
56 | South Texas Community College
57 | Southern State Community College
58 | Southwest Tennessee Community College
59 | St. Charles Community College
60 | Suffolk County Community College
61 | Tidewater Community College
62 | Truckee Meadows Community College
63 | Ventura County Community College District
64 | Wallace Community College Selma
--------------------------------------------------------------------------------
/dropbox.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python
2 | #
3 | # Copyright (c) Dropbox, Inc.
4 | #
5 | # dropbox
6 | # Dropbox frontend script
7 | # This file is part of nautilus-dropbox 2015.10.28.
8 | #
9 | # nautilus-dropbox is free software: you can redistribute it and/or modify
10 | # it under the terms of the GNU General Public License as published by
11 | # the Free Software Foundation, either version 3 of the License, or
12 | # (at your option) any later version.
13 | #
14 | # nautilus-dropbox is distributed in the hope that it will be useful,
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 | # GNU General Public License for more details.
18 | #
19 | # You should have received a copy of the GNU General Public License
20 | # along with nautilus-dropbox. If not, see .
21 | #
22 | from __future__ import with_statement
23 |
24 | import errno
25 | import locale
26 | import optparse
27 | import os
28 | import platform
29 | import shutil
30 | import socket
31 | import StringIO
32 | import subprocess
33 | import sys
34 | import tarfile
35 | import tempfile
36 | import thread
37 | import threading
38 | import time
39 | import traceback
40 | import urllib2
41 |
42 | from contextlib import closing, contextmanager
43 | from posixpath import abspath, commonprefix, curdir, join, pardir, sep
44 |
45 | try:
46 | import gpgme
47 | except ImportError:
48 | gpgme = None
49 |
50 |
51 | INFO = u"Dropbox is the easiest way to share and store your files online. Want to learn more? Head to"
52 | LINK = u"https://www.dropbox.com/"
53 | WARNING = u"In order to use Dropbox, you must download the proprietary daemon."
54 | GPG_WARNING = u"Note: python-gpgme is not installed, we will not be able to verify binary signatures."
55 | ERROR_CONNECTING = u"Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable."
56 | ERROR_SIGNATURE = u"Downloaded binary does not match Dropbox signature, aborting install."
57 |
58 | DOWNLOAD_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s"
59 | SIGNATURE_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s&signature=1"
60 |
61 | DOWNLOADING = u"Downloading Dropbox... %d%%"
62 | UNPACKING = u"Unpacking Dropbox... %d%%"
63 |
64 | PARENT_DIR = os.path.expanduser("~")
65 | DROPBOXD_PATH = "%s/.dropbox-dist/dropboxd" % PARENT_DIR
66 | DESKTOP_FILE = u"/usr/share/applications/dropbox.desktop"
67 |
68 | enc = locale.getpreferredencoding()
69 |
70 | # Available from https://linux.dropbox.com/fedora/rpm-public-key.asc
71 | DROPBOX_PUBLIC_KEY = """
72 | -----BEGIN PGP PUBLIC KEY BLOCK-----
73 | Version: SKS 1.1.0
74 |
75 | mQENBEt0ibEBCACv4hZRPqwtpU6z8+BB5YZU1a3yjEvg2W68+a6hEwxtCa2U++4dzQ+7EqaU
76 | q5ybQnwtbDdpFpsOi9x31J+PCpufPUfIG694/0rlEpmzl2GWzY8NqfdBFGGm/SPSSwvKbeNc
77 | FMRLu5neo7W9kwvfMbGjHmvUbzBUVpCVKD0OEEf1q/Ii0Qcekx9CMoLvWq7ZwNHEbNnij7ec
78 | nvwNlE2MxNsOSJj+hwZGK+tM19kuYGSKw4b5mR8IyThlgiSLIfpSBh1n2KX+TDdk9GR+57TY
79 | vlRu6nTPu98P05IlrrCP+KF0hYZYOaMvQs9Rmc09tc/eoQlN0kkaBWw9Rv/dvLVc0aUXABEB
80 | AAG0MURyb3Bib3ggQXV0b21hdGljIFNpZ25pbmcgS2V5IDxsaW51eEBkcm9wYm94LmNvbT6J
81 | ATYEEwECACAFAkt0ibECGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRD8kYszUESRLi/z
82 | B/wMscEa15rS+0mIpsORknD7kawKwyda+LHdtZc0hD/73QGFINR2P23UTol/R4nyAFEuYNsF
83 | 0C4IAD6y4pL49eZ72IktPrr4H27Q9eXhNZfJhD7BvQMBx75L0F5gSQwuC7GdYNlwSlCD0AAh
84 | Qbi70VBwzeIgITBkMQcJIhLvllYo/AKD7Gv9huy4RLaIoSeofp+2Q0zUHNPl/7zymOqu+5Ox
85 | e1ltuJT/kd/8hU+N5WNxJTSaOK0sF1/wWFM6rWd6XQUP03VyNosAevX5tBo++iD1WY2/lFVU
86 | JkvAvge2WFk3c6tAwZT/tKxspFy4M/tNbDKeyvr685XKJw9ei6GcOGHD
87 | =5rWG
88 | -----END PGP PUBLIC KEY BLOCK-----
89 | """
90 |
91 | # Futures
92 |
93 | def methodcaller(name, *args, **kwargs):
94 | def caller(obj):
95 | return getattr(obj, name)(*args, **kwargs)
96 | return caller
97 |
98 | def relpath(path, start=curdir):
99 | """Return a relative version of a path"""
100 |
101 | if not path:
102 | raise ValueError("no path specified")
103 |
104 | if type(start) is unicode:
105 | start_list = unicode_abspath(start).split(sep)
106 | else:
107 | start_list = abspath(start).split(sep)
108 |
109 | if type(path) is unicode:
110 | path_list = unicode_abspath(path).split(sep)
111 | else:
112 | path_list = abspath(path).split(sep)
113 |
114 | # Work out how much of the filepath is shared by start and path.
115 | i = len(commonprefix([start_list, path_list]))
116 |
117 | rel_list = [pardir] * (len(start_list)-i) + path_list[i:]
118 | if not rel_list:
119 | return curdir
120 | return join(*rel_list)
121 |
122 | # End Futures
123 |
124 |
125 | def console_print(st=u"", f=sys.stdout, linebreak=True):
126 | global enc
127 | assert type(st) is unicode
128 | f.write(st.encode(enc))
129 | if linebreak: f.write(os.linesep)
130 |
131 | def console_flush(f=sys.stdout):
132 | f.flush()
133 |
134 | def yes_no_question(question):
135 | while True:
136 | console_print(question, linebreak=False)
137 | console_print(u" [y/n] ", linebreak=False)
138 | console_flush()
139 | text = raw_input()
140 | if text.lower().startswith("y"):
141 | return True
142 | elif text.lower().startswith("n"):
143 | return False
144 | else:
145 | console_print(u"Sorry, I didn't understand that. Please type yes or no.")
146 |
147 | def plat():
148 | if sys.platform.lower().startswith('linux'):
149 | arch = platform.machine()
150 | if (arch[0] == 'i' and
151 | arch[1].isdigit() and
152 | arch[2:4] == '86'):
153 | plat = "x86"
154 | elif arch == 'x86_64':
155 | plat = arch
156 | else:
157 | FatalVisibleError("Platform not supported")
158 | return "lnx.%s" % plat
159 | else:
160 | FatalVisibleError("Platform not supported")
161 |
162 | def is_dropbox_running():
163 | pidfile = os.path.expanduser("~/.dropbox/dropbox.pid")
164 |
165 | try:
166 | with open(pidfile, "r") as f:
167 | pid = int(f.read())
168 | with open("/proc/%d/cmdline" % pid, "r") as f:
169 | cmdline = f.read().lower()
170 | except:
171 | cmdline = ""
172 |
173 | return "dropbox" in cmdline
174 |
175 | def unicode_abspath(path):
176 | global enc
177 | assert type(path) is unicode
178 | # shouldn't pass unicode to this craphead, it appends with os.getcwd() which is always a str
179 | return os.path.abspath(path.encode(sys.getfilesystemencoding())).decode(sys.getfilesystemencoding())
180 |
181 | @contextmanager
182 | def gpgme_context(keys):
183 | gpg_conf_contents = ''
184 | _gpghome = tempfile.mkdtemp(prefix='tmp.gpghome')
185 |
186 | try:
187 | os.environ['GNUPGHOME'] = _gpghome
188 | fp = open(os.path.join(_gpghome, 'gpg.conf'), 'wb')
189 | fp.write(gpg_conf_contents)
190 | fp.close()
191 | ctx = gpgme.Context()
192 |
193 | loaded = []
194 | for key_file in keys:
195 | result = ctx.import_(key_file)
196 | key = ctx.get_key(result.imports[0][0])
197 | loaded.append(key)
198 |
199 | ctx.signers = loaded
200 |
201 | yield ctx
202 | finally:
203 | del os.environ['GNUPGHOME']
204 | shutil.rmtree(_gpghome, ignore_errors=True)
205 |
206 | class SignatureVerifyError(Exception):
207 | pass
208 |
209 | def verify_signature(key_file, sig_file, plain_file):
210 | with gpgme_context([key_file]) as ctx:
211 | sigs = ctx.verify(sig_file, plain_file, None)
212 | return sigs[0].status == None
213 |
214 | def download_file_chunk(url, buf):
215 | opener = urllib2.build_opener()
216 | opener.addheaders = [('User-Agent', "DropboxLinuxDownloader/2015.10.28")]
217 | sock = opener.open(url)
218 |
219 | size = int(sock.info()['content-length'])
220 | bufsize = max(size / 200, 4096)
221 | progress = 0
222 |
223 | with closing(sock) as f:
224 | yield (0, True)
225 | while True:
226 | try:
227 | chunk = f.read(bufsize)
228 | progress += len(chunk)
229 | buf.write(chunk)
230 | yield (float(progress)/size, True)
231 | if progress == size:
232 | break
233 | except OSError, e:
234 | if hasattr(e, 'errno') and e.errno == errno.EAGAIN:
235 | # nothing left to read
236 | yield (float(progress)/size, False)
237 | else:
238 | raise
239 |
240 | class DownloadState(object):
241 | def __init__(self):
242 | self.local_file = StringIO.StringIO()
243 |
244 | def copy_data(self):
245 | return download_file_chunk(DOWNLOAD_LOCATION_FMT % plat(), self.local_file)
246 |
247 | def unpack(self):
248 | # download signature
249 | signature = StringIO.StringIO()
250 | for _ in download_file_chunk(SIGNATURE_LOCATION_FMT % plat(), signature):
251 | pass
252 | signature.seek(0)
253 | self.local_file.seek(0)
254 |
255 | if gpgme:
256 | if not verify_signature(StringIO.StringIO(DROPBOX_PUBLIC_KEY), signature, self.local_file):
257 | raise SignatureVerifyError()
258 |
259 | self.local_file.seek(0)
260 | archive = tarfile.open(fileobj=self.local_file, mode='r:gz')
261 | total_members = len(archive.getmembers())
262 | for i, member in enumerate(archive.getmembers()):
263 | archive.extract(member, PARENT_DIR)
264 | yield member.name, i, total_members
265 | archive.close()
266 |
267 | def cancel(self):
268 | if not self.local_file.closed:
269 | self.local_file.close()
270 |
271 | def load_serialized_images():
272 | global box_logo_pixbuf, window_icon
273 | import gtk
274 | box_logo_pixbuf = gtk.gdk.pixbuf_new_from_data('\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9ef\x00\\\x9ej\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eZ\x00[\x9er\x00\\\x9e\x14\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e8\x00Y\x9c\xc2\x00X\x9b\xff\x00X\x9b\xff\x00[\x9d\xaa\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00\\\x9e\x8e\x00Y\x9b\xff\x00Y\x9b\xff\x00Y\x9b\xd5\x00\\\x9eM\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\x8b\x00U\x99\xfa\x0fe\xa5\xff]\xa2\xd3\xffM\x95\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc9\x00\\\x9e\x1e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9d\xb1\x00V\x99\xff4\x85\xc1\xffZ\xa3\xda\xff\x17m\xab\xff\x00V\x99\xff\x00Z\x9d\xa2\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\\\x00W\x9a\xde\x00Y\x9c\xff:\x87\xbf\xff\x83\xbf\xeb\xff\x98\xce\xf6\xff\x9b\xd0\xf6\xffa\xa3\xd3\xff\x05]\x9e\xff\x00X\x9b\xda\x00\\\x9e/\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xc5\x01Y\x9b\xff?\x90\xca\xff|\xc1\xf4\xff\x82\xc4\xf6\xff}\xbf\xf0\xffD\x90\xc8\xff\x05]\x9e\xff\x00V\x9a\xed\x00\\\x9es\x00\\\x9e\x07\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00Z\x9c\xba\x00V\x99\xff\x1dq\xae\xffd\xaa\xdd\xff\x8e\xc9\xf5\xff\x8e\xc7\xf3\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\xa1\xd2\xf6\xffw\xb3\xde\xff\x0fd\xa3\xff\x00V\x9a\xed\x00\\\x9eL\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e4\x00X\x9b\xdd\x05^\x9f\xffM\x9d\xd6\xffy\xc1\xf6\xffw\xbe\xf2\xffz\xbe\xf1\xff\x80\xc1\xf2\xff\x89\xc8\xf6\xffq\xb3\xe3\xff*z\xb5\xff\x00W\x9a\xff\x00X\x9b\xcd\x00\\\x9eG\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0e\x00[\x9d\x86\x00V\x99\xfa\x0cc\xa4\xffK\x96\xce\xff\x81\xc2\xf2\xff\x89\xc7\xf5\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\xa4\xd3\xf6\xff\x85\xbb\xe4\xff\x18k\xa8\xff\x00U\x99\xfc\x00\\\x9en\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eS\x00W\x9a\xf1\x0bb\xa3\xffT\xa3\xdd\xffv\xc0\xf7\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x8a\xc7\xf4\xff\x8f\xc9\xf4\xff`\xa3\xd5\xff\x15i\xa8\xff\x00U\x98\xff\x00[\x9d\x9c\x00\\\x9e\x1a\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eU\x00X\x9b\xd9\x00Z\x9c\xff1\x83\xbf\xffp\xb6\xea\xff\x84\xc5\xf6\xff\x80\xc2\xf2\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\xa6\xd3\xf5\xff\x96\xc7\xeb\xff*y\xb2\xff\x00T\x98\xff\x00\\\x9e\x90\x00\\\x9e\x02\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eu\x00V\x99\xfe\x14k\xac\xff\\\xac\xe6\xffr\xbd\xf6\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8b\xc5\xf1\xff\x95\xcc\xf6\xff\x8c\xc5\xee\xffH\x90\xc5\xff\x04]\x9e\xff\x00V\x9a\xe7\x00\\\x9ej\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb3\x00V\x99\xff\x17m\xad\xffV\xa3\xdc\xff{\xc2\xf6\xff|\xbf\xf3\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa6\xd3\xf4\xff\xa4\xd1\xf1\xff@\x88\xbd\xff\x00U\x99\xff\x00[\x9d\xb0\x00\\\x9e\x0c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x02\x00[\x9d\x97\x00V\x98\xff\x1fv\xb6\xffa\xb1\xed\xffl\xbb\xf4\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x93\xcb\xf2\xff\x9e\xd1\xf6\xff|\xb7\xe1\xff(w\xb2\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e?\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9e\x86\x00V\x99\xf6\ta\xa2\xff=\x8f\xcc\xffm\xb9\xf1\xffu\xbf\xf5\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa8\xd3\xf3\xff\xae\xd8\xf4\xffX\x99\xc9\xff\x00X\x9b\xff\x00Y\x9c\xc2\x00\\\x9e\x1b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\r\x00[\x9d\xab\x00W\x99\xff,\x82\xc1\xffe\xb5\xf2\xffh\xb7\xf3\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x9f\xd1\xf5\xff\xa0\xcf\xf3\xffe\xa3\xd1\xff\x12f\xa5\xff\x00U\x98\xff\x00[\x9d\x9b\x00\\\x9e\x16\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eN\x00Y\x9b\xd3\x00Y\x9c\xff\'}\xbc\xff]\xad\xe8\xffp\xbe\xf6\xffn\xba\xf2\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa9\xd4\xf2\xff\xb5\xdb\xf6\xffq\xaa\xd4\xff\x04[\x9e\xff\x00X\x9b\xdc\x00\\\x9e>\x00\\\x9e0\x00Z\x9c\xc9\x00Z\x9b\xff8\x8d\xcd\xffe\xb7\xf5\xffc\xb4\xf2\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9d\xce\xf2\xff\xa9\xd5\xf6\xff\x99\xc9\xec\xffI\x8e\xc1\xff\x03[\x9d\xff\x00V\x9a\xe1\x00\\\x9ea\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e(\x00[\x9d\xab\x00V\x98\xff\x13j\xab\xffK\x9e\xdc\xffi\xb9\xf6\xffj\xb8\xf3\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xb9\xdc\xf6\xff\x80\xb5\xda\xff\rb\xa2\xff\x00W\x9a\xff\x00Y\x9b\xfe\x04]\x9f\xff>\x94\xd4\xffd\xb6\xf6\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa6\xd2\xf3\xff\xb0\xd9\xf6\xff\x87\xbb\xe0\xff\'u\xaf\xff\x00T\x98\xff\x00Y\x9c\xbd\x00\\\x9e7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e~\x00W\x99\xf2\x05^\x9f\xff3\x89\xc9\xff^\xb1\xf0\xffe\xb7\xf5\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xbb\xdd\xf6\xff\x96\xc3\xe4\xff\x18i\xa7\xff\x01]\xa2\xffH\x9e\xde\xffa\xb6\xf6\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xb0\xd8\xf5\xff\xad\xd5\xf1\xfff\xa2\xce\xff\rb\xa2\xff\x00U\x99\xfb\x00\\\x9e\x92\x00\\\x9e\x11\x00\\\x9e\x9b\x02\\\x9e\xff\x1ct\xb5\xffM\xa3\xe3\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xad\xd4\xf1\xff\xae\xd5\xf1\xff\xb7\xdb\xf4\xff\xaa\xcf\xe8\xffm\xb3\xe6\xffX\xb2\xf4\xffX\xae\xf1\xff^\xb1\xf1\xff`\xb3\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xae\xd5\xf2\xff\xba\xdd\xf7\xff\x9b\xc7\xe6\xff<\x83\xb8\xff\x06^\x9f\xff\x00[\x9d\xb6\x00Z\x9c\xdd\x0cd\xa6\xffR\xa9\xe9\xffb\xb7\xf8\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa7\xd3\xf1\xff\xaa\xd4\xf1\xff\xaa\xd2\xf0\xff\xb2\xd7\xf1\xff\xce\xe5\xf6\xff\xe9\xf5\xfd\xff\xd0\xeb\xfe\xff\xa1\xd2\xf7\xffg\xb6\xf2\xffW\xad\xf0\xff_\xb2\xf1\xffb\xb3\xf1\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd4\xf1\xff\xbf\xe0\xf7\xff\xac\xd2\xee\xff\x1eo\xaa\xff\x00X\x9b\xeb\x00\\\x9eR\x00Y\x9b\xf6\x0ce\xa6\xffH\x9e\xde\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa1\xcf\xf1\xff\xa5\xd1\xf1\xff\xa5\xd2\xf1\xff\xa8\xd2\xf0\xff\xbe\xdd\xf4\xff\xdd\xee\xfa\xff\xe9\xf3\xfc\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xce\xe8\xfb\xff\xc3\xe2\xfa\xff\x89\xc6\xf5\xff]\xb1\xf1\xff]\xb1\xf0\xffe\xb5\xf1\xffh\xb7\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1fo\xaa\xff\x00W\x9b\xff\x00\\\x9eo\x00\\\x9e\x00\x00\\\x9e;\x00Y\x9b\xdf\x03\\\x9e\xff;\x90\xd0\xffd\xb6\xf5\xffb\xb4\xf2\xffd\xb4\xf1\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9e\xcd\xf1\xff\xa0\xcf\xf1\xff\xa1\xcf\xf0\xff\xae\xd6\xf2\xff\xcf\xe6\xf8\xff\xe4\xf2\xfb\xff\xe5\xf2\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xcb\xe7\xfb\xff\xd1\xe9\xfb\xff\xb3\xda\xf9\xffx\xbe\xf3\xff^\xb1\xf0\xfff\xb6\xf1\xffl\xb8\xf1\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffx\xaf\xd6\xff\x0b`\xa1\xff\x00V\x9a\xed\x00\\\x9eR\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00Z\x9c\xbe\x00X\x99\xff-\x83\xc2\xffe\xb6\xf3\xfff\xb6\xf3\xffg\xb6\xf1\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x97\xcb\xf1\xff\x9b\xcc\xf1\xff\x9b\xcc\xf0\xff\xa1\xcf\xf1\xff\xbf\xde\xf6\xff\xdc\xee\xfa\xff\xe3\xf1\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd0\xe9\xfb\xff\xa2\xd2\xf7\xffm\xb9\xf1\xffe\xb5\xf0\xffo\xba\xf1\xffr\xbb\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb1\xd9\xf5\xff[\x9b\xc9\xff\x00X\x9b\xff\x00Y\x9c\xd3\x00\\\x9e-\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x06\x00[\x9d\x96\x00V\x99\xff"x\xb8\xffa\xb1\xee\xffk\xba\xf4\xffj\xb8\xf1\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x92\xc9\xf1\xff\x96\xca\xf1\xff\x97\xca\xf0\xff\xac\xd5\xf3\xff\xd0\xe7\xf9\xff\xe0\xef\xfb\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xd0\xea\xfb\xff\xd8\xec\xfb\xff\xc8\xe5\xfa\xff\x8f\xc9\xf4\xffi\xb7\xf0\xffo\xb9\xf1\xffv\xbd\xf1\xffz\xbe\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa8\xd4\xf4\xff\xa6\xd2\xf1\xffE\x8c\xbf\xff\x00U\x99\xff\x00Z\x9d\xaf\x00\\\x9e\x12\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9en\x00V\x98\xfe\x14k\xac\xffY\xaa\xe5\xffp\xbd\xf6\xffm\xb9\xf1\xffp\xba\xf1\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x8b\xc5\xf1\xff\x8f\xc7\xf1\xff\x8e\xc7\xf0\xff\x9a\xcc\xf1\xff\xbd\xde\xf7\xff\xd8\xec\xfb\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd6\xec\xfb\xff\xda\xed\xfb\xff\xb6\xdc\xf8\xff\x80\xc1\xf2\xffo\xb9\xf0\xffy\xbd\xf1\xff~\xc0\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa7\xd4\xf5\xff\x95\xc7\xea\xff+y\xb2\xff\x00T\x98\xff\x00[\x9e\x88\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eQ\x00W\x9a\xee\x08a\xa2\xffL\x9d\xd8\xfft\xbf\xf6\xffq\xbb\xf2\xfft\xbc\xf1\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x83\xc2\xf1\xff\x87\xc4\xf1\xff\x88\xc4\xf1\xff\x8d\xc6\xf0\xff\xaa\xd5\xf4\xff\xcd\xe7\xfa\xff\xd8\xed\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xd7\xeb\xfb\xff\xa6\xd4\xf5\xff{\xbe\xf1\xffy\xbd\xf1\xff\x81\xc2\xf1\xff\x85\xc3\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\xa6\xd4\xf6\xff~\xb6\xdf\xff\x15h\xa7\xff\x00U\x99\xf9\x00\\\x9ek\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e-\x00Y\x9c\xd2\x01Y\x9c\xff<\x8e\xca\xffu\xbe\xf4\xffv\xbe\xf2\xffy\xbd\xf1\xff|\xbf\xf1\xff\x7f\xc1\xf1\xff\x82\xc1\xf1\xff\x83\xc1\xf0\xff\x97\xcb\xf3\xff\xbe\xe0\xf8\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdc\xee\xfb\xff\xe3\xf0\xfc\xff\xcd\xe7\xf9\xff\x98\xcc\xf3\xff|\xbf\xf0\xff\x82\xc2\xf1\xff\x8a\xc5\xf1\xff\x8d\xc6\xf1\xff\x90\xc9\xf1\xff\x96\xcb\xf2\xff\xa1\xd2\xf5\xffc\xa3\xd2\xff\x06]\x9f\xff\x00W\x9b\xe5\x00\\\x9eC\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x12\x00[\x9d\xaf\x00V\x98\xff.\x81\xbe\xffv\xbd\xf2\xff|\xc0\xf4\xff|\xbf\xf1\xff{\xbf\xf0\xff\x83\xc2\xf1\xff\xaa\xd5\xf6\xff\xcc\xe6\xfb\xff\xd1\xea\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe2\xf1\xfb\xff\xe3\xf2\xfb\xff\xbe\xdf\xf7\xff\x8b\xc6\xf1\xff\x84\xc2\xf0\xff\x8c\xc5\xf1\xff\x94\xcb\xf3\xff\x9b\xcf\xf4\xffK\x92\xc6\xff\x00W\x9a\xff\x00Y\x9c\xc7\x00\\\x9e#\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x8c\x00V\x98\xfd u\xb3\xffn\xb4\xe8\xff~\xc0\xf3\xff\x94\xca\xf4\xff\xbe\xe0\xf9\xff\xcf\xe8\xfb\xff\xcd\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe1\xf0\xfb\xff\xe8\xf3\xfb\xff\xdb\xed\xfa\xff\xac\xd5\xf4\xff\x8f\xc7\xf2\xff\x89\xc3\xed\xff6\x83\xbb\xff\x00U\x99\xff\x00[\x9d\xa9\x00\\\x9e\n\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x07\x00\\\x9e\xf1\x00Q\x95\xff\x18p\xb0\xff\x98\xcd\xf5\xff\xd4\xeb\xfd\xff\xce\xe8\xfb\xff\xcb\xe6\xfb\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe6\xf3\xfb\xff\xf2\xf8\xfd\xff\xc9\xe5\xf9\xff1\x81\xba\xff\x00O\x94\xff\x00\\\x9e\xff\x00\\\x9e\'\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e}\x00V\x99\xfc\x1ap\xae\xffc\xad\xe4\xffM\xa8\xef\xff\x83\xc2\xf3\xff\xc6\xe4\xfb\xff\xd1\xe9\xfc\xff\xcc\xe6\xfb\xff\xce\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe7\xf4\xfc\xff\xe7\xf3\xfb\xff\xb6\xd8\xf4\xff{\xbc\xee\xff\x7f\xbd\xe9\xff/}\xb7\xff\x00U\x99\xff\x00[\x9d\x9d\x00\\\x9e\x06\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00[\x9d\xa2\x00U\x98\xff\'{\xb9\xffs\xbb\xef\xff{\xc0\xf4\xff@\xa1\xed\xff3\x99\xeb\xffW\xac\xee\xff\xa7\xd4\xf7\xff\xd3\xe9\xfc\xff\xd1\xeb\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xed\xfb\xff\xdc\xed\xfb\xff\xe0\xf0\xfb\xff\xea\xf5\xfc\xff\xcc\xe5\xf8\xff~\xbe\xee\xffX\xaa\xe9\xffc\xb0\xe9\xff\x92\xca\xf3\xff\x9a\xcd\xf3\xffC\x8d\xc2\xff\x00U\x99\xff\x00Z\x9c\xbd\x00\\\x9e\x1c\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e%\x00Z\x9c\xc9\x00X\x9b\xff6\x8a\xc6\xffs\xbd\xf3\xffw\xbe\xf3\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xff>\x9f\xeb\xffE\xa2\xeb\xff}\xbf\xf1\xff\xc3\xe3\xfa\xff\xd8\xed\xfc\xff\xd4\xeb\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xd7\xec\xfb\xff\xdb\xed\xfb\xff\xe4\xf1\xfc\xff\xda\xed\xfb\xff\x97\xca\xf2\xffV\xa9\xea\xffS\xa7\xe9\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x97\xcc\xf2\xff\xa1\xd1\xf5\xff\\\x9e\xcf\xff\x03[\x9d\xff\x00X\x9b\xdf\x00\\\x9e<\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eH\x00X\x9a\xe8\x06_\xa0\xffH\x99\xd5\xffs\xbf\xf6\xffq\xbb\xf2\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffG\xa4\xeb\xff\\\xad\xed\xff\x9e\xcf\xf5\xff\xd4\xea\xfb\xff\xda\xee\xfc\xff\xd7\xec\xfb\xff\xda\xec\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd3\xea\xfb\xff\xd5\xeb\xfb\xff\xdd\xef\xfc\xff\xe1\xf0\xfc\xff\xac\xd5\xf5\xff\\\xad\xec\xffB\xa0\xe9\xffQ\xa7\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9a\xcc\xf1\xff\xa6\xd4\xf6\xffy\xb2\xdd\xff\x11f\xa5\xff\x00V\x99\xf6\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ef\x00V\x99\xfc\x11h\xa9\xffV\xa7\xe2\xffp\xbd\xf6\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffR\xa9\xec\xffS\xa9\xeb\xffx\xbb\xef\xff\xba\xdd\xf7\xff\xdd\xef\xfc\xff\xdc\xed\xfb\xff\xdc\xed\xfb\xff\xde\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd1\xe9\xfb\xff\xd5\xeb\xfb\xff\xdf\xf0\xfc\xff\xc1\xe1\xf9\xffk\xb5\xef\xff8\x9b\xe9\xff@\xa0\xe9\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa8\xd5\xf5\xff\x91\xc4\xe8\xff\'u\xb0\xff\x00T\x98\xff\x00\\\x9e\x83\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x04\x00[\x9d\x90\x00W\x98\xff\x1fv\xb6\xff_\xaf\xec\xffk\xba\xf5\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xff\\\xad\xeb\xffc\xb1\xeb\xff\x99\xcc\xf2\xff\xd4\xe9\xfa\xff\xe2\xf0\xfc\xff\xdf\xef\xfb\xff\xe0\xf0\xfb\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe4\xf2\xfb\xff\xca\xe7\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xcd\xe6\xfb\xff\xcf\xe9\xfb\xff\xd9\xed\xfc\xff\xd4\xea\xfb\xff\x87\xc4\xf3\xff6\x9b\xea\xff/\x98\xe9\xff>\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa9\xd4\xf4\xff\xa5\xd1\xf0\xffB\x89\xbd\xff\x00U\x99\xff\x00[\x9d\xab\x00\\\x9e\x10\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x19\x00Z\x9d\xb9\x00W\x99\xff*\x81\xc0\xffc\xb5\xf2\xfff\xb6\xf3\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xfff\xb2\xeb\xff}\xbd\xed\xff\xb8\xda\xf5\xff\xe1\xf0\xfb\xff\xe4\xf2\xfc\xff\xe2\xf1\xfb\xff\xe3\xf1\xfb\xff\xe5\xf1\xfb\xff\xe3\xf2\xfb\xff\xc8\xe6\xfb\xff\xc8\xe5\xfb\xff\xc9\xe6\xfb\xff\xcb\xe6\xfb\xff\xd2\xe8\xfb\xff\xd8\xee\xfc\xff\xa5\xd2\xf7\xffG\xa2\xed\xff!\x90\xe9\xff0\x98\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa9\xd4\xf2\xff\xb0\xd9\xf5\xffX\x99\xc8\xff\x00W\x9b\xff\x00Y\x9c\xd1\x00\\\x9e,\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e9\x00Y\x9b\xdc\x03\\\x9d\xff9\x8f\xce\xffd\xb6\xf5\xffb\xb4\xf2\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffp\xb7\xeb\xfft\xb7\xeb\xff\x97\xc9\xf0\xff\xcf\xe7\xf8\xff\xe7\xf4\xfc\xff\xe4\xf2\xfb\xff\xe3\xf0\xfb\xff\xe9\xf4\xfb\xff\xd6\xec\xfc\xff\xc5\xe3\xfb\xff\xca\xe6\xfb\xff\xd7\xec\xfc\xff\xbb\xdd\xf9\xff]\xaf\xf0\xff\x1b\x8d\xe9\xff\x1f\x8e\xe9\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaa\xd4\xf2\xff\xb7\xdb\xf6\xffv\xae\xd6\xff\n`\xa0\xff\x00W\x9a\xed\x00\\\x9eQ\x00\\\x9e\x00\x00\\\x9eP\x00Y\x9b\xf5\x0cd\xa6\xffF\x9c\xdc\xffb\xb6\xf6\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xffy\xba\xeb\xff\x83\xbf\xec\xff\xb0\xd6\xf2\xff\xe1\xf0\xfa\xff\xf5\xfa\xfe\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xf1\xf8\xfe\xff\xd2\xe9\xfb\xffz\xbd\xf4\xff \x90\xeb\xff\x10\x87\xe9\xff \x8e\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xba\xdd\xf6\xff\x93\xc1\xe3\xff\x1eo\xaa\xff\x00X\x9b\xff\x00\\\x9ep\x00Z\x9c\xd6\x0bc\xa4\xffQ\xa7\xe7\xffb\xb8\xf9\xff\\\xb1\xf1\xff_\xb2\xf1\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff~\xbd\xec\xff\x82\xbe\xec\xff\x84\xbf\xeb\xff\xa1\xce\xef\xff\xdf\xee\xf9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xce\xe7\xfb\xffJ\xa5\xee\xff\x08\x83\xe9\xff\x12\x89\xea\xff\x1b\x8d\xea\xff!\x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xac\xd4\xf1\xff\xae\xd5\xf1\xff\xbf\xe0\xf7\xff\xab\xd2\xed\xff\x1en\xaa\xff\x00X\x9b\xeb\x00[\x9d\x90\x02\\\x9e\xff\x1bs\xb4\xffM\xa2\xe2\xffb\xb7\xf6\xff`\xb3\xf2\xffa\xb3\xf1\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffs\xb8\xec\xffy\xba\xec\xff\x7f\xbd\xec\xff\x89\xc1\xed\xff\x92\xc6\xed\xff\x93\xc7\xed\xff\x95\xc7\xec\xff\xc0\xde\xf3\xff\x7f\xbf\xf4\xff\x0f\x87\xe9\xff\r\x87\xe9\xff\x1c\x8e\xea\xff\x1d\x8e\xea\xff\x1d\x8e\xea\xff \x8f\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xa9\xd3\xf1\xff\xad\xd5\xf2\xff\xba\xdd\xf6\xff\x9b\xc7\xe7\xff=\x84\xb9\xff\x05]\x9f\xff\x00[\x9d\xb1\x00\\\x9e\x03\x00\\\x9ey\x00X\x9a\xf3\x05^\x9f\xff6\x8c\xcc\xff`\xb3\xf2\xffe\xb7\xf5\xffc\xb4\xf1\xfff\xb6\xf1\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xfff\xb2\xec\xffm\xb5\xec\xffr\xb8\xec\xff|\xbb\xec\xff\x87\xc1\xed\xff\x8e\xc4\xed\xff\x92\xc6\xed\xff\x94\xc7\xed\xff\x9d\xcb\xed\xff\xb7\xd9\xf3\xffP\xaa\xf0\xff\x18\x8c\xea\xff\x13\x89\xea\xff\x1b\x8e\xea\xff \x90\xea\xff$\x92\xea\xff$\x91\xea\xff&\x92\xea\xff,\x96\xea\xff3\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa3\xd0\xf1\xff\xa6\xd2\xf1\xff\xaf\xd7\xf4\xff\xb1\xd8\xf4\xffn\xa8\xd2\xff\x0ec\xa2\xff\x00U\x99\xfd\x00\\\x9e\x91\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e)\x00Z\x9c\xb2\x00V\x99\xff\x18o\xb0\xffR\xa4\xe2\xffj\xb9\xf6\xffg\xb7\xf2\xffi\xb8\xf1\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xff[\xad\xec\xffa\xb0\xec\xffe\xb2\xec\xffm\xb5\xec\xffz\xbb\xed\xff\x84\xc0\xed\xff\x89\xc2\xed\xff\x8d\xc4\xed\xff\x8f\xc4\xec\xff\x9c\xcc\xee\xff\xc5\xe1\xf5\xff\xca\xe4\xf7\xffi\xb7\xf2\xffS\xac\xf0\xff(\x94\xeb\xff\x16\x8b\xea\xff \x90\xea\xff$\x92\xea\xff*\x95\xea\xff,\x96\xea\xff-\x97\xea\xff2\x99\xea\xff9\x9d\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\x9f\xce\xf1\xff\xa5\xd1\xf2\xff\xb1\xd9\xf6\xff\x94\xc4\xe7\xff2}\xb5\xff\x00U\x99\xff\x00Y\x9c\xc6\x00\\\x9e;\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e[\x00X\x9a\xe1\x04]\x9e\xff3\x87\xc5\xffd\xb4\xef\xffo\xbd\xf5\xffl\xb9\xf1\xffp\xba\xf1\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffU\xaa\xec\xffZ\xad\xec\xff`\xaf\xec\xffj\xb5\xec\xffx\xba\xed\xff\x80\xbe\xed\xff\x83\xc0\xed\xff\x89\xc2\xed\xff\x8a\xc2\xec\xff\x9b\xcb\xef\xff\xc4\xe0\xf6\xff\xd0\xe7\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xff[\xb0\xf1\xff^\xb1\xf1\xff2\x9a\xec\xff\x1b\x8d\xea\xff#\x92\xea\xff)\x95\xea\xff/\x98\xea\xff4\x9a\xea\xff6\x9b\xea\xff9\x9c\xea\xff?\x9f\xea\xffF\xa3\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x99\xcc\xf1\xff\x9c\xcd\xf1\xff\xa6\xd3\xf5\xff\xa4\xd1\xf2\xff^\x9e\xcc\xff\x0b`\xa1\xff\x00V\x99\xef\x00\\\x9er\x00\\\x9e\x04\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x17\x00[\x9d\xa0\x00V\x98\xff\x12i\xaa\xffM\x9e\xd9\xffr\xbe\xf5\xffs\xbc\xf3\xffu\xbc\xf1\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffI\xa4\xec\xffO\xa8\xec\xffT\xa9\xec\xff\\\xad\xec\xffi\xb4\xed\xffs\xba\xed\xffy\xbb\xed\xff\x7f\xbe\xed\xff\x83\xc0\xed\xff\x85\xc0\xec\xff\x9e\xcd\xf0\xff\xc3\xe1\xf7\xff\xcb\xe4\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb3\xf1\xfff\xb5\xf1\xffA\xa2\xed\xff \x90\xea\xff(\x94\xea\xff.\x98\xea\xff4\x9a\xea\xff;\x9d\xea\xff?\x9f\xea\xffA\xa0\xea\xffE\xa2\xea\xffL\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x95\xca\xf1\xff\x9c\xce\xf3\xff\xa5\xd4\xf6\xff~\xb6\xdf\xff%t\xaf\xff\x00U\x99\xff\x00Z\x9c\xb6\x00\\\x9e&\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eI\x00X\x9b\xd3\x00X\x9b\xff)}\xbb\xffg\xb2\xea\xff|\xc2\xf6\xffv\xbc\xf1\xffC\xa2\xed\xff<\x9e\xec\xffC\xa2\xec\xffH\xa4\xec\xffO\xa7\xec\xff[\xae\xec\xffh\xb3\xed\xffn\xb7\xed\xffs\xba\xed\xffy\xbb\xed\xff~\xbd\xed\xff\x80\xbf\xec\xff\xa1\xcf\xf1\xff\xc3\xe1\xf7\xff\xc6\xe3\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffe\xb5\xf1\xffm\xb9\xf1\xffQ\xaa\xee\xff)\x94\xea\xff,\x97\xea\xff4\x9a\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffJ\xa5\xea\xffM\xa5\xea\xffS\xa8\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xea\xff\x8d\xc7\xf1\xff\x9d\xd0\xf6\xff\x93\xc7\xed\xffF\x8d\xc2\xff\x02Z\x9d\xff\x00W\x9a\xe4\x00\\\x9e`\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\n\x00\\\x9e\x81\x00V\x99\xf6\x0cc\xa4\xffM\x9a\xd3\xffz\xbf\xf3\xffD\xa3\xee\xff;\x9e\xec\xffB\xa2\xec\xffM\xa6\xec\xff[\xae\xed\xffd\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffs\xba\xed\xffw\xba\xed\xff~\xbd\xed\xff\xa5\xd2\xf3\xff\xc1\xe0\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffs\xbb\xf1\xffa\xb2\xef\xff3\x9a\xeb\xff0\x98\xea\xff:\x9d\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffR\xa8\xea\xffV\xa9\xea\xffZ\xab\xea\xff_\xad\xea\xffg\xb2\xeb\xff\x94\xcc\xf5\xffn\xad\xda\xff\x18k\xa9\xff\x00T\x98\xff\x00[\x9d\x9b\x00\\\x9e\x18\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e/\x00Y\x9c\xbd\x00W\x99\xff%z\xb7\xffB\xa0\xea\xff;\x9e\xec\xffK\xa6\xed\xffY\xad\xed\xff_\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffm\xb6\xed\xffp\xb8\xec\xff}\xbd\xee\xff\xa8\xd4\xf4\xff\xbe\xdf\xf8\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xffx\xbe\xf1\xffq\xb9\xf0\xff@\xa0\xeb\xff5\x9b\xea\xffA\xa0\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffZ\xab\xea\xff]\xae\xea\xff]\xac\xea\xffk\xb3\xeb\xff:\x87\xbf\xff\x00X\x9a\xff\x00X\x9b\xd1\x00\\\x9eD\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x03\x00[\x9d\xb6\x00[\x9e\xffi\xb2\xe8\xffq\xbc\xf4\xffT\xaa\xed\xffV\xaa\xed\xff^\xaf\xed\xffc\xb2\xed\xffh\xb4\xed\xffj\xb5\xec\xffz\xbd\xee\xff\xa9\xd5\xf5\xff\xb9\xdd\xf8\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff~\xbf\xf1\xff|\xbe\xf0\xffM\xa6\xeb\xff;\x9d\xea\xffG\xa3\xea\xffM\xa6\xea\xffS\xa9\xea\xffW\xaa\xea\xff]\xae\xea\xff\x84\xc1\xee\xff\x9c\xc9\xea\xff\ta\xa1\xff\x00Y\x9b\xcd\x00\\\x9e\x0e\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x8c\x04_\xa1\xff~\xbc\xea\xff\x9c\xd2\xfa\xff\x8a\xc7\xf5\xffg\xb4\xef\xffY\xad\xec\xffa\xb1\xed\xffd\xb2\xec\xff|\xbe\xef\xff\xa9\xd4\xf6\xff\xb3\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x83\xc2\xf1\xff\x88\xc4\xf1\xff^\xae\xed\xffB\xa0\xea\xffK\xa5\xea\xffN\xa6\xea\xffd\xb0\xeb\xff\x97\xca\xef\xff\xb7\xda\xf3\xff\xa9\xd0\xeb\xff\x0ef\xa4\xff\x00Z\x9c\xa7\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00[\x9d\x92\x04_\xa1\xff\x82\xbf\xee\xff\x98\xd0\xfb\xff\x99\xce\xf7\xff\x9a\xce\xf7\xff\x81\xc1\xf2\xffd\xb2\xed\xff~\xbf\xf0\xff\xa8\xd5\xf7\xff\xae\xd8\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x89\xc5\xf1\xff\x91\xc9\xf1\xffo\xb7\xed\xffN\xa6\xea\xffu\xb9\xed\xff\xa3\xd0\xf0\xff\xaf\xd6\xf1\xff\xb5\xda\xf4\xff\xaf\xd5\xef\xff\x0ef\xa4\xff\x00Z\x9c\xaa\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9em\x01[\x9d\xffT\x9c\xd1\xff\x98\xd0\xfb\xff\x9b\xd1\xfa\xff\x99\xce\xf7\xff\x9f\xd2\xf7\xff\x9a\xcf\xf6\xff\xa4\xd4\xf7\xff\xa9\xd6\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x96\xcb\xf1\xff\x93\xc8\xf0\xff\xa3\xd0\xf1\xff\xa7\xd3\xf1\xff\xb3\xd9\xf5\xff\xae\xd4\xf0\xffZ\x98\xc7\xff\x03\\\x9d\xff\x00[\x9d{\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x16\x00[\x9d\xcd\x00W\x99\xff*z\xb6\xff\x85\xc0\xec\xff\xa3\xd6\xfd\xff\x9d\xd1\xf8\xff\xa0\xd3\xf7\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\x9c\xcd\xf1\xff\xa3\xd1\xf2\xff\xb1\xd9\xf6\xff\x87\xba\xdf\xff!p\xac\xff\x00T\x99\xff\x00[\x9e\xb9\x00\\\x9e\x13\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x99\xf5\na\xa2\xff\\\x9f\xd2\xff\xa0\xd3\xf9\xff\xa6\xd7\xfb\xff\xa4\xd4\xf7\xff\xa8\xd5\xf7\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x8e\xc7\xf1\xff\x94\xca\xf1\xff\xa3\xd2\xf5\xff\x9e\xcd\xf0\xffQ\x95\xc6\xff\x03[\x9d\xff\x00W\x9a\xe9\x00\\\x9ei\x00\\\x9e\x01\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e.\x00Z\x9c\xb6\x00U\x99\xff(x\xb3\xff\x81\xbc\xe6\xff\xae\xdb\xfc\xff\xab\xd7\xf9\xff\xac\xd7\xf7\xff\xb1\xd9\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x81\xc1\xf1\xff\x88\xc4\xf1\xff\x92\xca\xf3\xff\x9c\xd0\xf5\xffr\xae\xda\xff\x1dn\xab\xff\x00U\x99\xff\x00[\x9d\x9f\x00\\\x9e\x1d\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ed\x00V\x99\xe9\x03[\x9e\xffL\x92\xc6\xff\xa1\xd0\xf3\xff\xb6\xde\xfc\xff\xb2\xda\xf7\xff\xb6\xdb\xf7\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff{\xbe\xf1\xff\x82\xc2\xf2\xff\x90\xca\xf6\xff\x82\xbe\xe9\xff8\x84\xbc\xff\x00X\x9b\xff\x00W\x9b\xd9\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x1c\x00[\x9d\x9f\x00T\x98\xff\x18j\xa8\xfft\xaf\xd9\xff\xb8\xde\xfa\xff\xbb\xdf\xfa\xff\xba\xdd\xf7\xff\xbd\xde\xf7\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffn\xb9\xf1\xfft\xbc\xf1\xff\x80\xc2\xf4\xff\x85\xc4\xf3\xffR\x9a\xcf\xff\rc\xa3\xff\x00U\x99\xf9\x00[\x9e\x88\x00\\\x9e\x0f\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eG\x00X\x9b\xd0\x00V\x9a\xff=\x85\xbb\xff\xa3\xce\xee\xff\xc6\xe5\xfd\xff\xbf\xdf\xf8\xff\xc2\xe0\xf7\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffi\xb7\xf1\xffo\xba\xf2\xff|\xc2\xf6\xffj\xb0\xe4\xff%w\xb4\xff\x00U\x99\xff\x00Z\x9c\xbc\x00\\\x9e3\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x08\x00\\\x9e{\x00T\x99\xf5\rb\xa2\xffk\xa5\xd0\xff\xbe\xdf\xf7\xff\xcb\xe6\xfb\xff\xc5\xe2\xf7\xff\xc9\xe3\xf7\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xff_\xb2\xf1\xffd\xb4\xf1\xffn\xbc\xf5\xffm\xb8\xf0\xff=\x8d\xc8\xff\x06^\x9f\xff\x00W\x99\xe9\x00\\\x9ed\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e0\x00Y\x9c\xbc\x00T\x98\xff*v\xb0\xff\x95\xc2\xe2\xff\xd0\xea\xfc\xff\xcd\xe6\xf9\xff\xcd\xe6\xf7\xff\xc8\xe3\xf7\xffe\xb5\xf2\xffY\xaf\xf1\xffa\xb4\xf3\xffj\xb9\xf5\xffN\x9f\xda\xff\x15k\xab\xff\x00V\x98\xff\x00Z\x9d\xa7\x00\\\x9e \x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9ec\x00V\x9a\xe4\x01Y\x9c\xffS\x93\xc2\xff\xbf\xdd\xf2\xff\xd9\xee\xfc\xff\xc9\xe3\xf7\xffe\xb5\xf2\xff^\xb4\xf6\xffZ\xad\xeb\xff(}\xbc\xff\x00Y\x9b\xff\x00X\x9b\xd7\x00\\\x9eO\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x18\x00[\x9d\x9a\x00S\x98\xff\x1cl\xa8\xff\x8d\xb9\xda\xff\xd1\xe9\xfb\xffk\xba\xf5\xff;\x92\xd3\xff\x0cd\xa5\xff\x00V\x99\xf7\x00[\x9d\x85\x00\\\x9e\r\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9eA\x00X\x9b\xd2\x00V\x9a\xff?\x87\xbb\xff&z\xb8\xff\x00W\x99\xff\x00Y\x9c\xc3\x00\\\x9e1\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0b\x00\\\x9e\x81\x00V\x9a\xf0\x00X\x9a\xf2\x00\\\x9eu\x00\\\x9e\x03\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x0f\x00[\x9et\x00\\\x9ex\x00\\\x9e\x0b\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 64, 64, 256)
275 | window_icon = gtk.gdk.pixbuf_new_from_data('\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00V\x99\x00\x00L\x91g\x00N\x93q\x00X\x9c\x00\x00^\x9f\x00\x00]\x9f\x00\x00Y\x9c\x00\x00P\x94o\x00M\x92i\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00^\xa0\x00\x00T\x97\x00\x00F\x8c_1\x81\xba\xff+|\xb6\xff\x00F\x8e?\x00\\\x9e\x00\x00\\\x9e\x00\x00J\x8e;$y\xb6\xff-\x7f\xbc\xff\x00E\x8cb\x00R\x97\x00\x00^\xa0\x00\x00\\\x9e\x00\x00[\x9d\x00\x00I\x8c*\x05X\x9b\xc0P\x9b\xd5\xff\xa7\xdd\xff\xff\xbb\xe5\xff\xff@\x86\xbb\xff\x00>\x89D\x00D\x89B\'{\xbb\xff\x89\xcf\xff\xff\xa2\xdb\xff\xffg\xa6\xd5\xff\x07Y\x9b\xc3\x00C\x8c,\x00[\x9d\x00\x05\\\x9e\x971\x84\xc5\xffk\xbb\xf6\xff\x8e\xd0\xff\xff\x86\xc3\xf0\xff\xa2\xd2\xf5\xff\xc4\xe7\xff\xffP\x90\xc0\xff\x15u\xbf\xfff\xbf\xff\xffx\xc1\xf6\xff\x80\xc0\xf0\xff\xb0\xdf\xff\xff\xa9\xd7\xf6\xff\\\x97\xc5\xff\x0b]\x9e\x98\x08[\x9e\xdcX\xb0\xf0\xff\x84\xd0\xff\xffx\xbc\xf0\xff\x83\xc2\xf0\xff\x88\xc3\xee\xff\xb1\xd7\xf3\xff\xf9\xff\xff\xff\xca\xec\xff\xffm\xba\xf3\xffX\xae\xee\xff{\xbe\xf0\xff\x91\xc7\xf0\xff\xd2\xf2\xff\xff\xa6\xd4\xf0\xff\x11]\x9e\xde\x00T\x96\x00\x00N\x91\x9eD\x98\xd5\xff\x84\xc9\xfc\xff\x85\xc3\xf1\xff\xb7\xdb\xf6\xff\xe9\xf4\xfc\xff\xe9\xf5\xfd\xff\xdb\xee\xfd\xff\xdf\xef\xfc\xff\xa8\xd5\xf6\xff|\xbf\xf1\xff\xa3\xd6\xfc\xffl\xaa\xd6\xff\x00J\x91\xa1\x00Q\x96\x00\x00^\xa0\x00\x00T\x97\x00\x008\x7f\x9eC\x94\xd1\xff\xde\xf6\xff\xff\xf5\xfc\xff\xff\xe0\xef\xfb\xff\xe0\xf0\xfb\xff\xc8\xe5\xfb\xff\xcf\xe7\xfb\xff\xff\xff\xff\xff\xfe\xff\xff\xffV\x9d\xd2\xff\x002\x80\xa2\x00Q\x96\x00\x00_\xa0\x00\x00W\x99\x00\x00I\x8cq9\x89\xc3\xf1Y\xb0\xf2\xffR\xaa\xef\xff\xbc\xde\xf7\xff\xf9\xfc\xfe\xff\xe3\xf2\xfb\xff\xd3\xea\xfc\xff\xf5\xfb\xff\xff\xb7\xdb\xf7\xffd\xb1\xed\xff\x86\xc3\xf2\xffR\x93\xc4\xf3\x00D\x8du\x00T\x99\x00\x06Z\x9d\xb3I\xa0\xe0\xff\x8a\xd2\xff\xffe\xb5\xf2\xff/\x97\xe8\xffK\xa4\xe9\xff\x9c\xcd\xf0\xff\xf6\xf9\xfc\xff\xd6\xec\xfc\xffX\xab\xf0\xff\x15\x8a\xe6\xff9\x9b\xe6\xff\x8c\xc6\xf1\xff\xd1\xf0\xff\xff\x8b\xbe\xe1\xff\x0e\\\x9d\xb6\x07]\x9f\xc1D\x98\xd9\xff\x85\xcd\xff\xffm\xbc\xf9\xff;\x9d\xe9\xff^\xae\xec\xffl\xb3\xe8\xff\xb7\xd9\xf2\xffC\xa2\xef\xff\x00s\xe5\xff3\x99\xea\xffL\xa3\xe7\xff\x96\xce\xf9\xff\xc7\xeb\xff\xff\x81\xb3\xd9\xff\x10_\x9f\xc4\x00X\x9a\x00\x00H\x8bU\x1eq\xad\xeeR\xa8\xe8\xffA\xa4\xf1\xff`\xae\xea\xff\xa9\xd3\xf2\xff\xc8\xe4\xf8\xffh\xb7\xf2\xff@\xa2\xed\xff,\x95\xe8\xffQ\xaa\xef\xff|\xba\xe9\xff*u\xae\xf1\x00A\x8bX\x00V\x9a\x00\x00\\\x9e\x00\x00]\x9f\x00\x00>\x84\x0c"v\xb3\xff\x9b\xdb\xff\xff\x97\xcf\xf8\xff\xce\xe6\xf8\xff\xc5\xe1\xf7\xffe\xb5\xf1\xfft\xbc\xf0\xffu\xbe\xf5\xff\xa9\xde\xff\xff0{\xb0\xff\x00:\x85\x0f\x00]\x9f\x00\x00]\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00Y\x9c\x00\x02S\x97zH\x89\xbf\xff\xb8\xe3\xfd\xff\xe8\xfb\xff\xff\xc2\xdf\xf7\xff`\xb3\xf1\xff\x82\xcb\xff\xff\xa1\xd3\xf7\xffJ\x88\xb8\xff\x00S\x96r\x00Z\x9d\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00]\x9f\x00\x00[\x9d\x00\x00C\x8b*\x08W\x9b\xc5\x8c\xb9\xda\xff\xea\xfd\xff\xff\x80\xcb\xff\xffG\x97\xd4\xff\x03W\x99\xbc\x00E\x8d"\x00[\x9e\x00\x00]\x9f\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00Q\x96\x00\x00C\x8di>\x88\xbd\xff,\x7f\xbb\xff\x00G\x8c`\x00T\x98\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00_\xa0\x00\x00R\x98\x00\x00I\x92r\x00P\x92n\x00V\x99\x00\x00^\xa0\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00\x00\\\x9e\x00', gtk.gdk.COLORSPACE_RGB, True, 8, 16, 16, 64)
276 |
277 | GUI_AVAILABLE = os.environ.get("DISPLAY", '')
278 |
279 | if GUI_AVAILABLE:
280 | def download():
281 | import pygtk
282 | pygtk.require("2.0")
283 | import gtk
284 | import gobject
285 | import pango
286 | import webbrowser
287 |
288 | gtk.gdk.threads_init()
289 |
290 | load_serialized_images()
291 |
292 | global FatalVisibleError
293 | def FatalVisibleError(s):
294 | error = gtk.MessageDialog(parent = None,
295 | flags = gtk.DIALOG_MODAL,
296 | type = gtk.MESSAGE_ERROR,
297 | buttons = gtk.BUTTONS_OK,
298 | message_format = s)
299 | error.set_title("Error")
300 | error.run()
301 | gtk.main_quit()
302 | sys.exit(-1)
303 |
304 | class GeneratorTask(object):
305 | def __init__(self, generator, loop_callback, on_done=None, on_exception=None):
306 | self.generator = generator
307 | self.loop_callback = loop_callback
308 | self.on_done = on_done
309 | self.on_exception = on_exception
310 |
311 | def _run(self, *args, **kwargs):
312 | self._stopped = False
313 | try:
314 | for ret in self.generator(*args, **kwargs):
315 | if ret is None:
316 | ret = ()
317 | if not isinstance(ret, tuple):
318 | ret = (ret,)
319 | gobject.idle_add(self.loop_callback, *ret)
320 |
321 | if self._stopped:
322 | thread.exit()
323 | except Exception, ex:
324 | print ex
325 | if self.on_exception is not None:
326 | gobject.idle_add(self.on_exception, ex)
327 | else:
328 | if self.on_done is not None:
329 | gobject.idle_add(self.on_done)
330 |
331 | def start(self, *args, **kwargs):
332 | t = threading.Thread(target=self._run, args=args, kwargs=kwargs)
333 | t.setDaemon(True)
334 | t.start()
335 |
336 | def stop(self):
337 | self._stopped = True
338 |
339 | class DownloadDialog(gtk.Dialog):
340 | def handle_delete_event(self, wid, ev, data=None):
341 | self.handle_cancel(wid)
342 |
343 | def handle_dont_show_toggle(self, button, data=None):
344 | reroll_autostart(not button.get_active())
345 |
346 | def handle_cancel(self, button):
347 | if self.task:
348 | self.task.stop()
349 | if self.download:
350 | self.download.cancel()
351 | gtk.main_quit()
352 | self.user_cancelled = True
353 |
354 | def handle_ok(self, button):
355 | # begin download
356 | self.ok.hide()
357 | self.download = DownloadState()
358 |
359 | self.label.hide()
360 | if self.dont_show_again_align is not None:
361 | self.dont_show_again_align.hide()
362 | self.progress.show()
363 |
364 | def download_progress(progress, status):
365 | if not status:
366 | self.task.stop()
367 | self.update_progress(DOWNLOADING, progress)
368 |
369 | def finished():
370 | self.update_progress(DOWNLOADING, 1.0)
371 | self.unpack_dropbox()
372 |
373 | def error(ex):
374 | FatalVisibleError(ERROR_CONNECTING)
375 |
376 | self.update_progress(DOWNLOADING, 0)
377 | self.task = GeneratorTask(self.download.copy_data,
378 | download_progress,
379 | finished, error).start()
380 |
381 | def update_progress(self, text, fraction):
382 | self.progress.set_text(text % int(fraction*100))
383 | self.progress.set_fraction(fraction)
384 |
385 | def unpack_dropbox(self):
386 | def unpack_progress(name, i, total):
387 | self.update_progress(UNPACKING, float(i)/total)
388 |
389 | def finished():
390 | self.update_progress(UNPACKING, 1.0)
391 | gtk.main_quit()
392 |
393 | def error(ex):
394 | if isinstance(ex, SignatureVerifyError):
395 | FatalVisibleError(ERROR_SIGNATURE)
396 | else:
397 | FatalVisibleError(ERROR_CONNECTING)
398 |
399 | self.task = GeneratorTask(self.download.unpack,
400 | unpack_progress,
401 | finished, error).start()
402 |
403 | def mouse_down(self, widget, event):
404 | if self.hovering:
405 | self.clicked_link = True
406 |
407 | def mouse_up(self, widget, event):
408 | if self.clicked_link:
409 | webbrowser.open(LINK)
410 | self.clicked_link = False
411 |
412 | def label_motion(self, widget, event):
413 | offx, offy = self.label.get_layout_offsets()
414 | layout = self.label.get_layout()
415 | index = layout.xy_to_index(int((offx+event.x)*pango.SCALE),
416 | int((offy+event.y)*pango.SCALE))[0]
417 | link_index = layout.get_text().find(LINK)
418 | if index >= link_index and index < link_index+len(LINK):
419 | self.hovering = True
420 | self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2))
421 | else:
422 | self.hovering = False
423 | self.label_box.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.ARROW))
424 |
425 |
426 | def __init__(self):
427 | super(DownloadDialog, self).__init__(parent = None,
428 | title = "Dropbox Installation")
429 |
430 | self.download = None
431 | self.hovering = False
432 | self.clicked_link = False
433 | self.user_cancelled = False
434 | self.task = None
435 |
436 | self.ok = ok = gtk.Button(stock=gtk.STOCK_OK)
437 | ok.connect('clicked', self.handle_ok)
438 | self.action_area.add(ok)
439 | ok.show()
440 |
441 | cancel = gtk.Button(stock=gtk.STOCK_CANCEL)
442 | cancel.connect('clicked', self.handle_cancel)
443 | self.action_area.add(cancel)
444 | cancel.show()
445 |
446 | self.connect('delete_event', self.handle_delete_event)
447 |
448 | self.box_logo = gtk.image_new_from_pixbuf(box_logo_pixbuf)
449 | self.box_logo.show()
450 |
451 | self.set_icon(window_icon)
452 |
453 | self.progress = gtk.ProgressBar()
454 | self.progress.set_property('width-request', 300)
455 |
456 | self.label = gtk.Label()
457 | GPG_WARNING_MSG = (u"\n\n" + GPG_WARNING) if not gpgme else u""
458 | self.label.set_markup('%s %s\n\n%s%s' % (INFO, LINK, WARNING, GPG_WARNING_MSG))
459 | self.label.set_line_wrap(True)
460 | self.label.set_property('width-request', 300)
461 | self.label.show()
462 |
463 | self.label_box = gtk.EventBox()
464 | self.label_box.add(self.label)
465 | self.label_box.connect("button-release-event", self.mouse_up)
466 | self.label_box.connect("button-press-event", self.mouse_down)
467 | self.label_box.connect("motion-notify-event", self.label_motion)
468 |
469 | self.label_box.show()
470 | def on_realize(widget):
471 | self.label_box.add_events(gtk.gdk.POINTER_MOTION_MASK)
472 | self.label_box.connect("realize", on_realize)
473 |
474 | self.hbox = gtk.HBox(spacing=10)
475 | self.hbox.set_property('border-width',10)
476 | self.hbox.pack_start(self.box_logo, False, False)
477 | self.hbox.pack_start(self.label_box, False, False)
478 | self.hbox.pack_start(self.progress, False, False)
479 | self.hbox.show()
480 |
481 | self.vbox.add(self.hbox)
482 |
483 | self.dont_show_again_align = None
484 |
485 | try:
486 | if can_reroll_autostart():
487 | dont_show_again = gtk.CheckButton("_Don't show this again")
488 | dont_show_again.connect('toggled', self.handle_dont_show_toggle)
489 | dont_show_again.show()
490 |
491 | self.dont_show_again_align = gtk.Alignment(xalign=1.0, yalign=0.0, xscale=0.0, yscale=0.0)
492 | self.dont_show_again_align.add(dont_show_again)
493 | self.dont_show_again_align.show()
494 |
495 | hbox = gtk.HBox()
496 | hbox.set_property('border-width', 10)
497 | hbox.pack_start(self.dont_show_again_align, True, True)
498 | hbox.show()
499 |
500 | self.vbox.add(hbox)
501 |
502 | self.set_resizable(False)
503 | except:
504 | traceback.print_exc()
505 |
506 | self.ok.grab_focus()
507 |
508 | dialog = DownloadDialog()
509 | dialog.show()
510 | gtk.main()
511 | if dialog.user_cancelled:
512 | raise Exception("user cancelled download!!!")
513 | else:
514 | def download():
515 | global FatalVisibleError
516 | def FatalVisibleError(s):
517 | console_print(u"\nError: %s" % s, f=sys.stderr)
518 | sys.exit(-1)
519 |
520 |
521 | ESC = "\x1b"
522 | save = ESC+"7"
523 | unsave = ESC+"8"
524 | erase_to_start = ESC+"[1K"
525 | write = sys.stdout.write
526 | flush = sys.stdout.flush
527 |
528 | last_progress = [None, None]
529 | def setprogress(text, frac):
530 | if last_progress == [text, frac]:
531 | return
532 | if sys.stdout.isatty():
533 | write(erase_to_start)
534 | write(unsave)
535 | console_print(text % int(100*frac), linebreak=not sys.stdout.isatty())
536 | if sys.stdout.isatty():
537 | flush()
538 | last_progress[0], last_progress[1] = text, frac
539 |
540 | console_print()
541 | if sys.stdout.isatty():
542 | write(save)
543 | flush()
544 | console_print(u"%s %s\n" % (INFO, LINK))
545 | GPG_WARNING_MSG = (u"\n%s" % GPG_WARNING) if not gpgme else u""
546 |
547 | if not yes_no_question("%s%s" % (WARNING, GPG_WARNING_MSG)):
548 | return
549 |
550 | download = DownloadState()
551 |
552 | try:
553 | for progress, status in download.copy_data():
554 | if not status:
555 | break
556 | setprogress(DOWNLOADING, progress)
557 | except Exception:
558 | FatalVisibleError(ERROR_CONNECTING)
559 | else:
560 | setprogress(DOWNLOADING, 1.0)
561 | console_print()
562 | write(save)
563 |
564 | try:
565 | for name, i, total in download.unpack():
566 | setprogress(UNPACKING, float(i)/total)
567 | except SignatureVerifyError:
568 | FatalVisibleError(ERROR_SIGNATURE)
569 | except Exception:
570 | FatalVisibleError(ERROR_CONNECTING)
571 | else:
572 | setprogress(UNPACKING, 1.0)
573 |
574 | console_print()
575 |
576 | class CommandTicker(threading.Thread):
577 | def __init__(self):
578 | threading.Thread.__init__(self)
579 | self.stop_event = threading.Event()
580 |
581 | def stop(self):
582 | self.stop_event.set()
583 |
584 | def run(self):
585 | ticks = ['[. ]', '[.. ]', '[...]', '[ ..]', '[ .]', '[ ]']
586 | i = 0
587 | first = True
588 | while True:
589 | self.stop_event.wait(0.25)
590 | if self.stop_event.isSet(): break
591 | if i == len(ticks):
592 | first = False
593 | i = 0
594 | if not first:
595 | sys.stderr.write("\r%s\r" % ticks[i])
596 | sys.stderr.flush()
597 | i += 1
598 | sys.stderr.flush()
599 |
600 |
601 | class DropboxCommand(object):
602 | class CouldntConnectError(Exception): pass
603 | class BadConnectionError(Exception): pass
604 | class EOFError(Exception): pass
605 | class CommandError(Exception): pass
606 |
607 | def __init__(self, timeout=5):
608 | self.s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
609 | self.s.settimeout(timeout)
610 | try:
611 | self.s.connect(os.path.expanduser(u'~/.dropbox/command_socket'))
612 | except socket.error:
613 | raise DropboxCommand.CouldntConnectError()
614 | self.f = self.s.makefile("r+", 4096)
615 |
616 | def close(self):
617 | self.f.close()
618 | self.s.close()
619 |
620 | def __readline(self):
621 | try:
622 | toret = self.f.readline().decode('utf8').rstrip(u"\n")
623 | except socket.error:
624 | raise DropboxCommand.BadConnectionError()
625 | if toret == '':
626 | raise DropboxCommand.EOFError()
627 | else:
628 | return toret
629 |
630 | # atttribute doesn't exist, i know what you want
631 | def send_command(self, name, args):
632 | self.f.write(name.encode('utf8'))
633 | self.f.write(u"\n".encode('utf8'))
634 | self.f.writelines((u"\t".join([k] + (list(v)
635 | if hasattr(v, '__iter__') else
636 | [v])) + u"\n").encode('utf8')
637 | for k,v in args.iteritems())
638 | self.f.write(u"done\n".encode('utf8'))
639 |
640 | self.f.flush()
641 |
642 | # Start a ticker
643 | ticker_thread = CommandTicker()
644 | ticker_thread.start()
645 |
646 | # This is the potentially long-running call.
647 | try:
648 | ok = self.__readline() == u"ok"
649 | except KeyboardInterrupt:
650 | raise DropboxCommand.BadConnectionError("Keyboard interruption detected")
651 | finally:
652 | # Tell the ticker to stop.
653 | ticker_thread.stop()
654 | ticker_thread.join()
655 |
656 | if ok:
657 | toret = {}
658 | for i in range(21):
659 | if i == 20:
660 | raise Exception(u"close this connection!")
661 |
662 | line = self.__readline()
663 | if line == u"done":
664 | break
665 |
666 | argval = line.split(u"\t")
667 | toret[argval[0]] = argval[1:]
668 |
669 | return toret
670 | else:
671 | problems = []
672 | for i in range(21):
673 | if i == 20:
674 | raise Exception(u"close this connection!")
675 |
676 | line = self.__readline()
677 | if line == u"done":
678 | break
679 |
680 | problems.append(line)
681 |
682 | raise DropboxCommand.CommandError(u"\n".join(problems))
683 |
684 | # this is the hotness, auto marshalling
685 | def __getattr__(self, name):
686 | try:
687 | return super(DropboxCommand, self).__getattr__(name)
688 | except:
689 | def __spec_command(**kw):
690 | return self.send_command(unicode(name), kw)
691 | self.__setattr__(name, __spec_command)
692 | return __spec_command
693 |
694 | commands = {}
695 | aliases = {}
696 |
697 | def command(meth):
698 | global commands, aliases
699 | assert meth.__doc__, "All commands need properly formatted docstrings (even %r!!)" % meth
700 | if hasattr(meth, 'im_func'): # bound method, if we ever have one
701 | meth = meth.im_func
702 | commands[meth.func_name] = meth
703 | meth_aliases = [unicode(alias) for alias in aliases.iterkeys() if aliases[alias].func_name == meth.func_name]
704 | if meth_aliases:
705 | meth.__doc__ += u"\nAliases: %s" % ",".join(meth_aliases)
706 | return meth
707 |
708 | def alias(name):
709 | def decorator(meth):
710 | global commands, aliases
711 | assert name not in commands, "This alias is the name of a command."
712 | aliases[name] = meth
713 | return meth
714 | return decorator
715 |
716 | def requires_dropbox_running(meth):
717 | def newmeth(*n, **kw):
718 | if is_dropbox_running():
719 | return meth(*n, **kw)
720 | else:
721 | console_print(u"Dropbox isn't running!")
722 | newmeth.func_name = meth.func_name
723 | newmeth.__doc__ = meth.__doc__
724 | return newmeth
725 |
726 | def start_dropbox():
727 | db_path = os.path.expanduser(u"~/.dropbox-dist/dropboxd").encode(sys.getfilesystemencoding())
728 | if os.access(db_path, os.X_OK):
729 | f = open("/dev/null", "w")
730 | # we don't reap the child because we're gonna die anyway, let init do it
731 | subprocess.Popen([db_path], preexec_fn=os.setsid, cwd=os.path.expanduser("~"),
732 | stderr=sys.stderr, stdout=f, close_fds=True)
733 |
734 | # in seconds
735 | interval = 0.5
736 | wait_for = 60
737 | for i in xrange(int(wait_for / interval)):
738 | if is_dropbox_running():
739 | return True
740 | # back off from connect for a while
741 | time.sleep(interval)
742 |
743 | return False
744 | else:
745 | return False
746 |
747 | # Extracted and modified from os.cmd.Cmd
748 | def columnize(list, display_list=None, display_width=None):
749 | if not list:
750 | console_print(u"")
751 | return
752 |
753 | non_unicode = [i for i in range(len(list)) if not (isinstance(list[i], unicode))]
754 | if non_unicode:
755 | raise TypeError, ("list[i] not a string for i in %s" %
756 | ", ".join(map(unicode, non_unicode)))
757 |
758 | if not display_width:
759 | d = os.popen('stty size', 'r').read().split()
760 | if d:
761 | display_width = int(d[1])
762 | else:
763 | for item in list:
764 | console_print(item)
765 | return
766 |
767 | if not display_list:
768 | display_list = list
769 |
770 | size = len(list)
771 | if size == 1:
772 | console_print(display_list[0])
773 | return
774 |
775 | for nrows in range(1, len(list)):
776 | ncols = (size+nrows-1) // nrows
777 | colwidths = []
778 | totwidth = -2
779 | for col in range(ncols):
780 | colwidth = 0
781 | for row in range(nrows):
782 | i = row + nrows*col
783 | if i >= size:
784 | break
785 | x = list[i]
786 | colwidth = max(colwidth, len(x))
787 | colwidths.append(colwidth)
788 | totwidth += colwidth + 2
789 | if totwidth > display_width:
790 | break
791 | if totwidth <= display_width:
792 | break
793 | else:
794 | nrows = len(list)
795 | ncols = 1
796 | colwidths = [0]
797 | lines = []
798 | for row in range(nrows):
799 | texts = []
800 | display_texts = []
801 | for col in range(ncols):
802 | i = row + nrows*col
803 | if i >= size:
804 | x = ""
805 | y = ""
806 | else:
807 | x = list[i]
808 | y = display_list[i]
809 | texts.append(x)
810 | display_texts.append(y)
811 | while texts and not texts[-1]:
812 | del texts[-1]
813 | original_texts = texts[:]
814 | for col in range(len(texts)):
815 | texts[col] = texts[col].ljust(colwidths[col])
816 | texts[col] = texts[col].replace(original_texts[col], display_texts[col])
817 | line = u" ".join(texts)
818 | lines.append(line)
819 | for line in lines:
820 | console_print(line)
821 |
822 | @command
823 | @requires_dropbox_running
824 | @alias('stat')
825 | def filestatus(args):
826 | u"""get current sync status of one or more files
827 | dropbox filestatus [-l] [-a] [FILE]...
828 |
829 | Prints the current status of each FILE.
830 |
831 | options:
832 | -l --list prints out information in a format similar to ls. works best when your console supports color :)
833 | -a --all do not ignore entries starting with .
834 | """
835 | global enc
836 |
837 | oparser = optparse.OptionParser()
838 | oparser.add_option("-l", "--list", action="store_true", dest="list")
839 | oparser.add_option("-a", "--all", action="store_true", dest="all")
840 | (options, args) = oparser.parse_args(args)
841 |
842 | try:
843 | with closing(DropboxCommand()) as dc:
844 | if options.list:
845 | # Listing.
846 |
847 | # Separate directories from files.
848 | if len(args) == 0:
849 | dirs, nondirs = [u"."], []
850 | else:
851 | dirs, nondirs = [], []
852 |
853 | for a in args:
854 | try:
855 | (dirs if os.path.isdir(a) else nondirs).append(a.decode(enc))
856 | except UnicodeDecodeError:
857 | continue
858 |
859 | if len(dirs) == 0 and len(nondirs) == 0:
860 | #TODO: why?
861 | sys.exit(1)
862 |
863 | dirs.sort(key=methodcaller('lower'))
864 | nondirs.sort(key=methodcaller('lower'))
865 |
866 | # Gets a string representation for a path.
867 | def path_to_string(file_path):
868 | if not os.path.exists(file_path):
869 | path = u"%s (File doesn't exist!)" % os.path.basename(file_path)
870 | return (path, path)
871 | try:
872 | status = dc.icon_overlay_file_status(path=file_path).get(u'status', [None])[0]
873 | except DropboxCommand.CommandError, e:
874 | path = u"%s (%s)" % (os.path.basename(file_path), e)
875 | return (path, path)
876 |
877 | env_term = os.environ.get('TERM','')
878 | supports_color = (sys.stderr.isatty() and (
879 | env_term.startswith('vt') or
880 | env_term.startswith('linux') or
881 | 'xterm' in env_term or
882 | 'color' in env_term
883 | )
884 | )
885 |
886 | # TODO: Test when you don't support color.
887 | if not supports_color:
888 | path = os.path.basename(file_path)
889 | return (path, path)
890 |
891 | if status == u"up to date":
892 | init, cleanup = "\x1b[32;1m", "\x1b[0m"
893 | elif status == u"syncing":
894 | init, cleanup = "\x1b[36;1m", "\x1b[0m"
895 | elif status == u"unsyncable":
896 | init, cleanup = "\x1b[41;1m", "\x1b[0m"
897 | elif status == u"selsync":
898 | init, cleanup = "\x1b[37;1m", "\x1b[0m"
899 | else:
900 | init, cleanup = '', ''
901 |
902 | path = os.path.basename(file_path)
903 | return (path, u"%s%s%s" % (init, path, cleanup))
904 |
905 | # Prints a directory.
906 | def print_directory(name):
907 | clean_paths = []
908 | formatted_paths = []
909 | for subname in sorted(os.listdir(name), key=methodcaller('lower')):
910 | if type(subname) != unicode:
911 | continue
912 |
913 | if not options.all and subname[0] == u'.':
914 | continue
915 |
916 | try:
917 | clean, formatted = path_to_string(unicode_abspath(os.path.join(name, subname)))
918 | clean_paths.append(clean)
919 | formatted_paths.append(formatted)
920 | except (UnicodeEncodeError, UnicodeDecodeError):
921 | continue
922 |
923 | columnize(clean_paths, formatted_paths)
924 |
925 | try:
926 | if len(dirs) == 1 and len(nondirs) == 0:
927 | print_directory(dirs[0])
928 | else:
929 | nondir_formatted_paths = []
930 | nondir_clean_paths = []
931 | for name in nondirs:
932 | try:
933 | clean, formatted = path_to_string(unicode_abspath(name))
934 | nondir_clean_paths.append(clean)
935 | nondir_formatted_paths.append(formatted)
936 | except (UnicodeEncodeError, UnicodeDecodeError):
937 | continue
938 |
939 | if nondir_clean_paths:
940 | columnize(nondir_clean_paths, nondir_formatted_paths)
941 |
942 | if len(nondirs) == 0:
943 | console_print(dirs[0] + u":")
944 | print_directory(dirs[0])
945 | dirs = dirs[1:]
946 |
947 | for name in dirs:
948 | console_print()
949 | console_print(name + u":")
950 | print_directory(name)
951 |
952 | except DropboxCommand.EOFError:
953 | console_print(u"Dropbox daemon stopped.")
954 | except DropboxCommand.BadConnectionError:
955 | console_print(u"Dropbox isn't responding!")
956 | else:
957 | if len(args) == 0:
958 | args = [name for name in sorted(os.listdir(u"."), key=methodcaller('lower')) if type(name) == unicode]
959 | if len(args) == 0:
960 | # Bail early if there's nothing to list to avoid crashing on indent below
961 | console_print(u"")
962 | return
963 | indent = max(len(st)+1 for st in args)
964 | for file in args:
965 |
966 | try:
967 | if type(file) is not unicode:
968 | file = file.decode(enc)
969 | fp = unicode_abspath(file)
970 | except (UnicodeEncodeError, UnicodeDecodeError):
971 | continue
972 | if not os.path.exists(fp):
973 | console_print(u"%-*s %s" % \
974 | (indent, file+':', "File doesn't exist"))
975 | continue
976 |
977 | try:
978 | status = dc.icon_overlay_file_status(path=fp).get(u'status', [u'unknown'])[0]
979 | console_print(u"%-*s %s" % (indent, file+':', status))
980 | except DropboxCommand.CommandError, e:
981 | console_print(u"%-*s %s" % (indent, file+':', e))
982 | except DropboxCommand.CouldntConnectError, e:
983 | console_print(u"Dropbox isn't running!")
984 |
985 | @command
986 | @requires_dropbox_running
987 | def ls(args):
988 | u"""list directory contents with current sync status
989 | dropbox ls [FILE]...
990 |
991 | This is an alias for filestatus -l
992 | """
993 | return filestatus(["-l"] + args)
994 |
995 | @command
996 | @requires_dropbox_running
997 | def sharelink(args):
998 | u"""get a shared link for a file in your dropbox
999 | dropbox sharelink FILE
1000 |
1001 | Prints out a shared link for FILE.
1002 | """
1003 | if len(args) != 1:
1004 | console_print(sharelink.__doc__, linebreak=False)
1005 | return
1006 |
1007 | try:
1008 | with closing(DropboxCommand()) as dc:
1009 | try:
1010 | path = unicode_abspath(args[0].decode(sys.getfilesystemencoding()))
1011 | link = dc.get_shared_link(path=path).get('link', [u'No link'])[0]
1012 | console_print(link)
1013 | except DropboxCommand.CommandError, e:
1014 | console_print(u"Couldn't get shared link: " + str(e))
1015 | except DropboxCommand.BadConnectionError, e:
1016 | console_print(u"Dropbox isn't responding!")
1017 | except DropboxCommand.EOFError:
1018 | console_print(u"Dropbox daemon stopped.")
1019 | except DropboxCommand.CouldntConnectError, e:
1020 | console_print(u"Dropbox isn't running!")
1021 |
1022 | @command
1023 | @requires_dropbox_running
1024 | def proxy(args):
1025 | u"""set proxy settings for Dropbox
1026 | dropbox proxy MODE [TYPE] [HOST] [PORT] [USERNAME] [PASSWORD]
1027 |
1028 | Set proxy settings for Dropbox.
1029 |
1030 | MODE - one of "none", "auto", "manual"
1031 | TYPE - one of "http", "socks4", "socks5" (only valid with "manual" mode)
1032 | HOST - proxy hostname (only valid with "manual" mode)
1033 | PORT - proxy port (only valid with "manual" mode)
1034 | USERNAME - (optional) proxy username (only valid with "manual" mode)
1035 | PASSWORD - (optional) proxy password (only valid with "manual" mode)
1036 | """
1037 | mode = None
1038 | type_ = None
1039 | if len(args) >= 1:
1040 | mode = args[0].decode(sys.getfilesystemencoding()).lower()
1041 | if len(args) >= 2:
1042 | type_ = args[1].decode(sys.getfilesystemencoding()).lower()
1043 |
1044 | if (len(args) == 0 or
1045 | mode not in [u'none', u'auto', u'manual'] or
1046 | (mode == 'manual' and len(args) not in (4, 6)) or
1047 | (mode != 'manual' and len(args) != 1) or
1048 | (mode == 'manual' and type_ not in [u'http', u'socks4', u'socks5'])):
1049 | # Print help
1050 | console_print(proxy.__doc__, linebreak=False)
1051 | return
1052 |
1053 | ARGS = ['mode', 'type', 'host', 'port', 'username', 'password']
1054 |
1055 | # Load the args into a dictionary
1056 | kwargs = dict(zip(ARGS, [a.decode(sys.getfilesystemencoding()) for a in args]))
1057 |
1058 | # Re-set these two because they were coerced to lower case
1059 | kwargs['mode'] = mode
1060 | if type_:
1061 | kwargs['type'] = type_
1062 |
1063 | try:
1064 | with closing(DropboxCommand()) as dc:
1065 | try:
1066 | dc.set_proxy_settings(**kwargs)
1067 | console_print(u'set')
1068 | except DropboxCommand.CommandError, e:
1069 | console_print(u"Couldn't set proxy: " + str(e))
1070 | except DropboxCommand.BadConnectionError, e:
1071 | console_print(u"Dropbox isn't responding!")
1072 | except DropboxCommand.EOFError:
1073 | console_print(u"Dropbox daemon stopped.")
1074 | except DropboxCommand.CouldntConnectError, e:
1075 | console_print(u"Dropbox isn't running!")
1076 |
1077 | @command
1078 | @requires_dropbox_running
1079 | def throttle(args):
1080 | u"""set bandwidth limits for Dropbox
1081 | dropbox throttle DOWNLOAD UPLOAD
1082 |
1083 | Set bandwidth limits for file sync.
1084 |
1085 | DOWNLOAD - either "unlimited" or a manual limit in KB/s
1086 | UPLOAD - one of "unlimited", "auto", or a manual limit in KB/s
1087 | """
1088 | if len(args) != 2:
1089 | console_print(throttle.__doc__, linebreak=False)
1090 | return
1091 |
1092 | downlimit = args[0].decode(sys.getfilesystemencoding()).lower()
1093 | uplimit = args[1].decode(sys.getfilesystemencoding()).lower()
1094 |
1095 | download_limit = None
1096 | download_mode = None
1097 | if downlimit == u'unlimited':
1098 | download_mode = downlimit
1099 | else:
1100 | try:
1101 | download_limit = int(downlimit)
1102 | download_mode = u'manual'
1103 | except ValueError:
1104 | console_print(throttle.__doc__, linebreak=False)
1105 | return
1106 |
1107 | upload_limit = None
1108 | upload_mode = None
1109 | if uplimit in [u'unlimited', u'auto']:
1110 | upload_mode = uplimit
1111 | else:
1112 | try:
1113 | upload_limit = int(uplimit)
1114 | upload_mode = u'manual'
1115 | except ValueError:
1116 | console_print(throttle.__doc__, linebreak=False)
1117 | return
1118 |
1119 | kwargs = {
1120 | u'download_mode': download_mode,
1121 | u'upload_mode': upload_mode,
1122 | }
1123 | if download_limit:
1124 | kwargs[u'download_limit'] = unicode(download_limit)
1125 | if upload_limit:
1126 | kwargs[u'upload_limit'] = unicode(upload_limit)
1127 |
1128 | try:
1129 | with closing(DropboxCommand()) as dc:
1130 | try:
1131 | dc.set_bandwidth_limits(**kwargs)
1132 | console_print(u'set')
1133 | except DropboxCommand.CommandError, e:
1134 | console_print(u"Couldn't set bandwidth limits: " + str(e))
1135 | except DropboxCommand.BadConnectionError, e:
1136 | console_print(u"Dropbox isn't responding!")
1137 | except DropboxCommand.EOFError:
1138 | console_print(u"Dropbox daemon stopped.")
1139 | except DropboxCommand.CouldntConnectError, e:
1140 | console_print(u"Dropbox isn't running!")
1141 |
1142 | @command
1143 | @requires_dropbox_running
1144 | def status(args):
1145 | u"""get current status of the dropboxd
1146 | dropbox status
1147 |
1148 | Prints out the current status of the Dropbox daemon.
1149 | """
1150 | if len(args) != 0:
1151 | console_print(status.__doc__,linebreak=False)
1152 | return
1153 |
1154 | try:
1155 | with closing(DropboxCommand()) as dc:
1156 | try:
1157 | lines = dc.get_dropbox_status()[u'status']
1158 | if len(lines) == 0:
1159 | console_print(u'Idle')
1160 | else:
1161 | for line in lines:
1162 | console_print(line)
1163 | except KeyError:
1164 | console_print(u"Couldn't get status: daemon isn't responding")
1165 | except DropboxCommand.CommandError, e:
1166 | console_print(u"Couldn't get status: " + str(e))
1167 | except DropboxCommand.BadConnectionError, e:
1168 | console_print(u"Dropbox isn't responding!")
1169 | except DropboxCommand.EOFError:
1170 | console_print(u"Dropbox daemon stopped.")
1171 | except DropboxCommand.CouldntConnectError, e:
1172 | console_print(u"Dropbox isn't running!")
1173 |
1174 | @command
1175 | def running(argv):
1176 | u"""return whether dropbox is running
1177 | dropbox running
1178 |
1179 | Returns 1 if running 0 if not running.
1180 | """
1181 | return int(is_dropbox_running())
1182 |
1183 | @command
1184 | @requires_dropbox_running
1185 | def stop(args):
1186 | u"""stop dropboxd
1187 | dropbox stop
1188 |
1189 | Stops the dropbox daemon.
1190 | """
1191 | try:
1192 | with closing(DropboxCommand()) as dc:
1193 | try:
1194 | dc.tray_action_hard_exit()
1195 | except DropboxCommand.BadConnectionError:
1196 | console_print(u"Dropbox isn't responding!")
1197 | except DropboxCommand.EOFError:
1198 | console_print(u"Dropbox daemon stopped.")
1199 | except DropboxCommand.CouldntConnectError:
1200 | console_print(u"Dropbox isn't running!")
1201 |
1202 | #returns true if link is necessary
1203 | def grab_link_url_if_necessary():
1204 | try:
1205 | with closing(DropboxCommand()) as dc:
1206 | try:
1207 | link_url = dc.needs_link().get(u"link_url", None)
1208 | if link_url is not None:
1209 | console_print(u"To link this computer to a dropbox account, visit the following url:\n%s" % link_url[0])
1210 | return True
1211 | else:
1212 | return False
1213 | except DropboxCommand.CommandError:
1214 | pass
1215 | except DropboxCommand.BadConnectionError:
1216 | console_print(u"Dropbox isn't responding!")
1217 | except DropboxCommand.EOFError:
1218 | console_print(u"Dropbox daemon stopped.")
1219 | except DropboxCommand.CouldntConnectError:
1220 | console_print(u"Dropbox isn't running!")
1221 |
1222 | @command
1223 | @requires_dropbox_running
1224 | def lansync(argv):
1225 | u"""enables or disables LAN sync
1226 | dropbox lansync [y/n]
1227 |
1228 | options:
1229 | y dropbox will use LAN sync (default)
1230 | n dropbox will not use LAN sync
1231 | """
1232 | if len(argv) != 1:
1233 | console_print(lansync.__doc__, linebreak=False)
1234 | return
1235 |
1236 | s = argv[0].lower()
1237 | if s.startswith('y') or s.startswith('-y'):
1238 | should_lansync = True
1239 | elif s.startswith('n') or s.startswith('-n'):
1240 | should_lansync = False
1241 | else:
1242 | should_lansync = None
1243 |
1244 | if should_lansync is None:
1245 | console_print(lansync.__doc__,linebreak=False)
1246 | else:
1247 | with closing(DropboxCommand()) as dc:
1248 | dc.set_lan_sync(lansync='enabled' if should_lansync else 'disabled')
1249 |
1250 |
1251 | @command
1252 | @requires_dropbox_running
1253 | def exclude(args):
1254 | u"""ignores/excludes a directory from syncing
1255 | dropbox exclude [list]
1256 | dropbox exclude add [DIRECTORY] [DIRECTORY] ...
1257 | dropbox exclude remove [DIRECTORY] [DIRECTORY] ...
1258 |
1259 | "list" prints a list of directories currently excluded from syncing.
1260 | "add" adds one or more directories to the exclusion list, then resynchronizes Dropbox.
1261 | "remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox.
1262 | With no arguments, executes "list".
1263 | Any specified path must be within Dropbox.
1264 | """
1265 | if len(args) == 0:
1266 | try:
1267 | with closing(DropboxCommand()) as dc:
1268 | try:
1269 | lines = [relpath(path) for path in dc.get_ignore_set()[u'ignore_set']]
1270 | lines.sort()
1271 | if len(lines) == 0:
1272 | console_print(u'No directories are being ignored.')
1273 | else:
1274 | console_print(u'Excluded: ')
1275 | for line in lines:
1276 | console_print(unicode(line))
1277 | except KeyError:
1278 | console_print(u"Couldn't get ignore set: daemon isn't responding")
1279 | except DropboxCommand.CommandError, e:
1280 | if e.args[0].startswith(u"No command exists by that name"):
1281 | console_print(u"This version of the client does not support this command.")
1282 | else:
1283 | console_print(u"Couldn't get ignore set: " + str(e))
1284 | except DropboxCommand.BadConnectionError, e:
1285 | console_print(u"Dropbox isn't responding!")
1286 | except DropboxCommand.EOFError:
1287 | console_print(u"Dropbox daemon stopped.")
1288 | except DropboxCommand.CouldntConnectError, e:
1289 | console_print(u"Dropbox isn't running!")
1290 | elif len(args) == 1 and args[0] == u"list":
1291 | exclude([])
1292 | elif len(args) >= 2:
1293 | sub_command = args[0]
1294 | paths = args[1:]
1295 | absolute_paths = [unicode_abspath(path.decode(sys.getfilesystemencoding())) for path in paths]
1296 | if sub_command == u"add":
1297 | try:
1298 | with closing(DropboxCommand(timeout=None)) as dc:
1299 | try:
1300 | result = dc.ignore_set_add(paths=absolute_paths)
1301 | if result[u"ignored"]:
1302 | console_print(u"Excluded: ")
1303 | lines = [relpath(path) for path in result[u"ignored"]]
1304 | for line in lines:
1305 | console_print(unicode(line))
1306 | except KeyError:
1307 | console_print(u"Couldn't add ignore path: daemon isn't responding")
1308 | except DropboxCommand.CommandError, e:
1309 | if e.args[0].startswith(u"No command exists by that name"):
1310 | console_print(u"This version of the client does not support this command.")
1311 | else:
1312 | console_print(u"Couldn't get ignore set: " + str(e))
1313 | except DropboxCommand.BadConnectionError, e:
1314 | console_print(u"Dropbox isn't responding! [%s]" % e)
1315 | except DropboxCommand.EOFError:
1316 | console_print(u"Dropbox daemon stopped.")
1317 | except DropboxCommand.CouldntConnectError, e:
1318 | console_print(u"Dropbox isn't running!")
1319 | elif sub_command == u"remove":
1320 | try:
1321 | with closing(DropboxCommand(timeout=None)) as dc:
1322 | try:
1323 | result = dc.ignore_set_remove(paths=absolute_paths)
1324 | if result[u"removed"]:
1325 | console_print(u"No longer excluded: ")
1326 | lines = [relpath(path) for path in result[u"removed"]]
1327 | for line in lines:
1328 | console_print(unicode(line))
1329 | except KeyError:
1330 | console_print(u"Couldn't remove ignore path: daemon isn't responding")
1331 | except DropboxCommand.CommandError, e:
1332 | if e.args[0].startswith(u"No command exists by that name"):
1333 | console_print(u"This version of the client does not support this command.")
1334 | else:
1335 | console_print(u"Couldn't get ignore set: " + str(e))
1336 | except DropboxCommand.BadConnectionError, e:
1337 | console_print(u"Dropbox isn't responding! [%s]" % e)
1338 | except DropboxCommand.EOFError:
1339 | console_print(u"Dropbox daemon stopped.")
1340 | except DropboxCommand.CouldntConnectError, e:
1341 | console_print(u"Dropbox isn't running!")
1342 | else:
1343 | console_print(exclude.__doc__, linebreak=False)
1344 | return
1345 | else:
1346 | console_print(exclude.__doc__, linebreak=False)
1347 | return
1348 |
1349 | @command
1350 | def start(argv):
1351 | u"""start dropboxd
1352 | dropbox start [-i]
1353 |
1354 | Starts the dropbox daemon, dropboxd. If dropboxd is already running, this will do nothing.
1355 |
1356 | options:
1357 | -i --install auto install dropboxd if not available on the system
1358 | """
1359 |
1360 | should_install = "-i" in argv or "--install" in argv
1361 |
1362 | # first check if dropbox is already running
1363 | if is_dropbox_running():
1364 | if not grab_link_url_if_necessary():
1365 | console_print(u"Dropbox is already running!")
1366 | return
1367 |
1368 | console_print(u"Starting Dropbox...", linebreak=False)
1369 | console_flush()
1370 | if not start_dropbox():
1371 | if not should_install:
1372 | console_print()
1373 | console_print(u"The Dropbox daemon is not installed!")
1374 | console_print(u"Run \"dropbox start -i\" to install the daemon")
1375 | return
1376 |
1377 | # install dropbox!!!
1378 | try:
1379 | download()
1380 | except:
1381 | traceback.print_exc()
1382 | else:
1383 | if GUI_AVAILABLE:
1384 | start_dropbox()
1385 | console_print(u"Done!")
1386 | else:
1387 | if start_dropbox():
1388 | if not grab_link_url_if_necessary():
1389 | console_print(u"Done!")
1390 | else:
1391 | if not grab_link_url_if_necessary():
1392 | console_print(u"Done!")
1393 |
1394 |
1395 | def can_reroll_autostart():
1396 | return u".config" in os.listdir(os.path.expanduser(u'~'))
1397 |
1398 | def reroll_autostart(should_autostart):
1399 | home_dir = os.path.expanduser(u'~')
1400 | contents = os.listdir(home_dir)
1401 |
1402 | # UBUNTU
1403 | if u".config" in contents:
1404 | autostart_dir = os.path.join(home_dir, u".config", u"autostart")
1405 | autostart_link = os.path.join(autostart_dir, u"dropbox.desktop")
1406 | if should_autostart:
1407 | if os.path.exists(DESKTOP_FILE):
1408 | if not os.path.exists(autostart_dir):
1409 | os.makedirs(autostart_dir)
1410 | shutil.copyfile(DESKTOP_FILE, autostart_link)
1411 | elif os.path.exists(autostart_link):
1412 | os.remove(autostart_link)
1413 |
1414 |
1415 |
1416 | @command
1417 | def autostart(argv):
1418 | u"""automatically start dropbox at login
1419 | dropbox autostart [y/n]
1420 |
1421 | options:
1422 | n dropbox will not start automatically at login
1423 | y dropbox will start automatically at login (default)
1424 |
1425 | Note: May only work on current Ubuntu distributions.
1426 | """
1427 | if len(argv) != 1:
1428 | console_print(''.join(autostart.__doc__.split('\n', 1)[1:]).decode('ascii'))
1429 | return
1430 |
1431 | s = argv[0].lower()
1432 | if s.startswith('y') or s.startswith('-y'):
1433 | should_autostart = True
1434 | elif s.startswith('n') or s.startswith('-n'):
1435 | should_autostart = False
1436 | else:
1437 | should_autostart = None
1438 |
1439 | if should_autostart is None:
1440 | console_print(autostart.__doc__,linebreak=False)
1441 | else:
1442 | reroll_autostart(should_autostart)
1443 |
1444 | @command
1445 | def help(argv):
1446 | u"""provide help
1447 | dropbox help [COMMAND]
1448 |
1449 | With no arguments, print a list of commands and a short description of each. With a command, print descriptive help on how to use the command.
1450 | """
1451 | if not argv:
1452 | return usage(argv)
1453 | for command in commands:
1454 | if command == argv[0]:
1455 | console_print(commands[command].__doc__.split('\n', 1)[1].decode('ascii'))
1456 | return
1457 | for alias in aliases:
1458 | if alias == argv[0]:
1459 | console_print(aliases[alias].__doc__.split('\n', 1)[1].decode('ascii'))
1460 | return
1461 | console_print(u"unknown command '%s'" % argv[0], f=sys.stderr)
1462 |
1463 | def usage(argv):
1464 | console_print(u"Dropbox command-line interface\n")
1465 | console_print(u"commands:\n")
1466 | console_print(u"Note: use dropbox help to view usage for a specific command.\n")
1467 | out = []
1468 | for command in commands:
1469 | out.append((command, commands[command].__doc__.splitlines()[0]))
1470 | spacing = max(len(o[0])+3 for o in out)
1471 | for o in out:
1472 | console_print(" %-*s%s" % (spacing, o[0], o[1]))
1473 | console_print()
1474 |
1475 | def main(argv):
1476 | global commands
1477 |
1478 | # now we need to find out if one of the commands are in the
1479 | # argv list, and if so split the list at the point to
1480 | # separate the argv list at that point
1481 | cut = None
1482 | for i in range(len(argv)):
1483 | if argv[i] in commands or argv[i] in aliases:
1484 | cut = i
1485 | break
1486 |
1487 | if cut == None:
1488 | usage(argv)
1489 | os._exit(0)
1490 | return
1491 |
1492 | # lol no options for now
1493 | globaloptionparser = optparse.OptionParser()
1494 | globaloptionparser.parse_args(argv[0:i])
1495 |
1496 | # now dispatch and run
1497 | result = None
1498 | if argv[i] in commands:
1499 | result = commands[argv[i]](argv[i+1:])
1500 | elif argv[i] in aliases:
1501 | result = aliases[argv[i]](argv[i+1:])
1502 |
1503 | # flush, in case output is rerouted to a file.
1504 | console_flush()
1505 |
1506 | # done
1507 | return result
1508 |
1509 | if __name__ == "__main__":
1510 | ret = main(sys.argv)
1511 | if ret is not None:
1512 | sys.exit(ret)
1513 |
--------------------------------------------------------------------------------
/selenium/chrome.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 | # https://jiayi.space/post/zai-ubuntufu-wu-qi-shang-shi-yong-chrome-headless
3 | from selenium import webdriver
4 |
5 | chrome_options = webdriver.ChromeOptions()
6 | chrome_options.add_argument('--headless')
7 | chrome_options.add_argument('--disable-gpu')
8 | chrome_options.add_argument('--no-sandbox')
9 | chrome_options.add_argument('--disable-extensions')
10 | #chrome_options.add_argument('--proxy-server=socks5://127.0.0.1:9050')
11 | chrome_options.add_argument("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3383.0 Safari/537.36")
12 |
13 | client = webdriver.Chrome(chrome_options=chrome_options, executable_path='/root/chromedriver')
14 | client.get("http://checkip.dns.he.net/")
15 | #client.get("https://httpbin.org/get?show_env=1")
16 | #client.get("https://www.multcloud.com/share/0c7716c2-1f7b-42b3-9e53-e5caecfb502a")
17 |
18 | content = client.page_source.encode('utf-8')
19 | print content
20 | #client.get_screenshot_as_file('01.png')
21 | client.quit()
22 |
--------------------------------------------------------------------------------
/selenium/tor.py:
--------------------------------------------------------------------------------
1 | import os
2 | import socket
3 | import socks
4 | import requests
5 |
6 | socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050)
7 | socket.socket = socks.socksocket
8 | print(requests.get('http://api.ipify.org?format=json').text)
9 |
10 | #https://zhuanlan.zhihu.com/p/24261906
11 | os.system("""(echo authenticate '"mypassword"'; echo signal newnym; echo quit) | nc localhost 9051""")
12 |
13 | socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9050)
14 | socket.socket = socks.socksocket
15 | print(requests.get('http://api.ipify.org?format=json').text)
16 |
--------------------------------------------------------------------------------
/url_redirector/index.js:
--------------------------------------------------------------------------------
1 | /*
2 | * @Author: yumu
3 | * @Date: 2020-03-26
4 | * @Email: yumusb@foxmail.com
5 | * @Last Modified by: yumu
6 | * @Last Modified time: 2020-03-26
7 | */
8 |
9 | addEventListener('fetch', event => {
10 | event.respondWith(fetchAndApply(event.request));
11 | })
12 | async function fetchAndApply(request) {
13 | let requestURL = new URL(request.url)
14 | let path = requestURL.pathname.slice(1)//获取访问的URL地址,取得的是第一个/之后的内容,如果访问 33.al/a 获取到a (默认忽略掉参数,也就是?之后的内容)
15 | var url = "https://raw.githubusercontent.com/yumin9822/uy9822/master/url_redirector/redirect.json" // 远程数据,存放JSON文件
16 | init = {
17 | method: "GET"
18 | };
19 | const response = await fetch(url, init);//请求上面给定的远程JSON
20 | var json = JSON.parse(await response.text());//解析JSON
21 | if (json.hasOwnProperty(path)) {
22 | url = json[path] //如果访问的URL有数据,就取这个URL的值
23 | } else {
24 | url = 'https://www.baidu.com' //如果没有给定的URL,就给出一个默认的。
25 | }
26 | return Response.redirect(url, 301) //直接跳转,不返回页面。
27 | }
28 |
--------------------------------------------------------------------------------
/url_redirector/redirect.json:
--------------------------------------------------------------------------------
1 | {
2 | "kms": "http://kms.03k.org",
3 | "123": "https://vip.123pan.cn/1743020/public/",
4 | "oracle": "https://cnrpbteujz9p.compat.objectstorage.ap-seoul-1.oraclecloud.com/pub/",
5 | "9822": "http://vps.ehsrr.com/dropbox/vps/script/",
6 | "ubuntu20": "http://vps.ehsrr.com/dropbox/vps/script/ubuntu20.sh"
7 | }
8 |
--------------------------------------------------------------------------------
/ygkkk/endip.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | case "$(uname -m)" in
4 | x86_64 | x64 | amd64 )
5 | cpu=amd64
6 | ;;
7 | i386 | i686 )
8 | cpu=386
9 | ;;
10 | armv8 | armv8l | arm64 | aarch64 )
11 | cpu=arm64
12 | ;;
13 | armv7l )
14 | cpu=arm
15 | ;;
16 | * )
17 | echo "当前架构为$(uname -m),暂不支持"
18 | exit
19 | ;;
20 | esac
21 |
22 | cfwarpreg(){
23 | curl -sSL https://gitlab.com/rwkgyg/CFwarp/-/raw/main//point/acwarp.sh -o acwarp.sh && chmod +x acwarp.sh && ./acwarp.sh
24 | }
25 |
26 | warpendipv4v6(){
27 | echo "1.IPV4优选对端IP"
28 | echo "2.IPV6优选对端IP"
29 | echo "0.退出"
30 | read -p "请选择: " menu
31 | if [ "$menu" == "1" ];then
32 | cfwarpIP && endipv4 && endipresult
33 | elif [ "$menu" == "2" ];then
34 | cfwarpIP && endipv6 && endipresult
35 | else
36 | exit
37 | fi
38 | }
39 |
40 | cfwarpIP(){
41 | echo "下载warp优选程序"
42 | if [[ -n $cpu ]]; then
43 | curl -L -o warpendpoint -# --retry 2 https://proxy.freecdn.ml?url=https://gitlab.com/rwkgyg/CFwarp/raw/main/point/$cpu
44 | fi
45 | }
46 |
47 | endipv4(){
48 | n=0
49 | iplist=100
50 | while true
51 | do
52 | temp[$n]=$(echo 162.159.192.$(($RANDOM%256)))
53 | n=$[$n+1]
54 | if [ $n -ge $iplist ]
55 | then
56 | break
57 | fi
58 | temp[$n]=$(echo 162.159.193.$(($RANDOM%256)))
59 | n=$[$n+1]
60 | if [ $n -ge $iplist ]
61 | then
62 | break
63 | fi
64 | temp[$n]=$(echo 162.159.195.$(($RANDOM%256)))
65 | n=$[$n+1]
66 | if [ $n -ge $iplist ]
67 | then
68 | break
69 | fi
70 | temp[$n]=$(echo 188.114.96.$(($RANDOM%256)))
71 | n=$[$n+1]
72 | if [ $n -ge $iplist ]
73 | then
74 | break
75 | fi
76 | temp[$n]=$(echo 188.114.97.$(($RANDOM%256)))
77 | n=$[$n+1]
78 | if [ $n -ge $iplist ]
79 | then
80 | break
81 | fi
82 | temp[$n]=$(echo 188.114.98.$(($RANDOM%256)))
83 | n=$[$n+1]
84 | if [ $n -ge $iplist ]
85 | then
86 | break
87 | fi
88 | temp[$n]=$(echo 188.114.99.$(($RANDOM%256)))
89 | n=$[$n+1]
90 | if [ $n -ge $iplist ]
91 | then
92 | break
93 | fi
94 | done
95 | while true
96 | do
97 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
98 | then
99 | break
100 | else
101 | temp[$n]=$(echo 162.159.192.$(($RANDOM%256)))
102 | n=$[$n+1]
103 | fi
104 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
105 | then
106 | break
107 | else
108 | temp[$n]=$(echo 162.159.193.$(($RANDOM%256)))
109 | n=$[$n+1]
110 | fi
111 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
112 | then
113 | break
114 | else
115 | temp[$n]=$(echo 162.159.195.$(($RANDOM%256)))
116 | n=$[$n+1]
117 | fi
118 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
119 | then
120 | break
121 | else
122 | temp[$n]=$(echo 188.114.96.$(($RANDOM%256)))
123 | n=$[$n+1]
124 | fi
125 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
126 | then
127 | break
128 | else
129 | temp[$n]=$(echo 188.114.97.$(($RANDOM%256)))
130 | n=$[$n+1]
131 | fi
132 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
133 | then
134 | break
135 | else
136 | temp[$n]=$(echo 188.114.98.$(($RANDOM%256)))
137 | n=$[$n+1]
138 | fi
139 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
140 | then
141 | break
142 | else
143 | temp[$n]=$(echo 188.114.99.$(($RANDOM%256)))
144 | n=$[$n+1]
145 | fi
146 | done
147 | }
148 |
149 | endipv6(){
150 | n=0
151 | iplist=100
152 | while true
153 | do
154 | temp[$n]=$(echo [2606:4700:d0::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))])
155 | n=$[$n+1]
156 | if [ $n -ge $iplist ]
157 | then
158 | break
159 | fi
160 | temp[$n]=$(echo [2606:4700:d1::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))])
161 | n=$[$n+1]
162 | if [ $n -ge $iplist ]
163 | then
164 | break
165 | fi
166 | done
167 | while true
168 | do
169 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
170 | then
171 | break
172 | else
173 | temp[$n]=$(echo [2606:4700:d0::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))])
174 | n=$[$n+1]
175 | fi
176 | if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ]
177 | then
178 | break
179 | else
180 | temp[$n]=$(echo [2606:4700:d1::$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))])
181 | n=$[$n+1]
182 | fi
183 | done
184 | }
185 |
186 | endipresult(){
187 | echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u > ip.txt
188 | ulimit -n 102400
189 | chmod +x warpendpoint
190 | ./warpendpoint
191 | clear
192 | cat result.csv | awk -F, '$3!="timeout ms" {print} ' | sort -t, -nk2 -nk3 | uniq | head -11 | awk -F, '{print "端点 "$1" 丢包率 "$2" 平均延迟 "$3}'
193 | rm -rf ip.txt warpendpoint
194 | exit
195 | }
196 |
197 | echo "------------------------------------------------------"
198 | echo "甬哥Github项目 :github.com/yonggekkk"
199 | echo "甬哥blogger博客 :ygkkk.blogspot.com"
200 | echo "甬哥YouTube频道 :www.youtube.com/@ygkkk"
201 | echo "脚本支持WARP优选IP、WARP配置文件生成,感谢CF网友开发"
202 | echo "------------------------------------------------------"
203 | echo
204 | echo "1.WARP-V4V6优选对端IP"
205 | echo "2.注册生成WARP-Wireguard配置文件、二维码"
206 | echo "0.退出"
207 | read -p "请选择: " menu
208 | if [ "$menu" == "1" ];then
209 | warpendipv4v6
210 | elif [ "$menu" == "2" ];then
211 | cfwarpreg
212 | else
213 | exit
214 | fi
215 |
--------------------------------------------------------------------------------