package Ġde . vo ize . semver 4 k Ċ Ċ import Ġde . vo ize . semver 4 k . Tokenizer . tokenize Ċ import Ġde . vo ize . semver 4 k . Sem ver . Sem ver Type Ċ import Ġde . vo ize . semver 4 k . Range . Range Operator Ċ Ċ /** Ċ Ġ* ĠA Ġrequirement Ġwill Ġprovide Ġan Ġeasy Ġway Ġto Ġcheck Ġif Ġa Ġversion Ġis Ġsatisf ying . Ċ Ġ* ĠThere Ġare Ġ 2 Ġtypes Ġof Ġrequirements : Ċ Ġ* Ġ- ĠStrict : Ġchecks Ġif Ġa Ġversion Ġis Ġequivalent Ġto Ġanother Ċ Ġ* Ġ- ĠNPM : Ġfollows Ġthe Ġrules Ġof ĠNPM Ċ Ġ*/ Ċ class ĠRequirement Ċ /** Ċ Ġ* ĠBuilds Ġa Ġrequirement . Ġ( private Ġuse Ġonly ) Ċ Ġ* Ċ Ġ* ĠA Ġrequirement Ġhas Ġto Ġbe Ġa Ġrange Ġor Ġa Ġcombination Ġof Ġan Ġoperator Ġand Ġ 2 Ġother Ġrequirements . Ċ Ġ* Ċ Ġ* Ġ@ param Ġrange Ġthe Ġrange Ġthat Ġwill Ġbe Ġused Ġfor Ġthe Ġrequirement Ġ( optional Ġif Ġall Ġother Ġparams Ġare Ġprovided ) Ċ Ġ* Ġ@ param Ġreq 1 Ġthe Ġrequirement Ġused Ġas Ġa Ġleft Ġoperand Ġ( requires Ġthe Ġ` op ` Ġand Ġ` req 2 ` Ġparams Ġto Ġbe Ġprovided ) Ċ Ġ* Ġ@ param Ġop Ġthe Ġoperator Ġused Ġbetween Ġthe Ġrequirements Ġ( requires Ġthe Ġ` req 1 ` Ġand Ġ` req 2 ` Ġparams Ġto Ġbe Ġprovided ) Ċ Ġ* Ġ@ param Ġreq 2 Ġthe Ġrequirement Ġused Ġas Ġa Ġright Ġoperand Ġ( requires Ġthe Ġ` req 1 ` Ġand Ġ` op ` Ġparams Ġto Ġbe Ġprovided ) Ċ Ġ*/ Ġconstructor ( val Ġrange : ĠRange ?, Ġval Ġreq 1 : ĠRequirement ?, Ġval Ġop : ĠRequirement Operator ?, Ġval Ġreq 2 : ĠRequirement ?) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġ. is Satisf ied By ĊĠĠĠĠ Ġ* Ġ@ param Ġversion Ġthe Ġversion Ġthat Ġwill Ġbe Ġchecked ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġversion Ġsatisfies Ġthe Ġrequirement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Satisf ied By ( version : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Satisf ied By ( Sem ver ( version !! , Ġrange . version . type )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Satisf ied By ( Sem ver ( version !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġthe Ġrequirement Ġis Ġsatisfied Ġby Ġa Ġversion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġversion Ġthe Ġversion Ġthat Ġwill Ġbe Ġchecked ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġversion Ġsatisfies Ġthe Ġrequirement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Satisf ied By ( version : ĠSem ver ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrange . is Satisf ied By ( version ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( op ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequirement Operator . AND Ġ-> Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġset Ġ= ĠgetAll Ranges ( this , ĠArrayList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( range Ġin Ġset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! range !!. is Satisf ied By ( version )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version . suffix Tokens ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġset Ġof Ġversions Ġthat Ġare Ġallowed Ġto Ġhave Ġpr erelease s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġexample , Ġ^ 1 . 2 . 3 - pr . 1 Ġdes ug ars Ġto Ġ>= 1 . 2 . 3 - pr . 1 Ġ< 2 . 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThat Ġshould Ġallow Ġ` 1 . 2 . 3 - pr . 2 ` Ġto Ġpass . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHowever , Ġ` 1 . 2 . 4 - alpha . not ready ` Ġshould ĠNOT Ġbe Ġallowed , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġeven Ġthough Ġit 's Ġwithin Ġthe Ġrange Ġset Ġby Ġthe Ġcompar ators . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( range Ġin Ġset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range !!. version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . version . suffix Tokens ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallowed Ġ= Ġrange . version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version . major Ġ== Ġallowed . major Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion . minor Ġ== Ġallowed . minor Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion . patch Ġ== Ġallowed . patch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVersion Ġhas Ġa Ġ- pre , Ġbut Ġit 's Ġnot Ġone Ġof Ġthe Ġones Ġwe Ġlike . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCould Ġbe Ġthat Ġwe Ġhave Ġa ĠOR Ġin ĠAND Ġ- Ġfallback Ġto Ġdefault Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreq 1 !!. is Satisf ied By ( version ) Ġ&& Ġreq 2 !!. is Satisf ied By ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequirement Operator . OR Ġ-> Ġreturn Ġreq 1 !!. is Satisf ied By ( version ) Ġ|| Ġreq 2 !!. is Satisf ied By ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Code Ġerror . ĠUnknown ĠRequirement Operator : Ġ" Ġ+ Ġop ) Ġ// ĠShould Ġnever Ġhappen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmin Version (): ĠSem ver ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin ver : ĠSem ver ? Ġ= ĠSem ver (" 0 . 0 . 0 ") ĊĠĠĠĠĠĠĠ Ġif Ġ( min ver Ġ!= Ġnull Ġ&& Ġthis . is Satisf ied By ( min ver )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmin ver ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmin ver Ġ= ĠSem ver (" 0 . 0 . 0 - 0 ") ĊĠĠĠĠĠĠĠ Ġif Ġ( this . is Satisf ied By ( min ver )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmin ver ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmin ver Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġranges Ġ= Ġmutable ListOf < Range ?> () ĊĠĠĠĠĠĠĠ Ġthis . getAll Greater OrEqual Ranges ( this , Ġranges ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( range Ġin Ġranges ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcomp ver Ġ= Ġrange . version ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . op . equals ( Range Operator . GT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ver Ġ= Ġcomp ver . next Increment (); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPick Ġthis Ġnew Ġversion Ġif Ġit 's Ġsmaller Ġthan Ġthe Ġone Ġwe Ġalready Ġhave Ġand Ġstill Ġsatisfies Ġthe Ġrequirements ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( range . op . equals ( Range Operator . GT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrange . op . equals ( Range Operator . G TE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrange . op . equals ( Range Operator . EQ )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( min ver Ġ== Ġnull Ġ|| Ġmin ver . compareTo ( comp ver ) Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġthis . is Satisf ied By ( comp ver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin ver Ġ= Ġcomp ver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( min ver Ġ!= Ġnull Ġ&& Ġthis . is Satisf ied By ( min ver )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmin ver ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetAll Greater OrEqual Ranges ( requirement : ĠRequirement ?, Ġres : ĠMutable List < Range ?> ): ĠList < Range ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( requirement !!. range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requirement . range !!. op . equals ( Range Operator . GT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrequirement . range . op . equals ( Range Operator . G TE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġrequirement . range . op . equals ( Range Operator . EQ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( requirement . range ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetAll Greater OrEqual Ranges ( requirement . req 1 , Ġres ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetAll Greater OrEqual Ranges ( requirement . req 2 , Ġres ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetAll Ranges ( requirement : ĠRequirement ?, Ġres : ĠMutable List < Range ?> ): ĠList < Range ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( requirement !!. range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres . add ( requirement . range ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( requirement . op Ġ== ĠRequirement Operator . AND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetAll Ranges ( requirement . req 1 , Ġres ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetAll Ranges ( requirement . req 2 , Ġres ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" OR Ġin ĠAND Ġnot Ġallowed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġres ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( o : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġo ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( o Ġ! is ĠRequirement ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġthat Ġ= Ġo ĊĠĠĠĠĠĠĠ Ġreturn Ġrange Ġ== Ġthat . range Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq 1 Ġ== Ġthat . req 1 Ġ&& Ġop Ġ== Ġthat . op Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreq 2 Ġ== Ġthat . req 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ range $ req 1 $ op $ req 2 ". hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( range Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreq 1 . toString () Ġ+ Ġ" Ġ" Ġ+ Ġ( if Ġ( op Ġ== ĠRequirement Operator . OR ) Ġop . asString () Ġ+ Ġ" Ġ" Ġelse Ġ"") Ġ+ Ġreq 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġoperators Ġthat Ġcan Ġbe Ġused Ġin Ġa Ġrequirement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠRequirement Operator ( private Ġval Ġs : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAND (""), ĠOR (" || "); ĊĊĠĠĠĠĠĠĠ Ġfun Ġas String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġs ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ DYNAMIC _ PATCH _ PATTERN Ġ= ĠRegex ("( \\ d +) \\ .( \\ d +) \\. \\ +") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ DYNAMIC _ MINOR _ PATTERN Ġ= ĠRegex ("( \\ d +) \\. \\ +") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ LATE ST _ PATTERN Ġ= ĠRegex (" latest \\. \\ w +") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ MATH _ BOUNDED _ PATTERN Ġ= ĠRegex ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \\ [ | \\ ]) " Ġ+ Ġ Ġ// Ġ 1 ST ĠGROUP : Ġa Ġsquare Ġbracket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ([ \\ d \\. ]+ )" Ġ+ Ġ Ġ// Ġ 2 ND ĠGROUP : Ġa Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"," Ġ+ Ġ Ġ// Ġa Ġcomma Ġseparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ([ \\ d \\. ]+ )" Ġ+ Ġ Ġ// Ġ 3 RD ĠGROUP : Ġa Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \\ [ | \\ ]) " Ġ// Ġ 4 TH ĠGROUP : Ġa Ġsquare Ġbracket ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ MATH _ LOWER _ UN BOUNDED _ PATTERN Ġ= ĠRegex ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ ( ," Ġ+ Ġ Ġ// Ġa Ġparent hesis Ġand Ġa Ġcomma Ġseparator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ([ \\ d \\. ]+ )" Ġ+ Ġ Ġ// Ġ 1 ST ĠGROUP : Ġa Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \\ [ | \\ ]) " Ġ// Ġ 2 ND ĠGROUP : Ġa Ġsquare Ġbracket ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠIV Y _ MATH _ UPPER _ UN BOUNDED _ PATTERN Ġ= ĠRegex ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"( \\ [ | \\ ]) " Ġ+ Ġ Ġ// Ġ 1 ST ĠGROUP : Ġa Ġsquare Ġbracket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ([ \\ d \\. ]+ )" Ġ+ Ġ Ġ// Ġ 2 ND ĠGROUP : Ġa Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ", \\ )" Ġ// Ġa Ġcomma Ġseparator Ġand Ġa Ġparent hesis ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġrequirement Ġ( will Ġtest Ġthat Ġthe Ġversion Ġis Ġequivalent Ġto Ġthe Ġrequirement ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġversion Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild ( requirement : ĠSem ver ?): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( Range ( requirement !! , ĠRange Operator . EQ ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġstrict Ġrequirement Ġ( will Ġtest Ġthat Ġthe Ġversion Ġis Ġequivalent Ġto Ġthe Ġrequirement ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġversion Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild Strict ( requirement : ĠString ?): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild ( Sem ver ( requirement !! , ĠSem ver Type . STRICT )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġloose Ġrequirement Ġ( will Ġtest Ġthat Ġthe Ġversion Ġis Ġequivalent Ġto Ġthe Ġrequirement ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġversion Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild L oose ( requirement : ĠString ?): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild ( Sem ver ( requirement !! , ĠSem ver Type . LO OSE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġrequirement Ġfollowing Ġthe Ġrules Ġof ĠNPM . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġrequirement Ġas Ġa Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild NPM ( requirement : ĠString ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrequirement Ġ= Ġrequirement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requirement . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement Ġ= Ġ"*" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild With Tokenizer ( requirement , ĠSem ver Type . NPM ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġrequirement Ġfollowing Ġthe Ġrules Ġof ĠCo co apods . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġrequirement Ġas Ġa Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild Co co apods ( requirement : ĠString ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild With Tokenizer ( requirement , ĠSem ver Type . CO CO A PO DS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbuild With Tokenizer ( requirement : ĠString , Ġtype : ĠSem ver Type ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToken ize Ġthe Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtokens Ġ= Ġtokenize ( requirement , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Ġ= Ġremove False Positive Version Ranges ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Ġ= Ġadd Parent heses ( tokens ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTran form Ġthe Ġtokens Ġlist Ġto Ġa Ġreverse Ġpol ish Ġnotation Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr pn Ġ= Ġto Reverse Pol ish Not ation ( tokens ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġrequirement Ġtree Ġby Ġevaluating Ġthe Ġr pn Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġevaluate Reverse Pol ish Not ation ( r pn . iterator (), Ġtype ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBuilds Ġa Ġrequirement Ġfollowing Ġthe Ġrules Ġof ĠI vy . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġrequirement Ġthe Ġrequirement Ġas Ġa Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġbuild I vy ( requirement : ĠString ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild L oose ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠSem ver Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Path Ġ= ĠIV Y _ DYNAMIC _ PATCH _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmajor Ġ= Ġmatch Path . group Values [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġminor Ġ= Ġmatch Path . group Values [ 2 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Ġ= ĠRequirement ( Range ("$ major .$ minor . 0 ", ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Ġ= ĠRequirement ( Range ( major . toString () Ġ+ Ġ"." Ġ+ Ġ( minor Ġ+ Ġ 1 ) Ġ+ Ġ". 0 ", ĠRange Operator . LT ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġlower , ĠRequirement Operator . AND , Ġupper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Minor Ġ= ĠIV Y _ DYNAMIC _ MINOR _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Minor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmajor Ġ= Ġmatch Minor . group Values [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Ġ= ĠRequirement ( Range ("$ major . 0 . 0 ", ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Ġ= ĠRequirement ( Range (( major Ġ+ Ġ 1 ). toString () Ġ+ Ġ". 0 . 0 ", ĠRange Operator . LT ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġlower , ĠRequirement Operator . AND , Ġupper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Latest Ġ= ĠIV Y _ LATE ST _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Latest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( Range (" 0 . 0 . 0 ", ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Bounded Ġ= ĠIV Y _ MATH _ BOUNDED _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Bounded Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Op Ġ= Ġif Ġ(" [" Ġ== Ġmatch Bounded . group Values [ 1 ]) ĠRange Operator . G TE Ġelse ĠRange Operator . GT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Version Ġ= ĠSem ver ( match Bounded . group Values [ 2 ], ĠSem ver Type . LO OSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Version Ġ= ĠSem ver ( match Bounded . group Values [ 3 ], ĠSem ver Type . LO OSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Op Ġ= Ġif Ġ( "] " Ġ== Ġmatch Bounded . group Values [ 4 ]) ĠRange Operator . LTE Ġelse ĠRange Operator . LT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Ġ= ĠRequirement ( Range ( ex trap olate Version ( lower Version ), Ġlower Op ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Ġ= ĠRequirement ( Range ( ex trap olate Version ( upper Version ), Ġupper Op ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġlower , ĠRequirement Operator . AND , Ġupper ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Lower Un bounded Ġ= ĠIV Y _ MATH _ LOWER _ UN BOUNDED _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Lower Un bounded Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠSem ver ( match Lower Un bounded . group Values [ 1 ], ĠSem ver Type . LO OSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġop Ġ= Ġif Ġ( "] " Ġ== Ġmatch Lower Un bounded . group Values [ 2 ]) ĠRange Operator . LTE Ġelse ĠRange Operator . LT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( Range ( ex trap olate Version ( version ), Ġop ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Upper Un bounded Ġ= ĠIV Y _ MATH _ UPPER _ UN BOUNDED _ PATTERN . find ( requirement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Upper Un bounded Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġop Ġ= Ġif Ġ(" [" Ġ== Ġmatch Upper Un bounded . group Values [ 1 ]) ĠRange Operator . G TE Ġelse ĠRange Operator . GT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠSem ver ( match Upper Un bounded . group Values [ 2 ], ĠSem ver Type . LO OSE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( Range ( ex trap olate Version ( version ), Ġop ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSem ver Exception (" Invalid Ġrequirement ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturn Ġparent hesized Ġexpression , Ġgiving Ġlowest Ġpriority Ġto ĠOR Ġoperator ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtokens Ġthe Ġtokens Ġcontained Ġin Ġthe Ġrequirement Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtokens Ġwith Ġparent hesis ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Parent heses ( tokens : ĠList < Tokenizer . Token ?> ): ĠList < Tokenizer . Token ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Tokenizer . Token ?> Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Tokenizer . Token ( Tokenizer . TokenType . OPEN ING , Ġ"(" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( token Ġin Ġtokens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token !!. type Ġ=== ĠToken izer . TokenType . OR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Tokenizer . Token ( Tokenizer . TokenType . CLO SING , Ġ") ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Tokenizer . Token ( Tokenizer . TokenType . OPEN ING , Ġ"(" )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Tokenizer . Token ( Tokenizer . TokenType . CLO SING , Ġ") ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSome Ġrequirements Ġmay Ġcontain Ġversions Ġthat Ġlook Ġlike Ġversion Ġranges . ĠFor Ġexample Ġ' Ġ 0 . 0 . 1 - SN ASH OT Ġ' Ġcould Ġbe ĊĠĠĠĠĠĠĠĠ Ġ* Ġinterpreted Ġincorrectly Ġas Ġa Ġversion Ġrange Ġfrom Ġ 0 . 0 . 1 Ġto ĠS NAP SHOT . ĠThis Ġmethod Ġparses Ġall Ġtokens Ġand Ġlooks Ġfor ĊĠĠĠĠĠĠĠĠ Ġ* Ġgroups Ġof Ġthree Ġtokens Ġthat Ġare Ġrespectively Ġof Ġtype Ġ[ VERSION , ĠH YP HEN , ĠVERSION ] Ġand Ġvalidates Ġthat Ġthe Ġtoken ĊĠĠĠĠĠĠĠĠ Ġ* Ġafter Ġthe Ġhy phen Ġis Ġa Ġvalid Ġversion Ġstring . ĠIf Ġit Ġisn 't Ġthe , Ġthree Ġtokens Ġare Ġmerged Ġinto Ġone Ġ( th us Ġcreating Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġsingle Ġversion Ġtoken , Ġin Ġwhich Ġthe Ġthird Ġtoken Ġis Ġthe Ġbuild Ġinformation ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtokens Ġthe Ġtokens Ġcontained Ġin Ġthe Ġrequirement Ġstring ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġtokens Ġwith Ġany Ġfalse Ġpositive Ġversion Ġranges Ġreplaced Ġwith Ġversion Ġstrings ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġremove False Positive Version Ranges ( tokens : ĠList < Tokenizer . Token ?> ): ĠList < Tokenizer . Token ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠMutable List < Tokenizer . Token ?> Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġtokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtoken Ġ= Ġtokens [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( there IsFalse Positive Version Range ( tokens , Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= ĠToken izer . Token ( Tokenizer . TokenType . VERSION , Ġtoken !!. value Ġ+ Ġ'-' Ġ+ Ġtokens [ i Ġ+ Ġ 2 ] !!. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġthere IsFalse Positive Version Range ( tokens : ĠList < Tokenizer . Token ? >, Ġi : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġ 2 Ġ>= Ġtokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsus pic ious Tokens Ġ= ĠarrayOf ( tokens [ i ], Ġtokens [ i Ġ+ Ġ 1 ], Ġtokens [ i Ġ+ Ġ 2 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sus pic ious Tokens [ 0 ] !!. type Ġ!= ĠToken izer . TokenType . VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sus pic ious Tokens [ 2 ] !!. type Ġ!= ĠToken izer . TokenType . VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( sus pic ious Tokens [ 1 ] !!. type Ġ!= ĠToken izer . TokenType . HY P HEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġattempt To Parse ( sus pic ious Tokens [ 2 ] !!. value ) Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġattempt To Parse ( value : ĠString ?): ĠSem ver ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSem ver ( value !! , ĠSem ver Type . NPM ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSem ver Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdapt ation Ġof Ġthe Ġshut ting Ġy ard Ġalgorithm ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Reverse Pol ish Not ation ( tokens : ĠList < Tokenizer . Token ?> ): ĠList < Tokenizer . Token ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqueue Ġ= Ġmutable ListOf < Tokenizer . Token ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġmutable ListOf < Tokenizer . Token ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġtokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( token !!. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . VERSION Ġ-> Ġqueue . add ( 0 , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . CLO SING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stack [ 0 ] !!. type Ġ!== ĠToken izer . TokenType . OPEN ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( 0 , Ġstack . remove At ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . size Ġ> Ġ 0 Ġ&& Ġstack [ 0 ] !!. type . is Unary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( 0 , Ġstack . remove At ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( token . type . is Unary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPush Ġthe Ġoperand Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( 0 , Ġtokens [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġthe Ġoperator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( 0 , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . add ( 0 , Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( stack . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . add ( 0 , Ġstack . remove At ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġqueue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEvalu ates Ġa Ġreverse Ġpol ish Ġnotation Ġtoken Ġlist ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġevaluate Reverse Pol ish Not ation ( iterator : ĠIterator < Tokenizer . Token ? >, Ġtype : ĠSem ver Type ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token !!. type Ġ=== ĠToken izer . TokenType . VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" *" Ġ== Ġtoken !!. value Ġ|| Ġtype Ġ=== ĠSem ver Type . NPM Ġ&& Ġ" latest " Ġ== Ġtoken . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpecial Ġcase Ġfor Ġ"*" Ġand Ġ" latest " Ġin ĠNPM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( Range (" 0 . 0 . 0 ", ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠSem ver ( token . value !! , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version . minor Ġ!= Ġnull Ġ&& Ġversion . patch Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠRange ( version , ĠRange Operator . EQ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequirement ( range , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġa Ġversion Ġwith Ġa Ġwildcard Ġchar Ġ( like Ġ 1 . 2 . x , Ġ 1 . 2 .* Ġor Ġ 1 . 2 ), Ġwe Ġneed Ġa Ġtil de Ġrequirement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtil de Requirement ( version . value , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( token !!. type Ġ=== ĠToken izer . TokenType . HY P HEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken 3 Ġ= Ġiterator . next () Ġ// ĠNote Ġthat Ġtoken 3 Ġis Ġbefore Ġtoken 2 ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken 2 Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhy phen Requirement ( token 2 !!. value , Ġtoken 3 !!. value , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( token !!. type . is Unary ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken 2 Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Op : ĠRange Operator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Op Ġ= Ġwhen Ġ( token . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . EQ Ġ-> ĠRange Operator . EQ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . LT Ġ-> ĠRange Operator . LT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . LTE Ġ-> ĠRange Operator . LTE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . GT Ġ-> ĠRange Operator . GT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . G TE Ġ-> ĠRange Operator . G TE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . T IL DE Ġ-> Ġreturn Ġtil de Requirement ( token 2 !!. value , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . C ARE T Ġ-> Ġreturn Ġcaret Requirement ( token 2 !!. value , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠSem ver Exception (" Invalid Ġrequirement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠRange ( token 2 !!. value , Ġrange Op ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequirement ( range , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThey Ġdon 't Ġcall Ġit Ġ" reverse " Ġfor Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 2 Ġ= Ġevaluate Reverse Pol ish Not ation ( iterator , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 1 Ġ= Ġevaluate Reverse Pol ish Not ation ( iterator , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequirement Op : ĠRequirement Operator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement Op Ġ= Ġwhen Ġ( token . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . OR Ġ-> ĠRequirement Operator . OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken izer . TokenType . AND Ġ-> ĠRequirement Operator . AND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠSem ver Exception (" Invalid Ġrequirement ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequirement ( null , Ġreq 1 , Ġrequirement Op , Ġreq 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch ElementException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSem ver Exception (" Invalid Ġrequirement ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAllows Ġpatch - level Ġchanges Ġif Ġa Ġminor Ġversion Ġis Ġspecified Ġon Ġthe Ġcomparator . ĠAllows Ġminor - level Ġchanges Ġif Ġnot . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġversion Ġthe Ġversion Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype Ġthe Ġversion Ġsystem Ġused Ġfor Ġthis Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġtil de Requirement ( version : ĠString ?, Ġtype : ĠSem ver Type ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!== ĠSem ver Type . NPM Ġ&& Ġtype Ġ!== ĠSem ver Type . CO CO A PO DS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSem ver Exception (" The Ġtil de Ġrequirements Ġare Ġonly Ġcompatible Ġwith ĠNPM Ġand ĠCo co apods .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsemver Ġ= ĠSem ver ( version !! , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 1 Ġ= ĠRequirement ( Range ( ex trap olate Version ( semver ), ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSem ver Type . CO CO A PO DS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( semver . patch Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemver . major . toString () Ġ+ Ġ"." Ġ+ Ġ( semver . minor !! Ġ+ Ġ 1 ) Ġ+ Ġ". 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( semver . minor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( semver . major !! Ġ+ Ġ 1 ). toString () Ġ+ Ġ". 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreq 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSem ver Type . NPM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( semver . minor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsemver . major . toString () Ġ+ Ġ"." Ġ+ Ġ( semver . minor !! Ġ+ Ġ 1 ) Ġ+ Ġ". 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( semver . major !! Ġ+ Ġ 1 ). toString () Ġ+ Ġ". 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠSem ver Exception (" The Ġtil de Ġrequirements Ġare Ġonly Ġcompatible Ġwith ĠNPM Ġand ĠCo co apods .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 2 Ġ= ĠRequirement ( Range ( next , ĠRange Operator . LT ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġreq 1 , ĠRequirement Operator . AND , Ġreq 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAllows Ġchanges Ġthat Ġdo Ġnot Ġmodify Ġthe Ġleft - most Ġnon - zero Ġdigit Ġin Ġthe Ġ[ major , Ġminor , Ġpatch ] Ġtuple . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġversion Ġthe Ġversion Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype Ġthe Ġversion Ġsystem Ġused Ġfor Ġthis Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcaret Requirement ( version : ĠString ?, Ġtype : ĠSem ver Type ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!== ĠSem ver Type . NPM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSem ver Exception (" The Ġcaret Ġrequirements Ġare Ġonly Ġcompatible Ġwith ĠNPM .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsemver Ġ= ĠSem ver ( version !! , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 1 Ġ= ĠRequirement ( Range ( ex trap olate Version ( semver ), ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġif Ġ( semver . major Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( semver . minor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 1 . 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( semver . minor Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( semver . patch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 . 1 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 . 0 ." Ġ+ Ġ( semver . patch !! Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 ." Ġ+ Ġ( semver . minor !! Ġ+ Ġ 1 ) Ġ+ Ġ". 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( semver . major !! Ġ+ Ġ 1 ). toString () Ġ+ Ġ". 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 2 Ġ= ĠRequirement ( Range ( next , ĠRange Operator . LT ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġreq 1 , ĠRequirement Operator . AND , Ġreq 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġrequirement Ġthat Ġsatisfies Ġ" x 1 . y 1 . z 1 Ġ- Ġx 2 . y 2 . z 2 ". ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlower Version Ġthe Ġversion Ġof Ġthe Ġlower Ġbound Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġupper Version Ġthe Ġversion Ġof Ġthe Ġupper Ġbound Ġof Ġthe Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype Ġthe Ġversion Ġsystem Ġused Ġfor Ġthis Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġgenerated Ġrequirement ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġhy phen Requirement ( lower Version : ĠString ?, Ġupper Version : ĠString ?, Ġtype : ĠSem ver Type ): ĠRequirement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ!== ĠSem ver Type . NPM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSem ver Exception (" The Ġhy phen Ġrequirements Ġare Ġonly Ġcompatible Ġwith ĠNPM .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower Ġ= Ġex trap olate Version ( Sem ver ( lower Version !! , Ġtype )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġupper Ġ= ĠSem ver ( upper Version !! , Ġtype ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġupper Operator Ġ= ĠRange Operator . LTE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( upper . minor Ġ== Ġnull Ġ|| Ġupper . patch Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Operator Ġ= ĠRange Operator . LT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Ġ= Ġif Ġ( upper . minor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex trap olate Version ( upper ). with Inc Major () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex trap olate Version ( upper ). with Inc Minor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 1 Ġ= ĠRequirement ( Range ( lower , ĠRange Operator . G TE ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreq 2 Ġ= ĠRequirement ( Range ( upper , Ġupper Operator ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRequirement ( null , Ġreq 1 , ĠRequirement Operator . AND , Ġreq 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEx trap ol ates Ġthe Ġoptional Ġminor Ġand Ġpatch Ġnumbers . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġ 1 Ġ= Ġ 1 . 0 . 0 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġ 1 . 2 Ġ= Ġ 1 . 2 . 0 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ- Ġ 1 . 2 . 3 Ġ= Ġ 1 . 2 . 3 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġsemver Ġthe Ġoriginal Ġsemver ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġa Ġsemver Ġwith Ġthe Ġex trap olated Ġminor Ġand Ġpatch Ġnumbers ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġex trap olate Version ( semver : ĠSem ver ): ĠSem ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( semver . major ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( if Ġ( semver . minor Ġ== Ġnull ) Ġ 0 Ġelse Ġsemver . minor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( if Ġ( semver . patch Ġ== Ġnull ) Ġ 0 Ġelse Ġsemver . patch ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ( semver . suffix Tokens ?. size Ġ?: Ġ 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( semver . suffix Tokens ! ![ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( semver . build Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ("+ "). append ( semver . build ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSem ver ( sb . toString (), Ġsemver . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }