package Ġcom . bug sn ag . android Ċ Ċ import Ġjava . util . Locale Ċ Ċ internal Ġclass ĠEvent Deserializer ( ĊĠĠĠ Ġprivate Ġval Ġclient : ĠClient , ĊĠĠĠ Ġprivate Ġval Ġproject Packages : ĠCollection < String > Ċ ) Ġ: ĠMap Deserializer < Event > Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġapp Deserializer Ġ= ĠApp Deserializer () ĊĠĠĠ Ġprivate Ġval Ġdevice Deserializer Ġ= ĠDevice Deserializer () ĊĠĠĠ Ġprivate Ġval Ġstack frame Deserializer Ġ= ĠStack frame Deserializer () ĊĠĠĠ Ġprivate Ġval Ġerror Deserializer Ġ= ĠError Deserializer ( stack frame Deserializer , Ġclient . getLogger ()) ĊĠĠĠ Ġprivate Ġval Ġthread Deserializer Ġ= ĠThread Deserializer ( stack frame Deserializer , Ġclient . getLogger ()) ĊĠĠĠ Ġprivate Ġval Ġbreadcrumb Deserializer Ġ= ĠB readcrumb Deserializer ( client . getLogger ()) ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( map : ĠMutable Map < String , ĠAny ?> ): ĠEvent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġseverity Reason Ġ= Ġmap [" severity Reason "] Ġas ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠ Ġval Ġfeature Flags Ġ= Ġmap [" feature Flags "] Ġas ? ĠList < Map < String , ĠAny ? >> ĊĠĠĠĠĠĠĠ Ġval Ġseverity Reason Type Ġ= Ġseverity Reason [" type "] Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġseverity Ġ= Ġmap [" severity "] Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġunhandled Ġ= Ġmap [" un handled "] Ġas ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Unhandled Ġ= Ġget Original Unhandled ( severity Reason , Ġunhandled ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhandled State Ġ= ĠSeverity Reason ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Reason Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . valueOf ( severity . toUpperCase ( Locale . US )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunhandled , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Unhandled , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġconstruct Ġevent ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠNative Interface . create Event ( null , Ġclient , Ġhandled State ) ĊĠĠĠĠĠĠĠ Ġevent . context Ġ= Ġmap [" context "] Ġas ĠString ? ĊĠĠĠĠĠĠĠ Ġevent . grouping Hash Ġ= Ġmap [" grouping Hash "] Ġas ĠString ? ĊĊĠĠĠĠĠĠĠ Ġ// ĠapiKey Ġif Ġit Ġexists Ġin Ġthe Ġmap Ġand Ġis Ġnot Ġempty ĊĠĠĠĠĠĠĠ Ġval ĠapiKey Ġ= Ġ( map [" apiKey "] Ġas ? ĠString )?. take If Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠ ĠapiKey ?. let Ġ{ Ġevent . apiKey Ġ= ĠapiKey Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġapp / device ĊĠĠĠĠĠĠĠ Ġevent . app Ġ= Ġapp Deserializer . deserialize ( map [" app "] Ġas ĠMutable Map < String , ĠAny >) ĊĠĠĠĠĠĠĠ Ġevent . device Ġ= Ġdevice Deserializer . deserialize ( map [" device "] Ġas ĠMutable Map < String , ĠAny >) ĊĊĠĠĠĠĠĠĠ Ġ// Ġuser ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser Deserializer (). deserialize ( map [" user "] Ġas ĠMutable Map < String , ĠAny >) ĊĠĠĠĠĠĠĠ Ġevent . setUser ( user . id , Ġuser . email , Ġuser . name ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfeature Flags ĊĠĠĠĠĠĠĠ Ġevent . clear Feature Flags () Ġ// Ġwe Ġdiscard Ġthe Ġfeature Flags Ġfrom ĠAndroid Ġnative ĊĠĠĠĠĠĠĠ Ġfeature Flags ?. forEach Ġ{ Ġflag Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . add Feature Flag ( flag Map [" feature Flag "] Ġas ĠString , Ġflag Map [" variant "] Ġas ĠString ?) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġerrors ĊĠĠĠĠĠĠĠ Ġval Ġerrors Ġ= Ġmap [" errors "] Ġas ĠList < Map < String , ĠAny ? >> ĊĠĠĠĠĠĠĠ Ġevent . errors . clear () ĊĠĠĠĠĠĠĠ Ġevent . errors . addAll ( errors . map ( error Deserializer :: deserialize )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthe ĠJS Ġpayload Ġhas Ġpassed Ġdown Ġa Ġnative Ġstack trace , ĊĠĠĠĠĠĠĠ Ġ// Ġconstruct Ġa Ġsecond Ġerror Ġobject Ġfrom Ġit Ġand Ġappend Ġit Ġto Ġthe Ġevent ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġboth Ġstack traces Ġare Ġvisible Ġto Ġthe Ġuser ĊĠĠĠĠĠĠĠ Ġif Ġ( map . containsKey (" native Stack ") Ġ&& Ġevent . errors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs Error Ġ= Ġevent . errors . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Stack Deserializer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNative Stack Deserializer ( project Packages , Ġclient . config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnative Stack Ġ= Ġnative Stack Deserializer . deserialize ( map ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjs Error . stack trace . addAll ( 0 , Ġnative Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġthreads ĊĠĠĠĠĠĠĠ Ġval Ġthreads Ġ= Ġmap [" threads "] Ġas ĠList < Map < String , ĠAny ? >> ĊĠĠĠĠĠĠĠ Ġevent . threads . clear () ĊĠĠĠĠĠĠĠ Ġevent . threads . addAll ( threads . map ( thread Deserializer :: deserialize )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbreadcrumb s ĊĠĠĠĠĠĠĠ Ġval Ġbreadcrumb s Ġ= Ġmap [" breadcrumbs "] Ġas ĠList < Map < String , ĠAny ? >> ĊĠĠĠĠĠĠĠ Ġevent . breadcrumbs . clear () ĊĠĠĠĠĠĠĠ Ġevent . breadcrumbs . addAll ( breadcrumbs . map ( breadcrumb Deserializer :: deserialize )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġmetadata ĊĠĠĠĠĠĠĠ Ġval Ġmetadata Ġ= Ġmap [" metadata "] Ġas ĠMap < String , ĠAny ?> ĊĠĠĠĠĠĠĠ Ġmetadata . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . add Metadata ( it . key , Ġit . value Ġas ĠMap < String , ĠAny >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġevent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Original Unhandled ( ĊĠĠĠĠĠĠĠ Ġmap : ĠMap < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġunhandled : ĠBoolean ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġunhandled Over ridden Ġ= Ġmap . getOrElse (" un handled Over ridden ", Ġ{ Ġfalse Ġ}) Ġas ĠBoolean ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunhandled Over ridden Ġ-> Ġ! un handled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġunhandled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