PKšS-5Έ?bΘΘzc/__init__.py# this is a namespace package try: import pkg_resources pkg_resources.declare_namespace(__name__) except ImportError: import pkgutil __path__ = pkgutil.extend_path(__path__, __name__) PKωvo6έεpSggzc/__init__.pyc;ς ₯Ec@sOydkZeieƒWn.ej o"dkZeieeƒZnXdS(N(s pkg_resourcessdeclare_namespaces__name__s ImportErrorspkgutils extend_paths__path__(s__path__s pkg_resourcesspkgutil((s)build/bdist.linux-i686/egg/zc/__init__.pys?s   PKjvo6Ξ—‰o₯₯zc/buildoutsftp/urllib2sftp.py############################################################################## # # Copyright (c) 2005 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """SFTP Handler for urllib2 $Id: urllib2sftp.py 73201 2007-03-15 18:51:12Z jim $ """ import cStringIO, getpass, mimetypes, os, re, stat, sys, urllib, urllib2 import paramiko parse_url_host = re.compile( '(?:' '([^@:]+)(?::([^@]*))?@' ')?' '([^:]*)(?::(\d+))?$').match if sys.platform == 'win32': import _winreg parse_reg_key_name = re.compile('(rsa|dss)2?@22:(\S+)$').match def _get_hosts_keys(): regkey = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'Software\SimonTatham\PuTTY\SshHostKeys', ) keys = paramiko.HostKeys() i = 0 while 1: try: name, value, type_ = _winreg.EnumValue(regkey, i) i += 1 value = [long(v, 16) for v in value.split(',')] ktype, host = parse_reg_key_name(name).groups() if ktype == 'rsa': key = paramiko.RSAKey(vals=value) if ktype == 'dss': key = paramiko.DSSKey(vals=value) keys.add(host, 'ssh-'+ktype, key) except WindowsError: break return keys else: def _get_hosts_keys(): return paramiko.HostKeys(os.path.expanduser('~/.ssh/known_hosts')) class Result: def __init__(self, fp, url, info): self._fp = fp self.url = url self.headers = info def geturl(self): return self.url def info(self): return self.headers def __getattr__(self, name): return getattr(self._fp, name) class SFTPHandler(urllib2.BaseHandler): def sftp_open(self, req): host = req.get_host() if not host: raise IOError, ('sftp error', 'no host given') parsed = parse_url_host(host) if not parsed: raise IOError, ('sftp error', 'invalid host', host) user, pw, host, port = parsed.groups() if user: user = urllib.unquote(user) else: user = getpass.getuser() if port: port = int(port) else: port = 22 if pw: pw = urllib.unquote(pw) host = urllib.unquote(host or '') hostkey = _get_hosts_keys() hostkey = hostkey.get(host) if hostkey is None: raise paramiko.AuthenticationException( "No stored host key", host) [hostkeytype] = list(hostkey) hostkey = hostkey[hostkeytype] if pw is not None: trans = paramiko.Transport((host, port)) trans.connect(username=user, password=pw) else: for key in paramiko.Agent().get_keys(): trans = paramiko.Transport((host, port)) try: trans.connect(username=user, pkey=key, hostkey=hostkey) break except paramiko.AuthenticationException: trans.close() else: raise paramiko.AuthenticationException( "Authentication failed.") sftp = paramiko.SFTPClient.from_transport(trans) path = req.get_selector() url = req.get_full_url() mode = sftp.stat(path).st_mode if stat.S_ISDIR(mode): return Result( cStringIO.StringIO('\n'.join([ ('%s
' % (url, x, x) ) for x in sftp.listdir(path) ])), url, {'content-type': 'text/html'}) else: mtype = mimetypes.guess_type(url)[0] if mtype is None: mtype = 'application/octet-stream' return Result(sftp.open(path), url, {'content-type': mtype}) PKšS-5€Œ₯zc/buildoutsftp/__init__.py# PKΓƒ-5 $₯ggzc/buildoutsftp/tests.py############################################################################## # # Copyright (c) 2006 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## import os, stat, StringIO, sys, urllib2, getpass import paramiko from zope.testing import doctest class Replace: def __init__(self, module, **attrs): self.module = module self.original = original = {} for name, value in attrs.iteritems(): original[name] = getattr(module, name) setattr(module, name, value) def restore(self): for name, value in self.attrs.iteritems(): setattt(self.module, name, value) class User: def __init__(self, name, key=None, pw=None, nameonly=False): self.name = name self.key = paramiko.PKey(key) self.pw = pw self.nameonly = nameonly def auth(self, key, pw): return ( (key is not None and key == self.key) or (pw is not None and pw == self.pw) or self.nameonly ) hkeys = [ ('foo.com', ), ('foo.org', 'foo.orgkey'), ('foo.net', 'foo.netkey'), ('foo.biz', 'foo.bizkey'), ] hostdata = { 'foo.com': ( dict( docs = dict( greet = 'Hello\nWorld!\n' ) ), 'foo.comkey', [User('testuser', 'UserKey1')], ), } class FauxTransport: def __init__(self, addr): self.host, self.port = addr if self.host in hostdata: self.fs, self.hkey, users = hostdata[self.host] self.users = dict([(u.name, u) for u in users]) else: self.fs, self.hkey, self.users = {}, None, {} def connect(self, hostkey=None, username='', password=None, pkey=None): user = self.users.get(username) if user is None or not user.auth(pkey, password): raise paramiko.AuthenticationException('Authentication failed.') if hostkey != self.hkey: raise paramiko.SSHException("Bad host key from server") class FauxAgent: def get_keys(self): return [paramiko.PKey('UserKey1'), paramiko.PKey('UserKey2')] class FauxStat: def __init__(self, mode): self.st class FauxSFTPClient: def __init__(self, transport): self.transport = transport def _traverse(self, path): path = path.split('/')[1:] f = self.transport.fs for p in path: if isinstance(f, str) or p not in f: raise IOError('[Errno 2] No such file') f = f[p] return f def sftp_stat(self, path): f = self._traverse(path) if isinstance(d, dict): return FauxStat(stat.S_IFDIR) else: return FauxStat(0) def open(self, path): return StringIO.StringIO(self._traverse(path)) def setup(test): # We're going to replace much of paramiko, and, if necessary, _winreg # to try to control urllib2sftp's environment. teardown = [] test.globs['__teardown'] = teardown oldhome = os.environ.get('HOME') if oldhome is None: teardown.append(lambda:os.environ.__delitem__('HOME')) else: teardown.append(lambda:os.environ.__setitem__('HOME', oldhome)) os.environ['HOME'] = '/testhome' # :( urllib2 needs to grow an api to get the opener so it can be # restored by tests old_opener = urllib2._opener teardown.append(lambda: urllib2.install_opener(old_opener)) if sys.platform == 'win32': import _winreg key = object() def OpenKey(*args): if args != (_winreg.HKEY_CURENT_USER, r'Software\SimonTatham\PuTTY\SshHoskKeys'): raise ValueError("Bad keys", *args) return key def EnumValue(k, index): if k is not key: raise ValueError('Bad key') try: host, hkey = hkeys[index] except IndexError: raise WindowsError(index) return 'rsa@22:'+host, hkey, 0 HostKeys = paramiko.HostKeys teardown.append(Replace(_winreg, OpenKey=OpenKey, EnumValue=EnumValue, ).restore ) else: def HostKeys(path=None): if path != '/testhome/.ssh/known_hosts': raise IOError('No such file', path) return dict([ (host, {'ssh-rsa': paramiko.PKey(hkey)}) for (host, hkey) in hkeys ]) teardown.append(Replace(getpass, getuser=lambda: 'testuser').restore) teardown.append(Replace( paramiko, Transport = FauxTransport, Agent = FauxAgent, SFTPClient = FauxSFTPClient, HostKeys = HostKeys, )) def teardown(test): for f in test.globs['__teardown']: f() def test(): """ Install the urllib2 hook >>> import zc.buildoutsftp.buildoutsftp >>> zc.buildoutsftp.buildoutsftp.install(None) Now, we'll try to get a directory listing from foo.com: >>> f = urllib2.urlopen('sftp://foo.com') >>> f.url 'sftp://foo.com' >>> f.info['Content-Type'] 'text/html' >>> print f.read() """ def test_suite(): return doctest.DocTestSuite(setUp=setup, tearDown=teardown) PK-\-5/kΝΑ99zc/buildoutsftp/buildoutsftp.py############################################################################## # # Copyright (c) 2006 Zope Corporation and Contributors. # All Rights Reserved. # # This software is subject to the provisions of the Zope Public License, # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## import urllib2 import zc.buildoutsftp.urllib2sftp def install(buildout=None): urllib2.install_opener( urllib2.build_opener(zc.buildoutsftp.urllib2sftp.SFTPHandler) ) PKωvo61ΰιΏΏzc/buildoutsftp/urllib2sftp.pyc;ς ¨•ωEc@sγdZdkZdkZdkZdkZdkZdkZdkZdkZdk Z dk Z ei dƒi Z eidjo(dkZei dƒi Zd„Zn d„Zdfd„ƒYZd e ifd „ƒYZdS( sOSFTP Handler for urllib2 $Id: urllib2sftp.py 73201 2007-03-15 18:51:12Z jim $ Ns.(?:([^@:]+)(?::([^@]*))?@)?([^:]*)(?::(\d+))?$swin32s(rsa|dss)2?@22:(\S+)$c Cs,titidƒ} tiƒ}d}xϊnoςyΧti| |ƒ\}}}|d7}gi }|idƒD]} |t| dƒƒqp~}t|ƒiƒ\}}|djotid|ƒ}n|djotid|ƒ}n|i|d ||ƒWq*tj oPq*Xq1W|SdS( Ns&Software\SimonTatham\PuTTY\SshHostKeysiis,isrsasvalssdsssssh-(s_winregsOpenKeysHKEY_CURRENT_USERsregkeysparamikosHostKeysskeyssis EnumValuesnamesvaluestype_sappends_[1]ssplitsvslongsparse_reg_key_namesgroupssktypeshostsRSAKeyskeysDSSKeysadds WindowsError( snamesktypeskeysshostsvalues_[1]sistype_skeysvsregkey((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys_get_hosts_keyss&    9   cCstitiidƒƒSdS(Ns~/.ssh/known_hosts(sparamikosHostKeyssosspaths expanduser(((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys_get_hosts_keys5ssResultcBs,tZd„Zd„Zd„Zd„ZRS(NcCs||_||_||_dS(N(sfpsselfs_fpsurlsinfosheaders(sselfsfpsurlsinfo((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys__init__;s  cCs |iSdS(N(sselfsurl(sself((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pysgeturl@scCs |iSdS(N(sselfsheaders(sself((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pysinfoCscCst|i|ƒSdS(N(sgetattrsselfs_fpsname(sselfsname((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys __getattr__Fs(s__name__s __module__s__init__sgeturlsinfos __getattr__(((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pysResult9s   s SFTPHandlercBstZd„ZRS(Nc Csσ|iƒ}| otddf‚nt|ƒ}| otdd|f‚n|iƒ\}}}}|ot i |ƒ}n t i ƒ}|ot|ƒ}nd}|ot i |ƒ}nt i |pdƒ}tƒ}|i|ƒ}|tjotid|ƒ‚nt|ƒ\}||}|tj o/ti||fƒ}|id|d|ƒn†x‚tiƒiƒD]_} ti||fƒ}y!|id|d | d |ƒPWqtij o|iƒqXqWtid ƒ‚tii|ƒ} |i!ƒ} |i#ƒ} | i%| ƒi&}t%i(|ƒoft)t*i+d i,gi-}| i/| ƒD]}|d | ||fƒqc~ƒƒ| hdd<ƒSnMt1i2| ƒd} | tjo d} nt)| i4| ƒ| hd| <ƒSdS(Ns sftp errors no host givens invalid hostissNo stored host keysusernamespasswordspkeyshostkeysAuthentication failed.s s%s
s content-types text/htmlisapplication/octet-stream(5sreqsget_hostshostsIOErrorsparse_url_hostsparsedsgroupssuserspwsportsurllibsunquotesgetpasssgetusersints_get_hosts_keysshostkeysgetsNonesparamikosAuthenticationExceptionslists hostkeytypes TransportstranssconnectsAgentsget_keysskeyscloses SFTPClientsfrom_transportssftps get_selectorspaths get_full_urlsurlsstatsst_modesmodesS_ISDIRsResults cStringIOsStringIOsjoinsappends_[1]slistdirsxs mimetypess guess_typesmtypesopen(sselfsreqs hostkeytypesportshostkeyspwsparsedshostsuserskeyspathsmtypesurlssftps_[1]smodesxstrans((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys sftp_openKsZ         O  (s__name__s __module__s sftp_open(((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys SFTPHandlerIs(s__doc__s cStringIOsgetpasss mimetypessossresstatssyssurllibsurllib2sparamikoscompilesmatchsparse_url_hostsplatforms_winregsparse_reg_key_names_get_hosts_keyssResults BaseHandlers SFTPHandler(sparse_reg_key_names cStringIOs mimetypessstatsurllibsurllib2sgetpasssresparse_url_hostssyssResults SFTPHandlers_winregsossparamikos_get_hosts_keys((s9build/bdist.linux-i686/egg/zc/buildoutsftp/urllib2sftp.pys?sQ    PKωvo6tŽΉά††zc/buildoutsftp/__init__.pyc;ς ₯Ec@sdS(N((((s6build/bdist.linux-i686/egg/zc/buildoutsftp/__init__.pys?sPKωvo6gŠΛX(X(zc/buildoutsftp/tests.pyc;ς NjEc@sCdkZdkZdkZdkZdkZdkZdkZdklZdfd„ƒYZ dfd„ƒYZ dfddfd d fd d fgZ hde d e ddƒƒde ddƒgf|i|ƒ}tttƒotti ƒSn tdƒSdS(Ni( sselfs _traversespathsfs isinstancesdsdictsFauxStatsstatsS_IFDIR(sselfspathsf((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pys sftp_statqscCsti|i|ƒƒSdS(N(sStringIOsselfs _traversespath(sselfspath((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pysopenxs(s__name__s __module__s__init__s _traverses sftp_statsopen(((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pysFauxSFTPClientcs  c sHg}||id…scstiidˆƒS(NsHOME(sossenvirons __setitem__soldhome((soldhome(s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pys‡ss /testhomecs tiˆƒS(N(surllib2sinstall_openers old_opener((s old_opener(s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pysŽsswin32cs1|ˆidfjotd|Œ‚nˆSdS(Ns&Software\SimonTatham\PuTTY\SshHoskKeyssBad keys(sargss_winregsHKEY_CURENT_USERs ValueErrorskey(sargs(s_winregskey(s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pysOpenKey•scsh|ˆj otdƒ‚nyt|\}}Wntj ot|ƒ‚nXd||dfSdS(NsBad keysrsa@22:i( skskeys ValueErrorshkeyssindexshostshkeys IndexErrors WindowsError(sksindexshkeyshost(skey(s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pys EnumValue›s sOpenKeys EnumValuec Csm|djotd|ƒ‚ntgi}tD].\}}||hdti |ƒ΅ss TransportsAgents SFTPClientsHostKeys(steardownstestsglobssossenvironsgetsoldhomesNonesappendsurllib2s_openers old_openerssyssplatforms_winregsobjectskeysOpenKeys EnumValuesparamikosHostKeyssReplacesrestoresgetpasss FauxTransports FauxAgentsFauxSFTPClient( steststeardowns old_openersoldhomesHostKeyss_winregskeysOpenKeys EnumValue((s old_openersoldhomes_winregskeys3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pyssetup|s2          cCs#x|idD] }|ƒqWdS(Ns __teardown(stestsglobssf(stestsf((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pysteardownΎscCsdS(sd Install the urllib2 hook >>> import zc.buildoutsftp.buildoutsftp >>> zc.buildoutsftp.buildoutsftp.install(None) Now, we'll try to get a directory listing from foo.com: >>> f = urllib2.urlopen('sftp://foo.com') >>> f.url 'sftp://foo.com' >>> f.info['Content-Type'] 'text/html' >>> print f.read() N((((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pystestΒscCstidtdtƒSdS(NssetUpstearDown(sdoctests DocTestSuitessetupsteardown(((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pys test_suiteΦs(sossstatsStringIOssyssurllib2sgetpasssparamikos zope.testingsdoctestsReplacesUsershkeyssdictshostdatas FauxTransports FauxAgentsFauxStatsFauxSFTPClientssetupsteardownstests test_suite(sgetpasssstats FauxAgentsStringIOsteardownssetupsurllib2shostdatasReplacessysshkeyss test_suitesdoctests FauxTransportstestsFauxSFTPClientsFauxStatsossparamikosUser((s3build/bdist.linux-i686/egg/zc/buildoutsftp/tests.pys?s6  '6  B  PKωvo6ό]‰]11 zc/buildoutsftp/buildoutsftp.pyc;ς Η$Ec@s"dkZdkZed„ZdS(NcCs#tititiiiƒƒdS(N(surllib2sinstall_openers build_openerszcs buildoutsftps urllib2sftps SFTPHandler(sbuildout((s:build/bdist.linux-i686/egg/zc/buildoutsftp/buildoutsftp.pysinstalls(surllib2szc.buildoutsftp.urllib2sftpszcsNonesinstall(surllib2sinstallszc((s:build/bdist.linux-i686/egg/zc/buildoutsftp/buildoutsftp.pys?s  PKωvo68•ƒ— — EGG-INFO/PKG-INFOMetadata-Version: 1.0 Name: zc.buildoutsftp Version: 0.2.1 Summary: Specialized zc.buildout plugin to add sftp support. Home-page: http://www.python.org/pypi/zc.buildoutsftp Author: Jim Fulton Author-email: jim@zope.com License: ZPL 2.1 Description: =========================================== Secure FTP (SFTP) Extension for zc.buildout =========================================== The zc.buildoutsftp package provides a zc.buildout extension that provides support for SFTP. To use it, simply provide the option:: extension = zc.buildoutsftp in your buildout section. Then you can use sftp URLs for fine-links or index URLs. (Note that zc.buildout >=1.0.0b5 is needed for this to work properly.) An SFTP URL is similar to an FTP URL and is of the form:: sftp://user:password@hostname:port/path where the user name, password, and port are optional. Here are some examples: The following URL accesses the path /distribution on download.zope.org:: sftp://download.zope.org/distribution The following URL accesses the path /distribution on download.zope.org using the user id jim:: sftp://jim@download.zope.org/distribution The following URL accesses the path /distribution on download.zope.org using the user id jim and password 123:: sftp://jim:123@download.zope.org/distribution The following url accesses the path /distribution on download.zope.org using an ssh server running on port 1022:: sftp://download.zope.org:1022/distribution The buildout extension actually installs a urllib2 handler for the "sftp" protocol. This handler is actually setuptools specific because it generates HTML directory listings, needed by setuptools and makes no effort to make directory listings useful for anything else. It is possible that, in the future, setuptools will provide it's own extension mechanism for handling alternate protocols, in which case, we might bypass the urllib2 extension mechanism. SSH Compatibility ================= The extension works with Open SSH on unix-based systems and PuTTY on Windows. Unless a password is given in the URL, private keys are ontained from ssh agent (pagent on Windows). Status and Change History ========================= This package is experimental. It seems to work based on manual testing. I'm still trying to figure out how to write automated tests for this. 0.2.1 ----- Fixed a bug in handling multiple user keys. 0.2 --- Added missing entry point. Adjusted content-type information to work with setuptools. 0.1 --- Initial release Keywords: buildout Platform: UNKNOWN Classifier: Framework :: Buildout Classifier: Development Status :: 3 - Alpha Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Zope Public License Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Libraries :: Python Modules PKωvo6™nEGG-INFO/SOURCES.txtCHANGES.txt README.txt bootstrap.py buildout.cfg get.py setup.py src/zc/__init__.py src/zc.buildoutsftp.egg-info/PKG-INFO src/zc.buildoutsftp.egg-info/SOURCES.txt src/zc.buildoutsftp.egg-info/dependency_links.txt src/zc.buildoutsftp.egg-info/entry_points.txt src/zc.buildoutsftp.egg-info/namespace_packages.txt src/zc.buildoutsftp.egg-info/not-zip-safe src/zc.buildoutsftp.egg-info/requires.txt src/zc.buildoutsftp.egg-info/top_level.txt src/zc/buildoutsftp/__init__.py src/zc/buildoutsftp/buildoutsftp.py src/zc/buildoutsftp/urllib2sftp.py PKωvo6“Χ2EGG-INFO/dependency_links.txt PKωvo6tœb]HHEGG-INFO/entry_points.txt[zc.buildout.extension] default = zc.buildoutsftp.buildoutsftp:install PKωvo6ξε"EGG-INFO/namespace_packages.txtzc PKγY-5“Χ2EGG-INFO/not-zip-safe PKωvo6ρc,ϊEGG-INFO/requires.txtparamiko setuptoolsPKωvo6ξε"EGG-INFO/top_level.txtzc PKšS-5Έ?bΘΘ΄zc/__init__.pyPKωvo6έεpSgg€τzc/__init__.pycPKjvo6Ξ—‰o₯₯€ˆzc/buildoutsftp/urllib2sftp.pyPKšS-5€Œ₯΄izc/buildoutsftp/__init__.pyPKΓƒ-5 $₯gg΄€zc/buildoutsftp/tests.pyPK-\-5/kΝΑ99΄A,zc/buildoutsftp/buildoutsftp.pyPKωvo61ΰιΏΏ€·/zc/buildoutsftp/urllib2sftp.pycPKωvo6tŽΉά††€³Ezc/buildoutsftp/__init__.pycPKωvo6gŠΛX(X(€sFzc/buildoutsftp/tests.pycPKωvo6ό]‰]11 €ozc/buildoutsftp/buildoutsftp.pycPKωvo68•ƒ— — ΄qqEGG-INFO/PKG-INFOPKωvo6™n΄7EGG-INFO/SOURCES.txtPKωvo6“Χ2΄†EGG-INFO/dependency_links.txtPKωvo6tœb]HH€ΒEGG-INFO/entry_points.txtPKωvo6ξε"΄A‚EGG-INFO/namespace_packages.txtPKγY-5“Χ2΄‚EGG-INFO/not-zip-safePKωvo6ρc,ϊ΄΅‚EGG-INFO/requires.txtPKωvo6ξε"΄ϋ‚EGG-INFO/top_level.txtPKχ2ƒ