package Ġmo e . nik ky . vo od oo . format Ċ Ċ import ĠMod loader Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġmo e . nik ky . vo od oo . format . builder . Properties Applic ator Ċ import Ġmo e . nik ky . vo od oo . format . mod pack . Manifest Ċ import Ġmo e . nik ky . vo od oo . format . mod pack . entry . File Install Ċ import Ġmo e . nik ky . vo od oo . format . mod pack . entry . Side Ċ import Ġmu . Kotlin Logging Ċ import Ġv ood oo . util . to Relative Unix Path Ċ import Ġjava . io . File Ċ import Ġjava . security . Message Digest Ċ import Ġjava . time . Instant Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . format . DateTime Formatter Ċ Ċ object ĠPackage Builder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ/** * ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Path Ġfolder Ġwith Ġmod pack Ġsource ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Path Ġtarget Ġfolder Ġfor Ġoutput , Ġwill Ġnot Ġdelete Ġexisting Ġfiles ĊĠĠĠĠ Ġ* Ġ@ param Ġmod pack Id Ġascii Ġidentifier Ġfor Ġthe Ġmod pack , Ġused Ġin Ġfilenames ĊĠĠĠĠ Ġ* Ġ@ param Ġmod pack Title ĠHuman Ġreadable ĠTitle ĊĠĠĠĠ Ġ* Ġ@ param Ġmod pack Unique Version Ġsemver Ġor Ġsimilar Ġversion Ġstring , Ġhas Ġto Ġdiffer Ġfrom Ġall Ġpreviously Ġused Ġversions ĊĠĠĠĠ Ġ* Ġ@ param Ġgame Version Ġm inecraft Ġversion ĊĠĠĠĠ Ġ* Ġ@ param Ġmod Loader Ġmod loader Ġto Ġuse , Ġfabric / forge ĊĠĠĠĠ Ġ* Ġ@ param Ġuser Files Ġpattern Ġto Ġinclude Ġ/ Ġexclude Ġuser Files ĊĠĠĠĠ Ġ* Ġ@ param Ġfeatures Ġlist Ġof Ġfeatures ĊĠĠĠĠ Ġ* Ġ@ param Ġpretty Print Ġwhether Ġto Ġserialize Ġentries Ġwith Ġindentation Ġin Ġjson ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild ( ĊĠĠĠĠĠĠĠ Ġinput Path : ĠFile , ĊĠĠĠĠĠĠĠ Ġoutput Path : ĠFile , ĊĠĠĠĠĠĠĠ Ġmod pack Id : ĠString , ĊĠĠĠĠĠĠĠ Ġinstaller Location : ĠString , ĊĠĠĠĠĠĠĠ Ġmod pack Title : ĠString Ġ= Ġmod pack Id , ĊĠĠĠĠĠĠĠ Ġmod pack Version : ĠString , ĊĠĠĠĠĠĠĠ Ġversion Alias : ĠMap < String , ĠString > Ġ= Ġmap Of (), ĊĠĠĠĠĠĠĠ Ġgame Version : ĠString , ĊĠĠĠĠĠĠĠ Ġmod Loader : ĠMod loader , ĊĠĠĠĠĠĠĠ Ġobjects Location : ĠString Ġ= Ġ" objects ", ĊĠĠĠĠĠĠĠ Ġuser Files : ĠFn Pattern List Ġ= ĠFn Pattern List (), ĊĠĠĠĠĠĠĠ Ġfeatures : ĠList < Feature With Pattern > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠ Ġpretty Print : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Dest : ĠFile Ġ= Ġoutput Path . resolve ("${ mod pack Id }_${ mod pack Version }. json ") ĊĠĠĠĠĠĠĠ Ġval Ġversion listing File : ĠFile Ġ= Ġoutput Path . resolve ("$ mod pack Id . json ") ĊĊĠĠĠĠĠĠĠ Ġval Ġunique Version Ġ= Ġ"$ mod pack Version ." Ġ+ ĠDateTime Formatter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. of Pattern (" yyyy MM dd HH mm ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Zone ( Zone Offset . UTC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( Instant . now ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġverify Ġgame Version ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġregex Ġcheck Ġmod pack Id ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġvalidate Ġall Ġuser Ġinput ĊĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Dir Ġ= Ġinput Path . resolve ( DEFAULT _ SRC _ DIR NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġobjects Dir Ġ= Ġoutput Path . resolve ( objects Location ) ĊĠĠĠĠĠĠĠ Ġval Ġjson : ĠJson Ġ= ĠJson Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pretty Print Ġ= Ġpretty Print ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencode Defaults Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializers Module ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate ĠPackage Builder Ġ: Ġskip ĊĊĠĠĠĠĠĠĠ Ġ// Ġread Config Ġ( mod pack . json ) ĊĠĠĠĠĠĠĠ Ġ// Ġreads Ġoptions Ġfrom Ġfile Ġif Ġexists ĊĠĠĠĠĠĠĠ Ġ// Ġname , Ġtitle , Ġgame Version , Ġlaunch Modifier , Ġfeature , Ġuser Files ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġpass Ġuser File Ġinfo Ġinto Ġfunction ĊĊĠĠĠĠĠĠĠ Ġ// Ġread Version Manifest Ġ Ġ/ version . json Ġ: Ġskip ĊĠĠĠĠĠĠĠ Ġ// Ġseems Ġto Ġbe Ġfor Ġproviding Ġa Ġcustom Ġversion Manifest , Ġskip Ġthat ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġtemporarily Ġpass Ġfeatures Ġas Ġargument Ġto Ġfunction ĊĠĠĠĠĠĠĠ Ġ// Ġscan Ġ/ src / ĊĠĠĠĠĠĠĠ Ġ// Ġscans Ġfiles Ġand Ġthen Ġregisters Ġall Ġpatterns Ġwith ĠFileInfo Scanner ĊĠĠĠĠĠĠĠ Ġ// Ġscans Ġfor Ġ. info . json Ġfiles Ġand Ġregisters Ġthem Ġas Ġfeatures Ġ( in Ġmanifest ) ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġredo Ġ.. Ġs mar ter Ġ? ĊĠĠĠĠĠĠĠ Ġ// Ġused Ġto Ġbe Ġ` scanner Ġ= ĠFileInfo Scanner ()` Ġand Ġ` scanner . patterns ` ĊĠĠĠĠĠĠĠ Ġval Ġapplic ator Ġ= ĠProperties Applic ator ( user Files Ġ= Ġuser Files ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( feature Ġin Ġfeatures ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplic ator . register ( feature ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Files Ġ(/ src , ĊĠĠĠĠĠĠĠ Ġ// Ġcollect s Ġclient Files ĊĠĠĠĠĠĠĠ Ġ// Ġdetect s Ġ. url . txt Ġfiles Ġand Ġdownloads Ġthem ĊĠĠĠĠĠĠĠ Ġ// Ġgenerates Ġsha - 1 Ġchecksum s ĊĠĠĠĠĠĠĠ Ġ// Ġgenerates Ġ` to ` Ġpath Ġ( based Ġon Ġchecksum ) Ġand Ġcopies Ġit Ġthere ĊĠĠĠĠĠĠĠ Ġ// Ġcreates ĠFile Install Ġentries Ġand Ġadds Ġthem Ġto Ġmanifest ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġalso Ġdetect Ġsides Ġbased Ġon Ġparent folders Ġcontaining Ġ_ CLIENT Ġor Ġ_ SERVER , Ġon y Ġone Ġallowed ĊĊĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= Ġadd Files ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Dir Ġ= Ġfiles Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Dir Ġ= Ġobjects Dir , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Entry Ġ= Ġapplic ator :: apply ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Lo aders Ġ: Ġskip Ġ/ Ġredo ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġpass Ġin Ġor Ġread Ġfor ge / fabric Ġmod loader Ġfrom Ġconfig ĊĊĠĠĠĠĠĠĠ Ġ// Ġdownload Libraries : Ġskip , Ġwe Ġdo Ġnot Ġneed Ġthat ĊĊĠĠĠĠĠĠĠ Ġ// Ġwrite Manifest Ġ($ manifest Dest ) ĊĠĠĠĠĠĠĠ Ġ// Ġvalidate Ġma ifest ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ! name . isNull OrEmpty ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ! game Version . isNull Oo Empty ĊĠĠĠĠĠĠĠ Ġ// Ġtakes Ġfeatures Ġfrom Ġapplic ator . features InUse Ġ( see Ġscan Ġstep ?) ĊĠĠĠĠĠĠĠ Ġ// Ġserialize Ġmanifest Ġto Ġ$ man fi est Dest ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" --- ĠWriting ĠManifest ... Ġ--- " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Ġ= ĠManifest ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstaller Location Ġ= Ġinstaller Location , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmod pack Title , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġunique Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġmod pack Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects Location Ġ= Ġobjects Location , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgame Version Ġ= Ġgame Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmod Loader Ġ= Ġmod Loader , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeatures Ġ= Ġapplic ator . features InUse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtasks Ġ= Ġtasks ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmanifest . validate () ĊĠĠĠĠĠĠĠ Ġmanifest Dest . absolute File . parent File . mkdir s () ĊĠĠĠĠĠĠĠ Ġmanifest Dest . write Text ( json . encode ToString ( Manifest . serializer (), Ġmanifest )) ĊĊĠĠĠĠĠĠĠ Ġval Ġversions Listing Ġ= Ġif Ġ( version listing File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ood oo . util . json . decode FromString ( Versions List . serializer (), Ġversion listing File . read Text ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVersions List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstaller Location Ġ= Ġinstaller Location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversions Ġ= Ġmap Of () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġversion Entry Ġ= ĠVersion Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġmod pack Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ"$ mod pack Title Ġ$ mod pack Version ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġmanifest Dest . to Relative Unix Path ( version listing File . absolute File . parent File ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġaliases Ġ/ Ġupdate Channels Ġto Ġversion Ġlisting ĊĊĠĠĠĠĠĠĠ Ġval Ġalias Entries Ġ= Ġversion Alias ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġversion Ġ-> Ġversion Ġ== Ġmod pack Version Ġ}. keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġalias Ġ-> Ġalias Ġto Ġversion Entry Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Version Listing Ġ= Ġversions Listing . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversions Ġ= Ġversions Listing . versions Ġ+ Ġ( mod pack Version Ġto Ġversion Entry ) Ġ+ Ġalias Entries ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġversion listing File . write Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv ood oo . util . json . encode ToString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVersions List . serializer (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Version Listing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" --- ĠDone Ġ--- " Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdone ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Now Ġupload Ġthe Ġcontents Ġof Ġ$ output Path Ġto Ġyour Ġweb Ġserver Ġor ĠCDN !" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Files ( ĊĠĠĠĠĠĠĠ Ġfiles Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġdest Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġon Entry : Ġ( File Install ) Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠList < File Install > Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" --- ĠAdding Ġfiles Ġto Ġmod pack ... Ġ--- " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġfiles Dir . walk Bottom Up (). filter Not Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconditions Ġto Ġskip Ġfiles Ġ/ Ġfolders ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . name . endsWith ( INFO _ FILE _ SUFFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġfile . name . endsWith ( URL _ FILE _ SUFFIX ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ( file . isDirectory Ġ&& Ġ( file . name Ġ== Ġ"_ SERVER " Ġ|| Ġfile . name Ġ== Ġ"_ CLIENT ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġfile . name Ġ== Ġ". DS _ Store " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġ! file . isFile ĊĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthis Ġis Ġa Ġspecial Ġfile , Ġskip Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name . endsWith ( INFO _ FILE _ SUFFIX ) Ġ|| Ġfile . name . endsWith ( URL _ FILE _ SUFFIX )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġthis Ġis Ġa Ġside Ġmarker , Ġskip Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory Ġ&& Ġ( file . name Ġ== Ġ"_ SERVER " Ġ|| Ġfile . name Ġ== Ġ"_ CLIENT ")) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġside Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġfile . relative To ( files Dir ). to Path () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarker Count Ġ= Ġrelative Path . count Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fileName . toString () Ġ== Ġ"_ SERVER " Ġ|| Ġit . fileName . toString () Ġ== Ġ"_ CLIENT " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( marker Count Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" found Ġmultiple Ġmarkers Ġin Ġpath : Ġ$ relative Path " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Server Ġ= Ġrelative Path . count Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fileName . toString () Ġ== Ġ"_ SERVER " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Client Ġ= Ġrelative Path . count Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fileName . toString () Ġ== Ġ"_ CLIENT " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire (!( is Server Ġ&& Ġis Client )) Ġ{ Ġ" cannot Ġhave Ġboth Ġside Ġmarkers Ġat Ġonce : Ġ$ relative Path " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Server Ġ-> ĠSide . SERVER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Client Ġ-> ĠSide . CLIENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSide . BOTH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrel Path Ġ= Ġfile . relative To ( files Dir ). to Path (). filter Not Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . fileName . toString () Ġ== Ġ"_ SERVER " Ġ|| Ġit . fileName . toString () Ġ== Ġ"_ CLIENT " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. reduce Ġ{ Ġacc , Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacc . resolve ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to File () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsha 2 Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġsha 2 . digest ( file . read Bytes ()). to HexString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġrel Path . toString (). replace ('\\ ', Ġ'/') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl File Ġ= Ġfile . parent File . resolve ( file . name Ġ+ ĠURL _ FILE _ SUFFIX ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( location , Ġcopy ) Ġ= Ġif Ġ( url File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġvalidate Ġurl File Ġby Ġdownloading Ġ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl File . read Lines (). first () Ġto Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( hash . substring ( 0 , Ġ 8 ) Ġ+ Ġ"/" Ġ+ Ġhash . substring ( 8 , Ġ 1 6 ) Ġ+ Ġ"/" Ġ+ Ġhash . substring ( 1 6 )) Ġto Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest Path Ġ= ĠFile ( dest Dir , Ġlocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠFile Install ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġ" sha - 2 5 6 :$ hash ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġ= Ġto , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġside Ġ= Ġside , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġfile . length () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġapplic ator . apply ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġapplic ator Ġis Ġpopulated Ġby Ġscan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġentry . condition When Ġ= Ġfrom Feature ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġentry . is User File Ġ= Ġis User File ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Entry . invoke ( entry ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Path . parent File . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . copy To ( dest Path , Ġoverwrite Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentries . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconst Ġval ĠDEFAULT _ SRC _ DIR NAME Ġ= Ġ" src " ĊĠĠĠ Ġconst Ġval ĠURL _ FILE _ SUFFIX Ġ= Ġ". url . txt " ĊĠĠĠ Ġconst Ġval ĠINFO _ FILE _ SUFFIX Ġ= Ġ". info . json " ĊĊĊĠĠĠ Ġfun ĠByteArray . to HexString (): ĠString Ġ= Ġjoin ToString ("", Ġtransform Ġ= Ġ{ Ġ"% 0 2 x ". format ( it ) Ġ}) Ċ }