/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 2 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . config Ċ Ċ import Ġjet brains . datal ore . plot . base .* Ċ import Ġjet brains . datal ore . plot . base . scale . transform . Transforms Ċ import Ġjet brains . datal ore . plot . builder . Var Binding Ċ import Ġjet brains . datal ore . plot . builder . scale . Continuous Only Mapper Provider Ċ import Ġjet brains . datal ore . plot . builder . scale . Discrete Only Mapper Provider Ċ import Ġjet brains . datal ore . plot . builder . scale . Mapper Provider Ċ import Ġjet brains . datal ore . plot . builder . scale . Scale Provider Ċ Ċ internal Ġobject ĠPlot Config Transforms Ġ{ ĊĠĠĠ Ġinternal Ġfun Ġcreate Transforms ( ĊĠĠĠĠĠĠĠ Ġlayer Configs : ĠList < Layer Config >, ĊĠĠĠĠĠĠĠ Ġscale Provider By Aes : ĠMap < Aes <* >, ĠScale Provider <* >>, ĊĠĠĠĠĠĠĠ Ġmapper Provider By Aes : ĠMap < Aes <* >, ĠMapper Provider <* >>, ĊĠĠĠĠĠĠĠ Ġexclude Stat Variables : ĠBoolean ĊĠĠĠ Ġ): ĠMap < Aes <* >, ĠTransform > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠX , Y Ġscale Ġ- Ġalways . ĊĠĠĠĠĠĠĠ Ġcheck ( scale Provider By Aes . containsKey ( Aes . X )) ĊĠĠĠĠĠĠĠ Ġcheck ( scale Provider By Aes . containsKey ( Aes . Y )) ĊĠĠĠĠĠĠĠ Ġcheck ( mapper Provider By Aes . containsKey ( Aes . X )) ĊĠĠĠĠĠĠĠ Ġcheck ( mapper Provider By Aes . containsKey ( Aes . Y )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata By Var Binding Ġ= ĠPlot Config Util . associate Var Bindings WithData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer Configs , Ġexclude Stat Variables ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvariables By Mapped Aes Ġ= ĠPlot Config Util . associate Aes With Mapped Variables ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlot Config Util . getVar Bindings ( layer Configs , Ġexclude Stat Variables ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAll Ġaes Ġused Ġin Ġbindings Ġand Ġx / y Ġaes . ĊĠĠĠĠĠĠĠ Ġval Ġaes Set : ĠSet < Aes <* >> Ġ= Ġdata By Var Binding . keys . map Ġ{ Ġit . aes Ġ}. toSet () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( Aes . X , ĠA es . Y ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCompute Ġdomains Ġfor Ġall Ġaes Ġwith Ġdiscrete Ġinput . ĊĊĠĠĠĠĠĠĠ Ġ// ĠExtract Ġ" discrete " Ġaes Ġset . ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete Aes Set : ĠMutable Set < Aes <* >> Ġ= ĠHashSet () ĊĠĠĠĠĠĠĠ Ġfor Ġ( aes Ġin Ġaes Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Provider Ġ= Ġscale Provider By Aes . getValue ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale Provider . discrete Domain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Aes Set . add ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( variables By Mapped Aes . containsKey ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariables Ġ= Ġvariables By Mapped Aes . getValue ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġany Not Numeric Data Ġ= Ġvariables . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġdata By Var Binding . getValue ( Var Binding ( it , Ġaes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . isEmpty ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Discrete Scale For Empty Data ( scale Provider , Ġmapper Provider By Aes . getValue ( aes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! data . is Numeric ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Not Numeric Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Aes Set . add ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġaxis Ġis Ġ' discrete ' Ġthen Ġput Ġall Ġ' positional ' Ġaes Ġto Ġ' discrete ' Ġaes Ġset . ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete X : ĠBoolean Ġ= Ġdiscrete Aes Set . any Ġ{ ĠA es . is Position al X ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete Y : ĠBoolean Ġ= Ġdiscrete Aes Set . any Ġ{ ĠA es . is Position al Y ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( discrete X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Aes Set . addAll ( aes Set . filter Ġ{ ĠA es . is Position al X ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( discrete Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Aes Set . addAll ( aes Set . filter Ġ{ ĠA es . is Position al Y ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDis crete Ġdomains Ġfrom Ġ' data '. ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete Data By Var Binding : ĠMap < Var Binding , ĠDataFrame > Ġ= Ġdata By Var Binding . filter Keys Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . aes Ġin Ġdiscrete Aes Set ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete Domain By Aes Ġ= ĠHashMap < Aes <* >, ĠLinked HashSet < Any >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ(( var Binding , Ġdata ) Ġin Ġdiscrete Data By Var Binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaes Ġ= Ġvar Binding . aes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= Ġvar Binding . variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactors Ġ= Ġdata . distinct Values ( variable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Domain By Aes . get Or Put ( aes ) Ġ{ ĠLinked HashSet () Ġ}. addAll ( factors ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġdiscrete Ġtransforms . ĊĠĠĠĠĠĠĠ Ġval Ġdiscrete Transform By Aes Ġ= ĠHashMap < Aes <* >, ĠDis crete Transform >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( aes Ġin Ġdiscrete Aes Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Provider Ġ= Ġscale Provider By Aes . getValue ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Break s Ġ= Ġscale Provider . break s Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdomain Values Ġ= Ġif Ġ( discrete Domain By Aes . containsKey ( aes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Domain By Aes . getValue ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( aes Ġin Ġset Of ( Aes . X , ĠA es . Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġalways Ġadd Ġx / y Ġwhere fore Ġit 's Ġpossible Ġthere Ġis Ġno Ġdata Ġassociated Ġwith Ġx / y Ġaes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" No Ġdiscrete Ġdata Ġfound Ġfor Ġaes Ġ$ aes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeffective Domain Ġ= Ġ( scale Break s Ġ+ Ġdomain Values ). distinct () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Domain Values Ġ= Ġif Ġ( scale Provider . discrete Domain Reverse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeffective Domain . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeffective Domain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Domain Limits Ġ= Ġ( scale Provider . limits Ġ?: Ġempty List ()). filter NotNull (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( scale Provider . discrete Domain Reverse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= ĠDis crete Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Values Ġ= Ġtransform Domain Values , Ġdomain Limits Ġ= Ġtransform Domain Limits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiscrete Transform By Aes [ aes ] Ġ= Ġtransform ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġcontinuous Ġtransforms . ĊĠĠĠĠĠĠĠ Ġval Ġcontinuous Transform By Aes Ġ= ĠHashMap < Aes <* >, ĠContinuous Transform >() ĊĠĠĠĠĠĠĠ Ġval Ġcontinuous Aes Set Ġ= Ġaes Set Ġ- Ġdiscrete Aes Set ĊĠĠĠĠĠĠĠ Ġfor Ġ( aes Ġin Ġcontinuous Aes Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Aes . is Position al XY ( aes ) Ġ&& Ġ!( aes Ġ== ĠA es . X Ġ|| Ġaes Ġ== ĠA es . Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExclude Ġall Ġ' positional ' Ġaes Ġexcept ĠX , ĠY . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Provider Ġ= Ġscale Provider By Aes . getValue ( aes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= Ġscale Provider . continuous Transform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimits Ġ= Ġto Continuous Lim s ( scale Provider . limits , Ġtransform ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeffective Transform Ġ= Ġlimits ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTrans forms . continuous With Limits ( transform , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtransform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuous Transform By Aes [ aes ] Ġ= Ġeffective Transform ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAll Ġ' positional ' Ġaes Ġmust Ġuse Ġthe Ġsame Ġtransform . ĊĠĠĠĠĠĠĠ Ġfun Ġjoin Discrete Transforms ( axis Aes : ĠList < Aes <* >> ): ĠTransform Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDis crete Transform . join ( axis Aes . map Ġ{ Ġdiscrete Transform By Aes . getValue ( it ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġx Axis Transform Ġ= Ġwhen Ġ( discrete X ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġjoin Discrete Transforms ( aes Set . filter Ġ{ ĠA es . is Position al X ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġcontinuous Transform By Aes . getValue ( Aes . X ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġy Axis Transform Ġ= Ġwhen Ġ( discrete Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġjoin Discrete Transforms ( aes Set . filter Ġ{ ĠA es . is Position al Y ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġcontinuous Transform By Aes . getValue ( Aes . Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠReplace Ġall Ġ' positional ' Ġtransforms Ġwith Ġthe Ġ' axis ' Ġtransform . ĊĠĠĠĠĠĠĠ Ġval Ġtransform By Position al Aes : ĠMap < Aes <* >, ĠTransform > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaes Set . filter Ġ{ ĠA es . is Position al X ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġx Axis Transform Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaes Set . filter Ġ{ ĠA es . is Position al Y ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. associate With Ġ{ Ġy Axis Transform Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdiscrete Transform By Aes Ġ+ Ġcontinuous Transform By Aes Ġ+ Ġtransform By Position al Aes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Discrete Scale For Empty Data ( ĊĠĠĠĠĠĠĠ Ġscale Provider : ĠScale Provider <* >, ĊĠĠĠĠĠĠĠ Ġmapper Provider : ĠMapper Provider < *> ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEmpty Ġdata Ġis Ġneither Ġ' discrete ' Ġnor Ġ' numeric '. ĊĠĠĠĠĠĠĠ Ġ// ĠWhich Ġscale Ġto Ġbuild ? ĊĠĠĠĠĠĠĠ Ġif Ġ( scale Provider . discrete Domain ) Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mapper Provider Ġis ĠDis crete Only Mapper Provider ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( mapper Provider Ġis ĠContinuous Only Mapper Provider ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġbreaks Ġ= Ġscale Provider . break s ĊĠĠĠĠĠĠĠ Ġval Ġlimits Ġ= Ġscale Provider . limits ĊĊĠĠĠĠĠĠĠ Ġval Ġbreaks Are Discrete Ġ= Ġbreaks ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . any Ġ{ Ġ!( it Ġis ĠNumber ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġlimits Are Discrete Ġ= Ġlimits ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot Ġa Ġlist Ġof Ġ 2 Ġnumbers . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . size Ġ> Ġ 2 Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġit . filter NotNull (). any Ġ{ Ġ!( it Ġis ĠNumber ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbreaks Are Discrete Ġ|| Ġlimits Are Discrete ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġraw Lim s Ġ: ĠA Ġpair Ġof Ġ 2 Ġ" nullable " Ġnumbers Ġ( the Ġsecond Ġnum Ġcan Ġbe Ġomitted ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġto Continuous Lim s ( raw Lim s : ĠList < Any ?> ?, Ġtransform : ĠContinuous Transform ): ĠPair < Double ?, ĠDouble ?> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( raw Lim s Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġli ms 2 Ġ= Ġraw Lim s . take ( 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġli ms 2 d Ġ= Ġli ms 2 . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it Ġis ĠNumber Ġ&& Ġit . toDouble (). is Finite ()) Ġ{ Ġ" Numbers Ġexpected : Ġlimits =$ li ms 2 " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . toDouble (). let Ġ{ Ġif Ġ( transform . isIn Domain ( it )) Ġit Ġelse Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġli ms Sorted Ġ= Ġwhen Ġ( li ms 2 d . filter NotNull (). size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġ( li ms 2 d Ġas ĠList < Double >). sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġli ms 2 d Ġ+ ĠlistOf ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġli ms Sorted ?. let Ġ{ ĠPair ( it [ 0 ], Ġit [ 1 ]) Ġ} ĊĠĠĠ Ġ} Ċ Ċ }