#!/opt/thinlinc/libexec/python3
# -*-mode: python; coding: utf-8 -*-
#
# Copyright 2002-2014 Cendio AB.
# For more information, see http://www.cendio.com
#
# action: Mounting local drives
#
if 82 - 82: Iii1i
import sys
import threading
import os
import stat
import base64
import hashlib
import subprocess
import time
import locale
if 87 - 87: Ii % i1i1i1111I . Oo / OooOoo * I1Ii1I1 - I1I
from thinlinc import hiveconf
import warnings
if 81 - 81: i1 + ooOOO / oOo0O00 * i1iiIII111 * IiIIii11Ii
if 84 - 84: ooo000 - Ooo0Ooo + iI1iII1I1I1i . IIiIIiIi11I1
warnings . filterwarnings ( "ignore" , ".*gssapi.*" , ImportWarning )
from thinlinc import rpc
from thinlinc . rpc import security
from thinlinc . mountclient import mount_const , mount_pack
if 98 - 98: I11iiIi11i1I % oOO
from thinlinc import sessioninfo
from thinlinc import prefix
if 31 - 31: i1I
from thinlinc . optionparse import OptionParser
from thinlinc . optcomplete import CompletionResult
from thinlinc . version import TL_VERSION
if 9 - 9: IiI11Ii111 / oOo0O00 / IiIIii11Ii - I11iiIi11i1I - iI1iII1I1I1i
iiIi1 = 10
if 71 - 71: i1 % Iii1i
iiiIi = "tl-mount-localdrives"
if 66 - 66: IIiIIiIi11I1 + I1I
IIIii = False
if 13 - 13: IiIIii11Ii - Ooo0Ooo - Ii - Oo * ooo000 . i1iiIII111
class ii1Ii ( rpc . ConnectionHandler ) :
 if 55 - 55: iI1iII1I1I1i + i1
 def __init__ ( self ) :
  super ( ) . __init__ ( )
  if 10 - 10: Oo % oOO . i1i1i1111I . i1
  IIiIiiIiI = threading . Thread ( target = self . start , name = 'PollingThread' )
  IIiIiiIiI . daemon = True
  IIiIiiIiI . start ( )
  if 34 - 34: Ooo0Ooo + oOO * IIiIIiIi11I1 * OooOoo
  self . default_cred = security . CredInfo ( )
  if 25 - 25: Ii / oOO % Ii
 def connect ( self , host , port ) :
  self . pipe = super ( ) . connect ( ( host , port ) )
  if 96 - 96: Ii . IIiIIiIi11I1 % I11iiIi11i1I
 def make_call ( self , proc , arg = b'' , arg_type = '' , result_type = '' , * ,
 timeout = None ) :
  if arg and arg_type :
   iiii1i1iIi = mount_pack . MOUNTPacker ( )
   iiI1111IIi1 = getattr ( iiii1i1iIi , 'pack_%s' % arg_type )
   iiI1111IIi1 ( arg )
   arg = iiii1i1iIi . get_buffer ( )
   if 92 - 92: ooOOO / OooOoo - oOo0O00
  OoO = self . pipe . send_call ( mount_const . MOUNT_PROGRAM ,
 mount_const . MOUNT_V3 ,
 proc , arg , self . default_cred )
  ii1IiIiiII , I1I111i11I = self . pipe . listen ( OoO , timeout = timeout )
  if 85 - 85: OooOoo
  if I1I111i11I and result_type :
   o00 = mount_pack . MOUNTUnpacker ( I1I111i11I )
   I1i1Ii = getattr ( o00 , 'unpack_%s' % result_type )
   return I1i1Ii ( )
  else :
   return I1I111i11I
   if 88 - 88: I11iiIi11i1I + ooOOO - i1i1i1111I . Ooo0Ooo * Ii + Iii1i
 def null ( self , * , timeout = None ) :
  self . make_call ( mount_const . MOUNTPROC3_NULL , timeout = timeout )
  if 43 - 43: ooOOO * I1Ii1I1
 def mnt ( self , dirpath , * , timeout = None ) :
  return self . make_call ( mount_const . MOUNTPROC3_MNT ,
 arg = dirpath , arg_type = 'dirpath' ,
 result_type = 'mountres3' , timeout = timeout )
  if 95 - 95: Ooo0Ooo % Iii1i % i1i1i1111I . OooOoo
 def export ( self , * , timeout = None ) :
  return self . make_call ( mount_const . MOUNTPROC3_EXPORT ,
 result_type = 'exports' , timeout = timeout )
  if 70 - 70: IiIIii11Ii
  if 75 - 75: Ooo0Ooo / Ii / IiIIii11Ii + IiIIii11Ii . I1I
