package Ġcom . s xt anna . k orm . writer Ċ Ċ import Ġcom . s xt anna . k orm . K orm Ċ import Ġcom . s xt anna . k orm . base . K orm Push er Ċ import Ġcom . s xt anna . k orm . data . K orm Null Ċ import Ġcom . s xt anna . k orm . data . custom . K orm Comment Ċ import Ġcom . s xt anna . k orm . data . custom . K orm Custom Codec Ċ import Ġcom . s xt anna . k orm . data . custom . K orm Custom Push Ċ import Ġcom . s xt anna . k orm . data . custom . K orm List Ċ import Ġcom . s xt anna . k orm . data . option . Options Ċ import Ġcom . s xt anna . k orm . util . Ref Help Ċ import Ġcom . s xt anna . k orm . writer . base . Writer Options Ċ import Ġjava . io . File Ċ import Ġjava . io . FileWriter Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . io . String Writer Ċ import Ġjava . io . Writer Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . util . UUID Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠThis Ġother Ġthing Ġliter ally Ġtakes Ġany Ġobject Ġand Ġsp its Ġout Ġa Ġserialized Ġk orm Ġrepresentation Ċ Ġ*/ Ċ @ Suppress (" Member Visibility Can Be Private ", Ġ" UN CHECK ED _ CAST ", Ġ" D uplicated Code ") Ċ class ĠK orm Writer ( private Ġval Ġindent : ĠInt , Ġprivate Ġval Ġoptions : ĠWriter Options ) Ċ { Ċ ĉ constructor ( options : ĠWriter Options ) Ċĉĉ ĉ : Ġthis ( 2 , Ġoptions ) ĊĉĊ ĉ constructor ( indent : ĠInt Ġ= Ġ 2 ) Ċĉĉ ĉ : Ġthis ( indent , ĠOptions . min ()) ĊĉĊ ĉ constructor ( indent : ĠInt Ġ= Ġ 2 , Ġvar arg Ġoptions : ĠOptions ) Ċĉĉ ĉ : Ġthis ( indent , ĠWriter Options ( options . toSet ())) ĊĉĊĉĊ ĉ @ Transient Ċ ĉ internal Ġlateinit Ġvar Ġk orm : ĠK orm ĊĉĊĉĊ ĉ fun Ġcontext ( writer : ĠWriter ): ĠWriter Context Ċ ĉ { Ċĉ ĉ return ĠWriter Context ( Unit , Ġwriter ) Ċ ĉ } ĊĉĊ ĉ fun Ġwrite ( data : ĠAny ): ĠString Ċ ĉ { Ċĉ ĉ return ĠString Writer (). apply Ġ{ Ġwrite ( data , Ġthis ) Ġ}. toString () Ċ ĉ } ĊĉĊ ĉ fun Ġwrite ( data : ĠAny , Ġfile : ĠFile ) Ċ ĉ { Ċĉ ĉ write ( data , ĠFile Writer ( file )) Ċ ĉ } ĊĉĊ ĉ fun Ġwrite ( data : ĠAny , Ġstream : ĠOutputStream ) Ċ ĉ { Ċĉ ĉ write ( data , ĠOutputStream Writer ( stream )) Ċ ĉ } ĊĉĊ ĉ fun Ġwrite ( data : ĠAny , Ġwriter : ĠWriter ) Ċ ĉ { Ċĉ ĉ Writer Context ( data , Ġwriter ). exec () Ċ ĉ } ĊĉĊ ĉ fun Ġbuild ( len ient : ĠBoolean Ġ= Ġfalse , Ġblock : ĠK orm Builder . () Ġ-> ĠUnit ): ĠString Ċ ĉ { Ċĉ ĉ return Ġbuilder ( len ient , Ġblock ). toString () Ċ ĉ } ĊĉĊ ĉ fun Ġbuilder ( len ient : ĠBoolean Ġ= Ġfalse , Ġblock : ĠK orm Builder . () Ġ-> ĠUnit ): ĠK orm Builder Ċ ĉ { Ċĉ ĉ return ĠK orm Builder ( len ient ). apply ( block ) Ċ ĉ } ĊĉĊĉĊ ĉ inner Ġclass ĠK orm Builder ( private Ġval Ġlen ient : ĠBoolean ) Ċ ĉ { ĊĉĉĊĉ ĉ private Ġval Ġtext Ġ= ĠString Writer () Ċĉ ĉ private Ġval Ġcont Ġ= ĠWriter Context ( 0 , Ġtext ) ĊĉĉĊĉ ĉ private Ġval Ġrecord Ġ= ĠBuilder Record () ĊĉĉĊĉĉĊĉ ĉ fun Ġd sl ( block : ĠK orm DSL Builder . () Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ K orm DSL Builder (). apply ( block ) Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny > Ġdata ( data : ĠT ) Ċĉ ĉ { Ċĉĉ ĉ data ("", Ġdata ) Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny > Ġdata ( name : ĠString , Ġdata : ĠT ) Ċĉ ĉ { Ċĉĉ ĉ val Ġname Is Blank Ġ= Ġname . isBlank () Ċĉĉ ĉ check If More Is Allowed ( name Is Blank ) ĊĉĉĉĊĉĉ ĉ if Ġ(! name Is Blank ) Ċĉĉ ĉ { Ċĉĉĉ ĉ cont . write Indent () Ċĉĉĉ ĉ cont . write Name ( name ) Ċĉĉĉ ĉ record . has Written WithName Ġ= Ġtrue Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ record . has Written Without Name Ġ= Ġtrue Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( name Is Blank ) Ġcont . write Indent () Ċĉĉ ĉ cont . write Data ( data , Ġname . isNotBlank ()) Ċĉĉ ĉ cont . write NewLine () Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġdata ( block : ĠK orm Builder . () Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ data ("", Ġblock ) Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġdata ( name : ĠString , Ġblock : ĠK orm Builder . () Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ val Ġname Is Blank Ġ= Ġname . isBlank () Ċĉĉ ĉ check If More Is Allowed ( name Is Blank ) ĊĉĉĉĊĉĉ ĉ if Ġ(! name Is Blank ) Ċĉĉ ĉ { Ċĉĉĉ ĉ cont . write Indent () Ċĉĉĉ ĉ cont . write Name ( name ) Ċĉĉĉ ĉ record . has Written WithName Ġ= Ġtrue Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ record . has Written Without Name Ġ= Ġtrue Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( name Is Blank ) Ġcont . write Indent () Ċĉĉ ĉ cont . write Hash Open () ĊĉĉĉĊĉĉ ĉ cont . write NewLine () ĊĉĉĉĊĉĉ ĉ cont . indent More () Ċĉĉ ĉ block () Ċĉĉ ĉ cont . indent Less () ĊĉĉĉĊĉĉ ĉ cont . write Indent () Ċĉĉ ĉ cont . write Hash Close () Ċĉĉ ĉ cont . write NewLine () Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny ?> Ġlist ( name : ĠString Ġ= Ġ"", Ġlist : ĠList < T >) Ċĉ ĉ { Ċĉĉ ĉ list < T >( name ) Ġ{ Ċĉĉĉ ĉ addAll ( list ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny ?> Ġlist ( name : ĠString Ġ= Ġ"", Ġvar arg Ġlist : ĠT ) Ċĉ ĉ { Ċĉĉ ĉ list < T >( name ) Ġ{ Ċĉĉĉ ĉ addAll (* list ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġ< K Ġ: ĠAny ?, ĠV Ġ: ĠAny ?> Ġhash ( name : ĠString Ġ= Ġ"", Ġhash : ĠMap < K , ĠV >) Ċĉ ĉ { Ċĉĉ ĉ hash < K , ĠV >( name ) Ġ{ Ċĉĉĉ ĉ put All ( hash ) Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny ?> Ġlist ( name : ĠString Ġ= Ġ"", Ġblock : ĠK orm List Builder < T >. () Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ val Ġname Is Blank Ġ= Ġname . isBlank () Ċĉĉ ĉ check If More Is Allowed ( name Is Blank ) ĊĉĉĉĊĉĉ ĉ if Ġ(! name Is Blank ) Ċĉĉ ĉ { Ċĉĉĉ ĉ cont . write Indent () Ċĉĉĉ ĉ cont . write Name ( name ) Ċĉĉĉ ĉ record . has Written WithName Ġ= Ġtrue Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ record . has Written Without Name Ġ= Ġtrue Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġbuilder Ġ= ĠK orm List Builder ( block ) Ċĉĉ ĉ if Ġ( name Is Blank ) Ġcont . write Indent () Ċĉĉ ĉ cont . write List ( builder . list ) ĊĉĉĉĊĉĉ ĉ builder . list . clear () ĊĉĉĉĊĉĉ ĉ cont . write NewLine () Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġ< K Ġ: ĠAny ?, ĠV Ġ: ĠAny ?> Ġhash ( name : ĠString Ġ= Ġ"", Ġblock : ĠK orm Hash Builder < K , ĠV >. () Ġ-> ĠUnit ) Ċĉ ĉ { Ċĉĉ ĉ val Ġname Is Blank Ġ= Ġname . isBlank () Ċĉĉ ĉ check If More Is Allowed ( name Is Blank ) ĊĉĉĉĊĉĉ ĉ if Ġ(! name Is Blank ) Ċĉĉ ĉ { Ċĉĉĉ ĉ cont . write Indent () Ċĉĉĉ ĉ cont . write Name ( name ) Ċĉĉĉ ĉ record . has Written WithName Ġ= Ġtrue Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ record . has Written Without Name Ġ= Ġtrue Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġbuilder Ġ= ĠK orm Hash Builder ( block ) Ċĉĉ ĉ if Ġ( name Is Blank ) Ġcont . write Indent () Ċĉĉ ĉ cont . write Hash ( builder . hash Ġas ĠMap < Any ?, ĠAny ?> ) ĊĉĉĉĊĉĉ ĉ builder . hash . clear () ĊĉĉĉĊĉĉ ĉ cont . write NewLine () Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ private Ġfun Ġcheck If More Is Allowed ( new Name Blank : ĠBoolean ) Ċĉ ĉ { Ċĉĉ ĉ if Ġ( len ient ) Ġreturn ĊĉĉĉĊĉĉ ĉ if Ġ( record . has Written Without Name ) Ċĉĉ ĉ { Ċĉĉĉ ĉ throw ĠIllegalStateException (" You Ġcannot Ġwrite Ġmore Ġdata Ġto Ġa Ġdocument Ġwith Ġa Ġloose Ġkey ") Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( record . has Written WithName Ġ&& ĠnewName Blank ) Ċĉĉ ĉ { Ċĉĉĉ ĉ throw ĠIllegalStateException (" You Ġcan Ġonly Ġwrite Ġnamed Ġvalues Ġinto Ġthis Ġdocument ") Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ override Ġfun ĠtoString (): ĠString Ċĉ ĉ { Ċĉĉ ĉ return Ġtext . toString () Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ inner Ġclass ĠK orm List Builder < T Ġ: ĠAny ? >( block : ĠK orm List Builder < T >. () Ġ-> ĠUnit ) Ċĉ ĉ { ĊĉĉĉĊĉĉ ĉ internal Ġval Ġlist Ġ= Ġmutable ListOf < T >() ĊĉĉĉĊĉĉ ĉ init Ċĉĉ ĉ { Ċĉĉĉ ĉ block () Ċĉĉ ĉ } Ċĉĉĉ ĊĉĉĉĊĉĉ ĉ fun Ġadd ( element : ĠT ) Ġ= Ġapply Ġ{ Ċĉĉĉ ĉ this . list . add ( element ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ fun Ġadd All ( var arg Ġelement : ĠT ) Ġ= Ġapply Ġ{ Ċĉĉĉ ĉ this . list . addAll ( element ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ fun Ġadd All ( collection : ĠCollection < T >) Ġ= Ġapply Ġ{ Ċĉĉĉ ĉ this . list . addAll ( collection ) Ċĉĉ ĉ } ĊĉĉĉĊĉ ĉ } ĊĉĉĊĉ ĉ inner Ġclass ĠK orm Hash Builder < K Ġ: ĠAny ?, ĠV Ġ: ĠAny ? >( block : ĠK orm Hash Builder < K , ĠV >. () Ġ-> ĠUnit ) Ċĉ ĉ { ĊĉĉĉĊĉĉ ĉ internal Ġval Ġhash Ġ= Ġmutable Map Of < K , ĠV >() ĊĉĉĉĊĉĉ ĉ init Ċĉĉ ĉ { Ċĉĉĉ ĉ block () Ċĉĉ ĉ } Ċĉĉĉ ĊĉĉĉĊĉĉ ĉ fun Ġput ( key : ĠK , Ġvalue : ĠV ) Ġ= Ġapply Ġ{ Ċĉĉĉ ĉ this . hash [ key ] Ġ= Ġvalue Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ fun Ġput All ( hash : ĠMap < K , ĠV >) Ġ= Ġapply Ġ{ Ċĉĉĉ ĉ this . hash . put All ( hash ) Ċĉĉ ĉ } ĊĉĉĉĊĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ @ Suppress (" Remove Red undant Back ticks ") Ċĉ ĉ inner Ġclass ĠK orm DSL Builder Ċĉ ĉ { ĊĉĉĉĊĉĉ ĉ operator Ġfun Ġ< T Ġ: ĠAny > ĠString . invoke ( data : ĠT ) Ċĉĉ ĉ { Ċĉĉĉ ĉ data ( this , Ġdata ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ operator Ġfun Ġ< T Ġ: ĠAny ?> ĠString . invoke ( list : ĠList < T >) Ċĉĉ ĉ { Ċĉĉĉ ĉ list ( this , Ġlist ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ operator Ġfun Ġ< T Ġ: ĠAny ?> ĠString . invoke ( var arg Ġelement : ĠT ) Ċĉĉ ĉ { Ċĉĉĉ ĉ list ( this , Ġ* element ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ operator Ġfun Ġ< K Ġ: ĠAny ?, ĠV Ġ: ĠAny ?> ĠString . invoke ( var arg Ġentry : ĠPair < K , ĠV >) Ċĉĉ ĉ { Ċĉĉĉ ĉ hash ( this , Ġentry . toMap ()) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ operator Ġfun ĠString . invoke ( block : ĠK orm DSL Builder . () Ġ-> ĠUnit ) Ċĉĉ ĉ { Ċĉĉĉ ĉ data ( this ) Ġ{ Ġblock () Ġ} Ċĉĉ ĉ } Ċĉĉĉ ĊĉĉĉĊĉĉ ĉ infix Ġfun Ġ< T Ġ: ĠAny ?, ĠO Ġ: ĠAny ?> ĠT .` _ `( other : ĠO ): ĠPair < T , ĠO > Ċĉĉ ĉ { Ċĉĉĉ ĉ return ĠPair ( this , Ġother ) Ċĉĉ ĉ } ĊĉĉĉĊĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ private Ġinner Ġclass ĠBuilder Record Ċĉ ĉ { ĊĉĉĉĊĉĉ ĉ var Ġhas Written WithName Ġ= Ġfalse Ċĉĉ ĉ var Ġhas Written Without Name Ġ= Ġfalse ĊĉĉĉĊĉ ĉ } ĊĉĉĊ ĉ } ĊĉĊ ĉ inner Ġclass ĠWriter Context Ġinternal Ġconstructor ( private Ġval Ġdata : ĠAny , Ġprivate Ġval Ġwriter : ĠWriter ) Ċ ĉ { ĊĉĉĊĉ ĉ private Ġvar Ġname Count Ġ= Ġ 0 ĊĉĉĊĉ ĉ private Ġval Ġwriting Name : ĠBoolean Ċĉĉ ĉ get () Ġ= Ġname Count Ġ> Ġ 0 ĊĉĉĊĉĉĊĉ ĉ private Ġvar Ġcurrent Indent Ġ= Ġ 0 ĊĉĉĊĉĉĊĉ ĉ fun Ġexec () Ċĉ ĉ { Ċĉĉ ĉ val Ġclazz Ġ= Ġdata . java Class ĊĉĉĉĊĉĉ ĉ if Ġ( Ref Help . is K orm Type ( clazz )) Ċĉĉ ĉ { Ċĉĉĉ ĉ write Data ( data ) Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ indent Less () Ġ// Ġhot Ġfix Ċĉĉĉ ĉ write Fields ( data , ĠRef Help . find Annotation < K orm List >( clazz )?. props ?. toList ()) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ writer . flush () Ċĉĉ ĉ writer . close () Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ // Ġutil Ġfunctions Ċĉ ĉ fun Ġindent Less () Ċĉ ĉ { Ċĉĉ ĉ current Indent Ġ-= Ġindent Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġindent More () Ċĉ ĉ { Ċĉĉ ĉ current Indent Ġ+= Ġindent Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġwrite Indent () Ċĉ ĉ { Ċĉĉ ĉ writer . write (" Ġ". repeat ( current Indent . coerce At Least ( 0 ))) Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Comma () Ċĉ ĉ { Ċĉĉ ĉ writer . write (",") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Space () Ċĉ ĉ { Ċĉĉ ĉ writer . write (" Ġ") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite NewLine () Ċĉ ĉ { Ċĉĉ ĉ writer . write ("\ n ") Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġwrite Complex Tick () Ċĉ ĉ { Ċĉĉ ĉ writer . write (" ` ") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Single Quote () Ċĉ ĉ { Ċĉĉ ĉ writer . write ("' ") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Double Quote () Ċĉ ĉ { Ċĉĉ ĉ writer . write ("\" ") Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġwrite List Open () Ċĉ ĉ { Ċĉĉ ĉ writer . write ("[ ") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite List Close () Ċĉ ĉ { Ċĉĉ ĉ writer . write (" ]") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Hash Open () Ċĉ ĉ { Ċĉĉ ĉ writer . write ("{ ") Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Hash Close () Ċĉ ĉ { Ċĉĉ ĉ writer . write (" }") Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ // Ġwrite Ġtypes Ċĉ ĉ fun Ġwrite List ( list : ĠList <* >) Ċĉ ĉ { Ċĉĉ ĉ write List Open () ĊĉĉĉĊĉĉ ĉ if Ġ( list . isEmpty ()) Ċĉĉ ĉ { Ċĉĉĉ ĉ write Space () Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ list . forEach Indexed Ġ{ Ġi , Ġit Ġ-> Ċĉĉĉĉ ĉ val Ġdata Ġ= Ġit Ġ?: ĠK orm Null ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( data Ġ=== ĠK orm Null Ġ&& Ġ! options . serialize Null s ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ return @ forEach Indexed Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ val Ġtype Ġ= ĠRef Help . is K orm Type ( data . java Class ) ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( i Ġ== Ġ 0 ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ // Ġw tf Ġis Ġthe Ġpurpose Ġof Ġthis ??? Ċĉĉĉĉĉ ĉ if Ġ( options . list Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ indent More () Ċĉĉĉĉĉĉ ĉ write Indent () Ġ// Ġif Ġissues Ġar ise , Ġthe Ġchange Ġwas Ġ` if Ġ( k orm Type ) Ġwrite Indent ()` Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ġif Ġ(! type Ġ&& Ġoptions . complex ListEntry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ indent More () Ċĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ write Data ( data , Ġlisted Ġ= Ġtrue ) ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( i Ġ< Ġlist . last Index ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Comma () ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ // Ġw tf Ġis Ġthe Ġpurpose Ġof Ġthis ??? Ġpt . Ġ 2 Ċĉĉĉĉĉ ĉ if Ġ( options . list Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ write Indent () Ġ// Ġif Ġissues Ġar ise , Ġthe Ġchange Ġwas Ġ` if Ġ( k orm Type ) Ġwrite Indent ()` Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ġif Ġ(! type Ġ&& Ġoptions . complex ListEntry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ return @ forEach Indexed Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( options . list Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( list . size Ġ> Ġ 1 Ġ&& Ġoptions . trailing Com mas ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Comma () Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ write NewLine () ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( i Ġ== Ġlist . last Index ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ indent Less () Ċĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġif Ġ(! type ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . complex ListEntry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( list . size Ġ> Ġ 1 Ġ&& Ġoptions . trailing Com mas ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Comma () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ if Ġ( i Ġ== Ġlist . last Index ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ indent Less () Ċĉĉĉĉĉĉĉ Ċĉĉĉĉĉĉ ĉ if Ġ( options . complex ListEntry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ write List Close () Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Hash ( hash : ĠMap < *, Ġ* >) Ċĉ ĉ { Ċĉĉ ĉ val Ġentries Ġ= Ġhash . entries ĊĉĉĉĊĉĉ ĉ var Ġcur Ġ= Ġ 0 Ċĉĉ ĉ val Ġmax Ġ= Ġentries . size Ġ- Ġ 1 ĊĉĉĉĊĉĉ ĉ write Hash Open () ĊĉĉĉĊĉĉ ĉ if Ġ( entries . isNotEmpty ()) Ċĉĉ ĉ { Ċĉĉĉ ĉ indent More () ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ write Space () Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ entries . forEach Ġ{ ĊĉĉĉĉĊĉĉĉ ĉ val Ġname Ġ= Ġit . key Ġ?: ĠK orm Null Ċĉĉĉ ĉ val Ġdata Ġ= Ġit . value Ġ?: ĠK orm Null ĊĉĉĉĉĊĉĉĉ ĉ if Ġ(( name Ġ=== ĠK orm Null Ġ|| Ġdata Ġ=== ĠK orm Null ) Ġ&& Ġ! options . serialize Null s ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ return @ forEach Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġif Ġ( cur Ġ== Ġ 0 ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġif Ġ( cur Ġ== Ġ 0 ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ write Name ( name ) Ċĉĉĉ ĉ write Data ( data , Ġtrue ) ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( cur ++ Ġ< Ġmax ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . comma After Hash Entry ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Comma () Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( entries . isNotEmpty ()) Ċĉĉ ĉ { Ċĉĉĉ ĉ if Ġ( options . trailing Com mas Ġ&& Ġ( options . hash Entry On NewLine Ġ&& Ġhash . size Ġ> Ġ 1 )) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ write Comma () Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ indent Less () ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ write Hash Close () Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Base ( inst : ĠAny , Ġname : ĠBoolean Ġ= Ġfalse ) Ċĉ ĉ { Ċĉĉ ĉ when Ġ( inst ) Ċĉĉ ĉ { Ċĉĉĉ ĉ is ĠK orm Null ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ write Complex Tick () Ċĉĉĉĉ ĉ writer . write (" null ") Ċĉĉĉĉ ĉ write Complex Tick () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ is ĠChar ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ write Single Quote () Ċĉĉĉĉ ĉ writer . write ( inst . toString ()) Ċĉĉĉĉ ĉ write Single Quote () Ċĉĉĉ ĉ } Ċĉĉĉ ĉ is ĠEnum <* >, Ġis ĠNumber , Ġis ĠBoolean Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ writer . write ( inst . toString ()) Ċĉĉĉ ĉ } Ċĉĉĉ ĉ is ĠCharSequence , Ġis ĠUUID ĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ val Ġstring Ġ= Ġinst . toString () Ċĉĉĉĉ ĉ val Ġquoted Ġ= Ġ! name Ġ|| Ġstring . shouldBe Quoted () ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( quoted ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ writer . write ( string . replace (" \"", Ġ"\\ \"" )) ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( quoted ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ is ĠThrowable ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( inst . message Ġ!= Ġnull ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉĉ ĉ writer . write ( inst . toString ()) Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉ ĉ writer . write ( String Writer (). use Ġ{ ĠPrintWriter ( it ). use Ġ{ Ġinst . printStackTrace ( it ) Ġ}; Ġit . toString () Ġ}) Ċĉĉĉĉĉ ĉ write Double Quote () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉĉ ĉ else ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( name ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Complex Tick () Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ write Data ( inst ) ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( name ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Complex Tick () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ // Ġbacking Ġfunctions Ċĉ ĉ fun Ġwrite Name ( inst : ĠAny ) Ċĉ ĉ { Ċĉĉ ĉ name Count ++ Ċĉĉ ĉ write Base ( inst , Ġtrue ) Ċĉĉ ĉ name Count -- ĊĉĉĉĊĉĉ ĉ writer . write (": ") ĊĉĉĉĊĉĉ ĉ if Ġ( options . space After Assign ) Ċĉĉ ĉ { Ċĉĉĉ ĉ write Space () Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Data ( inst : ĠAny , Ġnamed : ĠBoolean Ġ= Ġfalse , Ġlisted : ĠBoolean Ġ= Ġfalse ) Ċĉ ĉ { Ċĉĉ ĉ val Ġclazz Ġ= Ġinst . java Class ĊĉĉĉĊĉĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉĉ ĉ val Ġcustom Ġ= Ġget Custom Push ( clazz ) ĊĉĉĉĊĉĉ ĉ if Ġ( custom Ġ!= Ġnull ) Ġcustom . push ( this , Ġinst ) Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ when Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ Ref Help . is BaseType ( clazz ) Ġ-> Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Base ( inst ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ Ref Help . is Hash Type ( clazz ) Ġ-> Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Hash ( Ref Help . to Hash able ( inst ) Ġ?: Ġreturn ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ Ref Help . is ListType ( clazz ) Ġ-> Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write List ( Ref Help . toList able ( inst ) Ġ?: Ġreturn ) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ċĉĉĉĉ ĉ { Ġ// Ġwrite Ġclass Ġfields Ġas Ġa Ġhash ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ val Ġas List Ġ= ĠRef Help . find Annotation < K orm List >( clazz ) ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( asList Ġ!= Ġnull ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ return Ġwrite Fields ( inst , Ġas List . props . toList ()) Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ(! named Ġ&& Ġ! listed ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ write Hash Open () ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ write Fields ( inst ) ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ write Hash Close () Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ fun Ġwrite Fields ( inst : ĠAny , Ġprops : ĠList < String >? Ġ= Ġnull ) Ċĉ ĉ { Ċĉĉ ĉ val Ġclazz Ġ= Ġinst . java Class ĊĉĉĉĊĉĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉĉ ĉ val Ġcustom Ġ= Ġget Custom Push ( clazz ) Ċĉĉ ĉ if Ġ( custom Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġcustom . push ( this , Ġinst ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ if Ġ( options . include Comments ) Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġcomment Ġ= ĠRef Help . find Annotation < K orm Comment >( clazz ) ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( comment Ġ!= Ġnull Ġ&& Ġcomment . comment . isNotEmpty ()) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( comment . comment . size Ġ== Ġ 1 ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ writer . write ("// Ġ${ comment . comment [ 0 ] }\ n ") Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ writer . write (" /** \ n ") Ċĉĉĉĉĉ ĉ for Ġ( line Ġin Ġcomment . comment ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ writer . write (" Ġ* Ġ$ line \ n ") Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ writer . write (" Ġ*/ \ n ") Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġfields Ġ= ĠRef Help . fields ( clazz ). filter Not ( Field :: is Synt hetic ) ĊĉĉĉĊĉĉ ĉ if Ġ( props Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ write List ( props . map Ġ{ Ġname Ġ-> Ġfields . find Ġ{ Ġit . name Ġ== Ġname Ġ} ?. get ( inst ) Ġ}) Ċĉĉ ĉ } Ċĉĉ ĉ else Ċĉĉ ĉ { Ċĉĉĉ ĉ if Ġ( fields . isNotEmpty ()) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ indent More () Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ for Ġ(( index , Ġfield ) Ġin Ġfields . with Index ()) Ċĉĉĉ ĉ { ĊĉĉĉĉĉĊĉĉĉĉ ĉ val Ġname Ġ= Ġfield . name Ċĉĉĉĉ ĉ val Ġdata Ġ= Ġfield [ inst ] Ġ?: ĠK orm Null ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( data Ġ=== ĠK orm Null Ġ&& Ġ! options . serialize Null s ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ continue Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( options . include Comments ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ val Ġcomment Ġ= Ġfield . getAnnotation ( K orm Comment :: class . java ) ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( comment Ġ!= Ġnull Ġ&& Ġcomment . comment . isNotEmpty ()) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( comment . comment . size Ġ== Ġ 1 ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ writer . write ("// Ġ${ comment . comment [ 0 ] }\ n ") Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ writer . write (" /** \ n ") Ċĉĉĉĉĉĉĉ ĉ for Ġ( line Ġin Ġcomment . comment ) Ċĉĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉĉ ĉ writer . write (" Ġ* Ġ$ line \ n ") Ċĉĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉĉ ĉ writer . write (" Ġ*/ \ n ") Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Indent () Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ write Name ( name ) Ċĉĉĉĉ ĉ write Data ( data , Ġtrue ) ĊĉĉĉĉĉĊĉĉĉĉ ĉ if Ġ( index Ġ< Ġfields . last Index ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ if Ġ( options . comma After Hash Entry ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ write Comma () Ċĉĉĉĉĉ ĉ } ĊĉĉĉĉĉĉĊĉĉĉĉĉ ĉ if Ġ( writing Name ) Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . complex Key Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ċĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉ ĉ if Ġ( options . hash Entry On NewLine ) Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write NewLine () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉĉ ĉ else Ċĉĉĉĉĉĉ ĉ { Ċĉĉĉĉĉĉĉ ĉ write Space () Ċĉĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( fields . isNotEmpty ()) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ if Ġ( options . trailing Com mas Ġ&& Ġfields . size Ġ> Ġ 1 ) Ċĉĉĉĉ ĉ { Ċĉĉĉĉĉ ĉ write Comma () Ċĉĉĉĉ ĉ } ĊĉĉĉĉĉĊĉĉĉĉ ĉ indent Less () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ fun Ġ< T Ġ: ĠAny > Ġget Custom Push ( clazz : ĠClass < T >, Ġcaller : ĠK orm Push er < *> ? Ġ= Ġnull ): ĠK orm Push er < T >? Ċĉ ĉ { Ċĉĉ ĉ val Ġstored Ġ= Ġk orm . push er Of ( clazz ) Ċĉĉ ĉ if Ġ( stored Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġstored Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġpush er Ġ= ĠRef Help . find Annotation < K orm Custom Push >( clazz ) Ċĉĉ ĉ if Ġ( push er Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġextract From ( push er . push er ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ val Ġcodec Ġ= ĠRef Help . find Annotation < K orm Custom Codec >( clazz ) Ċĉĉ ĉ if Ġ( codec Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġextract From ( codec . codec ) Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ var Ġnext Super : ĠClass < *> ? Ġ= Ġclazz . super class ĊĉĉĉĊĉĉ ĉ while Ġ( next Super Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġpush er Ġ= Ġget Custom Push ( next Super ) ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( caller Ġ!= Ġnull Ġ&& Ġcaller Ġ== Ġpush er ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ return Ġnull Ġ// Ġno Ġstack Ġoverflow s Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ if Ġ( push er Ġ!= Ġnull ) Ċĉĉĉ ĉ { Ċĉĉĉĉ ĉ return Ġpush er Ġas ? ĠK orm Push er < T > Ċĉĉĉ ĉ } ĊĉĉĉĉĊĉĉĉ ĉ next Super Ġ= Ġnext Super . super class Ċĉĉ ĉ } ĊĉĉĉĊĉĉ ĉ return Ġnull Ċĉ ĉ } ĊĉĉĊĉĉĊĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉ ĉ private Ġfun Ġ< T Ġ: ĠAny > Ġextract From ( clazz : ĠK Class < out ĠK orm Push er <* >> ): ĠK orm Push er < T >? Ċĉ ĉ { Ċĉĉ ĉ return Ġtry Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġinstance Ġ= Ġclazz . java . getDeclared Field (" INSTANCE ") Ċĉĉĉ ĉ instance . is Accessible Ġ= Ġtrue ĊĉĉĉĉĊĉĉĉ ĉ instance . get ( null ) Ġas ? ĠK orm Push er < T > Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( ex : ĠException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġclazz . java . newInstance () Ġas ? ĠK orm Push er < T > Ċĉĉ ĉ } Ċĉ ĉ } ĊĉĉĊĉ ĉ private Ġfun ĠString . shouldBe Quoted (): ĠBoolean Ċĉ ĉ { Ċĉĉ ĉ return Ġany Ġ{ Ġit . is Whitespace () Ġ|| Ġit Ġ== Ġ'\'' Ġ|| Ġit Ġ== Ġ'"' Ġ|| Ġit Ġ== Ġ'.' Ġ|| Ġit Ġ== Ġ',' Ġ} Ċĉ ĉ } ĊĉĉĊ ĉ } Ċĉ Ċ }