+
    zj                      a  0 t $ ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHtHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ RIt^ RIHtHtHtHtHtHtHtHt ^ R	IHt ^ R
IHt ^ RIHt ^ RIH t  ^ RI!H"t" ^ RI#H$t$ ^ RI%H&t&H't' ^ RI(H)t)H*t* ^ RI+H,t,H-t- ^ RI.H/t/H0t0 ^ RI1H2t2 ^ RI3H4t4H5t5 ^ RI6H7t7 ]! ]8RRR7      t9]Pt                  Pw                  ]9Px                  RRR4      t=Rt>Rt?]P                  ! R]P                  ! ^ 4      4      ]9nB        ]! ^R7      ]9nC        ]! 4       tD]2! ]4      tE] ! ]DP                  4      tG]5! ]DP                  4      tH]$! ]DP                  4      tI]"! ]DP                  4      tJ]'! R  4      tK]/! ]P                  ! R!R"4      ]P                  ! R#R$4      ]P                  ! R%]P                  ! R&]=4      4      ]P                  ! R']P                  ! R(]P                  ! R%]=4      4      4      4      tL]P                  ! R)4      R*8X  d   ],! 4       M]-! 4       tM]7! ]P                  ! R+4      4      tN]! ]P                  ! R,4      4      tO/ tPR-]QR.&   / tRR/]QR0&   / tSR/]QR1&   / tTR/]QR2&   R3R4R5R6R7R8R9R:/R3R;R5R<R7R=R9R>/R3R?R5R@R7RAR9RB/R3RCR5RDR7RER9RF/.tU]P                  ! RG4      tV]P                  ! RH4      tWRI tX]9P                  RJ RK l4       tZ]9P                  RL4      RM RN l4       t\]9P                  RO4      ]XRP RQ l4       4       t]]9P                  RR4      ]XRS RT l4       4       t^]9P                  RU4      ]XRV RW l4       4       t_]9P                  RX4      ]XRY RZ l4       4       t`]9P                  R[4      ]XR\ R] l4       4       ta]9P                  R[4      ]XR^ R_ l4       4       tc]9P                  R`4      ]XRa Rb l4       4       td]9P                  Rc4      ]XRd Re l4       4       te]9P                  Rc4      ]XRf Rg l4       4       tf]9P                  Rh4      ]XRi Rj l4       4       tg]9P                  Rk4      ]XRl Rm l4       4       th]9P                  Rk4      ]XRn Ro l4       4       ti]9P                  Rp4      ]XRq Rr l4       4       tj]9P                  Rs4      ]XRt Ru l4       4       tk]9P                  Rv4      Rw Rx l4       tl]9P                  Ry4      Rz R{ l4       tm]9P                  Rv4      R| R} l4       tn]9P                  R~4      R R l4       to]9P                  R4      ]XR R l4       4       tp]9P                  R4      ]XR R l4       4       tq]9P                  R4      ]XR R l4       4       tr]9P                  R4      ]XR R l4       4       ts]9P                  R4      ]XR R l4       4       tt]9P                  R4      ]XR R l4       4       tu]9P                  R4      ]XR R l4       4       tv]9P                  R4      ]XR R l4       4       tw]9P                  R4      ]XR 4       4       tx]9P                  R4      ]XR R l4       4       ty]9P                  R4      ]XR R l4       4       tz]9P                  R4      ]XR R l4       4       t{]9P                  R4      ]XR R l4       4       t|]9P                  R4      ]XR R l4       4       t}]9P                  R4      ]XR R l4       4       t~]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       tR R lt]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR 4       4       t]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       t]9P                  R4      ]XR R l4       4       tER1R R lltER1R R lltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR tR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltR R ltER1ER  ER lltER ER ltER ER ltER ER ltER ER	 ltER
 ER ltER ER ltER ER ltER ER ltER1ER ER lltER ER ltER2ER ER lltER3ER ER lltER4ER ER lltER ER ltER ER ltER  ER! ltER" ER# ltER$ ER% ltER& ER' ltER( ER) ltER* ER+ lt]8ER,8X  d   ]9EPw                  ER-ER.ER/ER07       R# R# (5      )annotationsN)deepcopy)datetime	timedeltawraps)BytesIO)uuid4)FlaskResponsejsonifyredirectrender_templaterequestsessionurl_for)CONFIG)AnalysisService)AnalysisCache)GPXExporter)GPXSimplifier)
GPXTrimmer)GoogleMapsImportErrorGoogleMapsWaypointImporter)GPXDocumentWaypoint)MemoryProjectStoreProjectStore)RaspberryAmundsenClientRaspberryAmundsenError)ReportNormalizer)SmartCombineSourceSmartGPXCombiner)ServerUploadStorez/wandelen/staticstatic)static_url_pathstatic_folderdataraspberryaiamundseng      @      ?AMUNDSEN_SECRET_KEY)daysc                 .    \         P                  ! R 4      # )AMUNDSEN_GOOGLE_MAPS_API_KEY)osgetenv     7\\netdrive_new\web\persoonlijk\amundsen\amundsen_app.py<lambda>r5   ,   s    "))Db:cr3   AMUNDSEN_RPI_GATEWAY_URLzhttp://192.168.68.230:8000AMUNDSEN_RPI_SERVICE_PREFIXz/services/amundsenAMUNDSEN_RPI_DATA_ROOTAMUNDSEN_RPI_NAS_ROOTAMUNDSEN_RPI_SHARED_ROOTAMUNDSEN_RPI_SERVICE_ROOTAMUNDSEN_TEST_STOREmemoryAMUNDSEN_UPLOAD_DIRAMUNDSEN_ANALYSIS_CACHE_DIRzdict[str, GPXDocument]STOREzdict[str, dict]COMBINE_DRAFTSTRIM_DRAFTSSIMPLIFY_DRAFTSidgpx_combinenamezGPX combinerenendpointgpx_combine_tooldescriptionz)Plak losse GPX-bestanden slim aan elkaar.gpx_trimzGPX knippengpx_trim_toolz-Kort het begin of einde van een GPX-route in.gpx_simplifyzGPX verkleinengpx_simplify_toolz8Maak grote GPX-bestanden kleiner met minder routepunten.raspberry_analysiszRaspberry analyseraspberry_analysis_toolz1Start een losse analyse via de Raspberry-service.PUSHOVER_API_TOKENPUSHOVER_USER_KEYc                0   a  \        S 4      V 3R  l4       pV# )c                 t   < \         P                  ! R 4      '       g   \        \        R4      4      # S! V / VB # )user_id
login_page)r   getr   r   )argskwargsviews   *,r4   wrappedlogin_required.<locals>.wrapped]   s2    {{9%%GL122T$V$$r3   r   )rY   rZ   s   f r4   login_requiredr\   \   s     
4[% %
 Nr3   c                   V ^8  d   QhRR/#    returndictr2   )formats   "r4   __annotate__rc   g   s     $ $D $r3   c                     R \         /# )	tool_tree)	TOOL_TREEr2   r3   r4   navigation_contextrg   f   s    ##r3   /c                   V ^8  d   QhRR/# r_   r`   strr2   )rb   s   "r4   rc   rc   l   s     & &s &r3   c                 *    \        \        R 4      4      # )index)r   r   r2   r3   r4   root_redirectrn   k   s    GG$%%r3   z	/wandelenc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   r   s      s r3   c                     \        R \        P                  4       \        P                  4       \        P
                  ! R4      RR7      # )
index.htmlusernamehomeproject_treehiking_settingscurrent_usercurrent_menur   project_storelist_projectsget_hiking_settingsr   rV   r2   r3   r4   rm   rm   p   s;     "002%99;[[, r3   z/wandelen/projectenc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   ~   s      s r3   c                     \        R \        P                  4       \        P                  4       \        P
                  ! R4      RR7      # )zprojects_manage.htmlrr   projectsrt   ry   r2   r3   r4   projects_manager_pager   |   s;     "002%99;[[, r3   z!/wandelen/instellingen/wandeltijdc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s      c r3   c                     \        R \        P                  4       \        P                  4       \        P
                  ! R4      RR7      # )zhiking_settings.htmlrr   hikingrt   ry   r2   r3   r4   hiking_settings_pager      s;     "002%99;[[, r3   z/wandelen/toolsc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s       r3   c                     \        R \        P                  4       \        P                  4       \        P
                  ! R4      RR7      # )zgpx_tools.htmlrr   rs   rt   ry   r2   r3   r4   gpx_tools_pager      s;     "002%99;[[, r3   z/wandelen/tools/gpx-combinec                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s      # r3   c            	         \        R \        P                  4       \        P                  4       R\        P
                  ! R4      RR7      # )gpx_combine.htmlrE   rr   tools)ru   rv   current_toolrw   rx   ry   r2   r3   r4   rH   rH      s>     "002%99;"[[, r3   c                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s      c r3   c            	     |   \         P                  P                  R 4       U u. uF  q P                  '       g   K  V NK  	  pp \         P                  P                  R4      ;'       g    RP                  4       ;'       g    Rp\        V4      ^8  d   \        RVR7      # . p V F  pVP                  4       pVP                  R4      p\        P                  P                  WdP                  P                  R^4      ^ ,          4      pVP                  4       '       g   \!        R4      hVP#                  \%        WtP                  WV4      4       K  	  \(        P+                  Y24      p\,        P.                  ! ^4      p	R	TR
TRT/\0        T	&   \        TTT	R7      # u up i   \&         d    \        RTR7      u # i ; i)	gpx_filesrF   Gecombineerde routez4Kies minimaal twee GPX-bestanden om samen te voegen.erroroutput_name	utf-8-sig.zGPX zonder trackpuntenz1Een van de GPX-bestanden kon niet worden gelezen.r   sourcesplanr   previewdraft_token)r   filesgetlistfilenameformrV   striplen_render_gpx_combinereaddecodeserviceparser
parse_textrsplit
all_points
ValueErrorappendr"   	Exceptionsmart_combiner
build_plansecretstoken_urlsaferA   )
filer   r   r   uploaded	raw_bytesxml_textdocumentr   r   s
             r4   preview_combined_gpxr      s    &mm33K@R@dMMTT@ER<<##F+DD/DKKMffQfK
5zA~")_mxyyG	wH I ''4H~~00;L;L;S;STWYZ;[\];^_H&&(( !9::NN-h8I8I9_`  $$W:D''+K{7#N;
  1 S  w")\juvvws   FF#B0F   F;:F;z#/wandelen/tools/gpx-combine/executec                   V ^8  d   QhRR/# r_   r`   Response | strr2   )rb   s   "r4   rc   rc      s      n r3   c                 0   \         P                  P                  R R4      p \        P	                  V R4      pVf   \        RR7      # \        \         P                  P                  R4      \         P                  P                  R4      \        VR,          4      4      pVR,          pV'       d&   \        P                  VR,          VR	,          V4      pVR
,          p\        P                  V4      p\        VR	,          4      p\        VRRRV R2/R7      # )r    Nz>De voorvertoning is verlopen. Upload de GPX-bestanden opnieuw.r   source_indexreversedr   r   r   r   application/gpx+xmlContent-Dispositionattachment; filename=""mimetypeheaders)r   r   rV   rA   popr   _selected_combine_routesr   r   r   build_plan_from_selectionexporterto_xml_gpx_filenamer   )r   draftselected_routesr   combinedr   combined_filenames          r4   execute_combined_gpxr      s     ,,""="5K{D1E}")ijj.^,Z(E)O
 =D77i8H%P]J^`opJHx(H%eM&:;&&*@AR@SST(UV r3   z/wandelen/tools/gpx-trimc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s      s r3   c                     \        4       # N)_render_gpx_trimr2   r3   r4   rK   rK      s     r3   c                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc      s     _ _S _r3   c                    \         P                  P                  R 4      p \         P                  P                  R4      ;'       g    RP	                  4       ;'       g    RpV e   V P
                  '       g   \        RVR7      #  V P                  4       pVP                  R4      p\        P                  P                  W0P
                  P                  R^4      ^ ,          4      p\        VP                  4       4      ^8  d   \        R4      h \"        P$                  ! ^4      p\&        P)                  T4      pR	TR
T/\*        T&   \        YTR7      #   \          d    \        RTR7      u # i ; i)gpx_filerF   Geknipte routez#Kies een GPX-bestand om te knippen.r   r   r   GPX zonder route(Het GPX-bestand kon niet worden gelezen.r   r   r   )r   r   rV   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   gpx_trimmerbuild_previewrB   )r   r   r   r   r   r   r   s          r4   preview_trimmed_gpxr      sH    }}  ,H<<##F+??/?FFH\\L\Kx000&KYdeekMMO	##K0>>,,X7H7H7O7OPSUV7WXY7Z[x""$%)/00 *
 ''+K''1G{H K R]^^  k&P^ijjks   B
E E0/E0z /wandelen/tools/gpx-trim/executec                   V ^8  d   QhRR/# r   r2   )rb   s   "r4   rc   rc     s      ^ r3   c            
     z   \         P                  P                  R R4      p \        P	                  V R4      pVf   \        RR7      # \        RR4      p\        RR4      p\        P                  VR	,          VR
,          W#4      p\        P                  V4      p\        VRRR\        VR
,          4       R2/R7      # )r   r   N=De voorvertoning is verlopen. Upload het GPX-bestand opnieuw.r   start_ratio        	end_ratior+   r   r   r   r   r   r   r   )r   r   rV   rB   r   r   _ratio_from_formr   trimr   r   r   r   )r   r   r   r   trimmedr   s         r4   execute_trimmed_gpxr   	  s     ,,""="5KOOK.E}&eff"=#6K c2IuZ0%2F_Gw'H&&*@uUbOcAd@eef(gh r3   z/wandelen/tools/gpx-simplifyc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc     s     " "3 "r3   c                     \        4       # r   )_render_gpx_simplifyr2   r3   r4   rM   rM     s      !!r3   c                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   $  s     | | |r3   c                    \         P                  P                  R 4      p \         P                  P                  R4      ;'       g    RP	                  4       ;'       g    Rp\        RRRRR7      pV e   V P                  '       g   \        RWR	7      #  V P                  4       pVP                  R
4      p\        P                  P                  W@P                  P                  R^4      ^ ,          4      p\        VP                  4       4      ^8  d   \!        R4      h \$        P&                  ! ^4      p\(        P+                  YR4      pRTRTRT/\,        T&   \        YYvR7      #   \"         d    \        RYR	7      u # i ; i)r   rF   Verkleinde routetolerance_m      $@r   g     @o@)minimummaximumz&Kies een GPX-bestand om te verkleinen.)r   r   r   r   r   r   r   r   r   )r   r   r   r   )r   r   rV   r   r   _float_from_formr   r   r   r   r   r   r   r   r   r   r   r   r   r   gpx_simplifierr   rC   )r   r   r   r   r   r   r   r   s           r4   preview_simplified_gpxr   "  si    }}  ,H<<##F+AA/AHHJ``N`K"=$USKx000#*R`k  F  	FHMMO	##K0>>,,X7H7H7O7OPSUV7WXY7Z[x""$%)/00 *
 ''+K**8AG{H{$OK 
  KZa{{  H#*Tbm  H  	HHs   B
E& &F Fz$/wandelen/tools/gpx-simplify/executec                   V ^8  d   QhRR/# r   r2   )rb   s   "r4   rc   rc   @  s       r3   c            
     X   \         P                  P                  R R4      p \        P	                  V R4      pVf   \        RR7      # \        P                  VR,          VR,          VR,          4      p\        P                  V4      p\        VRR	R
\        VR,          4       R2/R7      # )r   r   Nr   r   r   r   r   r   r   r   r   r   )r   r   rV   rC   r   r   r   simplifyr   r   r   r   )r   r   
simplifiedr   s       r4   execute_simplified_gpxr   >  s     ,,""="5KT2E}#*ijj((z):E-<PRWXeRfgJz*H&&*@uUbOcAd@eef(gh r3   z"/wandelen/tools/raspberry-analysisc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   Q  s       r3   c                    \        R \        P                  4       \        P                  4       R\        P
                  ! R4      R\        P                  \        P                  \        P                  \        \        P                  4      R7
      # )zraspberry_analysis.htmlrN   rr   r   )	ru   rv   r   rw   rx   gateway_urlservice_prefix	data_rootlocal_data_root)r   rz   r{   r|   r   rV   raspberry_amundsenr   r   service_rootrk   
local_rootr2   r3   r4   rO   rO   O  sh     !"002%99;)[[,&22)88$11.99: r3   z/wandelen/loginc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   a  s     ) )C )r3   c                     \        R 4      # )
login.html)r   r2   r3   r4   rU   rU   `  s    <((r3   z/wandelen/request-loginc                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc   f  s     W Ws Wr3   c                 V   \         P                  P                  R R4      P                  4       p V '       g   \	        RRR7      # \
        P                  ! R4      R p\        P                  W\         P                  4       \        RRV  R	V 24      pR
pV'       g   Rp\	        RW0R7      # )rr   r   r  zVul een gebruikersnaam in.r   i@B 06zAmundsen loginzLogin-aanvraag voor z. Bevestigingscode: z>Aanvraag verstuurd. Vraag de beheerder om je bevestigingscode.zKAanvraag opgeslagen, maar Pushover is niet ingesteld of kon niet versturen.)messagerequested_username)r   r   rV   r   r   r   	randbelowrz   create_login_requestremote_addrsend_pushover)rr   	login_keysentr  s       r4   request_loginr  e  s    ||
B/557H|3OPP$$Y/3I&&xG<O<OP
xj(<YKHD OG_<VVr3   c                   V ^8  d   QhRR/# r   r2   )rb   s   "r4   rc   rc   x  s     & &~ &r3   c                    \         P                  P                  R R4      P                  4       p \         P                  P                  RR4      P                  4       p\         P                  P                  R4      R8H  p\        P                  W4      pVf   \        RRV R7      # \        P                  ! 4        V\        n	        VR,          \        R	&   VR ,          \        R &   \        \        R
4      4      # )rr   r   r  rememberonr  z.Gebruikersnaam of bevestigingscode klopt niet.)r   r	  rD   rT   rm   )r   r   rV   r   rz   verify_login_keyr   r   clear	permanentr   r   )rr   r  r  users       r4   loginr  w  s    ||
B/557H  b1779I||
+t3H))(>D||3c  yA  B  	BMMO GdGIz*GJGG$%%r3   z/wandelen/logoutc                   V ^8  d   QhRR/# r_   r`   r   r2   )rb   s   "r4   rc   rc     s     + + +r3   c                 T    \         P                  ! 4        \        \        R 4      4      # )rU   )r   r  r   r   r2   r3   r4   logoutr    s    MMOGL)**r3   z/wandelen/projectsc                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     B B Br3   c                     \         P                  \        P                  P	                  R R4      4       \        \        P                  P	                  R4      ;'       g    \        R4      4      # rF   r   nextrm   )rz   create_projectr   r   rV   r   r   r2   r3   r4   r"  r"    sJ       !1!1&"!=>GLL$$V,@@0@AAr3   z/wandelen/projects/<project_id>c                    V ^8  d   QhRRRR/# )r_   
project_idrk   r`   r2   )rb   s   "r4   rc   rc     s      s s r3   c                Z   \        V 4      pVfJ   \        RR\        P                  4       \        P	                  4       \
        P                  ! R4      RR7      # \        RV\        V4      \        P                  4       \        P	                  4       V \
        P                  ! R4      RR7      # )	Nrq   zProject niet gevonden.rr   rs   r   ru   rv   rw   rx   zproject.htmlr   )projectroutesru   rv   current_project_idrw   rx   )_project_from_treer   rz   r{   r|   r   rV   _routes_for_projectr$  r'  s   & r4   project_detailr-    s     !,G*&446)==? Z0
 	
 "7+"002%99;%[[,	 	r3   z&/wandelen/projects/<project_id>/renamec                    V ^8  d   QhRRRR/# r_   r$  rk   r`   r   r2   )rb   s   "r4   rc   rc          B Bs Bx Br3   c                    \         P                  V \        P                  P	                  R R4      4       \        \        P                  P	                  R4      ;'       g    \        R4      4      # r   )rz   rename_projectr   r   rV   r   r   r$  s   &r4   r2  r2    sL       W\\-=-=fb-IJGLL$$V,@@0@AAr3   z&/wandelen/projects/<project_id>/deletec                    V ^8  d   QhRRRR/# r/  r2   )rb   s   "r4   rc   rc     r0  r3   c                    \         P                  V 4       \        \        P                  P                  R 4      ;'       g    \        R4      4      # r!  rm   )rz   delete_projectr   r   r   rV   r   r3  s   &r4   r7  r7    s9       ,GLL$$V,@@0@AAr3   z$/wandelen/routes/<route_id>/metadatac                    V ^8  d   QhRRRR/# r_   route_idrk   r`   r   r2   )rb   s   "r4   rc   rc     s     k kC kH kr3   c                   \         P                  V 4      pVf<   \        \        P                  P                  R4      ;'       g    \        R4      4      # \        \        P                  P                  RR4      4      p\        P                  P                  RR4      p\         P                  WV4      p\        P                  V 4      pV'       d-   Ve)   VP                  4       VR&   \        P                  W4       \        \        P                  P                  R4      ;'       g    \        RVR,          R7      4      # )	Nr!  rm   
route_dater   rF   r-  r$  r3  )rz   	get_router   r   r   rV   r   _normalize_route_dateupdate_route_metadataanalysis_cacher   r   write)r:  router<  
route_namechangedcached_reports   &     r4   r?  r?    s     ##H-E}((0DDGG4DEE&w||'7'7b'IJJ!!&"-J11(
SG"''1M=, * 0 0 2fX5GLL$$V,ii8HUZ[gUh0ijjr3   z"/wandelen/routes/<route_id>/deletec                    V ^8  d   QhRRRR/# r9  r2   )rb   s   "r4   rc   rc     s     2 23 28 2r3   c                >   \         P                  V 4      p\        P                  P	                  R 4      pVeI   \         P                  V 4       \        P                  V 4       T;'       g    \        RVR,          R7      p\        T;'       g    \        R4      4      # )r!  r-  r$  r3  rm   )
rz   r=  r   r   rV   delete_router@  r  r   r   )r:  rB  next_urls   &  r4   rH  rH    s|     ##H-E||'H""8,X&XXw'7E,DWXH00 011r3   z/wandelen/settings/hikingc                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     B Bh Br3   c                     \         P                  \        P                  4       \	        \        P                  P                  R 4      ;'       g    \        R4      4      # r6  )rz   save_hiking_settingsr   r   r   rV   r   r2   r3   r4   rL  rL    s=     &&w||4GLL$$V,@@0@AAr3   z/wandelen/analyzec                   V ^8  d   QhRR/# rj   r2   )rb   s   "r4   rc   rc     s     8 8 8r3   c            	        \         P                  P                  R 4       U u. uF  q P                  '       g   K  V NK  	  pp V'       gJ   \	        RR\
        P                  4       \
        P                  4       \        P                  ! R4      RR7      # \        4       pRpV F  pVP                  4       pVP                  R4      p\        VP                  4      p\
        P                  VR,          WtP                  VR	R