class i1I11ii :
 def __init__ ( self , host , port ) :
  if 21 - 21: Iii1i - I1Ii1I1
  if 95 - 95: i1 - I1Ii1I1 + Oo
  if 49 - 49: IIiIIiIi11I1
  if 29 - 29: IiIIii11Ii - oOo0O00
  if 30 - 30: I1I . ooo000
  OOO = None
  for OooOoo0OO0OO0 in range ( iiIi1 ) :
   if IIIii :
    print ( "%s: Connecting to %s:%d..." %
 ( iiiIi , host , port ) , file = sys . stderr )
   try :
    self . mountcl = ii1Ii ( )
    self . mountcl . connect ( host , port )
    self . mountcl . null ( timeout = 2 )
    if 66 - 66: ooo000
    return
   except rpc . RPCTimeout as I1 :
    OOO = rpc . RPCTimeout ( "Operation timed out" )
   except ( EOFError , OSError ) as I1 :
    OOO = I1
    if 56 - 56: I11iiIi11i1I
   time . sleep ( 1 )
   if 69 - 69: I1I * Ooo0Ooo + i1iiIII111 . i1iiIII111 % Oo * oOo0O00
   if 65 - 65: Ooo0Ooo * ooo000 + oOo0O00
  i1I11i11 = "%s: Cannot connect to client: %s" % ( iiiIi , str ( OOO ) )
  sys . exit ( i1I11i11 )
  if 39 - 39: Iii1i % oOo0O00 + Ooo0Ooo / i1I
 def get_otp ( self , password ) :
  OO0o0O0o0 = self . mountcl . mnt ( b"@getnonce" , timeout = 10 )
  if 11 - 11: IiI11Ii111 % i1i1i1111I + i1
  if OO0o0O0o0 . fhs_status != mount_const . MNT3_OK :
   print ( "%s: Failed to get nonce:" % iiiIi ,
 mount_const . mountstat3_id [ OO0o0O0o0 . fhs_status ] ,
 file = sys . stderr )
   sys . exit ( 1 )
   if 87 - 87: I1I / Iii1i / Ii
  IiII11i11II = OO0o0O0o0 . mountinfo . fhandle
  o00o = hashlib . md5 ( IiII11i11II + password ) . hexdigest ( )
  return o00o
  if 97 - 97: Ooo0Ooo
 def get_exports ( self ) :
  OO0o0O0o0 = [ ]
  if 29 - 29: I11iiIi11i1I * iI1iII1I1I1i
  if 7 - 7: Oo / OooOoo - I11iiIi11i1I - IiI11Ii111 % i1iiIII111
  if 97 - 97: I11iiIi11i1I % oOO - I1Ii1I1 - IIiIIiIi11I1
  O0O0O = self . mountcl . export ( timeout = 10 )
  if 81 - 81: iI1iII1I1I1i + i1i1i1111I
  while O0O0O :
   oOO0oo = O0O0O [ 0 ]
   i1i1iiII = oOO0oo . ex_dir
   OO0o0O0o0 . append ( i1i1iiII )
   O0O0O = oOO0oo . ex_next
   if 43 - 43: Ooo0Ooo - I1I . ooo000 - Iii1i % i1I
  return OO0o0O0o0
  if 49 - 49: IiIIii11Ii . ooo000 + oOO - oOO
  if 78 - 78: i1 - ooOOO
 def gen_drive_names ( self , exports ) :
  OO0o0O0o0 = { }
  if 56 - 56: ooo000 . ooo000 + I1Ii1I1 * iI1iII1I1I1i
  if 17 - 17: Iii1i % i1I - Iii1i % Ooo0Ooo . OooOoo
  if 60 - 60: ooOOO . ooo000
  if 42 - 42: i1iiIII111 - i1iiIII111
  if 98 - 98: Ooo0Ooo + i1i1i1111I + Iii1i - oOO
  I1i1i = 0
  for i1i1iiII in exports :
   if 97 - 97: i1
   if i1i1iiII . endswith ( b"/" ) :
    i1i1iiII = i1i1iiII [ : - 1 ]
    if 26 - 26: IiI11Ii111
    if 20 - 20: IIiIIiIi11I1 / Oo
    if 73 - 73: ooOOO - IiIIii11Ii
    if 22 - 22: Oo % oOo0O00 / i1I . oOo0O00 . i1I
    if 87 - 87: I1I - i1I . i1 * Oo
   ooO0O0Oo00O = i1i1iiII . decode ( 'utf-8' , errors = 'replace' ) . encode ( sys . getfilesystemencoding ( ) ,
   # Ooo0Ooo
 errors = 'replace' ) . decode ( sys . getfilesystemencoding ( ) )
   if 63 - 63: Ooo0Ooo
   if 47 - 47: OooOoo - I1Ii1I1 - I11iiIi11i1I * ooOOO * oOO % IIiIIiIi11I1
   if 60 - 60: i1I * i1iiIII111 + i1i1i1111I / ooOOO
   o000OOoOO , IIIII = os . path . split ( ooO0O0Oo00O )
   oooo0OO0o0 = IIIII
   if oooo0OO0o0 not in OO0o0O0o0 :
    if 61 - 61: IIiIIiIi11I1 * Iii1i - oOo0O00 . ooo000 / i1 * oOo0O00
    OO0o0O0o0 [ oooo0OO0o0 ] = i1i1iiII
    continue
    if 85 - 85: IIiIIiIi11I1 + I11iiIi11i1I % Ooo0Ooo + oOO * i1iiIII111
    if 46 - 46: ooOOO - ooOOO + Oo / I1I * Oo + oOO
   o000OOoOO , IIIII = os . path . split ( o000OOoOO )
   oooo0OO0o0 = IIIII + "_" + oooo0OO0o0
   if oooo0OO0o0 not in OO0o0O0o0 :
    OO0o0O0o0 [ oooo0OO0o0 ] = i1i1iiII
    continue
    if 98 - 98: I1I / IIiIIiIi11I1 / i1I + IiI11Ii111 % Oo + I1I
    if 38 - 38: I1Ii1I1 + oOo0O00
   oooo0OO0o0 += str ( I1i1i )
   I1i1i += 1
   assert ( oooo0OO0o0 not in OO0o0O0o0 )
   OO0o0O0o0 [ oooo0OO0o0 ] = i1i1iiII
   if 2 - 2: OooOoo % Ii + oOO . OooOoo + IIiIIiIi11I1 * Oo
  return OO0o0O0o0
  if 2 - 2: IIiIIiIi11I1 + iI1iII1I1I1i - I1Ii1I1 + ooOOO . IIiIIiIi11I1
  if 15 - 15: ooo000
def o00ooo0Oooo ( hive ) :
 try :
  if 72 - 72: IiI11Ii111 % i1 % ooo000 % iI1iII1I1I1i
  if 57 - 57: Ooo0Ooo % i1I + IiI11Ii111
  if 8 - 8: Oo * I1I / i1i1i1111I + i1 / I1Ii1I1
  iI = sessioninfo . get_public_sessioninfo ( hive )
 except sessioninfo . GPSConnectionError as I1 :
  print ( "%s: %s" % ( iiiIi , I1 ) , file = sys . stderr )
  print ( "%s: Trying to mount anyway" % iiiIi , file = sys . stderr )
  return { }
  if 58 - 58: IIiIIiIi11I1 % Ii + oOo0O00 / oOo0O00 * iI1iII1I1I1i * i1i1i1111I
  if 88 - 88: i1I + I1I
  if 55 - 55: oOO
 if 0 == len ( iI ) :
  print ( "%s: No session information matching current environment."
 % iiiIi , file = sys . stderr )
  print ( "%s: Trying to mount anyway" % iiiIi , file = sys . stderr )
  return { }
 elif 1 < len ( iI ) :
  print ( "%s: Multiple sessions matching current information. " "Should not happen!" % iiiIi , file = sys . stderr )
  if 29 - 29: ooOOO / i1i1i1111I / I1Ii1I1 . IiI11Ii111 + i1I * oOo0O00
  print ( "%s: Trying to mount anyway" % iiiIi , file = sys . stderr )
  return { }
  if 57 - 57: iI1iII1I1I1i
 iI = iI [ 0 ]
 if 89 - 89: ooo000 * I11iiIi11i1I + oOO
 if "client_params" not in iI :
  print ( "%s: No client_params found" % iiiIi , file = sys . stderr )
  return { }
  if 64 - 64: IiI11Ii111 . Ooo0Ooo . i1iiIII111 * IiI11Ii111
 oo0 = iI [ "client_params" ]
 if "capabilities" not in oo0 :
  if IIIii :
   print ( "%s: Client doesn't support capabilities" % iiiIi ,
 file = sys . stderr )
  return { }
  if 74 - 74: ooOOO . Ii % IIiIIiIi11I1 / iI1iII1I1I1i % ooOOO
 IIiIIIII1iiI = oo0 [ "capabilities" ]
 if "localdrives" not in IIiIIIII1iiI :
  if IIIii :
   print ( "%s: Client has no localdrives capability, exiting."
 % iiiIi , file = sys . stderr )
  sys . exit ( 1 )
  if 53 - 53: oOo0O00 - ooo000 * Ii % i1i1i1111I - ooOOO + i1iiIII111
 Ii11IIii1I = IIiIIIII1iiI [ "localdrives" ]
 if not isinstance ( Ii11IIii1I , dict ) :
  return { }
  if 80 - 80: iI1iII1I1I1i * I1I . oOO + OooOoo
 return Ii11IIii1I . get ( "aliases" , { } )
 if 37 - 37: IIiIIiIi11I1 * Iii1i . IiI11Ii111 * i1
 if 91 - 91: oOO + Iii1i
def ooOo0 ( ) :
 II11IIIIiI1iI = OptionParser ( version = TL_VERSION ,
 usage = "%prog [option]" ,
 description = "Mounts exported local drives." )
 if 25 - 25: OooOoo % ooOOO . i1iiIII111 - ooOOO % Iii1i
 II11IIIIiI1iI . add_option ( "-v" , "--verbose" ,
 action = "store_true" ,
 default = False ,
 dest = "verbose" ,
 help = "verbose mode" )
 if 37 - 37: i1I + IIiIIiIi11I1 % iI1iII1I1I1i / IIiIIiIi11I1 % i1iiIII111 + oOO
 II11IIIIiI1iI . set_argument_completer ( lambda * Oo0o0Oo : CompletionResult ( completions = [ ] , nospace = False ) )
 if 100 - 100: i1iiIII111 . IIiIIiIi11I1 * ooo000 * ooo000
 return II11IIIIiI1iI
 if 85 - 85: IIiIIiIi11I1 / OooOoo . i1I % Oo + Oo - I11iiIi11i1I
def ooO0ooOOO00O0 ( ) :
 locale . setlocale ( locale . LC_ALL , "" )
 if 11 - 11: oOO * i1iiIII111 - IIiIIiIi11I1
 global TLPREFIX
 TLPREFIX = prefix . get_tl_prefix ( )
 if 70 - 70: IiI11Ii111
 if 9 - 9: oOo0O00 * i1
 II11IIIIiI1iI = ooOo0 ( )
 if 96 - 96: Ooo0Ooo
 ( ii1IiiIiI , Oo0o0Oo ) = II11IIIIiI1iI . parse_args ( )
 if 46 - 46: OooOoo - I11iiIi11i1I / Ooo0Ooo
 if Oo0o0Oo :
  II11IIIIiI1iI . error ( "program takes no input argument" )
  if 73 - 73: I1Ii1I1 / i1i1i1111I / ooo000 % i1 % i1I - OooOoo
 if ii1IiiIiI . verbose :
  global IIIii
  IIIii = ii1IiiIiI . verbose
  if 30 - 30: ooOOO * ooOOO - Iii1i * iI1iII1I1I1i
  if 37 - 37: I1Ii1I1 % iI1iII1I1I1i . i1I + Ooo0Ooo + ooOOO * iI1iII1I1I1i
 prefix . assert_in_session ( )
 oOooO0O0 = prefix . get_tl_session_dir ( )
 if 38 - 38: Iii1i + ooo000 * Iii1i + Ii % IIiIIiIi11I1 % oOo0O00
 I1i1I = [ os . path . join ( TLPREFIX , "bin" , "tl-umount-localdrives" ) ]
 I1i1I . append ( "-l" )
 if IIIii :
  I1i1I . append ( "-v" )
  if 87 - 87: OooOoo * Oo * Ii * iI1iII1I1I1i + i1I . IiIIii11Ii
 if IIIii :
  print ( "%s: Calling tl-umount-localdrives to remove any stale " "mounts" % iiiIi , file = sys . stderr )
  if 94 - 94: oOo0O00 . i1iiIII111
 subprocess . call ( I1i1I )
 if 96 - 96: I1I / oOO / I11iiIi11i1I + I11iiIi11i1I
 if 35 - 35: IIiIIiIi11I1 + oOo0O00
 oooo000O0 = hiveconf . open_hive ( os . path . join ( TLPREFIX , "etc" , "thinlinc.hconf" ) )
 if 47 - 47: ooo000
 IiII111I1I = prefix . get_tl_sessnum ( oOooO0O0 )
 ooOo00O0o0o0 = sessioninfo . get_tunnel_port ( oooo000O0 , IiII111I1I , "nfs" )
 if 60 - 60: Ooo0Ooo + OooOoo . Ii . IIiIIiIi11I1 + Oo . i1
 if 69 - 69: iI1iII1I1I1i - IiIIii11Ii
 if not os . path . exists ( oOooO0O0 ) :
  sys . exit ( "%s: %s does not exist. Quitting." %
 ( iiiIi , oOooO0O0 ) )
  if 86 - 86: oOO * i1I - OooOoo * Oo - IiI11Ii111 - Ooo0Ooo
 if os . stat ( oOooO0O0 ) [ stat . ST_UID ] != os . getuid ( ) :
  sys . exit ( "%s: %s is not owned by you. Quitting." %
 ( iiiIi , oOooO0O0 ) )
  if 36 - 36: IiIIii11Ii
  if 28 - 28: i1 - Oo + IiIIii11Ii * oOO
 oOooOo0o = o00ooo0Oooo ( oooo000O0 )
 if 83 - 83: Iii1i % i1iiIII111 . OooOoo / I1I % oOO . I1I
 if 76 - 76: i1iiIII111 / OooOoo
 if 77 - 77: ooOOO
 if 19 - 19: ooOOO % I1Ii1I1
 if 15 - 15: OooOoo . IiIIii11Ii . i1I / Iii1i + ooOOO / Ii
 Ii1iIII11i = os . path . join ( oOooO0O0 , "vncpasswd" )
 with open ( Ii1iIII11i , 'rb' ) as oo000OO0ooO :
  OoO0OooO0ooo = base64 . encodebytes ( oo000OO0ooO . read ( ) [ : 8 ] )
  if 36 - 36: i1I * i1iiIII111 % IiI11Ii111 - oOo0O00 % iI1iII1I1I1i
 OoO0OooO0ooo = OoO0OooO0ooo [ : - 1 ]
 del Ii1iIII11i
 if 65 - 65: Oo - Oo * oOO * I1I * Ooo0Ooo
 if 58 - 58: i1iiIII111 - iI1iII1I1I1i
 if 52 - 52: Oo * Ooo0Ooo + ooOOO + IiIIii11Ii
 if 20 - 20: i1i1i1111I - i1i1i1111I . Ooo0Ooo . IiIIii11Ii . oOO / Ii
 oO0O0oO0 = os . path . join ( oOooO0O0 , "drives" )
 if not os . path . exists ( oO0O0oO0 ) :
  if IIIii :
   print ( "%s: Creating %s" % ( iiiIi , oO0O0oO0 ) ,
 file = sys . stderr )
  os . mkdir ( oO0O0oO0 , 0o755 )
  if 40 - 40: i1I . I1I % OooOoo
  if 85 - 85: Oo / oOO + Oo + ooOOO
 I11111i111 = os . path . join ( os . path . expanduser ( "~" ) , "thindrives" )
 if os . path . islink ( I11111i111 ) :
  os . unlink ( I11111i111 )
  os . symlink ( oO0O0oO0 , I11111i111 )
 elif os . path . exists ( I11111i111 ) :
  print ( "%s: Cannot create link %s" % ( iiiIi , I11111i111 ) ,
 file = sys . stderr )
 else :
  if 35 - 35: I1Ii1I1
  os . symlink ( oO0O0oO0 , I11111i111 )
  if 35 - 35: i1iiIII111 + Iii1i + OooOoo / ooo000 % OooOoo . Iii1i
  if 12 - 12: I1I % Ooo0Ooo - i1iiIII111 - IiIIii11Ii / i1iiIII111 + i1I
 ii1i = oooo000O0 . get_string_list ( "/utils/tl-mount-localdrives/mount_args" ,
 [ "-o" , "soft,intr,actimeo=2,rsize=524288,wsize=524288,timeo=50,retrans=1" ] )
 if 87 - 87: ooOOO
 if 57 - 57: IIiIIiIi11I1 - iI1iII1I1I1i % ooOOO - I11iiIi11i1I / IiIIii11Ii . Ooo0Ooo
 if 15 - 15: i1I * I11iiIi11i1I - oOo0O00
 if 6 - 6: IiI11Ii111 - Ii
 try :
  iiiIII = i1I11ii ( "127.0.0.1" , ooOo00O0o0o0 )
  if 16 - 16: IIiIIiIi11I1
  oO00 = iiiIII . gen_drive_names ( iiiIII . get_exports ( ) )
 except rpc . RPCTimeout :
  sys . exit ( "%s: Timeout when mounting local drives." % iiiIi )
  if 30 - 30: IiIIii11Ii % ooo000 . Ii * Iii1i - iI1iII1I1I1i
 for ( oooo0OO0o0 , i1i1iiII ) in oO00 . items ( ) :
  oooo0OO0o0 = oOooOo0o . get ( oooo0OO0o0 , oooo0OO0o0 )
  II1I11IIiIi = os . path . join ( oO0O0oO0 , oooo0OO0o0 )
  if not os . path . exists ( II1I11IIiIi ) :
   if IIIii :
    print ( "%s: Creating %s" % ( iiiIi , II1I11IIiIi ) ,
 file = sys . stderr )
   try :
    os . mkdir ( II1I11IIiIi , 0o755 )
   except FileExistsError :
    pass
   except OSError as I1 :
    sys . exit ( "%s: Unable to create %s: %s, exiting" %
 ( iiiIi , II1I11IIiIi , str ( I1 ) ) )
    if 42 - 42: iI1iII1I1I1i % IiIIii11Ii
    if 12 - 12: i1 . i1I - I11iiIi11i1I - i1i1i1111I
  OOoOoo00o00oO = [ ]
  OOoOoo00o00oO . append ( os . path . join ( TLPREFIX , "libexec" , "tl-mount-personal" ) )
  if 45 - 45: OooOoo * Oo / ooOOO / I1Ii1I1 / OooOoo % i1i1i1111I
  if 23 - 23: iI1iII1I1I1i - i1I % i1I - IiI11Ii111 * i1iiIII111 + OooOoo
  ii1IiiIiI = "mountport=%d,port=%d" % ( ooOo00O0o0o0 , ooOo00O0o0o0 )
  OOoOoo00o00oO . append ( "-o" )
  OOoOoo00o00oO . append ( ii1IiiIiI )
  if 57 - 57: IIiIIiIi11I1
  if 57 - 57: ooOOO + Ii % I11iiIi11i1I + oOo0O00 . iI1iII1I1I1i - Ii
  OOoOoo00o00oO . extend ( ii1i )
  if 8 - 8: i1i1i1111I + i1i1i1111I * IiI11Ii111
  if 77 - 77: iI1iII1I1I1i - oOO % Ii * i1I - I1I
  try :
   OooOoO0o00 = iiiIII . get_otp ( OoO0OooO0ooo ) . encode ( 'utf-8' )
  except rpc . RPCTimeout :
   sys . exit ( "%s: Timeout when mounting local drives." % iiiIi )
  OOoOoo00o00oO . append ( b"localhost:@otp:" + OooOoO0o00 + i1i1iiII )
  if 23 - 23: i1
  if 91 - 91: I11iiIi11i1I - IiI11Ii111 % IiIIii11Ii / IiIIii11Ii
  OOoOoo00o00oO . append ( II1I11IIiIi )
  if 37 - 37: i1iiIII111 - IiI11Ii111 * i1iiIII111 . i1i1i1111I
  if IIIii :
   print ( "%s: Running %s" % ( iiiIi , OOoOoo00o00oO ) , file = sys . stderr )
   if 43 - 43: oOO
  with subprocess . Popen ( OOoOoo00o00oO , universal_newlines = True ,
 stdin = subprocess . PIPE ,
 stdout = subprocess . PIPE ,
 stderr = subprocess . STDOUT ) as O000oO :
   O000oO . wait ( )
   iI111Ii = O000oO . stdout . read ( )
   if 77 - 77: oOo0O00 . ooo000 % i1iiIII111 * I11iiIi11i1I / Ooo0Ooo . I11iiIi11i1I
  if iI111Ii :
   print ( "%s: %s" % ( iiiIi , iI111Ii ) , file = sys . stderr )
   if 47 - 47: IiIIii11Ii
   if 40 - 40: i1iiIII111 / IIiIIiIi11I1
if __name__ == "__main__" :
 ooO0ooOOO00O0 ( )
# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
