From e603b4f60ec3297eac81c725c6552f941f1aabab Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 4 Jan 2016 17:08:59 -0200 Subject: [PATCH] Implemented Sign Out as a first PanicKit Response This closes #204 --- briar-android/AndroidManifest.xml | 20 +++++++++ briar-android/build.gradle | 21 +++++++++ .../res/layout/activity_panic_preferences.xml | 13 ++++++ briar-android/res/values-v14/styles.xml | 6 +++ briar-android/res/values/color.xml | 4 ++ briar-android/res/values/strings.xml | 15 ++++++- briar-android/res/values/styles.xml | 19 +++++++-- briar-android/res/xml/panic_preferences.xml | 11 +++++ .../briarproject/android/BriarActivity.java | 21 +++++++-- .../android/SettingsActivity.java | 28 ++++++++++++ .../android/SplashScreenActivity.java | 4 ++ .../android/panic/ExitActivity.java | 40 ++++++++++++++++++ .../panic/PanicPreferencesActivity.java | 33 +++++++++++++++ .../panic/PanicPreferencesFragment.java | 14 ++++++ .../android/panic/PanicResponderActivity.java | 37 ++++++++++++++++ briar-core/libs/gradle-witness.jar | Bin 0 -> 20436 bytes build.gradle | 3 +- 17 files changed, 281 insertions(+), 8 deletions(-) create mode 100644 briar-android/res/layout/activity_panic_preferences.xml create mode 100644 briar-android/res/xml/panic_preferences.xml create mode 100644 briar-android/src/org/briarproject/android/panic/ExitActivity.java create mode 100644 briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java create mode 100644 briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java create mode 100644 briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java create mode 100644 briar-core/libs/gradle-witness.jar diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 476229541..ac262a3c2 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -7,6 +7,9 @@ @@ -188,5 +191,22 @@ android:name=".android.StartupFailureActivity" android:label="@string/startup_failed_activity_title" > + + + + + + + + + + diff --git a/briar-android/build.gradle b/briar-android/build.gradle index 756b2da58..4c3835102 100644 --- a/briar-android/build.gradle +++ b/briar-android/build.gradle @@ -1,4 +1,9 @@ apply plugin: 'com.android.application' +apply plugin: 'witness' + +repositories { + jcenter() +} dependencies { compile fileTree(dir: '../briar-api/libs', include: '*.jar') @@ -8,7 +13,23 @@ dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile "com.android.support:support-v4:23.1.1" compile "com.android.support:appcompat-v7:23.1.1" + compile "com.android.support:preference-v7:23.1.1" + compile "com.android.support:preference-v14:23.1.1" compile "com.android.support:design:23.1.1" + compile "info.guardianproject.panic:panic:0.5" +} + +dependencyVerification { + verify = [ + 'com.android.support:support-v4:5c7dceb6c824089fe80f502e5206264048ef8bffa4e8ddeab180b81723e79b7f', + 'com.android.support:appcompat-v7:0a8762214382b7e8d4b989b4ac10b5c846b957d767ccb7bccbc6be5afa885a82', + 'com.android.support:preference-v7:4b6dabaa4400cbed885c7edc885aa6372468f48d628cc0d4a04b9ccd128ed324', + 'com.android.support:preference-v14:a69906c2b29b315ac3c1fdf01537a7557660a65b8ea1cf891baa8665e1197459', + 'com.android.support:design:41a9cd75ca78f25df5f573db7cedf8bb66beae00c330943923ba9f3e2051736d', + 'com.android.support:support-annotations:f347a35b9748a4103b39a6714a77e2100f488d623fd6268e259c177b200e9d82', + 'com.android.support:recyclerview-v7:7606373da0931a1e62588335465a0e390cd676c98117edab29220317495faefd', + 'info.guardianproject.panic:panic:a7ed9439826db2e9901649892cf9afbe76f00991b768d8f4c26332d7c9406cb2', + ] } android { diff --git a/briar-android/res/layout/activity_panic_preferences.xml b/briar-android/res/layout/activity_panic_preferences.xml new file mode 100644 index 000000000..78aaeb88d --- /dev/null +++ b/briar-android/res/layout/activity_panic_preferences.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/briar-android/res/values-v14/styles.xml b/briar-android/res/values-v14/styles.xml index 898a9e4e0..ff39392ac 100644 --- a/briar-android/res/values-v14/styles.xml +++ b/briar-android/res/values-v14/styles.xml @@ -1,5 +1,11 @@ + + + diff --git a/briar-android/res/values/color.xml b/briar-android/res/values/color.xml index 28cddbd4f..fc0ea3977 100644 --- a/briar-android/res/values/color.xml +++ b/briar-android/res/values/color.xml @@ -16,10 +16,14 @@ #2D3E50 #0f1720 + #2D3E50 #75ab0d #95d220 #75ab0d #333333 #ffffff + + + @color/briar_accent \ No newline at end of file diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 4934dceab..25aa173bc 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -106,6 +106,9 @@ Connect via Tor Only when using Wi-Fi When using Wi-Fi or mobile data + Panic Button Setup + Panic Button + Configure how Briar will react when you use a Panic Button app NOTIFICATIONS Show alerts for private messages Show alerts for forum posts @@ -114,6 +117,13 @@ Default ringtone None Choose ringtone + Accept from App + No app set, don\'t do destructive actions + None + Lock Briar + Signs you out and require password to access data + Delete Data + Caution: This irrevocably deletes your contacts and all other data Step %1$d/%2$d Online Offline @@ -122,11 +132,14 @@ Internet Bluetooth Wi-Fi + No data + an unknown App Lost password Password recovery is not possible. Do you wish to delete your user, all contacts, and re-register ? Confirm Contact Deletion Are you sure that you want to remove this contact and all messages exchanged with this contact? - No data + Confirm Panic App + Are you sure that you want to allow %1$s to trigger destructive panic actions? diff --git a/briar-android/res/values/styles.xml b/briar-android/res/values/styles.xml index 8a706c0a2..7a869c905 100644 --- a/briar-android/res/values/styles.xml +++ b/briar-android/res/values/styles.xml @@ -1,17 +1,20 @@ - - + + + + + \ No newline at end of file diff --git a/briar-android/res/xml/panic_preferences.xml b/briar-android/res/xml/panic_preferences.xml new file mode 100644 index 000000000..3b40f0e3d --- /dev/null +++ b/briar-android/res/xml/panic_preferences.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/BriarActivity.java b/briar-android/src/org/briarproject/android/BriarActivity.java index 5442839ac..fcc4ab604 100644 --- a/briar-android/src/org/briarproject/android/BriarActivity.java +++ b/briar-android/src/org/briarproject/android/BriarActivity.java @@ -2,11 +2,13 @@ package org.briarproject.android; import android.annotation.SuppressLint; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.os.IBinder; import org.briarproject.android.BriarService.BriarBinder; import org.briarproject.android.BriarService.BriarServiceConnection; +import org.briarproject.android.panic.ExitActivity; import org.briarproject.api.db.DatabaseConfig; import org.briarproject.api.db.DatabaseExecutor; import org.briarproject.api.lifecycle.LifecycleManager; @@ -78,7 +80,7 @@ public class BriarActivity extends BaseActivity { if (bound) unbindService(serviceConnection); } - protected void signOut() { + protected void signOut(final boolean removeFromRecentApps) { new Thread() { @Override public void run() { @@ -95,15 +97,28 @@ public class BriarActivity extends BaseActivity { LOG.warning("Interrupted while waiting for service"); Thread.currentThread().interrupt(); } - finishAndExit(); + + if(removeFromRecentApps){ + ExitActivity.exitAndRemoveFromRecentApps(BriarActivity.this); + } else { + finishAndExit(); + } } }.start(); } + protected void signOut() { + signOut(false); + } + private void finishAndExit() { runOnUiThread(new Runnable() { public void run() { - finish(); + if (Build.VERSION.SDK_INT >= 21) { + finishAndRemoveTask(); + } else { + finish(); + } LOG.info("Exiting"); System.exit(0); } diff --git a/briar-android/src/org/briarproject/android/SettingsActivity.java b/briar-android/src/org/briarproject/android/SettingsActivity.java index e2f2d233a..7c48355a9 100644 --- a/briar-android/src/org/briarproject/android/SettingsActivity.java +++ b/briar-android/src/org/briarproject/android/SettingsActivity.java @@ -16,6 +16,7 @@ import android.widget.ScrollView; import android.widget.TextView; import org.briarproject.R; +import org.briarproject.android.panic.PanicPreferencesActivity; import org.briarproject.android.util.FixedVerticalSpace; import org.briarproject.android.util.HorizontalBorder; import org.briarproject.android.util.LayoutUtils; @@ -68,6 +69,7 @@ OnClickListener { private CheckBox notifyPrivateMessages = null, notifyForumPosts = null; private CheckBox notifyVibration = null; private TextView torOverWifi = null, torOverWifiHint = null; + private TextView panicSettings = null, panicSettingsHint = null; private TextView notifySound = null, notifySoundHint = null; private ListLoadingProgressBar progress = null; private ImageButton testingButton = null; @@ -141,6 +143,30 @@ OnClickListener { torOverWifiHint.setOnClickListener(this); settings.addView(torOverWifiHint); + TextView panicTitle = new TextView(this); + panicTitle.setPadding(pad, 0, pad, 0); + panicTitle.setTypeface(DEFAULT_BOLD); + panicTitle.setTextColor(titleText); + panicTitle.setText(R.string.panic_setting_title); + settings.addView(panicTitle); + + underline = new HorizontalBorder(this); + underline.setBackgroundColor(titleUnderline); + settings.addView(underline); + + panicSettings = new TextView(this); + panicSettings.setPadding(pad, pad, pad, 0); + panicSettings.setTextSize(18); + panicSettings.setText(R.string.panic_setting); + panicSettings.setOnClickListener(this); + settings.addView(panicSettings); + + panicSettingsHint = new TextView(this); + panicSettingsHint.setText(R.string.panic_setting_hint); + panicSettingsHint.setPadding(pad, 0, pad, pad); + panicSettingsHint.setOnClickListener(this); + settings.addView(panicSettingsHint); + TextView notificationsTitle = new TextView(this); notificationsTitle.setPadding(pad, 0, pad, 0); notificationsTitle.setTypeface(DEFAULT_BOLD); @@ -317,6 +343,8 @@ OnClickListener { s.putBoolean("notifyPrivateMessages", notifyPrivateMessages.isChecked()); storeSettings(s); + } else if (view == panicSettings || view == panicSettingsHint) { + startActivity(new Intent(this, PanicPreferencesActivity.class)); } else if (view == notifyForumPosts) { Settings s = new Settings(); s.putBoolean("notifyForumPosts", notifyForumPosts.isChecked()); diff --git a/briar-android/src/org/briarproject/android/SplashScreenActivity.java b/briar-android/src/org/briarproject/android/SplashScreenActivity.java index 60712a583..e74056341 100644 --- a/briar-android/src/org/briarproject/android/SplashScreenActivity.java +++ b/briar-android/src/org/briarproject/android/SplashScreenActivity.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.os.StrictMode; import android.os.StrictMode.ThreadPolicy; import android.os.StrictMode.VmPolicy; +import android.support.v7.preference.PreferenceManager; import android.widget.ImageView; import android.widget.LinearLayout; @@ -64,6 +65,9 @@ public class SplashScreenActivity extends RoboSplashActivity { logo.setImageResource(R.drawable.briar_logo_large); layout.addView(logo); + PreferenceManager + .setDefaultValues(this, R.xml.panic_preferences, false); + setContentView(layout); } diff --git a/briar-android/src/org/briarproject/android/panic/ExitActivity.java b/briar-android/src/org/briarproject/android/panic/ExitActivity.java new file mode 100644 index 000000000..68bef09ec --- /dev/null +++ b/briar-android/src/org/briarproject/android/panic/ExitActivity.java @@ -0,0 +1,40 @@ +package org.briarproject.android.panic; + +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; + +import org.briarproject.android.BaseActivity; + +public class ExitActivity extends BaseActivity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (Build.VERSION.SDK_INT >= 21) { + finishAndRemoveTask(); + } else { + finish(); + } + + System.exit(0); + } + + public static void exitAndRemoveFromRecentApps(final BaseActivity activity) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Intent intent = new Intent(activity, ExitActivity.class); + + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + | Intent.FLAG_ACTIVITY_CLEAR_TASK + | Intent.FLAG_ACTIVITY_NO_ANIMATION); + + activity.startActivity(intent); + } + }); + + } +} \ No newline at end of file diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java new file mode 100644 index 000000000..13556f838 --- /dev/null +++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesActivity.java @@ -0,0 +1,33 @@ +package org.briarproject.android.panic; + +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.view.MenuItem; + +import org.briarproject.R; +import org.briarproject.android.BriarActivity; + +public class PanicPreferencesActivity extends BriarActivity { + + @Override + public void onCreate(Bundle bundle) { + super.onCreate(bundle); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayHomeAsUpEnabled(true); + } + + setContentView(R.layout.activity_panic_preferences); + } + + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return false; + } + +} diff --git a/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java new file mode 100644 index 000000000..7fd096213 --- /dev/null +++ b/briar-android/src/org/briarproject/android/panic/PanicPreferencesFragment.java @@ -0,0 +1,14 @@ +package org.briarproject.android.panic; + +import android.os.Bundle; +import android.support.v7.preference.PreferenceFragmentCompat; + +import org.briarproject.R; + +public class PanicPreferencesFragment extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(Bundle bundle, String s) { + addPreferencesFromResource(R.xml.panic_preferences); + } +} diff --git a/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java new file mode 100644 index 000000000..df758e295 --- /dev/null +++ b/briar-android/src/org/briarproject/android/panic/PanicResponderActivity.java @@ -0,0 +1,37 @@ +package org.briarproject.android.panic; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.preference.PreferenceManager; + +import org.briarproject.android.BriarActivity; + +import java.util.logging.Logger; + +public class PanicResponderActivity extends BriarActivity { + + private static final Logger LOG = + Logger.getLogger(PanicResponderActivity.class.getName()); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + SharedPreferences sharedPref = PreferenceManager + .getDefaultSharedPreferences(this); + + Intent intent = getIntent(); + if (intent != null && sharedPref.getBoolean("pref_key_lock", true)) { + LOG.info("Signing out..."); + signOut(true); + } + + if (Build.VERSION.SDK_INT >= 21) { + finishAndRemoveTask(); + } else { + finish(); + } + } +} \ No newline at end of file diff --git a/briar-core/libs/gradle-witness.jar b/briar-core/libs/gradle-witness.jar new file mode 100644 index 0000000000000000000000000000000000000000..561041d3661895d48bd396b342d9c043ecd741ae GIT binary patch literal 20436 zcmb@NWpEwMlBQ)@k_AW1%*@P87Be$5Gg^4WOcv{inHeo+W=4xGW?WCq+==~WBR1m3 zZbw%~{m88D{!>rBnOTZ5Um;+@z@VYQq(fcB!Tw(0|MB>H!TcR^;;O>*Qt}dvU%?dr zVOakI`~vr{0rua4_P-m-3Cl}Kh^weF$VuGFO^nOR&@;@!%h1zIO-wf^GcB<0{NDQw z{y!G`>;K;fq3?{ZlE-pnH5jto` z*q?sqeZP2U7^o5lEazev;LLqP1Jg3~w5FxUOnhm1I z)MzsGq$xVq(wZ-E6U~|FSBXqWaO3B*&i*#vR+zZzGZxR;9Nxi7HILJz2-h`c+leIMQ$uR`f*|9XhPMLYK8&8+olkg7SHo!7gENYkh zol#hwj@Z|w7sWscAP)nJHI!xEv6e|~S+oO*{SbYYM|L>6rk1F}8FnX>SuTjwxj#jy z_r~Q=D5xG?ktOLAhI?kJmK}>aRdQh_S+<^+rN^*66C((VgB~O1J+*Qx!dCkizDwjx zAN0yVfHj-aRFEXbm|*=31Fh7gfUOu@|HI${?z~oz1&UQ@Ly77n7RAUHT#~#L;b@t5 z=1T2)Yz`<)kM(9@G2AsjXp@G`xZiZ)L+s=>=Q$jv@^!StX7F05wV`N~ru-G7%0Zk6 z{ZnZ-TVL)u+JwYichv-3jcNOFXscAksM(p5Pe!dWvY4T;QHr{??$N22KQ`g~+?CFh zkw}^gGIi>MPuWQ2MpT{P%#h{h5?^$6L4~K0wY$m1@>0Wd^#Pjz+Nh?AaVW+OIT_jw zWE{c)rPEzuxuRy~(h|hBgEuqrNR4BG^CKm$Uy9t+MJ_jZ`$?(SxO&kZf9imy-0PR# zUfgbSJ77?4C!&BwUodUfa)y;gp``E*$8f}Ps(xnyF&T611{>0pOy`LV3NB~Ac-?dr1Q_urhn=)N?m5lNpjWaklL*ibiEF*f` zpUn5ABzw*K<}(_o&h)AwnXF$oFtRyBppv)lRO6#;-P9Cz9c+ zjEPH-M=CcNTA(AUy}$<{33l0fnls@6%F6X|N~=X4Hfkw_d&R{}s7Ga0ynyiO9e?@v zRTS%jTG+E-hN!p|d{|_IUthD{qZZx~e6sdPr;q3->ZDQW_h>!iS^ZNyA}6`XuT6cP ziT8}gqiRqkYirUphWkB3M7yQPl8I5Tu)g_5Ra?0P*U@GdBVpu-XEldpQ^REXvQQS4 z&8c_5Q@6XTYeA4q?c*I~)5FZPCML{{Z6265-BRtr$P5pnwC^2PA`Vzhum}=Bc zh|zc?u|2o*-{FI`hi`FJ1YAz&{9Hn#@fm)pM%1|G2WDbgaeY}XtsT)q7TnS5iY1Kn zgiZ5mc`ua>k=qqKY!n0mWYoFV?BDd?Ro*IrbZ^|`bW{8=OdHoIw2RNCn%szFI~r_I zLuz*M)pR8O!AHJN?Ed49HVKZ3>{5>-`>zYS6m=T&s_kR%IY#|_M#1GqN?DQPTK#We zuU~_wb;;Tp$fbG-z0NuV1Sg|rvaUV{!;Y>s$~`N5-jP#+m`JQ(dl2Do1+DpBeun2_ z#n(S{FqR)SwstB=jkm@q?-VJQ1qmsz83bq(8q~UO!6A>IbcX#&f$Q&CA?#tJ0a(8*>z7G zyn=konQzX-0srfpmwoMq(A= zoqIRPmjmK!{$1w+l_sSeTILjNwM-yW@a#&dFURvdZ&Mpp`eC(tZvY;j4(>ft&A(!^ zo|4}>vmt@mQeoE7GTXtne{*bim+EQ1I;&M%&|oM@`O=DC*hGk|bLJEYRpLNe^;JgA zvv%Q<-4(nF(yywyJE)~9wnhJg+UjgmPB+T|^|!-{!8KC3s8^@`Apk)#qsD|h?C^R> z^MDS4Ggs1g$Tcpi5WZ%7pDi?hEPS2K)l@XlSQSSV15f#&CV!Gj zh~m(R%+9>WPFAfn{n(4jYqSuSeEvIRe{f^ggtEvaJ!bra@eoBO)qpcSvJ-Q@xce6^ zg}_r&;%T^0Y<*20n5v&! z5nWp_%7OO@TjSXR|8AeFg^8_Ugm+5M(d@^ZQBQ~{!?DpgH{rHAhj%tNW5mRd(Ds^7 zlIo#ST8nGHu*Sf#36ej=j9gY%fZ`e>^!ME1d5v(;C(oM~pXkK0$-oO8I-=P#ri*v! zhj=BDV^cFu&wxwwuSxg!mooGpoTzQ#M<%MmKXL}Q8FVP-FGG!S|DaE_{76p{dLsO1 z_@=_&?koZY238Lb1}5-t#5ZIHMvjiQUIr$%4lZuaW~~1i=47kCYM@G@eNaGPETc0M zMJ|=IOG8_tZ3i@m8&ZF%5~j1xWXL401a7)EAkQzYt(Ew#lr&woykj>((v>Xco^rou z^4VRUGbm^vN+UEhuzFnVcX)Jne7?O78-O+MX#n+#Q)1x}Puu8PoI|rF!<_4kHaR>Q zFnLb}5Y29^HlZmOZ8=oFTVu1PwLGcAM1x4|(hpBW=n8O7G%GqtLE#|%(!~ihLe<;0 zpOj|5;dKc2>b`F5q*~uDEJPRs$F!C>+9a_^ZtoRDs734cN&CmX>t@O5Skv^ISgXh3 z*H0wrHe_1+ppR&d5SeYF1I@0}mGBO~ZtMYvGO@<`xpkV{s@Mw-o$-ePMv-D(C5FDS z6v}YMtR&NArzJ|w%`A@nie*k_I|JHZnyuhQ2A|aq~rsDeOr&1*(@$6{r1y);Mq6unQ)3-cUDm$%1WAI zac?Mk7tKG@iofDmN319{IW1_RXMJ?#fi$1^Fs@G=*4G@?jA2l$r;)pu5v@>vBAwh zw^;51Ar!k@!7L}`GGRU>0>_h?#OQocN2Xaqb839Q%fZn%jSCDmJV|Da*w>B1acCo< z!Rg>^8de<^0h}YMbVdj(^I2tvU{=T%L`IvHW_SeZ@!*&deBx%9OLX%1Rv0A|Cp_xn zvC}hIwe*|cdC~9=$~iP)gYpj8TJ8cxsP&1i(WaeA#U&JzjD@e3qcEbi4SRI6%_mAqJ8(2 z8}eG99ocWZ`UAhG-!tdN)=h4@jqzt=(DF9eqZ!WA<4fB;!EZ^_i!kgZNnesyTG{*~ zZW$DTLUjQ{?afmpjVoq`u_x$UCO#he6+52%*Jq)QbWUZvR5O%U-=SLb*n0bUck(Gq zK3Z$hz9R-KMqORweBVm5&UR6P-oZ?wiOCtYQ|#xURh4Cebz*5Q4k6vn)Lk zY^c(OktU#1zYS1+QDlJg1|31t36FS{yh=iL#2=J?&OGsV;e+ILMW#=k=o|nNXQ#up z&L$>KZcc2^yy|M0gk3Z^?EZPo(i8!|J<%$}zm=@wR2K0w`$U_6v7m^?oTWi-wAjNV zE7`oHK-Iek-NWC5;O`9Pk>24eBY@M>DJSrXJ36_O%B-a}1hKA2M~v9g@*qC2!D%y^6J zbDp~j1luAmZgORWM@FvL=mwckk%ixXs@Y zphm4NpA^t|M(@)o9Ge-@!ee(AkrlGK-TAN86+8}b?t1D%hLk$}qYzxTBrNe9+~s$C z3Gw~H-il?r1ZmgCc&U;cn>*16ck)YW1JPjbL`LIz=vQkgt0Yc^Iy2w11cA4Mge)+v2{*z9rKaxle;K0CM{;GC{e}hi{Nuw$) z7+pLK>`y^=qtr>Vz|D}5LT;HvGt3nsA~})7R3VXo(8f*ZIn5JO5BGG_^v$UWkxu&^$rI!XyC(HBzqigNg8OFeD(#Bx%yc~r%|to&9>QDm?bp~(kFLkA z(Sqqs7r_9#%BbG7g}vScVR41g41sdon|J~|C4kz}yhG|^SvYw#?< z_-#3oVqdK@u@Sf~VBB0w(PB0+m1Z*@Kt7id@7g6ALyrAMvGtvW22t9I-%@7rKr_gc zT8jN=5qWaoFEFWNdox1~=46CXpeX}u#uiLlrA!D>aO$mnQyL=i_!7m_+v=5T2&fZm)5&mae-b37~iClfE4vo)8)`E z5+kX^a*isNGSv^RdHL?|GDowF6^-;)iT46b8p2abT??QqusU^3S6mezqs>yfPa$nl zosgFtx0*;&^DC3LmRPyq$I7A&;6@p5W|hG)q$tTm5fG)}<<_w|UJogC-KJDmX3*HT z&hu=c`mJ4r(@3r4m?dEHt7V+pOL9D(8IWcGC&VOx@1H`64zEhd@sdp z+!B8Bd9@qaG&hA!Jr1!8BdExCi*w$g1edoqsw0~t^aeX0VKIIm?}Whlp*H#Z zc$hH&y*pMHi31tbik8+^he;23g_TPx59F3&L6Rc7Z=_g;%M04jQM45CvTL?mzm&j5 zU~oCu_AZ9Ert>Rl)YXPI+58?x=_C#9PPeI)^q8&(p z4(z!5yoaCt-Cii5V=83>>i0!np#&;y%}#Hj`IW7J^zFQ+^G|H2tqD~!gK!o zc%%zKqmgoXTX42m$vnC8tEmRlBFpev)^qOM_z6`>w;V0xmK`_W zb$|Y%nBU)cfZvj4MXhbL3!*u^vGTjUD1Y_gFZ(`uEgWuIY=v_=kvSCasT6^@2Q9|) z*`=aXFl${YeA{iWR_v(h+`ClU2NI&VRYUVK`Eve}^hx47*IfOgrtM+3j0Akdq-AEem^2i|s~xxmG@^ps4mv*?ZxkQ>9!M={0voLnHK zxhNm;Z639;9QgD763-z|@U9-op2p-vp9p@!OMCXZjZ`U$`(B1HMg=5SOITe_WaoZE z>oVlRW;K^LMvmKo;|uQoe$v64$aKj|LU72LO~NN}W8Nw%<$v)bl+weZI@@>aoTle= zX#WXEZxV%V-X?{4GmA&u_v`k7%{IzzXjsLoJo9}mew-kOTSd6D&FL%29@c^NkMGv^ zY}{q#-O_S6($N!Cb^2m&1MMO2$r*`&$-F|uX65{hHJ*|9iI8xE9T@rdaXjn(3x~tz zAFG@5W~RJ(+dEQIA38KE0ABnenoE@lr2#_E8qH|I8@gs{2{Hm`N z&x4%4dEY|^F%f?@%A8%)&%9Ls=0*CqC6x?6%^KI^rgc>;+7{5T7uT8Gx7=a_l zLqeUERKuvu;wdO&Zl*D`w>0&}D&J^FL7A&dH030&<;uK?nI>QF->MTHWt$^QMT?>Y z%`&6tN!04mun#ooFm+@ZxKdSBF?FQjrO48EbfThCP)|#}d|a6syL4#uY`L|FEO;0; z2h|l-3$Zq59&Snd$;u8!DTkx4@=!=G7T-kZPKNbt;l+6g-GP6)A>G?Us|zV|y&m17 zDwEr&O;#n^KMY!t0@WtD6RZ5}K@UJX_XasznZu#%og`hjTNTl7We+eJp? z)zVN+s}RIlvNp)i0bYVAysBzTvcKwM;TwC==W_#;lat$?VGxoxqX#ub_G8|35T1_k z*3c(sZDQ@a6;#HmAop`Y#~<4gJvdSb3Inj85bCnVZX<%RZky~MfgN?A;>*J4Y(qhQ z@jd6nftc2x26T#{a?K%OrQ?Sv5?mg?8rpjIZ=XtP7r(?gpsY{#amL_lz{}>fbrdu1 ztZwcwGWL@_$Q4v=s~k|5rwhHJ@nq)>Rs#bl#eQtUv+uVCX_h#)LeC$wQ&Y}3jImQv zUhg%ungbB8Xxm`wf@HtU#XBYs#Xyq=QJGzSd1(qEa(+@fh{T|?_>(I2N$gy&C=@+W zP|(kD0%%*3D!>^Lq1^Yj=9d<&I{Fzy&m3xs%(v|A3g=ffJW?rZ(z<;~*)Jj6+2|UC zCCNITllF6dzI7|#J6(J*ThCOxe#`YZ{*NsX!hR?9=OyRP?+_M~c@)(-GgtJrS;e6% z*bPe^N4U^%9mjzE2ejuBCzYOC0klV6@ZG&vN4cK<+f&D$Bm&gdRp+AMRQkk>+FN~( zo_;4w6o;P!I&_3bBsL8R*DWo3b|H~HUDkT1i_?{&(Hu1ScZ1zX3*6!T2 z*`a}%13t9b+$Wa1mScPWareD)A6bl)7=#ehJQ!w=UzIxEb%VV{>{qzM!tXzgGG4=LxUEzY7$I+ z{VhDF1EoJPV)t~VRLbc<&X zY{oZ&up7Eh>V~(Y&h}4lmX5c^u5)t28yt+cvnAP`OIC*?Kba;J!eI_;V@#%e&t+>@)8SfvC-`@mWo2@*J~;o(yZ-IoW6_WnVbo*Ml12{# zjgOC6LVKl$0qq%eB!c(M(An^A>r>dU^qV7rsQT{6@CEwK9KLhvLiiC?hNRqKw53<| z@T&cKA5!kuZ0ll_kh}M*0Z*T?D|b~KMBCJSFHB=6+*9Bd5uh_O;WWt+JE2hT3{H_U(P1)|}L2a|7LVBe9zz!d)tz3@M?S^r9F zvHxqr@n4EUo-)*)qZG7mJhhd}|@`L%pFxH0tt~#GxIy2E*lXrE?BkP&OpD z$l7;plR46^`MYkNb^bY0xAnVUE4^o}5t|<~z5?&exgVVOlqZ=9To@RU>)_rvlbz4q zHd{XZf?Iz3^kA>ooIuoS&h(7*`Zw^$H!Z=Pd4KC6SiFnZvbrn3F$Q^Ud7C9FwDZ+U zs}BF!{a4Iyaf}EEREB_cO8#Yj!OVJi3zkL9YN}G>W27Ki&f${i{M^Xa&U{qOc|Nyj z-VIjp9Gx|#{uxz@9}cadyEC7abwOOBc2j>?Z8MEDNc^U_971q%v$%#Q^E&MQBtxO= zV3p&WWUy}J>RTOI7KlQuc4fWX+BH3;+Jqts2P{lTG zHc(Il)gqc%aZoH(>Tsptd79zic(F2EQXOPh_|k~=oPlY$2Z6+h!N4x!ALWrO7(t4O zf7(j&s8*(Dh>GK`cao11UxT#Z<4nde_<&ylk7|4vun37$t~6ArsOYHqaGNwaLWrRw z$z`sNF32?@_hYk)FdEQbb{1nsBD0 zUMB8TIP0!H5h-mE_uxKLZ0T{o((c+%BDEk@I1zTs^_!e6BzfVCAn&c(s5jFbBgwr9 zX&({_7E5SKHNajnSUI{FG8x17Y@%`^RYhYA?x$IwNmj^xRhzWm2nt>o(Oe?1Q_6p| z?8<@^;^)xDiM6`M_S0ebZYb~{s^xqHSbuxZT@DvuLqd6Nu)P_sz+Zp37{we|GbN}n zf6*`YY%LE6*eiTuR#Fo;njNuMs$i-ATUvo7N5*ctA!4L=3xh^pe_&Y`g@T`VROS0h zGxy5jEHZRgDN_6MB+OYN&{?nd7N8^Urw@|z5#OghE9sTY>l0NHC2fw#XX=k%v29Qk zYSPweWU^&fpjg6MZGOHe*iCv$j>Nn=LGl#m_C{{je5$01S;#Yw7U?0CXF}&ZCAqIM z_k#0s485%768Dw*`DzBM6lXO~P_ldb6cm0po~&0@Jba?Bxb(CBRctL= z&nGbis_E@H-{{rJmo&D@i7gyreDE4Sa;7npcFi|AO)o3n_sac>`#GhH zGYpt2t0$aphQ?3k`)QwVN{&`)`+#7LS?yV_ANhMM{$p3ap#0UZT+nOsB>NGsL_zC} z%hX{g*ULeVYV9LfBE;|-O!|^6{xaR{p$t`kI5L{j1_=vmo{D0$x4UvzeIHkwHt?pQD1%STd7jT2rJGp_Tz|NM zrrN|PrOgb1uI%TqoVAf38kG~ABQ;9_&?3T`hYor*p&3s=H7jRFpRFNfEbe(DPbs{6 zFYadFWwxpuDjU(L;pEuKHIHRH?*<9SW ziH+7oW3cJV58@Xr>+p*{(Wm%Ug_&cc#<>hEevyKocrYpD2j8j4Rf{?ts50;=AnG0z zQ1~@PUd4}ZS6pDUVdC^f{-9&wzjRL_bTu@*QwZRR-tf3H?2Kk|sfMD&>J6aczc^`M zmK;Iwe?{JA0pZh|@g|?rF2u_`9pgE6hziPeu;At)&c8tO7u-c}qQ2O94Wjt35%XV9 zCFXAR4j1Nbp=Ij;FO4QF)XfbCnF|Z??mUO`rN2x;VP3kV|cLBBSIIXXIYBHsMqz!|WG$;DPM=ns8>^tG2K z(EB3gm;b@gOzR1%lWz=%RwxXK*O$zIueI?!DFi9M<4^=bU3F+*27v2+W` zCjom&dJ%ZfOfTFj`w?~Q#C@^cBX<|_p_l*l9RC72^MCc@sGn${YM^~~kuf=8A%Qa_E7#=%!6Zs`AnnW=k^`2A!qNzD6-RQSJwO*Dw+Y^huRd%kQl}DjA}T7{6h%CI0>vDc zTS+s@#o2Y9Nf1MdIgPR|#ylCyF{X|DJ|w+=Ndv~_5)xO2&3h`Ph21|p>~+V)*(#19 z>5KyjK$mg!Fjd3qtGHJci8uPg;(*;8YGSbf!+y4#u*<6JqJ4^CH;6C8nMe<7ipKmj zB#Ff_fFbD?9p@Z{i{oHKRn>&QINS7)Y`wlYR62?j@jE6tt{7U1GsaRr^{z-Pi0-bL zwKfS5TGbBX{f3Qjc+EU5?_YBYg*9fKv|**8Qr3ELCHl8cwU^QFR&w)ts1~T4QZFUI zQ}bO)GwhzlcjZ^DpPIlTJQbB>Q8XBVvSM^1d*M5i=r2$tv+Dps=QNcaISlK*W5s&j zxylFtl#;`QMh;>5kdnx29NCKXP{k0RqT}CAXQ-LR`3I$$`HA{$p>>yU47RT{sSY2x ze5%i?W%r7#g^W#+RkpMYAjmRSE3nbE5<)4);Z8(TfXs`Hb6Jsyl2Hbgf%|!~$iDnJ zo)DzBq9>Lm!dYeLxwfl%7f_X3fRn-q{TQcpSjdw_((@2iiQF7U!`zUvfe znU4QYqY_TY00^1=Pq?-R%SeVb@4NY@YX(ch;}*IT4C#;WVb{sg46Z8fgE4U(rVHcv zi;G63gxQWJgwh1TK;vHZs9&eIEH?h0kWP1S z%W<@tQOdn2!2~TeKpt`cGu3UidBmd-m%^0#?K4JLrxRi(T~k9q@F z-4@D&JR6KMSCg|W3?eM+39>S@F<&^nnBX&j=^SR89M@wXpfOF(zny44N+OdtktHte znGM=?{wyY!Wyqvi&Ho*vESqA5t-{6mgYx!BqfdrqiZq`n1~bH=2Fd8?OlEn{M&!Y5 z?<;#|LH45{(e{9j%}7;C86d;4C)LP?O96tmuh1dMOb2DFfSAcz+wYW1}5@a~{%@T1vKSljPEXsCi#7CwuO zj|{_;(M8t`o9LHp10j@vc5f4kx`sKs84D0De2bFkAYkT+UMz2cvYReIS_Sh?>XMUD5>pz=)rii=u7$Lj%D(-W0;s z3!}X$9lSG^@+(1}1G1qOLM`1l&BHH;LSq<02%yQYCnPY)uioGhUUi{7hgWy>u5?36 zx|!$%@>Axa77c6x1Ot4Tb~%%O614E(p8bWHSi%C+X}ORqdSaT4JrJhh2dnqQ-su*w zTfX;^)me<`%JQYwHHk(zdf1b*AS;WMEe-BH>y6$d07Aa6j|qPTltT#|D=-= zPGb=2Upln`z`!K`Ejs<9d4la@|8`RBT-48}7}ixFdW&HbQJxJeBDq(y++O4_jiBpMixL z<7UH2+Dl`Ywtlw@#uZ>gin(?4XDgm$6&dN@E5nf$N0AQS*lCO6N<)1I3hLpCO`=Z| z7&aH|7H3t8P}KnNtOM1I1V$?l2I%NSEOg(snAtPUG;yN|mEy|8#UBv~XW1$y-=y%GSa5|hs}={aOEEM&X-RQIBVc_)$5VCQ+0Tm%h6F6i zZPjQE;B-?u5;-eQ*4pdaBOw`Uj%HmPcJ>Uj0eo%!^#_1HY4jISG%DV) zus0NcdXd+0RKgleKi@-kuu~ix+BG~>Id!m8A#}`3l|_^$-WmpB^FlDZj4=?Gzm-&| z^HCI_zLK4bWA+cNi&KMEC8kcWJY3~xbCg|@#lhRLt-YFL=j)nmPg0k)B@p*e2*hgs zwsxqgoL*W$Z&{tddWH+<)Yoc0bp*LY+qT{Q)tZ69CRcwEC`@rQi9z@;XlT* zlWs}7Xd^_IU~XUR%%2%Ei=iSS$toLNgcQz_m2qnBB(JeJADv)l<>}Ad@vy^~2gVJ| zECH6y^86kWDpJaQ98h7!PV!vMM&=s?WCxZfrgF%ti`}}-@t6rlr6ewJ+{jQxISD9E z$s`=sMX*|a0c+4&jK;~wa&D@aM(A(~w5C$7#$qw{R;brxpm~YZ8MIBHvo~`iq{Hrk z4tkr9{Wr#zHS97Sw(q~3uyK?(uoaYOvjuIwOix(v4C+#y@om}VrZ|F6Gt+g+tw3}N zT^BbJ2||o7Jx6&;^+|Qo6$F^*zN!GC#?eD)Z`n%xVvGwhx>}7szV5?!YRN_Rh?~gl zLqTCJL5#0(4I`tSXz74&712rSxD);kihgvG=<|6BFnX5j6BsAotSEWZf@EE^TE}n; zjKj(>XFhAlA{lg&o4zJNy zsCWW2jBtJ}x4ZiAivP;OX#dmOz{pjzr7K(ev}A2opZ&;B2ByN$=0%{N{F3eYCmFWt zEvb6sY0rA0Pn=CmjwCAN{5NM-ns*cj^?*+{j6Ma22n|+3w~&%HxhtEOHF1^s;jl3> zoL7;mUE0=HaKeHopkWfPGC5r@zi;=PHT4BKo&kM<8f4Xp{eIm`6om83{6INpC0!h_ zZ!FSM(<wk*`;3+eUyK%H>uz9VCIchr*Am0Jtu3My zgK^!lk=DT+XmgPrfIIiS9K1vtnAK;$9PjWv7_cRf;dk_`3i%oqZ`u>U?@zckyNkUn zjK>vsIAg|_r7c@y1@Q;~5epeLh6 zK5pCC+eK16slj`NoQ$zGGQu-oY)|s~D084Tst8HBIttm46u|ySJEA!NvVu(tt8kRB-nX zc8+yxAkP=dH^P%jEaz!jvgiJYC$%hmGQ=PLkOq1#kZQA^S;IlbtJE_ZdMn zf|}H$I4q&Rv#Gy=RiX5fe5nL!OWU>E+V`E-XI|Kgz0_Y06V7cb@d}+aK9umx_l#Qk zTwI_?g=3U3HTXPkxpd!VA59wk_%j!!I@g<%yMCm>O{ z0M7Y=%|@FGo2&py?RZP!GuZwM)6fp?MJCwx@#)oOY2uOMmqYC&=shWUT!c{z4z$s1 zh=&nqkW8=rfSK48p6Eak7faUk=jVA+O}2Q&p|j6MVSGA{MYw}o1gL;2`Xv`FA(5Qx z!$Ui$iV2;LihlAr(J_AGgg>#4h;Zr(ho){9)o#ImQaFUd=cx&6m;3KiKvBKtFKQAA*+f+u>1z#EeJ( z<`5B7jA5W$v0psm#6{lT%v#3YeEuQFHlkW=n6f$EIbkQCE#iLj6YWA?DH6!upNRs? zU@UU*X$QP0GVfs?gOK3s94T@q_N0L(SArLfx`#094aY0qF=&hm;tNR zQ;q`}p|!G&!cM;(t~4kt<1(#9?2rt&wX(p6W>c^hcy#HRHllHNF1(_$5`{T1DN^C*nJ_hA zEm$SeSj>zkG>IG^e@Rk08tAFO;ZK!w{t0;kt$r1N&_`g&Sr*8!0Y3xr!aq}EwJC84 z-F^jMgQD9QtX<``B>q%N@X1IoQ^oufG(EbS2chWC& z33oL5QDOcfY+bRev>r|z+n-1s0~b6)=C_ZI%|FohY4uGZ$YKhnB)@;hifD?GLfdhh z)zNgIG)FxrD8BS$kZ>wvKnecD)EYLsOhyr%C*hJ)jE4wFj(r@cLF0fZRrnehtnWXn z?EAopmqFC-^5|s8K_FeT`}Z_Ymj5KgUK<#r8|M5EV@`gJ-cO>?h_LXQ0v0F2+lE5# z?AGERz}21I9LeKkM|zCVP;0QC*!h4}x}P|fzAJ94(hs|V^Z`iDfK zRvq0?C46ronY?ij9WEN+i}BY%Dj~dagc$e*P+5DW#7$6V#YOcw6`S0xzo5+RG3iN^ z!2E)capnx$a~XF@&+pGsDQ63JJ6o^apCc9)9_AMt!ycEutRJ7txo?=i5PZjKhn-~7 zN14Yf9G5G+1PC8ll2RR9rpL3Owk&? zsgvN%(FU;FL$v3qub2x?%|xhMtY4S7rtx+;Jm7ON4>j1B8tLkr={5V}wX1)?CIaB+ zB!QVK+;!ClIH4@lSm?Aa3vTi*^Ot|Ps)Yw>po&nUnKqJjum*!WNA&D7JJUdAo44@W zEDdJ;w=aM4`{Sp?C5EER=FGU=&Gl24XrKA4uqIe)!?4uPn{3Cor)vdMcF(B#)T)OB5i(JUNWko;Gi*1s5#T~G^!1=IO_IslnIU4!UjFku_tyN={u`wkam46`}mf{D5j+Ml{DL zg^-eB{f-tPulO=yd#VqHD~dbl_L$JqYfcy1;^S;$7i&`#PL%yixFSlzk)0_0tK~A( zBsBXzbZ8mh4M@JqaA;87OK`WveLj~^iOKmW|44|FYkwIY_ zW9-iQx;>BlJd?#K8G~3>f@&gThPJjN1-Zj38)*{q7Z`>Zz22W%t+-Z2{-`~4A)eJ> zqG|kwHbbEy*MBRSm7pE^(06h6l~{@rCydZobr6QHa2KI5YVv~=R`Y7Owy;_F0@s;c zloqnJ*7dLi0(Hqo{R$OWmB^XPxvfUI%yG) z8B_^s#a*8qtn9K1#5JX1Jx6=5(5*2-i3@j>Vrg5Z8^0A5MMot`5G<&-;nb6-Jjrh$ z>dB^1ro^-)c+eYX7%d2nXakc$_y>er3&MI2Exxa{&(`6XyljBx_>%51>==z~(u$Xsf4Rl|f8 zVfE*)T=*Ekyn^L>aW$%T(%gm(6cH1^BKI#fXr^}Q+f8*T-C(zrt{J@9{>GUh4n4$7 z1=9M~Z`tvF3c3d1(HHI4NpFu&{nE~7ajp~@eedqT$+B?h)DS6K1J1%7#^kO1eFW@% z-TrMy{Xv6k51>vpECRRkoxVQbx$2)j;$^q+rjOAX^%C2W>#q@#viit_pdEuRbqI4( zM#-MXh|#FfT3K%}%XbA?Pg^*2F;#)Sj>#!a7%5p7ibo-8zqIVAJDGrLI5s3)_Rid2B1ajG_~Z-3&Os53qX8?_7NY}(Y29tS zRSs>@RZdyQb1h0o)ooJ`7YtpQIrw+yg+~_`cake?FZ{!&!RWQ?*(>ET9a5il2bmM{tM>kw(CMU9pqMft6>a2Ez-%7dA z#<@@?m2HcI$hcUzWTPx9CkONP(-)BqAHZ%$T-r*&8)xc`v9utbHR|Rc$ZqV4A&5Vz z*OxwJ^`yeGE<(=iyRTuX&LnSvo8VLGfZr8*pK`DY))6Af_#G>Wi=MVBhJ$&-TgB89(c*=V?ylLvC01XNe#U?KZ>v_6JaFJJ|*{wlVqo&D)T5Y)>n zlWHCKdAvv$mq5a*YH2hKm2%atpvboveCXXM$QpLQ)-RTcEbHWcaNK|uf?NwP`!Ldm{Q}fzAU=NCP4*W)Qsa|v#O3UP) zXVzuq?zrFL^#oR5w9U!3-JZo|MG{3z zf1$rzxzXDRIj}@zWM(ZkIaEIM4J=;^vT0Q>C$~X^t!j&=N0LdsUz;$c9l|iPwTB_-BpitROA1+bC|PRb9Vakgd>++Os{1tAWTDt~ zU3}S9+XW!Nk1-R+CYD#Pb9$%$F6+fKGD*Au%Z9Ik#+D`ZszMWdC`SkV+qoR!KILZ& z)}%&-`106Ll6vpr3>DLnCWTue9_=Lqfur1L9hKd|Nf)pIqK~>@$9*mPtCz&?n+a~o zO?9W8g^4_t6Pf8x&6#-#O>LLzRoay7Vbe`h)2PGKXdySfGfQrA3RoV(+rFPsa1a@B zzvE?mUZZt+Y@9qKbN{r?1)~>X!}E28A8Cc1IUfE2U!GM{d z(_zEW3}PKWQGD)Xize5kDA-RLV3ZO{%p*fjv`j>@eWT;s)6`q#su{weJ~0j~W64d; zyucYYCvW|V?3$;1C|UArOhb=UG`I~18Y;<3`N)x4?8@6p9PA8osT(JYo91mKTn|SA zbBjok(eK19+I1-!*NfJkt2%{Q**=gL*4;fRU0*e0*0Bw+OD5Hqs49(O6kEfJPs{r2 zYb6ZvWP2*ehMGrp_`88B=TPi#YhT}#bm5w4-`rnX!_sS@m!#E;8Dp0mAgvZUpwi?X zrTg9O9+zY!UobjmM4Sn}U96{5h|LZ?I;S%Ig2=E4o^sQ?9augLjThHLq_TA}jT_r` zSDv4c&9tLzhMZ~oY@hmNze&JHcS6U7PM5Z;*^oyDu&n9rHa0Py`Msarc^FNqSXx=! z(zeBB&U|a4$m{1`r&LqLY z=E#!az}A$&@D^Qg-forhDw~w6RIv<;XkvPzs!Si8#dQd>X+%16q*f?#c5DLe%&C9> z?UfzCCeF@6juA+6jKV30H8S6(=nlM?xmKIS9`>fvC4+;=ii(l%7aWpy+XZg_8z$Ys{AUKwGvfOE@KPQ!6K<`mj?tJtgKq;!*b?FyY8Dc8JgxvT0X-q zG}fr6zKg=va|JphMfjaNg^zKILK_0BOOci8p2A1P)@*c(F}OS!NlUYmoUYl%TM!r2 zFB-&t|4@JO9@+?1t(V8*+)Izsiz3j}jS>8@j=_7*<>KPqnt{}m)D4pHo5Bi-sX;MH zMnIxy;{iiE%5sNYwLjNIH_lfHFK8#ZF1pV1nF%Ya+jw`OtRankf6EeDw{w;Z#n+Ke zm-sFGX03Nty6x^4QFPmt_zVWL>&gi)G&>f30JpeDi}GS^BCLDi)vG>7;Z zu9lTs70~4nPcw$t{N|E;amIzvU%l&^`93{EzIv1}Thi|@P8Q%Ji*hm?EeOXsLi!k5 z3Db*u5%^>u281Ed^07+$R_5dZTBUwlpR3V73}+L@RjR^;eqSdvAm9O>cxs+P))Lnf zkyk#J5JtnKlvSnhvec@qBk!clI%52uU`wDwnNW3VYoSa2WWT5S#h>#;Ws61vk0+%# z%;`f-el6oyzfM`A^kQU#(>#Mu#rWLO*Y$4{Z;=$d1glt#kyaf#h7Z6wx5gJ(3e}`m z__|@s$p7*;If9S%%un<>UAGKbt{!E86UD=l?=~{)GpHzxavL}iBEqJ z*>$Pti&J~tPqk31`P$QvEN(|#EL&{1mJA(Y%(V+{VvrC)atF zgsdwxXLDsC%SS#D8~C4j2uvTmgzfBknU|UF{(+x(PKkGdxX11(KSIlYq2a?D0}TV* z{@9#)l!&{ssJ*aRLm4k+e;2oMk*UUP;i~jn#gYfI8QNGhQstu3OIJ;LXV^!#^E|3$ z6xme|J^$w1;6D}Tuk{ik9F8e5nzKL2tSrK1{Et8$X~-|99bX_ep!~2-Yh9XLSf1sF zRcHmNNX&1<%VLAX2O`Zc9ZK_1;%8>OJ$p(>opY<_GdssLSR1^TKH7N?lKB*j;Wg*r zHMcFUz4jaOfuno8kwyxT6}{}#pu~j&u9)jJ( z{z5{=>8wh?*v(WQ-Z6*@eS%Sct@Nn*MOspNS`6o!2W7}MBksBnN4OH>+T`@&5qBYc z)q=07u3~{8ZM++kiA#2OrxBl=uYXsl&ud>Y`Lu(Nw$B*PDq-8VsXj&T%+4J8)g@jFPk$-pt+^c$#nGmYE}fXUvg9dE;%>V#uS>)4g+b{m}I= z?ma2qoM|)P^l`3wg_qloX!GmIUmMfA`vv2Eqv_hKp+mR65Qq~0uCowAv6fj)reBP5?I>lFf9+%L zZ)B9s+Yvz6+d91gZbk++gtuWvBEWbXp>)O9$;H!E3G-i2(4Ub*WJ2_q9&kPLIKKQY zd0&x5${1g7fPLie;p+FIUFkWTVn$JbE4H>%yUjY_iprG~6_Y*%>T^ZqGfMKsipp?` zQm+D4u@%5E_3}h_vg(lD{t|K?;4rbW?b`$VmHrF<6L23u2(ZkbV192;1)K(^K`}38 zMs|c8@VTA#2R0N~fqC^7c#4UD+6)1fjT3>ukV$UZErSV!+6-pK17P?K*3)hROgz+P zFa;>U@EZbKuqdz)7#6i9RT06(x~tG`=qRuWnAosmG6R6RcDdXCF#&hHZ@&0|y};*h zcf4>whyC|@eOnvctG}aNdGPzS!SmRDliM16?c4{?4BS|_;~p*jBksGm8G>EG4I?|Q zG73N9x@-Fg*c7~5xMTWI?MF=iVya*F4#BSAb?_Zm9e|_uy+0k$4^{ye`z@X92<$E@e=hyz2o9hTiCLiq OSn7eTVFr-R!tx*AKLw-! literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle index ec8b633f8..98a1101ba 100644 --- a/build.gradle +++ b/build.gradle @@ -5,5 +5,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' + classpath files('briar-core/libs/gradle-witness.jar') } -} +} \ No newline at end of file