7      p\        P!                  VR,          VR,          VP                  V4      p	\
        P#                  VR,          \%        V	4      4        \'        VR,          VP                  V4      p
\/        TR,          T
4       Te   K  TR,          pK  	  \1        T;'       g    \3        4       P4                  4      # u up i   \(         d%   p\+        RTP,                   24      u Rp?u # Rp?ii ; i)r   rq   Kies minimaal een GPX-bestand.rr   rs   r&  Nr   rD   F	store_xmlzAmundsen job aanmaken mislukt: )r   r   r   r   r   rz   r{   r|   r   rV   _project_from_uploadr   r   _filename_route_name	add_routeupload_storesave_gpxupdate_route_file_pathrk   _analyze_bytes_and_cacher    _render_index_errorr  _rename_new_route_from_reportrender_reportr
   hex)r   r   r'  first_route_idr   r   r   rC  rB  
saved_pathreportr   s               r4   analyze_uploadr`    s    &mm33K@R@dMMTT@ER2&446)==? Z0
 	
 #$G!%NMMO	##K0)(*;*;<
''zCTCTV^jo'p!**74=%+xGXGXZcd
,,U4[#j/J	Z-eDk8;L;LiXF 	&eDk6:!"4[N  6657;;779 S, & 	Z&)H'XYY	Zs(   GGGG:G5-G:5G:z/wandelen/api/import/startc            	     V  a	a
a \         P                  P                  R 4       U u. uF  q P                  '       g   K  V NK  	  pp V'       g   \	        RR/4      R3# \        4       p. pV F  oSP                  4       o	S	P                  R4      p\        SP                  4      p\        P                  VR,          VSP                  VRR7      o
\        P                  VR,          S
R,          SP                  S	4      p\        P                  S
R,          \        V4      4       R V	V
V3R	 llp VP                  V! 4       4       K  	  \	        RVRV^ ,          R,          /4      # u up i   \          d2   p\	        TP#                  4       4      TP$                  3u R
p?u # R
p?ii ; i)r   r   rO    r   rD   FrP  c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   'start_import_jobs.<locals>.__annotate__  s     	 	4 	r3   c                 @  < \         P                  SP                  S4      w  r\         P                  W\	        4       4      p\        V4      p/ VCR VRSR,          RSP                  R\        RVR7      R\        RSR,          VR	7      R
\        RSR,          R7      /C# )job_idr:  rD   r   
status_urlraspberry_amundsen_job_statusrf  complete_urlcomplete_import_job)r:  rf  
report_urlr[  	report_id)r   
save_bytesr   
create_job_raspberry_analysis_settings_job_id_from_payloadr   )gpx_pathoriginal_filenamejobrf  r   rB  r   s       r4   	start_job$start_import_jobs.<locals>.start_job  s    *<*G*GHYHY[d*e'H$//MiMklC)#.F&E$KH--g&EfU(=d\b cgotM r3   Njobsfirst_report_urlrl  )r   r   r   r   r   rR  r   r   rS  rz   rT  rU  rV  rW  rk   r   r    to_dictstatus_code)r   r   r'  rx  r   rC  r^  rv  r   r   rB  r   s            @@@r4   start_import_jobsr|     sa    &mm33K@R@dMMTT@ER!ABCSHH"$GDMMO	##K0)(*;*;<
''z8CTCTV^jo'p!**74=%+xGXGXZcd
,,U4[#j/J	 		?KK	$/ 6 FD"4d1gl6KLMMC S< & 	?5==?+U->->>>	?s(   E'E'0E,,F(7$F#F(#F(z4/wandelen/api/import/<route_id>/jobs/<job_id>/resultc                    V ^8  d   QhRRRR/# )r_   r:  rk   rf  r2   )rb   s   "r4   rc   rc   )  s     	- 	-# 	-s 	-r3   c                |   a a \         P                  S 4      f   \        RR/4      R3# R VV 3R llp\        V4      # )Nr   Rapport niet gevonden.  c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   )complete_import_job.<locals>.__annotate__-  s     @ @$ @r3   c            
     Z   < \        SS4      p \        SV 4       R RRV R\        RSR7      /# )r  zRoute geimporteerd.r_  rl  r[  rm  )_complete_analysis_jobrZ  r   )r_  rf  r:  s    r4   complete_job)complete_import_job.<locals>.complete_job-  s7    '&9%h70(FLRYZiu}R~r3   rz   r=  r   _raspberry_response)r:  rf  r  s   ff r4   rk  rk  '  sE     x(0!9:;S@@@ @
 |,,r3   z/wandelen/report/<report_id>c                    V ^8  d   QhRRRR/# )r_   rn  rk   r`   r2   )rb   s   "r4   rc   rc   7  s      S S r3   c                   \        V 4      pVfJ   \        RR\        P                  4       \        P	                  4       \
        P                  ! R4      RR7      # \        P                  V 4      p \        W4      pT'       d   TR,          TR&   \        RT T\        P                  4       \        P	                  4       T T'       d
   TR	,          MR
T'       d
   TR,          MR
T'       d   \        TP                  R4      4      MR
T'       d   \        TP                  R4      4      MR
\
        P                  ! R4      RR7      #   \         d#   p\        RTP                   24      u R p?# R p?ii ; i)Nrq   6Rapport niet gevonden. Upload het GPX-bestand opnieuw.rr   rs   r&  z'Analyse via Raspberry-service mislukt: rF   zreport.htmlproject_namer   r$  r<  r   )rn  r_  ru   rv   current_route_idcurrent_projectr)  route_date_labelroute_date_valuerw   rx   )_document_for_reportr   rz   r{   r|   r   rV   r=  _report_for_router    rY  r  _format_date_date_input_value)rn  r   
route_metar_  r   s   &    r4   r[  r[  5  s3    $I.HJ&446)==? Z0
 	
 ((3J^"97 #F+v"002%99;"6@
>2b7A:l3rGQjnn\&BCWYLV*:>>,+GH\^[[, 	 " ^"%LU]]O#\]]^s   /E E0E+%E0+E0z$/wandelen/report/<report_id>/refreshc                    V ^8  d   QhRRRR/# )r_   rn  rk   r`   r   r2   )rb   s   "r4   rc   rc   [  s     C Cs C~ Cr3   c           	     T   \        V 4      pVfI   \        RR\        P                  4       \        P	                  4       \
        P                  ! R4      R7      #  \        W4       \        \        RT R7      4      #   \         d#   p\        RTP                   24      u R p?# R p?ii ; i)Nrq   r  rr   )r   ru   rv   rw   zAnalyse vernieuwen mislukt: r[  rm  )r  r   rz   r{   r|   r   rV   _analyze_document_and_cacher    rY  r  r   r   rn  r   r   s   &  r4   refresh_report_analysisr  Y  s     $I.HJ&446)==? Z0
 	
S#I8 GOyABB " S"%A%--#QRRSs   A: :B'B"B'"B'z./wandelen/api/report/<report_id>/refresh/startc                   V ^8  d   QhRR/# r_   rn  rk   r2   )rb   s   "r4   rc   rc   n  s     * * *r3   c                   a aa \         P                  S 4      o\         P                  S 4      oSe   Sf   \        RR/4      R3# R V VV3R llp\	        V4      # )Nr   r  r  c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   .start_report_refresh_job.<locals>.__annotate__t  s     
 
t 
r3   c                 V  < \        SP                  R 4      ;'       g    S R24      p \        P                  V SP	                  R4      4      w  r\        P                  W\        4       4      p\        V4      p/ VCRVRSR\        RVR7      R\        R	SVR
7      R\        RSR7      /C# )r   .gpxutf-8rf  r:  rg  rh  ri  rj  complete_report_refresh_job)rn  rf  rl  r[  rm  )	rk   rV   r   ro  encoderp  rq  rr  r   )r   rs  rt  ru  rf  rn  rB  r   s        r4   rv  +start_report_refresh_job.<locals>.start_jobt  s    uyy,BB9+T0BC&8&C&CHhoo^eNf&g# ++HIeIgh%c*

f	'"A&QG$AY_ef'/YG
 	
r3   )rz   read_route_xmlr=  r   r  )rn  rv  rB  r   s   f @@r4   start_report_refresh_jobr  l  s\     ++I6H##I.E5=!9:;S@@
 
 y))r3   z&/wandelen/api/report/<report_id>/cachec                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     K K3 Kr3   c                    \         P                  V 4      f   \        RR/4      R3# \        R\        P	                  V 4      R J/4      # )Nr   r  r  cached)rz   r=  r   r@  r   rm  s   &r4   report_cache_statusr    sK     y)1!9:;S@@Hn11)<DHIJJr3   z=/wandelen/api/report/<report_id>/refresh/jobs/<job_id>/resultc                    V ^8  d   QhRRRR/# )r_   rn  rk   rf  r2   )rb   s   "r4   rc   rc     s     - -3 - -r3   c                |   a a \         P                  S 4      f   \        RR/4      R3# R VV 3R llp\        V4      # )Nr   r  r  c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   1complete_report_refresh_job.<locals>.__annotate__  s     C C$ Cr3   c                 (   < \        SS4      p R RRV /# )r  zAnalyse vernieuwd.r_  )r  )r_  rf  rn  s    r4   r  1complete_report_refresh_job.<locals>.complete_job  s    '	6:/6BBr3   r  )rn  rf  r  s   ff r4   r  r    sE     y)1!9:;S@@C C |,,r3   z /wandelen/api/report/<report_id>c                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     ; ;3 ;r3   c                    \        V 4      pVf   \        RR/4      R3#  \        \        W4      4      #   \         d0   p\        TP	                  4       4      TP
                  3u R p?# R p?ii ; i)Nr   r  r  )r  r   r  r    rz  r{  r  s   &  r4   report_jsonr    sl     $I.H!9:;S@@;(=>>! ;u}}'):):::;s   4 A.$A)#A.)A.z/wandelen/api/plan/<report_id>c                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     9 9 9r3   c                    \        V 4      pVf   \        RR/4      R3# \        P                  ! RR7      ;'       g    / p\        \	        W4      4      # )Nr   r  r  Tsilent)r  r   r   get_json_day_plan_payload)rn  r   payloads   &  r4   	plan_daysr    sS     $I.H!9:;S@@d+11rG$X788r3   z#/wandelen/api/plan/<report_id>/savec                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s     d dS dr3   c                   \        V 4      pVf   \        RR/4      R3# \        P                  ! RR7      ;'       g    / p\	        W4      p\
        P                  V 4      ;'       g    \        W4      pVR,          VR&   VR,          VR&   VR,          VR	&   R
VR
,          R\        VP                  R4      4      RVR,          RVR,          RVR,          RVR,          /VR&   \
        P                  W4       \        RRRV/VC4      # )Nr   r  r  Tr  route_viewsroute_directionsr-   day_plan	direction
start_dateplanning_start_datemanual_days_by_directionday_notes_by_directiondays_by_directionlegs_by_directionsaved_day_planningr  zDagplanning opgeslagen.r_  )r  r   r   r  r  r@  r   r  _clean_waypoint_textrV   rA  )rn  r   r  plan_payloadrE  s   &    r4   save_day_planr    s    $I.H!9:;S@@d+11rG$X7L"''	2\\6G	6\M#/#>M- (45G(HM$% ,V 4M*\+.*7;;7L+MN"L1K$L ,/G"H\*=>\*=>+M&' 2I8(MbUabccr3   c               $    V ^8  d   QhRRRRRR/# )r_   r   r   r  ra   r`   r2   )rb   s   "r4   rc   rc     s!     / / /d /t /r3   c                   \        VP                  R ^4      4      ^<,          p\        VP                  R^4      4      ^<,          p\        V 4      p\        V 4      pVe   WTn        \
        P                  4       p\        P                  V4      p\        VP                  R4      ;'       g    R4      p\        V4      p	V	f   \        P                  VVVVR7      w  rpM\        P                  VVV	VVVR7      w  rpVP                  4        UUu/ uF"  w  rV\        WVP                  V. 4      4      bK$  	  pppVP                  4        UUu/ uF  w  ppV\        VV4      bK  	  pppVP                  V4      ;'       g    VP                  R. 4      pV	e   \!        W4      M/ p\#        W4      pRW9   d   TMRRVRVRVRVR	VR
V
R,          R
,          RV
/# u uppi u uppi )	min_hours	max_hoursr  forward)min_minutesmax_minutesrv   r-   r  r  r  r  r  r  )floatrV   r   _waypoints_from_payload	waypointsrz   r|   r   _time_predictorrk   _manual_day_ids_from_payloadroute_views_for_day_planmanual_route_views_for_day_planitems_planned_days_payload_planning_legs_payload&_manual_days_by_direction_from_payload$_day_notes_by_direction_from_payload)r   r  r  r  plan_documentpayload_waypointsrv   time_predictorr  manual_day_idsr  	day_plansr  direction_iddirection_daysr  direction_legslegs_payloadactive_daysr  r  s   &&                   r4   r  r    s   K34r9KK34r9KX&M/9$"3#779O,,_=NGKK,99	:I1':N9@9Y9Y##+	 :Z :
6%6 :A9`9`##+ :a :
6%6 -6OO,=,=(L 	+NL]LaLabnprLstt,=   ->,C,C,E,E(L. 	,^^LL,E   $''	2ZZ6G6K6KIWY6ZK]k]wEgY}A'U)"@Yi.\"$< "8'	2=A,	 	s   (GGz /wandelen/api/export/<report_id>c                    V ^8  d   QhRRRR/# r_   rn  rk   r`   r   r2   )rb   s   "r4   rc   rc     s     
 
# 
( 
r3   c                    \        V 4      pVf   \        RRR7      # \        V4      p\        P	                  WR7      p\        VRRRVP
                   R2/R	7      # )
Nr  r  statusr  r   r   r   z.gpx"r   )r  r   r  r   r   rF   )rn  r   r  r   s   &   r4   
export_gpxr    se     $I.H0=='1Ix=H&&*@u(UV r3   z#/wandelen/api/waypoints/<report_id>c                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc     s      c r3   c           	        \        V 4      pVf   \        RR/4      R3# \        V4      ;'       g    . p\        P	                  WR7      p\
        P                  W4      '       g   \        RR/4      R3# \        P                  V R 4       \        P                  P                  W1P                  4      p \        WP                  W44      p\        RRRTP"                   Uu. uF  qwP$                  NK  	  upR	T/4      #   \         d0   p\        TP                  4       4      TP                   3u R p?# R p?ii ; iu upi )
Nr   r  r  r  z!Route kon niet worden opgeslagen.r  zWaypoints opgeslagen in GPX.r  r_  )r  r   r  r   r   rz   update_route_xmlr@   r   r   r   r   rF   _analyze_document_xml_and_cacher    rz  r{  r  __dict__)rn  r   r  r   updated_documentr_  r   waypoints   &       r4   save_waypointsr  	  s%    $I.H!9:;S@@'177RIx=H)))>>!DEFKK	IIi~~00==I;0<Q<QS[n 5<L<V<VW<V++<VWf	
  " ;u}}'):):::;
 Xs$   4C>  D;>D8	$D3-D83D8z/wandelen/api/google-waypointc                 .   \         P                  ! R R7      ;'       g    / p  \        P                  \	        V P                  R4      ;'       g    R4      4      p\        RT/4      #   \         d#   p\        R\	        T4      /4      R3u Rp?# Rp?ii ; i)Tr  queryr   r   rb  Nr  )r   r  google_maps_importerimport_waypointrk   rV   r   r   )r  r  r   s      r4   import_google_waypointr  "  s     d+11rG3'77GKK<P<V<VTV8WX J)** ! 3U,-s223s#   +A' A' 'B2B	BBz'/wandelen/api/raspberry-amundsen/healthc                     \        R  4      # )c                 *    \         P                  4       # r   )r   healthr2   r3   r4   r5   +raspberry_amundsen_health.<locals>.<lambda>0  s    '9'@'@'Br3   r  r2   r3   r4   raspberry_amundsen_healthr  -  s     BCCr3   z%/wandelen/api/raspberry-amundsen/infoc                     \        R  4      # )c                 *    \         P                  4       # r   )r   infor2   r3   r4   r5   )raspberry_amundsen_info.<locals>.<lambda>6  s    '9'>'>'@r3   r  r2   r3   r4   raspberry_amundsen_infor  3  s     @AAr3   z%/wandelen/api/raspberry-amundsen/jobsc                 $    R  R lp \        V 4      # )c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   3raspberry_amundsen_create_job.<locals>.__annotate__<  s     
j 
j 
jr3   c                 l   \         P                  P                  R 4      p \         P                  P                  R4      ;'       g*    \         P                  P                  R4      ;'       g    RP	                  4       pV e+   V P
                  '       d   \        P                  V 4      w  r#MlV'       dX   \        P                  V4      p\         P                  P                  RR4      ;'       g    VP                  R^4      R	,          pM\        RRR4      h\        P                  W#\        4       4      # )
r   	data_pathnas_pathr   rt  rh   file_not_foundz,Kies een GPX-bestand of vul een data-pad in.rb  )r   r   rV   r   r   r   r   save_uploadvalidate_service_pathr   r    rp  rq  )r   r  rs  rt  s       r4   rp  1raspberry_amundsen_create_job.<locals>.create_job<  s    ==$$Z0\\%%k2XXgll6F6Fz6RXXVX__a	H$5$5$5*<*H*H*R'H')??	JH ' 0 01Db I h hX__]`bcMdegMh()9;iknoo!,,XJfJhiir3   r  )rp  s    r4   raspberry_amundsen_create_jobr  9  s    
j z**r3   c                     \        R  4      # )c                 *    \         P                  4       # r   )r   	list_jobsr2   r3   r4   r5   )raspberry_amundsen_jobs.<locals>.<lambda>N  s    '9'C'C'Er3   r  r2   r3   r4   raspberry_amundsen_jobsr  K  s     EFFr3   z*/wandelen/api/raspberry-amundsen/jobs/openc                     \        R  4      # )c                 *    \         P                  4       # r   )r   list_open_jobsr2   r3   r4   r5   .raspberry_amundsen_open_jobs.<locals>.<lambda>T  s    '9'H'H'Jr3   r  r2   r3   r4   raspberry_amundsen_open_jobsr  Q  s     JKKr3   z./wandelen/api/raspberry-amundsen/jobs/<job_id>c                   V ^8  d   QhRR/# r_   rf  rk   r2   )rb   s   "r4   rc   rc   Y       N N# Nr3   c                "   a  \        V 3R  l4      # )c                 .   < \         P                  S 4      # r   )r   
job_statusri  s   r4   r5   /raspberry_amundsen_job_status.<locals>.<lambda>Z      '9'D'DV'Lr3   r  ri  s   fr4   rh  rh  W       LMMr3   z5/wandelen/api/raspberry-amundsen/jobs/<job_id>/resultc                   V ^8  d   QhRR/# r   r2   )rb   s   "r4   rc   rc   _  r!  r3   c                "   a  \        V 3R  l4      # )c                 .   < \         P                  S 4      # r   )r   
job_resultri  s   r4   r5   /raspberry_amundsen_job_result.<locals>.<lambda>`  r&  r3   r  ri  s   fr4   raspberry_amundsen_job_resultr-  ]  r'  r3   z5/wandelen/api/raspberry-amundsen/jobs/<job_id>/cancelc                   V ^8  d   QhRR/# r   r2   )rb   s   "r4   rc   rc   e  r!  r3   c                "   a  \        V 3R  l4      # )c                 .   < \         P                  S 4      # r   )r   
cancel_jobri  s   r4   r5   /raspberry_amundsen_cancel_job.<locals>.<lambda>f  r&  r3   r  ri  s   fr4   raspberry_amundsen_cancel_jobr3  c  r'  r3   z/wandelen/api/split/<report_id>c                    V ^8  d   QhRRRR/# r  r2   )rb   s   "r4   rc   rc   k  s     	 	 	 	r3   c                    \        V 4      pVf   \        RRR7      # \        P                  V4      p\        \	        V4      P                  4       RRRVP                   R2/R7      # )	Nr  r  r  zapplication/zipr   r   z-split.zip"r   )r  r   r   	split_zipr	   getvaluerF   )rn  r   archives   &  r4   	split_gpxr9  i  si     $I.H0==  *G!!#"&*@{([\ r3   c                    V ^8  d   QhRRRR/# )r_   r   GPXDocument | Noner`   zlist[Waypoint] | Noner2   )rb   s   "r4   rc   rc   w  s      &8 DY r3   c                   \         P                  ! R R7      ;'       g    / pRV9  d   R# VR,           Uu. uEF  p\        \        VR,          4      \        VR,          4      \	        VP                  R4      ;'       g    R4      \        W 4      \        VP                  R4      4      \        VP                  R	4      ;'       g+    VP                  R
4      ;'       g    VP                  R4      4      \        VP                  R4      4      \        VP                  R4      4      \        VP                  R4      4      R7	      NEK  	  up# u upi )Tr  r  NlatlonrF   r   contact_person	plus_codepluscodegoogle_plus_codeemailwebsitephone)	r=  r>  rF   	elevationr?  r@  rC  rD  rE  )r   r  r   r  rk   rV   _waypoint_elevation_from_itemr  )r   r  items   &  r4   r  r  w  s   d+11rG'! K( )D 	d5k"d5k"TXXf%3343DC/9I0JK*488K+@+x+xDHHZDX+x+x\`\d\dew\xy&txx'89())<=&txx'89
	
 
	
 )  s   B(EA+Ec               $    V ^8  d   QhRRRRRR/# )r_   r-   z
list[list]all_legszlist | Noner`   
list[dict]r2   )rb   s   "r4   rc   rc     s"      
 k ]g r3   c                 N   . p\        T;'       g    . 4       UUu/ uF  w  rE\        V4      VbK  	  ppp\        V ^R7       EFH  w  rGV'       g   K  V^ ,          P                  .V Uu. uF  qUP                  NK  	  upOpTP	                  RTRV^ ,          P                  RVR,          P                  RVP                  \        R V 4       4      4      R\        \        R V 4       4      R	,          ^4      R
