/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 ĠLicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ /* ĠBased Ġon Ġthe ĠThree Ten Bp Ġproject . Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 0 7 - present , ĠSte phen ĠC ole bo urne Ġ& ĠMichael ĠN asc imento ĠSan tos Ċ Ġ*/ Ċ package Ġkotlinx . datetime Ċ Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠAll Ġcode Ġbelow Ġwas Ġtaken Ġfrom Ġvarious Ġplaces Ġof Ġhttps :// github . com / Three Ten / th reet en bp Ġwith Ġfew Ġchanges Ċ Ġ*/ ĊĊ Ċ /** Ċ Ġ* ĠThe Ġnumber Ġof Ġseconds Ġper Ġhour . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠSE CON DS _ PER _ HOUR Ġ= Ġ 6 0 Ġ* Ġ 6 0 Ċ Ċ /** Ċ Ġ* ĠThe Ġnumber Ġof Ġseconds Ġper Ġminute . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠSE CON DS _ PER _ MINUTE Ġ= Ġ 6 0 Ċ Ċ /** Ċ Ġ* ĠThe Ġnumber Ġof Ġminutes Ġper Ġhour . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠMIN UTES _ PER _ HOUR Ġ= Ġ 6 0 Ċ Ċ /** Ċ Ġ* ĠThe Ġnumber Ġof Ġdays Ġin Ġa Ġ 4 0 0 Ġyear Ġcycle . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠDAY S _ PER _ CYCLE Ġ= Ġ 1 4 6 0 9 7 Ċ Ċ /** Ċ Ġ* ĠThe Ġnumber Ġof Ġdays Ġfrom Ġyear Ġzero Ġto Ġyear Ġ 1 9 7 0 . Ċ Ġ* ĠThere Ġare Ġfive Ġ 4 0 0 Ġyear Ġcycles Ġfrom Ġyear Ġzero Ġto Ġ 2 0 0 0 . Ċ Ġ* ĠThere Ġare Ġ 7 Ġle ap Ġyears Ġfrom Ġ 1 9 7 0 Ġto Ġ 2 0 0 0 . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠDAY S _ 0 0 0 0 _ TO _ 1 9 7 0 Ġ= ĠDAY S _ PER _ CYCLE Ġ* Ġ 5 Ġ- Ġ( 3 0 Ġ* Ġ 3 6 5 Ġ+ Ġ 7 ) Ċ Ċ // Ġdays Ġin Ġa Ġ 4 0 0 Ġyear Ġcycle Ġ= Ġ 1 4 6 0 9 7 Ċ // Ġdays Ġin Ġa Ġ 1 0 , 0 0 0 Ġyear Ġcycle Ġ= Ġ 1 4 6 0 9 7 Ġ* Ġ 2 5 Ċ // Ġseconds Ġper Ġday Ġ= Ġ 8 6 4 0 0 Ċ internal Ġconst Ġval ĠSE CON DS _ PER _ 1 0 0 0 0 _ YEAR S Ġ= Ġ 1 4 6 0 9 7 L Ġ* Ġ 2 5 L Ġ* Ġ 8 6 4 0 0 L Ċ Ċ /** Ċ Ġ* ĠH ours Ġper Ġday . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠHO UR S _ PER _ DAY Ġ= Ġ 2 4 Ċ Ċ /** Ċ Ġ* ĠSecond s Ġper Ġday . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠSE CON DS _ PER _ DAY : ĠInt Ġ= ĠSE CON DS _ PER _ HOUR Ġ* ĠHO UR S _ PER _ DAY Ċ Ċ internal Ġconst Ġval ĠN AN OS _ PER _ MINUTE : ĠLong Ġ= ĠN AN OS _ PER _ ONE Ġ* ĠSE CON DS _ PER _ MINUTE . to Long () Ċ Ċ internal Ġconst Ġval ĠN AN OS _ PER _ HOUR Ġ= ĠN AN OS _ PER _ ONE Ġ* ĠSE CON DS _ PER _ HOUR . to Long () Ċ Ċ /** Ċ Ġ* ĠNan os Ġper Ġday . Ċ Ġ*/ Ċ internal Ġconst Ġval ĠN AN OS _ PER _ DAY : ĠLong Ġ= ĠN AN OS _ PER _ ONE Ġ* ĠSE CON DS _ PER _ DAY . to Long () Ċ Ċ internal Ġconst Ġval ĠSE CON DS _ 0 0 0 0 _ TO _ 1 9 7 0 Ġ= Ġ( 1 4 6 0 9 7 L Ġ* Ġ 5 L Ġ- Ġ( 3 0 L Ġ* Ġ 3 6 5 L Ġ+ Ġ 7 L )) Ġ* Ġ 8 6 4 0 0 L Ċ Ċ /** Ċ Ġ* ĠS af ely Ġadds Ġtwo Ġlong Ġvalues . Ċ Ġ* Ġthrows Ġ[ Arithmetic Exception ] Ġif Ġthe Ġresult Ġoverflow s Ġa Ġlong Ċ Ġ*/ Ċ internal Ġactual Ġfun Ġsafe Add ( a : ĠLong , Ġb : ĠLong ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġsum Ġ= Ġa Ġ+ Ġb ĊĠĠĠ Ġ// Ġcheck Ġfor Ġa Ġchange Ġof Ġsign Ġin Ġthe Ġresult Ġwhen Ġthe Ġinputs Ġhave Ġthe Ġsame Ġsign ĊĠĠĠ Ġif Ġ(( a Ġxor Ġsum ) Ġ< Ġ 0 Ġ&& Ġ( a Ġxor Ġb ) Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠArithmetic Exception (" Addition Ġoverflow s Ġa Ġlong : Ġ$ a Ġ+ Ġ$ b ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsum Ċ } Ċ Ċ /** Ċ Ġ* ĠS af ely Ġadds Ġtwo Ġint Ġvalues . Ċ Ġ* Ġthrows Ġ[ Arithmetic Exception ] Ġif Ġthe Ġresult Ġoverflow s Ġan Ġint Ċ Ġ*/ Ċ internal Ġactual Ġfun Ġsafe Add ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġsum Ġ= Ġa Ġ+ Ġb ĊĠĠĠ Ġ// Ġcheck Ġfor Ġa Ġchange Ġof Ġsign Ġin Ġthe Ġresult Ġwhen Ġthe Ġinputs Ġhave Ġthe Ġsame Ġsign ĊĠĠĠ Ġif Ġ(( a Ġxor Ġsum ) Ġ< Ġ 0 Ġ&& Ġ( a Ġxor Ġb ) Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠArithmetic Exception (" Addition Ġoverflow s Ġan Ġint : Ġ$ a Ġ+ Ġ$ b ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġsum Ċ } Ċ Ċ /** Ċ Ġ* ĠS af ely Ġmultiply Ġa Ġlong Ġby Ġa Ġlong . Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġfirst Ġvalue Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġsecond Ġvalue Ċ Ġ* Ġ@ return Ġthe Ġnew Ġtotal Ċ Ġ* Ġ@ throws ĠArithmetic Exception Ġif Ġthe Ġresult Ġoverflow s Ġa Ġlong Ċ Ġ*/ Ċ internal Ġactual Ġfun Ġsafe Multiply ( a : ĠLong , Ġb : ĠLong ): ĠLong Ġ{ ĊĠĠĠ Ġif Ġ( b Ġ== Ġ 1 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( a Ġ== Ġ 1 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġb ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( a Ġ== Ġ 0 L Ġ|| Ġb Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtotal Ġ= Ġa Ġ* Ġb ĊĠĠĠ Ġif Ġ( total Ġ/ Ġb Ġ!= Ġa Ġ|| Ġa Ġ== ĠLong . MIN _ VALUE Ġ&& Ġb Ġ== Ġ- 1 L Ġ|| Ġb Ġ== ĠLong . MIN _ VALUE Ġ&& Ġa Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠArithmetic Exception (" Multip lication Ġoverflow s Ġa Ġlong : Ġ$ a Ġ* Ġ$ b ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtotal Ċ } Ċ Ċ /** Ċ Ġ* ĠS af ely Ġmultiply Ġan Ġint Ġby Ġan Ġint . Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġfirst Ġvalue Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġsecond Ġvalue Ċ Ġ* Ġ@ return Ġthe Ġnew Ġtotal Ċ Ġ* Ġ@ throws ĠArithmetic Exception Ġif Ġthe Ġresult Ġoverflow s Ġan Ġint Ċ Ġ*/ Ċ internal Ġactual Ġfun Ġsafe Multiply ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġtotal Ġ= Ġa . to Long () Ġ* Ġb . to Long () ĊĠĠĠ Ġif Ġ( total Ġ< ĠInt . MIN _ VALUE Ġ|| Ġtotal Ġ> ĠInt . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠArithmetic Exception (" Multip lication Ġoverflow s Ġan Ġint : Ġ$ a Ġ* Ġ$ b ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtotal . toInt () Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġfloor Ġdivision . Ċ Ġ* Ġ< p > Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ 0 } Ġfor Ġ{@ code Ġfloor Div ( 0 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 1 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 2 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 3 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 4 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 2 } Ġfor Ġ{@ code Ġfloor Div (- 5 , Ġ 4 )}. < br Ġ/> Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġdiv id end Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġdivisor Ċ Ġ* Ġ@ return Ġthe Ġfloor Ġdivision Ċ Ġ*/ Ċ internal Ġfun Ġfloor Div ( a : ĠLong , Ġb : ĠLong ): ĠLong Ġ= Ġif Ġ( a Ġ>= Ġ 0 ) Ġa Ġ/ Ġb Ġelse Ġ( a Ġ+ Ġ 1 ) Ġ/ Ġb Ġ- Ġ 1 Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġfloor Ġdivision . Ċ Ġ* Ġ< p > Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ 0 } Ġfor Ġ{@ code Ġfloor Div ( 0 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 1 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 2 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 3 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 1 } Ġfor Ġ{@ code Ġfloor Div (- 4 , Ġ 4 )}. < br Ġ/> Ċ Ġ* ĠThis Ġreturns Ġ{@ code Ġ- 2 } Ġfor Ġ{@ code Ġfloor Div (- 5 , Ġ 4 )}. < br Ġ/> Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġdiv id end Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġdivisor Ċ Ġ* Ġ@ return Ġthe Ġfloor Ġdivision Ċ Ġ*/ Ċ internal Ġfun Ġfloor Div ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ= Ġif Ġ( a Ġ>= Ġ 0 ) Ġa Ġ/ Ġb Ġelse Ġ( a Ġ+ Ġ 1 ) Ġ/ Ġb Ġ- Ġ 1 Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġfloor Ġmod ulus . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġreturns Ġ` 0 ` Ġfor Ġ` floor Mod ( 0 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 1 ` Ġfor Ġ` floor Mod (- 1 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 2 ` Ġfor Ġ` floor Mod (- 2 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 3 ` Ġfor Ġ` floor Mod (- 3 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 0 ` Ġfor Ġ` floor Mod (- 4 , Ġ 4 )`. < br ></ br > Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġdiv id end Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġdivisor Ċ Ġ* Ġ@ return Ġthe Ġfloor Ġmod ulus Ġ( positive ) Ċ Ġ*/ Ċ internal Ġfun Ġfloor Mod ( a : ĠLong , Ġb : ĠLong ): ĠLong Ġ= Ġ( a Ġ% Ġb Ġ+ Ġb ) Ġ% Ġb Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġfloor Ġmod ulus . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThis Ġreturns Ġ` 0 ` Ġfor Ġ` floor Mod ( 0 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 1 ` Ġfor Ġ` floor Mod (- 1 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 2 ` Ġfor Ġ` floor Mod (- 2 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 3 ` Ġfor Ġ` floor Mod (- 3 , Ġ 4 )`. < br ></ br > Ċ Ġ* ĠThis Ġreturns Ġ` 0 ` Ġfor Ġ` floor Mod (- 4 , Ġ 4 )`. < br ></ br > Ċ Ġ* Ċ Ġ* Ġ@ param Ġa Ġ Ġthe Ġdiv id end Ċ Ġ* Ġ@ param Ġb Ġ Ġthe Ġdivisor Ċ Ġ* Ġ@ return Ġthe Ġfloor Ġmod ulus Ġ( positive ) Ċ Ġ*/ Ċ internal Ġfun Ġfloor Mod ( a : ĠInt , Ġb : ĠInt ): ĠInt Ġ= Ġ( a Ġ% Ġb Ġ+ Ġb ) Ġ% Ġb Ċ Ċ // Ġorg . th reet en . bp . Zone Offset # build Id Ċ internal Ġfun Ġzone Id By Offset ( total Seconds : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( total Seconds Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" Z " ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġabs Total Seconds : ĠInt Ġ= Ġabs ( total Seconds ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġabs Hours : ĠInt Ġ= Ġabs Total Seconds Ġ/ ĠSE CON DS _ PER _ HOUR ĊĠĠĠĠĠĠĠ Ġval Ġabs Minutes : ĠInt Ġ= Ġabs Total Seconds Ġ/ ĠSE CON DS _ PER _ MINUTE Ġ% ĠMIN UTES _ PER _ HOUR ĊĠĠĠĠĠĠĠ Ġbuf . append ( if Ġ( total Seconds Ġ< Ġ 0 ) Ġ"-" Ġelse Ġ"+ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( if Ġ( abs Hours Ġ< Ġ 1 0 ) Ġ" 0 " Ġelse Ġ""). append ( abs Hours ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( if Ġ( abs Minutes Ġ< Ġ 1 0 ) Ġ": 0 " Ġelse Ġ": "). append ( abs Minutes ) ĊĠĠĠĠĠĠĠ Ġval Ġabs Seconds : ĠInt Ġ= Ġabs Total Seconds Ġ% ĠSE CON DS _ PER _ MINUTE ĊĠĠĠĠĠĠĠ Ġif Ġ( abs Seconds Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . append ( if Ġ( abs Seconds Ġ< Ġ 1 0 ) Ġ": 0 " Ġelse Ġ": "). append ( abs Seconds ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġorg . th reet en . bp . chrono . Iso Ch ron ology # is Le ap Year Ċ internal Ġfun Ġis Le ap Year ( year : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġpro le ptic Year : ĠLong Ġ= Ġyear . to Long () ĊĠĠĠ Ġreturn Ġpro le ptic Year Ġand Ġ 3 Ġ== Ġ 0 L Ġ&& Ġ( pro le ptic Year Ġ% Ġ 1 0 0 Ġ!= Ġ 0 L Ġ|| Ġpro le ptic Year Ġ% Ġ 4 0 0 Ġ== Ġ 0 L ) Ċ } Ċ