package Ġnet . tor val d . ter rar um . save game Ċ Ċ import Ġjava . io .* Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util .* Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . zip . GZIP InputStream Ċ import Ġjava . util . zip . GZIP OutputStream Ċ import Ġkotlin . experimental . and Ċ Ċ /** Ċ Ġ* ĠTemp or arily Ġdisabling Ġon - disk Ġcompression ; Ġit Ġsomehow Ġdoes Ġnot Ġwork , Ġcompress Ġthe Ġfiles Ġby Ġyourself ! Ċ Ġ* Ċ Ġ* ĠCreated Ġby Ġmin ja es ong Ġon Ġ 2 0 1 7 - 0 4 - 0 1 . Ċ Ġ*/ Ċ object ĠV D Util Ġ{ ĊĊĠĠĠ Ġfun ĠFile . write Bytes 6 4 ( array : Ġnet . tor val d . ter rar um . save game . ByteArray 6 4 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarray . write ToFile ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠFile . read Bytes 6 4 (): Ġnet . tor val d . ter rar um . save game . ByteArray 6 4 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġin bytes Ġ= Ġnet . tor val d . ter rar um . save game . ByteArray 6 4 ( this . length ()) ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠBuffered InputStream ( FileInputStream ( this )) ĊĠĠĠĠĠĠĠ Ġvar Ġread Int Ġ= ĠinputStream . read () ĊĠĠĠĠĠĠĠ Ġvar Ġread In Counter Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġwhile Ġ( readInt Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin bytes [ read In Counter ] Ġ= Ġread Int . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread In Counter Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Int Ġ= ĠinputStream . read () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠinputStream . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġin bytes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdump To Real Machine ( disk : ĠVirtual Disk , Ġoutfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutfile . write Bytes 6 4 ( disk . serialize (). array ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ PRINT _ READ Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġserial ised Ġbinary Ġand Ġreturns Ġcorresponding ĠVirtual Disk Ġinstance . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcrc Warn Level ĠLevel . OFF Ġ-- Ġno Ġwarning , ĠLevel . WARNING Ġ-- Ġprint Ġout Ġwarning , ĠLevel . SEVERE Ġ-- Ġthrow Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġread Disk Archive ( infile : ĠFile , Ġcrc Warn Level : ĠLevel Ġ= ĠLevel . SEVERE , Ġwarning Func : Ġ(( String ) Ġ-> ĠUnit )? Ġ= Ġnull ): ĠVirtual Disk Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġin bytes Ġ= Ġinfile . read Bytes 6 4 () ĊĊĊĊĠĠĠĠĠĠĠ Ġif Ġ( magic Mismatch ( Virtual Disk . MAGIC , Ġin bytes . slice Array 6 4 ( 0 L .. 3 L ). toByteArray ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Invalid ĠVirtual ĠDisk Ġfile !") ĊĊĠĠĠĠĠĠĠ Ġval Ġdisk Size Ġ= Ġin bytes . slice Array 6 4 ( 4 L .. 9 L ). toInt 4 8 Big () ĊĠĠĠĠĠĠĠ Ġval Ġdisk Name Ġ= Ġin bytes . slice Array ( 1 0 .. 1 0 Ġ+ Ġ 3 1 ) Ġ+ Ġin bytes . slice Array ( 1 0 + 3 2 + 2 2 .. 1 0 + 3 2 + 2 2 + 2 3 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġdisk CRC Ġ= Ġin bytes . slice Array 6 4 ( 1 0 L Ġ+ Ġ 3 2 .. 1 0 L Ġ+ Ġ 3 2 Ġ+ Ġ 3 ). toInt Big () Ġ// Ġto Ġcheck Ġwith Ġcompleted Ġv disk ĊĠĠĠĠĠĠĠ Ġval Ġdisk Spec Version Ġ= Ġin bytes [ 1 0 L Ġ+ Ġ 3 2 Ġ+ Ġ 4 ] ĊĠĠĠĠĠĠĠ Ġval Ġfoot ers Ġ= Ġin bytes . slice Array 6 4 ( 1 0 L + 3 2 + 6 .. 1 0 L + 3 2 + 2 1 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( disk Spec Version Ġ!= Ġspec version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unsupported Ġdisk Ġformat Ġversion : Ġcurrent Ġinternal Ġversion Ġis Ġ$ spec version ; Ġthe Ġfile 's Ġversion Ġis Ġ$ disk Spec Version ") ĊĊĠĠĠĠĠĠĠ Ġval Ġv disk Ġ= ĠVirtual Disk ( disk Size , Ġdisk Name , Ġinfile ) ĊĊĠĠĠĠĠĠĠ Ġv disk .__ internal Set Footer __( foot ers ) ĊĊĠĠĠĠĠĠĠ Ġ// println ("[ VD Util ] Ġcurrent Unix time Ġ= Ġ$ current Unix time ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġentry Offset Ġ= ĠVirtual Disk . HEADER _ SIZE ĊĠĠĠĠĠĠĠ Ġ// Ġnot Ġfooter , Ġentries ĊĠĠĠĠĠĠĠ Ġwhile Ġ( entry Offset Ġ< Ġin bytes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ VD Util ] Ġentry Offset Ġ= Ġ$ entry Offset ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġand Ġprepare Ġall Ġthe Ġsh its ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry ID Ġ= Ġin bytes . slice Array 6 4 ( entry Offset .. entry Offset Ġ+ Ġ 7 ). to Long Big () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Parent ID Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ Ġ 8 .. entry Offset Ġ+ Ġ 1 5 ). to Long Big () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Type Flag Ġ= Ġin bytes [ entry Offset Ġ+ Ġ 1 6 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Creation Time Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ Ġ 2 0 .. entry Offset Ġ+ Ġ 2 5 ). toInt 4 8 Big () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Modify Time Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ Ġ 2 6 .. entry Offset Ġ+ Ġ 3 1 ). toInt 4 8 Big () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry CRC Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ Ġ 3 2 .. entry Offset Ġ+ Ġ 3 5 ). toInt Big () Ġ// Ġto Ġcheck Ġwith Ġcompleted Ġentry ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Data Ġ= Ġwhen Ġ( entry Type Flag Ġand Ġ 1 2 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . NORMAL _ FILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile size Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE .. entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 5 ). toInt 4 8 Big () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ VD Util ] Ġ--> Ġis Ġfile ; Ġfile size Ġ= Ġ$ filesize ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 6 .. entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 5 Ġ+ Ġfile size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . DIRECTORY ĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Count Ġ= Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE .. entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 3 ). toInt Big () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("[ VD Util ] Ġ--> Ġis Ġdirectory ; Ġentry Count Ġ= Ġ$ entry Count ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 4 .. entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 3 Ġ+ Ġentry Count Ġ* Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . SY ML INK ĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin bytes . slice Array 6 4 ( entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE .. entry Offset Ġ+ ĠDisk Entry . HEADER _ SIZE Ġ+ Ġ 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġentry Ġwith Ġtype Ġ$ entry Type Flag Ġat Ġentry Offset Ġ$ entry Offset ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ PRINT _ READ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ save game . VD Util ] Ġ== ĠEntry Ġde serial ise Ġdebug print Ġfor Ġentry ĠID Ġ$ entry ID Ġ( child Ġof Ġ$ entry Parent ID )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Entry Ġtype Ġflag : Ġ${ entry Type Flag Ġand Ġ 1 2 7 }${ if Ġ( entry Type Flag Ġ< Ġ 0 ) Ġ"*" Ġelse Ġ"" }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Entry Ġraw Ġcontents Ġbytes : Ġ( len : Ġ${ entry Data . size }) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Data . forEach Indexed Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ> Ġ 0 Ġ&& Ġi Ġ% Ġ 8 Ġ== Ġ 0 L ) Ġprint (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( i Ġ> Ġ 0 Ġ&& Ġi Ġ% Ġ 4 Ġ== Ġ 0 L ) Ġprint ("_ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( it . toInt (). to Hex (). substring ( 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}; Ġprintln () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġupdate Ġentry Offset Ġso Ġthat Ġwe Ġcan Ġfetch Ġnext Ġentry Ġin Ġthe Ġbinary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Offset Ġ+= ĠDisk Entry . HEADER _ SIZE Ġ+ Ġentry Data . size Ġ+ Ġwhen Ġ( entry Type Flag Ġand Ġ 1 2 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . NORMAL _ FILE Ġ-> Ġ 6 ĠĠĠĠĠ Ġ// ĠP LEASE ĠDO ĠREFER ĠTO ĠSpec . md ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . DIRECTORY ĠĠ Ġ-> Ġ 4 ĠĠĠĠĠ Ġ// ĠP LEASE ĠDO ĠREFER ĠTO ĠSpec . md ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDisk Entry . SY ML INK ĠĠĠĠ Ġ-> Ġ 0 ĠĠĠĠĠ Ġ// ĠP LEASE ĠDO ĠREFER ĠTO ĠSpec . md ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġentry Ġwith Ġtype Ġ$ entry Type Flag ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġfor Ġthe Ġdiscard Ġbit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Type Flag Ġ> Ġ 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisk Entry Ġ= ĠDisk Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry ID Ġ= Ġentry ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Entry ID Ġ= Ġentry Parent ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= Ġentry Creation Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Date Ġ= Ġentry Modify Time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents Ġ= Ġif Ġ( entry Type Flag Ġ== ĠDisk Entry . NORMAL _ FILE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntry File ( entry Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( entry Type Flag Ġ== ĠDisk Entry . DIRECTORY ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry List Ġ= ĠArrayList < Entry ID >() ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġentry Data . size Ġ/ Ġ 8 ). forEach Ġ{ Ġcnt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry List . add ( entry Data . slice Array 6 4 ( 8 Ġ* Ġcnt Ġuntil Ġ 8 Ġ* Ġ( cnt + 1 )). to Long Big ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry List . sort () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Directory ( entry List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( entry Type Flag Ġ== ĠDisk Entry . SY ML INK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntry S ymlink ( entry Data . to Long Big ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unknown Ġentry Ġwith Ġtype Ġ$ entry Type Flag ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck ĠCRC Ġof Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crc Warn Level Ġ== ĠLevel . SEVERE Ġ|| Ġcrc Warn Level Ġ== ĠLevel . WARNING ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtest Ġprint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ PRINT _ READ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest byte z Ġ= Ġdisk Entry . contents . serialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest bytes Ġ= Ġtest byte z . array ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( disk Entry . contents Ġas ? ĠEntry Directory )?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" entry : Ġ${ it . to Hex () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ save game . VD Util ] Ġbytes Ġto Ġcalculate Ġcrc Ġagainst :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest bytes . forEach Indexed Ġ{ Ġi , Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ% Ġ 4 Ġ== Ġ 0 L ) Ġprint (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint ( it . toInt (). to Hex (). substring ( 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("\ n CRC : Ġ" Ġ+ Ġtest byte z . get CRC 3 2 (). to Hex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġend Ġof Ġtest Ġprint ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalculated CRC Ġ= Ġdisk Entry . contents . serialize (). get CRC 3 2 () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc Msg Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" CRC Ġfailed : Ġstored Ġvalue Ġis Ġ${ entry CRC . to Hex ()}, Ġbut Ġcalculated Ġvalue Ġis Ġ${ calculated CRC . to Hex () }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" at Ġfile Ġ\" ${ disk ID to Readable Filename ( disk Entry . entry ID )} \" Ġ( entry ĠID Ġ${ disk Entry . entry ID })" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( calculated CRC Ġ!= Ġentry CRC ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ save game . VD Util ] ĠCRC Ġfailed ; Ġentry Ġinfo :\ n $ disk Entry ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crc Warn Level Ġ== ĠLevel . SEVERE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( crc Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( warning Func Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Func ( crc Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġentry Ġto Ġdisk ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv disk . entries [ entry ID ] Ġ= Ġdisk Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ PRINT _ READ ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("[ save game . VD Util ] ĠDis card ing Ġentry Ġ${ entry ID . to Hex ()} Ġ( raw Ġtype Ġflag : Ġ$ entry Type Flag )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠArray Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" An Ġerror Ġoccurred Ġwhile Ġreading Ġa Ġfile Ġ( entry ID : Ġ$ entry ID Ġ(${ disk ID to Readable Filename ( entry ID )} ), Ġtype Flag : Ġ$ entry Type Flag )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Stack Ġtrace :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck ĠCRC Ġof Ġdisk ĊĠĠĠĠĠĠĠ Ġif Ġ( crc Warn Level Ġ== ĠLevel . SEVERE Ġ|| Ġcrc Warn Level Ġ== ĠLevel . WARNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalculated CRC Ġ= Ġv disk . hashCode () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrc Msg Ġ= Ġ" Disk ĠCRC Ġfailed : Ġexpected Ġ${ disk CRC . to Hex ()}, Ġgot Ġ${ calculated CRC . to Hex () }" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( calculated CRC Ġ!= Ġdisk CRC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( crc Warn Level Ġ== ĠLevel . SEVERE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( crc Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( warning Func Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwarning Func ( crc Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġv disk ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġis File ( disk : ĠVirtual Disk , Ġentry ID : ĠEntry ID ) Ġ= Ġdisk . entries [ entry ID ]?. contents Ġis ĠEntry File ĊĠĠĠ Ġfun Ġis Directory ( disk : ĠVirtual Disk , Ġentry ID : ĠEntry ID ) Ġ= Ġdisk . entries [ entry ID ]?. contents Ġis ĠEntry Directory ĊĠĠĠ Ġfun Ġis S ymlink ( disk : ĠVirtual Disk , Ġentry ID : ĠEntry ID ) Ġ= Ġdisk . entries [ entry ID ]?. contents Ġis ĠEntry S ymlink ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġlist Ġof Ġentries Ġof Ġdirectory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Directory Entries ( disk : ĠVirtual Disk , Ġdir To Search : ĠDisk Entry ): ĠArray < Disk Entry > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dir To Search . contents Ġ! is ĠEntry Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" The Ġentry Ġis Ġnot Ġdirectory ") ĊĊĠĠĠĠĠĠĠ Ġval Ġentries List Ġ= ĠArrayList < Disk Entry >() ĊĠĠĠĠĠĠĠ Ġdir To Search . contents . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġdisk . entries [ it ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ!= Ġnull ) Ġentries List . add ( entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġentries List . to Typed Array () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġlist Ġof Ġentries Ġof Ġdirectory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Directory Entries ( disk : ĠVirtual Disk , Ġentry ID : ĠEntry ID ): ĠArray < Disk Entry > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry Ġ= Ġdisk . entries [ entry ID ] ĊĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Entry Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Directory Entries ( disk , Ġentry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSYN OPSIS Ġ Ġdisk . getFile (" bin / m sh . lua ") !!. file . getAs Normal File ( disk ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse ĠVirtual Disk . getAs Normal File ( path ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠDisk Entry . getAs Normal File ( disk : ĠVirtual Disk ): ĠEntry File Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . contents Ġas ? ĠEntry File Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . contents Ġis ĠEntry Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" this Ġis Ġdirectory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( this . contents Ġis ĠEntry S ymlink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ this . contents . target ] !!. getAs Normal File ( disk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unknown Ġentry Ġtype ") ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSYN OPSIS Ġ Ġdisk . getFile (" bin / m sh . lua ") !!. first . getAs Normal File ( disk ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUse ĠVirtual Disk . getAs Normal File ( path ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠDisk Entry . getAs Directory ( disk : ĠVirtual Disk ): ĠEntry Directory Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . contents Ġas ? ĠEntry Directory Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . contents Ġis ĠEntry S ymlink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ this . contents . target ] !!. getAs Directory ( disk ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( this . contents Ġis ĠEntry File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" this Ġis Ġnot Ġdirectory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unknown Ġentry Ġtype ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFetch Ġthe Ġfile Ġand Ġreturns Ġa Ġinstance Ġof Ġnormal Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget As Normal File ( disk : ĠVirtual Disk , Ġentry Index : ĠEntry ID ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ entry Index ] !!. getAs Normal File ( disk ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFetch Ġthe Ġfile Ġand Ġreturns Ġa Ġinstance Ġof Ġdirectory . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget As Directory ( disk : ĠVirtual Disk , Ġentry Index : ĠEntry ID ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ entry Index ] !!. getAs Directory ( disk ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġfile Ġon Ġthe Ġdisk Ġsafely . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete File ( disk : ĠVirtual Disk , Ġtarget ID : ĠEntry ID ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdisk . check ReadOnly () ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdisk . entries [ target ID ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" No Ġsuch Ġfile Ġto Ġdelete ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparent ID Ġ= Ġfile . parent Entry ID ĊĠĠĠĠĠĠĠ Ġval Ġparent Dir Ġ= Ġget As Directory ( disk , Ġparent ID ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġrollback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! disk . entries . contains ( target ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ target ID ] Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parent Dir . contains ( target ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Dir . add ( target ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġdirectory Ġ" parent ID " Ġhas Ġ" target ID " Ġin Ġthe Ġfirst Ġplace ĊĠĠĠĠĠĠĠ Ġif Ġ(! directory Contains ( disk , Ġparent ID , Ġtarget ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" No Ġsuch Ġfile Ġto Ġdelete ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( target ID Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Cannot Ġdelete Ġroot Ġfile Ġsystem ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdelete Ġfile Ġrecord ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries . remove ( target ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġun list Ġfile Ġfrom Ġparent Ġdirectly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Dir . remove ( target ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrollback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" Unknown Ġerror Ġ* s igh * ĠIt 's Ġannoying , ĠI Ġknow .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġthe Ġname Ġof Ġthe Ġentry . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrename File ( disk : ĠVirtual Disk , Ġfile ID : ĠEntry ID , Ġnew ID : ĠEntry ID , Ġcharset : ĠCharset ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġdisk . entries [ file ID ] ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . entry ID Ġ= Ġnew ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġfile Ġto Ġthe Ġspecified Ġdirectory . ĊĠĠĠĠ Ġ* ĠThe Ġfile Ġwill Ġget Ġnew ĠEntry ID Ġand Ġits ĠParent ID Ġwill Ġbe Ġoverwritten . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd File ( disk : ĠVirtual Disk , Ġfile : ĠDisk Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdisk . entries [ file . entry ID ] Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġfile . parent Entry ID Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠV D Util . getAs Directory ( disk , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! dir . contains ( file . entry ID )) Ġdir . add ( file . entry ID ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrandom Base 6 2 ( length : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġglyph s Ġ= Ġ" abcdefgh ijkl mnopqrst uvw xyz ABCDEF GH IJ KL MN OP Q RST UV W XYZ 1 2 3 4 5 6 7 8 9 0 " ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġkotlin . repeat ( length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( glyph s [( Math . random () Ġ* Ġglyph s . length ). toInt ()]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġfully Ġqualified ĠDisk Entry Ġto Ġthe Ġdisk , Ġusing Ġfile 's Ġown Ġand Ġits Ġparent Ġentry ID . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIt 's Ġyour Ġjob Ġto Ġensure Ġno ĠID Ġcollision . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġregister File ( disk : ĠVirtual Disk , Ġfile : ĠDisk Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdisk . check ReadOnly () ĊĠĠĠĠĠĠĠ Ġdisk . check Capacity ( file . serial ised Size ) ĊĊĠĠĠĠĠĠĠ ĠV D Util . getAs Directory ( disk , Ġfile . parent Entry ID ). add ( file . entry ID ) ĊĠĠĠĠĠĠĠ Ġdisk . entries [ file . entry ID ] Ġ= Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġfile Ġto Ġthe Ġspecified Ġdirectory . ĠParent ID Ġof Ġthe Ġfile Ġwill Ġbe Ġoverwritten . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd File ( disk : ĠVirtual Disk , Ġdirectory ID : ĠEntry ID , Ġfile : ĠDisk Entry ) Ġ{// }, Ġcompress The File : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdisk . check ReadOnly () ĊĠĠĠĠĠĠĠ Ġdisk . check Capacity ( file . serial ised Size ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgenerate Ġnew ĠID Ġfor Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . entry ID Ġ= Ġdisk . generate Unique ID () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġrecord Ġto Ġthe Ġdirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget As Directory ( disk , Ġdirectory ID ). add ( file . entry ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG zip Ġfat Ġboy Ġif Ġmarked Ġas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* if Ġ( compress The File Ġ&& Ġfile . contents Ġis ĠEntry File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbo Ġ= ĠByteArray 6 4 Grow able OutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzo Ġ= ĠG ZIP OutputStream ( bo ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġzip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . contents . bytes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzo . write ( it . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzo . flush (); Ġzo . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Content Ġ= ĠEntry File Compressed ( file . contents . bytes . size , Ġbo . toByteArray 6 4 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Entry Ġ= ĠDisk Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . entry ID , Ġfile . parent Entry ID , Ġfile . filename , Ġfile . creation Date , Ġfile . modification Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ file . entry ID ] Ġ= Ġnew Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġthe Ġadd Ġthe Ġboy Ġto Ġthe Ġhouse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries [ file . entry ID ] Ġ= Ġfile ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġthis Ġboy Ġrecogn ise Ġhis Ġnew Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . parent Entry ID Ġ= Ġdirectory ID ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠKotlin NullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" No Ġsuch Ġdirectory ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠImports Ġexternal Ġfile Ġand Ġreturns Ġcorresponding ĠDisk Entry . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġimport File ( file : ĠFile , Ġnew ID : ĠEntry ID , Ġcharset : ĠCharset ): ĠDisk Entry Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" The Ġfile Ġis Ġa Ġdirectory ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDisk Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry ID Ġ= Ġnew ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Entry ID Ġ= Ġ 0 , Ġ// Ġplaceholder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= Ġcurrent Unix time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Date Ġ= Ġcurrent Unix time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents Ġ= ĠEntry File ( file . read Bytes 6 4 ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExport Ġfile Ġon Ġthe Ġvirtual Ġdisk Ġinto Ġreal Ġdisk . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexport File ( entry File : ĠEntry File , Ġoutfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutfile . createNew File () ĊĊĠĠĠĠĠĠĠ Ġ/* if Ġ( entry File Ġis ĠEntry File Compressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry File . bytes . forEach B anks Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( outfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠIn flater OutputStream ( fos ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . write ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinflater . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse */ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutfile . write Bytes 6 4 ( entry File . bytes ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġnew Ġdisk Ġwith Ġgiven Ġname Ġand Ġcapacity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate New Disk ( disk Size : ĠLong , Ġdisk Name : ĠString , Ġcharset : ĠCharset ): ĠVirtual Disk Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew disk Ġ= ĠVirtual Disk ( disk Size , Ġdisk Name . to Entry Name ( Virtual Disk . NAME _ LENGTH , Ġcharset )) ĊĠĠĠĠĠĠĠ Ġval Ġroot Dir Ġ= ĠDisk Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry ID Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Entry ID Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreation Date Ġ= Ġcurrent Unix time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Date Ġ= Ġcurrent Unix time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontents Ġ= ĠEntry Directory () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġnew disk . entries [ 0 ] Ġ= Ġroot Dir ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew disk ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġexception Ġif Ġthe Ġdisk Ġis Ġread - only ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠVirtual Disk . check ReadOnly () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . is ReadOnly ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Disk Ġis Ġread - only ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġexception Ġif Ġspecified Ġsize Ġcannot Ġfit Ġinto Ġthe Ġdisk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠVirtual Disk . check Capacity ( new Size : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . used Bytes Ġ+ Ġnew Size Ġ> Ġthis . capacity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Not Ġenough Ġspace Ġon Ġthe Ġdisk ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠByteArray 6 4 . toInt Big (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . size Ġ!= Ġ 4 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" ByteArray Ġis Ġnot ĠInt ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġbyte Ġ-> Ġi Ġ= Ġi Ġor Ġbyte . to Uint (). sh l ( 2 4 Ġ- Ġc Ġ* Ġ 8 ); Ġc Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠByteArray 6 4 . to Long Big (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . size Ġ!= Ġ 8 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" ByteArray Ġis Ġnot ĠLong ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġbyte Ġ-> Ġi Ġ= Ġi Ġor Ġbyte . to U long (). sh l ( 5 6 Ġ- Ġc Ġ* Ġ 8 ); Ġc Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠByteArray 6 4 . toInt 4 8 Big (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . size Ġ!= Ġ 6 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" ByteArray Ġis Ġnot ĠLong ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġvar Ġc Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġbyte Ġ-> Ġi Ġ= Ġi Ġor Ġbyte . to U long (). sh l ( 4 0 Ġ- Ġc Ġ* Ġ 8 ); Ġc Ġ+= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠByteArray 6 4 . to Short Big (): ĠShort Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . size Ġ!= Ġ 2 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnsupportedOperationException (" ByteArray Ġis Ġnot ĠShort ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( this [ 0 ]. to Uint (). sh l ( 2 5 6 ) Ġ+ Ġthis [ 1 ]. to Uint ()). to Short () ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠString . sanit ise Path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Chars Ġ= ĠRegex (""" [ <> :" | ? *\ u 0 0 0 0 -\ u 0 0 1 F ] """) ĊĠĠĠĠĠĠĠ Ġif Ġ( this . contains ( invalid Chars )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" path Ġcontains Ġinvalid Ġcharacters ") ĊĊĠĠĠĠĠĠĠ Ġval Ġpath 1 Ġ= Ġthis . replace ('\\ ', Ġ'/') ĊĠĠĠĠĠĠĠ Ġreturn Ġpath 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresolve If S ymlink ( disk : ĠVirtual Disk , Ġindex Number : ĠEntry ID , Ġrecurse : ĠBoolean Ġ= Ġfalse ): ĠDisk Entry Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġentry : ĠDisk Entry ? Ġ= Ġdisk . entries [ index Number ] ĊĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ== Ġnull ) Ġthrow ĠIOException (" File Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġif Ġ( entry . contents Ġ! is ĠEntry S ymlink ) Ġreturn Ġentry ĊĠĠĠĠĠĠĠ Ġif Ġ( recur se ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( entry !!. contents Ġis ĠEntry S ymlink ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġdisk . entries [( entry . contents Ġas ĠEntry S ymlink ). target ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ== Ġnull ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġdisk . entries [( entry . contents Ġas ĠEntry S ymlink ). target ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( entry Ġ== Ġnull ) Ġthrow ĠIOException (" Point ing Ġfile Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġreturn Ġentry ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent Unix time : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ĊĊĠĠĠ Ġfun Ġdirectory Contains ( disk : ĠVirtual Disk , Ġdir ID : ĠEntry ID , Ġtarget ID : ĠEntry ID ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġresolve If S ymlink ( disk , Ġdir ID ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( dir . contents Ġ! is ĠEntry Directory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" Not Ġa Ġdirectory ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdir . contents . contains ( target ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS ear ches Ġfor Ġdisconnected Ġnodes Ġusing Ġits Ġparent Ġpointer . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġparent Ġnode Ġis Ġinvalid , Ġthe Ġnode Ġis Ġconsidered Ġorphan , Ġand Ġwill Ġbe Ġadded ĊĠĠĠĠ Ġ* Ġto Ġthe Ġlist Ġthis Ġfunction Ġreturns . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġorphan Ġentries ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgc Search Or phan ( disk : ĠVirtual Disk ): ĠList < Entry ID > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdisk . entries . filter Ġ{ Ġdisk . entries [ it . value . parent Entry ID ] Ġ== Ġnull Ġ}. keys . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS ear ches Ġfor Ġnull - point ing Ġentries Ġ( phantom s ) Ġwithin Ġevery Ġdirectory . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġsearch Ġresults , Ġwhich Ġis ĠPair ( directory Ġthat Ġcontains Ġnull Ġpointer , Ġnull Ġpointer ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgc Search Ph antom B aby ( disk : ĠVirtual Disk ): ĠList < Pair < Entry ID , ĠEntry ID >> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPair < Directory ID , ĠID Ġof Ġph antom Ġin Ġthe Ġdirectory > ĊĠĠĠĠĠĠĠ Ġval Ġph antom s Ġ= ĠArrayList < Pair < Entry ID , ĠEntry ID >>() ĊĠĠĠĠĠĠĠ Ġdisk . entries . filter Ġ{ Ġit . value . contents Ġis ĠEntry Directory Ġ}. values . forEach Ġ{ Ġdirectory Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( directory . contents Ġas ĠEntry Directory ). forEach Ġ{ Ġdir Entry ID Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( disk . entries [ dir Entry ID ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġph antom s . add ( Pair ( directory . entry ID , Ġdir Entry ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġph antom s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgc Dump Or ph ans ( disk : ĠVirtual Disk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgc Search Or phan ( disk ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" Aw , Ġsnap !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgc Dump All ( disk : ĠVirtual Disk ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgc Search Ph antom B aby ( disk ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget As Directory ( disk , Ġit . first ). remove ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgc Search Or phan ( disk ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk . entries . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Error (" Aw , Ġsnap !") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompress ( ba : ĠByteArray 6 4 ) Ġ= Ġcompress ( ba . iterator ()) ĊĠĠĠ Ġfun Ġcompress ( byte Iterator : ĠIterator < Byte >): ĠByteArray 6 4 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbo Ġ= ĠByteArray 6 4 Grow able OutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġzo Ġ= ĠG ZIP OutputStream ( bo ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġzip ĊĠĠĠĠĠĠĠ Ġbyte Iterator . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzo . write ( it . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġzo . flush (); Ġzo . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġbo . toByteArray 6 4 () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġde compress ( bytes : ĠByteArray 6 4 ): ĠByteArray 6 4 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunzip d Bytes Ġ= ĠByteArray 6 4 () ĊĠĠĠĠĠĠĠ Ġval Ġz i Ġ= ĠG ZIP InputStream ( ByteArray 6 4 InputStream ( bytes )) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Ġ= Ġz i . read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunzip d Bytes . add ( byte . to Byte ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġz i . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġunzip d Bytes ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠByte . to Uint () Ġ= Ġjava . lang . Byte . to Unsigned Int ( this ) Ċ fun ĠByte . to U long () Ġ= Ġjava . lang . Byte . to Unsigned Long ( this ) Ċ fun Ġmagic Mismatch ( magic : ĠByteArray , Ġarray : ĠByteArray ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ! Arrays . equals ( array , Ġmagic ) Ċ } Ċ fun ĠString . to Entry Name ( length : ĠInt , Ġcharset : ĠCharset ): ĠByteArray Ġ{ ĊĠĠĠ Ġval Ġbuffer Ġ= ĠAppend able ByteBuffer ( length . to Long ()) ĊĠĠĠ Ġval Ġstring ByteArray Ġ= Ġthis . toByteArray ( charset ) ĊĠĠĠ Ġbuffer . put ( string ByteArray . slice Array ( 0 .. min Of ( length , Ġstring ByteArray . size ) Ġ- Ġ 1 )) ĊĠĠĠ Ġreturn Ġbuffer . array . toByteArray () Ċ } Ċ fun ĠByteArray . to Canonical String ( charset : ĠCharset ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġlast IndexOf Real Str Ġ= Ġ 0 ĊĠĠĠ Ġfor Ġ( i Ġin Ġthis . last Index Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this [ i ] Ġ!= Ġ 0 . to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast IndexOf Real Str Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠString ( this . slice Array ( 0 .. lastIndexOf Real Str ), Ġcharset ) Ċ } Ċ Ċ fun ĠByteArray . toByteArray 6 4 (): ĠByteArray 6 4 Ġ{ ĊĠĠĠ Ġval Ġarray Ġ= ĠByteArray 6 4 ( this . size . to Long ()) ĊĠĠĠ Ġthis . forEach Indexed Ġ{ Ġindex , Ġbyte Ġ-> ĊĠĠĠĠĠĠĠ Ġarray [ index . to Long ()] Ġ= Ġbyte ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġarray Ċ } Ċ Ċ /** Ċ Ġ* ĠWrites ĠString Ġto Ġthe Ġfile Ċ Ġ* Ċ Ġ* ĠNote : Ġthis ĠFile Writer Ġcannot Ġwrite Ġmore Ġthan Ġ 2 ĠG iB Ċ Ġ* Ċ Ġ* Ġ@ param Ġfile Entry Ġmust Ġbe ĠFile , Ġresolve Ġsymlink Ġbefore hand Ċ Ġ* Ġ@ param Ġmode Ġ" w " Ġor Ġ" a " Ċ Ġ*/ Ċ class ĠV D FileWriter ( private Ġval Ġfile Entry : ĠDisk Entry , Ġprivate Ġval Ġappend : ĠBoolean , Ġval Ġcharset : ĠCharset ) Ġ: ĠWriter () Ġ{ ĊĊĠĠĠ Ġprivate Ġ@ Volatile Ġvar Ġnew File Buffer Ġ= ĠArrayList < Byte >() ĊĊĠĠĠ Ġprivate Ġ@ Volatile Ġvar Ġclosed Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Entry . contents Ġ! is ĠEntry File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFileNotFoundException (" Not Ġa Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( c buf : ĠChar Array , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew ByteArray Ġ= ĠString ( c buf ). toByteArray ( charset ). toByteArray 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew ByteArray . forEach Ġ{ Ġnew File Buffer . add ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew ByteArray Ġ= Ġnew File Buffer . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! append ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file Entry . contents Ġas ĠEntry File ). bytes Ġ= Ġnew ByteArray . toByteArray 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold ByteArray Ġ= Ġ( file Entry . contents Ġas ĠEntry File ). bytes . toByteArray (). copyOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Buffer Ġ= ĠByteArray ( old ByteArray . size Ġ+ Ġnew ByteArray . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( old ByteArray , Ġ 0 , Ġnew File Buffer , Ġ 0 , Ġold ByteArray . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( new ByteArray , Ġ 0 , Ġnew File Buffer , Ġold ByteArray . size , Ġnew ByteArray . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Entry . contents . bytes Ġ= Ġnew ByteArray . toByteArray 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew File Buffer Ġ= ĠArrayList < Byte >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Entry . modification Date Ġ= ĠV D Util . current Unix time ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠV D File OutputStream ( private Ġval Ġfile Entry : ĠDisk Entry , Ġprivate Ġval Ġappend : ĠBoolean , Ġval Ġcharset : ĠCharset ) Ġ: ĠOutputStream () Ġ{ ĊĊĠĠĠ Ġprivate Ġ@ Volatile Ġvar Ġnew File Buffer Ġ= ĠArrayList < Byte >() ĊĊĠĠĠ Ġprivate Ġ@ Volatile Ġvar Ġclosed Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( b : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew File Buffer . add ( b . to Byte ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġflush () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! closed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew ByteArray Ġ= Ġnew File Buffer . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! append ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file Entry . contents Ġas ĠEntry File ). bytes Ġ= Ġnew ByteArray . toByteArray 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold ByteArray Ġ= Ġ( file Entry . contents Ġas ĠEntry File ). bytes . toByteArray (). copyOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Buffer Ġ= ĠByteArray ( old ByteArray . size Ġ+ Ġnew ByteArray . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( old ByteArray , Ġ 0 , Ġnew File Buffer , Ġ 0 , Ġold ByteArray . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( new ByteArray , Ġ 0 , Ġnew File Buffer , Ġold ByteArray . size , Ġnew ByteArray . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Entry . contents . bytes Ġ= Ġnew ByteArray . toByteArray 6 4 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew File Buffer Ġ= ĠArrayList < Byte >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Entry . modification Date Ġ= ĠV D Util . current Unix time ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠ Ġclosed Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ }