/* Ċ Ġ* ĠCopyright Ġ 2 0 1 3 ĠSquare ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . squareup . wire Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Json Element Ċ import Ġcom . google . gson . Type Adapter Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Token Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġcom . squareup . wire . Wire Field . Label Ċ import Ġcom . squareup . wire . internal . Field Binding Ċ import Ġcom . squareup . wire . internal . Runtime Message Adapter Ċ import Ġjava . io . IOException Ċ import Ġjava . math . BigInteger Ċ Ċ // Ġ 2 ^ 6 4 , Ġused Ġto Ġconvert Ġsint 6 4 Ġvalues Ġ>= Ġ 2 ^ 6 3 Ġto Ġunsigned Ġdecimal Ġform Ċ private Ġval ĠPO WER _ 6 4 Ġ= ĠBigInteger (" 1 8 4 4 6 7 4 4 0 7 3 7 0 9 5 5 1 6 1 6 ") Ċ Ċ internal Ġclass ĠMessageType Adapter < M Ġ: ĠMessage < M , ĠB >, ĠB Ġ: ĠMessage . Builder < M , ĠB >>( ĊĠ Ġprivate Ġval Ġgson : ĠGson , ĊĠ Ġtype : ĠType Token < M > Ċ ) Ġ: ĠType Adapter < M >() Ġ{ ĊĠ Ġprivate Ġval Ġmessage Adapter : ĠRuntime Message Adapter < M , ĠB > Ġ= ĊĠĠĠĠĠ ĠRuntime Message Adapter . create ( type . raw Type Ġas ĠClass < M >, Ġ" square . github . io / wire / unknown ") ĊĠ Ġprivate Ġval Ġfield Bindings : ĠMap < String , ĠField Binding < M , ĠB >> Ġ= ĊĠĠĠĠĠ Ġmessage Adapter . field Bindings . values . associate By Ġ{ Ġit . name Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer , Ġmessage : ĠM ?) Ġ{ ĊĠĠĠ Ġif Ġ( message Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġout . null Value () ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġout . begin Object () ĊĠĠĠ Ġfor Ġ( tag Binding Ġin Ġmessage Adapter . field Bindings . values ) Ġ{ ĊĠĠĠĠĠ Ġval Ġvalue Ġ= Ġtag Binding [ message ] Ġ?: Ġcontinue ĊĠĠĠĠĠ Ġout . name ( tag Binding . name ) ĊĠĠĠĠĠ Ġemit Json ( out , Ġvalue , Ġtag Binding . single Adapter (), Ġtag Binding . label ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġout . end Object () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġemit Json ( out : ĠJson Writer , Ġvalue : ĠAny , Ġadapter : ĠProto Adapter <* >, Ġlabel : ĠLabel ) Ġ{ ĊĠĠĠ Ġif Ġ( adapter Ġ=== ĠProto Adapter . UINT 6 4 ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( label . is Repeated ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlong s Ġ= Ġvalue Ġas ĠList < Long > ĊĠĠĠĠĠĠĠ Ġout . begin Array () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlong s . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġemit Uint 6 4 ( long s [ i ], Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout . end Array () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġemit Uint 6 4 ( value Ġas ĠLong , Ġout ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġgson . toJson ( value , Ġvalue . java Class , Ġout ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġemit Uint 6 4 ( value : ĠLong , Ġout : ĠJson Writer ) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġunsigned Ġ= ĠPO WER _ 6 4 . add ( BigInteger . valueOf ( value )) ĊĠĠĠĠĠ Ġout . value ( unsigned ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġout . value ( value ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġoverride Ġfun Ġread ( input : ĠJson Reader ): ĠM ? Ġ{ ĊĠĠĠ Ġif Ġ( input . peek () Ġ== ĠJson Token . NULL ) Ġ{ ĊĠĠĠĠĠ Ġinput . next Null () ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġelement Adapter Ġ= Ġgson . get Adapter ( Json Element :: class . java ) ĊĠĠĠ Ġval Ġbuilder Ġ= Ġmessage Adapter . newBuilder () ĊĊĠĠĠ Ġinput . begin Object () ĊĠĠĠ Ġwhile Ġ( input . peek () Ġ!= ĠJson Token . END _ OBJECT ) Ġ{ ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġinput . next Name () ĊĊĠĠĠĠĠ Ġval Ġfield Binding Ġ= Ġfield Bindings [ name ] ĊĠĠĠĠĠ Ġif Ġ( field Binding Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinput . skip Value () ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelement Adapter . read ( input ) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġparse Value ( field Binding , Ġelement ) ĊĠĠĠĠĠĠĠ Ġfield Binding [ builder ] Ġ= Ġvalue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinput . end Object () ĊĠĠĠ Ġreturn Ġbuilder . build () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Value ( field Binding : ĠField Binding < *, Ġ* >, Ġelement : ĠJson Element ): ĠAny ? Ġ{ ĊĠĠĠ Ġif Ġ( field Binding . label . is Repeated ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( element . is Json Null ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List < Any >() ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġitem Type Ġ= Ġfield Binding . single Adapter (). type !!. java ObjectType ĊĠĠĠĠĠ Ġval Ġadapter Ġ= Ġgson . get Adapter ( item Type ) ĊĠĠĠĠĠ Ġreturn Ġelement . as JsonArray . map ( adapter :: fromJson Tree ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( field Binding . is Map ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( element . is Json Null ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty Map < Any , ĠAny >() ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġkey Type Ġ= Ġfield Binding . key Adapter (). type !!. java ObjectType ĊĠĠĠĠĠ Ġval Ġvalue Type Ġ= Ġfield Binding . single Adapter (). type !!. java ObjectType ĊĠĠĠĠĠ Ġval Ġvalue Adapter Ġ= Ġgson . get Adapter ( valueType ) ĊĊĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġelement . as JsonObject ĊĠĠĠĠĠ Ġreturn ĠjsonObject . entrySet (). associate By ( ĊĠĠĠĠĠĠĠĠĠ Ġ{ Ġgson . fromJson ( it . key , Ġkey Type ) Ġ}, ĊĠĠĠĠĠĠĠĠĠ Ġ{ Ġvalue Adapter . fromJson Tree ( it . value ) Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġelement Type Ġ= Ġfield Binding . single Adapter (). type !!. java ObjectType ĊĠĠĠ Ġreturn Ġgson . fromJson ( element , Ġelement Type ) ĊĠ Ġ} Ċ } Ċ