\        \        R V 4       4      4      R\        \        R V 4       4      4      RV U	u. uF  p	RV	/NK	  	  up	R\        V4       U
Uu. uF*  w  r\        WVP                  \        V4      V
4      V4      NK,  	  upp
/	4       EKK  	  V# u uppi u upi u up	i u upp
i )   )startdayfromtowalking_timec              3  8   "   T F  qP                   x  K  	  R # 5ir   )walking_minutes.0legs   & r4   	<genexpr>(_planned_days_payload.<locals>.<genexpr>  s     ;_[^TW<O<O[^   distance_kmc              3  8   "   T F  qP                   x  K  	  R # 5ir   )
distance_mrU  s   & r4   rX  rY    s     (G3C3rZ       @@ascent_mc              3  8   "   T F  qP                   x  K  	  R # 5ir   )r_  rU  s   & r4   rX  rY    s     %BcsllcrZ  	descent_mc              3  8   "   T F  qP                   x  K  	  R # 5ir   )ra  rU  s   & r4   rX  rY    s     &D}}rZ  r  rF   legsr  )
	enumeraterD   
start_nameend_namer   humanizesumround_planning_leg_payloadrV   )r-   r  rJ  planned_daysrm   rW  leg_idsrO  namesrF   	leg_indexs   &&&        r4   r  r    s   L09(..b0IJ0I*%r#w~0IGJA..
Q""Cc%Bcsllc%BCuA))c"g&& 7 7;_[^;_8_ `uS(G3(G%G&%PRSTE#%Bc%B"BCU3&D&D#DE?vtn?*3C.*8	 *#{{2c7I/NP^_*8	
	 /( + K &C @s   F)F3F(0F!.c                    V ^8  d   QhRRRR/# )r_   rc  listr`   rK  r2   )rb   s   "r4   rc   rc     s     a a a* ar3   c           	     `    \        V 4       UUu. uF  w  r#\        W2V4      NK  	  upp# u uppi r   )rd  rj  )rc  r  rm   rW  s   &&  r4   r  r    s,    PYZ^P_`P_*%!#n=P_```s   *c                    V ^8  d   QhRRRR/# )r_   leg_idintr`   ra   r2   )rb   s   "r4   rc   rc     s      s t r3   c                l   R \        V4      RV P                  RV P                  RV P                  RV P                  R\        V P                  R,          ^4      R\        V P
                  4      R\        V P                  4      R	VP                  V P                  4      R
\        V P                  ^4      /
# )rD   rP  rQ  re  rf  r[  r^  r_  ra  rR  rT  )	rk   re  rf  ri  r]  r_  ra  rg  rT  )rW  rs  r  s   &&&r4   rj  rj    s    c&kcllcnnCLLuS^^f4a8E#,,'U3==)//0C0CD5!4!4a8 r3   c                    V ^8  d   QhRRRR/# )r_   r  ra   r`   zlist[list[int]] | Noner2   )rb   s   "r4   rc   rc     s     + +$ +3I +r3   c                j    V P                  R 4      p\        V\        4      '       g   R# \        V4      # )manual_daysN)rV   
isinstancerp  _clean_manual_day_ids)r  raw_dayss   & r4   r  r    s+    {{=)Hh%% **r3   c               $    V ^8  d   QhRRRRRR/# r_   r  ra   fallback_directionrk   r`   r2   )rb   s   "r4   rc   rc     s"      D c VZ r3   c                f   V P                  R 4      p\        V\        4      '       dP   VP                  4        UUu/ uF2  w  r4\        V\        4      '       g   K  \        V4      \        V4      bK4  	  upp# V P                  R4      p\        V\        4      '       d   V\        V4      /# / # u uppi )r  rx  )rV   ry  ra   r  rp  rk   rz  )r  r~  raw_by_directionr  r{  s   &&   r4   r  r    s    {{#=>"D)) +;*@*@*B
*B&(D) ?C4X>>*B
 	

 {{=)H(D!!"$9($CDDI
   B-B-c               $    V ^8  d   QhRRRRRR/# r}  r2   )rb   s   "r4   rc   rc     s"      $ C TX r3   c                f   V P                  R 4      p\        V\        4      '       dP   VP                  4        UUu/ uF2  w  r4\        V\        4      '       g   K  \        V4      \        V4      bK4  	  upp# V P                  R4      p\        V\        4      '       d   V\        V4      /# / # u uppi )r  	day_notes)rV   ry  ra   r  rp  rk   _clean_day_notes)r  r~  r  r  	raw_notess   &&   r4   r  r    s    {{#;<"D)) ,<+A+A+C
+C')T* ;C/	::+C
 	

 K(I)T"""$4Y$?@@I
r  c                    V ^8  d   QhRRRR/# )r_   r  rp  r`   	list[str]r2   )rb   s   "r4   rc   rc     s        r3   c                    . pV  F5  pTP                  \        T;'       g    R 4      P                  4       4       K7  	  V# )r   )r   rk   r   )r  notesraw_notes   &  r4   r  r    s6    ESR(..01 Lr3   c                    V ^8  d   QhRRRR/# )r_   r{  rp  r`   zlist[list[int]]r2   )rb   s   "r4   rc   rc     s      D _ r3   c                   . pV  Fc  p\        V\        4      '       g   VP                  . 4       K,  . pV F  p VP                  \        V4      4       K   	  VP                  V4       Ke  	  V#   \        \
        3 d     KM  i ; ir   )ry  rp  r   rt  	TypeErrorr   )r{  r-   raw_dayday_idsraw_ids   &    r4   rz  rz    s~    D'4((KKOFs6{+ 
 	G  K z* s   A..BBc                   V ^8  d   QhRR/# )r_   r`   
str | Noner2   )rb   s   "r4   rc   rc     s      : r3   c                `    \        T ;'       g    R 4      P                  4       pT;'       g    R# )r   N)rk   r   )valuetexts   & r4   r  r    s'    u{{!!#D<<4r3   c               $    V ^8  d   QhRRRRRR/# )r_   rH  ra   r   r;  r`   float | Noner2   )rb   s   "r4   rc   rc     s'     V V V8J V| Vr3   c                    V P                  R 4      R9  d   \        V R ,          4      # Vf   R# \        \        V R,          4      \        V R,          4      V4      # )rF  Nr=  r>  )Nr   )rV   r  _nearest_route_elevation)rH  r   s   &&r4   rG  rG    sM    xxJ.T+&''#E$u+$6d5k8JHUUr3   c               (    V ^8  d   QhRRRRRRRR/# )r_   r=  r  r>  r   r   r`   r  r2   )rb   s   "r4   rc   rc     s.     I I% Ie I{ I| Ir3   c                   a a VP                  4       pV'       g   R # \        VV V3R lR7      pVP                  pVf   VP                  pVe   \	        \        V4      ^4      # R # )Nc                v   < V P                   S,
          ^,          V P                  S,
          ^,          ,           # )r_   )r=  r>  )pointr=  r>  s   &r4   r5   *_nearest_route_elevation.<locals>.<lambda>  s&    UYY_,BeiiRUoZ[E[,[r3   )key)r   minanalysis_elevationrF  ri  r  )r=  r>  r   pointsnearestrF  s   ff&   r4   r  r    s\      "F&[\G**I%%	)2)>5y!1%HDHr3   c                     \        V ! 4       4      #   \         d0   p\        TP                  4       4      TP                  3u R p?# R p?ii ; ir   )r   r    rz  r{  )actionr   s   & r4   r  r  
  s@    ;vx  ! ;u}}'):):::;s    A$AAAc                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   rc     s      d r3   c                    \         P                  4       p R \        P                  R\        P                  R\        P
                  RR\        V P                  R\        P                  P                  4      4      R\        V P                  R\        P                  P                  4      4      R\        V P                  R\        P                  P                  4      4      //# )smoothing_window_pointselevation_hysteresis_msegment_length_mhiking_modelminutes_per_kmminutes_per_100m_ascentminutes_per_100m_descent)rz   r|   r   r  r  r  r  rV   r  r  r  r  )rv   s    r4   rq  rq    s    #779O!6#A#A &"?"?F33eO$7$78H&J]J]JlJl$mn%u##$=v?R?R?j?jk( '##$>@S@S@l@lm)
	 r3   c                   V ^8  d   QhRR/# r_   r`   r  r2   )rb   s   "r4   rc   rc   #  s     m m mr3   c                 &    \        R \        RR7      # ) AMUNDSEN_RPI_JOB_TIMEOUT_SECONDSg      @r   )_float_from_envDEFAULT_RPI_JOB_TIMEOUT_SECONDSr2   r3   r4   _raspberry_job_timeout_secondsr  #  s    =?^hkllr3   c                   V ^8  d   QhRR/# r  r2   )rb   s   "r4   rc   rc   '  s     h hU hr3   c                 &    \        R \        RR7      # )AMUNDSEN_RPI_JOB_POLL_SECONDSg      ?r  )r  DEFAULT_RPI_JOB_POLL_SECONDSr2   r3   r4   _raspberry_job_poll_secondsr  '  s    :<Xbfggr3   c                    V ^8  d   QhRRRR/# )r_   rn  rk   r`   r;  r2   )rb   s   "r4   rc   rc   +  s     X XC X,> Xr3   c                    V \         9   d   \         V ,          # \        P                  V 4      pVf   R # \        P                  V 4      p\        P
                  P                  Y'       d   VR,          4      # R4      # )NrF   	Wandeling)r@   rz   r  r=  r   r   r   )rn  r   rB  s   &  r4   r  r  +  sc    EY++I6H##I.E>>$$XuV}WW;WWr3   c                   V ^8  d   QhRR/# r^   r2   )rb   s   "r4   rc   rc   5  s     
< 
<d 
<r3   c                 x   \         P                  P                  R R4      P                  4       p V '       d   \        P                  V 4      # \         P                  P                  RR4      P                  4       p\        P                  4        F  pVR,          V8X  g   K  Vu # 	  \        P                  R4      # )r  r   r$  rD   zMijn wandelingen)r   r   rV   r   rz   r"  r{   )r  r$  r'  s      r4   rR  rR  5  s    <<##NB7==?L++L99!!,399;J ..04=J&N 1 ''(:;;r3   c                    V ^8  d   QhRRRR/# )r_   r$  rk   r`   dict | Noner2   )rb   s   "r4   rc   rc   B  s      3 ; r3   c                `    \         P                  4        F  pVR ,          V 8X  g   K  Vu # 	  R# )rD   N)rz   r{   r,  s   & r4   r*  r*  B  s+     ..04=J&N 1 r3   c                    V ^8  d   QhRRRR/# )r_   r'  ra   r`   rK  r2   )rb   s   "r4   rc   rc   I  s       * r3   c                   . pV P                  R . 4       F  p\        V4      p\        VP                  R4      4      VR&   \        VP                  R4      4      VR&   \        VP                  R4      4      VR&   \        P                  VR,          4      pV'       d   \        V4      pV'       d   VP                  R4      MRVR&   VP                  V4       K  	  V# )	r(  
created_atcreated_at_labelr<  r  r  rD   summaryN)rV   ra   r  r  r@  r   _normalize_reportr   )r'  r(  rB  
route_itemrE  s   &    r4   r+  r+  I  s    FXr*%[
)5jnn\6R)S
%&)5jnn\6R)S
%&)::>>,;W)X
%&&++Jt,<=-m<M@M 1 1) <SW
9j! + Mr3   c               $    V ^8  d   QhRRRRRR/# r_   r:  rk   r   r   r`   ra   r2   )rb   s   "r4   rc   rc   X  s&     _ _ _{ _t _r3   c                    \         P                  V 4      pVe   \        \        V4      V4      # \        \	        W4      V4      # r   )r@  r   _with_document_waypointsr  r  )r:  r   rE  s   && r4   r  r  X  s?    "''1M '(9-(H(SS#$?$SU]^^r3   c               $    V ^8  d   QhRRRRRR/# r  r2   )rb   s   "r4   rc   rc   _  s&     s s# s s sr3   c                    \         P                  V 4      ;'       g    \        P                  V4      p\	        V \        WP                  4      W!4      # r   )rz   r  r   r   r  _route_filenamerF   )r:  r   r   s   && r4   r  r  _  s<    ++H5RR9RH*8_X}}5]_grrr3   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )	r_   r:  rk   r   r   r   r;  r`   ra   r2   )rb   s   "r4   rc   rc   d  s1      c S C [m y} r3   c                    \        WVP                  R 4      4      pVe!   \        WC4      p\        P	                  W4       V# )r  )rX  r  r  r@  rA  )r:  r   r   r   r_  s   &&&& r4   r  r  d  s:    %h(//':RSF)&;X.Mr3   c               (    V ^8  d   QhRRRRRRRR/# )r_   r:  rk   r   r   bytesr`   ra   r2   )rb   s   "r4   rc   rc   l  s)      s c e PT r3   c           
         \        \        P                  VV\        4       \	        4       \        4       R 7      4      p\        P                  W4       V# ))wait_timeout_secondspoll_seconds)r  r   analyze_gpx_bytesrq  r  r  r@  rA  )r:  r   r   r_  s   &&& r4   rX  rX  l  sL    ,,(*!?!A46 	- 	
F *Mr3   c               $    V ^8  d   QhRRRRRR/# )r_   r:  rk   rf  r`   ra   r2   )rb   s   "r4   rc   rc   z  s!      S # $ r3   c           
         \         P                  V4      p\        VP                  R 4      ;'       g    R4      P	                  4       pVR8w  d   VR9   d   \        V\        4      '       d   VP                  R4      MRp\        V\        4      '       d~   \        \        VP                  R4      ;'       g    T4      \        VP                  R4      ;'       g    R4      VR8X  d   R	MR
\        VP                  R4      ;'       g    R4      4      h\        T;'       g    RRR
4      h\        RRRT;'       g    R4      h\        \         P                  V4      4      p\        V 4      pVe   \        WV4      p\        P                  W4       V# )r  r   doner   	cancelledNcoder  zRaspberry-analyse mislukt.i    detailprocessing_failedzRaspberry-analyse is gestopt.zAnalyse is nog bezig.i  queued>   r   r  )r   r$  rk   rV   lowerry  ra   r    r  analysis_resultr  r  r@  rA  )r:  rf  status_payloadr  error_payloadr_  r   s   &&     r4   r  r  z  s^   '226:N##H-334::<F++;EnVZ;[;[N..w7aeM-..,))&1;;V<)))4TT8TU![0Cc))(399r:	  ))F)F3FHgilmm$%8:QSVX^XjXjbjkk1AA&IJF#H-H)&;*Mr3   c                    V ^8  d   QhRRRR/# )r_   r  ra   r`   rk   r2   )rb   s   "r4   rc   rc     s      $ 3 r3   c                    \        V P                  R 4      ;'       g    V P                  R4      ;'       g    R4      P                  4       pV'       g   \        RRR4      hV# )rf  rD   r   r  z+Raspberry-service gaf geen jobnummer terug.r  )rk   rV   r   r    )r  rf  s   & r4   rr  rr    sQ    X&AA'++d*;AArBHHJF$%8:gilmmMr3   c                    V ^8  d   QhRRRR/# )r_   r_  ra   r`   r2   )rb   s   "r4   rc   rc     s     T Td Tt Tr3   c                R    \         P                  V \        P                  4       4      # r   )report_normalizer	normalizerz   r|   )r_  s   &r4   r  r    s    &&v}/P/P/RSSr3   c               $    V ^8  d   QhRRRRRR/# )r_   r_  ra   r   r   r`   r2   )rb   s   "r4   rc   rc     s!      T [ T r3   c                `    VP                    Uu. uF  q"P                  NK  	  upV R &   V # u upi r  )r  r  )r_  r   r  s   && r4   r  r    s2    =E=O=OP=O,,=OPF;M Qs   +c               $    V ^8  d   QhRRRRRR/# )r_   r:  rk   r_  ra   r`   Noner2   )rb   s   "r4   rc   rc     s&     H HC H H$ Hr3   c                    \        VP                  R 4      ;'       g    R4      P                  4       pV'       d   \        P	                  WR4       R# R# )rF   r   N)rk   rV   r   rz   r?  )r:  r_  rC  s   && r4   rZ  rZ    s>    VZZ'--2.446J++H$G r3   c               $    V ^8  d   QhRRRRRR/# )r_   r:  rk   fallback_namer`   r2   )rb   s   "r4   rc   rc     s!     8 8c 8# 8# 8r3   c                    \         P                  V 4      pV'       d%   \        VP                  R 4      ;'       g    R4      MRpV'       d   V# \	        V4       R2# )r   r   r  )rz   r=  rk   rV   rS  )r:  r  rB  r   s   &&  r4   r  r    sL    ##H-E38s599Z(..B/bH"=12$77r3   c                    V ^8  d   QhRRRR/# )r_   r   rk   r`   r2   )rb   s   "r4   rc   rc     s     $ $3 $3 $r3   c                    \         P                  P                  \         P                  P                  T ;'       g    R 4      4      ^ ,          P	                  4       pT;'       g    R# )r   r  )r0   pathsplitextbasenamer   )r   	base_names   & r4   rS  rS    sG      !1!1(..b!AB1EKKMI###r3   c               (    V ^8  d   QhRRRRRRRR/# )r_   rF   rk   defaultr  r   r  r`   r2   )rb   s   "r4   rc   rc     s)      #   PU r3   c                     \        \        P                  ! V \        V4      4      4      pTe   \        Y#4      # T#   \         d    Tu # i ; ir   )r  r0   r1   rk   r   max)rF   r  r   r  s   &&& r4   r  r    sN    biic'l34 7""L	  s   )< AAc                    V ^8  d   QhRRRR/# )r_   r   rk   r`   r2   )rb   s   "r4   rc   rc     s      s s r3   c           	         \        R V \        P                  4       \        P                  4       \        P
                  ! R4      RR7      # )rq   rr   r   r&  ry   r   s   &r4   rY  rY    s<    "002%99;[[, r3   c          
     ,    V ^8  d   QhRRRRRRRRRR/# 	r_   r   r  r   rk   r   r  r   r`   r2   )rb   s   "r4   rc   rc     :        	
 	r3   c                    \        R V VVV\        P                  4       \        P                  4       R\        P
                  ! R4      RR7
      # )r   rE   rr   r   	r   r   r   r   ru   rv   r   rw   rx   ry   r   r   r   r   s   &&&&r4   r   r     sJ     "002%99;"[[, r3   c          
     ,    V ^8  d   QhRRRRRRRRRR/# r  r2   )rb   s   "r4   rc   rc     r  r3   c                    \        R V VVV\        P                  4       \        P                  4       R\        P
                  ! R4      RR7
      # )zgpx_trim.htmlrJ   rr   r   r  ry   r  s   &&&&r4   r   r     sJ     "002%99;[[, r3   c               0    V ^8  d   QhRRRRRRRRR	RR
R/# )r_   r   r  r   rk   r   r  r   r  r   r`   r2   )rb   s   "r4   rc   rc     sD        	
  	r3   c                    \        R V VVVV\        P                  4       \        P                  4       R\        P
                  ! R4      RR7      # )zgpx_simplify.htmlrL   rr   r   )
r   r   r   r   r   ru   rv   r   rw   rx   ry   )r   r   r   r   r   s   &&&&&r4   r   r     sM     "002%99;#[[, r3   c               (    V ^8  d   QhRRRRRRRR/# )r_   source_indexesr  reversed_valuesexpected_countrt  r`   zlist[tuple[int, bool]]r2   )rb   s   "r4   rc   rc     s0        	r3   c                J   . p\        V 4      V8w  g   \        V4      V8w  d   V# \        4       p\        WR R7       FN  w  rV \        V4      pT^ 8  g   Yr8  g   Yt9   d   . u # TP                  T4       TP                  YvR8H  34       KP  	  V#   \         d    . u u # i ; i)F)strict1)r   setziprt  r   addr   )r  r  r  r(  seen_indexesr   reversed_valueparsed_indexs   &&&     r4   r   r     s    
 F
>n,O0D0V5L(+NTY(Z$	|,L !|=A]I&|s%:;< )[ M  	I	s   BB"!B"c               $    V ^8  d   QhRRRRRR/# )r_   rF   rk   fallbackr  r`   r2   )rb   s   "r4   rc   rc     s!      3 % E r3   c                     \        \        P                  P                  W4      4      #   \        \
        3 d    Tu # i ; ir   )r  r   r   rV   r  r   )rF   r  s   &&r4   r   r     s:    W\\%%d566z" s   '* A A c          
     ,    V ^8  d   QhRRRRRRRRRR/# )r_   rF   rk   r  r  r   r   r`   r2   )rb   s   "r4   rc   rc   $  s0     - -3 -% -% -% -TY -r3   c                B    \        W4      p\        \        WB4      V4      # r   )r   r  r  )rF   r  r   r   r  s   &&&& r4   r   r   $  s    T,Es5"G,,r3   c                    V ^8  d   QhRRRR/# )r_   rF   rk   r`   r2   )rb   s   "r4   rc   rc   )  s     3 3 3 3r3   c                    R P                  R V P                  4        4       4      pRP                  R VP                  R4       4       4      pT;'       g    R R2# )r   c              3     "   T F<  pVP                  4       '       d    VP                  4       '       g   VR9   d   TMR x  K>  	  R# 5i)-N)r!  _)isasciiisalnum)rV  	characters   & r4   rX   _gpx_filename.<locals>.<genexpr>*  sA      %I &&((i.?.?.A.AYR\E\	cff%s   AAAr!  c              3  8   "   T F  q'       g   K  Vx  K  	  R # 5ir   r2   )rV  parts   & r4   rX  r&  .  s     ?&6d$TT&6s   	
zgecombineerde-router  )joinr  split)rF   cleans   & r4   r   r   )  sY    GG  E HH?ekk#&6??E,,,-T22r3   c                    V ^8  d   QhRRRR/# )r_   r  rk   r`   r  r2   )rb   s   "r4   rc   rc   2  s        r3   c                    \        T ;'       g    R 4      P                  4       pV'       g   R#  \        P                  ! VR4      P	                  4       P                  4       #   \         d     R# i ; i)r   N%Y-%m-%d)rk   r   r   strptimedate	isoformatr   )r  clean_values   & r4   r>  r>  2  s]    ekkr"((*K  j9>>@JJLL s   2A" "A10A1c                    V ^8  d   QhRRRR/# r_   r  objectr`   rk   r2   )rb   s   "r4   rc   rc   <  s      V  r3   c                r    \        V R 4      '       d   V P                  R4      # \        T ;'       g    R4      # )strftimer.  r   )hasattrr7  rk   r  s   &r4   r  r  <  s/    uj!!~~j))u{{r3   c                    V ^8  d   QhRRRR/# r4  r2   )rb   s   "r4   rc   rc   B  s       3 r3   c                   \        V R 4      '       d   V P                  R4      # \        V \        4      '       d(    \        P
                  ! V R4      P                  R4      # \        T ;'       g    R4      #   \         d     L"i ; i)r7  z%d-%m-%Yr.  r!  )r8  r7  ry  rk   r   r/  r   r9  s   &r4   r  r  B  su    uj!!~~j))%	$$UJ7@@LL u||  		s   %A6 6BBc               $    V ^8  d   QhRRRRRR/# )r_   titlerk   r  r`   boolr2   )rb   s   "r4   rc   rc   M  s!       s t r3   c                    \         '       d   \        '       g   R #  \        P                  ! RR\         R\        RV RVR^/^
R7      pVP	                  4        R#   \        P
                   d     R # i ; i)	Fz(https://api.pushover.net/1/messages.jsontokenr  r=  r  priority)r(   timeoutT)rP   rQ   requestspostraise_for_statusRequestException)r=  r  responses   && r4   r  r  M  sy    %6%6==6+)7A 

 	!!#  $$ s   ;A A21A2__main__z0.0.0.0iv  T)hostportdebugr   )Nr   NN)Nr   NN)Nr   r   NN)__conditional_annotations__
__future__r   r0   r   copyr   r   r   	functoolsr   ior	   uuidr
   rC  flaskr   r   r   r   r   r   r   r   configr   amundsen.core.analysis_servicer   amundsen.core.analysis_cacher   amundsen.core.gpx_exporterr   amundsen.core.gpx_simplifierr   amundsen.core.gpx_trimmerr   "amundsen.core.google_maps_importerr   r   amundsen.core.modelsr   r   amundsen.core.project_storer   r   'amundsen.core.raspberry_amundsen_clientr   r    amundsen.core.report_normalizerr!    amundsen.core.smart_gpx_combinerr"   r#   amundsen.core.upload_storer$   __name__appr  r)  	root_pathDEFAULT_RPI_DATA_ROOTr  r  r1   	token_hex
secret_keypermanent_session_lifetimer   r  distancer   r   r   r   r  r   rz   rU  r@  r@   __annotations__rA   rB   rC   rf   rP   rQ   r\   context_processorrg   rV   rn   rm   r   r   r   rH   rD  r   r   rK   r   r   rM   r   r   rO   rU   r  r  r  r"  r-  r2  r7  r?  rH  rL  r`  r|  rk  r[  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rh  r-  r3  r9  r  r  r  rj  r  r  r  r  rz  r  rG  r  r  rq  r  r  r  rR  r*  r+  r  r  r  rX  r  rr  r  r  rZ  r  rS  r  rY  r   r   r   r   r   r   r   r>  r  r  r  run)rL  s   @r4   <module>rk     s9   " " 	   (     ` ` `  : 6 2 6 0 ` 6 H c < Q 8&
 S]]FM:V "( " 0'2C2CB2GH!*!4 

$V, w''(!'"2"23))*w//012cd ,II(*FGII+-ABII&		2IK`(abII"
		-ryy9QSh/ij	  )+		2G(HH(T"$ZfZh +@!ABryy)FGH " ""$ $!_ !#% % 	m &B	 	jOF	 	n 'Q	 	"#-J	'	6 YY34 II12  $ $ & &    	    	,-  . 	   	&'  ( 
'(  )@ 
/0  10 	#$  % 
$%_  &_0 
,-  ." 	'("  )" 
()|  *|4 
01  2 	-.  / 	) ) 
#$W %W" 
& & 
+ +
 
B   B
 	*+  ,. 
23B  4B
 
23B  4B
 
01k  2k 
./2  02 
%&B  'B
 
8  8@ 
&'"N  ("NJ 
@A	-  B	- 	'(  )D 
01C  2C" 
:;*  <*. 	12K  3K 
IJ-  K- 	+,;  -; 
*+9  ,9 
/0d  1d,/d 
,-
  .
 
/0  1. 
)*+  ++ 	23D  4D 	01B  2B 
12+  3+  	01G  2G 	56L  7L 	9:N  ;N 	@AN  BN 
ABN  CN 	*+	  ,	 ( 4a+ 
VI;$mhX
<_s
 0T
H8$
  ( ( ,*-
3* zGGTG2 r3   