package Ġkit to ku . opens stp client . packet Ċ Ċ import Ġandroid . net . Vpn Service Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġkit to ku . opens stp client . BUFFER _ SIZE _ IP Ċ import Ġkit to ku . opens stp client . POL LING _ TIME _ STREAM _ READ Ċ import Ġkit to ku . opens stp client . misc . Abstract Terminal Ċ import Ġkit to ku . opens stp client . misc . Layer Bridge Ċ import Ġkit to ku . opens stp client . misc . Network Setting Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ Ċ internal Ġclass ĠIp Client ( val Ġ Ġbuilder : ĠV pn Service . Builder , Ġbridge : ĠLayer Bridge , Ġnetwork Setting : ĠNetwork Setting ) ĊĠĠĠ Ġ: ĠAbstract Terminal ( bridge , Ġnetwork Setting , ĠBUFFER _ SIZE _ IP ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġread Unit From P pp Ġ= Ġbridge :: read Unit From Lower ĊĠĠĠ Ġprivate Ġval Ġwrite Unit To P pp Ġ= Ġbridge :: write Unit ToLower ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfd : ĠParcel FileDescriptor ĊĊĠĠĠ Ġfun Ġinitialize T un () Ġ{ ĊĠĠĠĠĠĠĠ Ġnetwork Setting . ip Ad ress ?. apply Ġ{ Ġbuilder . add Address ( this , Ġ 1 6 ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġnetwork Setting . primary Dns ?. apply Ġ{ Ġbuilder . add Dns Server ( this ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġnetwork Setting . m ru ?. apply Ġ{ Ġbuilder . set M tu ( this . toInt ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . add Route (" 0 . 0 . 0 . 0 ", Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġfd Ġ= Ġbuilder . est ablish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun Outgoing () Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( fd . file Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Size : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing Buffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Size Ġ= ĠinputStream . read ( outgoing Buffer . array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Size Ġ> Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġdelay ( POL LING _ TIME _ STREAM _ READ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing Buffer . limit ( read Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Unit To P pp ( outgoing Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! network Setting . is Neg oti ated ) Ġdelay ( 1 0 0 L ) ĊĊĠĠĠĠĠĠĠ Ġinitialize T un () ĊĠĠĠĠĠĠĠ Ġrun Outgoing () ĊĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠFileOutputStream ( fd . file Descriptor ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Buffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Unit From P pp ( incoming Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( incoming Buffer . array (), Ġ 0 , Ġincoming Buffer . limit ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: fd . isInitialized ) Ġfd . close () ĊĠĠĠ Ġ} Ċ }