Files
Guido.Tech/hpcsim/__pycache__/enrichment.cpython-312.pyc

109 lines
14 KiB
Plaintext
Raw Normal View History

2025-10-18 19:15:41 -05:00
<EFBFBD>
2025-10-19 02:00:56 -05:00
<00><EFBFBD>hW9<00><01><><00>ddlmZddlmZmZddlmZmZmZm Z ddl
Z
ddddd d
<EFBFBD>Z eGd <0B>d <0C><00>Z Gd <0A>d<0E>Z y)<0F>)<01> annotations)<02> dataclass<73>field)<04>Dict<63>Any<6E>Optional<61>ListNg<4E>~j<>t<EFBFBD><74>?g<><67><EFBFBD><EFBFBD>Mb<4D>?g<>~j<>t<EFBFBD>x?g<><1E><>Q<EFBFBD><51>?g{<14>G<EFBFBD>z<EFBFBD>?)<05>soft<66>medium<75>hard<72>inter<65>wetc<01><><00>eZdZUdZded<ee<06><04>Zded<ee<06><04>Zded<dZ d ed
<d Z
d ed <dZ ded<dZ d ed<dZ ded<ee<0E><04>Zded<y)<17> EnricherStateNz Optional[int]<5D>last_lap)<01>default_factoryzDict[int, float]<5D>
lap_speeds<EFBFBD>lap_throttle_avg<76><00>float<61>cumulative_wearzUnknown Circuit<69>str<74>
track_name<EFBFBD>2<00>int<6E>
total_laps<EFBFBD>Driver<65> driver_name<6D>
<00>current_positionz List[str]<5D>tire_compound_history)<10>__name__<5F>
__module__<EFBFBD> __qualname__r<00>__annotations__r<00>dictrrrrrrr <00>listr!<00><00><00>hpcsim/enrichment.pyrr:sr<00><00>"<22>H<EFBFBD>m<EFBFBD>"<22>#(<28><14>#><3E>J<EFBFBD> <20>><3E>).<2E>t<EFBFBD>)D<><14>&<26>D<> <20>O<EFBFBD>U<EFBFBD> <20>(<28>J<EFBFBD><03>'<27><18>J<EFBFBD><03><18><1F>K<EFBFBD><13><1F><1E><14>c<EFBFBD><1E>',<2C>T<EFBFBD>'B<><19>9<EFBFBD>Br)rc<01><><00>eZdZdZd<02>Zdd<03>Zdd<04>Z dd<05>Z dd<06>Zdd<07>Z dd<08>Z
dd <09>Z dd
<EFBFBD>Z dd <0B>Z dd <0C>Zdd <0A>Zy)<19>Enricherz<72>Heuristic enrichment engine to simulate HPC analytics on telemetry.
2025-10-18 19:15:41 -05:00
Stateless inputs are enriched with stateful estimates (wear, consistency, etc.).
Designed for predictable, dependency-free behavior.
2025-10-19 02:00:56 -05:00
c<01>"<00>t<00>|_y)N)r<00>state)<01>selfs r*<00>__init__zEnricher.__init__Ps <00><00>"<22>_<EFBFBD><04>
r)c <01>D<00>t|jdd<02><00>}t|jdd<04><00>}t|jdd<04><00>}t|jdd<04><00>}t|jdd<08><00>j <00>}t|jd d
2025-10-18 19:15:41 -05:00
<EFBFBD><00>}|jd <0B>}|jd <0C>} |jd <0A>}
|j |||<04>|j |||<05>} |j||||| <09>} |j|||<05>} |j||<04>}|j<00>}|j|
2025-10-19 02:00:56 -05:00
| <09>}|t| d<0E>t| d<0E>t| d<0E>t|d<0E>t|d<0E>|d<0F>S)z8Legacy method - returns only enriched telemetry metrics.<2E>lapr<00>speedr<00>throttle<6C>brake<6B> tire_compoundr <00>
2025-10-18 19:15:41 -05:00
fuel_level<EFBFBD><00>?<3F>ers<72>
2025-10-19 02:00:56 -05:00
track_temp<EFBFBD>rain_probability<74><00>r2<00>aero_efficiency<63>tire_degradation_index<65>
ers_charge<EFBFBD>fuel_optimization_score<72>driver_consistency<63>weather_impact) r<00>getrr<00>lower<65>_update_lap_stats<74>_compute_aero_efficiency<63>_compute_tire_degradation<6F>_compute_ers_charge<67>_compute_fuel_optimization<6F>_compute_driver_consistency<63>_compute_weather_impact<63>round)r/<00> telemetryr2r3r4r5r6r7r9r:<00> rain_prob<6F>aero_eff<66>tire_degr@<00>fuel_opt<70> consistencyrCs r*<00>enrichzEnricher.enrichTs<><00><00><11>)<29>-<2D>-<2D><05>q<EFBFBD>)<29>*<2A><03><15>i<EFBFBD>m<EFBFBD>m<EFBFBD>G<EFBFBD>S<EFBFBD>1<>2<><05><18><19><1D><1D>z<EFBFBD>3<EFBFBD>7<>8<><08><15>i<EFBFBD>m<EFBFBD>m<EFBFBD>G<EFBFBD>S<EFBFBD>1<>2<><05><1B>I<EFBFBD>M<EFBFBD>M<EFBFBD>/<2F>8<EFBFBD>D<>E<>K<>K<>M<> <0A><1A>9<EFBFBD>=<3D>=<3D><1C>s<EFBFBD>;<3B><<3C>
2025-10-18 19:15:41 -05:00
<EFBFBD><17>m<EFBFBD>m<EFBFBD>E<EFBFBD>"<22><03><1E>]<5D>]<5D><<3C>0<>
<EFBFBD><1D>M<EFBFBD>M<EFBFBD>"4<>5<> <09> <0A><1E><1E>s<EFBFBD>E<EFBFBD>8<EFBFBD>4<><18>0<>0<><15><08>%<25>H<><08><17>1<>1<>#<23>u<EFBFBD>h<EFBFBD> <0A>Wa<57>b<><08><19>-<2D>-<2D>c<EFBFBD>8<EFBFBD>U<EFBFBD>C<>
<EFBFBD><17>2<>2<>:<3A>x<EFBFBD>H<><08><1A>6<>6<>8<> <0B><1D>5<>5<>i<EFBFBD><1A>L<><0E><17>$<24>X<EFBFBD>q<EFBFBD>1<>&+<2B>H<EFBFBD>a<EFBFBD>&8<><1F>
<EFBFBD>A<EFBFBD>.<2E>',<2C>X<EFBFBD>q<EFBFBD>'9<>"'<27> <0B>Q<EFBFBD>"7<>,<2C>
<EFBFBD>
2025-10-19 02:00:56 -05:00
r)c <01><><00>t|jd|jdd<03><00><00>}t|jdd<05><00>}t|jdd<05><00>}t|jdd<05><00>}t|jdd <09><00>j <00>}t|jd
d <0B><00>}|jd <0C>}|jd |jd<0E><00>} |jd<0F>}
|jdd<11>} |jd|j
j <00>} t|jd|j
j<00><00>} |jd|j
j<00>}t|jd|j
j<00><00>}t|jdd<03><00>}| r| |j
_| r| |j
_|r||j
_|r||j
_ |rW|j
jr|j
jd|k7r%|j
jj|<06>|j|||<04>|j|||<05>}|j||||| <09>}|j|||<05>}|j!||<04>}|j#<00>}|j%|
| <09>}|t'|d<18>t'|d<18>t'|d<18>t'|d<18>t'|d<18>|d<19>}|j)|| | | | |||||<07><1A>
}||d<1B>S)z>Enrich telemetry and build complete race context for AI layer.r2<00>
lap_numberrr3rr4r5r6r r7r8r9r:<00>track_temperaturer;<00>rainfallFrrrr <00>tire_life_laps<70><73><EFBFBD><EFBFBD><EFBFBD>r<r=)
r2rrr:rXrr r6rYr7)<02>enriched_telemetry<72> race_context)rrDrrrEr.rrrr r!<00>appendrFrGrHrIrJrKrLrM<00>_build_race_context)r/rNr2r3r4r5r6r7r9r:rOrXrrrr rYrPrQr@rRrSrCr[r\s r*<00>enrich_with_contextzEnricher.enrich_with_contextus<><00><00><12>)<29>-<2D>-<2D><05>y<EFBFBD>}<7D>}<7D>\<5C>1<EFBFBD>'E<>F<>G<><03><15>i<EFBFBD>m<EFBFBD>m<EFBFBD>G<EFBFBD>S<EFBFBD>1<>2<><05><18><19><1D><1D>z<EFBFBD>3<EFBFBD>7<>8<><08><15>i<EFBFBD>m<EFBFBD>m<EFBFBD>G<EFBFBD>S<EFBFBD>1<>2<><05><1B>I<EFBFBD>M<EFBFBD>M<EFBFBD>/<2F>8<EFBFBD>D<>E<>K<>K<>M<> <0A><1A>9<EFBFBD>=<3D>=<3D><1C>s<EFBFBD>;<3B><<3C>
<EFBFBD><17>m<EFBFBD>m<EFBFBD>E<EFBFBD>"<22><03><1E>]<5D>]<5D><<3C><19><1D><1D>?R<>1S<31>T<>
<EFBFBD><1D>M<EFBFBD>M<EFBFBD>"4<>5<> <09><1C>=<3D>=<3D><1A>U<EFBFBD>3<><08><1F>]<5D>]<5D><<3C><14><1A><1A>1F<31>1F<31>G<>
<EFBFBD><18><19><1D><1D>|<7C>T<EFBFBD>Z<EFBFBD>Z<EFBFBD>5J<35>5J<35>K<>L<>
<EFBFBD><1F>m<EFBFBD>m<EFBFBD>M<EFBFBD>4<EFBFBD>:<3A>:<3A>3I<33>3I<33>J<> <0B><1E>y<EFBFBD>}<7D>}<7D>-?<3F><14><1A><1A>A\<5C>A\<5C>]<5D>^<5E><18><1C>Y<EFBFBD>]<5D>]<5D>+;<3B>Q<EFBFBD>?<3F>@<40><0E> <16>$.<2E>D<EFBFBD>J<EFBFBD>J<EFBFBD> !<21> <15>$.<2E>D<EFBFBD>J<EFBFBD>J<EFBFBD> !<21> <16>%0<>D<EFBFBD>J<EFBFBD>J<EFBFBD> "<22> <1B>*:<3A>D<EFBFBD>J<EFBFBD>J<EFBFBD> '<27> <19>$<24>*<2A>*<2A>"B<>"B<>"<22>j<EFBFBD>j<EFBFBD>><3E>><3E>r<EFBFBD>B<>m<EFBFBD>S<> <10>J<EFBFBD>J<EFBFBD> ,<2C> ,<2C> 3<> 3<>M<EFBFBD> B<> <0A><1E><1E>s<EFBFBD>E<EFBFBD>8<EFBFBD>4<><18>0<>0<><15><08>%<25>H<><08><17>1<>1<>#<23>u<EFBFBD>h<EFBFBD> <0A>Wa<57>b<><08><19>-<2D>-<2D>c<EFBFBD>8<EFBFBD>U<EFBFBD>C<>
<EFBFBD><17>2<>2<>:<3A>x<EFBFBD>H<><08><1A>6<>6<>8<> <0B><1D>5<>5<>i<EFBFBD><1A>L<><0E><17>$<24>X<EFBFBD>q<EFBFBD>1<>&+<2B>H<EFBFBD>a<EFBFBD>&8<><1F>
<EFBFBD>A<EFBFBD>.<2E>',<2C>X<EFBFBD>q<EFBFBD>'9<>"'<27> <0B>Q<EFBFBD>"7<>,<2C>
<EFBFBD><1A><1C>/<2F>/<2F><13>!<21>!<21>!<21><1D>#<23>-<2D>'<27>)<29>!<21>0<> 
<EFBFBD> <0C>#5<>(<28>
<EFBFBD>
r)c <01><><00>ddddddd<06>} | j|j<00>d<02>} |rd} nd} |||| |<04> t|<04>nd d
<EFBFBD>||| | |
d zd <0C>|j|| | <09>d <0A>}|S)z3Build complete race context structure for AI layer.r
r r <00> intermediater)r
r r r rar<00>Wet<65>Dryg9@)rr<00> current_lap<61>weather_condition<6F>track_temp_celsius<75>Y@)rr <00>current_tire_compound<6E> tire_age_laps<70>fuel_remaining_percent)<03> race_info<66> driver_state<74> competitors)rDrEr<00>_generate_mock_competitors)r/r2rrr:rXrr r6rYr7<00>tire_map<61>normalized_tirerer\s r*r^zEnricher._build_race_context<78>s<><00><00>"<1B><1E><1A>#<23>*<2A><18> 
<EFBFBD><08>#<23>,<2C>,<2C>}<7D>':<3A>':<3A>'<<3C>h<EFBFBD>G<><0F> <14> %<25> <1D> %<25> <1D>)<29>(<28>"<22>%6<>;E<>;Q<>e<EFBFBD>J<EFBFBD>&7<>W[<5B> <0E> +<2B>$4<>)8<>!/<2F>*4<>u<EFBFBD>*<<3C> <0E> <20>:<3A>:<3A>;K<>_<EFBFBD>^l<>m<>
<EFBFBD> <0C>$<1C>r)c <01><00>g}gd<01>}gd<02>}g}dD]-}||z} d| cxkrdks<01>n<00>| |k7s<01>|j| <09><00>/t|<07>D]<5D>} | |z
dz}
tt| <09><00>dzdz d z
} |
| z} |} t tt| <09><00>d
z<00>d k(r|| d
z} t d |tt| d z<00><00>d zzdz
<00>}| || dz
t |<05>z| |t| d<0F>d<10>}|j|<0F><00><>|S)z9Generate realistic mock competitor data for race context.)<14>
Verstappen<EFBFBD>Hamilton<6F>Leclerc<72>Perez<65>Sainz<6E>Russell<6C>Norris<69>Piastri<72>Alonso<73>Stroll<6C>Gasly<6C>Ocon<6F>Tsunoda<64> Ricciardo<64>Bottas<61>Zhou<6F> Magnussen<65>
Hulkenberg<EFBFBD>Albon<6F>Sargeant)r
r r )<06><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rZ<00><00>r<r<><00>g@<40>dgI@<40><00>?r<r<00><00> <00>r<>)<05>position<6F>driverr6ri<00> gap_seconds)r]<00>sorted<65>hashr<00>abs<62>max<61>lenrM)r/r <00> current_tire<72>current_tire_agerm<00> driver_names<65>tire_compounds<64>positions_to_show<6F>offset<65>pos<6F>gap_base<73> gap_variation<6F>gap<61> tire_choice<63>tire_age<67>
competitors r*rnz#Enricher._generate_mock_competitors<72>sI<00><00><19> <0B>
<EFBFBD> <0C>4<><0E><1F><19>+<2B> .<2E>F<EFBFBD>"<22>V<EFBFBD>+<2B>C<EFBFBD><10>C<EFBFBD>~<7E>2<EFBFBD>~<7E>#<23>)9<>"9<>!<21>(<28>(<28><13>-<2D> .<2E>
<1A>+<2B>,<2C> +<2B>C<EFBFBD><1B>.<2E>.<2E>#<23>5<>H<EFBFBD>!<21>#<23>c<EFBFBD>(<28>^<5E>c<EFBFBD>1<>T<EFBFBD>9<>C<EFBFBD>?<3F>M<EFBFBD><1A>]<5D>*<2A>C<EFBFBD>'<27>K<EFBFBD><12>4<EFBFBD><03>C<EFBFBD><08>><3E>A<EFBFBD>%<25>&<26>!<21>+<2B>,<2C>S<EFBFBD>1<EFBFBD>W<EFBFBD>5<> <0B><1B>1<EFBFBD>.<2E>$<24>s<EFBFBD>3<EFBFBD><11>7<EFBFBD>|<7C>2D<32>r<EFBFBD>2I<32>J<>Q<EFBFBD>N<>O<>H<EFBFBD> <20>&<26><03>a<EFBFBD><07>3<EFBFBD>|<7C>3D<33>'D<>E<>!,<2C>!)<29>$<24>S<EFBFBD>!<21>}<7D> <0E>J<EFBFBD> <18> <1E> <1E>z<EFBFBD> *<2A>+ +<2B>.<1B>r)c<01><><00>|dkry||jj|<d|jjj||<03>zd|zz|jj|<||j_y)Nrg<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?皙<><E79A99><EFBFBD><EFBFBD><EFBFBD>?)r.rrrDr)r/r2r3r4s r*rFzEnricher._update_lap_stats*sj<00><00> <0E>!<21>8<EFBFBD> <12>%*<2A><04>
2025-10-18 19:15:41 -05:00
<EFBFBD>
<EFBFBD><1D><1D>c<EFBFBD>"<22>+.<2E><14><1A><1A>1L<31>1L<31>1P<31>1P<31>QT<51>V^<5E>1_<31>+_<>be<62>hp<68>bp<62>+p<><04>
<EFBFBD>
<EFBFBD>#<23>#<23>C<EFBFBD>(<28>!<21><04>
<EFBFBD>
2025-10-19 02:00:56 -05:00
<EFBFBD>r)c<01><><00>tdtd|dz <00><00>}d|z}d|z}d|z|z|z
}tdtd|<07><00>S)Nrr<>g<00>t@皙<><E79A99><EFBFBD><EFBFBD><EFBFBD>?r<>r8)r<><00>min)r/r3r4r5<00>speed_n<5F> brake_penalty<74>throttle_bonus<75>bases r*rGz!Enricher._compute_aero_efficiency2sS<00><00><16>c<EFBFBD>3<EFBFBD>s<EFBFBD>E<EFBFBD>E<EFBFBD>M<EFBFBD>2<>3<><07><1B>e<EFBFBD> <0B> <0A><1C>x<EFBFBD><1E><0E><12>W<EFBFBD>}<7D>~<7E>-<2D> <0A>=<3D><04><12>3<EFBFBD><03>C<EFBFBD><14><0E>'<27>'r)c<01>f<00>tj|td<00>}d}t|ttf<02>r|dkDrd}n|dkrd}dd|zzdt d |d
2025-10-18 19:15:41 -05:00
z
2025-10-19 02:00:56 -05:00
d z <00>zz}||z|z} t d|jj| z<00>|j_|jjS) Nr r<><00>*g<00>?<3F>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?r8r<>rg@o@rg) <09>_TIRES_BASE_WEARrD<00>
isinstancerrr<>r<>r.r)
r/r2r3r4r6r:<00> base_wear<61> temp_factor<6F>stress<73> wear_this_laps
r*rHz"Enricher._compute_tire_degradation;s<><00><00>$<24>(<28>(<28><1D>8H<38><18>8R<38>S<> <09><19> <0B> <15>j<EFBFBD>3<EFBFBD><05>,<2C> /<2F><19>B<EFBFBD><EFBFBD>"<22> <0B><1B>b<EFBFBD><1F>!<21> <0B><14>s<EFBFBD>X<EFBFBD>~<7E>%<25><03>c<EFBFBD>#<23><05><05> <0A><15>7N<37>.O<>(O<>O<><06>!<21>F<EFBFBD>*<2A>[<5B>8<> <0A>%(<28><13>d<EFBFBD>j<EFBFBD>j<EFBFBD>.H<>.H<>=<3D>.X<>%Y<><04>
2025-10-18 19:15:41 -05:00
<EFBFBD>
2025-10-19 02:00:56 -05:00
<EFBFBD>"<22><13>z<EFBFBD>z<EFBFBD>)<29>)<29>)r)c<01><><00>t|ttf<02>rt|<01>d|zzd|zz
2025-10-18 19:15:41 -05:00
}ndd|zzd|zz
2025-10-19 02:00:56 -05:00
}tdt d|<04><00>S)Ng<4E><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F>333333<33>?g<><1E><>Q<EFBFBD><51>?rr<>)r<>rrr<>r<>)r/r9r4r5<00> ers_levels r*rIzEnricher._compute_ers_chargeIsX<00><00> <15>c<EFBFBD>C<EFBFBD><15><<3C> (<28><1D>c<EFBFBD>
<EFBFBD>S<EFBFBD>5<EFBFBD>[<5B>0<>4<EFBFBD>(<28>?<3F>B<>I<EFBFBD><1C>d<EFBFBD>U<EFBFBD>l<EFBFBD>*<2A>T<EFBFBD>H<EFBFBD>_<EFBFBD><<3C>I<EFBFBD><12>3<EFBFBD><03>C<EFBFBD><19>+<2B>,<2C>,r)c<01><><00>tdtd|<01><00>}dd|zz}t||z
2025-10-18 19:15:41 -05:00
<00>}d|z
2025-10-19 02:00:56 -05:00
}tdtd|<06><00>S)Nrr<>r8r<>)r<>r<>r<>)r/r7r4<00>fuel_n<5F>ideal_throttle<6C>penalty<74>scores r*rJz#Enricher._compute_fuel_optimizationRsN<00><00><14>S<EFBFBD>#<23>c<EFBFBD>:<3A>.<2E>/<2F><06><1C>s<EFBFBD>V<EFBFBD>|<7C>+<2B><0E><15>h<EFBFBD><1E>/<2F>0<><07><13>g<EFBFBD> <0A><05><12>3<EFBFBD><03>C<EFBFBD><15><0F>(<28>(r)c<01>j<00><06>t|jjj<00><00>dd}|sy|D<00>cgc]}|jj|<00><02>}}t |<03>t |<03>z <00>t <00>fd<03>|D<00><00>t |<03>z }t d|dz <00>}tdd|z
<00>Scc}w)N<><4E><EFBFBD><EFBFBD><EFBFBD>r8c3<01>.<00>K<00>|] }|<01>z
dz<00><01><00>y<01>w)r<>Nr()<03>.0<EFBFBD>s<>means <20>r*<00> <genexpr>z7Enricher._compute_driver_consistency.<locals>.<genexpr>as<00><><00><><00>2<>a<EFBFBD>1<EFBFBD>t<EFBFBD>8<EFBFBD><01>/<2F>2<>s<00>r<>g <20>@r)r<>r.r<00>keys<79>sumr<6D>r<>r<>)r/<00>laps<70>l<>speeds<64>var<61>normr<6D>s @r*rKz$Enricher._compute_driver_consistencyZs<><00><><00><15>d<EFBFBD>j<EFBFBD>j<EFBFBD>+<2B>+<2B>0<>0<>2<>3<>B<EFBFBD>C<EFBFBD>8<><04><13><16>48<34>9<>q<EFBFBD>$<24>*<2A>*<2A>'<27>'<27><01>*<2A>9<><06>9<><12>6<EFBFBD>{<7B>S<EFBFBD><16>[<5B>(<28><04><11>2<>6<EFBFBD>2<>2<>S<EFBFBD><16>[<5B>@<40><03><12>3<EFBFBD><03>y<EFBFBD>)<29>*<2A><04><12>3<EFBFBD><03>d<EFBFBD>
2025-10-18 19:15:41 -05:00
<EFBFBD>#<23>#<23><> :s<00> B0c<01><><00>d}t|ttf<02>r|dt|<01>zz }t|ttf<02>r|dkr|dz }|dkDr|dz }|dkry|dkry y
2025-10-19 02:00:56 -05:00
) Nrgffffff<66>?<3F> r<><00>-g333333<33>?<3F>lowr<77>r <00>high)r<>rr)r/rOr:r<>s r*rLz Enricher._compute_weather_impactfsn<00><00><13><05> <15>i<EFBFBD>#<23>u<EFBFBD><1C> .<2E> <11>S<EFBFBD>5<EFBFBD><19>+<2B>+<2B> +<2B>E<EFBFBD> <15>j<EFBFBD>3<EFBFBD><05>,<2C> /<2F><19>B<EFBFBD><EFBFBD><15><13> <0C><05><19>B<EFBFBD><EFBFBD><15><13> <0C><05> <10>3<EFBFBD>;<3B><18> <10>3<EFBFBD>;<3B><1B>r)N)rN<00>Dict[str, Any]<5D>returnr<6E>)r2rrrrrr:<00>Optional[float]rX<00>boolrrr rr6rrYrr7rr<>r<>)r rr<>rr<>rr<>zList[Dict[str, Any]])r2rr3rr4rr<><00>None)r3rr4rr5rr<>r) r2rr3rr4rr6rr:r<>r<>r)r9r<>r4rr5rr<>r)r7rr4rr<>r)r<>r)rOr<>r:r<>r<>r)r"r#r$<00>__doc__r0rTr_r^rnrFrGrHrIrJrKrLr(r)r*r,r,Is<><00><00><08> %<25>
<EFBFBD>BK
<EFBFBD>Z2<1C> <10>2<1C><18>2<1C><18> 2<1C>
$<24> 2<1C> <17> 2<1C><19>2<1C><1E>2<1C><1B>2<1C><1C>2<1C><1A>2<1C>
<18>2<1C>h1<1B><1D>1<1B><1A>1<1B><1E> 1<1B>
<1E> 1<1B>h"<22>(<28> *<2A>-<2D>)<29>
$<24> r)r,)<0E>
__future__r<00> dataclassesrr<00>typingrrrr <00>mathr<68>rr,r(r)r*<00><module>r<>sV<00><01>"<22>(<28>,<2C>,<2C> <0B>Z <12><13> <11> <12> <0F> <02><10> <0B> C<01> C<01> <0B> C<01>j<16>jr)