/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 - 2 0 2 0 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . uuid Ċ Ċ import Ġkotlinx . serialization .* Ċ Ċ /** Ċ Ġ* ĠThis Ġtype Ġrepresents Ġa ĠUUID Ġas Ġper ĠRFC Ċ Ġ* ĠSee : Ġhttps :// tools . ietf . org / html / rfc 4 1 2 2 Ċ Ġ*/ Ċ @ Serializable ( with Ġ= ĠSerializer . Default :: class ) Ċ public Ġclass ĠUUID Ġprivate Ġconstructor ( ĊĠĠĠ Ġinternal Ġval Ġtime Stamp And Version Raw : ĠLong , ĊĠĠĠ Ġinternal Ġval Ġclock Sequence Variant And Node Raw : ĠLong Ċ ) Ġ: ĠComparable < UUID > Ġ{ ĊĠĠĠ Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġhelper : ĠUUID ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġhelper . time Stamp And Version Raw , ĊĠĠĠĠĠĠĠ Ġhelper . clock Sequence Variant And Node Raw ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġinstance Ġby Ġthe Ġstring Ġ[ uuid ] Ġrepresentation . ĊĠĠĠĠ Ġ* ĠAn Ġinput Ġstring Ġshould Ġconsist Ġof Ġfive Ġhex ade mical Ġparts ĊĠĠĠĠ Ġ* Ġseparated Ġwith Ġthe Ġminus Ġcharacter , Ġand Ġoptionally Ġsur rounded Ġwith Ġcur ly Ġbrackets . ĊĠĠĠĠ Ġ* ĠThe Ġspace Ġand Ġtab Ġcharacters Ġare Ġignored Ġat Ġthe Ġand Ġend Ġat Ġthe Ġbeginning ĊĠĠĠĠ Ġ* Ġand Ġsurrounding Ġbrackets Ġand Ġminus Ġcharacters . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠValid Ġexamples : ĊĠĠĠĠ Ġ* Ġ` 1 b 3 e 4 5 6 7 - e 9 9 b - 1 3 d 3 - a 4 7 6 - 4 4 6 6 5 7 4 2 0 0 0 0 `, ĊĠĠĠĠ Ġ* Ġ` Ġ 1 b 3 e 4 5 6 7 - e 9 9 b - 1 3 d 3 Ġ- Ġa 4 7 6 Ġ- Ġ 4 4 6 6 5 7 4 2 0 0 0 0 Ġ`, ĊĠĠĠĠ Ġ* Ġ`{ 1 2 3 e 4 5 6 7 - e 8 9 b - 1 2 d 3 - a 4 5 6 - 4 2 6 6 5 5 4 4 0 0 0 0 }`, ĊĠĠĠĠ Ġ* Ġ`{ Ġ 1 2 3 e 4 5 6 7 - e 8 9 b - 1 2 d 3 - a 4 5 6 - 4 2 6 6 5 5 4 4 0 0 0 0 }` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconstructor ( uuid : ĠString ) Ġ: Ġthis ( parse UUID ( uuid )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġinstance Ġof Ġ[ UUID ] Ġfrom Ġcomponents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġversion Number : ĠInt , ĊĠĠĠĠĠĠĠ Ġtime Stamp : ĠLong , ĊĠĠĠĠĠĠĠ Ġclock Sequence : ĠInt , ĊĠĠĠĠĠĠĠ Ġnode : ĠLong , ĊĠĠĠĠĠĠĠ Ġvariant : ĠInt Ġ= Ġ 5 ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġtime Stamp And Version Raw Ġ= Ġ( time Stamp Ġshl Ġ 3 2 ) Ġor Ġ( time Stamp Ġand Ġ 0 xffff 0 0 0 0 0 0 0 0 L Ġshr Ġ 1 6 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Stamp Ġshr Ġ 4 8 ) Ġor Ġ( version Number . to Long () Ġshl Ġ 1 2 ), ĊĠĠĠĠĠĠĠ Ġclock Sequence Variant And Node Raw Ġ= Ġ( clock Sequence . to Long () Ġshl Ġ 4 8 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( variant . to Long () Ġshl Ġ 6 1 ) Ġor Ġnode ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( version Number Ġin Ġ 0 .. 1 5 ) ĊĠĠĠĠĠĠĠ Ġrequire ( variant Ġin Ġ 0 .. 7 ) ĊĠĠĠĠĠĠĠ Ġrequire ( time Stamp Ġin Ġ 0 L Ġuntil Ġ( 1 L Ġshl Ġ 6 0 )) ĊĠĠĠĠĠĠĠ Ġrequire ( node Ġin Ġ 0 L Ġuntil Ġ( 1 L Ġshl Ġ 4 8 )) ĊĠĠĠĠĠĠĠ Ġrequire ( clock Sequence Ġin Ġ 0 Ġuntil Ġ( 1 Ġshl Ġ 1 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġan Ġinstance Ġof Ġ[ UUID ] Ġfrom Ġcomponents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġversion : ĠVersion , ĊĠĠĠĠĠĠĠ Ġtime Stamp : ĠLong , ĊĠĠĠĠĠĠĠ Ġclock Sequence : ĠInt , ĊĠĠĠĠĠĠĠ Ġnode : ĠLong , ĊĠĠĠĠĠĠĠ Ġvariant : ĠInt Ġ= Ġ 5 ĊĠĠĠ Ġ) Ġ: Ġthis ( version . id , Ġtime Stamp , Ġclock Sequence , Ġnode , Ġvariant ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ 6 0 - bits Ġnon - negative Ġnumber . ĠDep ending Ġon Ġthe ĠUUID Ġversion Ġit Ġcould Ġhave Ġdifferent Ġsemantics : ĊĠĠĠĠ Ġ* Ġ- ĠUTC Ġtime ĊĠĠĠĠ Ġ* Ġ- Ġa Ġnumber Ġconstructed Ġfrom Ġthe Ġnamespace ĊĠĠĠĠ Ġ* Ġ- Ġa Ġrandom Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġtime Stamp : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( time Stamp And Version Raw Ġ ush r Ġ 3 2 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Stamp And Version Raw Ġand Ġ 0 xffff 0 0 0 0 L Ġshl Ġ 1 6 ) Ġor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Stamp And Version Raw Ġand Ġ 0 x 0 fff L Ġshl Ġ 4 8 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ 1 3 - bits Ġnon - negative Ġnumber Ġrepresenting Ġa Ġsequence Ġnumber ĊĠĠĠĠ Ġ* Ġor Ġa Ġrandom Ġnumber Ġdepending Ġon ĠUUID Ġ[ version ] Ġand Ġ[ variant ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġclock Sequence : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( clock Sequence Variant And Node Raw Ġshr Ġ 4 8 Ġand Ġ 0 x 1 fff ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUUID Ġnumeric Ġversion Ġin Ġrange Ġ`[ 0 .. 1 5 ] ĊĠĠĠĠ Ġ* Ġ@ see Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġversion Number : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( time Stamp And Version Raw Ġand Ġ 0 xf 0 0 0 L Ġshr Ġ 1 2 ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUUID ĠRFC Ġversion Ġor Ġ` null ` Ġif Ġunknown Ġversion Ġnumber Ġor Ġanother Ġvariant ĊĠĠĠĠ Ġ* Ġ@ see Ġversion Number ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġversion : ĠVersion ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis R fc Variant Ġ-> Ġversion For ( version Number ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUUID Ġvariant Ġin Ġrange Ġ`[ 0 .. 7 ] `, Ġsimilar Ġto Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġvariant : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( clock Sequence Variant And Node Raw Ġ ush r Ġ 6 1 ). toInt () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUUID Ġvariant Ġspecified Ġand Ġdocumented Ġby Ġthe ĠRFC ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġis R fc Variant : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġvariant Ġin Ġ 4 .. 5 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNode ĠUUID Ġpart , Ġa Ġ 4 8 - bit Ġnon - negative Ġnumber . ĊĠĠĠĠ Ġ* ĠDep ending Ġon Ġ[ version ] Ġand Ġ[ variant ] Ġit Ġcould Ġbe Ġone Ġof Ġthe Ġfollowing : ĊĠĠĠĠ Ġ* Ġ- Ġa ĠMAC Ġaddress ĊĠĠĠĠ Ġ* Ġ- Ġa Ġrandom Ġnumber ĊĠĠĠĠ Ġ* Ġ- Ġa Ġvalue Ġconstructed Ġfrom Ġa Ġnamespace ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġnode : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġclock Sequence Variant And Node Raw Ġand Ġ 0 xffffffff ffff L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠR enders ĠUUID Ġin Ġthe ĠRFC Ġformat : Ġfive Ġgroups Ġof Ġhex ade mical Ġparts Ġseparated Ġwith ĊĠĠĠĠ Ġ* Ġminus Ġcharacters , Ġwithout Ġspaces Ġand Ġwithout Ġcur ly Ġbrackets . ĊĠĠĠĠ Ġ* Ġ` 1 b 3 e 4 5 6 7 - e 9 9 b - 1 3 d 3 - a 4 7 6 - 4 4 6 6 5 7 4 2 0 0 0 0 ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĠtoString ( false ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠR enders ĠUUID Ġin Ġthe ĠRFC Ġformat : Ġfive Ġgroups Ġof Ġhex ade mical Ġparts Ġseparated Ġwith ĊĠĠĠĠ Ġ* Ġminus Ġcharacters Ġand Ġsur rounded Ġwith Ġcur ly Ġbrackets Ġif Ġ[ include Br ackets ] Ġis Ġ` true `, ĊĠĠĠĠ Ġ* Ġwithout Ġspaces . ĊĠĠĠĠ Ġ* Ġ`{ 1 b 3 e 4 5 6 7 - e 9 9 b - 1 3 d 3 - a 4 7 6 - 4 4 6 6 5 7 4 2 0 0 0 0 }` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun ĠtoString ( include Br ackets : ĠBoolean ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġformat UUID ( time Stamp And Version Raw , Ġclock Sequence Variant And Node Raw , Ġinclude Br ackets ) ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Stamp And Version Raw . hashCode () Ġ+ Ġclock Sequence Variant And Node Raw . hashCode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġother Ġis ĠUUID Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . clock Sequence Variant And Node Raw Ġ== Ġclock Sequence Variant And Node Raw Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . time Stamp And Version Raw Ġ== Ġtime Stamp And Version Raw ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcompare To ( other : ĠUUID ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtime Stamp And Version Raw . compareTo ( other . time Stamp And Version Raw ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġ 0 ) Ġreturn Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġclock Sequence Variant And Node Raw . compareTo ( other . clock Sequence Variant And Node Raw ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUUID Ġversions ĊĠĠĠĠ Ġ* Ġhttps :// tools . ietf . org / html / rfc 4 1 2 2 # section - 4 . 1 . 3 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġenum Ġclass ĠVersion ( internal Ġval Ġid : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTIME _ BASE D ( 1 ), ĊĠĠĠĠĠĠĠ ĠD CE _ SECURITY ( 2 ), ĊĠĠĠĠĠĠĠ ĠNAME _ BASE D _ MD 5 ( 3 ), ĊĠĠĠĠĠĠĠ ĠR AN DOM _ BASE D ( 4 ), ĊĠĠĠĠĠĠĠ ĠNAME _ BASE D _ SHA 1 ( 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠA ĠNil ĠUUID Ġwith Ġall Ġfields Ġset Ġto Ġzero . ĊĠĠĠĠĠĠĠĠ Ġ* Ġhttps :// tools . ietf . org / html / rfc 4 1 2 2 # section - 4 . 1 . 7 ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġval ĠNIL : ĠUUID Ġ= Ġcreate ( 0 L , Ġ 0 L ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCheck Ġthe Ġ[ spec ] Ġstring Ġto Ġconform Ġto ĠUUID ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ` true ` Ġif Ġthe Ġ[ spec ] Ġstring Ġis Ġa ĠUUID Ġstring ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ UUID Experimental API ĊĠĠĠĠĠĠĠ Ġpublic Ġfun ĠisValid UUID String ( spec : ĠString ): ĠBoolean Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse UUID ( spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠUUID FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Stamp And Version Raw : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclock Sequence Variant And Node Raw : ĠLong ĊĠĠĠĠĠĠĠ Ġ): ĠUUID Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUUID ( time Stamp And Version Raw , Ġclock Sequence Variant And Node Raw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġversion For ( id : ĠInt ): ĠVersion ? Ġ= ĠVersion . values (). first OrNull Ġ{ Ġit . id Ġ== Ġid Ġ} ĊĠĠĠ Ġ} Ċ } Ċ