package Ġcom . t ver ona . scp any where . zip resource Ċ Ċ import Ġandroid . content . res . Asset FileDescriptor Ċ import Ġandroid . os . Parcel FileDescriptor Ċ import Ġandroidx . lifecycle . Lifecycle Coroutine Scope Ċ import Ġcom . t ver ona . scp any where . utils . lo ge Ċ import Ġcom . t ver ona . scp any where . utils . log i Ċ import Ġcom . t ver ona . scp any where . utils . log v Ċ import Ġcom . t ver ona . scp any where . utils . log w Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . io .* Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġjava . util . zip . Zip File Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ċ Ġ* ĠWrap s Ġzip Ġfile ( s ) Ġand Ġexposes Ġinput Ġstreams Ġfrom Ġcontained Ġfiles Ċ Ġ*/ Ċ class ĠZip Resource File ( ĊĠĠĠ Ġprivate Ġval Ġlifecycle Coroutine Scope : ĠLifecycle Coroutine Scope , ĊĠĠĠ Ġzip File Names : ĠList < String > Ċ ) Ġ{ ĊĠĠĠ Ġclass ĠZip Entry RO ( ĊĠĠĠĠĠĠĠ Ġval Ġzip File : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġm Local Hdr Offset Ġ// Ġoffset Ġof Ġlocal Ġfile Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/* Ġuseful Ġstuff Ġfrom Ġthe Ġdirectory Ġentry Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġm Method Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm When Modified : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm CRC 3 2 : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Compressed Length : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġm Un compressed Length : ĠLong Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalculates Ġthe Ġoffset Ġof Ġthe Ġstart Ġof Ġthe ĠZip Ġfile Ġentry Ġwithin Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* ĠZip Ġfile . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġoffset , Ġin Ġbytes Ġfrom Ġthe Ġstart Ġof Ġthe Ġfile Ġof Ġthe Ġentry ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġoffset : ĠLong Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġset Offset FromFile ( f : ĠRandom Access File , Ġbuf : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Hdr Offset Ġ= Ġm Local Hdr Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . seek ( local Hdr Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . read Fully ( buf . array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buf . getInt ( 0 ) Ġ!= Ġk LF H Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" did n 't Ġfind Ġsignature Ġat Ġstart Ġof Ġl fh " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Len : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . get Short ( k LF H Name Len ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Len : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . get Short ( k LF H Extra Len ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Hdr Offset Ġ+ Ġk LF H Len Ġ+ Ġname Len Ġ+ Ġextra Len ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio e . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Un compressed ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġfile Ġis Ġstored Ġin Ġun compressed Ġform ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġis Un compressed : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Method Ġ== Ġk Compress Stored ĊĊĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor : ĠAsset FileDescriptor ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Method Ġ== Ġk Compress Stored ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp fd : ĠParcel FileDescriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp fd Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠParcel FileDescriptor . open ( zip File , ĠParcel FileDescriptor . MODE _ READ _ ONLY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAsset FileDescriptor ( p fd , Ġoffset , Ġm Un compressed Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo ge (" Error Ġopening ĠParcel FileDescriptor ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm HashMap Ġ= ĊĠĠĠĠĠĠĠ ĠHashMap < String , ĠZip Entry RO >() ĊĊĠĠĠ Ġprivate Ġvar Ġfinished Indexing Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġprivate Ġval Ġm Lock Ġ= ĠRe entrant Lock () ĊĊĠĠĠ Ġ/* Ġfor Ġreading Ġcompressed Ġfiles Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Zip Files Ġ= ĊĠĠĠĠĠĠĠ ĠHashMap < File , ĠZip File >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġget InputStream Ġreturns Ġan ĠAsset FileDescriptor . Auto Close InputStream ĊĠĠĠĠ Ġ* Ġassociated Ġwith Ġthe Ġasset Ġthat Ġis Ġcontained Ġin Ġthe ĠZip Ġfile , Ġor Ġa ĊĠĠĠĠ Ġ* Ġstandard ĠZip InputStream Ġif Ġnecessary Ġto Ġun compress Ġthe Ġfile ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġasset Path ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinput Ġstream Ġfor Ġthe Ġnamed Ġasset Ġpath , Ġor Ġnull Ġif Ġnot Ġfound ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget InputStream ( asset Path : ĠString ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! finished Indexing . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġhaven 't Ġfinished Ġindexing Ġyet , Ġso Ġget Ġit Ġfrom Ġslower Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Input Steam Un indexed ( asset Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm HashMap [ asset Path ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġentry Ġ&& Ġentry . zip File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . is Un compressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġentry . asset FileDescriptor !!. create InputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz f Ġ= Ġm Zip Files [ entry . zip File ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz i Ġ= Ġz f ?. getEntry ( asset Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġz i ) Ġreturn Ġz f . getInputStream ( zi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlo ge (" Failed Ġto Ġget Ġinput Ġstream : Ġ$ asset Path ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetNum Entries (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm HashMap . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġinput Ġstream Ġfor Ġasset Ġ[ asset Path ] Ġwhile Ġwe 're Ġnot Ġyet Ġindexed Ġ( by Ġenum er ating Ġzip Ġfiles ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Input Steam Un indexed ( asset Path : ĠString ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( zip File Ġin Ġm Zip Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zip File . key . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz i Ġ= Ġzip File . value . getEntry ( asset Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġz i ) Ġreturn Ġzip File . value . getInputStream ( zi ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndex Ġthe Ġfile Ġentries . ĠOpen s Ġthe Ġspecified Ġfile Ġread - only , Ġmemory - map Ġthe Ġentire Ġthing Ġand ĊĠĠĠĠ Ġ* Ġclose Ġthe Ġfile Ġbefore Ġreturning . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġindex File Entries ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRandom Access File ( file , Ġ" r "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Length Ġ= Ġit . length () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Length Ġ< Ġk E OC DL en ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Amount Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk Max EO CD Search . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Amount Ġ> Ġfile Length ) Ġread Amount Ġ= Ġfile Length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthis Ġis Ġa ĠZip Ġarchive . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . seek ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread 4 LE ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Ġ== Ġk EO CD Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found ĠZip Ġarchive , Ġbut Ġit Ġlooks Ġempty " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( header Ġ!= Ġk LF H Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Not Ġa ĠZip Ġarchive " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠPerform Ġthe Ġtraditional ĠE O CD Ġs ni pe Ġh unt . ĠWe 're Ġsearching Ġfor Ġthe ĠEnd ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġof ĠCentral ĠDirectory Ġmagic Ġnumber , Ġwhich Ġappears Ġat Ġthe Ġstart Ġof Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠE O CD Ġblock . ĠIt 's Ġfollowed Ġby Ġ 1 8 Ġbytes Ġof ĠE O CD Ġstuff Ġand Ġup Ġto Ġ 6 4 KB Ġof ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġarchive Ġcomment . ĠWe Ġneed Ġto Ġread Ġthe Ġlast Ġpart Ġof Ġthe Ġfile Ġinto Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbuffer , Ġdig Ġthrough Ġit Ġto Ġfind Ġthe Ġmagic Ġnumber , Ġparse Ġsome Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġout , Ġand Ġuse Ġthose Ġto Ġdetermine Ġthe Ġextent Ġof Ġthe ĠCD . ĠWe Ġstart Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġpulling Ġin Ġthe Ġlast Ġpart Ġof Ġthe Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Start Ġ= Ġfile Length Ġ- Ġread Amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . seek ( search Start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb buf Ġ= ĠByteBuffer . allocate ( read Amount . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġb buf . array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . read Fully ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb buf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠScan Ġbackward Ġfor Ġthe ĠE O CD Ġmagic . ĠIn Ġan Ġarchive Ġwithout Ġa Ġtrailing ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcomment , Ġwe 'll Ġfind Ġit Ġon Ġthe Ġfirst Ġtry . Ġ( We Ġmay Ġwant Ġto Ġconsider ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġdoing Ġan Ġinitial Ġminimal Ġread ; Ġif Ġwe Ġdon 't Ġfind Ġit , Ġretry Ġwith Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġsecond Ġread Ġas Ġabove .) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE O CD Ġ== Ġ 0 x 5 0 , Ġ 0 x 4 b , Ġ 0 x 0 5 , Ġ 0 x 0 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġe oc d Idx : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe oc d Idx Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . size Ġ- Ġk E OC DL en ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( e oc d Idx Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer [ e oc d Idx ] Ġ== Ġ 0 x 5 0 . to Byte () Ġ&& Ġb buf . getInt ( e oc d Idx ) Ġ== Ġk EO CD Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" +++ ĠFound ĠE O CD Ġat Ġindex : Ġ$ e oc d Idx Ġfor Ġfile Ġ${ file . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe oc d Idx -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e oc d Idx Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Zip : ĠE O CD Ġnot Ġfound , Ġ${ file . path } Ġis Ġnot Ġzip " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠGrab Ġthe ĠCD Ġoffset Ġand Ġsize , Ġand Ġthe Ġnumber Ġof Ġentries Ġin Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġarchive . ĠAfter Ġthat , Ġwe Ġcan Ġrelease Ġour ĠE O CD Ġh unt Ġbuffer . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Entries Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb buf . get Short ( e oc d Idx Ġ+ Ġk EO CD Num Entries ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb buf . getInt ( e oc d Idx Ġ+ Ġk EO CD Size ). to Long () Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Offset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb buf . getInt ( e oc d Idx Ġ+ Ġk EO CD File Offset ). to Long () Ġand Ġ 0 xffffffff L ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVerify Ġthat Ġthey Ġlook Ġreasonable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Offset Ġ+ Ġdir Size Ġ> Ġfile Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bad Ġoffsets Ġ( dir Ġ$ dir Offset , Ġsize Ġ$ dir Size , Ġe oc d Ġ$ e oc d Idx )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( num Entries Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" empty Ġarchive ?" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" +++ Ġnum Entries =$ num Entries Ġdir Size =$ dir Size Ġdir Offset =$ dir Offset Ġfor Ġfile Ġ${ file . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Map Ġ= Ġit . channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( File Channel . Map Mode . READ _ ONLY , Ġdir Offset , Ġdir Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Buf Ġ= ĠByteArray ( 0 xffff ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠWalk Ġthrough Ġthe Ġcentral Ġdirectory , Ġadding Ġentries Ġto Ġthe Ġhash Ġtable . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Offset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAllocate Ġthe Ġlocal Ġdirectory Ġinformation ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteBuffer . allocate ( k LF H Len ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( directory Map . getInt ( current Offset ) Ġ!= Ġk C DE Signature ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog w ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Mis sed Ġa Ġcentral Ġdir Ġsig Ġ( at Ġ$ current Offset )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġuseful Ġstuff Ġfrom Ġthe Ġdirectory Ġentry Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfileName Len : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . get Short ( current Offset Ġ+ Ġk C DE Name Len ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Len : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . get Short ( current Offset Ġ+ Ġk C DE Extra Len ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment Len : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . get Short ( current Offset Ġ+ Ġk C DE Comment Len ). toInt () Ġand Ġ 0 xffff ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġget Ġthe ĠC DE Ġfilename Ġ*/ directory Map . position ( current Offset Ġ+ Ġk C DE Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map [ temp Buf , Ġ 0 , ĠfileName Len ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . position ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠUTF - 8 Ġon ĠAndroid Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠString ( temp Buf , Ġ 0 , ĠfileName Len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( LOG V ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Filename : Ġ$ str " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġze Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip Entry RO ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . get Short ( current Offset Ġ+ Ġk C DE Method ). toInt () Ġand Ġ 0 xffff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m When Modified Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . getInt ( current Offset Ġ+ Ġk C DE Mod When ). to Long () Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m CRC 3 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . getLong ( current Offset Ġ+ Ġk C DE CRC ) Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m Compressed Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . getLong ( current Offset Ġ+ Ġk C DE Comp Len ) Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m Un compressed Length Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . getLong ( current Offset Ġ+ Ġk C DE Un comp Len ) Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . m Local Hdr Offset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Map . getInt ( current Offset Ġ+ Ġk C DE Local Offset ). to Long () Ġand Ġ 0 xffffffff L ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġoffsets ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġze . set Offset FromFile ( it , Ġbuf ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġput Ġfile Ġinto Ġhash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLock Ġto Ġallow Ġfor Ġconcurrent Ġpopulation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm HashMap [ str ] Ġ= Ġze ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgo Ġto Ġnext Ġdirectory Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Offset Ġ+= Ġk C DE Len Ġ+ ĠfileName Len Ġ+ Ġextra Len Ġ+ Ġcomment Len ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog v ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" +++ Ġzip Ġgood Ġscan Ġ$ num Entries Ġentries Ġfor Ġfile Ġ${ file . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndexes Ġfiles Ġasync . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġindex Files Async ( zip File Names : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( fileName Ġin Ġzip File Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex File Entries ( File ( fileName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo ge (" Error Ġindexing Ġfile : Ġ$ fileName ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog v (" Finished Ġprocessing Ġzip Ġfiles ") ĊĠĠĠĠĠĠĠ Ġfinished Indexing . set ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Zip Files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Zip Files . clear () ĊĠĠĠĠĠĠĠ Ġm HashMap . clear () ĊĠĠĠĠĠĠĠ Ġfinished Indexing . set ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( fileName Ġin Ġzip File Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog i (" Opening Ġzip Ġfile Ġ$ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġz f Ġ= ĠZip File ( file , ĠZip File . OPEN _ READ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Zip Files [ file ] Ġ= Ġz f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog i (" Added Ġzip Ġfile Ġ$ fileName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlo ge (" Error Ġprocessing Ġfile : Ġ$ fileName ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAs ynchronously Ġindex Ġfiles ĊĠĠĠĠĠĠĠ Ġlifecycle Coroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Files Async ( zip File Names ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRead - only Ġaccess Ġto ĠZip Ġarch ives , Ġwith Ġminimal Ġheap Ġallocation . ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLOG V Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 - byte Ġnumber ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġswap Endian ( i : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ(( i Ġand Ġ 0 xff Ġshl Ġ 2 4 ) Ġ+ Ġ( i Ġand Ġ 0 xff 0 0 Ġshl Ġ 8 ) Ġ+ Ġ( i Ġand Ġ 0 xff 0 0 0 0 Ġ ush r Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ( i Ġ ush r Ġ 2 4 Ġand Ġ 0 xff )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠZip Ġfile Ġconstants ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk EO CD Signature Ġ= Ġ 0 x 0 6 0 5 4 b 5 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk E OC DL en Ġ= Ġ 2 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk EO CD Num Entries Ġ= Ġ 8 Ġ// Ġoffset Ġto Ġ# of Ġentries Ġin Ġfile ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk EO CD Size Ġ= Ġ 1 2 Ġ// Ġsize Ġof Ġthe Ġcentral Ġdirectory ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk EO CD File Offset Ġ= Ġ 1 6 Ġ// Ġoffset Ġto Ġcentral Ġdirectory ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval Ġk Max Comment Len Ġ= Ġ 6 5 5 3 5 Ġ// Ġlongest Ġpossible Ġin Ġushort ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk Max EO CD Search Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk Max Comment Len Ġ+ Ġk E OC DL en ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk LF H Signature Ġ= Ġ 0 x 0 4 0 3 4 b 5 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk LF H Len Ġ= Ġ 3 0 Ġ// Ġexcluding Ġvariable - len Ġfields ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk LF H Name Len Ġ= Ġ 2 6 Ġ// Ġoffset Ġto Ġfilename Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk LF H Extra Len Ġ= Ġ 2 8 Ġ// Ġoffset Ġto Ġextra Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Signature Ġ= Ġ 0 x 0 2 0 1 4 b 5 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Len Ġ= Ġ 4 6 Ġ// Ġexcluding Ġvariable - len Ġfields ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Method Ġ= Ġ 1 0 Ġ// Ġoffset Ġto Ġcompression Ġmethod ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Mod When Ġ= Ġ 1 2 Ġ// Ġoffset Ġto Ġmodification Ġtimestamp ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE CRC Ġ= Ġ 1 6 Ġ// Ġoffset Ġto Ġentry ĠCRC ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Comp Len Ġ= Ġ 2 0 Ġ// Ġoffset Ġto Ġcompressed Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Un comp Len Ġ= Ġ 2 4 Ġ// Ġoffset Ġto Ġun compressed Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Name Len Ġ= Ġ 2 8 Ġ// Ġoffset Ġto Ġfilename Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Extra Len Ġ= Ġ 3 0 Ġ// Ġoffset Ġto Ġextra Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Comment Len Ġ= Ġ 3 2 Ġ// Ġoffset Ġto Ġcomment Ġlength ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk C DE Local Offset Ġ= Ġ 4 2 Ġ// Ġoffset Ġto Ġlocal Ġhdr ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġk Compress Stored Ġ= Ġ 0 Ġ// Ġno Ġcompression ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( EOF Exception :: class , ĠIOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread 4 LE ( f : ĠRandom Access File ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġswap Endian ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }