From 5fb9f53be34d79f38f5dc7d84a6f3b644c553508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Thie=C3=9Fen?= Date: Thu, 20 Aug 2015 21:49:55 +0200 Subject: [PATCH] DT @20.08.2015: First Commit --- app/.gitignore | 1 + app/app.iml | 152 ++++++ app/build.gradle | 49 ++ app/fabric.properties | 4 + app/google-services.json | 1 + app/proguard-rules.pro | 17 + .../deke/risk/riskahead/ApplicationTest.java | 13 + app/src/main/AndroidManifest.xml | 62 +++ app/src/main/ic_launcher-web.png | Bin 0 -> 76299 bytes .../deke/risk/riskahead/AppController.java | 51 ++ .../deke/risk/riskahead/LoginActivity.java | 454 ++++++++++++++++++ .../org/deke/risk/riskahead/MainActivity.java | 219 +++++++++ .../deke/risk/riskahead/StartActivity.java | 82 ++++ .../fragments/FacebookButtonFragment.java | 111 +++++ .../fragments/GooglePlusButtonFragment.java | 243 ++++++++++ .../risk/riskahead/fragments/MapFragment.java | 252 ++++++++++ .../fragments/TwitterButtonFragment.java | 153 ++++++ .../risk/riskahead/fragments/UserInfo.java | 128 +++++ .../deke/risk/riskahead/helper/AppConfig.java | 12 + .../riskahead/helper/GeocodeJSONParser.java | 78 +++ .../risk/riskahead/helper/SQLiteHandler.java | 147 ++++++ .../risk/riskahead/helper/SessionManager.java | 45 ++ .../res/drawable-hdpi/drawer_shadow.9.png | Bin 0 -> 161 bytes app/src/main/res/drawable-hdpi/ic_drawer.png | Bin 0 -> 2829 bytes .../res/drawable-mdpi/drawer_shadow.9.png | Bin 0 -> 142 bytes app/src/main/res/drawable-mdpi/ic_drawer.png | Bin 0 -> 2820 bytes .../res/drawable-xhdpi/drawer_shadow.9.png | Bin 0 -> 174 bytes app/src/main/res/drawable-xhdpi/ic_drawer.png | Bin 0 -> 2836 bytes .../res/drawable-xxhdpi/drawer_shadow.9.png | Bin 0 -> 208 bytes .../main/res/drawable-xxhdpi/ic_drawer.png | Bin 0 -> 202 bytes app/src/main/res/drawable/Thumbs.db | Bin 0 -> 11776 bytes app/src/main/res/drawable/logo_riskahead.png | Bin 0 -> 35655 bytes app/src/main/res/layout/activity_login.xml | 127 +++++ app/src/main/res/layout/activity_main.xml | 27 ++ app/src/main/res/layout/activity_register.xml | 131 +++++ app/src/main/res/layout/activity_start.xml | 45 ++ .../res/layout/fragment_facebook_button.xml | 27 ++ .../res/layout/fragment_googleplus_button.xml | 19 + app/src/main/res/layout/fragment_map.xml | 29 ++ .../res/layout/fragment_twitter_button.xml | 19 + .../main/res/layout/fragment_user_info.xml | 55 +++ app/src/main/res/menu/global.xml | 5 + app/src/main/res/menu/menu_login.xml | 7 + app/src/main/res/menu/menu_main_share.xml | 9 + .../main/res/menu/menu_main_usersettings.xml | 9 + app/src/main/res/menu/menu_start.xml | 6 + app/src/main/res/mipmap-hdpi/Thumbs.db | Bin 0 -> 6144 bytes app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4851 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2796 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 6898 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11675 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 17459 bytes app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 17 + app/src/main/res/values/dimens.xml | 15 + app/src/main/res/values/strings.xml | 34 ++ app/src/main/res/values/styles.xml | 5 + 57 files changed, 2866 insertions(+) create mode 100644 app/.gitignore create mode 100644 app/app.iml create mode 100644 app/build.gradle create mode 100644 app/fabric.properties create mode 100644 app/google-services.json create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/org/deke/risk/riskahead/ApplicationTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-web.png create mode 100644 app/src/main/java/org/deke/risk/riskahead/AppController.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/LoginActivity.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/MainActivity.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/StartActivity.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/fragments/FacebookButtonFragment.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/fragments/GooglePlusButtonFragment.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/fragments/MapFragment.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/fragments/TwitterButtonFragment.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/fragments/UserInfo.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/helper/AppConfig.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/helper/GeocodeJSONParser.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/helper/SQLiteHandler.java create mode 100644 app/src/main/java/org/deke/risk/riskahead/helper/SessionManager.java create mode 100644 app/src/main/res/drawable-hdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-hdpi/ic_drawer.png create mode 100644 app/src/main/res/drawable-mdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-mdpi/ic_drawer.png create mode 100644 app/src/main/res/drawable-xhdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_drawer.png create mode 100644 app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_drawer.png create mode 100644 app/src/main/res/drawable/Thumbs.db create mode 100644 app/src/main/res/drawable/logo_riskahead.png create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_register.xml create mode 100644 app/src/main/res/layout/activity_start.xml create mode 100644 app/src/main/res/layout/fragment_facebook_button.xml create mode 100644 app/src/main/res/layout/fragment_googleplus_button.xml create mode 100644 app/src/main/res/layout/fragment_map.xml create mode 100644 app/src/main/res/layout/fragment_twitter_button.xml create mode 100644 app/src/main/res/layout/fragment_user_info.xml create mode 100644 app/src/main/res/menu/global.xml create mode 100644 app/src/main/res/menu/menu_login.xml create mode 100644 app/src/main/res/menu/menu_main_share.xml create mode 100644 app/src/main/res/menu/menu_main_usersettings.xml create mode 100644 app/src/main/res/menu/menu_start.xml create mode 100644 app/src/main/res/mipmap-hdpi/Thumbs.db create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/app.iml b/app/app.iml new file mode 100644 index 0000000..4bd9dc2 --- /dev/null +++ b/app/app.iml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..266c1c0 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,49 @@ +buildscript { + repositories { + maven { url 'https://maven.fabric.io/public' } + } + + dependencies { + classpath 'io.fabric.tools:gradle:1.+' + } +} +apply plugin: 'com.android.application' +apply plugin: 'io.fabric' +apply plugin: 'com.google.gms.google-services' + +android { + compileSdkVersion 22 + buildToolsVersion "22.0.1" + + defaultConfig { + applicationId "org.deke.risk.riskahead" + minSdkVersion 15 + targetSdkVersion 22 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + jcenter() + maven { url 'https://maven.fabric.io/public' } +} + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) + compile 'com.android.support:appcompat-v7:22.2.0' + compile 'com.google.android.gms:play-services:7.5.0' + compile 'com.facebook.android:facebook-android-sdk:4.1.0' + compile 'com.beardedhen:androidbootstrap:+' + compile 'com.mcxiaoke.volley:library:1.0.+' + compile('com.twitter.sdk.android:twitter-core:1.4.1@aar') { + transitive = true; + } + +} diff --git a/app/fabric.properties b/app/fabric.properties new file mode 100644 index 0000000..3272e9b --- /dev/null +++ b/app/fabric.properties @@ -0,0 +1,4 @@ +#Contains API Secret used to validate your application. Commit to internal source control; avoid making secret public. +#Sat Jul 18 18:32:41 CEST 2015 +apiSecret=c93664ec6681827d89cba7fe0f675194c2d647258169cc7912aa627437319d09 +twitterPluginId=55aa7fa76bfe67e9d100a86c diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..42f73ec --- /dev/null +++ b/app/google-services.json @@ -0,0 +1 @@ +{"project_info":{"project_id":"riskahead-61dff","project_number":"498007911848","name":"RiskAhead"},"client":[{"client_info":{"client_id":"android:org.deke.risk.riskahead","client_type":1,"android_client_info":{"package_name":"org.deke.risk.riskahead"}},"oauth_client":[{"client_id":"498007911848-ppr7ct4oa2gs5jjnmrnlnutgui8m365n.apps.googleusercontent.com","client_type":1,"android_info":{"package_name":"org.deke.risk.riskahead","certificate_hash":"4b6c989e6c0d6824f5a2d7b1a10ff36560c3397f"}}],"services":{"analytics_service":{"status":1},"cloud_messaging_service":{"status":1,"apns_config":[]},"appinvite_service":{"status":1,"other_platform_oauth_client":[]},"google_signin_service":{"status":2},"ads_service":{"status":1}}}]} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..622f32f --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in C:\Users\Dennis\AppData\Local\Android\sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/app/src/androidTest/java/org/deke/risk/riskahead/ApplicationTest.java b/app/src/androidTest/java/org/deke/risk/riskahead/ApplicationTest.java new file mode 100644 index 0000000..a4884e9 --- /dev/null +++ b/app/src/androidTest/java/org/deke/risk/riskahead/ApplicationTest.java @@ -0,0 +1,13 @@ +package org.deke.risk.riskahead; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4242adb --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..23db85b690c9b237dc0fc829b15ade2fe6635990 GIT binary patch literal 76299 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%0D2**+gU1hS-IV3Y;|w7pXB{g zopA=N!Pqun7scw~`{kSyN7bcFW4HeDOG{6Cyst+qwZW6}G7FO*)!`Q7ICUB36$goS z-{-AwhgCl;_SC}Gz?Wvlf-&DPGyk6tAJRST;&;MF9cyoRa7OHD^#XoZAsd}d=1*4KdFf%_| zpIqpa?>Ty@xB1lL``UP-=)3TJ_a`yxaVbre( z_n&Y+P1pU)J@;@WatlOw25R8@qorH>;hlRIi7bz~l(zA$-46WMar z8PzUYVSGsGHygQSs17AXHz{(i1GTW6fJPFKc@PZ3fF}l#5Mw9DrH%27Cyw+sxZ!Kq z!rnX4M1#(M5md+K@BVf|Izu)c9M4QfM@P$wi^D2w{noqm^z^>y>r>gD?Qf_^h5j{; z8Hiu^P;q=pd=21uIQh|ztcN)%RW-{U^L*ARb9+rTd7Om*eNm{b0dlAUbj5>|5O()P zLLS^YoJyyFW8nvY15y7oInXJ}k4$mm&vou_0>k2x$NZGVof1Y`ves?V?7L1k| zMbu)3eDHqvVcm22{4wZa14#G;RQYnAPo3w>$+v>Uw^B2ReuP}LziBW>MbR4Ee{Y4g zvAz+z+gL}ZA1flf_bq!Rfr_NEGG}Q;v8nsbO<8tzoIqpUHxHh%KgeklZ__cldXcrz z@8n5q$)MpRc9P>?kl)Ju_~eGQAWF^i!B#{PPAw3Rmr}Kms0<<>5BSOY6qxx7JV}xy zxnJ3bSYAM^Ks$XAMPFD-LPng#xX17Cs}s(2Sf8lgI$mi?!^UgPXDSO8RKcC;RYPgw z^`hzamm{VsVoRZTVEuL8XDk^>X z@#sfpD@?*#P z&<80ZJIF^&)0+dpXzq`lb@kc@<`Jphyb}B&Ato?5Zp;B~k%s+uN7(z^DAnyp8hE2%eL5(oJQ1nK-zil04W> zNJSDG|LCC&!4G>gKNs=Apx6$Y2aaFLMtkFZW$*1sUe^!xd;(&3N!==->$(9VU-;Q* zA#%u23dHyQW4K#KT+zSpQo@Oq@kB2qlMEd~h45^Tc<|ch=x^?vj&aw7_tinMI%#YD z5xX<+Z7nmM`s#?zs#m^KaPtS$t1*1!h4&8k=2$06H%cM2Au9=!!N^Xx$6u;9Fw*TC zRxdhS87$PC3x4hF?$oAFH<^9@{5e7d*_IkR$e+-uImCZIp1m2Zul%B3n3|`Awg5SV zk{2j#aR7Ol#)RHmd!<#hqIAjjU7wj*N&FqW>yN8dnZcDR%?$H{N&^v3z!dibVL+q(wN=b1j(IJ$#-bo$F9%2EoP!or=8FCEvAzr7EqkfV4QL8^ zj?zlZQOTB_eX|b)&Fbj5SHg~#^7ls;20Y^^U>{?1o4H08R-5x|tdM!{^xadr$+s)XC<(?$P47j(X{VNFKoD^hlhHNtvb&XHDtY8EcCM61$a zGI&3%hp?M_&?$KmoO=}1c#P-b2(N>#VNQI2L9Z=vmXCikqWCSHyxCx+0NaM&oP!2t zb<%|y1D2*53VqXuXyTxL*)#xZG%cJ31Z12MCAb6a=_bv~y-SLWk(w^E)-)E6hn|EZ zA35?zdzIW33{=MivG*8$tZ2x8#%*RG!tj@a$*Y3D#gBIq)~dWCpMa-gAwFHh^s}$H zp}*i~KE&DLQf_!xdueZ)149())SdKhF-1b^D~` z=+A)oE~)o<$O)F{121Bq+zo)48N)*ufITA&_(jBH(Inbp_1&>MHQsvtH3s`V5eQXt zUs0LvT5cOm_ju~r9<>IMKy;qDY=I0_Vfq7zWzBP|eKD5qh@djax4*?ekjoM{?$yb9 z8*|z9s|UEa)B{I-*`%d3J;@#0&K-S!1jg$Sn!Y*WXRh(?c_(xr1g+yYep_S=Lo z(!h<IBBuPg8)cOzqi#sOiC@F(A8Ao&~_9snvCrGGkj zy83FsXn|@_0(-=q@S(n}VNnFrKq}PL980l1gvw@nt~yUl;_~`KYhi;5xwsjWiOB zxpiO{n-fPYk~Wf_;j7HB`-h4~J(+%+;s7NTNo2t?Ss!!TvjIvuoPL9$7-%e&k8KPQ z9?}#M4}32H?bSgd?()(yItn911?yuh?Da=e&3W{y$vr%@pG3^%W-A3zcrbCWBQf%ry%UPD6JH7jjAV(~# zi^;|yr(fzqX_#~?roX&Mh!F<|3r%WSUo+mM#0xhjEC^Ig1ssb^+KO*RI|mop?;pSO zqp^k%rqicWtvF^CVJmX}ak8PLqU!biPCW1s(1*6+YNWT`_fLs(vGzr#Tz-$vR*0;f zqJW-4&SY1^ENNuL$lm%{KteZPQcb6dZlPP#?)by})r*iaB1HTdrMJV`54WIHI56v# zwY8m-mtOZ@^!Hxn%>i){rNj>}{n0e61IQz~GyZ8Z6BXTr7|JSMC!R1Wl-?tOJ3#c^ zmnUX5>9t6XrOeL2q>`L5-%|s*-&SxKm}iRT{ZFAdU+t}w4%UxTommggBQD)#t~esH z%0LaAoGr<9nxfl<^JaJJ?;kFNvJe+3LSvTCuF`cF$Puw`J03dE?qQN8*s<3X8^@9c z#h*c`O~%zEdtGzcR^8x_6c|sB8pztf)?xS4t`~##6CPv_NGgS5f}17y1qXo8b~Z)wu!iadVO-kfYf)K zh%ev-d@3R&|JflNJk415`tiaRXSmXW-GJ|8+EcK<~_MwgB@Jp{aLvK;ow@SX@+vx?C#FtOonqCLMF6DM_S4I^d!suxX9MpBh38E( z62HA%Q5Y3{9@BO)##3}NicDb+U3KdRDTJ~9(1(m&2tS0?*d<)83PTP+2x=xbArQST zk3(+qC#b~5W3UvEl&uD-X!YCy)Cao=T0YI%E#5}9MM3r!zM zf^g&?aa>R&b0iB6|K&DM2G5)g7JTDP#{}IYnmJt<>R^;`KxkYDky=UN_KEkC0m`{wEKbPK$&9lIu1(iVSLg0!dh%&=g;r<#Al~U*ZUx8Vee-QeAFTjV>Jlbm0U6gv`i^QWJ(R6Ln;ver%s2`ND{N}V0 zx;wfSAU@pt-|Kz|-y*31`Y;;tV->+^OB@fvkXqf(pJyEf2zh2-@uLPHWD}f_J{2I3 zd_#`h*T9@nLiLe<~ZLg`1gup$BVLP@2=aUA<{kfK`@M3p>Wa0Oy*d?5kNoNyI zS70~(9&-O0ZN3W($;qd~CyN~g+ZW?K{bQ(W$X%nd6je4@h~w%0MZec%vwFF?7T^2R z)H@<88dGhNp~&5@$|jKR3ukOokYt<222VEWz8^f}rk#^ksL*j+WlYnpmxbUu1^)SZ z72o09-)e}V@ZOX^T5y;V9G{5jlLhXlG!(k@s=h z9nKvK^^Kke4eB60woMc%bRc#ng$%+8%}Mk%K%*zI4Jg zaF}EYXh{vgzCs$oLZM(s5lJJ(;Bx^ul~eGJhbbHF_Q4wjSB{ViBi$cwJJ=5nRsSAe zjKNc^@f|OpP0w5K?9N5~HVfO{B9x;a-D{392G|i%-w>vTvj}liu+f7^$g^NxNAo_e zx4%Qr6hEKWyFcTK-debiq_c;Az3v(agF8E1KN0~uMK&H1znKd$tG$-V-st6fT1ArW zU2!g^;OUZR5CK>bi?F`2kaYtojA?+A71qeKdyGJ_bo}r&@m%mrucg0>N5SE8(#$uo7*`{mSG7r~m$vsTLwcO_w*BELH`V2PRr zjT`XFe&dz9)ZqP{^$zrHC+!YW$6#se!ezWQM^m2ERd91nvmUu1`SVCwdd2(qYKvL( z>gS%kQ2}6G9y1p!WLJz>Jc@n)r-mAUN#gc2i85y%cI^B8GX*Z&uT)~L3#+u~cR%6s zi{?fU%Rsst#_v&o00uEH_kTU`hf0h-&Ow|OHxIp8+Fy$v$=Ika88<$Dx-#y~19kr| z-Spl0FCb^4RF8z$G91q5v_u!tgn;OIf9G3$_1LMN4A9Zg=wrw=)Af=ej`$hgZifrn zfA(qX;VmH3K5~8fwJE=i#exZDw34J~<{eJ7T%?S{+PFKoQ^5s;>C+6?7RG2`@6uOm z*wmVsJJ15@ym`;gWyK49Y-lLT)CgG1OUYV1)>=AQM4`LK%e}LlngeeM(8MxU|B1ry zXkj3b$8A{0CjaZwAIMo7DA#3Af@Sc=7Z?mbr)J(-l_NWC>CxUk!pR%DxpgAX>_4j? zaNk_!Vo|;Gu+)C9q&!Rj>g`PtMY$K}l8AeFM6Zdhaw4Usns?708x!VCM_r-yeV}BO zGq%}5#tvc-s4JbFpO5I0*{*+z~5;SPGph(lHCcJA;C)>|?+;atgaXAi2PLm?5+)*K$l1v){vKPpsE? zO}B>N2QX^g5x4mYKNH1I*rvg}H}ThnjvLZ;BBKAq=%Lbbrm`svjDI-*_LQV4wG}Qr z2#Or?CVpUg!~CM^Jbg&-i}F=dAa`}XGEw1j;1GKEX+`xE@P?VCw(j~<99L{*;5LAc z;YHo+u4MnE#dV(B1sb*nSd$aIE<)npO6-)_lz8?|sCs?Bc7n_KH70;^&HP(z8%mIm z?boUVBuNNgK=yDjx**Jx3zWeZKY4G`CE3?UG#DdR-|Km^;YlshatVKKyIf~o$6rEp zmP?i8R2zOvDMh`kZd&;(D<_LBo%!4TTb=2Ox!Kn5N@Iu^@$M@QEq=sx8R3!szByzn|(QlcQ0Qa{4B8b$x3wR&mNf$NHnUr?)m?#_bd%&qEkU z7^lv_2?>Vfs7Q{zGO$r9kwIUL$rgD2oPDYh370}h&jaH?yIgdigG?0)4uKme9a0@Q z=*9IlASl^Aoc`wai<*S*odTb)mrhEJ9OR|Sdfs3KdK_ZJra+eGy#9Fm*~V6CnmzDW z30?3(fpGdsQdD4hTB<%12(``k)i?o5%_&MspO$2jFtpL2%E(YW5`X$?8B1;QEJv?drI_Q2J29@gZ%lx$nra3BQJNa?F32 z;^W4c@LphY2#8DbpqijhP1VYrf`kR4EWTP`lLGHzqQi)=ivz#H$&*u&0Yen(plnY7 zDd5kmJ`ud65Y|B9*uMA1Snj0fnjIJ&m=nCf-D%)0Erp%FJfPwW<8Fpod~$P!aR7(6 zth8%C@>gMuWHHO*h_EL%%##$*wqfX8#tihk%MQYA=N6iQ*MYe+gjg(`5q+8L ztH9!4L#XC`YQeNW&CwYnWX9BSPh!HnzI_=U7%^j8F_B)y?*oa-KjcLCyoemmV$Gq* z1Q-nv1b&Y11WW;y?kon%a?!7}se(!)$oxJ!I7F5Q(P6T?v&9~etcS&&7@Q6k9lX1x zQ4TmwA2`Tu&uRS^S%l70xW?*kN=!-`7O45HT88pS!vx9c=hzF0TiLQcu80ZZWJU4d z2QntQgV3?A3!$CC844{2C@U6sif)0wiUEO?2h~>47~;983UU>ae$ys&PJ&+6?+C z3XYG)a(I|{3PdTJPAwW)o$2@i(U(Gop=YCuZ8ADw;_Hd>^N180E&lM)Wb?>a4&Grr zM6!)S!1WOYWgB0ZLf>t;=q_3wN89v%Hu{-5=j(lx2H>{n2^uI5$M?@Ey`AS9<;L#~ z5c?1l71g*Xlym>`XERPc$DQC2@YgULzAE0<5{by)1!Re|Nv%Uw_n)HyI38Wwa^KkK z`ZFsvv?;A25f>7h4?X0^w;moU=C%x2$dl9%(#|wNv~R>1Q$lO4Q5yGYeBjlq&MbsFfSibkB>-y)M5jOw7R2YC z#0883h$(LOhyhD<*jQMoBvEGX-aZ}q|Kv)jwdxg?FGOVqGL-0u_5;fUSuu!-81(gn zdD|!C`&VaXdft|n^jM*4^38^eZ^FXesNIm@5B@>l2fyoJ3*3G)2M+p zV|ny7(fRa`Tm_|MP4D14SLXvaD%N27M9Hpv)V=@-)95WnmJtbx|00CB3E3$>5ZT1~ zxRQw_s}R|w`jQsrtrB9a^5tS3qn&1nvZn#IUDcd~_nA!8Ai?B`FrV?VG4w)E1-HkU zg^rI;PYd3?ucQv0K*GQwy*tn#J}$)WL+L|536O!^;l?5=lWyR{2mYMcia`SP{(E)V z(P*DgqsbU#i%cP!S;1kFo&aKGdMdFJs5{EYfhF5cvEm?*yz?%ew519)lt|}mqToaa zU042h=ozN(L*tQ{=b$x$eWwl@MlAVKBGOcV`;my7(zf6W?s7*9PU=HzdGY|6y}1c^ zPM0w>0nUX9l%k&i@hGqYA5l?WgyYi;qkp$b+3V1MuO`xHzd@=)c!LS+=l3mzkW(fn z(j=`gn8k-;C^G5m*m9Vq>KP}Ujq)yH@&0~fqc$=7T6IDV6K* zzMT4fe^bOGZA(wov#F;LY=A#ape{pG7M2UaEf2_A%U&uJxRiH`36jvdvHE%&xt7m` zB!%ejji3amJrN*(z@p<3lEDB-(NYQF$UatS5 zI;nGEq_ePN)J@=KxuUtvHykB3&92stiEi+ptyp=YZpYBGOYb*2d5$+7I?2GJ80qe> zZV4?79xCOY`i~dZe@Cz4K@$Ig#Hj&Rn*f8xq4-hJ)RA9GR9eb6-Lm-7{*t5J3f;Q; z(r3AvfM=K@l9ZQ$)?+si5}xHIiuIghZq~c*ivVfd-&^L=i4>SM-E0Zpc^!t{)iq zA*9-T_#R4w8n9wIv2)`3N#!a+^^;lLid5B&8SZA58~bZw*d5Gxr4{6|IS^)C!79j4 zII)Ck2$b0#m_N!(UltH%%DS?(v61yeO2P6zLBb+c-Ah%H-47?4%_+-{k|mz0K9V>$ zC(`y_Zer~CT+P^#f=XU6g&FIKvVRCPczJ2k)Are`;KZ`#-H(7!RCM!7@QbchYHlS= zitF8AY3> zFq84N2*yzw3Hk;W3vo!V40{C7tg`4In7GXoq?3jRv02};e?5HeJek6V7w(^v2}>C^`$bsJbqS-zf&^ z?ifPp5~X2=MnGBwBt_|x289_KX%vxe6hQ=(dXX3!QE6%EM!IX}o9|D!&pCHLd#}CL z?+n$533LO+Dkt6}m%f;32IaG3?bDuisFdDQP;enn!OX4dzaXl3n=6i+KIGE7mc=Jv z@FYSTMs*20haaFj;^Si|LVDXXS#KDaLW%K{HrJY+lQzX5Hp0wJ$cjJxNb}Rg2E~>4 zri*9V)?@OQ^VO5P{e7DsrzNEg*QUMvJwYld;9!MVgEDIgnU zwuL8DpD2PVmA%XLQmOE)^t8Qru?|$4*3RMK0c|glBe)mnZzyXtV_KU_Blhrcrq+P7 zv&HI)!Iim(j{Fo<_TtkhCxH_9SUuZP3q}&q0LGA!MYXj;OBb~z5EXCNDJi^Vg#*;L z6i_oPsNkk8n5DMOh|_>Z5DpPhx!_01Xyn(39U5?4clw`OfiN;cvS4KR*+GxIqI z6T|D9Epy)}?X$X)8F`}ZYzyy9M!eQ~@Q0qc=eDl^MF&DBn$7rDO>@W%^a)o0fDOeg zQLYTYO5zXDja8;_V3d;U8B_!k%WOwwq-IjC-X2z(2F;CIMU$&?- zBJQ#JpSB!fder-$sqDW#)+vw;R@q`=p_O`S$k3(8WD9aO(^=oCJj`PQV#~YP+Cj8^jy_!0aO#;EMwvR50<@E*Htz zDsQwuyN@RR=70=Nf#m2eqs>iKb1@w1{IWKzNN8v@b-U;`=bE4E+=tR}xT+in^J~o_-1i(nJ|5rK=EigJ z{sr6FoOI*!yH&@M|F@NY3t4QkI&SSBo)WMJv0a5ICMGsPHW(9n z=qzLvSYSfDf@U$&?rd#ssU>1^=uw5t+?usb&$k@~3VJ{qHjlpzTaCr`qH4>Sn73Aa z;N{{}1I+hM4T+~_K4Ds|0~O0SQ8iqxZ7w4quK(`4eMgICH}+>InlC>8fH3%-hHANk zRbhryqe}UQERTv%hZY!{(1qOnmGJ_rYkRr4wn(8q7V68iOB+rq@r||ak4kw8_-AhK zA-1LG$y%V}ujhm3w>|z5fFHtY&)bmYqr=5y%W=Lk%-4!6lPD^oksTjnPqwIG{g`;;ix`pbo*+q@ z5u~R=njH{ePx&mS5lKaE(PQ8&`UqY84d~&RzU5`~>IRa@8eoLAM$m&}hzG)MFDKno z=1At1mmj2@v{Ns8iHcGpc>*t@#hfwE&-(~66;G#Aq#KR*dCbsZ?^GTPk5k*a=vH?@ ze?8tMW^%FD#GYRauuBUEoFxjDwF&UWSgD)79&(&qdw1{E@~7IEp5_3Bv9!gQl(+~ zb0Zgp)s;N^&7c>4u#Gw>8aY}DkRdI&G?XE>rzGN1k}yhhe4916gaNQe@YYRIcyp`RB=9psX8<#1qNr=1ihy`DU(s%}iU}Ep8iUZ?@_;aM% zdETs7zktusW~$+^Llh>`kin!rX&~mGmzqg}-m{oJ<(=#|p!9n{!5#imCf_2|=2DFT zluvNS*oZuj^xc8XTx8d?;m+i?(hTC;W;lacIU3$e|^s zTx@ys4e*YVO-NNQ5$c&N|IAL63%^YY2z-_}(z`!b(<8b0 z+w*C@fQJ*4X8P-)ZL>Bd+o8InoKVTo^yN*i(IhF#V4XFf>?yd3V8Ueq{w^W;KGWda z-@8K3nm^*H29tWy%LbA=Vjr+viF>P@3~EaOMAD*M?O05EU}1=;l<1twPunCf1nNlh zK#MT}6b-2N_QX9^&|!yr0bK=LIHo}1m9A1L4RK zWT1LgkJ;^)x4x81rZyb=RL6Et23TVGQS}Zz&w5essqts$SuSx)Qb1c$^Ikh;^V%jE z`pk$AXRm^vcbmuGs^~`F5%sfgJIBU6&v&K~K{5#8{*zGMWpob}Z&YqCndmx0%IjzctG^&+jsaNmP>Uzgg?%kM^ww<%ju zpc;;=obZy%Q2uy48{zNe!K;|j;DgSW5%ul&-#*HBZ_v7lSc650XzUOX-72P>w$_}0 zXC|cm*2Z~5;-B7At9Wyu$pZAS{pYXVgAlPA+V)af@a^jA*)${G6-Q+0Q$r$sFR$cW zteYNAfv_+t^_U?ss#>(sS1+#-$v+>ZO28VML5V(}V>?#$0H!eCU9&z{jxmkX4JGV0 zC?xy+M7h`|;U6YA+(1(YxWYkEKl~%HL{CNqQv^C+@Lf01&SOL{{aK z(kbh!Z4p)&T8ONbjvv^%my!%I>8r z-h5faAIQC9KK0Nm%RMFZh8JLYyhOW#8b1>M~|5b;y*d*3z ziw(O_Y{4NLM8~WRi{5YGKoF*vTJuJH>%giyfpz zy#P+GZ#!BiNIDf3h!Hu1u?SH->IHy}E)-|@{4Q%Csc4#E?fs+Qp)L0_tiF%;k~{?d z<4;LFXy7He*ZZSj{D+q)s(}_E0r0HlxaEEAx=q-Cap#lDTfMk%E)ssTf!{lfv6S3f zi6Hz3BQhJvm_hR3ZE;BfoV^|%-DF3Oc|%rRd5ND8J+q|@Ve9)UG-&bfLbDr5G9_Mb z`onBlN^Ru9kF7eq9rhqF{m$~@-tO!^SFhNknc^K$34ziIIC~FgMBoC@#dqh4uL`fZ z?Pp;j5{BQhpg>(8^^~WxRWk4GiaJ39q>;fTf+76J?LlG75E0OYN(&5E^+;Wrv!`__ z$m`2O?Tne(nK{>qB&`%51L zYuzsj!i}K75E&wF^DPJ#Ct(O7u8fP2XLBvj>WKY2pV(+BU2kaYbrVI;6W!n|{*~c9 zEidrzTT+GjzguYCSb(SVsLX{lOAS(v{#ah@aZ(8Pf=Rlbr1QoL57&XZ5N%IC6 zz9L>m3s_p}Xlr*jn){3iZb8MrvunWI!fIKvv+ik@X~8k>%GzpzU(*=U0Io&dYJE9W z`7I`XUBK*X(Hoir^V%{>FC18?%-wE}{ei>8=YyJTegjGdlr`4Pkgm^56r-$(y|{?%QcTF`4$L}s7Z%2 zVbi&xJFSgt+-O~ORbMgB;kTN&(4u)Iy*dcSQt>dp$MBPY)k~&Nz9Cj&Uy6`A*J26G z47(BY2ekj;=@Px$Esm~J$a+Qu|0|Ebj*proA*#;s0eD@Q*IOUe%iTLY)Y$~Y$(Z&b z%TPl^iBVU^QlJ$%Y?}I$Jl4Ms^-GtZ2}Oa?Dm)nUP&Q2UviM!2etv$h&hP8ZV${FH zz2%3lVBt5f!4E1i@xgK6lMK=VbB6O0^M{z%q`7gP7K^wR8`G1tNi&U6@U8ksI5BTx zPPubr44UOQKcD3`9P381z+Oy;xpjl??nnQ*#7FC4y>QQ&f3#`+O!_FkUgG`e-d%na z)8pG)^AW7p2ER60qK~oXotW}Z{xPFrPm#+i^2>B#Y0EtZ9J4m=?BS>Xfu}mA+DA%i zqvM_IQZvf=hHpaLz5GtvKmW882nm)G{8va?q zRySLmI-@vPzt6@eZqdMvya0x5FW^}><}{BK5dc)*`4vEdyDPq)8evV}`6G_{bI(69 zu!imo<3-NUHDeDx*1QurX}dpIlShN~AHs9G(B1GH<`beDe{ro1{L_XJZ$^v^XC2+H zOT+KF-Z}1$pSz)|U<1^63vMUMQ!2ECkQ)&h(AA=k^Lg@E-J>^IY$UloO>SIMr*2yY z!wA|tQSqvQtt9T{#^T;5W+f$~{RK1(+>igH8v0eT1K%Jl6rE&fHHO z3GSV5(+)pP?h0bKBA0hJOU)8@cb3IA0!4 zWrJvQn~BvW<{KcP5zlWWR<2Ke!6=+|eY9(;N14kP=rNcj-oebCf1k8sU~^B3yfU9bJ+%Fa(>;>)@KUo+*K;z5PCnl?`6UG~(E=G$^HVQT=>hS~n$ zixe68=lq1W{DIARBUCrx?G}5_K0%bhj-s3vrE5WEyaK5iD z?ZNz(6o+7WlzpX%qdGe~p)}Y5v<3^u(xIjRPk3q;R-#DU;3*R#EW0QlmXcFsOmXl1 zsAh2c^g;Ky@NqmVCG@UNsg%^~iQ5v~RHt0<0?vNA+x94pLpSONkWBR2X~<|{NvzfapS&wdkUP2*7b8*x4P1VN0PA0xo1bDIKv?BLUSEZTDul;t3DtMmSz*a6wK{og6s06upL zRDfK8|HeOBByK)AwRmV)eLS&1@T_h0wrl^sGli&kXH^<_=mWmWAL?}mpUJ`DbGKhj zeupoct4BOvhSX%znZIi>*`e%~qg$~%{vr_J`elm~U)2o)AXJrDK#LKfaED-|zpW+W zw4;VSSoT{$FAmwBxa_8BMjD)}D(5pSCr-rKza7xga%xQ3FZBq=k?M{_fR|Bz0Iw>_udOZ9UpM%_MlHliX3mOC|8`jr4fIL1!Noq-7?qs;H|Pfo0z zYw4hl1WbKN5vZT4AtWrwVqgqT9CbW*bM)q8`CK>^jvY99`gGw5^3K=o@yoLJFw;U} zCviqwJ$*i`0ZrrjGt_@2mu0eiq@FgLxSPtKe?Q$$vCYJ_*%dCY2pqAUQG{IeZ7LJe zj=l8@wM!Q_i`!U7}dzg)8 z#xztd9izTc0Mfp(hYy(_(?K-2z1Ig`%a+@elczZ8Xpt=6haG9LsK!!RE&Jb3h!)?P znj(sbs)k>sWTo3xr+h%Qb67(Lcyjn^ms zT2nY121hOvWc#WBCu3laF)?&}+dq)!ZrZKoe%R+g=|)=920=)Ge1hdb(LNwLHo#nB zq1v2pt7lN2Ibh-{FQ6(wi&fV&$(H8oseM(>-My}=$VKV?8yn}8tGx0ot^6U+ZZ~l?!XWq5A3c*4Bv_OyunbKk;Rg7 zT}rRoX0V^IesmQ}>w$MtgLIx=oIt;IbUZcvnHcKl=l9+Y^@V9UEK#grL>REYc{d-#xEt%PEj^Jws$tJEPQ zJ4ivBx<7>3yl8=PSjLEkigLtAIwd7T*ntKki~X;?h6~&w`_}kaTS$giSAp}gGnG{% zJ421UlNxyBHf!`}Zcel$I3$6Cl_G15E3CK6mB(>mN%@zX)1EE)Y?z1KOVbj6?3^V9 z1<;E20`|?-7OP8rP5(^!??T6_S(WymFTZ~&I0ze(1c>4=NA7Q7QqnAwljqA>FMC~* zb16eMj_#VvhCi5XnLWv5UCVzpze|Dre##6|2+CxA`R^^t)WAI`UAnbVT+M?+&I--M z;987+O#@%`)K*13Fk;dTOA6Vq|0IaisTzO(C0`oT8-4&6NuD5DW~OF#M~Id<6yAs` zaL2)jqDY*dCfp@rEpXMmH|UL6#rPN%q|l~EL+eOioUwx-);w&cI{aT;?eup^?2S+A z0L3-%aXQ4-?q2mQD5JS=>W07!AWd1jt)pqsRUl32{(b3pzFt5nFn3oMWO-paINO$n zfBYU??GD{vo;~MG;D2@^l3uK;_U+A5{MTgcwGS|p0PV9!-NJbDEhz2?V1DTQoy?x^sqV;f7#|Lr zQ(2sswY#=svrBOI0}#!SX{)Ru#{n-pUr)DJ;r!{HM;$>aJvf)Umja){^Ln>YdK{0= zyr8_r@x2-)6hr_;^!*;rUi$ouzUGr@hzlEAHNwkdtc;o)W^6M*q|U`tuIYl+Q9pxn zKlHJ;xOG}}s9A-6@WA=~R=(3~Arac{+&4pSkCjZlKiVSX0jgP*1Mx|IiOrE;U09!W zu~_A2du%G2m_zqo16D67q>G`Hwb zI8MW_FUT<^PBH5c@_f7HqX+DujbuuKkL0Dom*#R#3Lr8Twfv-9NZe{HgIn;TZcK9F zzKXnZqHzR&O#&-D6BQk_2%s9BFi3IU3^Is%*ntXxH*5Adv#H^=AebLvl0wl@fYg{pSyh;hk4=^YegC<*)hh1-b2dci*d)1d^n?0o8&7t zb43-#FHcs)ch|c0DxzDKQ+N|v6=3`6DkQd9h9oFGe6|+I^0_^UEpAcGU*U_IdW8|I zyw8WYAa5Q>IWsr1-URoPk%P2n5Q%7vF(ez&-~RTPf&l3&zpC7!Gx(;`$rE*0zyJr% zH09KGWYyc5inN)?#z+g6Y#vhI_O99yT&t!1w+CPgI)f@!_snVA*aZ{4`m(aJppp># zSb>zXBmQwl429Yq6w4tjeTOU{QkZMSmwaaJ<@B-BLR5Nc(_H~6k3vbG1hMBq z3~_j>%(3x5N2JDK=S$in-@Sv`dT57*`28zu|1%+_VrS(`U@C$bL{j|)JuiE=^?rm@ zMk5yB^20cB^xPMeGku&{wVx4-8*X*1i%5OjX*4p@RpYwjL?r;=ftK`e57DrLph!^I zqUJ7>03d$1wDh@3Hb54aWdgyq>8XR!$^hqR0?CClmI8owAj)AqB3y8Z7u+JG&TJ8xl_dD_PI-L@d)UzzDLz#1u<`(L1>N8a?;7`;2bAi-yG2Vp5X8n%jQP4r*Bkaz-`) znK;*d9?r`f_kqH5*1k*X(9^a5V?1pL0V8EaGW=p*v`rp3!yyfv;)D+f)&tevhV5@B zwz|D_C8}_%{d{3#F=v%a)?}?VmU8;5pE{cU!XpS8M?5}#30!+Nk#|SE@j#MEtb`R( zW0uvFIpdNIrjqXg8DVn<@~YD+?vEo%OKG{{=+;^EFeb91j9{>9(T7VL3$MAuLz2Fy zGtA<+*fr(VhJJ1fCU1i)1HZ^=PBxh!kG7K9w0Dm;G60!CBNzCd1hj$ZUzshAJ*JrK zMB7qdxX{`cO81Q~AgX^0IF6o=9>%J=vysn=bgcD-)=V$IB_K*~B+Zc>gCBnRT#rVY z_adn&Fjh<$`#a3QTUuaM0GMLKNL>HiKg{z=#}?yFC5Q2{p$8pW)6LhrqLic*Zl_#mm0ps`#9qF$u?T2{mTEjz zUQT?huiMr6>RTEEN)CFri;5oX6BbKtc-stMqG@KdD0$n?Ku5>$rn~;zLCm6NWU?tz zcnDXP9R|U`J_2W;EAIE#QTB-x6eUnzQ-A`%Jr*QpE6W1BG;Yq<8T;Qi4&+FV5?s+h zY}(Cyn2eNN)JGyBY%O;|9U1Cz%JVKDAuFgO;8zZ9{EtgR9Dcp{181i6VQw+UsSe0& z5%`r>3Ov)pJ`_@%{KdI!Zl4|W8*Mq6lKo3Icj9^4aQPi(8K%(N_IzU(Z-n*#{#44X z_%W#?cO%|p6b!r+R$yGgv>VvAqh_A2{Qe-=NE=qv?X>%>AP-fdd@g}$L4`oo;{GiH zTDep*y)qMCtqaev*n&i|O|r@Xq6|tVw(yWAH>io?WKKFI?hqy)wf#4TMJrIu*5G>q z+yjj^RMmNGTYC`7n(YMI$WGCT+9t*ZNQa>{Z_^uyBhpfDXVPoWhun#&++n9 z=e&H)@^{QNSII3eW>!1~gHe9m8nlr@cO$fo&z8Q9n3vE7HMA^ThSih>4~5tW!~uQP)eNWsK^B?%BL z$oA`b-Zx{&BgT7(jl10mAvKR%FU^PCRp*ud`F6Ka)`;?<+Nn1}h)`AbBKn|x%CiZs z3qok6-J5iDYVAuO)KD}*$Vr}VoM1ts(0?7;<33ayQ}X4Lijo3@8JMp5dBrF4p=3sl z=V&Lh#=dp<;W}z8d4@XEeyZZW;p?xuy1EQJQL9zVJsfm*$dEZa_lq=630Sh+41N(y zw?$~dK3UW88!B?;m&2T7_sU#{PGsJ1fB{;9qkEot=;r(eKXpZMUe^ElhAPhekqMQr z-*8>!^O^O~`KG^C4c86QsY!*gfB#s?H`%H}m218Tkvzae4#}7BMILjEK*H`J6nRU) z>v*NTU-CZd1MbF>Z+~4~wX|7w9RF$=^vUxX@cA5<^$B4>`b!q%*V|A!f90>zcgDC!?h7I7 z^*dX#Vnkm>{cW>@A_gXiv8DRh3s33W@1zZ9GD9KIf}czJqQn5Ix}YHT@jssV7NlGc zQ3e&Y>iEyTeu)5LlZ+kThXu*#Wu^-sx{WZv>BmkZWe+sM3#&rcps%I7R0j{tWAlm6 z|G276cjp7QMQY{_@$0$Kg1rIq4)C9%nwrdH)?I1wy!+MvM(qJKa6gor9QdefEY|kp zHzh0^F>HC;HWDNNT?EkL(3LZ(1R&T*m*GT(&RxFmm-sv z-tof^Ht_$r3mUejUplo%gD-ow58?>ZqcQMZAq`wz0dZr0bRW zUEKI(w}4F{AeC_Z<19cg9WZJezt_s4BUB_rR)^z)PmRwNG6yYmsq?-Lmp7T`RCy!@ zp{D|=ZOwkmPX(!M7?4qvelX{K$zu#wPc7{G#B-@}JScSWUzWk{J5oBgFlCu&77$RV zvIXWP_3(v&Zeyz#DOb?CXRK7Ft^fE!d)sr>4*;Js==lw^L9+7J?8czibZK;Zj5OkAf^`?cfJa`ql{KYnM94s!%uc+=Z3-176S6MpgStNwHk zkZnLiVLR{aU|Vg%+2I{d?a~&q640ap5!L-pK7?3X3Lc4~b9b_UVm^{IO4_FWCbngQ zwlgp}1D>XW5zh*C+oy`;(FBbAJ=P4GGR_Ot{@%eOsW$0{M-T~A5@)v?@RCZ93Zus` ze3a9g3B`h_*db3Z^UDr8d&T4X@t7t3PAm&-rKX--xHRoew^ zIO(@Nifw}v#6X)UesBqb&NzDRfPyjU39T&udOaT!G#?U-MKTFsDsVM#9YRu_&!0L9 zDwRvDY{91Vtka_Va`T7WRH;#Euk9NToi!ov5`+D$1FJXM|V_j-tnE#4WH@F>XA6 zR_JF&1-zK!yTe|q%e=EOBxV$9_wrWA%LhezB&hEc*j$1cS9V53Z0F_b?!+lx;s57h zbu~H8nf!$6BuAbeC{;!c@B?i&ezB$+kD1;`zbI5WNVT9Cd3N(eEyif{zX#++K0(wu z87q8J7&g`~VddSS-QCS!k?GV#7||8f?%%<@irIglg`GaAeaP^L%-Ahpnl&|mLips* zlrzh?vGEhfxAU5UfMFQ+fy-nP z#%~{Sf3RVrsp(<7g&k!jb#nD+;mV|Cln$zRlX7V|7L$W!fgCy=IoTG|?>DkrgsN5K z1?sL$a)F9G02o^0;Pop@G0p^I6F12(6WI&N6AoXe*)K_eX({D%uuiB_P6Hq%c&Q8w zz2U37Qg0#~mJ3auiPhrdsZ}N}U_s;(*lcLj$KM6gx&^ zX6tb)Vev0jaMY&^nnvNK5x!f%%;rCf8*hL;d*pJ*mw%P9AGAS#O^7+exCy*c~;IEhPp=zzD#kDwy zRy`yI7epESgcTlm%}I=joeO$t<0FYzRFXEtMmurB!W#AKg204Fjnq9x=)fZY-|xyW zEuI1cFaB)&M()df24y)ac3O)H{J$VU+2IFm*NAst&=;600bspHsmX7m`H%U$`inq- zH)g*n;6+E7jcDSp{_=K@ z(o+}C0SItc3xEfoW@1<1cn#nFJ)aNRw9xZY=|jCZ4jqXC1Puc0M6R|2l(;95_Jr(b zys|*>kZ%xUeGXHx3HQn}VdQXqAmdg00x5p{NuB%O*-V)@D2&{kpG zUYm93!W%%FV$rX2DU!4eH&%ZoN^FkC67Rp1gze`}*l$EMYRf$@IOAj#u>@B6o-07y zB^HRNYbKMz$)vAjGCCap>fC~2q-=UwvGPH9!Ckr7vuKr)MKz#=)i5KK`*Y!&Ww;Y$ zL&DiG@I)u(gw4@bSPKAH8>rnw40H@A0ZsK;j$uW?b7czPx{MjSlfr;1L|{39S?)1qzX^?EbKq;#$mOr)Q4XV;I9{|Dq}m2rzDFuSjWy# zF3L6TVXJw8jeP(?@rahwxX_hz@LTav($5{?X^k=R{}*IITLZAJbE-!uvJa0S2Rx~6 z)8UjAF)Bljrm!tmmhPT&Lnyt`@xVSwq5h9xH1-a~z{Tl4}g)P1;oeTCXvZgzERB z?xOIaAERQe^V#iW^@n7b6$9&U9bX)5+v3B}m15MG1O2@cXZ-I1z1*5MhJ1H_!=V#>{TNy@&zkK zp7?I^?vy<-*tUPFA*=X$G+jkmfk6t(#tRAA2_#cHz5nJ~sSnTs84&|$OoQZq=vlZn zjEy)bF04iKA^}cCw({qoNf-87GsFZ|w)DYHi*zd!yx258C5`gw@ZM~CPf4Z(O0mpd zB$jaq9b2qP_ROpelz_o8-eq4lxA|nj*K^vS*>Ajg)>HnI&PSZ$FVwCzijKmIxUGdS zW!6olJ|Ji(=RXqkLt`Edr)YT)#s)%`4Wy_#YXEbkfY~iuSxi=9V58dL0L%@LL2EFzhjmiVF_5>?5ey#r52^6&#p+Z3+f5kZ^p9B#wqIp4XbYm6%w{!f0^ zG+~wg$&Y5oYQby2C-}HH0ZGZ1leEB?BPulN-M2R{bCLCjT-+MI!sQ36=$D3tVnz0% z!`be^2l6XNg=Aw{@y7*VTOJr@rU*;vjQO_qA7DT#oUJI`*NM6KM&|=TcorK_8D1E^ zn<#BKm^RSIOmLr24{4(@#2F4W=b|8fQPD+X%|&v|pta|YsN4fFH=%=1bePwG+Aw?7 zzZSf-5UmGA!77#Ie2DYjd6i=QNpGtbFgN)~<<|4dZp##s)T_^?sT?}Lp_pVy55Fx@ z+PO5h!|^V7MH%Q9s<@tsUr4eForgYg0$#pg4dEp5%y{+GP}O-~pBIl!x(sa*ZP2P1iV z@F8#FFAwxRTS7XDpM1D_N@A-Rk4u*FV?LDWg(+8V5T~}9^uQ-00Mu!WBm&2I0!Bb_ zy1;@;y<-Lg?$eGxQCXZ+9E?%^DqN^0;2GrNmEAdyzJzTP z=LooC_x%j1q!AEapbqSx8#(GJNa4uA9egx$65Xj2vVF5kA~)k)BX6 zmEjy2xhmuAZ~w4nIa$UlQwd&Mg0vnEvN1%U*{1j-RXwIS8F^pi{X_=!)3nF)xAx4g zi}Cu}t?*!3k)SmMCAZNU{guO8UZAWI$sK~JagOwt=OgMs0u79cH=0aki!Tg$5GFv% z>(SghGd9f>rQ>ZM97dV!KnVuy1c;{LlZ6eJSjLgpf+7tK5KT#$Wf{M{z8+YK%fbZ%ArpMn1IlByA$ zYFWv$!&Blf1(r;f^Bo=ml<~>*RP3_Kockag&)})RCe<_0eQ;xL?Ct^W;B6C(wND7x znlg_zS;&LW|H(@@dbW72UYU+FFF-;hq8DgCI5~RL;MkG!y2Z5R(Vt0mH11yR9g&37 zTRe!u*{@c8NsO@ne~Y2yMAfr``4t@j%oCeAef+c;s`trpg(G$1J<8%w_7=-pcDUt) z_F;oLKncjM(!K^>a)puZOOuaCgb4tgSdy1k*Q}}crccwhY%kAKI7(l%ItI;f;wV{r z4M_LRR7QG(N=k}eQ-DBgjpVUig!dXSS7Dfi7Y0AXNRAqx+Rn{7r=$WUn+Em^2`irH zxwHLxRU0L~gP^c|lrvO$qSAF^qfq+noew=0?f^17Yc3lgbcUDrFzKq!)QOm0NeJ#w zyW}{z%ts*5fo0)uRqx2C+oEk|AB3sj%rf$mPXgiJW{;OPzgoD z3;jflkzTRw+Xe#E)?*#AnGnkXOJ_xcEpb10|D>bia};+W3-?dvvn|gG$N;BRz_mON z>AB1iI}@9@u2w>M0<6<)K}#OpEb(!hH(OsLt$FJE_TtAP8b#)Kta%z}9QLxmlc*%x z;(J{E>*OJOpe_|Mp~LRPLC7X0VOP^itfs4Tfti2c{fPAMm35qFDX^xQd(|KQJDU%k z6D;Yr3|WwcjxTk`N1(q2;@=fJej#;)Vsi9Bjq!k4TM9CSFYIn|z0u<;TofxK^3%zt z7n>4Tl1B^QX}6WnQ;C@rZ)GME11vW#_^pnJt^2l8!lD#Cga)HF`?^ADB^S?|* z3L4B#o-SypG}&$LYFXMo^m>N!l!ypI9tFE|w)6gUHn`pG2q?(hCK7`oc=>%u7LqyH z?!KZ%tt?aU(4gPlEJ{;+>;N`qJW5oCsE3hS>_FpC{8pf1=A@OX&%O-ci4iq{7rRH- zt;KT0fw_;HE{VE(HTr>P+S@s_dvI;Ii%-fx3M*sS%EH+f8lc%fh22IG{~vg0%uR6V zS>*3$BqjKO%>V9W_aGZ4a=??$a}inKf-2!j@BQ)h0OWb4BP1d$x`)KvXA$;I>N+(H zU3)}=2_>QOrlaF=2nuGeAP^qx0jU#evm>K@IO%Xb7xh12hN1;YG}IRupH$7Zs(@4`1H*bgC10LRM)Y>QY`^-t zZ7M!^2gMG`qm3-LdCHzJgOWgHfsq$poGEaITg#L5$wUWi15H%HIY9M9WEKfj5TWS2 znR$Knp+QMLFyR9_Q}G;%dP8W=56Xv+q$gp#8|mHbJ8x**x(biUQ*(r#=GQcU^q1@Gpk34@#dS z<;J9fUvu5qtJq<8^a-9E5gvjIafAXeZu{;`_N6Qk&JQ}?|2D1w8tglkQa9=sJw#BY zEU3>nH?(p(Eq7jdcl%KhAzj$-Bcub-GG_xBa42CBenLmXFKl3;)&k=b^gsZOZFT;I z(|nJBS|RS+CPo(hgZ6X~mnJrXe(Br9TZ}s7{$D|?#w&R89Ay@-3ti3M=Y&A?1%9u zJV(*$y&Imhc!jyA{W?hDw7CNSFu(&fWfS7eIYDQchsYr5%sWbLgWm{aA`E8RstZaX ztaw_hUvB-4r+meODGF_FJvbk)xTC-ll-xj!Wr7G`UK6H8n@X*srQi@e+VU0lGKTb= z=P5R09y6R=6Ou*=xI9i|g7qzTxUuLw8BD&qoLy%|m!nulb_#OntE=#FRCmkIG5#q<=^Ak z^v>hN?wTwCOnh?=nCX7Na*^Q?_bzEc8E4h-=*0Z*BAjOU4ju5Edm)bwmF7YM*fhyA z?0yV5dv6?)9V(yxsby=jS^%ed%$afcv8~vCiT}Pxgyx|J7Iw2`<=CXi@S3|{wQIX_ zj|8A}CU-nMEOO+GMv)7aM`h?>dx^89la$F)ys4L?Qj;0I+k6q!vDljBUXl9l-d|@? z7C^)Y3Z=xMXW3*YYI~mHzL2y$C3;mZy7?fTu;JPWN!}Q||?%&7Mls5|7R2b3gPkI#T0-D=o2hF)>0r4NGo8H(iZb1#El4koq{6?@n zdbU(fRt|jo0)+djBXwa8i9*mq2?~vTaO>93hgw2zC5eaOOI0hsC2q?*!M)*w;0!E& zfSQ@~XbahoW46-i5ddaK8m`#2Qhz()!w+)c8Pt#l1e0vY32>}=h zC80%({u8{~N6F1}k%S-jdNT16@07$>ubPuBd7exAQ(U3ySy_im|9tm6_OD*6g81`dQTbMjYVi$ zKBA?eGc+^P1AdXZubWc7xrSZg)P5R^F`;{VT{89AE!!UiFKquV5Tu~b9;=%YCgWFv zdwNh!KRKrLNNAO1k#hL;F>Fi)+%Y|d9|lre6=I?o%=ZP!B8%%nEfnUS zuCV!c-K_DtFyD%vXuupAdijB7!M@@7D>Xp%E*p5=^`i)@6+nR;mwu0Cl4=L;3n1SB zS>0Z1`3p*E^Ylv^STPZxw+G8cschyi!p*}%0(3?sSP^kaS1;QD_Q`<8E~nMGnG*ZS zUQ8-ShMabsPI0rFJDTM+uv+C$24h$A6O6+%OkS>U>Hb`Bn*~*`OH(&40ECN4A#8j<(!$im8?kp^L z^`$$P);?3oI4U?*79jcVx$Iwvr%_xtV#$W+e7V!cb9Y#%917prLbgGKM`(Kh=GqSai4S+ z;yl&w@)S#&&-yYE)2mra=TKrN$3BI8R3^L&Kqwg$^v#IbjQ}dnScs#H63@^rLI!&iB8BHrZzu5SlDJJBZQcVEI^Xmrf^6ZVIS ziXYdGi^?ru9L$x1f+>PKJTml;A82o}t2qU>L_O02(urMY6|QfT_)4^Ltx8DwSyMhs zvT!blM00_Flt0ho!~9zld&to--jjoKTGx}jE^ldpq4#_MJp%+0#SgT5g->0FWOD1| zGSf;)AS*D9F=}F9uiv;MS-qqVa0)}}Ag~*#>vX3atj;P;C7pkz}ZkzXP?0dk zw{AYDYh&xA^f^6g>kOZX_QCpqk+AdNyqI||;fR_t$}Zr~j~_hCTSpqYz*Mtr>@PA} zyy<`JKo%Z*3n^V&KxJF%8$gT-%qeNp-yzA(A($ zC9Ab+K*$rws_`3y76hQb#TUIS#tT&0Rib!70apKU zRAg?Oy+`i?eOeyhmznBKa~;7RQx&Rm+iM9zZ*j*_s(OIoY)eF{orDGjfP4R^QuUdw z`5UaZF|hen(FF!aqUPvM*>I;_bFn!dA_lHI-P{UT_TBnZfi_@AS)~=L**!uGz2b6u zTl;_?_$>{C*9Ex~7{-)H(xCV$)q9sg<&9b3WNnyap6 z9v=NV7rvejLzTQ@;(U0;d!Of2k0|Z04s}u;=rO=+Z(W00@cw28Po#7M4<ij+UGM#0w=^kp8NmK`A>i7}YrdzNKu#>scA613mG;gcQ zqg@^vHza_;UkOz45h1q)17?+sUfD?+|1EtA|L|d+`3#@BLP=RH39t_S!`iClqUcxYFZ`L7gt@UZIK)Bx^frn18a7`7EFON+p=zZ}-%wsG?MfPfws zwbxselfC3~6o4iS{+Q09mclDN4_0SLaC=Y=R(mnEO$Lf|-#oB$wdVjd@Jg7qit)s~ z?Vw?}K9`NW3>SF2%<;K*pMrOM!OcbA97ti4?ta}3!##U>ndc&Rf1DIscmYIc*5`sd z#;|j?g2`76^pmr!IKAn=~PKkWv+T(EUT7MFbd5K$;YnkuhUl^#y8!*))7GD`D}a8{fGa{DdIlP@%T zB_qN&-D12%8EBSM1NJuo3#Ts+)c|R_M50(5x<>Zh6Wro6!CvG2E*~GL>yW>@d=7&v zo+SOrD5KB9O~st2xAEjKk`Ukg?Q%ag(;f|)T{J`lzu=)|ef;Svdu))VAlaSZjG*XQ zn+nPk(Rk=9e?B#N7QJ$}oCxT&d%|pGE|9(by#Vo#4q-@=ko72BPnjFOP`I3As!+ef=mKw=W`-n|l9CkbV5dtq$^%oH7_j-PTW62bllK~-TI zU%auUk{7-$;3|(U^M*RK<0@S^Bpn~(QVzrqL+gYglFGOVN}z|Oy;QeDgMvE-uCfPm z6bH1c(V^scoWq>(*F|cb$x+d=luQNA93Ty1_G=j}U`E}&B$K{dIpEg?X^sf8cEz7Q z?BMd$<^jbOX-Fc$hVAMjr^)l``W-j6^)X$xjR_fSnz|xJqJYj_xXApHezJVP zG2M31&idRt-|hT6Zl@hg*4G}qRs@322u^R_j8--^O>@D?UxBpnCLXXeX^gXzi=Zdj ztb@PbAmg~ocwjqhuhrh^L@*$|KAM3cz&ATj+NtKrCC~4Zt%w8f1uXV|!T)I$>sbzD zHP?eFf?nIMa7AsZ+TH_9u|_~QmAq8wc>m7td1(lGA8(c93P+*_Tfj7MxPdm?yt2$= zR1OXU-p+?O{{yp=s)Lc0$Pbo}XbQ6SX>mow&DpS!h@oqx$d%$R{6Q5R_fE(AqQmbd zCLWMZgWQ+f^UT7IDSzfa$_YP4T#m_jq9#?q-QmPb0IkDsy6jf@pE^K&8z}YuxK=p&&X%lV88*E393j%G+;O0{ zAAJDeeq{84Qs+vI-(qdVF9#LFvZK}=rtxB2UgcW=gJoqrC`E#{TJR0i?}kXWNR0=v zBLozv2W0V2-%dJNsl7csh-1>5tTksTa?4+-egK}sRbmZ}6k}P@pQ4aw%)ld}tcDb| zpYs-d;c5iJbGQdg6{Zxh8R5j%t-5@qjVGMLy&xF0L9HH=VvB193oo(&n#}aS)IT&> zUuqm`8EZQPtMRDz1(z{UNIZsN;>hUba*L2`*oZ8PaQo!wsWXx|Z4ILXnq<$1w@RdQ zjX{DQzZ%~t_s&i_?MaUh_J{c`R{7}xI&#*gq;-cj?Qaj<%s0l)**3>Zl1{dNB%SVT z>JxACKIN8t7D5}AvZ6we*l6r+++v*p>I|SLaBaBkF!PHS_33qXR)~nE{LpJK zkny)CIFH=m5&mgdoF1VQ4VB7O%&oXJs3zU$mHMslDATc7-Ok_9pXKZ6CQFMMdHW?d zibI8a_P@5?QlhPynLzG|80b|_?N&nZrb-#X&savb|Ah*N+mFO7#%At7*EvJ}D}u!e zV2`H9J`2P@3Nc_H719L_C)Bf%4qr&=9~Gj)vy{J|vt&b!AMR)k4*nzY;6I+tazc=2 z9s(MN8d3KfoI_S37+TD3`hM`@(E6B79PE1CZcqRk6BQ8o-S%@o*9H?9Xyar@-49=% z$)joaV7pu4-SO)cU;!WJ3xmWw8aUbKTkgt{hnChl4FRkl%ZrjGi`HeW@>Vpg2d(%q z76chmmj-t`;j&9x4=IY;*)G0?Fr+B^t&~!e!lKbHPG1l8+;0dBUvDzZ-Hwe!W0bO? z?4eiRbHVDN1dyk2zoa&N=L2dUEiHt0uWI2h@}itPt{^`?U3<{Oi7C}2kN)x;I##b< z!c}1y7czkYnJ{4~`ZFF_hvK>eICpGJV_7Zgzi*9ocO++SI81vNFG6ic7ea$(qvCgr zGrOn|quIVj92T|NKR5apJDE*SwmwgBr{(C9+y7AfDdx|Crdzidw^&cYIZ$yCU~4dc#Vf*?OZ zE+}frLJu4BNH2w3*sr2F%~kd~H~X3Z{6<=X`SN^65#NeVu47~_@CW$|zj!j3ekH(u zIx!Dk=9Ip2_pYIU#v~@1yd6Fod2bZjy^RlO{&-Z>;%eQo^Hagmudj$?Fci8}a_$>1zOZ5-6p(peX6 zw`ix+mow^|E3|b*#OHX(=|toM?D#wk#)DHvtiLRowR6M!lx*e&z4frdn_nxm!!y2y zFTf#%7Of|;D@!@54V*sPyR??6Cdfoav}S~I7`nWEcALPR@$Caz)eks-oB>*)M5Xm#T?PfTmmRHSsu-M_dS|6B?ltBN+eukMIwB837H4_O;N6-8=k z4F#q*1RxrXrHCpxVzl@RodRga&W|2=1*8L=<@x~6AWeju&`zZCwV?&kU63!%1~n|+ zPPeL<_8zaZTae&)mc7E^w<1+?OX_)HWw)Zg1awEjP4(2@8bE*x1%Y1vS045Gb^K|ZIjK=N)u z2mlc8uo_ldx6_iby?_)Zd&={e0L*g6I5W1$myyF?jjSlGm1Pk903#ap)j<|sZjAJ7 znnI>i)G7SMn-n*RM0r#eI{lY4IXFz6ZZ)fUo_B`}>4Amj!DoPgkYffuQ7n<)=Mu_q zzk>B|*nvU?@dc(@76if6vzW#>u66a{474<9CgX9|J(_k^fw@P23}En9pz0qs#2HeT z0XYV0qYugop&;<8ryAUxAZH!>a)So>n6ge2q@j-Yjs}TW9Km7;u(SMmts;59>LnC} zj=f)?``FzC`NYNMN5Ff4Jz;e`_O0VaZbbzp@UM_dJg2Vn31lhZmWN^@fhn(gf0N5*mZiINgJlgxn{4NEY-Sn2I-Lb< zcT=J#&R$|G2)N{;Hq~sHaCI6NP(yMX5>@_2kP4Y1{T(^zfh+$Z=rV?}FF189A+pk` zy+Av<6&<_m`ZvUI{#_&5iwh7VR90fQy3BobtF57RaV7a=3WC$FZO;YjDZ{~a;zxil z{yL9Jtg8A>Z@O#yMlW+1xXwrm_*8{70NZc_Ct)mHAer!V^_4rxv_soGRRnD4VE9*IxarMQZ_QKB6=-^R_lU*JM+Tvi46`*KX@q^`xLFuhA%LuXh9n?Tv^am!` zhhrK!125MN5*tN!nN4XH{-k(L_#91GDMqR$`@hNHOP9n#-vx67O8RXKKdS*Vu1NY{Y_a|Kjja1pmGbU!eLNlatdYf2YHnt?tsNmgt9<7kyu#nNV)LYIGQTiy zKSM?rcrJbZEzSR@S^|MOMAgMSHDG9ahuAA4m5k30{Qx|4$KKQpW6WPc>fU2f31F{q z6OC{4h4Y5?q{u2PZX@wATTvc_$VLXQyjeB8m5V=i!A_q1)6Eah1U$5NNnl8 zvy>{Tr)Lo&KR|F?0@^_cyb3l~ivQde@9;h@yoY%Io#jox$%PCr7^>>;*OrwMxNSFl z3SO`XOs(IQ+i|uQmFlQ`i=2fV`?pU1@*`A%3)=ELcGLKsZxg8CJllK9q3it%1YVh$ z`QgS!0j%Cdki>|01nRhRQw7B@;jfCqpai}VV`g7wrT8G|7%WN}^pKt%2%m-4z4#MT z`E)C?{7u0YKLC|;@Jz(-zS{_E6ex?_UHmoair02(@@%qhABNV`)t>brR#_*J0)2eH^8p-`4LATPStNu>cr-`%YSzBc-R7+x5kChb<5qq%7Mc(M$I(7W zPE>e?ch@pEP=<;KFapS~vD)f@wrks`JiC-FQ5Xe)OGzYWqY_kJ`5qF}pw}r&&a3x6 zC*n&>)31iqsv7@i$<-8a*>TQEph=O|mPp<}*Yjzg*)$r?hgY}zMz^-MQ9Qfq_8T5f@ ziJ=M(Ju-}w|E1H$J7Vypd~Zt|H#;QVXEP@Ex72Ea_+VgoAh?i%{Pj1&t0(-(&ZKmr zqHrZ(JscKuSjs|CR5P0S0wR|bSaDqi>^kMCNmYQh-ay}nz;lYrKbRa#_ zgJ<_wnUgRZHAt#sHkUQRZH6mrk_hD~7SLbS8+&p}Aa@-%p*{D2oEMyIZqTp(x61T( z4ZGxcwKn+HI)59a4vG0sh~w_hd5?xhEU+pqd{FLU{g?k5u@|>fE!ZGb2{1_keOfLN zw9SB9h>$sc{0u3>Lo+Tq=^Y{>e(`F0>Uj(!m+Z=&CuoT&IO~OHZHZG+()gbet84uW zq6Ncc<$*qZV^wYPrVEmXCN_cZ%b~$-8O@DsY$C5KsuYjj%nxi!iao-cVUiF7XZ3<; zgoD`ub_%iUN3{m0$j={x)yQ6pg5#h{fI(o)%{giP?dT%=e2CKEgcu0UwEC?105Nk9 zm>~mRQ8`Ef6D`<;`UR}jI)a*rftD&L-*#~nN&{f;0}2M9bV8&L%potTI3i&bdJF+k z5F3)1AaPuJvdr{j!_K%eS%UxEuXhQ2*CLZhIg#7ssWmZE26zU6t#gO3V3v$`2mF1D zI|Fy>E)zHNe&;^4VD=-Lv3*7Z2^u3#yhAR4nv?>_ndLW>{QT^)>jw2t5@Al;^{Ot> z-@MV#)Q$W|4E~Ozj1>=c&d#iI4<1)xg{!no^jlZjiU}!Hps$rWUs4d3DnIVON&c5J z7gFi@@af-EPe;gVNsvEb4BA07bVf}l^Na{>h6h1AViD9J!Y>ra23#Q${TSdXd)<_f z#W>@n1=47iQO6rSw}HWfyD+f(=2*Vb&*00|xIWaNgKgu{I)hX?lX0euI@_XJ4|`vAtZ z^cmFWS#a&wgQJ!6NP1kAKQ4MZ4-5TPKBcaA0rmeQ}krUbzUVBpq>P zDonp6W!O%|X$;tL6mLT(cIoh>qW&JcKo)kCT0Am!@FxU4f<;tEVX!&5=hzmSAiUf8 zrf!*4ywxO#gX=awK4xiQ^$5w494TDqBZF3B(j1tC0Xl{T`;x!*BgEs?4?ojqCV#6w z4BKgni}MhlxRVg6D2`xIQ;^^r6`4t|(o{yj7Ez$=ll<9f#q-(Myy*#iV8zRE$k zmg1Yd!!LD-q-8X0Gg|MSKp&J=Ma3yUePZzZ{*T0Mp%$tLH}mHcdGRz$^ubw&D;8Qw zho6fOeQf0!mFJC>t+A;|uMBzyL}UjZ%el0}AG#@95nP1`>XWUps`U6^$;OMxW10D3 zB$i(vE`y?KNmmmWi~9{49~YqwNOrm?#hs2tqv zaVt}Rbyb1k5&H9y6ZkO@ZVtKH2vh@h8MXs(_~5Sx^bYAGHh?}AK>3tJ#tF`Vr`f~S zr%4c2d}3cYE6?>H+A|P9RupDX-iJ5h#ch+*`~J(WuZ-`$DF|hvXpAiKcZH_`6)YVY z!1Io1V2%&uF4}PTcWC0@sI_AM#}C$nE}A~VZ?+1Ge!Ug3doVVtfkwBT&NN13g6fh2 z?)zD|!oR64v!V&_*Jxz%5)0h&RD7aRP7e zur(0&`}K&ksFXZh{34`)HJsbiu)pA9E)Xx~*)jr6rh^I$Ln-V(9SJ{PH3TCy0Q!jE z&ne^kAIZsOYGYzG`EMDF`$Espi-Zk#sbXeHMT1QOdVkQ-zZAI>P;p<>%GrrkFy$#s zi(K{5e7>*Y3g^)EYAR2fUJv80w8y_#%ly#1^Kc1#wYH)ubKtl$^K8G=<$YLR^t|6u zwsLT4Sa^YBUSSt)jbCS1X7DJPUWPoU@6-W%ZPIc$&EMD<-25LELp=6PM)rw|@1{M3 zAs-`LkhmCA55Y>^VT+l+V4LUyqg5{I_Ckyu7zJ|=kxsl8fAz?+47=E1c~aj z@d%$3S_Z#`Qx4_>^^`pU!oSqr$XH9$Sn>z@lqA$r=Dj!pc~WFbC-hAyA$j6Z*ZRfQ z@Y{O^IyRlEHSj9%$$?7)Dx~(&Q8f*2FsA3n**}S6<|{vwDS^dbt@2Vh;dJ8!#Of8^ z2&-EPxzw?F+?huVyj^M+LC^olRX? z-fZNR;AIG#con^KmFuLIDt~hi@DiaRGL*>bX+oq95yPc_)y|cN zf9L%S%;hBW^<+C|@NYCFY*bN`zmESD`jajI-rdmft{P&b$+q>#h^UoZ9;$i^;H zJY?2fpn#D4a7d$JdYKBC;`j8dHE+L%j$knX*Xd4h7Fakf;v)-(7rSnqys>HO?0wkV z`(ZAW1*x4!SyP@|H`eH7$kiHfLRCkP6ixhR$GH?ObW_!$6T-ZRy5cNQZcZPU8<0x( z>5NKjIuEv?q`>P=zXds1O!2#HP;V-FJZAo@ttn*ZR`5KsxC2*E>%tDar_V+#w&RWxFz@=H z+=435#9q3P-JzP^NP4>6yL0oT71n&H_OXrEIl$$?#!SFO<>&C-UEfhLuKwF{{Qw^* zJopf%h)}r<3;MY>FSC z5o$Mg-u1zD@pQ}-Cn!W%J(#hjljlC8#=rP(2By$U9EN%g)9@Kh5(E7IOULgv%H~~! zaLaGOagzBSZBUG2Gv8-;x6xB}^MTVu+rIniX>uQo@|RoRgX<<-J{Or{AF8B`xga;x$SzNNsy43bWl6V zh}`(ou@yyh^}mgCIb0u4vGcdd_RgDjI<84JCjHBag{fy}OS8`odRCroDyFhBjO;AN2e$3`1EVWVBhk{~9uwA0IELSkL!8!ha9pn> z)o+_upE?JBdm0>U4i%1jq|C-#_3_|)g5S1<9E-=!?_K1C^2TEw1Fwvu}wKRv$uhFEU%kDn}mgZr@wwk6MoK{gt&X#08Cs8%K%WF-0BcU8Hb4 zKGe}QW0Tut28sQLIZb8+c@5t7rGgp$IebeQ=b%hcIxWHlbQR(i$c8~u>Z}%5*s?k- z3SpyDyZMtJQyNG?VJTPOew~OP3f&puUnKKkZVU3^^*s*v4M?`hpRcyEfZ$UrP<^0* zR_q08QCC^0rilB7e6oag$Be2@Qn!s%Pgu7wS;Bw|M#h4>6}f}#zq}dMti*Z*C9b4z z;cWStuZ*vxMQ(`eGVu_pj`m;X8f(`Tsek6Mh-x+Nf5GY%de-O^-(!k%p6+2>Fq_hN zLz-uE4@v%71GFj!dd61*9RqI@OLu>!VVb$pGFPL1O_v;2?f&gT`GZG#RNqs_g_&kNELh!AotWcnxXPXJ+D5L1NF!~xitFdZm(g&06lxY&JrBsvgFT%nZ4uCaH4$b1V!VX@ z!YUf;e1Y+7KDslPz*1&l+qY+Ps`x!fFeRJAJz#609HN;Vn4hqCE3Etfwur~tF-F%8v+!n!FRfICI+3A zOh93;+TsBr-G-!+CPL(RdIUK&@~;R5pgM1_2E_Mcl!;o6k^x+^G#x289I{{i*Y7Sz z^Q@QrfwP_phwzfQ4wFO`e?$8ltC6$G9XsPe_`=gwPvRAiR;I7`4@FTLmlwE(*I9MO zfaG8M4iXCFPaHN=eLngWOpzkz>i>=N|DV4uqT=Xk{Mi8KjM$pLYk?Xy?x3{@_3(P$y6S( z`pi-{jZ3S-{1-OM0ZO~(HODeT81u@AE&@jc=;}}4el^c(%f9)aVYz$}dxpMCi)O@? z5~D8BP&xf&`s7G&IUj0yuJxI{buu=|#M~F})3=f+G797p{trx57PbPZh_qk%r>_HQ zv>7#ya#EEac{hkRRBHrq-E-?mjJT5}yEVSQdgN_fNGNAq_>L{EC|2L2{H*FlZCX+^TR~F@o^ZQScp33V?R3aUxL?%j1<)3!2O8+|JrXRZEj*L-vNAOL=*CGFb#YK3Km;71lN7TaWLOu@YOGH^(Vv;d>m&A zZN1&F=;pnZ%MZU?aSwjb9v47%^(T_+Y41Q<=+rARyxWV(a^W;s8aeA92)iJ!`K7l{ zV$1kX(S!1#f?rR$0p$ys=a`0pr>AVDV2Ab}eeopo$Mkk4tQMF?X9%`f*Rn%agCEK+ z1*P%@bvnQrYmXtXF52w}pM2J(A=C676k`O%u&)T=Cz3dVfh~DtF+RM_K!>r|) zU{Wbs02@sR%Re$we#S}8qZlj9{qwAUL`%-ahE`)5_ku9$>`0`&AEq0$LRq=u@CNJ9 zk1<F6n)X=uym*sORyyDRXlYc2$6h&1C1L0=jDU}0 zhkav%e*3ZBLJA%6G4XML`+jZIrsByUmcsJgWmJlsdi1A`X!;C-_tV~ zEnFj7eQ8{1C|w3mp~*JVolZEE!Bbvjh<9YaSGsx^KH#*6M^Q5P=a;C?`JaAn(+gM61B}4bbYKJYekIlja2J0!1eeX47DYk z+p33ZT*0`Td>K`1GQ|tRdNZbUmwic6w#S;*vYCJov(K@D>CX|wM0FW=-}OPaY0DZV zSj!ZxFSI{RmL?7wR+IjI1FjWFwx9YYgt7Cym#DAjmy=2IKb%*O9pE=H2(-9il=e!b z8e(K&ya|bDJh8XC^W*^)v+Uos{0+j{dKixlA1?;#S~~nIfKkZ5Iw&W(9knt7?4+TL zI8#X)&1$mrkP-?CAH`q~(4iO|2%ekP|E7~IGlKN_+Q(1esi`TSOa&yr4JD=U&1cvc zdaE06^^58`DwPxYOCUb#xW&!&=d{-u$D7Rt(Sndwk5Ots zJw6N$d^X|+UcSHEfWSF#hU=PKvU6T||suB~)sw%73o_sC|Il?$E zu(1p!r5PLTczIWDuHg{X$?l@Gw|yA9W8B?dmyM10PXXfdyTTRNpz+!D=#$=abaqQ5 ztA+J5Lr|w9tYnU|E`{!;Kp~zguRMFtD`Q*Ru2O(3)w{qFN>K@ji-z*G5adV7FHbwR z!8v48^es=D5>U}sIqGlsvgSlUA`4T3@>#l;s54mig{1OK=ep8ch6@5=^wmgcF! zT#I5ZUYZk`dRxY+mmBzxWsOk3VF;Ix1Snl{jpGHtQUPa$kRD0RtM8M6_Z)O2)AZ@><2cc> zz083hzXVc%re~nl)B+JUrXahHZM#y0z4mTE-PaYf3w>6|yy9~6oIVn(Y}~Vw;CbKB z!c1X948AY7mou(75nCas?7i}F$}j(PmJ{g5&h9(}y)bQ=2ocYqJ3?%HRdnjZsLc<* z_!57YNA0rqM}P}dK4(V>7^2JoWj2z0s;X^hA@0()#a-I(eaqk+1?7_qQR)i+<5tHq zKSY0>@_!-0@%7+V35pKs*;8*E+M}Plfj35Ie0`C_waulTbkd1p2RMzyb*-!aGST9F zH`X9sZF<)Zc#{}Kg$ge7P9d%6f@n>ci?cel+Feu`bpz$5MN*p+noScOA?WdE(L`t} z;h+_9u-FI`?4WUBzt1y|HFX5D(Ne=S;7dtX9++O1=ZZX67~7=HH%0iE=nGL3$mmq|+=pIOl2grJw$z3E4O zHzD^V(CKV~DvPj_4soz|KRV1d`7%M{PPRBC!SssPx-`6PUlbY=(2uFD7{bg7>lN}g z(-|+-vhkEo$*D3g) zSkX0rDQJh(ldl;GPc*KE?@be@%&~)t9LWms+F896Z7Ko}I~&r5Hj{;DEd{7bzO?de@4LFCo2pA?CT#U_?>?;o|G;wk42!%s|S?I}DdCUO1IXhNX7_)az| z!R))qg#BZ!SK1p`hFJmZ&vRQ!>$&qVJ3!^G9iRPdrm*tkW%HU{ndh6u#=nmu_dSme zYI$z7n^i7Qx1|=>r}S-&BIP|!#F+JE%)Jluzs~yjuAY&>jg8X|pD8wRBprsHBfktH zI=-M1O)%=NrWkE`J5IVUD=YMXA;ON~j~Ms<=R$&gW8fqa&=x?G-S%eaM&vS3hmLn9 zoGk`W@93;pwru`OCjJp<+2l-z@=VWrU8GAkUXrRrfl5e2TamQTAiE(N95F93$BTSPy4N-=K`AxtH9-E*Flm{0q+3y8Ts z{qrnhcKI72`Vs!^Rt6!mo8O?do*tR@EE0k7XU^N-E)AEF2w#tCg2$Hwj5##LE{&NW zlBC(G6K4ze#--TU$S7zsAg!{a0X=h@+pH=D8_;{DcZGM7XYC*%=UJoyDvk;-AJ7b^ z7?9V=VHp&rhcuGK*9HE{N=7;+y14%wj ziiGGZMBn5ruCgI*BQ*&uO1pg;JH_!S{P%^^YXD8chbm0gZ#EGXdOlm&u(fkpZS>0+ zH{TmjX66EHa4P8I1l$^Lvai24aj{w~e%C-FHHiqhr8sfapAs>i!1oWHMRILp>DUUt zO&Cv&FC8_B0ONM}rSPE;J7kexF`-A@;x;fAGj(&#ax<*L$O#=WRqmRnUP}qwn#P9-If!Q72^*o@codWG5Um1vc5}9R zwqZ^K_H=OOeC9+NEK5x6S_GustWgMAoijQnx}rOAejCtwvVzlymMUJ%x*ojjexH>8 zswt%^h$F~VJ8&t-6nS$h_F6zoDC#%Qj|yAaYj z14W0O+>4Qsmaf{ID$O{b@Te+Ml-ib%Ne8aBitFtIx0zh5m6wh7ny+v^x``wa_lUl4 zn5J7BX|CL`=e-P6*8-CXBm+^e(ZbeGCT24(^Z0isW6xCIpwuD?iuSQpAWsC#JT|l7 z#kd;VZx-8=JnXJ3EF%g(HK ze}q5mq1bVy1YVMum^(d)&~p_lzMdm-AAc$~7v!V;xuf(=8r3>iY25c9Uf&7>g4Rb9 z6xk`q<)Zc5i$|sNs&iF_R}NH28T=%`W``Zr`c(-mX109T!WWUhVyYLS#W+wvH}YT( zQ&c!g2}TBka;xzeg^}fYmlFu8q_F@x^^T^K6){kjhdR(c@BL&f{?#lL?W;k711WK$ zyV1e{w+U78!cs1{FmyFVyr)b7^F{dVUCY|Gmu-hR&cNw7oj#tqCc-(BX>4a)RqC-T zB((CF)D~R#^}E{>Scy6Bgt_%Ek*ja998z4ri|2YJxg{6rB$(7;2?f_GC3FFFEVe z&6T<(yQHTs-O|-p*4TYTiwtaN0nVi1TcHaR4+QPY_bFM59$%N}t~Z8YM$Pxwe4FsN zKg)quYSrih`WBXKe9&EqjG0I&egOV2#@}1HxQ?taF(zAX^Zdf9nJ@LpZ4GO-c<S>2|`WBu3!~B;0;3xLxf+fZ~2Ds0| zQWE)<^I&hL?KC~?Q^w0sZ&BNeZ~m7im<|mf(y3OISxW9deq!c6{Qqqh&Uz+@1%2n% z8^u%0p#rX)xj72wuh_hDZ>{bU&l68!&yYVz zS)eDgCM9qF=>WH+pnUWXREkjA4EX|!_C|m{^P<+Z)%4BaNjC=`n|ew36I#sY0Ze8W z&68P?xblu=&5v5l#9~T{~*tbwo8);RBwzCoCXiMZKq#R;AYZR$?znx`-%{TsBZ=$yKGq zB6WL~xb?)l$)w4h8Atw$LV<)%snS68q_q1D6Xq$G9>DUw$`yk*sOAC`&3@^d zaODfOOD!Q=)WeAX1hOk<671Nb4F476f7qb8dR8oEUMsj&qfqL%(h<9xfj#A3RU9qO z!2Zcz8n`G2)iI|YAl(pblH7hDIIk98L0-2_Q5K#-)2cz2LXY914=(m*a&5~iokih* z&MOi=|EULHFbEENUO|PVZ`qiv#il)F(nOU(`UmXf%~H-t`)@?luM^F#hKO&4>Jgvv z_LB-$5GyqQW}D9qTG%%4R5uVf>HT*G=4&pTYBLdJ6Fmj<7QZa4z7+atm8Ud&>zkRd zg7WxX;D2bpj-6J(lA2?D&!q!5ua%qWp=ckz&y`PCaBL<+G7LE%5~ZsS&+3x{cVkBL zB(d*EmWftB4>}wYj4en%?-`ztjRb-kr3OVcLh0ZEqscsgJrCXFaGg8jWjibA_~MI} zo_!LK)gniTrWK(;ei2>Vx*I>Fr!v$C(Pq4(za_vAq&&cETO8gT@qy-g4|@rKrp5~U z@;Ry6=F*(-28sEXtD_E70Npnh!u&742LKDQ?@|Y+L`rF>+k55!E)jfB1ip*+Sh0Z2 zI9GMl(W9B)3||>%T8Bh+w2wSAC3%=G^C^D(&qH=5zSsVJ&CSgmcgv?*0xrKV!Wz6#iksRc=yW?qqj|KwIYmWpfcwcd{aIW8FfWfqelDSRxQ=y>SDCaB^9W zv31d-)m2Y3(7r6VtbKxV)k2BAyAa#qtavb7{p|mdbd~{4zVF+=x6v)#A%b*Bhm>@O zbP7r%Ae|c}f|3?|Nl8JZC8S29Al=;^qigZ(_kZ5(?Y8T_?(2-}IFHX`)w~6L2kKuE zO#ZkRmr1v{u0}ZDe78{fEQAuEE_HftO+!3(lLDVNJXEmpM7}%ehIf(ImUy<8|1lDH zXr3ms>adxdN{=U;YL>~lyn>>#cS{G={1Y%#{j{Sf6Wtau$8r`#)T~3rJUhfl`6p9maEx; z@s^ATM$iXbklc7}l7mOb=e6f#n)S6Xv-DKVUsDH;`lb$h(=fuXR0(^bGxBv4r366B zmz5DY0POLd7F?M*5J$8Nc!v2im z7Bp7uGiI9_F3Whn`c@7?1;mSkZVu1#?`H%YVR)`9zn@XB__^LTjeM;o%~Dx@w}Jun#7og0;+I_HMT%&#D~lH zn3Afzo*XBL$Gb|!$Usp};3GCD>lt1_5QZ8seOdNx1flFvbT~ok;a8fb+aJ6XFvcpT z2eL|56pRyb`vQ$}fmac0k(Z>8gRMX>!HFsXm!j?X-NZ`rc|J}T7alhgI}8_I>fjHs zI_kwFW;s3JksY$~&pjbt0TinmQU~nJDiL2PVT4tEW7jJ>#ZXVdZ+*iG9e7Y1Ii>o8 z?0V$q*Ee{pVI{x1j8jhcpjZNO-tF zUqn0g18`i22r`P79#n^W6Be7wcoTovwNM>I>jMqACV2^-YvT{l zz~=Ib$G-m2uyH&c_^d+%z^uG}Vzd_f=>f@V9^25geX&7IPWYm?;;)8=(*;1_fsC99 zf~Vj(6b~7!8;qMRGok0@b;Rmj80*C8&S+SHb>Htap+xv7ZTVY=$p!gc^qlwae4bF0 z+#dZ^wGdtRfOq-xMh&)gU%C~Mq-pf9HQ<)t{aCiS z_asCy8NHTdWMi!Thqp{f3&Vr%u2-V4_{Cvk+Xne$H8m855f1bGas3!oMuX0LzEG4V z){SAM2gGfrQ668#5LGodpxH@CQzIvw00d)$Tg#EP^lXm&#an^LGnt-5YG5^dk?XOs z06|>ghPd#$Sb$9Sno^Qc-@A3D*&`M$(s#Q|Y1auOgRzy?`BLc;`2$7NpPm~;O| zx~rSQKS|lZySS^T6pX3^fL^hD$yhpa;48$)mFpG}HKOfdpe`$h_P0)fsyxOk$`fwqh z9QV&`Q-zC|MyW_?fU2F0WJcH>NLBIYp@QLK!&cWhSGkuXkn!l9^p*#St|TLKi=O3b zh|L|QJnLaC_-D!7o6~*c*24bu0o$WlNo+FRUMhTYV09@gaB0nt)LR{itc~Dm`PXB< z;TnQ8vO8Uw3!APwM~^dpJ6x1+qyTsbcq-$5HjGCv?0w0W{e8zKx0|lfuzz*`gAQG$ zduM_z^`E1&u090pb&7S{lfl+~tW0JWDa1pL@-}glyfjm-31QkAz+1=>zh^#~lx)IU zERM)67057a9X}OkpfIV*yz>eH4N zO&wV7<2qqqm6tcd6d{HKXhSs$6u;Vf zL*9}M>pv;iNyxh|y>_GvCT%nBMXMB#$npr$UsAnnkD}r2J1FYkZd&P2cSEFq_KEBebbr~5(L`%>Ozhbbr(@ufR6N>q` z8ltGxpVD64Z072yx0=9;!&V0aat_N^;V&$y!h`_S@zzrCN#QCNc;3Ij_gLW#R_-bb zb6ZQ?h(00)o03EiDGEb*5|4u;=~yZ~f)4&9zoY(qj9w3&nVs$VacUbf0!+8JN0ME< z(`^zMDe!Zf6voGZ>bhW7V0pzzugSd8T&Xmi~v^Y9Za8J-PsZiZKLt zs)G9jKYU}ddtX}G_{C6FKSl<3btMABRs8Cczeukj4m;L1?eAZH>bxIyF0d=Qocxux zue#<>o0on?Le05R2^*P`&Cqt?T&ml6{vA~tHh9lk12@W%=R*dYlmsAw;(q!_CB zId|4ZSM=4t$i-v>8A@n-s-UlV-4YXsnRm?t1 z2$#x5ME{ym#~biyf8YYvQ?ET};apCL6j=AM-n|WXI9g%YeLPnLu6GC5%YvWpgFWTI zpMFLc3-VQY2^KZ2QweFHQa^xXElSp#)fJ5ZMl6=}J%AlJJv)0t1K@`362UK&J?q!^ zNcn1E9k*g95;J5Gq|F|@|ZvGeMp&fBpT2Q=K69RDwk03hUxpo%hHu?jM1-@ z#WrlQHMYND<7IM&9Fd+^*~oiBgSLDLZDc@8OYhG(-fRUN(6m3jCgPDZGrmhne1aoFb89{G*oZf@K!K^s}u=|d8%lF%718KE} z>3cbM^21DGSRE10dK9x;++qtY@u%EUWEm z=#74S0UjvA@)R42lximAyXX_ULNXzbj0p{?5ZCGl>%4VR;PTdA?uvi;QbskfiBvzP zXin!iS9<#6>96wZq=9=$J5;g`N>X(-&Xt&uVin4;;52vI^wnv%Wsq!qs5+eJU&Z+k zLRf3{=LiFb#f{|kj-pL!JC8#D++!ivd^$;*@!k~AG!o>T_&XH3b`kR-fUD5CB23N| zd%FV?VXh1Sd~mVPeTM|Oz{~~8eF&^rHhs-a8Yn(i*qKl2u>m%#I8cQdq#e(M7PHJ6 zD{t0gaM;PK%)jp(FY>_XcmdUGM{3alf}%)(kL}UR%D^w}LVzeWP7#@d1x{^TVk9qO zgMJFx@8N#qw1zpIWhV+2f?d0b)uakj5ZS>8;CAQ`0!rW#jK&Qn$xvFma$Nt$2%5_< z)*bQsYm_`t4ENd${x-&A&$Vv;4sHA8nkDVd{!>hc#2FoqQYZH4FBXUO%7iZ9 zn)Bc00uHcQ-PAPc)rM&f!Ocd@Q|$Te>^;{I7M!!y?yyXIgsuBH0KYa3K>eT1*GR2_ zyHtLciWUJ_T=#EUhkx&}iHPnm9S{~(Ka~tK#MV>Od99rAeC5%qm4uzPx(FfqWQ6AY zViy1WKY*xRnoUU+e)cB<5Yw37UsMJ=q#ARU)#8glW<&ToS7}%i0R;~?oZ$s>%lbzj zKB&IPuQz+<6(#QQEYs)W99EwHWmr?VJb#IS>q(|9BqIR0fAg%rWG z@ooz?a_x6dbKS;PG*-~Ip6_Y1ib(W}|m>ghm42Aj&Jg#y1?L{0YI_Vkq`YFoO zEjn?eO_s-t4sB@{SB}uFuEAqrg7!Rp73h}V}JOldRQ^e^|Uc^2+ zmJmgRr)&sPNaigqnP?Mw0H`A0f%RhiE4*CLB98`M&YBD=Q}L3TW38zuRCiKuUtIq% z6Cr?8Phn=?ZQ~|9*{^<^8yS8j{|auW_|Wf#>?0z|-i<#RGW>!?ocZePq^sW_7EDQ6 zSQ)9Qy)wP{SFCmMYliYsdP^;}_vXzTiM_~gAb614a-;9bdm}syUGZv_(4{>$2k0vy z!u%n4n|r)ULAx|1{m0&F8f~5@3UWI1PuNH2m~9N|_=e~)7CBRkb$NVc z);NB>@@}g{@juCq!`X-TKN^tDV+akKAU&^nnnLGFd*2f*871bOI*yW$bQSNnM!cmC z=W<()e9kL4*5lTgX7ymivozkU)Fg>G7kK9w_c4c1Ne>>?9_U>Pu2{a8V8-&5-$&>^ zE9g7%Wg{8dTZb?Guo&|e|BdyN{@@Ce!>G ze8e*z!@TmCX>!w0HolG9h$-K>zTj6rBlFB{80NO_`Q4SAmSlQMOERgqR*!cWvs2p5 zRLObS_O<=w$jN~g$~{dHzEXcZF}rg;5&N~!ZT~;!P`TgfWGr6A+m#CYdx{5QIDnt9 z@r2kSB?@bdVQdyyd3lxeL&TxCnQ<+#9?8sz`L^zK;fZ^M60@ww4&mtj*%mX2a z1?qT5_gkONDkOQfAc6P6D;6i2Aj|>Y+{F*@ZHBkf%G0_(8WrRal%{ryk2}vV z{2SxS)f4um5h3$ibsjJ80s8H*z$C-2B}3Jsxf1lwpqvP3*|D(io52fi*^g+R#6-6S z7;xr!tL|g5Q0DZr&|Z?8X{W1m`|W=z*W;H}eWT=NMTRPBVp9!)_c++SB+Vs}RN%C+ zr~=g1`rQO+Te-g9#Wa5h-);Z6Pr5~B5u-2OppTy*Yg93ZR^eI$Z(o_qQ{Q41TF4Ms zIN;O#XdVYkx!+%Y{j5B;3Y>y2+0J00fI(iVI5{Un5hp*^~<( z6HyNx`V039mq56!Dj_1)6yF^jR|x`Nq=b41AL_}2`uTr)NOiGr%E}nov#})X&ic?* zY<~cJS4pRtpFb&0{M?suuCBqO-`>5%Z`Sa>`Q%)MpJ|(d{{ruX-NcX^`7@HMgehVRc`K(P)OM{Dh)@qkbxL~J?Yz%#&(kkDT z+)N$jGX8Q*WJ&^(O=Y0+$|S5qkG$s-9o}#EdUS#l)VG`~(KBEsGutbs(RN~W%^)VA zF!E>m?UYzdBRKry$z2ka!j(26raZ8y(##RdXpRL|qw+W1+14)4r zE38-S%3R;{%3pj11k|xOjM5ZCg`+!RC!|Y2BAQ85eK6qQ7L~6UL5q{e`nPs}yWdvO z`1sCrcS!)oZdGU|%5Ho&J$_bD_e>)WgtNUfCP2f#K9b7Vs2;zvtP}`ZA+9C93k7Mr zSqrcp=HeTgdYvD1jU+>iJ9meTZ2n>WJmqCHLPC@xAh%doq2A3(TZ*7XlFO*T5wa;Ih{%MacR6>Ao;^nwrCEsO6JNC z-vb&(jh&xEW9EO4394VctR{(oiHco!V%n3V>({L+iSsAR9F_l5h)eEYuVjF}c2@_` ztjFzXTySx)EXiV;R4o%*Ca$>97r#4_syF>hFk}3gql<%pn6T8V{+WmWF$aR}AJY;9 z`jZKW(w?@xD96owK;nF%7Ww;SHTXBX%2(}C8tQ4D`AeN2Y<9a}_-OOY<-eve+^#Zy zUdoCz-;(Zu^-1aNWl`)H#Vj|*?PKz#rdHY(q?T{}&QAz&Xz#i$I0%}crqaZ<<7)@i z4>c9%9A+AnTida=BP2Y`-f-4ZsvY{BhIyF@E4SMs^Yyn5Bf-RgbpLbVZa5o1){&;Mw3{;3}WDd4H;?+ zf6xB}*A;Ni1eIuxy>E7#{Mc_M!JEj!LR)%%TiI$LNyH;W7!d^c|N}VrF-mZ9>?Kt|}+I)l|*^Ia_=2U)7rXPql z(0p!q&K{{Q-}_=c+rcMZ`D^g9*qdZ!9Afb6TXE*f`$t1vWOnPpWv}*^Cu_pB?L)7< z^_xoRj;cQGf91OoE4T}jgJNFqq)0Nd(dFNEMhFlnNjgOMaKvt#D&rC3=uiK$;<|g4 zc-8-jyf#8}=Eu}^3Km6`@W(Ksfo46$wEHTro~9U?vgPEtp&G8=cEdHy+AGX$!iDMf zTBaRt<%*+^rdEy+bhklleoo2uE_eNrh#NX1kuY=arpI6B9^Jjty?3h4{FGjvxN(wu z_w^H4Z3H(GHm3K!-tTC2iypc~m8Hl1v~*CQ2MwKGA#OF=exllKOxv4vOM z&X|Vh_zqJ84jvbvSzHD8JJy>iIed1$D&x~nN{gs9p(TrSTH@VmFl)|x&7DF{8vdhG zmmI#a{S5pn+E`!JP&WLH@20TtD;%&W0L`ZB#V!UL9iez}9Hryh*de3xVYFa0-A z%tBaD0?G}0={rAP9G8;Hp~9^spAshk+)Q$^pqqKk{);p}m<1=TydO8uT&BCfR@?DT z+qd^j+$R^wzw2GTeV+3FCm+rC1#F zxkmY-*bDvP{446dAr2nQ6jw*uM;T+HSTsWh5nRD<>U>q8iRUxNh0_TPh+(RT*60te z0cXPWzp=tnK76_H9QRA^L_X#9IZqs2e%>nBZ!F$UqP_C+vOPN-O_`&@_Fo8y?QQs@3etO!+l(0FH=kNQc09Gh{tg+KK=J1wufPL1KT zAOIv&rlp(E@iMpcb; zJYq)}2XY?nARg8ln8vnz71fK6u5uD%1DX)hM7*wnCm zcHDXQN3o|w*k3C|1RsWnp%B0Y?loMweUpRb!PwEc{BdXv>qJQD zKT(kg9cqCf!ndYEQHbXEY@UmI_*sGXog-l=ESB=y(e=2@%@V7ub{-Uy&*r%@5(!OV z3vZjCn|6uur(uA%xNbZ1JCTjhQ4hyEz?D6M>8pqeGy#cRJ%-()VjRCo`oMGyGyD z>oMx?<>JEYdKOHEsF9Q2jduV(W2&W1sL8utQ`B~jBz$}=U<1#hLZ5#R-t(4k1bg`c`@sZw%#b*NYp{e6xWx@?wPgz zwUU%)t9&nlQ)EDFAjMkDaj2 zfT7n8OtHT2ajd`B*$bb=%F%^&{XFztRPn#a^&zff+6k++ZO69}`+9V-@)XCsl~Wos zhyU;7?%x`+NPJ*zqaQSJ1cO@(KDfUha?E9CE z1e_rOjCV(^uGJ+C$rxR8uPQ3CuKoL{edHDn{>|MON5h5h4zRuHkV&p2O0#KXFIyOChM%vTW4=;3go{Zc$~(` zX%RmY*_0BCrQ%s7n zXP46V8}pB(6vSNjD#E}er7rKIL>0ZeXuXU+ic6-^)SnMJXkEzj=_#gR^@GnT4=L3p zo!;;MnWw!Oko#&rxzOtORcqs#ax+ad^19>|NA|o%Vn-XXhF%t7?d*tQfN)I{SvwJb zG}BkS?%7_DnGvcFg}nRUdGsQ#L#v!EB`F4I3-5TrzB*TTp2t~pkjE*FmZ1$q)m{Em zpNGCptnbjuv?s1tv=%%0?}Tt7GC96rBFU$u2KDMHZAB&dg9D4*yr}xd?wS4eYGG!8 z1rd1D6=H$a0_4ykb{~Tf#r9;AywCAfw;De}zCVHHGmW2Sd_8$j`;=t(6P}@CIiQEM zuGxC9^|po;Vy`&Nu7pQ0AwIA=;CAonb`pK^@cmkfeSewyQdZ$9R}hjm5Yvc_M#8VP z-sZRR>7Ne1PV(}MK_K0OyCopUNO9^)E9U&v{S(1$C&M*Ndn*yNEC)kFi3`2^zq+4q z-oESBTJQcx&NUqbz^%s=d$uv(zLnEmNe8UEiL(A14xp{~_eZ8hOcvc6RMU#+o)7)i z$@B{no1^5xW?S3@)y{VCs$~Uu3~Ze7)%^8(IPm89j3j8<-#s+D#2`$kBFWpi@&> z3f7VS6vDVX|M}IjsP$f}9?@C2!=nMtkcz=2%<(zTY^E_@DdRA&!b;MP{~pYxJt^iu zk)%FpKhOKW{l=0mdx`lK>5&!N-N!LkUpda4GOt$n_3rtZPdpa)U5d`hIZJ+bPl;VA z>DqCLHw1pd8u1W|xuZD0k3T?gi9X#b-(l*l6wc?nT zM>yZncz&HabemOz!XB*}L-k2l9iIQ4!t$Q(>t9dsXR|)_l9I3E#)+=gKP@Y>r4#C@ zPPyitM^R07;_N&YC!5C|YHk#h^UlN_<)b5b!cVg(2T*vOZA;HSFzq@2?~TV)^*+=4 z8y=wA(?(izRLhX^WkL?6YjC@-bP8|$BccZ{bY8I#OHcmy$u*OdXHAUCUjj1Kx&X*M z9Tj1RNB4aE9FQ7`B>8av2q*H=C{?c|{A2%nY^KkJ6H@6^wUJ`q2fvCn9#9A{I}1x;nvBa{pyf2;FVpDx_-U91apLM&zyqI!GYaDR*6|I%k|?}yT|TISAciZqIWZKdT@NibGVw+tsl1}GIF5>)O+nomvB$$PM`45EXBpkc&*iBg@7V($ z>OB7TA8x=afdMT|?YGtMcnF9HAszXKqpU5Ay)1@HA6a+ z#eVnfdf{4t{fo@4q*^ab|128tI|u8QKxRqL53ZlC7AF}Us=KBy(ei9(8zHu(MM1Um zY&CRj3x^*_V<3k){f^3qwbj(m_Y_lhFYwRq`$5WK1$CXiI?OhO!nsb`&+Lb5Ja?+< zekc;eu7ooZy}x<|M{hbtEzi_g())AxMJvG<>rgPZVhF`Vo5MU zcWBFv;m`q�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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/org/deke/risk/riskahead/AppController.java b/app/src/main/java/org/deke/risk/riskahead/AppController.java new file mode 100644 index 0000000..d4a00b9 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/AppController.java @@ -0,0 +1,51 @@ +package org.deke.risk.riskahead; + +import android.app.Application; +import android.text.TextUtils; + +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.toolbox.Volley; + +public class AppController extends Application { + + public static final String TAG = AppController.class.getSimpleName(); + + private RequestQueue mRequestQueue; + + private static AppController mInstance; + + @Override + public void onCreate() { + super.onCreate(); + mInstance = this; + } + + public static synchronized AppController getInstance() { + return mInstance; + } + + public RequestQueue getRequestQueue() { + if (mRequestQueue == null) { + mRequestQueue = Volley.newRequestQueue(getApplicationContext()); + } + + return mRequestQueue; + } + + public void addToRequestQueue(Request req, String tag) { + req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); + getRequestQueue().add(req); + } + + public void addToRequestQueue(Request req) { + req.setTag(TAG); + getRequestQueue().add(req); + } + + public void cancelPendingRequests(Object tag) { + if (mRequestQueue != null) { + mRequestQueue.cancelAll(tag); + } + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/LoginActivity.java b/app/src/main/java/org/deke/risk/riskahead/LoginActivity.java new file mode 100644 index 0000000..677d547 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/LoginActivity.java @@ -0,0 +1,454 @@ +package org.deke.risk.riskahead; + +import android.app.ProgressDialog; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import com.facebook.CallbackManager; + +import org.deke.risk.riskahead.fragments.FacebookButtonFragment; +import org.deke.risk.riskahead.fragments.GooglePlusButtonFragment; +import org.deke.risk.riskahead.fragments.TwitterButtonFragment; +import org.deke.risk.riskahead.helper.AppConfig; +import org.deke.risk.riskahead.helper.SQLiteHandler; +import org.deke.risk.riskahead.helper.SessionManager; +import org.json.JSONException; +import org.json.JSONObject; + +import com.android.volley.Request.Method; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.StringRequest; + +import java.util.HashMap; +import java.util.Map; + +public class LoginActivity extends AppCompatActivity implements FacebookButtonFragment.OnFragmentInteractionListener, GooglePlusButtonFragment.OnFragmentInteractionListener, TwitterButtonFragment.OnFragmentInteractionListener{ + + private static final String TAG = LoginActivity.class.getSimpleName(); + private CallbackManager callbackManager; + private Button btnSignUpMY; + private String inputMsg; + private TextView input_email; + private TextView input_full_name; + private TextView input_password; + + private ProgressDialog pDialog; + private SessionManager session; + public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE"; + private SQLiteHandler db; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Intent intent = getIntent(); + inputMsg = intent.getStringExtra(StartActivity.EXTRA_MESSAGE); + callbackManager = CallbackManager.Factory.create(); + + // Session manager + session = new SessionManager(getApplicationContext()); + + // Progress dialog + pDialog = new ProgressDialog(this); + pDialog.setCancelable(false); + + // SQLite database handler + db = new SQLiteHandler(getApplicationContext()); + + // Check if user is already logged in or not + if (session.isLoggedIn()) { + // User is already logged in. Take him to main activity + intent = new Intent(LoginActivity.this,MainActivity.class); + startActivity(intent); + finish(); + } + + if(inputMsg.equals("login")){ + setContentView(R.layout.activity_login); + }else if(inputMsg.equals("register")){ + setContentView(R.layout.activity_register); + input_full_name = (TextView) findViewById(R.id.input_full_name); + } + + input_email = (TextView) findViewById(R.id.input_email); + input_password = (TextView) findViewById(R.id.input_password); + + FragmentManager fragmentManager = getSupportFragmentManager(); + FacebookButtonFragment fragmentFB = new FacebookButtonFragment(); + GooglePlusButtonFragment fragmentGP = new GooglePlusButtonFragment(); + + FragmentTransaction transaction = fragmentManager.beginTransaction(); + transaction.add(R.id.fragment_btn_gp, fragmentGP); + transaction.commit(); + + initMySigninButton(); + } + + private void initMySigninButton() { + btnSignUpMY = (Button) findViewById(R.id.btnSignUp); + btnSignUpMY.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (v.getId() == R.id.btnSignUp) { + String email = input_email.getText().toString(); + String password = input_password.getText().toString(); + + if (inputMsg.equals("login")) { + if (isEmpty(input_email) || isEmpty(input_password)) { + showMessage("Please enter all fields before logging in"); + } else { + checkLogin(email, password); + } + } else if (inputMsg.equals("register")) { + String name = input_full_name.getText().toString(); + if (isEmpty(input_email) || isEmpty(input_password) || isEmpty(input_full_name)) { + showMessage("Please enter all fields before registration"); + } else { + registerUser(name, email, password); + } + } + } + } + }); + } + + private boolean isEmpty(TextView etText) { + return etText.getText().toString().trim().length() == 0; + } + + public void showMessage(String statusText){ + Toast.makeText(this, statusText, Toast.LENGTH_LONG).show(); + } + + + public void onFragmentInteraction(Uri uri){ + //you can leave it empty + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_login, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + public void handleSocialMediaLogin(final String key, final String providerType, final String username, final String email){ + if(session.isLoggedIn()){ + Intent intent = new Intent( + LoginActivity.this, + MainActivity.class); + intent.putExtra(EXTRA_MESSAGE, "Social Media Login"); + startActivity(intent); + finish(); + } + + // Tag used to cancel the request + String tag_string_req = "sociallogin"; + db.deleteUsers(); + pDialog.setMessage("Social Media Login ..."); + showDialog(); + + StringRequest strReq = new StringRequest(Method.POST, + AppConfig.URL_REGISTER, new Response.Listener() { + + @Override + public void onResponse(String response) { + Log.d(TAG, "Social Media Login Response: " + response.toString()); + hideDialog(); + + try { + JSONObject jObj = new JSONObject(response); + boolean error = jObj.getBoolean("error"); + if (!error) { + // user successfully logged in + // Create login session + session.setLogin(true); + + // User successfully stored in MySQL + // Now store the user in sqlite + String uid = jObj.getString("uid"); + + JSONObject user = jObj.getJSONObject("user"); + String username = user.getString("username"); + String name = user.getString("name"); + String surname = user.getString("surname"); + String email = user.getString("email"); + String status = user.getString("status"); + String created_at = user.getString("created_at"); + String updated_at = user.getString("updated_at"); + String providerType = user.getString("providerType"); + + // Inserting row in users table + db.addUser(uid, username, name, surname, email, status, providerType, created_at, updated_at); + // Launch login activity + Intent intent = new Intent( + LoginActivity.this, + MainActivity.class); + intent.putExtra(EXTRA_MESSAGE, "Social Media Login"); + startActivity(intent); + finish(); + } else { + + // Error occurred in registration. Get the error + // message + String errorMsg = jObj.getString("error_msg"); + Toast.makeText(getApplicationContext(), + errorMsg, Toast.LENGTH_LONG).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + }, new Response.ErrorListener() { + + @Override + public void onErrorResponse(VolleyError error) { + Log.e(TAG, "Registration Error: " + error.getMessage()); + Toast.makeText(getApplicationContext(), + error.getMessage(), Toast.LENGTH_LONG).show(); + hideDialog(); + } + }) { + + @Override + protected Map getParams() { + // Posting params to register url + Map params = new HashMap(); + params.put("tag", "sociallogin"); + params.put("key", key); + params.put("providerType", providerType); + params.put("username", username); + params.put("email",email); + + return params; + } + + }; + + // Adding request to request queue + AppController.getInstance().addToRequestQueue(strReq, tag_string_req); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == GooglePlusButtonFragment.RC_SIGN_IN) { + GooglePlusButtonFragment fragment = (GooglePlusButtonFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_btn_gp); + fragment.onActivityResult(requestCode, resultCode, data); + } else { + super.onActivityResult(requestCode, resultCode, data); + } + + TwitterButtonFragment twitter_fragment = (TwitterButtonFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_btn_tw); + if (twitter_fragment != null) { + twitter_fragment.onActivityResult(requestCode, resultCode, data); + } + } + + /** + * function to verify login details in mysql db + * */ + private void checkLogin(final String email, final String password) { + // Tag used to cancel the request + String tag_string_req = "req_login"; + db.deleteUsers(); + pDialog.setMessage("Logging in ..."); + showDialog(); + + StringRequest strReq = new StringRequest(Method.POST, AppConfig.URL_REGISTER, new Response.Listener() { + + @Override + public void onResponse(String response) { + Log.d(TAG, "Login Response: " + response.toString()); + hideDialog(); + + try { + JSONObject jObj = new JSONObject(response); + boolean error = jObj.getBoolean("error"); + + // Check for error node in json + if (!error) { + // user successfully logged in + // Create login session + session.setLogin(true); + + // Now store the user in sqlite + String uid = jObj.getString("uid"); + + JSONObject user = jObj.getJSONObject("user"); + String username = user.getString("username"); + String name = user.getString("name"); + String surname = user.getString("surname"); + String email = user.getString("email"); + String status = user.getString("status"); + String created_at = user.getString("created_at"); + String updated_at = user.getString("updated_at"); + String providerType = "local"; + + // Inserting row in users table + db.addUser(uid, username, name, surname, email, status, providerType, created_at, updated_at); + + // Launch main activity + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } else { + // Error in login. Get the error message + String errorMsg = jObj.getString("error_msg"); + Toast.makeText(getApplicationContext(),errorMsg, Toast.LENGTH_LONG).show(); + } + } catch (JSONException e) { + // JSON error + e.printStackTrace(); + } + + } + }, new Response.ErrorListener() { + + @Override + public void onErrorResponse(VolleyError error) { + Log.e(TAG, "Login Error: " + error.getMessage()); + Toast.makeText(getApplicationContext(), + error.getMessage(), Toast.LENGTH_LONG).show(); + hideDialog(); + } + }) { + + @Override + protected Map getParams() { + // Posting parameters to login url + Map params = new HashMap(); + params.put("tag", "login"); + params.put("email", email); + params.put("password", password); + + return params; + } + + }; + + // Adding request to request queue + AppController.getInstance().addToRequestQueue(strReq, tag_string_req); + } + + /** + * Function to store user in MySQL database will post params(tag, name,* email, password) to register url + * */ + private void registerUser(final String username, final String email,final String password) { + // Tag used to cancel the request + String tag_string_req = "req_register"; + db.deleteUsers(); + pDialog.setMessage("Registering ..."); + showDialog(); + + StringRequest strReq = new StringRequest(Method.POST, + AppConfig.URL_REGISTER, new Response.Listener() { + + @Override + public void onResponse(String response) { + Log.d(TAG, "Register Response: " + response.toString()); + hideDialog(); + + try { + JSONObject jObj = new JSONObject(response); + boolean error = jObj.getBoolean("error"); + if (!error) { + // User successfully stored in MySQL + // Now store the user in sqlite + String uid = jObj.getString("uid"); + + JSONObject user = jObj.getJSONObject("user"); + String username = user.getString("username"); + String name = user.getString("name"); + String surname = user.getString("surname"); + String email = user.getString("email"); + String status = user.getString("status"); + String created_at = user.getString("created_at"); + String updated_at = user.getString("updated_at"); + String providerType = "local"; + + // Inserting row in users table + db.addUser(uid, username, name, surname, email, status, providerType, created_at, updated_at); + // Launch login activity + Intent intent = new Intent( + LoginActivity.this, + LoginActivity.class); + intent.putExtra(EXTRA_MESSAGE, "login"); + startActivity(intent); + finish(); + } else { + + // Error occurred in registration. Get the error + // message + String errorMsg = jObj.getString("error_msg"); + Toast.makeText(getApplicationContext(), + errorMsg, Toast.LENGTH_LONG).show(); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + } + }, new Response.ErrorListener() { + + @Override + public void onErrorResponse(VolleyError error) { + Log.e(TAG, "Registration Error: " + error.getMessage()); + Toast.makeText(getApplicationContext(), + error.getMessage(), Toast.LENGTH_LONG).show(); + hideDialog(); + } + }) { + + @Override + protected Map getParams() { + // Posting params to register url + Map params = new HashMap(); + params.put("tag", "register"); + params.put("username", username); + params.put("email", email); + params.put("password", password); + + return params; + } + + }; + + // Adding request to request queue + AppController.getInstance().addToRequestQueue(strReq, tag_string_req); + } + + private void showDialog() { + if (!pDialog.isShowing()) + pDialog.show(); + } + + private void hideDialog() { + if (pDialog.isShowing()) + pDialog.dismiss(); + } + +} diff --git a/app/src/main/java/org/deke/risk/riskahead/MainActivity.java b/app/src/main/java/org/deke/risk/riskahead/MainActivity.java new file mode 100644 index 0000000..086a2ac --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/MainActivity.java @@ -0,0 +1,219 @@ +package org.deke.risk.riskahead; + +import android.content.Intent; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.MenuItemCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.ShareActionProvider; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import org.deke.risk.riskahead.fragments.MapFragment; +import org.deke.risk.riskahead.fragments.UserInfo; +import org.deke.risk.riskahead.helper.SQLiteHandler; +import org.deke.risk.riskahead.helper.SessionManager; + +import java.util.HashMap; + + +public class MainActivity extends AppCompatActivity implements UserInfo.OnFragmentInteractionListener, MapFragment.OnFragmentInteractionListener{ + + public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE"; + public String inputMsg; + + private ActionBarDrawerToggle mDrawerToggle; + private DrawerLayout mDrawerLayout; + private String mActivityTitle; + ShareActionProvider mShareActionProvider; + private ListView mDrawerList; + private ArrayAdapter mAdapter; + + private SQLiteHandler db; + private SessionManager session; + + public HashMap user; + public static FragmentManager fragmentManager; + + final String[] fragments = {UserInfo.class.getName(),MapFragment.class.getName()}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + Intent intent = getIntent(); + inputMsg = intent.getStringExtra(StartActivity.EXTRA_MESSAGE); + + // SqLite database handler + db = new SQLiteHandler(getApplicationContext()); + + // session manager + session = new SessionManager(getApplicationContext()); + + if (!session.isLoggedIn()) { + logoutUser(); + } + + // Fetching user details from sqlite + user = db.getUserDetails(); + + mDrawerList = (ListView)findViewById(R.id.navList); + mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); + addDrawerItems(); + setupDrawer(); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(true); + mActivityTitle = getTitle().toString(); + + fragmentManager = getSupportFragmentManager(); + } + + private void setupDrawer() { + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, + R.string.drawer_open, R.string.drawer_close) { + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + getSupportActionBar().setTitle("Navigation!"); + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + super.onDrawerClosed(view); + getSupportActionBar().setTitle(mActivityTitle); + invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() + } + }; + + mDrawerToggle.setDrawerIndicatorEnabled(true); + mDrawerLayout.setDrawerListener(mDrawerToggle); + } + + + private void addDrawerItems() { + String[] osArray = { "Start", "Maps", "Profile", "Settings", "Subscription", "Logout" }; + mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, osArray); + mDrawerList.setAdapter(mAdapter); + + mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, final int position, long id) { + mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { + @Override + public void onDrawerClosed(View drawerView) { + super.onDrawerClosed(drawerView); + + FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); + tx.replace(R.id.content, Fragment.instantiate(MainActivity.this, fragments[position])); + tx.commit(); + } + }); + mDrawerLayout.closeDrawer(mDrawerList); + } + }); + + FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); + tx.replace(R.id.content, Fragment.instantiate(MainActivity.this, fragments[0])); + tx.commit(); + } + + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main_share, menu); + + // Access the Share Item defined in menu XML + MenuItem shareItem = menu.findItem(R.id.menu_item_share); + + // Access the object responsible for + // putting together the sharing submenu + if (shareItem != null) { + mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); + } + + // Create an Intent to share your content + setShareIntent(); + getMenuInflater().inflate(R.menu.menu_login, menu); + return true; + } + + private void setShareIntent() { + if (mShareActionProvider != null) { + + // create an Intent with the contents of the TextView + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Android Development"); + shareIntent.putExtra(Intent.EXTRA_TEXT, "Ich empfehle RiskAhead!"); + + // Make sure the provider knows + // it should work with that Intent + mShareActionProvider.setShareIntent(shareIntent); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + // Activate the navigation drawer toggle + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onFragmentInteraction(Uri uri) { + + } + + /** + * Logging out the user. Will set isLoggedIn flag to false in shared + * preferences Clears the user data from sqlite users table + * */ + public void logoutUser() { + session.setLogin(false); + db.deleteUsers(); + + // Launching the login activity + Intent intent = new Intent(MainActivity.this, LoginActivity.class); + intent.putExtra(EXTRA_MESSAGE, "login"); + startActivity(intent); + finish(); + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/StartActivity.java b/app/src/main/java/org/deke/risk/riskahead/StartActivity.java new file mode 100644 index 0000000..c678db2 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/StartActivity.java @@ -0,0 +1,82 @@ +package org.deke.risk.riskahead; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import org.deke.risk.riskahead.helper.SessionManager; + + +public class StartActivity extends AppCompatActivity { + + public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE"; + + Button btnLogin; + Button btnRegister; + + private SessionManager session; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_start); + btnLogin = (Button) findViewById(R.id.btn_start_login); + btnRegister = (Button) findViewById(R.id.btn_start_register); + + // Session manager + session = new SessionManager(getApplicationContext()); + + // Check if user is already logged in or not + if (session.isLoggedIn()) { + // User is already logged in. Take him to main activity + Intent intent = new Intent(StartActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + } + + public void gotoLogin(View view) { + Intent intent = new Intent(this, LoginActivity.class); + intent.putExtra(EXTRA_MESSAGE, "login"); + startActivity(intent); + } + + public void gotoRegister(View view) { + Intent intent = new Intent(this, LoginActivity.class); + intent.putExtra(EXTRA_MESSAGE, "register"); + startActivity(intent); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_start, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + private boolean isEmpty(TextView etText) { + return etText.getText().toString().trim().length() == 0; + } + + public void showMessage(String statusText){ + Toast.makeText(this, statusText, Toast.LENGTH_LONG).show(); + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/fragments/FacebookButtonFragment.java b/app/src/main/java/org/deke/risk/riskahead/fragments/FacebookButtonFragment.java new file mode 100644 index 0000000..bb30e87 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/fragments/FacebookButtonFragment.java @@ -0,0 +1,111 @@ +package org.deke.risk.riskahead.fragments; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; + +import com.beardedhen.androidbootstrap.BootstrapButton; +import com.facebook.CallbackManager; +import com.facebook.FacebookCallback; +import com.facebook.FacebookException; +import com.facebook.FacebookSdk; +import com.facebook.login.LoginManager; +import com.facebook.login.LoginResult; + +import org.deke.risk.riskahead.LoginActivity; +import org.deke.risk.riskahead.R; + +import java.util.Arrays; + +public class FacebookButtonFragment extends Fragment { + + private BootstrapButton btnLoginFB; + CallbackManager callbackManager; + OnFragmentInteractionListener mListener; + View view; + + public FacebookButtonFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { + view = inflater.inflate(R.layout.fragment_facebook_button, container, false); + initFacebookButton(); + return view; + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + callbackManager.onActivityResult(requestCode, resultCode, data); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + try { + mListener = (OnFragmentInteractionListener) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement OnFragmentInteractionListener"); + } + + FacebookSdk.sdkInitialize(activity.getApplicationContext()); + callbackManager = CallbackManager.Factory.create(); + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + public interface OnFragmentInteractionListener { + public void onFragmentInteraction(Uri uri); + } + + private void initFacebookButton() { + btnLoginFB = (BootstrapButton) view.findViewById(R.id.btn_login_fb); + + btnLoginFB.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile", "user_friends")); + } + }); + + LoginManager.getInstance().registerCallback(callbackManager, + new FacebookCallback() { + @Override + public void onSuccess(LoginResult loginResult) { + ((LoginActivity) getActivity()).handleSocialMediaLogin(loginResult.getAccessToken().getToken(),"facebook",loginResult.getAccessToken().getUserId(),""); + } + + @Override + public void onCancel() { + ((LoginActivity) getActivity()).showMessage("Facebook LogIn canceled"); + } + + @Override + public void onError(FacebookException exception) { + ((LoginActivity) getActivity()).showMessage("Error while SignIn: ErrorMsg: " + exception.toString()); + } + }); + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/fragments/GooglePlusButtonFragment.java b/app/src/main/java/org/deke/risk/riskahead/fragments/GooglePlusButtonFragment.java new file mode 100644 index 0000000..e1bcd0a --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/fragments/GooglePlusButtonFragment.java @@ -0,0 +1,243 @@ +package org.deke.risk.riskahead.fragments; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.IntentSender; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import android.widget.Toast; + +import com.beardedhen.androidbootstrap.BootstrapButton; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GooglePlayServicesUtil; +import com.google.android.gms.common.SignInButton; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.plus.Plus; +import com.google.android.gms.plus.model.people.Person; + +import org.deke.risk.riskahead.LoginActivity; +import org.deke.risk.riskahead.R; + +public class GooglePlusButtonFragment extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ + + public static final int RC_SIGN_IN = 0; + + private static final String TAG = "MainActivity"; + + private static final int PROFILE_PIC_SIZE = 800; + + private GoogleApiClient mGoogleApiClient; + + private boolean mIntentInProgress; + + private boolean mSignInClicked; + + private ConnectionResult mConnectionResult; + + private BootstrapButton btnSignIn; + + private Context mContext; + private Activity mActivity; + + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mActivity = getActivity(); + mContext = getActivity().getApplicationContext(); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_googleplus_button,container, false); + + btnSignIn = (BootstrapButton) view.findViewById(R.id.btn_login_gp); + + mGoogleApiClient = new GoogleApiClient.Builder(view.getContext()) + .addConnectionCallbacks(this) + .addOnConnectionFailedListener(this).addApi(Plus.API) + .addScope(Plus.SCOPE_PLUS_LOGIN).build(); + + btnSignIn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + performClickAction(); + } + }); + updateUI(mGoogleApiClient.isConnected()); + + return view; + } + + private void performClickAction() { + if(mGoogleApiClient.isConnected()){ + signOutFromGplus(); + }else{ + signInWithGplus(); + } + } + + @Override + public void onStart() { + super.onStart(); + mGoogleApiClient.connect(); + } + + @Override + public void onStop() { + super.onStop(); + if (mGoogleApiClient.isConnected()) { + mGoogleApiClient.disconnect(); + } + } + + @Override + public void onActivityResult(int requestCode, int responseCode, Intent intent) { + + if (requestCode == RC_SIGN_IN) { + if (responseCode != Activity.RESULT_OK) { + mSignInClicked = false; + } + + mIntentInProgress = false; + + if (!mGoogleApiClient.isConnecting()) { + mGoogleApiClient.connect(); + } + } + } + + @Override + public void onConnectionFailed(ConnectionResult result) { + if (!result.hasResolution()) { + GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), + mActivity, 0).show(); + Log.e(TAG, "" + result.getErrorCode()); + return; + } + + if (!mIntentInProgress) { + + mConnectionResult = result; + + if (mSignInClicked) { + + Log.e(TAG, "" + result.getErrorCode()); + resolveSignInError(); + } + } + + } + + @Override + public void onConnected(Bundle arg0) { + Person currentPerson = getProfileInformation(); + if(mSignInClicked) ((LoginActivity) getActivity()).handleSocialMediaLogin(currentPerson.getId(),"google",currentPerson.getDisplayName(),Plus.AccountApi.getAccountName(mGoogleApiClient)); + + mSignInClicked = false; + updateUI(true); + } + + @Override + public void onConnectionSuspended(int arg0) { + mGoogleApiClient.connect(); + updateUI(false); + + } + + private void updateUI(boolean isSignedIn) { + if (isSignedIn) { + this.btnSignIn.setText("Log out from G+"); + } else { + this.btnSignIn.setText("Google+"); + } + } + + /** + * Sign-in into google + * */ + private void signInWithGplus() { + if (!mGoogleApiClient.isConnecting()) { + mSignInClicked = true; + resolveSignInError(); + } + } + + /** + * Method to resolve any signin errors + * */ + private void resolveSignInError() { + if (mConnectionResult.hasResolution()) { + try { + mIntentInProgress = true; + mConnectionResult.startResolutionForResult(mActivity,RC_SIGN_IN); + } catch (IntentSender.SendIntentException e) { + mIntentInProgress = false; + mGoogleApiClient.connect(); + } + } + } + + /** + * Fetching user's information name, email, profile pic + * */ + private Person getProfileInformation() { + Person currentPerson = null; + try { + if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) { + currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient); + String personName = currentPerson.getDisplayName(); + String personPhotoUrl = currentPerson.getImage().getUrl(); + String personGooglePlusProfile = currentPerson.getUrl(); + String email = Plus.AccountApi.getAccountName(mGoogleApiClient); + + Log.e(TAG, "Name: " + personName + ", plusProfile: " + + personGooglePlusProfile + ", email: " + email + + ", Image: " + personPhotoUrl + " user id:" + + currentPerson.getId()); + + } else { + Toast.makeText(mContext, "Person information is null", + Toast.LENGTH_LONG).show(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return currentPerson; + } + + /** + * Sign-out from google + * */ + private void signOutFromGplus() { + if (mGoogleApiClient.isConnected()) { + mGoogleApiClient.clearDefaultAccountAndReconnect(); + updateUI(false); + } + } + + + protected void setGooglePlusButtonText(SignInButton signInButton, String buttonText) { + for (int i = 0; i < signInButton.getChildCount(); i++) { + View v = signInButton.getChildAt(i); + if (v instanceof TextView) { + TextView mTextView = (TextView) v; + mTextView.setAllCaps(false); + mTextView.setText(buttonText); + return; + } + } + } + + public interface OnFragmentInteractionListener { + public void onFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/fragments/MapFragment.java b/app/src/main/java/org/deke/risk/riskahead/fragments/MapFragment.java new file mode 100644 index 0000000..c69403c --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/fragments/MapFragment.java @@ -0,0 +1,252 @@ +package org.deke.risk.riskahead.fragments; + +import android.content.Intent; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; + +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.RelativeLayout; +import android.widget.Toast; + +import com.google.android.gms.maps.CameraUpdateFactory; +import com.google.android.gms.maps.GoogleMap; +import com.google.android.gms.maps.SupportMapFragment; +import com.google.android.gms.maps.model.LatLng; +import com.google.android.gms.maps.model.MarkerOptions; + +import org.deke.risk.riskahead.R; +import org.deke.risk.riskahead.helper.GeocodeJSONParser; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.List; + +public class MapFragment extends Fragment { + + private static View view; + private static GoogleMap mMap; + private static Double latitude, longitude; + Button mBtnFind; + EditText etPlace; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + if (container == null) { + return null; + } + view = (RelativeLayout) inflater.inflate(R.layout.fragment_map, container, false); + // Passing harcoded values for latitude & longitude. Please change as per your need. This is just used to drop a Marker on the Map + latitude = 53.33; + longitude = 10.02; + + setUpMapIfNeeded(); // For setting up the MapFragment + // Getting reference to the find button + mBtnFind = (Button) view.findViewById(R.id.btn_show); + etPlace = (EditText) view.findViewById(R.id.et_place); + + mBtnFind.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View v) { + // Getting the place entered + String location = etPlace.getText().toString(); + + if(location==null || location.equals("")){ + Toast.makeText(getActivity(), "No Place is entered", Toast.LENGTH_SHORT).show(); + return; + } + + String url = "https://maps.googleapis.com/maps/api/geocode/json?"; + + try { + // encoding special characters like space in the user input place + location = URLEncoder.encode(location, "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + String address = "address=" + location; + + String sensor = "sensor=false"; + + // url , from where the geocoding data is fetched + url = url + address + "&" + sensor; + + // Instantiating DownloadTask to get places from Google Geocoding service + // in a non-ui thread + DownloadTask downloadTask = new DownloadTask(); + + // Start downloading the geocoding places + downloadTask.execute(url); + } + }); + return view; + } + + /***** Sets up the map if it is possible to do so *****/ + public void setUpMapIfNeeded() { + // Do a null check to confirm that we have not already instantiated the map. + if (mMap == null) { + // Try to obtain the map from the SupportMapFragment. + //mMap = ((SupportMapFragment) MainActivity.fragmentManager.findFragmentById(R.id.location_map)).getMap(); + mMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.location_map)).getMap(); + // Check if we were successful in obtaining the map. + if (mMap != null) + setUpMap(); + } + } + + /** + * This is where we can add markers or lines, add listeners or move the + * camera. + *

+ * This should only be called once and when we are sure that {@link #mMap} + * is not null. + */ + private static void setUpMap() { + // For showing a move to my loction button + mMap.setMyLocationEnabled(true); + mMap.getUiSettings().setZoomControlsEnabled(true); + // For dropping a marker at a point on the Map + mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My Home").snippet("Home Address")); + // For zooming automatically to the Dropped PIN Location + mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,longitude), 12.0f)); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + if (mMap != null) + setUpMap(); + + if (mMap == null) { + // Try to obtain the map from the SupportMapFragment. + mMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.location_map)).getMap(); // getMap is deprecated + // Check if we were successful in obtaining the map. + if (mMap != null) + setUpMap(); + } + } + + /**** The mapfragment's id must be removed from the FragmentManager + **** or else if the same it is passed on the next time then + **** app will crash ****/ + @Override + public void onDestroyView() { + super.onDestroyView(); + if (mMap != null) { + getChildFragmentManager().beginTransaction().remove(getChildFragmentManager().findFragmentById(R.id.location_map)).commitAllowingStateLoss(); + mMap = null; + } + } + + public interface OnFragmentInteractionListener { + public void onFragmentInteraction(Uri uri); + } + + private String downloadUrl(String strUrl) throws IOException { + String data = ""; + InputStream iStream = null; + HttpURLConnection urlConnection = null; + try{ + URL url = new URL(strUrl); + // Creating an http connection to communicate with url + urlConnection = (HttpURLConnection) url.openConnection(); + + // Connecting to url + urlConnection.connect(); + + // Reading data from url + iStream = urlConnection.getInputStream(); + + BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); + + StringBuffer sb = new StringBuffer(); + + String line = ""; + while( ( line = br.readLine()) != null){ + sb.append(line); + } + + data = sb.toString(); + br.close(); + + }catch(Exception e){ + Log.d("Exception while downloading url", e.toString()); + }finally{ + iStream.close(); + urlConnection.disconnect(); + } + + return data; + } + /** A class, to download Places from Geocoding webservice */ + private class DownloadTask extends AsyncTask { + + String data = null; + + // Invoked by execute() method of this object + @Override + protected String doInBackground(String... url) { + try{ + data = downloadUrl(url[0]); + }catch(Exception e){ + Log.d("Background Task",e.toString()); + } + return data; + } + + // Executed after the complete execution of doInBackground() method + @Override + protected void onPostExecute(String result){ + + // Instantiating ParserTask which parses the json data from Geocoding webservice + // in a non-ui thread + ParserTask parserTask = new ParserTask(); + + // Start parsing the places in JSON format + // Invokes the "doInBackground()" method of the class ParseTask + parserTask.execute(result); + } + } + + /** A class to parse the Geocoding Places in non-ui thread */ + class ParserTask extends AsyncTask>> { + + JSONObject jObject; + + // Invoked by execute() method of this object + @Override + protected List> doInBackground(String... jsonData) { + + List> places = null; + GeocodeJSONParser parser = new GeocodeJSONParser(); + + try { + jObject = new JSONObject(jsonData[0]); + + /** Getting the parsed data as a an ArrayList */ + places = parser.parse(jObject); + + } catch (Exception e) { + Log.d("Exception", e.toString()); + } + return places; + } + } + +} diff --git a/app/src/main/java/org/deke/risk/riskahead/fragments/TwitterButtonFragment.java b/app/src/main/java/org/deke/risk/riskahead/fragments/TwitterButtonFragment.java new file mode 100644 index 0000000..339e584 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/fragments/TwitterButtonFragment.java @@ -0,0 +1,153 @@ +package org.deke.risk.riskahead.fragments; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.Toast; + +import io.fabric.sdk.android.Fabric; + +import com.beardedhen.androidbootstrap.BootstrapButton; +import com.twitter.sdk.android.core.Callback; +import com.twitter.sdk.android.core.Result; +import com.twitter.sdk.android.core.TwitterAuthToken; +import com.twitter.sdk.android.core.TwitterCore; +import com.twitter.sdk.android.core.TwitterAuthConfig; +import com.twitter.sdk.android.core.TwitterException; +import com.twitter.sdk.android.core.TwitterSession; +import com.twitter.sdk.android.core.identity.TwitterAuthClient; + +import org.deke.risk.riskahead.LoginActivity; +import org.deke.risk.riskahead.R; + +public class TwitterButtonFragment extends Fragment { + + private BootstrapButton btnLoginTW; + private TwitterAuthClient client; + TwitterSession session = null; + Context mContext; + View view; + + // Note: Your consumer key and secret should be obfuscated in your source code before shipping. + private static final String TWITTER_KEY = "t8o7YBmzj3JMRf6RjIBg7hF20"; + private static final String TWITTER_SECRET = "HTt4mOqyDStslzq1RXHUqU6HcZpOuSuzC2iWH45MlUsZBRI704"; + + public TwitterButtonFragment() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { + mContext = getActivity().getApplicationContext(); + TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); + Fabric.with(mContext, new TwitterCore(authConfig)); + client = new TwitterAuthClient(); + + view = inflater.inflate(R.layout.fragment_twitter_button, container, false); + btnLoginTW = (BootstrapButton) view.findViewById(R.id.btn_login_twitter); + + btnLoginTW.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + client.authorize(getActivity(), new Callback() { + @Override + public void success(Result result) { + Log.e("Debug", "onSuccess wird ausgeführt"); + session = result.data; + TwitterAuthToken authToken = session.getAuthToken(); + String token = authToken.token; + String secret = authToken.secret; + + ((LoginActivity) getActivity()).handleSocialMediaLogin((Long.toString(session.getUserId())),"twitter",session.getUserName(),""); + } + + @Override + public void failure(TwitterException exception) { + Log.e("Debug", "onFailure wird ausgeführt"); + showMessage("Twitter Login failed with exception " + exception.getMessage().toString()); + } + }); + } + }); + + //TO-DO + if(isAuthed()){ + // log out + }else{ + // log in + } + + + return view; + } + + private void setUpSignOut() { + btnLoginTW.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TwitterCore.getInstance().getSessionManager().clearActiveSession(); + + Toast.makeText(mContext, "All accounts are cleared",Toast.LENGTH_SHORT).show(); + } + }); + } + + private boolean isAuthed() { + final TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession(); + return session != null && session.getAuthToken() != null; + } + + public void showMessage(String statusText){ + Toast.makeText(mContext,statusText,Toast.LENGTH_LONG).show(); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + client.onActivityResult(requestCode, resultCode, data); + } + + @Override + public void onResume() { + super.onResume(); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + } + + @Override + public void onDetach() { + super.onDetach(); + } + + public interface OnFragmentInteractionListener { + public void onFragmentInteraction(Uri uri); + } + +} diff --git a/app/src/main/java/org/deke/risk/riskahead/fragments/UserInfo.java b/app/src/main/java/org/deke/risk/riskahead/fragments/UserInfo.java new file mode 100644 index 0000000..d5c84c8 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/fragments/UserInfo.java @@ -0,0 +1,128 @@ +package org.deke.risk.riskahead.fragments; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import org.deke.risk.riskahead.LoginActivity; +import org.deke.risk.riskahead.R; +import org.deke.risk.riskahead.helper.SQLiteHandler; +import org.deke.risk.riskahead.helper.SessionManager; + +import java.util.HashMap; + +public class UserInfo extends Fragment { + private TextView txtName; + private TextView txtTest; + private TextView txtEmail; + private Button btnLogout; + Activity mActivity; + private SQLiteHandler db; + public HashMap user; + private OnFragmentInteractionListener mListener; + private SessionManager session; + + public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE"; + + + public static UserInfo newInstance(String param1, String param2) { + UserInfo fragment = new UserInfo(); + Bundle args = new Bundle(); + + fragment.setArguments(args); + return fragment; + } + + public UserInfo() { + // Required empty public constructor + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_user_info, container, false); + session = new SessionManager(getActivity().getApplicationContext()); + + txtTest = (TextView) view.findViewById(R.id.test); + txtName = (TextView) view.findViewById(R.id.name); + txtEmail = (TextView) view.findViewById(R.id.email); + btnLogout = (Button) view.findViewById(R.id.btnLogout); + + // Logout button click event + btnLogout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + logoutUser(); + } + }); + + // SqLite database handler + db = new SQLiteHandler(getActivity().getApplicationContext()); + // Fetching user details from sqlite + user = db.getUserDetails(); + txtName.setText(user.get("username")); + txtEmail.setText(user.get("email")); + + + return view; + } + + + @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mActivity = activity; + try { + mListener = (OnFragmentInteractionListener) activity; + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface OnFragmentInteractionListener { + public void onFragmentInteraction(Uri uri); + } + + /** + * Logging out the user. Will set isLoggedIn flag to false in shared + * preferences Clears the user data from sqlite users table + * */ + public void logoutUser() { + session.setLogin(false); + db.deleteUsers(); + + // Launching the login activity + Intent intent = new Intent(getActivity(), LoginActivity.class); + intent.putExtra(EXTRA_MESSAGE, "login"); + startActivity(intent); + getActivity().finish(); + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/AppConfig.java b/app/src/main/java/org/deke/risk/riskahead/helper/AppConfig.java new file mode 100644 index 0000000..f34161c --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/helper/AppConfig.java @@ -0,0 +1,12 @@ +package org.deke.risk.riskahead.helper; + +/** + * Created by Dennis on 09.08.2015. + */ +public class AppConfig { + // Server user login url + public static String URL_LOGIN = "http://192.168.178.31/riskahead/rest/"; + + // Server user register url + public static String URL_REGISTER = "http://192.168.178.31/riskahead/rest/"; +} diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/GeocodeJSONParser.java b/app/src/main/java/org/deke/risk/riskahead/helper/GeocodeJSONParser.java new file mode 100644 index 0000000..0bea48a --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/helper/GeocodeJSONParser.java @@ -0,0 +1,78 @@ +package org.deke.risk.riskahead.helper; + +/** + * Created by Dennis on 18.08.2015. + */ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class GeocodeJSONParser { + + /** Receives a JSONObject and returns a list */ + public List> parse(JSONObject jObject){ + + JSONArray jPlaces = null; + try { + /** Retrieves all the elements in the 'places' array */ + jPlaces = jObject.getJSONArray("results"); + } catch (JSONException e) { + e.printStackTrace(); + } + /** Invoking getPlaces with the array of json object + * where each json object represent a place + */ + return getPlaces(jPlaces); + } + + private List> getPlaces(JSONArray jPlaces){ + int placesCount = jPlaces.length(); + List> placesList = new ArrayList>(); + HashMap place = null; + + /** Taking each place, parses and adds to list object */ + for(int i=0; i getPlace(JSONObject jPlace){ + + HashMap place = new HashMap(); + String formatted_address = "-NA-"; + String lat=""; + String lng=""; + + try { + // Extracting formatted address, if available + if(!jPlace.isNull("formatted_address")){ + formatted_address = jPlace.getString("formatted_address"); + } + + lat = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat"); + lng = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng"); + + place.put("formatted_address", formatted_address); + place.put("lat", lat); + place.put("lng", lng); + + }catch (JSONException e) { + e.printStackTrace(); + } + return place; + } +} diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/SQLiteHandler.java b/app/src/main/java/org/deke/risk/riskahead/helper/SQLiteHandler.java new file mode 100644 index 0000000..e5e6ca3 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/helper/SQLiteHandler.java @@ -0,0 +1,147 @@ +package org.deke.risk.riskahead.helper; + +import java.util.HashMap; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; + +public class SQLiteHandler extends SQLiteOpenHelper { + + private static final String TAG = SQLiteHandler.class.getSimpleName(); + + // All Static variables + // Database Version + private static final int DATABASE_VERSION = 1; + + // Database Name + private static final String DATABASE_NAME = "android_api"; + + // Login table name + private static final String TABLE_LOGIN = "login"; + + // Login Table Columns names + private static final String KEY_UID = "uid"; + private static final String KEY_USERNAME = "username"; + private static final String KEY_NAME = "name"; + private static final String KEY_SURNAME = "surname"; + private static final String KEY_EMAIL = "email"; + private static final String KEY_STATUS = "status"; + private static final String PROVIDER_TYPE = "providerType"; + private static final String KEY_CREATED_AT = "created_at"; + private static final String KEY_UPDATED_AT = "updated_at"; + + public SQLiteHandler(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + // Creating Tables + @Override + public void onCreate(SQLiteDatabase db) { + String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "(" + + KEY_UID + " INTEGER PRIMARY KEY," + + KEY_USERNAME + " TEXT," + + KEY_NAME + " TEXT," + + KEY_SURNAME + " TEXT," + + KEY_EMAIL + " TEXT UNIQUE," + + KEY_STATUS + " TEXT," + + PROVIDER_TYPE + " TEXT," + + KEY_UPDATED_AT + " TEXT," + + KEY_CREATED_AT + " TEXT" + ")"; + db.execSQL(CREATE_LOGIN_TABLE); + + Log.d(TAG, "Database tables created"); + } + + // Upgrading database + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN); + onCreate(db); + } + + /** + * Storing user details in database + * */ + public void addUser(String uid, String username, String name, String surname, String email, String status, String provider_type, String created_at, String updated_at) { + SQLiteDatabase db = this.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put(KEY_UID, uid); //UID + values.put(KEY_USERNAME, username); // Username + values.put(KEY_NAME, name); // Name + values.put(KEY_SURNAME, surname); // Surame + values.put(KEY_EMAIL, email); // Email + values.put(KEY_STATUS, status); // Status + values.put(PROVIDER_TYPE, provider_type); // ProviderType + values.put(KEY_CREATED_AT, created_at); // Created At + values.put(KEY_UPDATED_AT, updated_at); // Updated At + + // Inserting Row + long id = db.insert(TABLE_LOGIN, null, values); + db.close(); // Closing database connection + + Log.d(TAG, "New user inserted into sqlite: " + id); + } + + /** + * Getting user data from database + * */ + public HashMap getUserDetails() { + HashMap user = new HashMap(); + String selectQuery = "SELECT * FROM " + TABLE_LOGIN; + + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + // Move to first row + cursor.moveToFirst(); + if (cursor.getCount() > 0) { + user.put("uid", cursor.getString(0)); + user.put("username", cursor.getString(1)); + user.put("name", cursor.getString(2)); + user.put("surname", cursor.getString(3)); + user.put("email", cursor.getString(4)); + user.put("status", cursor.getString(5)); + user.put("providerType", cursor.getString(6)); + user.put("created_at", cursor.getString(7)); + user.put("updated_at", cursor.getString(8)); + } + cursor.close(); + db.close(); + // return user + Log.d(TAG, "Fetching user from Sqlite: " + user.toString()); + + return user; + } + + /** + * Getting user login status return true if rows are there in table + * */ + public int getRowCount() { + String countQuery = "SELECT * FROM " + TABLE_LOGIN; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + int rowCount = cursor.getCount(); + db.close(); + cursor.close(); + + // return row count + return rowCount; + } + + /** + * Re crate database Delete all tables and create them again + * */ + public void deleteUsers() { + SQLiteDatabase db = this.getWritableDatabase(); + // Delete All Rows + db.delete(TABLE_LOGIN, null, null); + db.close(); + + Log.d(TAG, "Deleted all user info from sqlite"); + } + +} diff --git a/app/src/main/java/org/deke/risk/riskahead/helper/SessionManager.java b/app/src/main/java/org/deke/risk/riskahead/helper/SessionManager.java new file mode 100644 index 0000000..cd9fdc9 --- /dev/null +++ b/app/src/main/java/org/deke/risk/riskahead/helper/SessionManager.java @@ -0,0 +1,45 @@ +package org.deke.risk.riskahead.helper; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.util.Log; + +public class SessionManager { + // LogCat tag + private static String TAG = SessionManager.class.getSimpleName(); + + // Shared Preferences + SharedPreferences pref; + + Editor editor; + Context _context; + + // Shared pref mode + int PRIVATE_MODE = 0; + + // Shared preferences file name + private static final String PREF_NAME = "AndroidHiveLogin"; + + private static final String KEY_IS_LOGGEDIN = "isLoggedIn"; + + public SessionManager(Context context) { + this._context = context; + pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); + editor = pref.edit(); + } + + public void setLogin(boolean isLoggedIn) { + + editor.putBoolean(KEY_IS_LOGGEDIN, isLoggedIn); + + // commit changes + editor.commit(); + + Log.d(TAG, "User login session modified!"); + } + + public boolean isLoggedIn(){ + return pref.getBoolean(KEY_IS_LOGGEDIN, false); + } +} diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..236bff558af07faa3921ba35e2515edf62d04bb9 GIT binary patch literal 161 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 F2>^8yH@N@+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..a5fa74def4b40d7eb6826da05bd5e12b836cb999 GIT binary patch literal 2836 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 m06>TUe1Q%C00DSr z1<%~X^wgl##FWaylc_d9MMa)2jv*QM-d<4Ta$*#5x!8O#VbcvCx78OjjCM19-`|n` zlcQ;yJWqK-!X?h+v^9}Es?F+hJ07=b>sdT*QRcgm+^%b8|A7C`|A*gYPjm3$2miRv cpZdzQt0C%<%j~>EK-(ESUHx3vIVCg!0CP)0sQ>@~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_drawer.png b/app/src/main/res/drawable-xxhdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4685d6e046ce6c450c19426dce627a88718bfc GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC&H|6fVg?3oVGw3ym^DWND5#L^ z5#-Cjkf+YTP`sXjk!=$LL!~YQgWnqlM%L3n1JW26goK+9UQq_B4e)ev49U3n_PU`U zg8>io#t-TVJM=pEGT)onF!&ZOd;8}O149hcq!N%?hK6(oZAK7-f#HS|n9?%@Qw{w* cAUc7wfPvd9>y+w~O{pNhr>mdKI;Vst074Kf@&Et; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/Thumbs.db b/app/src/main/res/drawable/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..16b234a1ef7b9b2667515286b1d6672203a1e401 GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..85b9bba --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + +