김예미

소스코드

Showing 326 changed files with 4841 additions and 0 deletions
1 +apply plugin: 'com.android.application'
2 +
3 +android {
4 + compileSdkVersion 29
5 + buildToolsVersion "29.0.2"
6 + defaultConfig {
7 + applicationId "com.example.dataextraction"
8 + minSdkVersion 23
9 + targetSdkVersion 28
10 + versionCode 1
11 + versionName "1.0"
12 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
13 + }
14 + buildTypes {
15 + release {
16 + minifyEnabled false
17 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
18 + }
19 + }
20 +}
21 +
22 +dependencies {
23 + implementation fileTree(dir: 'libs', include: ['*.jar'])
24 + implementation 'androidx.appcompat:appcompat:1.0.2'
25 + implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
26 + testImplementation 'junit:junit:4.12'
27 + androidTestImplementation 'androidx.test:runner:1.1.1'
28 + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
29 + implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
30 + implementation group: 'io.socket', name: 'socket.io-client', version: '1.0.0'
31 +}
1 +# Add project specific ProGuard rules here.
2 +# You can control the set of applied configuration files using the
3 +# proguardFiles setting in build.gradle.
4 +#
5 +# For more details, see
6 +# http://developer.android.com/guide/developing/tools/proguard.html
7 +
8 +# If your project uses WebView with JS, uncomment the following
9 +# and specify the fully qualified class name to the JavaScript interface
10 +# class:
11 +#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 +# public *;
13 +#}
14 +
15 +# Uncomment this to preserve the line number information for
16 +# debugging stack traces.
17 +#-keepattributes SourceFile,LineNumberTable
18 +
19 +# If you keep the line number information, uncomment this to
20 +# hide the original source file name.
21 +#-renamesourcefileattribute SourceFile
1 +package com.example.dataextraction;
2 +
3 +import android.content.Context;
4 +
5 +import androidx.test.platform.app.InstrumentationRegistry;
6 +import androidx.test.ext.junit.runners.AndroidJUnit4;
7 +
8 +import org.junit.Test;
9 +import org.junit.runner.RunWith;
10 +
11 +import static org.junit.Assert.*;
12 +
13 +/**
14 + * Instrumented test, which will execute on an Android device.
15 + *
16 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
17 + */
18 +@RunWith(AndroidJUnit4.class)
19 +public class ExampleInstrumentedTest {
20 + @Test
21 + public void useAppContext() {
22 + // Context of the app under test.
23 + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 +
25 + assertEquals("com.example.dataextraction", appContext.getPackageName());
26 + }
27 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.content.Context;
4 +
5 +import androidx.test.platform.app.InstrumentationRegistry;
6 +import androidx.test.ext.junit.runners.AndroidJUnit4;
7 +
8 +import org.junit.Test;
9 +import org.junit.runner.RunWith;
10 +
11 +import static org.junit.Assert.*;
12 +
13 +/**
14 + * Instrumented test, which will execute on an Android device.
15 + *
16 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
17 + */
18 +@RunWith(AndroidJUnit4.class)
19 +public class ExampleInstrumentedTest {
20 + @Test
21 + public void useAppContext() {
22 + // Context of the app under test.
23 + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 +
25 + assertEquals("com.example.dataextraction", appContext.getPackageName());
26 + }
27 +}
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 + xmlns:tools="http://schemas.android.com/tools"
4 + package="com.example.dataextraction">
5 +
6 + <uses-permission
7 + android:name="android.permission.PACKAGE_USAGE_STATS"
8 + tools:ignore="ProtectedPermissions" />
9 + <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
10 + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
11 + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
12 + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
13 + <uses-permission android:name="android.permission.READ_CALENDAR" />
14 + <uses-permission android:name="android.permission.READ_CONTACTS" />
15 + <uses-permission android:name="android.permission.READ_CALL_LOG" />
16 + <uses-permission android:name="android.permission.READ_SMS" />
17 + <uses-permission android:name="android.permission.READ_PHONE_STATE" />
18 + <uses-permission android:name="android.permission.GET_ACCOUNTS" />
19 + <uses-permission android:name="android.permission.INTERNET" />
20 + <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
21 + <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
22 +
23 + <application
24 + android:allowBackup="true"
25 + android:icon="@mipmap/ic_launcher"
26 + android:label="@string/app_name"
27 + android:roundIcon="@mipmap/ic_launcher_round"
28 + android:supportsRtl="true"
29 + android:theme="@style/AppTheme">
30 + <activity android:name=".LoadingActivity"></activity>
31 + <activity android:name=".MainActivity">
32 + <intent-filter>
33 + <action android:name="android.intent.action.MAIN" />
34 +
35 + <category android:name="android.intent.category.LAUNCHER" />
36 + </intent-filter>
37 + </activity>
38 + </application>
39 +
40 +</manifest>
...\ No newline at end of file ...\ No newline at end of file
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class AudioDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String TITLE = "title";
8 + public static final String DATE_ADDED = "date_added";
9 + public static final String MIME_TYPE = "mime_type";
10 + public static final String PATH = "path";
11 + public static final String ALBUM = "album";
12 + public static final String ARTIST = "artist";
13 + public static final String COMPOSER = "composer";
14 + public static final String YEAR = "year";
15 +; public static final String SIZE = "size";
16 + public static final String _TABLENAME0 = "audio";
17 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
18 + +TITLE+" text not null primary key , "
19 + +DATE_ADDED + " text not null ,"
20 + +MIME_TYPE + " text not null ,"
21 + +PATH + " text not null ,"
22 + +ALBUM + " text, "
23 + +ARTIST+ " text, "
24 + +COMPOSER+" text, "
25 + +YEAR+" text, "
26 + +SIZE+" text);";
27 +
28 + }
29 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class CalendarDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String CALENDAR_ID = "calendar_id";
8 + public static final String TITLE = "title";
9 + public static final String EVENT_LOCATION = "event_location";
10 + public static final String DESCRIPTION = "description";
11 + public static final String DTSTART = "dtstart";
12 + public static final String DTEND = "dtend";
13 + public static final String DURATION = "duration";
14 + public static final String ALL_DAY = "all_day";
15 + public static final String DISPLAY_NAME = "display_name";
16 + public static final String ACCOUNT_NAME = "account_name";
17 + public static final String OWNER_NAME = "owner_name";
18 + public static final String RRULE = "rrlue";
19 + public static final String RDATE = "rdate";
20 + public static final String _TABLENAME0 = "calendar";
21 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
22 + + " id integer primary key autoincrement, "
23 + +TITLE+" text not null , "
24 + +CALENDAR_ID + " text not null, "
25 + +EVENT_LOCATION + " text , "
26 + +DESCRIPTION + " text, "
27 + +DTSTART + " text not null, "
28 + +DTEND + " text not null, "
29 + +DURATION+ " text , "
30 + +ALL_DAY + " text, "
31 + +DISPLAY_NAME + " text not null, "
32 + +ACCOUNT_NAME + " text not null, "
33 + +OWNER_NAME+ " text not null, "
34 + +RRULE + " text, "
35 + +RDATE + " text );";
36 +
37 + }
38 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class CallLogDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ID = "id";
8 + public static final String TYPE = "type";
9 + public static final String NAME = "name";
10 + public static final String NUMBER = "number";
11 + public static final String DURATION = "duration";
12 + public static final String DATE = "date";
13 + public static final String _TABLENAME0 = "calllog";
14 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
15 + +ID+" INTEGER PRIMARY KEY autoincrement, "
16 + +TYPE+" integer,"
17 + +NAME + " text,"
18 + +NUMBER + " text,"
19 + +DURATION + " integer,"
20 + +DATE + " text);";
21 + }
22 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class ContactDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String NUMBER = "number";
8 + public static final String NAME = "name";
9 + public static final String PHOTO_ID = "photo_id";
10 + public static final String PERSON_ID = "person_id";
11 + public static final String _TABLENAME0 = "contact";
12 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
13 + +NUMBER+" text not null primary key, "
14 + +NAME+" text,"
15 + +PHOTO_ID + " integer,"
16 + +PERSON_ID + " integer);";
17 + }
18 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +import java.lang.reflect.Field;
6 +
7 +//데이터베이스 클래스
8 +public final class Databases {
9 +
10 + private Databases() {}
11 + public static final class CreateDB_Document implements BaseColumns {
12 + public static final String TABLE_NAME = "DocumentInfo";
13 + public static final String NAME = "name";
14 + public static final String TITLE = "title";
15 + public static final String DATE_ADDED = "date_added";
16 + public static final String DATE_MODIFIED = "date_modified";
17 + public static final String MIME_TYPE = "mime_type";
18 + public static final String PATH = "path";
19 + public static final String SIZE = "size";
20 + public static final String _CREATE_Document = "create table if not exists "+TABLE_NAME+"("
21 + +NAME+" text not null primary key, "
22 + +TITLE+" text not null , "
23 + +MIME_TYPE+" text not null , "
24 + +DATE_ADDED+" timestamp not null , "
25 + +DATE_MODIFIED+" timestamp not null , "
26 + +PATH+" text not null , "
27 + +SIZE+" text not null);";
28 + }
29 +
30 + public static final class CreateDB_App implements BaseColumns {
31 + public static final String TABLE_NAME = "AppInfo";
32 + public static final String PACKAGENAME = "packagename";
33 + public static final String VERSION = "version";
34 + public static final String NAME = "name";
35 + public static final String FIRSTINSTALL = "firstinstall";
36 + public static final String LASTUPDATE = "lastupdate";
37 + public static final String WIFIUSAGE = "wifiusage";
38 + public static final String CELLULARUSAGE = "cellularusage";
39 + public static final String USAGETIME = "usagetime";
40 + public static final String _CREATE_AppInfo = "create table if not exists "+TABLE_NAME+"("
41 + +PACKAGENAME+" text not null primary key, "
42 + +VERSION+" text not null , "
43 + +NAME+" text not null , "
44 + +FIRSTINSTALL+" timestamp not null , "
45 + +LASTUPDATE+" timestamp not null , "
46 + +WIFIUSAGE+" bigint not null , "
47 + +CELLULARUSAGE+" bigint not null);";
48 + }
49 +
50 + public static final class CreateDB_AppUsage_YEAR implements BaseColumns {
51 + public static final String TABLE_NAME = "AppUsageYear";
52 + public static final String PACKAGENAME = "packagename";
53 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
54 + public static final String LASTIMESTAMP = "lasttimestamp";
55 + public static final String LASTTIMEUSED = "lasttimeused";
56 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
57 + public static final String _CREATE_AppUsage_YEAR = "create table if not exists "+TABLE_NAME+"("
58 + +PACKAGENAME+" text not null , "
59 + +FIRSTTIMESTAMP+" timestamp not null , "
60 + +LASTIMESTAMP+" timestamp not null , "
61 + +LASTTIMEUSED+" timestamp not null , "
62 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
63 + }
64 +
65 + public static final class CreateDB_AppUsage_MONTH implements BaseColumns {
66 + public static final String TABLE_NAME = "AppUsageMonth";
67 + public static final String PACKAGENAME = "packagename";
68 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
69 + public static final String LASTIMESTAMP = "lasttimestamp";
70 + public static final String LASTTIMEUSED = "lasttimeused";
71 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
72 + public static final String _CREATE_AppUsage_MONTH = "create table if not exists "+TABLE_NAME+"("
73 + +PACKAGENAME+" text not null , "
74 + +FIRSTTIMESTAMP+" timestamp not null , "
75 + +LASTIMESTAMP+" timestamp not null , "
76 + +LASTTIMEUSED+" timestamp not null , "
77 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
78 + }
79 +
80 + public static final class CreateDB_AppUsage_WEEK implements BaseColumns {
81 + public static final String TABLE_NAME = "AppUsageWeek";
82 + public static final String PACKAGENAME = "packagename";
83 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
84 + public static final String LASTIMESTAMP = "lasttimestamp";
85 + public static final String LASTTIMEUSED = "lasttimeused";
86 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
87 + public static final String _CREATE_AppUsage_WEEK = "create table if not exists "+TABLE_NAME+"("
88 + +PACKAGENAME+" text not null , "
89 + +FIRSTTIMESTAMP+" timestamp not null , "
90 + +LASTIMESTAMP+" timestamp not null , "
91 + +LASTTIMEUSED+" timestamp not null , "
92 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
93 + }
94 +
95 + public static final class CreateDB_AppUsage_DAY implements BaseColumns {
96 + public static final String TABLE_NAME = "AppUsageDay";
97 + public static final String PACKAGENAME = "packagename";
98 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
99 + public static final String LASTIMESTAMP = "lasttimestamp";
100 + public static final String LASTTIMEUSED = "lasttimeused";
101 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
102 + public static final String _CREATE_AppUsage_DAY = "create table if not exists "+TABLE_NAME+"("
103 + +PACKAGENAME+" text not null , "
104 + +FIRSTTIMESTAMP+" timestamp not null , "
105 + +LASTIMESTAMP+" timestamp not null , "
106 + +LASTTIMEUSED+" timestamp not null , "
107 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
108 + }
109 +
110 + public static final class CreateDB_AccountInfo implements BaseColumns {
111 + public static final String TABLE_NAME = "AccountInfo";
112 + public static final String ACCOUNTNAME = "accountname";
113 + public static final String ACCOUNTTYPE = "accounttype";
114 + public static final String _CREATE_AccountInfo = "create table if not exists "+TABLE_NAME+"("
115 + +ACCOUNTNAME+" text not null , "
116 + +ACCOUNTTYPE+" text not null , primary key(" + ACCOUNTNAME + "," + ACCOUNTTYPE + ")) ";
117 + }
118 +
119 + public static final class CreateDB_PhoneInfo implements BaseColumns {
120 + public static final String TABLE_NAME = "PhoneInfo";
121 + public static final String PHONETYPE = "phonetype";
122 + public static final String SOFTWARENUMBER = "softwarenumber";
123 + public static final String PHONENUMBER = "phonenumber";
124 + public static final String SUBSCRIBERID = "subscriberid";
125 + public static final String ADID = "adid";
126 + public static final String CALLSTATE = "callstate";
127 + public static final String DATASTATE = "datastate";
128 + public static final String NETWORKTYPE = "networktype";
129 + public static final String NETWORKCOUNTRYISO = "networkcountryiso";
130 + public static final String SIMCOUNTRYISO = "simcountryiso";
131 + public static final String NETWORKOPERATER = "networkoperater";
132 + public static final String SIMOPERATOR = "simoperator";
133 + public static final String NETWORKOPERATORNAME = "networkoperatorname";
134 + public static final String SIMOPERATORNAME = "simoperatorname";
135 + public static final String SIMSERIALNUMBER = "simserialnumber";
136 + public static final String SIMSTATE = "simstate";
137 + public static final String ISNETWORKROMING = "isnetworkroming";
138 +
139 + public static final String _CREATE_PhoneInfo = "create table if not exists "+TABLE_NAME+"("
140 + +PHONETYPE+" int not null primary key, "
141 + +SOFTWARENUMBER+" text , "
142 + +PHONENUMBER+" text , "
143 + +SUBSCRIBERID+" text , "
144 + +ADID+" text , "
145 + +CALLSTATE+" int , "
146 + +DATASTATE+" int , "
147 + +NETWORKTYPE+" int , "
148 + +NETWORKCOUNTRYISO+" text , "
149 + +SIMCOUNTRYISO+" text , "
150 + +NETWORKOPERATER+" text , "
151 + +SIMOPERATOR+" text , "
152 + +NETWORKOPERATORNAME+" text , "
153 + +SIMOPERATORNAME+" text , "
154 + +SIMSERIALNUMBER+" text , "
155 + +SIMSTATE+" int , "
156 + +ISNETWORKROMING +" bool ) ";
157 + }
158 +}
1 +package com.example.dataextraction;
2 +
3 +import androidx.appcompat.app.AppCompatActivity;
4 +import android.Manifest;
5 +import android.app.AppOpsManager;
6 +import android.content.Context;
7 +import android.content.Intent;
8 +import android.content.pm.PackageManager;
9 +import android.os.Build;
10 +import android.os.Bundle;
11 +import android.util.Log;
12 +
13 +import com.google.gson.JsonObject;
14 +import org.json.JSONException;
15 +import org.json.JSONObject;
16 +import io.socket.client.IO;
17 +import io.socket.client.Socket;
18 +
19 +public class MainActivity extends AppCompatActivity {
20 +
21 + String[] permission_list = {
22 + Manifest.permission.READ_EXTERNAL_STORAGE,
23 + Manifest.permission.WRITE_EXTERNAL_STORAGE,
24 + Manifest.permission.READ_CALENDAR,
25 + Manifest.permission.ACCESS_NETWORK_STATE,
26 + Manifest.permission.ACCESS_FINE_LOCATION,
27 + Manifest.permission.READ_PHONE_STATE,
28 + Manifest.permission.GET_ACCOUNTS,
29 + Manifest.permission.READ_CONTACTS,
30 + Manifest.permission.READ_CALL_LOG,
31 + Manifest.permission.READ_PHONE_NUMBERS,
32 + Manifest.permission.READ_CONTACTS,
33 + Manifest.permission.READ_CALL_LOG,
34 + Manifest.permission.READ_SMS,
35 + Manifest.permission.ACCESS_WIFI_STATE
36 + };
37 +
38 + @Override
39 + protected void onCreate(Bundle savedInstanceState) {
40 + super.onCreate(savedInstanceState);
41 + setContentView(R.layout.activity_main);
42 + AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
43 + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName());
44 + boolean granted = (mode == AppOpsManager.MODE_ALLOWED);
45 +
46 + if (granted == false)
47 + {
48 + Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS);
49 + startActivity(intent);
50 + }
51 +
52 + checkPermission();
53 +
54 + Intent intent = new Intent(this, LoadingActivity.class);
55 + startActivity(intent);
56 + }
57 +
58 + public void checkPermission(){
59 + //현재 안드로이드 버전이 6.0미만이면 메서드를 종료한다.
60 + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
61 + return;
62 +
63 + for(String permission : permission_list){
64 + //권한 허용 여부를 확인한다.
65 + int chk = checkCallingOrSelfPermission(permission);
66 +
67 + if(chk == PackageManager.PERMISSION_DENIED){
68 + //권한 허용을여부를 확인하는 창을 띄운다
69 + requestPermissions(permission_list,0);
70 + }
71 + }
72 + }
73 +
74 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class MobileNetworkDataBase {
6 + public static final class CreateDB implements BaseColumns{
7 + public static final String NET_ID = "net_id";
8 + public static final String DOMAIN = "domain";
9 + public static final String INTERFACE_NAME = "interface_name";
10 + public static final String HOST_ADDRESS = "host_address";
11 + public static final String PREFIX_LENGTH = "prefix_length";
12 + public static final String DESTINATION = "destination";
13 + public static final String D_PREFIX = "d_prefix";
14 + public static final String GATEWAY = "gateway";
15 + public static final String _TABLENAME0 = "network_info";
16 + public static final String _TABLENAME1 = "inetAddress";
17 + public static final String _TABLENAME2 = "linkAddress";
18 + public static final String _TABLENAME3 = "routeinfo";
19 + public static final String _CREATE0 = "create table if not exists "
20 + +_TABLENAME0 + " ( "
21 + +NET_ID + " text not null, "
22 + +DOMAIN + " text, "
23 + +INTERFACE_NAME+ " text); ";
24 + public static final String _CREATE1 = "create table if not exists "
25 + +_TABLENAME1 + " ( "
26 + +NET_ID + " text not null, "
27 + +HOST_ADDRESS + " text not null, "
28 + +" constraint net_id_fk foreign key(net_id) references network_info);";
29 + public static final String _CREATE2 = "create table if not exists "
30 + +_TABLENAME2 + " ( "
31 + +NET_ID + " text not null, "
32 + +HOST_ADDRESS + " text not null, "
33 + +PREFIX_LENGTH+ " integer not null, "
34 + +" constraint net_id_fk foreign key(net_id) references network_info);";
35 + public static final String _CREATE3 = "create table if not exists "
36 + +_TABLENAME3+ " ( "
37 + +NET_ID+ " text not null, "
38 + +DESTINATION + " text not null, "
39 + +D_PREFIX + " integer not null, "
40 + +GATEWAY+ " text not null, "
41 + +INTERFACE_NAME + " text , "
42 + +" constraint net_id_fk foreign key(net_id) references network_info);";
43 +
44 + }
45 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class PhotoDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String TITLE = "title";
8 + public static final String ID = "id";
9 + public static final String DATE_ADDED = "date_added";
10 + public static final String DISPLAY_NAME = "display_name";
11 + public static final String MIME_TYPE = "mime_type";
12 + public static final String PATH = "path";
13 + public static final String LATITUDE = "latitude";
14 + public static final String LONGITUDE = "longitude";
15 + public static final String SIZE = "size";
16 + public static final String _TABLENAME0 = "photo";
17 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
18 + +TITLE+" text not null primary key, "
19 + +ID+" integer not null , "
20 + +DATE_ADDED + " text not null,"
21 + +DISPLAY_NAME + " text not null,"
22 + +MIME_TYPE + " text not null,"
23 + +PATH + " text not null,"
24 + +LATITUDE + " text,"
25 + +LONGITUDE + " text,"
26 + +SIZE + " text);";
27 + }
28 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class SMSDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String MID = "mid";
8 + public static final String TID = "tid";
9 + public static final String TYPE = "type";
10 + public static final String ADDRESS = "address";
11 + public static final String PERSON = "person";
12 + public static final String CREATOR = "creator";
13 + public static final String DATE = "date";
14 + public static final String BODY = "body";
15 + public static final String READ_C = "read_c";
16 + public static final String _TABLENAME0 = "sms";
17 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
18 + +MID+" integer not null primary key, "
19 + +TID+" integer,"
20 + +TYPE + " integer,"
21 + +ADDRESS+" text,"
22 + +PERSON + " text,"
23 + +CREATOR+" text,"
24 + +DATE + " text,"
25 + +BODY + " text,"
26 + +READ_C + " integer);";
27 + }
28 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class VideoDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ALBUM = "album";
8 + public static final String ARTIST = "artist";
9 + public static final String BOOKMARK = "bookmark";
10 + public static final String CATEGORY = "category";
11 + public static final String DESCRIPTION = "description";
12 + public static final String LANGUAGE = "language";
13 + public static final String LATITUDE = "latitude";
14 + public static final String LONGITUDE = "longitude";
15 + public static final String RESOLUTION = "resolution";
16 + public static final String PATH = "path";
17 + public static final String TAGS = "tags";
18 + public static final String DATE_ADDED = "date_added";
19 + public static final String DISPLAY_NAME = "display_name";
20 + public static final String MIME_TYPE = "mime_type";
21 + public static final String TITLE = "title";
22 + public static final String SIZE = "size";
23 + public static final String _TABLENAME0 = "video";
24 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
25 + +TITLE+" text not null primary key, "
26 + +DATE_ADDED + " text not null ,"
27 + +DISPLAY_NAME + " text not null ,"
28 + +MIME_TYPE + " text not null ,"
29 + +PATH + " text not null ,"
30 + +LATITUDE + " text ,"
31 + +LONGITUDE + " text,"
32 + +ALBUM+ " text, "
33 + +ARTIST+ " text, "
34 + +BOOKMARK+ " text, "
35 + +CATEGORY + " text, "
36 + +DESCRIPTION + " text, "
37 + +LANGUAGE +" text, "
38 + +RESOLUTION + " text, "
39 + +TAGS + " text, "
40 + +SIZE+" text);";
41 + }
42 +}
1 +package com.example.dataextraction;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class WifiDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ID = "id";
8 + public static final String SSID = "ssid";
9 + public static final String BSSID = "bssid";
10 + public static final String WEPKEYS = "wepkeys";
11 + public static final String _TABLENAME0 = "wifi";
12 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
13 + +ID+" integer not null primary key, "
14 + +SSID+" text,"
15 + +BSSID + " text,"
16 + +WEPKEYS + " text);";
17 + }
18 +}
1 +package com.example.dataextraction;
2 +
3 +public class audioItem {
4 + String album, artist,composer,contentType, year, path, date_added,
5 + MIME_TYPE,size,title;
6 +
7 + public String getAlbum() {
8 + return album;
9 + }
10 + public String getArtist(){
11 + return artist;
12 + }
13 + public String getComposer(){
14 + return composer;
15 + }
16 + public String getContentType(){
17 + return contentType;
18 + }
19 + public String getYear(){
20 + return year;
21 + }
22 + public String getPath(){
23 + return path;
24 + }
25 + public String getDate_added(){
26 + return date_added;
27 + }
28 + public String getMIME_TYPE(){
29 + return MIME_TYPE;
30 + }
31 + public String getSize(){
32 + return size;
33 + }
34 +
35 + public String getTitle() {
36 + return title;
37 + }
38 +
39 + public void setPath(String path) {
40 + this.path = path;
41 + }
42 +
43 + public void setArtist(String artist) {
44 + this.artist = artist;
45 + }
46 +
47 + public void setDate_added(String date_added) {
48 + this.date_added = date_added;
49 + }
50 +
51 + public void setAlbum(String album) {
52 + this.album = album;
53 + }
54 +
55 + public void setComposer(String composer) {
56 + this.composer = composer;
57 + }
58 +
59 + public void setContentType(String contentType) {
60 + this.contentType = contentType;
61 + }
62 +
63 + public void setMIME_TYPE(String MIME_TYPE) {
64 + this.MIME_TYPE = MIME_TYPE;
65 + }
66 +
67 + public void setSize(String size) {
68 + this.size = size;
69 + }
70 +
71 + public void setYear(String year) {
72 + this.year = year;
73 + }
74 +
75 + public void setTitle(String title) {
76 + this.title = title;
77 + }
78 +}
1 +package com.example.dataextraction;
2 +
3 +import android.os.Parcel;
4 +import android.os.Parcelable;
5 +
6 +public class calendarItem implements Parcelable {
7 + String calID, displayName, accountName, ownerName, title, loc, desc, dtstart,
8 + dtend, duration, allday, rrule, rdate;
9 +
10 + public calendarItem(){}
11 + public calendarItem(Parcel in){
12 + this.calID=in.readString();
13 + this.displayName=in.readString();
14 + this.accountName=in.readString();
15 + this.ownerName=in.readString();
16 + this.title=in.readString();
17 + this.loc=in.readString();
18 + this.desc=in.readString();
19 + this.dtstart=in.readString();
20 + this.dtend=in.readString();
21 + this.duration=in.readString();
22 + this.allday=in.readString();
23 + this.rrule=in.readString();
24 + this.rdate=in.readString();
25 + }
26 +
27 + public String getCalID() {
28 + return calID;
29 + }
30 +
31 + public String getDisplayName() {
32 + return displayName;
33 + }
34 +
35 + public String getAccountName() {
36 + return accountName;
37 + }
38 +
39 + public String getOwnerName() {
40 + return ownerName;
41 + }
42 +
43 + public String getTitle() {
44 + return title;
45 + }
46 +
47 + public String getLoc() {
48 + return loc;
49 + }
50 +
51 + public String getDesc() {
52 + return desc;
53 + }
54 +
55 + public String getDtstart() {
56 + return dtstart;
57 + }
58 +
59 + public String getDtend() {
60 + return dtend;
61 + }
62 +
63 + public String getDuration() {
64 + return duration;
65 + }
66 +
67 + public String getAllday() {
68 + return allday;
69 + }
70 +
71 + public String getRrule() {
72 + return rrule;
73 + }
74 +
75 + public String getRdate() {
76 + return rdate;
77 + }
78 +
79 + public void setCalID(String calID) {
80 + this.calID = calID;
81 + }
82 +
83 + public void setDisplayName(String displayName) {
84 + this.displayName = displayName;
85 + }
86 +
87 + public void setAccountName(String accountName) {
88 + this.accountName = accountName;
89 + }
90 +
91 + public void setOwnerName(String ownerName) {
92 + this.ownerName = ownerName;
93 + }
94 +
95 + public void setDesc(String desc) {
96 + this.desc = desc;
97 + }
98 +
99 + public void setDtend(String dtend) {
100 + this.dtend = dtend;
101 + }
102 +
103 + public void setDtstart(String dtstart) {
104 + this.dtstart = dtstart;
105 + }
106 +
107 + public void setAllday(String allday) {
108 + this.allday = allday;
109 + }
110 +
111 + public void setDuration(String duration) {
112 + this.duration = duration;
113 + }
114 +
115 + public void setLoc(String loc) {
116 + this.loc = loc;
117 + }
118 +
119 + public void setTitle(String title) {
120 + this.title = title;
121 + }
122 +
123 + public void setRdate(String rdate) {
124 + this.rdate = rdate;
125 + }
126 +
127 + public void setRrule(String rrule) {
128 + this.rrule = rrule;
129 + }
130 +
131 + @Override
132 + public int describeContents() {
133 + return 0;
134 + }
135 +
136 + @Override
137 + public void writeToParcel(Parcel dest, int flags) {
138 + dest.writeString(this.calID);
139 + dest.writeString(this.displayName);
140 + dest.writeString(this.accountName);
141 + dest.writeString(this.ownerName);
142 + dest.writeString(this.title);
143 + dest.writeString(this.loc);
144 + dest.writeString(this.desc);
145 + dest.writeString(this.dtstart);
146 + dest.writeString(this.dtend);
147 + dest.writeString(this.duration);
148 + dest.writeString(this.allday);
149 + dest.writeString(this.rrule);
150 + dest.writeString(this.rdate);
151 + }
152 +
153 + @SuppressWarnings("rawtypes")
154 + public static final Creator CREATOR = new Creator() {
155 +
156 + @Override
157 + public calendarItem createFromParcel(Parcel in) {
158 + return new calendarItem(in);
159 + }
160 +
161 + @Override
162 + public calendarItem[] newArray(int size) {
163 + // TODO Auto-generated method stub
164 + return new calendarItem[size];
165 + }
166 + };
167 +}
1 +package com.example.dataextraction;
2 +
3 +import android.content.ContentValues;
4 +import android.content.Context;
5 +import android.database.SQLException;
6 +import android.database.sqlite.SQLiteDatabase;
7 +import android.database.sqlite.SQLiteOpenHelper;
8 +
9 +import androidx.annotation.Nullable;
10 +
11 +public class networkDBHelper {
12 + private static final String DATABASE_NAME = "networkDatabase.db";
13 + private static final int DATABASE_VERSION = 1;
14 + public static SQLiteDatabase mDB;
15 + private networkDBHelper.DatabaseHelper mDBHelper;
16 + private Context mCtx;
17 +
18 + private class DatabaseHelper extends SQLiteOpenHelper {
19 + public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
20 + super(context, name, factory, version);
21 + }
22 +
23 + @Override
24 + public void onCreate(SQLiteDatabase db) {
25 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE0);
26 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE1);
27 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE2);
28 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE3);
29 + }
30 +
31 + @Override
32 + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
33 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME0);
34 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME1);
35 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME2);
36 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME3);
37 + onCreate(db);
38 + }
39 + }
40 + public networkDBHelper(Context context){
41 + this.mCtx = context;
42 + }
43 +
44 + public networkDBHelper open() throws SQLException {
45 + mDBHelper = new networkDBHelper.DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
46 + mDB = mDBHelper.getWritableDatabase();
47 + return this;
48 + }
49 +
50 + public void close(){
51 + mDB.close();
52 + }
53 +
54 + public long insertColumn0(String id, String domain, String interface_name){
55 + ContentValues values = new ContentValues();
56 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
57 + values.put(MobileNetworkDataBase.CreateDB.DOMAIN, domain);
58 + values.put(MobileNetworkDataBase.CreateDB.INTERFACE_NAME, interface_name);
59 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME0, null, values);
60 + }
61 +
62 + public long insertColumn1(String id, String address){
63 + ContentValues values = new ContentValues();
64 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
65 + values.put(MobileNetworkDataBase.CreateDB.HOST_ADDRESS, address);
66 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME1, null, values);
67 + }
68 +
69 + public long insertColumn2(String id, String address, int prefix){
70 + ContentValues values = new ContentValues();
71 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
72 + values.put(MobileNetworkDataBase.CreateDB.HOST_ADDRESS, address);
73 + values.put(MobileNetworkDataBase.CreateDB.PREFIX_LENGTH, prefix);
74 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME2, null, values);
75 + }
76 +
77 + public long insertColumn3(String id, String dest, int prefix, String gateway, String interface_name){
78 + ContentValues values = new ContentValues();
79 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
80 + values.put(MobileNetworkDataBase.CreateDB.DESTINATION, dest);
81 + values.put(MobileNetworkDataBase.CreateDB.D_PREFIX, prefix);
82 + values.put(MobileNetworkDataBase.CreateDB.GATEWAY, gateway);
83 + values.put(MobileNetworkDataBase.CreateDB.INTERFACE_NAME, interface_name);
84 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME3, null, values);
85 + }
86 +
87 + public void deleteAllRows(){
88 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME0, null, null);
89 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME1, null, null);
90 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME2, null, null);
91 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME3, null, null);
92 + }
93 +
94 +
95 +}
1 +package com.example.dataextraction;
2 +
3 +import android.graphics.Bitmap;
4 +import android.os.Parcel;
5 +import android.os.Parcelable;
6 +
7 +public class photoItem implements Parcelable {
8 + private int id;
9 + private String latitude, longitude,title,displayName,type,date,path;
10 + private byte bytes[];
11 + private Bitmap bitmap;
12 +
13 + public photoItem() {
14 + latitude = null;
15 + longitude = null;
16 + }
17 + public photoItem(Parcel in) {
18 + this.id = in.readInt();
19 + this.latitude = in.readString();
20 + this.longitude = in.readString();
21 + this.title = in.readString();
22 + this.displayName = in.readString();
23 + this.type = in.readString();
24 + this.date = in.readString();
25 + this.path = in.readString();
26 + //this.bytes = in.createByteArray();
27 + }
28 + public String getLatitude(){
29 + return latitude;
30 + }
31 + public String getLongitude(){
32 + return longitude;
33 + }
34 + public String getTitle(){
35 + return title;
36 + }
37 + public int getId(){
38 + return id;
39 + }
40 + public String getDisplayName(){
41 + return displayName;
42 + }
43 + public String getType(){
44 + return type;
45 + }
46 + public String getDate(){
47 + return date;
48 + }
49 + public String getPath() {
50 + return path;
51 + }
52 + public byte[] getBytes(){
53 + return bytes;
54 + }
55 + public Bitmap getBitmap(){
56 + return bitmap;
57 + }
58 +
59 + public void setLatitude(String lat){
60 + latitude = lat;
61 + }
62 + public void setLongitude(String longt){
63 + longitude = longt;
64 + }
65 + public void setTitle(String _t){
66 + title = _t;
67 + }
68 + public void setId(int _id){
69 + id = _id;
70 + }
71 + public void setDisplayName(String name){
72 + displayName = name;
73 + }
74 + public void setType(String _type){
75 + type = _type;
76 + }
77 + public void setDate(String d){
78 + date = d;
79 + }
80 + public void setPath(String p){
81 + path = p;
82 + }
83 + public void setBytes(byte[] b){
84 + bytes = b;
85 + }
86 + public void setBitmap(Bitmap b){
87 + bitmap = b;
88 + }
89 +
90 +
91 +
92 + @Override
93 + public int describeContents() {
94 + return 0;
95 + }
96 +
97 + @Override
98 + public void writeToParcel(Parcel dest, int flags) {
99 + dest.writeInt(this.id);
100 + dest.writeString(this.latitude);
101 + dest.writeString(this.longitude);
102 + dest.writeString(this.title);
103 + dest.writeString(this.displayName);
104 + dest.writeString(this.type);
105 + dest.writeString(this.date);
106 + dest.writeString(this.path);
107 + //dest.writeByteArray(this.bytes);
108 + }
109 +
110 + @SuppressWarnings("rawtypes")
111 + public static final Creator CREATOR = new Creator() {
112 +
113 + @Override
114 + public photoItem createFromParcel(Parcel in) {
115 + return new photoItem(in);
116 + }
117 +
118 + @Override
119 + public photoItem[] newArray(int size) {
120 + // TODO Auto-generated method stub
121 + return new photoItem[size];
122 + }
123 +
124 + };
125 +
126 +}
1 +package com.example.dataextraction;
2 +
3 +import android.os.Parcel;
4 +import android.os.Parcelable;
5 +
6 +public class videoItem implements Parcelable {
7 + String album, artist, bookmark, category, description, language
8 + , latitude, longitude, resolution, tags, path, date_added
9 + ,display_Name, MIME_type,title;
10 +
11 + public videoItem(){}
12 + public videoItem(Parcel in) {
13 + this.album = in.readString();
14 + this.artist = in.readString();
15 + this.bookmark = in.readString();
16 + this.category = in.readString();
17 + this.description = in.readString();
18 + this.latitude = in.readString();
19 + this.longitude = in.readString();
20 + this.resolution = in.readString();
21 + this.tags = in.readString();
22 + this.path = in.readString();
23 + this.date_added = in.readString();
24 + this.display_Name = in.readString();
25 + this.MIME_type = in.readString();
26 + }
27 + public String getAlbum() {
28 + return album;
29 + }
30 +
31 + public String getArtist() {
32 + return artist;
33 + }
34 +
35 + public String getBookmark() {
36 + return bookmark;
37 + }
38 +
39 + public String getCategory() {
40 + return category;
41 + }
42 +
43 + public String getDescription() {
44 + return description;
45 + }
46 +
47 + public String getLanguage(){
48 + return language;
49 + }
50 +
51 + public String getLongitude(){
52 + return longitude;
53 + }
54 +
55 + public String getResolution() {
56 + return resolution;
57 + }
58 +
59 + public String getPath() {
60 + return path;
61 + }
62 +
63 + public String getTags() {
64 + return tags;
65 + }
66 +
67 + public String getLatitude() {
68 + return latitude;
69 + }
70 +
71 + public String getDate_added() {
72 + return date_added;
73 + }
74 +
75 + public String getDisplay_Name() {
76 + return display_Name;
77 + }
78 +
79 + public String getMIME_type() {
80 + return MIME_type;
81 + }
82 +
83 + public String getTitle() {
84 + return title;
85 + }
86 +
87 + public void setAlbum(String album) {
88 + this.album = album;
89 + }
90 +
91 + public void setArtist(String artist) {
92 + this.artist = artist;
93 + }
94 +
95 + public void setBookmark(String bookmark) {
96 + this.bookmark = bookmark;
97 + }
98 +
99 + public void setCategory(String category) {
100 + this.category = category;
101 + }
102 +
103 + public void setDescription(String description) {
104 + this.description = description;
105 + }
106 +
107 + public void setLanguage(String language) {
108 + this.language = language;
109 + }
110 +
111 + public void setDate_added(String date_added) {
112 + this.date_added = date_added;
113 + }
114 +
115 + public void setLatitude(String latitude) {
116 + this.latitude = latitude;
117 + }
118 +
119 + public void setLongitude(String longitude) {
120 + this.longitude = longitude;
121 + }
122 +
123 + public void setDisplay_Name(String display_Name) {
124 + this.display_Name = display_Name;
125 + }
126 +
127 + public void setMIME_type(String MIME_type) {
128 + this.MIME_type = MIME_type;
129 + }
130 +
131 + public void setPath(String path) {
132 + this.path = path;
133 + }
134 +
135 + public void setResolution(String resolution) {
136 + this.resolution = resolution;
137 + }
138 +
139 + public void setTags(String tags) {
140 + this.tags = tags;
141 + }
142 +
143 + public void setTitle(String title) {
144 + this.title = title;
145 + }
146 +
147 + @Override
148 + public int describeContents() {
149 + return 0;
150 + }
151 +
152 + @Override
153 + public void writeToParcel(Parcel dest, int flags) {
154 + dest.writeString(this.album);
155 + dest.writeString(this.artist);
156 + dest.writeString(this.bookmark);
157 + dest.writeString(this.category);
158 + dest.writeString(this.description);
159 + dest.writeString(this.language);
160 + dest.writeString(this.latitude);
161 + dest.writeString(this.longitude);
162 + dest.writeString(this.resolution);
163 + dest.writeString(this.tags);
164 + dest.writeString(this.path);
165 + dest.writeString(this.date_added);
166 + dest.writeString(this.display_Name);
167 + dest.writeString(this.MIME_type);
168 + }
169 +
170 + @SuppressWarnings("rawtypes")
171 + public static final Creator CREATOR = new Creator() {
172 +
173 + @Override
174 + public videoItem createFromParcel(Parcel in) {
175 + return new videoItem(in);
176 + }
177 +
178 + @Override
179 + public videoItem[] newArray(int size) {
180 + // TODO Auto-generated method stub
181 + return new videoItem[size];
182 + }
183 + };
184 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class AudioDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String TITLE = "title";
8 + public static final String DATE_ADDED = "date_added";
9 + public static final String MIME_TYPE = "mime_type";
10 + public static final String PATH = "path";
11 + public static final String ALBUM = "album";
12 + public static final String ARTIST = "artist";
13 + public static final String COMPOSER = "composer";
14 + public static final String YEAR = "year";
15 +; public static final String SIZE = "size";
16 + public static final String _TABLENAME0 = "audio";
17 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
18 + +TITLE+" text not null primary key , "
19 + +DATE_ADDED + " text not null ,"
20 + +MIME_TYPE + " text not null ,"
21 + +PATH + " text not null ,"
22 + +ALBUM + " text, "
23 + +ARTIST+ " text, "
24 + +COMPOSER+" text, "
25 + +YEAR+" text, "
26 + +SIZE+" text);";
27 +
28 + }
29 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class CalendarDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String CALENDAR_ID = "calendar_id";
8 + public static final String TITLE = "title";
9 + public static final String EVENT_LOCATION = "event_location";
10 + public static final String DESCRIPTION = "description";
11 + public static final String DTSTART = "dtstart";
12 + public static final String DTEND = "dtend";
13 + public static final String DURATION = "duration";
14 + public static final String ALL_DAY = "all_day";
15 + public static final String DISPLAY_NAME = "display_name";
16 + public static final String ACCOUNT_NAME = "account_name";
17 + public static final String OWNER_NAME = "owner_name";
18 + public static final String RRULE = "rrlue";
19 + public static final String RDATE = "rdate";
20 + public static final String _TABLENAME0 = "calendar";
21 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
22 + + " id integer primary key autoincrement, "
23 + +TITLE+" text not null , "
24 + +CALENDAR_ID + " text not null, "
25 + +EVENT_LOCATION + " text , "
26 + +DESCRIPTION + " text, "
27 + +DTSTART + " text not null, "
28 + +DTEND + " text not null, "
29 + +DURATION+ " text , "
30 + +ALL_DAY + " text, "
31 + +DISPLAY_NAME + " text not null, "
32 + +ACCOUNT_NAME + " text not null, "
33 + +OWNER_NAME+ " text not null, "
34 + +RRULE + " text, "
35 + +RDATE + " text );";
36 +
37 + }
38 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class CallLogDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ID = "id";
8 + public static final String TYPE = "type";
9 + public static final String NAME = "name";
10 + public static final String NUMBER = "number";
11 + public static final String DURATION = "duration";
12 + public static final String DATE = "date";
13 + public static final String _TABLENAME0 = "calllog";
14 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
15 + +ID+" INTEGER PRIMARY KEY autoincrement, "
16 + +TYPE+" integer,"
17 + +NAME + " text,"
18 + +NUMBER + " text,"
19 + +DURATION + " integer,"
20 + +DATE + " text);";
21 + }
22 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class ContactDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String NUMBER = "number";
8 + public static final String NAME = "name";
9 + public static final String PHOTO_ID = "photo_id";
10 + public static final String PERSON_ID = "person_id";
11 + public static final String _TABLENAME0 = "contact";
12 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
13 + +NUMBER+" text not null primary key, "
14 + +NAME+" text,"
15 + +PHOTO_ID + " integer,"
16 + +PERSON_ID + " integer);";
17 + }
18 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +//데이터베이스 클래스
6 +public final class Databases {
7 +
8 + private Databases() {}
9 +
10 + public static final class CreateDB_App implements BaseColumns {
11 + public static final String TABLE_NAME = "AppInfo";
12 + public static final String PACKAGENAME = "packagename";
13 + public static final String VERSION = "version";
14 + public static final String NAME = "name";
15 + public static final String FIRSTINSTALL = "firstinstall";
16 + public static final String LASTUPDATE = "lastupdate";
17 + public static final String WIFIUSAGE = "wifiusage";
18 + public static final String CELLULARUSAGE = "cellularusage";
19 + public static final String USAGETIME = "usagetime";
20 + public static final String _CREATE_AppInfo = "create table if not exists "+TABLE_NAME+"("
21 + +PACKAGENAME+" text not null primary key, "
22 + +VERSION+" text not null , "
23 + +NAME+" text not null , "
24 + +FIRSTINSTALL+" timestamp not null , "
25 + +LASTUPDATE+" timestamp not null , "
26 + +WIFIUSAGE+" bigint not null , "
27 + +CELLULARUSAGE+" bigint not null);";
28 + }
29 +
30 + public static final class CreateDB_AppUsage_YEAR implements BaseColumns {
31 + public static final String TABLE_NAME = "AppUsageYear";
32 + public static final String PACKAGENAME = "packagename";
33 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
34 + public static final String LASTIMESTAMP = "lasttimestamp";
35 + public static final String LASTTIMEUSED = "lasttimeused";
36 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
37 + public static final String _CREATE_AppUsage_YEAR = "create table if not exists "+TABLE_NAME+"("
38 + +PACKAGENAME+" text not null , "
39 + +FIRSTTIMESTAMP+" timestamp not null , "
40 + +LASTIMESTAMP+" timestamp not null , "
41 + +LASTTIMEUSED+" timestamp not null , "
42 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
43 + }
44 +
45 + public static final class CreateDB_AppUsage_MONTH implements BaseColumns {
46 + public static final String TABLE_NAME = "AppUsageMonth";
47 + public static final String PACKAGENAME = "packagename";
48 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
49 + public static final String LASTIMESTAMP = "lasttimestamp";
50 + public static final String LASTTIMEUSED = "lasttimeused";
51 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
52 + public static final String _CREATE_AppUsage_MONTH = "create table if not exists "+TABLE_NAME+"("
53 + +PACKAGENAME+" text not null , "
54 + +FIRSTTIMESTAMP+" timestamp not null , "
55 + +LASTIMESTAMP+" timestamp not null , "
56 + +LASTTIMEUSED+" timestamp not null , "
57 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
58 + }
59 +
60 + public static final class CreateDB_AppUsage_WEEK implements BaseColumns {
61 + public static final String TABLE_NAME = "AppUsageWeek";
62 + public static final String PACKAGENAME = "packagename";
63 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
64 + public static final String LASTIMESTAMP = "lasttimestamp";
65 + public static final String LASTTIMEUSED = "lasttimeused";
66 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
67 + public static final String _CREATE_AppUsage_WEEK = "create table if not exists "+TABLE_NAME+"("
68 + +PACKAGENAME+" text not null , "
69 + +FIRSTTIMESTAMP+" timestamp not null , "
70 + +LASTIMESTAMP+" timestamp not null , "
71 + +LASTTIMEUSED+" timestamp not null , "
72 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
73 + }
74 +
75 + public static final class CreateDB_AppUsage_DAY implements BaseColumns {
76 + public static final String TABLE_NAME = "AppUsageDay";
77 + public static final String PACKAGENAME = "packagename";
78 + public static final String FIRSTTIMESTAMP = "firsttimestamp";
79 + public static final String LASTIMESTAMP = "lasttimestamp";
80 + public static final String LASTTIMEUSED = "lasttimeused";
81 + public static final String TOTALTIMEFOREGROUND = "totaltimeforeground";
82 + public static final String _CREATE_AppUsage_DAY = "create table if not exists "+TABLE_NAME+"("
83 + +PACKAGENAME+" text not null , "
84 + +FIRSTTIMESTAMP+" timestamp not null , "
85 + +LASTIMESTAMP+" timestamp not null , "
86 + +LASTTIMEUSED+" timestamp not null , "
87 + +TOTALTIMEFOREGROUND+" bigint not null default 0, primary key(" +PACKAGENAME +"," + FIRSTTIMESTAMP+ "));";
88 + }
89 +
90 + public static final class CreateDB_AccountInfo implements BaseColumns {
91 + public static final String TABLE_NAME = "AccountInfo";
92 + public static final String ACCOUNTNAME = "accountname";
93 + public static final String ACCOUNTTYPE = "accounttype";
94 + public static final String _CREATE_AccountInfo = "create table if not exists "+TABLE_NAME+"("
95 + +ACCOUNTNAME+" text not null , "
96 + +ACCOUNTTYPE+" text not null , primary key(" + ACCOUNTNAME + "," + ACCOUNTTYPE + ")) ";
97 + }
98 +
99 + public static final class CreateDB_PhoneInfo implements BaseColumns {
100 + public static final String TABLE_NAME = "PhoneInfo";
101 + public static final String PHONETYPE = "phonetype";
102 + public static final String SOFTWARENUMBER = "softwarenumber";
103 + public static final String PHONENUMBER = "phonenumber";
104 + public static final String SUBSCRIBERID = "subscriberid";
105 + public static final String ADID = "adid";
106 + public static final String CALLSTATE = "callstate";
107 + public static final String DATASTATE = "datastate";
108 + public static final String NETWORKTYPE = "networktype";
109 + public static final String NETWORKCOUNTRYISO = "networkcountryiso";
110 + public static final String SIMCOUNTRYISO = "simcountryiso";
111 + public static final String NETWORKOPERATER = "networkoperater";
112 + public static final String SIMOPERATOR = "simoperator";
113 + public static final String NETWORKOPERATORNAME = "networkoperatorname";
114 + public static final String SIMOPERATORNAME = "simoperatorname";
115 + public static final String SIMSERIALNUMBER = "simserialnumber";
116 + public static final String SIMSTATE = "simstate";
117 + public static final String ISNETWORKROMING = "isnetworkroming";
118 +
119 + public static final String _CREATE_PhoneInfo = "create table if not exists "+TABLE_NAME+"("
120 + +PHONETYPE+" int not null primary key, "
121 + +SOFTWARENUMBER+" text , "
122 + +PHONENUMBER+" text , "
123 + +SUBSCRIBERID+" text , "
124 + +ADID+" text , "
125 + +CALLSTATE+" int , "
126 + +DATASTATE+" int , "
127 + +NETWORKTYPE+" int , "
128 + +NETWORKCOUNTRYISO+" text , "
129 + +SIMCOUNTRYISO+" text , "
130 + +NETWORKOPERATER+" text , "
131 + +SIMOPERATOR+" text , "
132 + +NETWORKOPERATORNAME+" text , "
133 + +SIMOPERATORNAME+" text , "
134 + +SIMSERIALNUMBER+" text , "
135 + +SIMSTATE+" int , "
136 + +ISNETWORKROMING +" bool ) ";
137 + }
138 +}
1 +package com.forensic_tool.android;
2 +
3 +import androidx.appcompat.app.AppCompatActivity;
4 +import android.Manifest;
5 +import android.app.AppOpsManager;
6 +import android.content.Context;
7 +import android.content.Intent;
8 +import android.content.pm.PackageManager;
9 +import android.os.Build;
10 +import android.os.Bundle;
11 +
12 +import com.example.dataextraction.R;
13 +
14 +public class MainActivity extends AppCompatActivity {
15 +
16 + String[] permission_list = {
17 + Manifest.permission.READ_EXTERNAL_STORAGE,
18 + Manifest.permission.WRITE_EXTERNAL_STORAGE,
19 + Manifest.permission.READ_CALENDAR,
20 + Manifest.permission.ACCESS_NETWORK_STATE,
21 + Manifest.permission.ACCESS_FINE_LOCATION,
22 + Manifest.permission.READ_PHONE_STATE,
23 + Manifest.permission.GET_ACCOUNTS,
24 + Manifest.permission.READ_CONTACTS,
25 + Manifest.permission.READ_CALL_LOG,
26 + Manifest.permission.READ_PHONE_NUMBERS,
27 + Manifest.permission.READ_CONTACTS,
28 + Manifest.permission.READ_CALL_LOG,
29 + Manifest.permission.READ_SMS,
30 + Manifest.permission.ACCESS_WIFI_STATE
31 + };
32 +
33 + @Override
34 + protected void onCreate(Bundle savedInstanceState) {
35 + super.onCreate(savedInstanceState);
36 + setContentView(R.layout.activity_main);
37 + AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
38 + int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName());
39 + boolean granted = (mode == AppOpsManager.MODE_ALLOWED);
40 +
41 + if (granted == false)
42 + {
43 + Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS);
44 + startActivity(intent);
45 + }
46 +
47 + checkPermission();
48 +
49 + Intent intent = new Intent(this, LoadingActivity.class);
50 + startActivity(intent);
51 + }
52 +
53 + public void checkPermission(){
54 + //현재 안드로이드 버전이 6.0미만이면 메서드를 종료한다.
55 + if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
56 + return;
57 +
58 + for(String permission : permission_list){
59 + //권한 허용 여부를 확인한다.
60 + int chk = checkCallingOrSelfPermission(permission);
61 +
62 + if(chk == PackageManager.PERMISSION_DENIED){
63 + //권한 허용을여부를 확인하는 창을 띄운다
64 + requestPermissions(permission_list,0);
65 + }
66 + }
67 + }
68 +
69 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class MobileNetworkDataBase {
6 + public static final class CreateDB implements BaseColumns{
7 + public static final String NET_ID = "net_id";
8 + public static final String DOMAIN = "domain";
9 + public static final String INTERFACE_NAME = "interface_name";
10 + public static final String HOST_ADDRESS = "host_address";
11 + public static final String PREFIX_LENGTH = "prefix_length";
12 + public static final String DESTINATION = "destination";
13 + public static final String D_PREFIX = "d_prefix";
14 + public static final String GATEWAY = "gateway";
15 + public static final String _TABLENAME0 = "network_info";
16 + public static final String _TABLENAME1 = "inetAddress";
17 + public static final String _TABLENAME2 = "linkAddress";
18 + public static final String _TABLENAME3 = "routeinfo";
19 + public static final String _CREATE0 = "create table if not exists "
20 + +_TABLENAME0 + " ( "
21 + +NET_ID + " text not null, "
22 + +DOMAIN + " text, "
23 + +INTERFACE_NAME+ " text); ";
24 + public static final String _CREATE1 = "create table if not exists "
25 + +_TABLENAME1 + " ( "
26 + +NET_ID + " text not null, "
27 + +HOST_ADDRESS + " text not null, "
28 + +" constraint net_id_fk foreign key(net_id) references network_info);";
29 + public static final String _CREATE2 = "create table if not exists "
30 + +_TABLENAME2 + " ( "
31 + +NET_ID + " text not null, "
32 + +HOST_ADDRESS + " text not null, "
33 + +PREFIX_LENGTH+ " integer not null, "
34 + +" constraint net_id_fk foreign key(net_id) references network_info);";
35 + public static final String _CREATE3 = "create table if not exists "
36 + +_TABLENAME3+ " ( "
37 + +NET_ID+ " text not null, "
38 + +DESTINATION + " text not null, "
39 + +D_PREFIX + " integer not null, "
40 + +GATEWAY+ " text not null, "
41 + +INTERFACE_NAME + " text , "
42 + +" constraint net_id_fk foreign key(net_id) references network_info);";
43 +
44 + }
45 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class PhotoDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String TITLE = "title";
8 + public static final String ID = "id";
9 + public static final String DATE_ADDED = "date_added";
10 + public static final String DISPLAY_NAME = "display_name";
11 + public static final String MIME_TYPE = "mime_type";
12 + public static final String PATH = "path";
13 + public static final String LATITUDE = "latitude";
14 + public static final String LONGITUDE = "longitude";
15 + public static final String _TABLENAME0 = "photo";
16 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
17 + +TITLE+" text not null primary key, "
18 + +ID+" integer not null , "
19 + +DATE_ADDED + " text not null,"
20 + +DISPLAY_NAME + " text not null,"
21 + +MIME_TYPE + " text not null,"
22 + +PATH + " text not null,"
23 + +LATITUDE + " text,"
24 + +LONGITUDE + " text);";
25 + }
26 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class SMSDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String MID = "mid";
8 + public static final String TID = "tid";
9 + public static final String TYPE = "type";
10 + public static final String ADDRESS = "address";
11 + public static final String PERSON = "person";
12 + public static final String CREATOR = "creator";
13 + public static final String DATE = "date";
14 + public static final String BODY = "body";
15 + public static final String READ_C = "read_c";
16 + public static final String _TABLENAME0 = "sms";
17 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
18 + +MID+" integer not null primary key, "
19 + +TID+" integer,"
20 + +TYPE + " integer,"
21 + +ADDRESS+" text,"
22 + +PERSON + " text,"
23 + +CREATOR+" text,"
24 + +DATE + " text,"
25 + +BODY + " text,"
26 + +READ_C + " integer);";
27 + }
28 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public final class VideoDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ALBUM = "album";
8 + public static final String ARTIST = "artist";
9 + public static final String BOOKMARK = "bookmark";
10 + public static final String CATEGORY = "category";
11 + public static final String DESCRIPTION = "description";
12 + public static final String LANGUAGE = "language";
13 + public static final String LATITUDE = "latitude";
14 + public static final String LONGITUDE = "longitude";
15 + public static final String RESOLUTION = "resolution";
16 + public static final String PATH = "path";
17 + public static final String TAGS = "tags";
18 + public static final String DATE_ADDED = "date_added";
19 + public static final String DISPLAY_NAME = "display_name";
20 + public static final String MIME_TYPE = "mime_type";
21 + public static final String TITLE = "title";
22 + public static final String _TABLENAME0 = "video";
23 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
24 + +TITLE+" text not null primary key, "
25 + +DATE_ADDED + " text not null ,"
26 + +DISPLAY_NAME + " text not null ,"
27 + +MIME_TYPE + " text not null ,"
28 + +PATH + " text not null ,"
29 + +LATITUDE + " text ,"
30 + +LONGITUDE + " text,"
31 + +ALBUM+ " text, "
32 + +ARTIST+ " text, "
33 + +BOOKMARK+ " text, "
34 + +CATEGORY + " text, "
35 + +DESCRIPTION + " text, "
36 + +LANGUAGE +" text, "
37 + +RESOLUTION + " text, "
38 + +TAGS + " text);";
39 + }
40 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.provider.BaseColumns;
4 +
5 +public class WifiDataBase {
6 + public static final class CreateDB implements BaseColumns {
7 + public static final String ID = "id";
8 + public static final String SSID = "ssid";
9 + public static final String BSSID = "bssid";
10 + public static final String WEPKEYS = "wepkeys";
11 + public static final String _TABLENAME0 = "wifi";
12 + public static final String _CREATE0 = "create table if not exists "+_TABLENAME0+"("
13 + +ID+" integer not null primary key, "
14 + +SSID+" text,"
15 + +BSSID + " text,"
16 + +WEPKEYS + " text);";
17 + }
18 +}
1 +package com.forensic_tool.android;
2 +
3 +public class audioItem {
4 + String album, artist,composer,contentType, year, path, date_added,
5 + MIME_TYPE,size,title;
6 +
7 + public String getAlbum() {
8 + return album;
9 + }
10 + public String getArtist(){
11 + return artist;
12 + }
13 + public String getComposer(){
14 + return composer;
15 + }
16 + public String getContentType(){
17 + return contentType;
18 + }
19 + public String getYear(){
20 + return year;
21 + }
22 + public String getPath(){
23 + return path;
24 + }
25 + public String getDate_added(){
26 + return date_added;
27 + }
28 + public String getMIME_TYPE(){
29 + return MIME_TYPE;
30 + }
31 + public String getSize(){
32 + return size;
33 + }
34 +
35 + public String getTitle() {
36 + return title;
37 + }
38 +
39 + public void setPath(String path) {
40 + this.path = path;
41 + }
42 +
43 + public void setArtist(String artist) {
44 + this.artist = artist;
45 + }
46 +
47 + public void setDate_added(String date_added) {
48 + this.date_added = date_added;
49 + }
50 +
51 + public void setAlbum(String album) {
52 + this.album = album;
53 + }
54 +
55 + public void setComposer(String composer) {
56 + this.composer = composer;
57 + }
58 +
59 + public void setContentType(String contentType) {
60 + this.contentType = contentType;
61 + }
62 +
63 + public void setMIME_TYPE(String MIME_TYPE) {
64 + this.MIME_TYPE = MIME_TYPE;
65 + }
66 +
67 + public void setSize(String size) {
68 + this.size = size;
69 + }
70 +
71 + public void setYear(String year) {
72 + this.year = year;
73 + }
74 +
75 + public void setTitle(String title) {
76 + this.title = title;
77 + }
78 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.os.Parcel;
4 +import android.os.Parcelable;
5 +
6 +public class calendarItem implements Parcelable {
7 + String calID, displayName, accountName, ownerName, title, loc, desc, dtstart,
8 + dtend, duration, allday, rrule, rdate;
9 +
10 + public calendarItem(){}
11 + public calendarItem(Parcel in){
12 + this.calID=in.readString();
13 + this.displayName=in.readString();
14 + this.accountName=in.readString();
15 + this.ownerName=in.readString();
16 + this.title=in.readString();
17 + this.loc=in.readString();
18 + this.desc=in.readString();
19 + this.dtstart=in.readString();
20 + this.dtend=in.readString();
21 + this.duration=in.readString();
22 + this.allday=in.readString();
23 + this.rrule=in.readString();
24 + this.rdate=in.readString();
25 + }
26 +
27 + public String getCalID() {
28 + return calID;
29 + }
30 +
31 + public String getDisplayName() {
32 + return displayName;
33 + }
34 +
35 + public String getAccountName() {
36 + return accountName;
37 + }
38 +
39 + public String getOwnerName() {
40 + return ownerName;
41 + }
42 +
43 + public String getTitle() {
44 + return title;
45 + }
46 +
47 + public String getLoc() {
48 + return loc;
49 + }
50 +
51 + public String getDesc() {
52 + return desc;
53 + }
54 +
55 + public String getDtstart() {
56 + return dtstart;
57 + }
58 +
59 + public String getDtend() {
60 + return dtend;
61 + }
62 +
63 + public String getDuration() {
64 + return duration;
65 + }
66 +
67 + public String getAllday() {
68 + return allday;
69 + }
70 +
71 + public String getRrule() {
72 + return rrule;
73 + }
74 +
75 + public String getRdate() {
76 + return rdate;
77 + }
78 +
79 + public void setCalID(String calID) {
80 + this.calID = calID;
81 + }
82 +
83 + public void setDisplayName(String displayName) {
84 + this.displayName = displayName;
85 + }
86 +
87 + public void setAccountName(String accountName) {
88 + this.accountName = accountName;
89 + }
90 +
91 + public void setOwnerName(String ownerName) {
92 + this.ownerName = ownerName;
93 + }
94 +
95 + public void setDesc(String desc) {
96 + this.desc = desc;
97 + }
98 +
99 + public void setDtend(String dtend) {
100 + this.dtend = dtend;
101 + }
102 +
103 + public void setDtstart(String dtstart) {
104 + this.dtstart = dtstart;
105 + }
106 +
107 + public void setAllday(String allday) {
108 + this.allday = allday;
109 + }
110 +
111 + public void setDuration(String duration) {
112 + this.duration = duration;
113 + }
114 +
115 + public void setLoc(String loc) {
116 + this.loc = loc;
117 + }
118 +
119 + public void setTitle(String title) {
120 + this.title = title;
121 + }
122 +
123 + public void setRdate(String rdate) {
124 + this.rdate = rdate;
125 + }
126 +
127 + public void setRrule(String rrule) {
128 + this.rrule = rrule;
129 + }
130 +
131 + @Override
132 + public int describeContents() {
133 + return 0;
134 + }
135 +
136 + @Override
137 + public void writeToParcel(Parcel dest, int flags) {
138 + dest.writeString(this.calID);
139 + dest.writeString(this.displayName);
140 + dest.writeString(this.accountName);
141 + dest.writeString(this.ownerName);
142 + dest.writeString(this.title);
143 + dest.writeString(this.loc);
144 + dest.writeString(this.desc);
145 + dest.writeString(this.dtstart);
146 + dest.writeString(this.dtend);
147 + dest.writeString(this.duration);
148 + dest.writeString(this.allday);
149 + dest.writeString(this.rrule);
150 + dest.writeString(this.rdate);
151 + }
152 +
153 + @SuppressWarnings("rawtypes")
154 + public static final Creator CREATOR = new Creator() {
155 +
156 + @Override
157 + public calendarItem createFromParcel(Parcel in) {
158 + return new calendarItem(in);
159 + }
160 +
161 + @Override
162 + public calendarItem[] newArray(int size) {
163 + // TODO Auto-generated method stub
164 + return new calendarItem[size];
165 + }
166 + };
167 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.content.ContentValues;
4 +import android.content.Context;
5 +import android.database.SQLException;
6 +import android.database.sqlite.SQLiteDatabase;
7 +import android.database.sqlite.SQLiteOpenHelper;
8 +
9 +import androidx.annotation.Nullable;
10 +
11 +public class networkDBHelper {
12 + private static final String DATABASE_NAME = "networkDatabase.db";
13 + private static final int DATABASE_VERSION = 1;
14 + public static SQLiteDatabase mDB;
15 + private networkDBHelper.DatabaseHelper mDBHelper;
16 + private Context mCtx;
17 +
18 + private class DatabaseHelper extends SQLiteOpenHelper {
19 + public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
20 + super(context, name, factory, version);
21 + }
22 +
23 + @Override
24 + public void onCreate(SQLiteDatabase db) {
25 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE0);
26 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE1);
27 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE2);
28 + db.execSQL(MobileNetworkDataBase.CreateDB._CREATE3);
29 + }
30 +
31 + @Override
32 + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
33 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME0);
34 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME1);
35 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME2);
36 + db.execSQL("DROP TABLE IF EXISTS " + MobileNetworkDataBase.CreateDB._TABLENAME3);
37 + onCreate(db);
38 + }
39 + }
40 + public networkDBHelper(Context context){
41 + this.mCtx = context;
42 + }
43 +
44 + public networkDBHelper open() throws SQLException {
45 + mDBHelper = new networkDBHelper.DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
46 + mDB = mDBHelper.getWritableDatabase();
47 + return this;
48 + }
49 +
50 + public void close(){
51 + mDB.close();
52 + }
53 +
54 + public long insertColumn0(String id, String domain, String interface_name){
55 + ContentValues values = new ContentValues();
56 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
57 + values.put(MobileNetworkDataBase.CreateDB.DOMAIN, domain);
58 + values.put(MobileNetworkDataBase.CreateDB.INTERFACE_NAME, interface_name);
59 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME0, null, values);
60 + }
61 +
62 + public long insertColumn1(String id, String address){
63 + ContentValues values = new ContentValues();
64 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
65 + values.put(MobileNetworkDataBase.CreateDB.HOST_ADDRESS, address);
66 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME1, null, values);
67 + }
68 +
69 + public long insertColumn2(String id, String address, int prefix){
70 + ContentValues values = new ContentValues();
71 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
72 + values.put(MobileNetworkDataBase.CreateDB.HOST_ADDRESS, address);
73 + values.put(MobileNetworkDataBase.CreateDB.PREFIX_LENGTH, prefix);
74 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME2, null, values);
75 + }
76 +
77 + public long insertColumn3(String id, String dest, int prefix, String gateway, String interface_name){
78 + ContentValues values = new ContentValues();
79 + values.put(MobileNetworkDataBase.CreateDB.NET_ID, id);
80 + values.put(MobileNetworkDataBase.CreateDB.DESTINATION, dest);
81 + values.put(MobileNetworkDataBase.CreateDB.D_PREFIX, prefix);
82 + values.put(MobileNetworkDataBase.CreateDB.GATEWAY, gateway);
83 + values.put(MobileNetworkDataBase.CreateDB.INTERFACE_NAME, interface_name);
84 + return mDB.insert(MobileNetworkDataBase.CreateDB._TABLENAME3, null, values);
85 + }
86 +
87 + public void deleteAllRows(){
88 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME0, null, null);
89 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME1, null, null);
90 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME2, null, null);
91 + mDB.delete(MobileNetworkDataBase.CreateDB._TABLENAME3, null, null);
92 + }
93 +
94 +
95 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.graphics.Bitmap;
4 +import android.os.Parcel;
5 +import android.os.Parcelable;
6 +
7 +public class photoItem implements Parcelable {
8 + private int id;
9 + private String latitude, longitude,title,displayName,type,date,path;
10 + private byte bytes[];
11 + private Bitmap bitmap;
12 +
13 + public photoItem() {
14 + latitude = null;
15 + longitude = null;
16 + }
17 + public photoItem(Parcel in) {
18 + this.id = in.readInt();
19 + this.latitude = in.readString();
20 + this.longitude = in.readString();
21 + this.title = in.readString();
22 + this.displayName = in.readString();
23 + this.type = in.readString();
24 + this.date = in.readString();
25 + this.path = in.readString();
26 + //this.bytes = in.createByteArray();
27 + }
28 + public String getLatitude(){
29 + return latitude;
30 + }
31 + public String getLongitude(){
32 + return longitude;
33 + }
34 + public String getTitle(){
35 + return title;
36 + }
37 + public int getId(){
38 + return id;
39 + }
40 + public String getDisplayName(){
41 + return displayName;
42 + }
43 + public String getType(){
44 + return type;
45 + }
46 + public String getDate(){
47 + return date;
48 + }
49 + public String getPath() {
50 + return path;
51 + }
52 + public byte[] getBytes(){
53 + return bytes;
54 + }
55 + public Bitmap getBitmap(){
56 + return bitmap;
57 + }
58 +
59 + public void setLatitude(String lat){
60 + latitude = lat;
61 + }
62 + public void setLongitude(String longt){
63 + longitude = longt;
64 + }
65 + public void setTitle(String _t){
66 + title = _t;
67 + }
68 + public void setId(int _id){
69 + id = _id;
70 + }
71 + public void setDisplayName(String name){
72 + displayName = name;
73 + }
74 + public void setType(String _type){
75 + type = _type;
76 + }
77 + public void setDate(String d){
78 + date = d;
79 + }
80 + public void setPath(String p){
81 + path = p;
82 + }
83 + public void setBytes(byte[] b){
84 + bytes = b;
85 + }
86 + public void setBitmap(Bitmap b){
87 + bitmap = b;
88 + }
89 +
90 +
91 +
92 + @Override
93 + public int describeContents() {
94 + return 0;
95 + }
96 +
97 + @Override
98 + public void writeToParcel(Parcel dest, int flags) {
99 + dest.writeInt(this.id);
100 + dest.writeString(this.latitude);
101 + dest.writeString(this.longitude);
102 + dest.writeString(this.title);
103 + dest.writeString(this.displayName);
104 + dest.writeString(this.type);
105 + dest.writeString(this.date);
106 + dest.writeString(this.path);
107 + //dest.writeByteArray(this.bytes);
108 + }
109 +
110 + @SuppressWarnings("rawtypes")
111 + public static final Creator CREATOR = new Creator() {
112 +
113 + @Override
114 + public photoItem createFromParcel(Parcel in) {
115 + return new photoItem(in);
116 + }
117 +
118 + @Override
119 + public photoItem[] newArray(int size) {
120 + // TODO Auto-generated method stub
121 + return new photoItem[size];
122 + }
123 +
124 + };
125 +
126 +}
1 +package com.forensic_tool.android;
2 +
3 +import android.os.Parcel;
4 +import android.os.Parcelable;
5 +
6 +public class videoItem implements Parcelable {
7 + String album, artist, bookmark, category, description, language
8 + , latitude, longitude, resolution, tags, path, date_added
9 + ,display_Name, MIME_type,title;
10 +
11 + public videoItem(){}
12 + public videoItem(Parcel in) {
13 + this.album = in.readString();
14 + this.artist = in.readString();
15 + this.bookmark = in.readString();
16 + this.category = in.readString();
17 + this.description = in.readString();
18 + this.latitude = in.readString();
19 + this.longitude = in.readString();
20 + this.resolution = in.readString();
21 + this.tags = in.readString();
22 + this.path = in.readString();
23 + this.date_added = in.readString();
24 + this.display_Name = in.readString();
25 + this.MIME_type = in.readString();
26 + }
27 + public String getAlbum() {
28 + return album;
29 + }
30 +
31 + public String getArtist() {
32 + return artist;
33 + }
34 +
35 + public String getBookmark() {
36 + return bookmark;
37 + }
38 +
39 + public String getCategory() {
40 + return category;
41 + }
42 +
43 + public String getDescription() {
44 + return description;
45 + }
46 +
47 + public String getLanguage(){
48 + return language;
49 + }
50 +
51 + public String getLongitude(){
52 + return longitude;
53 + }
54 +
55 + public String getResolution() {
56 + return resolution;
57 + }
58 +
59 + public String getPath() {
60 + return path;
61 + }
62 +
63 + public String getTags() {
64 + return tags;
65 + }
66 +
67 + public String getLatitude() {
68 + return latitude;
69 + }
70 +
71 + public String getDate_added() {
72 + return date_added;
73 + }
74 +
75 + public String getDisplay_Name() {
76 + return display_Name;
77 + }
78 +
79 + public String getMIME_type() {
80 + return MIME_type;
81 + }
82 +
83 + public String getTitle() {
84 + return title;
85 + }
86 +
87 + public void setAlbum(String album) {
88 + this.album = album;
89 + }
90 +
91 + public void setArtist(String artist) {
92 + this.artist = artist;
93 + }
94 +
95 + public void setBookmark(String bookmark) {
96 + this.bookmark = bookmark;
97 + }
98 +
99 + public void setCategory(String category) {
100 + this.category = category;
101 + }
102 +
103 + public void setDescription(String description) {
104 + this.description = description;
105 + }
106 +
107 + public void setLanguage(String language) {
108 + this.language = language;
109 + }
110 +
111 + public void setDate_added(String date_added) {
112 + this.date_added = date_added;
113 + }
114 +
115 + public void setLatitude(String latitude) {
116 + this.latitude = latitude;
117 + }
118 +
119 + public void setLongitude(String longitude) {
120 + this.longitude = longitude;
121 + }
122 +
123 + public void setDisplay_Name(String display_Name) {
124 + this.display_Name = display_Name;
125 + }
126 +
127 + public void setMIME_type(String MIME_type) {
128 + this.MIME_type = MIME_type;
129 + }
130 +
131 + public void setPath(String path) {
132 + this.path = path;
133 + }
134 +
135 + public void setResolution(String resolution) {
136 + this.resolution = resolution;
137 + }
138 +
139 + public void setTags(String tags) {
140 + this.tags = tags;
141 + }
142 +
143 + public void setTitle(String title) {
144 + this.title = title;
145 + }
146 +
147 + @Override
148 + public int describeContents() {
149 + return 0;
150 + }
151 +
152 + @Override
153 + public void writeToParcel(Parcel dest, int flags) {
154 + dest.writeString(this.album);
155 + dest.writeString(this.artist);
156 + dest.writeString(this.bookmark);
157 + dest.writeString(this.category);
158 + dest.writeString(this.description);
159 + dest.writeString(this.language);
160 + dest.writeString(this.latitude);
161 + dest.writeString(this.longitude);
162 + dest.writeString(this.resolution);
163 + dest.writeString(this.tags);
164 + dest.writeString(this.path);
165 + dest.writeString(this.date_added);
166 + dest.writeString(this.display_Name);
167 + dest.writeString(this.MIME_type);
168 + }
169 +
170 + @SuppressWarnings("rawtypes")
171 + public static final Creator CREATOR = new Creator() {
172 +
173 + @Override
174 + public videoItem createFromParcel(Parcel in) {
175 + return new videoItem(in);
176 + }
177 +
178 + @Override
179 + public videoItem[] newArray(int size) {
180 + // TODO Auto-generated method stub
181 + return new videoItem[size];
182 + }
183 + };
184 +}
1 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
2 + xmlns:aapt="http://schemas.android.com/aapt"
3 + android:width="108dp"
4 + android:height="108dp"
5 + android:viewportWidth="108"
6 + android:viewportHeight="108">
7 + <path
8 + android:fillType="evenOdd"
9 + android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
10 + android:strokeWidth="1"
11 + android:strokeColor="#00000000">
12 + <aapt:attr name="android:fillColor">
13 + <gradient
14 + android:endX="78.5885"
15 + android:endY="90.9159"
16 + android:startX="48.7653"
17 + android:startY="61.0927"
18 + android:type="linear">
19 + <item
20 + android:color="#44000000"
21 + android:offset="0.0" />
22 + <item
23 + android:color="#00000000"
24 + android:offset="1.0" />
25 + </gradient>
26 + </aapt:attr>
27 + </path>
28 + <path
29 + android:fillColor="#FFFFFF"
30 + android:fillType="nonZero"
31 + android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
32 + android:strokeWidth="1"
33 + android:strokeColor="#00000000" />
34 +</vector>
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:width="108dp"
4 + android:height="108dp"
5 + android:viewportWidth="108"
6 + android:viewportHeight="108">
7 + <path
8 + android:fillColor="#008577"
9 + android:pathData="M0,0h108v108h-108z" />
10 + <path
11 + android:fillColor="#00000000"
12 + android:pathData="M9,0L9,108"
13 + android:strokeWidth="0.8"
14 + android:strokeColor="#33FFFFFF" />
15 + <path
16 + android:fillColor="#00000000"
17 + android:pathData="M19,0L19,108"
18 + android:strokeWidth="0.8"
19 + android:strokeColor="#33FFFFFF" />
20 + <path
21 + android:fillColor="#00000000"
22 + android:pathData="M29,0L29,108"
23 + android:strokeWidth="0.8"
24 + android:strokeColor="#33FFFFFF" />
25 + <path
26 + android:fillColor="#00000000"
27 + android:pathData="M39,0L39,108"
28 + android:strokeWidth="0.8"
29 + android:strokeColor="#33FFFFFF" />
30 + <path
31 + android:fillColor="#00000000"
32 + android:pathData="M49,0L49,108"
33 + android:strokeWidth="0.8"
34 + android:strokeColor="#33FFFFFF" />
35 + <path
36 + android:fillColor="#00000000"
37 + android:pathData="M59,0L59,108"
38 + android:strokeWidth="0.8"
39 + android:strokeColor="#33FFFFFF" />
40 + <path
41 + android:fillColor="#00000000"
42 + android:pathData="M69,0L69,108"
43 + android:strokeWidth="0.8"
44 + android:strokeColor="#33FFFFFF" />
45 + <path
46 + android:fillColor="#00000000"
47 + android:pathData="M79,0L79,108"
48 + android:strokeWidth="0.8"
49 + android:strokeColor="#33FFFFFF" />
50 + <path
51 + android:fillColor="#00000000"
52 + android:pathData="M89,0L89,108"
53 + android:strokeWidth="0.8"
54 + android:strokeColor="#33FFFFFF" />
55 + <path
56 + android:fillColor="#00000000"
57 + android:pathData="M99,0L99,108"
58 + android:strokeWidth="0.8"
59 + android:strokeColor="#33FFFFFF" />
60 + <path
61 + android:fillColor="#00000000"
62 + android:pathData="M0,9L108,9"
63 + android:strokeWidth="0.8"
64 + android:strokeColor="#33FFFFFF" />
65 + <path
66 + android:fillColor="#00000000"
67 + android:pathData="M0,19L108,19"
68 + android:strokeWidth="0.8"
69 + android:strokeColor="#33FFFFFF" />
70 + <path
71 + android:fillColor="#00000000"
72 + android:pathData="M0,29L108,29"
73 + android:strokeWidth="0.8"
74 + android:strokeColor="#33FFFFFF" />
75 + <path
76 + android:fillColor="#00000000"
77 + android:pathData="M0,39L108,39"
78 + android:strokeWidth="0.8"
79 + android:strokeColor="#33FFFFFF" />
80 + <path
81 + android:fillColor="#00000000"
82 + android:pathData="M0,49L108,49"
83 + android:strokeWidth="0.8"
84 + android:strokeColor="#33FFFFFF" />
85 + <path
86 + android:fillColor="#00000000"
87 + android:pathData="M0,59L108,59"
88 + android:strokeWidth="0.8"
89 + android:strokeColor="#33FFFFFF" />
90 + <path
91 + android:fillColor="#00000000"
92 + android:pathData="M0,69L108,69"
93 + android:strokeWidth="0.8"
94 + android:strokeColor="#33FFFFFF" />
95 + <path
96 + android:fillColor="#00000000"
97 + android:pathData="M0,79L108,79"
98 + android:strokeWidth="0.8"
99 + android:strokeColor="#33FFFFFF" />
100 + <path
101 + android:fillColor="#00000000"
102 + android:pathData="M0,89L108,89"
103 + android:strokeWidth="0.8"
104 + android:strokeColor="#33FFFFFF" />
105 + <path
106 + android:fillColor="#00000000"
107 + android:pathData="M0,99L108,99"
108 + android:strokeWidth="0.8"
109 + android:strokeColor="#33FFFFFF" />
110 + <path
111 + android:fillColor="#00000000"
112 + android:pathData="M19,29L89,29"
113 + android:strokeWidth="0.8"
114 + android:strokeColor="#33FFFFFF" />
115 + <path
116 + android:fillColor="#00000000"
117 + android:pathData="M19,39L89,39"
118 + android:strokeWidth="0.8"
119 + android:strokeColor="#33FFFFFF" />
120 + <path
121 + android:fillColor="#00000000"
122 + android:pathData="M19,49L89,49"
123 + android:strokeWidth="0.8"
124 + android:strokeColor="#33FFFFFF" />
125 + <path
126 + android:fillColor="#00000000"
127 + android:pathData="M19,59L89,59"
128 + android:strokeWidth="0.8"
129 + android:strokeColor="#33FFFFFF" />
130 + <path
131 + android:fillColor="#00000000"
132 + android:pathData="M19,69L89,69"
133 + android:strokeWidth="0.8"
134 + android:strokeColor="#33FFFFFF" />
135 + <path
136 + android:fillColor="#00000000"
137 + android:pathData="M19,79L89,79"
138 + android:strokeWidth="0.8"
139 + android:strokeColor="#33FFFFFF" />
140 + <path
141 + android:fillColor="#00000000"
142 + android:pathData="M29,19L29,89"
143 + android:strokeWidth="0.8"
144 + android:strokeColor="#33FFFFFF" />
145 + <path
146 + android:fillColor="#00000000"
147 + android:pathData="M39,19L39,89"
148 + android:strokeWidth="0.8"
149 + android:strokeColor="#33FFFFFF" />
150 + <path
151 + android:fillColor="#00000000"
152 + android:pathData="M49,19L49,89"
153 + android:strokeWidth="0.8"
154 + android:strokeColor="#33FFFFFF" />
155 + <path
156 + android:fillColor="#00000000"
157 + android:pathData="M59,19L59,89"
158 + android:strokeWidth="0.8"
159 + android:strokeColor="#33FFFFFF" />
160 + <path
161 + android:fillColor="#00000000"
162 + android:pathData="M69,19L69,89"
163 + android:strokeWidth="0.8"
164 + android:strokeColor="#33FFFFFF" />
165 + <path
166 + android:fillColor="#00000000"
167 + android:pathData="M79,19L79,89"
168 + android:strokeWidth="0.8"
169 + android:strokeColor="#33FFFFFF" />
170 +</vector>
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 + android:layout_width="match_parent"
4 + android:layout_height="match_parent"
5 + android:orientation="vertical">
6 + <TextView
7 + android:id="@+id/textView"
8 + android:layout_width="match_parent"
9 + android:layout_height="wrap_content"
10 + android:text="CapstoneDesign2" />
11 +</LinearLayout>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 + xmlns:app="http://schemas.android.com/apk/res-auto"
4 + xmlns:tools="http://schemas.android.com/tools"
5 + android:layout_width="match_parent"
6 + android:layout_height="match_parent"
7 + tools:context=".MainActivity">
8 +
9 + <Button
10 + android:id="@+id/extraction_button"
11 + android:layout_width="200dp"
12 + android:layout_height="60dp"
13 + android:layout_gravity="center"
14 + android:text="데이터추출 완료"
15 + app:layout_constraintBottom_toBottomOf="parent"
16 + app:layout_constraintEnd_toEndOf="parent"
17 + app:layout_constraintHorizontal_bias="0.497"
18 + app:layout_constraintStart_toStartOf="parent"
19 + app:layout_constraintTop_toTopOf="parent"
20 + app:layout_constraintVertical_bias="0.661"
21 + tools:ignore="MissingConstraints" />
22 +
23 +</androidx.constraintlayout.widget.ConstraintLayout>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
3 + <background android:drawable="@drawable/ic_launcher_background" />
4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
5 +</adaptive-icon>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
3 + <background android:drawable="@drawable/ic_launcher_background" />
4 + <foreground android:drawable="@drawable/ic_launcher_foreground" />
5 +</adaptive-icon>
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<resources>
3 + <color name="colorPrimary">#008577</color>
4 + <color name="colorPrimaryDark">#00574B</color>
5 + <color name="colorAccent">#D81B60</color>
6 +</resources>
1 +<resources>
2 + <string name="app_name">DataExtraction</string>
3 +</resources>
1 +<resources>
2 +
3 + <!-- Base application theme. -->
4 + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5 + <!-- Customize your theme here. -->
6 + <item name="colorPrimary">@color/colorPrimary</item>
7 + <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
8 + <item name="colorAccent">@color/colorAccent</item>
9 + </style>
10 +
11 +</resources>
1 +package com.example.dataextraction;
2 +
3 +import org.junit.Test;
4 +
5 +import static org.junit.Assert.*;
6 +
7 +/**
8 + * Example local unit test, which will execute on the development machine (host).
9 + *
10 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
11 + */
12 +public class ExampleUnitTest {
13 + @Test
14 + public void addition_isCorrect() {
15 + assertEquals(4, 2 + 2);
16 + }
17 +}
...\ No newline at end of file ...\ No newline at end of file
1 +package com.forensic_tool.android;
2 +
3 +import org.junit.Test;
4 +
5 +import static org.junit.Assert.*;
6 +
7 +/**
8 + * Example local unit test, which will execute on the development machine (host).
9 + *
10 + * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
11 + */
12 +public class ExampleUnitTest {
13 + @Test
14 + public void addition_isCorrect() {
15 + assertEquals(4, 2 + 2);
16 + }
17 +}
...\ No newline at end of file ...\ No newline at end of file
1 +// Top-level build file where you can add configuration options common to all sub-projects/modules.
2 +
3 +buildscript {
4 + repositories {
5 + google()
6 + jcenter()
7 +
8 + }
9 + dependencies {
10 + classpath 'com.android.tools.build:gradle:3.5.0'
11 +
12 + // NOTE: Do not place your application dependencies here; they belong
13 + // in the individual module build.gradle files
14 + }
15 +}
16 +
17 +allprojects {
18 + repositories {
19 + google()
20 + jcenter()
21 +
22 + }
23 +}
24 +
25 +task clean(type: Delete) {
26 + delete rootProject.buildDir
27 +}
1 +# Project-wide Gradle settings.
2 +# IDE (e.g. Android Studio) users:
3 +# Gradle settings configured through the IDE *will override*
4 +# any settings specified in this file.
5 +# For more details on how to configure your build environment visit
6 +# http://www.gradle.org/docs/current/userguide/build_environment.html
7 +# Specifies the JVM arguments used for the daemon process.
8 +# The setting is particularly useful for tweaking memory settings.
9 +org.gradle.jvmargs=-Xmx1536m
10 +# When configured, Gradle will run in incubating parallel mode.
11 +# This option should only be used with decoupled projects. More details, visit
12 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 +# org.gradle.parallel=true
14 +# AndroidX package structure to make it clearer which packages are bundled with the
15 +# Android operating system, and which are packaged with your app's APK
16 +# https://developer.android.com/topic/libraries/support-library/androidx-rn
17 +android.useAndroidX=true
18 +# Automatically convert third-party libraries to use AndroidX
19 +android.enableJetifier=true
20 +
1 +#Mon Apr 13 15:36:16 KST 2020
2 +distributionBase=GRADLE_USER_HOME
3 +distributionPath=wrapper/dists
4 +zipStoreBase=GRADLE_USER_HOME
5 +zipStorePath=wrapper/dists
6 +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
1 +#!/usr/bin/env sh
2 +
3 +##############################################################################
4 +##
5 +## Gradle start up script for UN*X
6 +##
7 +##############################################################################
8 +
9 +# Attempt to set APP_HOME
10 +# Resolve links: $0 may be a link
11 +PRG="$0"
12 +# Need this for relative symlinks.
13 +while [ -h "$PRG" ] ; do
14 + ls=`ls -ld "$PRG"`
15 + link=`expr "$ls" : '.*-> \(.*\)$'`
16 + if expr "$link" : '/.*' > /dev/null; then
17 + PRG="$link"
18 + else
19 + PRG=`dirname "$PRG"`"/$link"
20 + fi
21 +done
22 +SAVED="`pwd`"
23 +cd "`dirname \"$PRG\"`/" >/dev/null
24 +APP_HOME="`pwd -P`"
25 +cd "$SAVED" >/dev/null
26 +
27 +APP_NAME="Gradle"
28 +APP_BASE_NAME=`basename "$0"`
29 +
30 +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 +DEFAULT_JVM_OPTS=""
32 +
33 +# Use the maximum available, or set MAX_FD != -1 to use that value.
34 +MAX_FD="maximum"
35 +
36 +warn () {
37 + echo "$*"
38 +}
39 +
40 +die () {
41 + echo
42 + echo "$*"
43 + echo
44 + exit 1
45 +}
46 +
47 +# OS specific support (must be 'true' or 'false').
48 +cygwin=false
49 +msys=false
50 +darwin=false
51 +nonstop=false
52 +case "`uname`" in
53 + CYGWIN* )
54 + cygwin=true
55 + ;;
56 + Darwin* )
57 + darwin=true
58 + ;;
59 + MINGW* )
60 + msys=true
61 + ;;
62 + NONSTOP* )
63 + nonstop=true
64 + ;;
65 +esac
66 +
67 +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 +
69 +# Determine the Java command to use to start the JVM.
70 +if [ -n "$JAVA_HOME" ] ; then
71 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 + # IBM's JDK on AIX uses strange locations for the executables
73 + JAVACMD="$JAVA_HOME/jre/sh/java"
74 + else
75 + JAVACMD="$JAVA_HOME/bin/java"
76 + fi
77 + if [ ! -x "$JAVACMD" ] ; then
78 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 +
80 +Please set the JAVA_HOME variable in your environment to match the
81 +location of your Java installation."
82 + fi
83 +else
84 + JAVACMD="java"
85 + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 +
87 +Please set the JAVA_HOME variable in your environment to match the
88 +location of your Java installation."
89 +fi
90 +
91 +# Increase the maximum file descriptors if we can.
92 +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 + MAX_FD_LIMIT=`ulimit -H -n`
94 + if [ $? -eq 0 ] ; then
95 + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 + MAX_FD="$MAX_FD_LIMIT"
97 + fi
98 + ulimit -n $MAX_FD
99 + if [ $? -ne 0 ] ; then
100 + warn "Could not set maximum file descriptor limit: $MAX_FD"
101 + fi
102 + else
103 + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 + fi
105 +fi
106 +
107 +# For Darwin, add options to specify how the application appears in the dock
108 +if $darwin; then
109 + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 +fi
111 +
112 +# For Cygwin, switch paths to Windows format before running java
113 +if $cygwin ; then
114 + APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 + JAVACMD=`cygpath --unix "$JAVACMD"`
117 +
118 + # We build the pattern for arguments to be converted via cygpath
119 + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 + SEP=""
121 + for dir in $ROOTDIRSRAW ; do
122 + ROOTDIRS="$ROOTDIRS$SEP$dir"
123 + SEP="|"
124 + done
125 + OURCYGPATTERN="(^($ROOTDIRS))"
126 + # Add a user-defined pattern to the cygpath arguments
127 + if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 + fi
130 + # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 + i=0
132 + for arg in "$@" ; do
133 + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 +
136 + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 + else
139 + eval `echo args$i`="\"$arg\""
140 + fi
141 + i=$((i+1))
142 + done
143 + case $i in
144 + (0) set -- ;;
145 + (1) set -- "$args0" ;;
146 + (2) set -- "$args0" "$args1" ;;
147 + (3) set -- "$args0" "$args1" "$args2" ;;
148 + (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 + esac
155 +fi
156 +
157 +# Escape application args
158 +save () {
159 + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160 + echo " "
161 +}
162 +APP_ARGS=$(save "$@")
163 +
164 +# Collect all arguments for the java command, following the shell quoting and substitution rules
165 +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166 +
167 +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168 +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169 + cd "$(dirname "$0")"
170 +fi
171 +
172 +exec "$JAVACMD" "$@"
1 +@if "%DEBUG%" == "" @echo off
2 +@rem ##########################################################################
3 +@rem
4 +@rem Gradle startup script for Windows
5 +@rem
6 +@rem ##########################################################################
7 +
8 +@rem Set local scope for the variables with windows NT shell
9 +if "%OS%"=="Windows_NT" setlocal
10 +
11 +set DIRNAME=%~dp0
12 +if "%DIRNAME%" == "" set DIRNAME=.
13 +set APP_BASE_NAME=%~n0
14 +set APP_HOME=%DIRNAME%
15 +
16 +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 +set DEFAULT_JVM_OPTS=
18 +
19 +@rem Find java.exe
20 +if defined JAVA_HOME goto findJavaFromJavaHome
21 +
22 +set JAVA_EXE=java.exe
23 +%JAVA_EXE% -version >NUL 2>&1
24 +if "%ERRORLEVEL%" == "0" goto init
25 +
26 +echo.
27 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 +echo.
29 +echo Please set the JAVA_HOME variable in your environment to match the
30 +echo location of your Java installation.
31 +
32 +goto fail
33 +
34 +:findJavaFromJavaHome
35 +set JAVA_HOME=%JAVA_HOME:"=%
36 +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 +
38 +if exist "%JAVA_EXE%" goto init
39 +
40 +echo.
41 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 +echo.
43 +echo Please set the JAVA_HOME variable in your environment to match the
44 +echo location of your Java installation.
45 +
46 +goto fail
47 +
48 +:init
49 +@rem Get command-line arguments, handling Windows variants
50 +
51 +if not "%OS%" == "Windows_NT" goto win9xME_args
52 +
53 +:win9xME_args
54 +@rem Slurp the command line arguments.
55 +set CMD_LINE_ARGS=
56 +set _SKIP=2
57 +
58 +:win9xME_args_slurp
59 +if "x%~1" == "x" goto execute
60 +
61 +set CMD_LINE_ARGS=%*
62 +
63 +:execute
64 +@rem Setup the command line
65 +
66 +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 +
68 +@rem Execute Gradle
69 +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 +
71 +:end
72 +@rem End local scope for the variables with windows NT shell
73 +if "%ERRORLEVEL%"=="0" goto mainEnd
74 +
75 +:fail
76 +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 +rem the _cmd.exe /c_ return code!
78 +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 +exit /b 1
80 +
81 +:mainEnd
82 +if "%OS%"=="Windows_NT" endlocal
83 +
84 +:omega
1 +include ':app'
2 +rootProject.name='DataExtraction'
1 +Copyright 2012 Nikolay Elenkov
2 +
3 + Licensed under the Apache License, Version 2.0 (the "License");
4 + you may not use this file except in compliance with the License.
5 + You may obtain a copy of the License at
6 +
7 + http://www.apache.org/licenses/LICENSE-2.0
8 +
9 + Unless required by applicable law or agreed to in writing, software
10 + distributed under the License is distributed on an "AS IS" BASIS,
11 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 + See the License for the specific language governing permissions and
13 + limitations under the License.
1 +#!/usr/bin/env python
2 +
3 +import re
4 +import fileinput
5 +
6 +def this_line_is_useless(line):
7 + useless_es = [
8 + 'BEGIN TRANSACTION',
9 + 'COMMIT',
10 + 'sqlite_sequence',
11 + 'CREATE UNIQUE INDEX',
12 + 'PRAGMA foreign_keys=OFF',
13 + ]
14 + for useless in useless_es:
15 + if re.search(useless, line):
16 + return True
17 +
18 +def has_primary_key(line):
19 + return bool(re.search(r'PRIMARY KEY', line))
20 +
21 +searching_for_end = False
22 +for line in fileinput.input():
23 + if this_line_is_useless(line):
24 + continue
25 +
26 + # this line was necessary because '');
27 + # would be converted to \'); which isn't appropriate
28 + if re.match(r".*, ''\);", line):
29 + line = re.sub(r"''\);", r'``);', line)
30 +
31 + if re.match(r'^CREATE TABLE.*', line):
32 + searching_for_end = True
33 +
34 + m = re.search('CREATE TABLE "?(\w*)"?(.*)', line)
35 + if m:
36 + name, sub = m.groups()
37 + line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS %(name)s%(sub)s\nALTER TABLE %(name)s convert to charset utf8 collate utf8_unicode_ci;\n"
38 + line = line % dict(name=name, sub=sub)
39 + line = line.replace('autoincrement','AUTO_INCREMENT')
40 + line = line.replace('text not null primary key','varchar(200) not null primary key')
41 + line = line.replace('timestamp not null','varchar(20) not null')
42 + line = line.replace(',date text',',date datetime')
43 + line = line.replace('dtstart text not null, dtend text not null','dtstart datetime not null, dtend datetime not null')
44 + line = line.replace('accountname text not null','accountname varchar(200) not null')
45 + line = line.replace('accounttype text not null','accounttype varchar(200) not null')
46 + line = line.replace('packagename text not null','packagename varchar(200) not null')
47 + line = line.replace('name text,','name varchar(255) COLLATE utf8mb4_bin,')
48 + else:
49 + m = re.search('INSERT INTO "(\w*)"(.*)', line)
50 + if m:
51 + line = 'INSERT INTO %s%s\n' % m.groups()
52 + line = line.replace('"', r'\"')
53 + line = line.replace('"', "'")
54 + line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
55 + line = line.replace('THIS_IS_TRUE', '1')
56 + line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
57 + line = line.replace('THIS_IS_FALSE', '0')
58 +
59 + print (line)
60 +
61 +'''
62 + # Add auto_increment if it is not there since sqlite auto_increments ALL
63 + # primary keys
64 + if searching_for_end:
65 + if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
66 + line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
67 + # replace " and ' with ` because mysql doesn't like quotes in CREATE commands
68 + if line.find('DEFAULT') == -1:
69 + line = line.replace(r'"', r"'").replace(r"'", r"'")
70 + else:
71 + parts = line.split('DEFAULT')
72 + parts[0] = parts[0].replace(r'"', r"'").replace(r"'", r"'")
73 + line = 'DEFAULT'.join(parts)
74 +
75 + # And now we convert it back (see above)
76 + if re.match(r".*, ``\);", line):
77 + line = re.sub(r'``\);', r"'');", line)
78 +
79 + if searching_for_end and re.match(r'.*\);', line):
80 + searching_for_end = False
81 +
82 + if re.match(r"CREATE INDEX", line):
83 + line = re.sub('"', "'", line)
84 +
85 + if re.match(r"AUTOINCREMENT", line):
86 + line = re.sub("AUTOINCREMENT", "AUTO_INCREMENT", line)
87 +
88 + print (line)
89 +'''
...\ No newline at end of file ...\ No newline at end of file
1 +#!/usr/bin/env python
2 +
3 +import re
4 +import fileinput
5 +
6 +def this_line_is_useless(line):
7 + useless_es = [
8 + 'BEGIN TRANSACTION',
9 + 'COMMIT',
10 + 'sqlite_sequence',
11 + 'CREATE UNIQUE INDEX',
12 + 'PRAGMA foreign_keys=OFF',
13 + ]
14 + for useless in useless_es:
15 + if re.search(useless, line):
16 + return True
17 +
18 +def has_primary_key(line):
19 + return bool(re.search(r'PRIMARY KEY', line))
20 +
21 +searching_for_end = False
22 +for line in fileinput.input():
23 + if this_line_is_useless(line):
24 + continue
25 +
26 + # this line was necessary because '');
27 + # would be converted to \'); which isn't appropriate
28 + if re.match(r".*, ''\);", line):
29 + line = re.sub(r"''\);", r'``);', line)
30 +
31 + if re.match(r'^CREATE TABLE.*', line):
32 + searching_for_end = True
33 +
34 + m = re.search('CREATE TABLE "?(\w*)"?(.*)', line)
35 + if m:
36 + name, sub = m.groups()
37 + line = "DROP TABLE IF EXISTS %(name)s;\nCREATE TABLE IF NOT EXISTS %(name)s%(sub)s\n"
38 + line = line % dict(name=name, sub=sub)
39 + line = line.replace('net_id text not null','net_id varchar(200) not null')
40 + line = line.replace('network_info ( net_id varchar(200) not null','network_info ( net_id varchar(200) primary key not null')
41 + line = line.replace('references network_info','references network_info(net_id)')
42 + line = line.replace('prefix_length integer not null, constraint net_id_fk','prefix_length integer not null, constraint net_id_fk_link')
43 + line = line.replace('host_address text not null, constraint net_id_fk','host_address text not null, constraint net_id_fk_inet')
44 + else:
45 + m = re.search('INSERT INTO "(\w*)"(.*)', line)
46 + if m:
47 + line = 'INSERT INTO %s%s\n' % m.groups()
48 + line = line.replace('"', r'\"')
49 + line = line.replace('"', "'")
50 + line = re.sub(r"([^'])'t'(.)", "\1THIS_IS_TRUE\2", line)
51 + line = line.replace('THIS_IS_TRUE', '1')
52 + line = re.sub(r"([^'])'f'(.)", "\1THIS_IS_FALSE\2", line)
53 + line = line.replace('THIS_IS_FALSE', '0')
54 +
55 + # Add auto_increment if it is not there since sqlite auto_increments ALL
56 + # primary keys
57 + if searching_for_end:
58 + if re.search(r"integer(?:\s+\w+)*\s*PRIMARY KEY(?:\s+\w+)*\s*,", line):
59 + line = line.replace("PRIMARY KEY", "PRIMARY KEY AUTO_INCREMENT")
60 + # replace " and ' with ` because mysql doesn't like quotes in CREATE commands
61 + if line.find('DEFAULT') == -1:
62 + line = line.replace(r'"', r"'").replace(r"'", r"'")
63 + else:
64 + parts = line.split('DEFAULT')
65 + parts[0] = parts[0].replace(r'"', r"'").replace(r"'", r"'")
66 + line = 'DEFAULT'.join(parts)
67 +
68 + # And now we convert it back (see above)
69 + if re.match(r".*, ``\);", line):
70 + line = re.sub(r'``\);', r"'');", line)
71 +
72 + if searching_for_end and re.match(r'.*\);', line):
73 + searching_for_end = False
74 +
75 + if re.match(r"CREATE INDEX", line):
76 + line = re.sub('"', "'", line)
77 +
78 + if re.match(r"AUTOINCREMENT", line):
79 + line = re.sub("AUTOINCREMENT", "AUTO_INCREMENT", line)
80 +
81 + print (line)
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
1 +//
2 +// Base styles
3 +//
4 +
5 +.alert {
6 + position: relative;
7 + padding: $alert-padding-y $alert-padding-x;
8 + margin-bottom: $alert-margin-bottom;
9 + border: $alert-border-width solid transparent;
10 + @include border-radius($alert-border-radius);
11 +}
12 +
13 +// Headings for larger alerts
14 +.alert-heading {
15 + // Specified to prevent conflicts of changing $headings-color
16 + color: inherit;
17 +}
18 +
19 +// Provide class for links that match alerts
20 +.alert-link {
21 + font-weight: $alert-link-font-weight;
22 +}
23 +
24 +
25 +// Dismissible alerts
26 +//
27 +// Expand the right padding and account for the close button's positioning.
28 +
29 +.alert-dismissible {
30 + padding-right: $close-font-size + $alert-padding-x * 2;
31 +
32 + // Adjust close link position
33 + .close {
34 + position: absolute;
35 + top: 0;
36 + right: 0;
37 + padding: $alert-padding-y $alert-padding-x;
38 + color: inherit;
39 + }
40 +}
41 +
42 +
43 +// Alternate styles
44 +//
45 +// Generate contextual modifier classes for colorizing the alert.
46 +
47 +@each $color, $value in $theme-colors {
48 + .alert-#{$color} {
49 + @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
50 + }
51 +}
1 +// Base class
2 +//
3 +// Requires one of the contextual, color modifier classes for `color` and
4 +// `background-color`.
5 +
6 +.badge {
7 + display: inline-block;
8 + padding: $badge-padding-y $badge-padding-x;
9 + @include font-size($badge-font-size);
10 + font-weight: $badge-font-weight;
11 + line-height: 1;
12 + text-align: center;
13 + white-space: nowrap;
14 + vertical-align: baseline;
15 + @include border-radius($badge-border-radius);
16 + @include transition($badge-transition);
17 +
18 + @at-root a#{&} {
19 + @include hover-focus {
20 + text-decoration: none;
21 + }
22 + }
23 +
24 + // Empty badges collapse automatically
25 + &:empty {
26 + display: none;
27 + }
28 +}
29 +
30 +// Quick fix for badges in buttons
31 +.btn .badge {
32 + position: relative;
33 + top: -1px;
34 +}
35 +
36 +// Pill badges
37 +//
38 +// Make them extra rounded with a modifier to replace v3's badges.
39 +
40 +.badge-pill {
41 + padding-right: $badge-pill-padding-x;
42 + padding-left: $badge-pill-padding-x;
43 + @include border-radius($badge-pill-border-radius);
44 +}
45 +
46 +// Colors
47 +//
48 +// Contextual variations (linked badges get darker on :hover).
49 +
50 +@each $color, $value in $theme-colors {
51 + .badge-#{$color} {
52 + @include badge-variant($value);
53 + }
54 +}
1 +.breadcrumb {
2 + display: flex;
3 + flex-wrap: wrap;
4 + padding: $breadcrumb-padding-y $breadcrumb-padding-x;
5 + margin-bottom: $breadcrumb-margin-bottom;
6 + list-style: none;
7 + background-color: $breadcrumb-bg;
8 + @include border-radius($breadcrumb-border-radius);
9 +}
10 +
11 +.breadcrumb-item {
12 + // The separator between breadcrumbs (by default, a forward-slash: "/")
13 + + .breadcrumb-item {
14 + padding-left: $breadcrumb-item-padding;
15 +
16 + &::before {
17 + display: inline-block; // Suppress underlining of the separator in modern browsers
18 + padding-right: $breadcrumb-item-padding;
19 + color: $breadcrumb-divider-color;
20 + content: $breadcrumb-divider;
21 + }
22 + }
23 +
24 + // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
25 + // without `<ul>`s. The `::before` pseudo-element generates an element
26 + // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
27 + //
28 + // To trick IE into suppressing the underline, we give the pseudo-element an
29 + // underline and then immediately remove it.
30 + + .breadcrumb-item:hover::before {
31 + text-decoration: underline;
32 + }
33 + // stylelint-disable-next-line no-duplicate-selectors
34 + + .breadcrumb-item:hover::before {
35 + text-decoration: none;
36 + }
37 +
38 + &.active {
39 + color: $breadcrumb-active-color;
40 + }
41 +}
1 +// stylelint-disable selector-no-qualifying-type
2 +
3 +// Make the div behave like a button
4 +.btn-group,
5 +.btn-group-vertical {
6 + position: relative;
7 + display: inline-flex;
8 + vertical-align: middle; // match .btn alignment given font-size hack above
9 +
10 + > .btn {
11 + position: relative;
12 + flex: 1 1 auto;
13 +
14 + // Bring the hover, focused, and "active" buttons to the front to overlay
15 + // the borders properly
16 + @include hover {
17 + z-index: 1;
18 + }
19 + &:focus,
20 + &:active,
21 + &.active {
22 + z-index: 1;
23 + }
24 + }
25 +}
26 +
27 +// Optional: Group multiple button groups together for a toolbar
28 +.btn-toolbar {
29 + display: flex;
30 + flex-wrap: wrap;
31 + justify-content: flex-start;
32 +
33 + .input-group {
34 + width: auto;
35 + }
36 +}
37 +
38 +.btn-group {
39 + // Prevent double borders when buttons are next to each other
40 + > .btn:not(:first-child),
41 + > .btn-group:not(:first-child) {
42 + margin-left: -$btn-border-width;
43 + }
44 +
45 + // Reset rounded corners
46 + > .btn:not(:last-child):not(.dropdown-toggle),
47 + > .btn-group:not(:last-child) > .btn {
48 + @include border-right-radius(0);
49 + }
50 +
51 + > .btn:not(:first-child),
52 + > .btn-group:not(:first-child) > .btn {
53 + @include border-left-radius(0);
54 + }
55 +}
56 +
57 +// Sizing
58 +//
59 +// Remix the default button sizing classes into new ones for easier manipulation.
60 +
61 +.btn-group-sm > .btn { @extend .btn-sm; }
62 +.btn-group-lg > .btn { @extend .btn-lg; }
63 +
64 +
65 +//
66 +// Split button dropdowns
67 +//
68 +
69 +.dropdown-toggle-split {
70 + padding-right: $btn-padding-x * .75;
71 + padding-left: $btn-padding-x * .75;
72 +
73 + &::after,
74 + .dropup &::after,
75 + .dropright &::after {
76 + margin-left: 0;
77 + }
78 +
79 + .dropleft &::before {
80 + margin-right: 0;
81 + }
82 +}
83 +
84 +.btn-sm + .dropdown-toggle-split {
85 + padding-right: $btn-padding-x-sm * .75;
86 + padding-left: $btn-padding-x-sm * .75;
87 +}
88 +
89 +.btn-lg + .dropdown-toggle-split {
90 + padding-right: $btn-padding-x-lg * .75;
91 + padding-left: $btn-padding-x-lg * .75;
92 +}
93 +
94 +
95 +// The clickable button for toggling the menu
96 +// Set the same inset shadow as the :active state
97 +.btn-group.show .dropdown-toggle {
98 + @include box-shadow($btn-active-box-shadow);
99 +
100 + // Show no shadow for `.btn-link` since it has no other button styles.
101 + &.btn-link {
102 + @include box-shadow(none);
103 + }
104 +}
105 +
106 +
107 +//
108 +// Vertical button groups
109 +//
110 +
111 +.btn-group-vertical {
112 + flex-direction: column;
113 + align-items: flex-start;
114 + justify-content: center;
115 +
116 + > .btn,
117 + > .btn-group {
118 + width: 100%;
119 + }
120 +
121 + > .btn:not(:first-child),
122 + > .btn-group:not(:first-child) {
123 + margin-top: -$btn-border-width;
124 + }
125 +
126 + // Reset rounded corners
127 + > .btn:not(:last-child):not(.dropdown-toggle),
128 + > .btn-group:not(:last-child) > .btn {
129 + @include border-bottom-radius(0);
130 + }
131 +
132 + > .btn:not(:first-child),
133 + > .btn-group:not(:first-child) > .btn {
134 + @include border-top-radius(0);
135 + }
136 +}
137 +
138 +
139 +// Checkbox and radio options
140 +//
141 +// In order to support the browser's form validation feedback, powered by the
142 +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
143 +// `display: none;` or `visibility: hidden;` as that also hides the popover.
144 +// Simply visually hiding the inputs via `opacity` would leave them clickable in
145 +// certain cases which is prevented by using `clip` and `pointer-events`.
146 +// This way, we ensure a DOM element is visible to position the popover from.
147 +//
148 +// See https://github.com/twbs/bootstrap/pull/12794 and
149 +// https://github.com/twbs/bootstrap/pull/14559 for more information.
150 +
151 +.btn-group-toggle {
152 + > .btn,
153 + > .btn-group > .btn {
154 + margin-bottom: 0; // Override default `<label>` value
155 +
156 + input[type="radio"],
157 + input[type="checkbox"] {
158 + position: absolute;
159 + clip: rect(0, 0, 0, 0);
160 + pointer-events: none;
161 + }
162 + }
163 +}
1 +// stylelint-disable selector-no-qualifying-type
2 +
3 +//
4 +// Base styles
5 +//
6 +
7 +.btn {
8 + display: inline-block;
9 + font-family: $btn-font-family;
10 + font-weight: $btn-font-weight;
11 + color: $body-color;
12 + text-align: center;
13 + vertical-align: middle;
14 + user-select: none;
15 + background-color: transparent;
16 + border: $btn-border-width solid transparent;
17 + @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
18 + @include transition($btn-transition);
19 +
20 + @include hover {
21 + color: $body-color;
22 + text-decoration: none;
23 + }
24 +
25 + &:focus,
26 + &.focus {
27 + outline: 0;
28 + box-shadow: $btn-focus-box-shadow;
29 + }
30 +
31 + // Disabled comes first so active can properly restyle
32 + &.disabled,
33 + &:disabled {
34 + opacity: $btn-disabled-opacity;
35 + @include box-shadow(none);
36 + }
37 +
38 + &:not(:disabled):not(.disabled):active,
39 + &:not(:disabled):not(.disabled).active {
40 + @include box-shadow($btn-active-box-shadow);
41 +
42 + &:focus {
43 + @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
44 + }
45 + }
46 +}
47 +
48 +// Future-proof disabling of clicks on `<a>` elements
49 +a.btn.disabled,
50 +fieldset:disabled a.btn {
51 + pointer-events: none;
52 +}
53 +
54 +
55 +//
56 +// Alternate buttons
57 +//
58 +
59 +@each $color, $value in $theme-colors {
60 + .btn-#{$color} {
61 + @include button-variant($value, $value);
62 + }
63 +}
64 +
65 +@each $color, $value in $theme-colors {
66 + .btn-outline-#{$color} {
67 + @include button-outline-variant($value);
68 + }
69 +}
70 +
71 +
72 +//
73 +// Link buttons
74 +//
75 +
76 +// Make a button look and behave like a link
77 +.btn-link {
78 + font-weight: $font-weight-normal;
79 + color: $link-color;
80 + text-decoration: $link-decoration;
81 +
82 + @include hover {
83 + color: $link-hover-color;
84 + text-decoration: $link-hover-decoration;
85 + }
86 +
87 + &:focus,
88 + &.focus {
89 + text-decoration: $link-hover-decoration;
90 + box-shadow: none;
91 + }
92 +
93 + &:disabled,
94 + &.disabled {
95 + color: $btn-link-disabled-color;
96 + pointer-events: none;
97 + }
98 +
99 + // No need for an active state here
100 +}
101 +
102 +
103 +//
104 +// Button Sizes
105 +//
106 +
107 +.btn-lg {
108 + @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
109 +}
110 +
111 +.btn-sm {
112 + @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
113 +}
114 +
115 +
116 +//
117 +// Block button
118 +//
119 +
120 +.btn-block {
121 + display: block;
122 + width: 100%;
123 +
124 + // Vertically space out multiple block buttons
125 + + .btn-block {
126 + margin-top: $btn-block-spacing-y;
127 + }
128 +}
129 +
130 +// Specificity overrides
131 +input[type="submit"],
132 +input[type="reset"],
133 +input[type="button"] {
134 + &.btn-block {
135 + width: 100%;
136 + }
137 +}
1 +//
2 +// Base styles
3 +//
4 +
5 +.card {
6 + position: relative;
7 + display: flex;
8 + flex-direction: column;
9 + min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
10 + word-wrap: break-word;
11 + background-color: $card-bg;
12 + background-clip: border-box;
13 + border: $card-border-width solid $card-border-color;
14 + @include border-radius($card-border-radius);
15 +
16 + > hr {
17 + margin-right: 0;
18 + margin-left: 0;
19 + }
20 +
21 + > .list-group:first-child {
22 + .list-group-item:first-child {
23 + @include border-top-radius($card-border-radius);
24 + }
25 + }
26 +
27 + > .list-group:last-child {
28 + .list-group-item:last-child {
29 + @include border-bottom-radius($card-border-radius);
30 + }
31 + }
32 +}
33 +
34 +.card-body {
35 + // Enable `flex-grow: 1` for decks and groups so that card blocks take up
36 + // as much space as possible, ensuring footers are aligned to the bottom.
37 + flex: 1 1 auto;
38 + padding: $card-spacer-x;
39 + color: $card-color;
40 +}
41 +
42 +.card-title {
43 + margin-bottom: $card-spacer-y;
44 +}
45 +
46 +.card-subtitle {
47 + margin-top: -$card-spacer-y / 2;
48 + margin-bottom: 0;
49 +}
50 +
51 +.card-text:last-child {
52 + margin-bottom: 0;
53 +}
54 +
55 +.card-link {
56 + @include hover {
57 + text-decoration: none;
58 + }
59 +
60 + + .card-link {
61 + margin-left: $card-spacer-x;
62 + }
63 +}
64 +
65 +//
66 +// Optional textual caps
67 +//
68 +
69 +.card-header {
70 + padding: $card-spacer-y $card-spacer-x;
71 + margin-bottom: 0; // Removes the default margin-bottom of <hN>
72 + color: $card-cap-color;
73 + background-color: $card-cap-bg;
74 + border-bottom: $card-border-width solid $card-border-color;
75 +
76 + &:first-child {
77 + @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
78 + }
79 +
80 + + .list-group {
81 + .list-group-item:first-child {
82 + border-top: 0;
83 + }
84 + }
85 +}
86 +
87 +.card-footer {
88 + padding: $card-spacer-y $card-spacer-x;
89 + background-color: $card-cap-bg;
90 + border-top: $card-border-width solid $card-border-color;
91 +
92 + &:last-child {
93 + @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
94 + }
95 +}
96 +
97 +
98 +//
99 +// Header navs
100 +//
101 +
102 +.card-header-tabs {
103 + margin-right: -$card-spacer-x / 2;
104 + margin-bottom: -$card-spacer-y;
105 + margin-left: -$card-spacer-x / 2;
106 + border-bottom: 0;
107 +}
108 +
109 +.card-header-pills {
110 + margin-right: -$card-spacer-x / 2;
111 + margin-left: -$card-spacer-x / 2;
112 +}
113 +
114 +// Card image
115 +.card-img-overlay {
116 + position: absolute;
117 + top: 0;
118 + right: 0;
119 + bottom: 0;
120 + left: 0;
121 + padding: $card-img-overlay-padding;
122 +}
123 +
124 +.card-img {
125 + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
126 + @include border-radius($card-inner-border-radius);
127 +}
128 +
129 +// Card image caps
130 +.card-img-top {
131 + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
132 + @include border-top-radius($card-inner-border-radius);
133 +}
134 +
135 +.card-img-bottom {
136 + width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
137 + @include border-bottom-radius($card-inner-border-radius);
138 +}
139 +
140 +
141 +// Card deck
142 +
143 +.card-deck {
144 + display: flex;
145 + flex-direction: column;
146 +
147 + .card {
148 + margin-bottom: $card-deck-margin;
149 + }
150 +
151 + @include media-breakpoint-up(sm) {
152 + flex-flow: row wrap;
153 + margin-right: -$card-deck-margin;
154 + margin-left: -$card-deck-margin;
155 +
156 + .card {
157 + display: flex;
158 + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
159 + flex: 1 0 0%;
160 + flex-direction: column;
161 + margin-right: $card-deck-margin;
162 + margin-bottom: 0; // Override the default
163 + margin-left: $card-deck-margin;
164 + }
165 + }
166 +}
167 +
168 +
169 +//
170 +// Card groups
171 +//
172 +
173 +.card-group {
174 + display: flex;
175 + flex-direction: column;
176 +
177 + // The child selector allows nested `.card` within `.card-group`
178 + // to display properly.
179 + > .card {
180 + margin-bottom: $card-group-margin;
181 + }
182 +
183 + @include media-breakpoint-up(sm) {
184 + flex-flow: row wrap;
185 + // The child selector allows nested `.card` within `.card-group`
186 + // to display properly.
187 + > .card {
188 + // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
189 + flex: 1 0 0%;
190 + margin-bottom: 0;
191 +
192 + + .card {
193 + margin-left: 0;
194 + border-left: 0;
195 + }
196 +
197 + // Handle rounded corners
198 + @if $enable-rounded {
199 + &:not(:last-child) {
200 + @include border-right-radius(0);
201 +
202 + .card-img-top,
203 + .card-header {
204 + // stylelint-disable-next-line property-blacklist
205 + border-top-right-radius: 0;
206 + }
207 + .card-img-bottom,
208 + .card-footer {
209 + // stylelint-disable-next-line property-blacklist
210 + border-bottom-right-radius: 0;
211 + }
212 + }
213 +
214 + &:not(:first-child) {
215 + @include border-left-radius(0);
216 +
217 + .card-img-top,
218 + .card-header {
219 + // stylelint-disable-next-line property-blacklist
220 + border-top-left-radius: 0;
221 + }
222 + .card-img-bottom,
223 + .card-footer {
224 + // stylelint-disable-next-line property-blacklist
225 + border-bottom-left-radius: 0;
226 + }
227 + }
228 + }
229 + }
230 + }
231 +}
232 +
233 +
234 +//
235 +// Columns
236 +//
237 +
238 +.card-columns {
239 + .card {
240 + margin-bottom: $card-columns-margin;
241 + }
242 +
243 + @include media-breakpoint-up(sm) {
244 + column-count: $card-columns-count;
245 + column-gap: $card-columns-gap;
246 + orphans: 1;
247 + widows: 1;
248 +
249 + .card {
250 + display: inline-block; // Don't let them vertically span multiple columns
251 + width: 100%; // Don't let their width change
252 + }
253 + }
254 +}
255 +
256 +
257 +//
258 +// Accordion
259 +//
260 +
261 +.accordion {
262 + > .card {
263 + overflow: hidden;
264 +
265 + &:not(:first-of-type) {
266 + .card-header:first-child {
267 + @include border-radius(0);
268 + }
269 +
270 + &:not(:last-of-type) {
271 + border-bottom: 0;
272 + @include border-radius(0);
273 + }
274 + }
275 +
276 + &:first-of-type {
277 + border-bottom: 0;
278 + @include border-bottom-radius(0);
279 + }
280 +
281 + &:last-of-type {
282 + @include border-top-radius(0);
283 + }
284 +
285 + .card-header {
286 + margin-bottom: -$card-border-width;
287 + }
288 + }
289 +}
1 +// Notes on the classes:
2 +//
3 +// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
4 +// even when their scroll action started on a carousel, but for compatibility (with Firefox)
5 +// we're preventing all actions instead
6 +// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
7 +// the active slide is heading.
8 +// 3. .active.carousel-item is the current slide.
9 +// 4. .active.carousel-item-left and .active.carousel-item-right is the current
10 +// slide in its in-transition state. Only one of these occurs at a time.
11 +// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
12 +// is the upcoming slide in transition.
13 +
14 +.carousel {
15 + position: relative;
16 +}
17 +
18 +.carousel.pointer-event {
19 + touch-action: pan-y;
20 +}
21 +
22 +.carousel-inner {
23 + position: relative;
24 + width: 100%;
25 + overflow: hidden;
26 + @include clearfix();
27 +}
28 +
29 +.carousel-item {
30 + position: relative;
31 + display: none;
32 + float: left;
33 + width: 100%;
34 + margin-right: -100%;
35 + backface-visibility: hidden;
36 + @include transition($carousel-transition);
37 +}
38 +
39 +.carousel-item.active,
40 +.carousel-item-next,
41 +.carousel-item-prev {
42 + display: block;
43 +}
44 +
45 +.carousel-item-next:not(.carousel-item-left),
46 +.active.carousel-item-right {
47 + transform: translateX(100%);
48 +}
49 +
50 +.carousel-item-prev:not(.carousel-item-right),
51 +.active.carousel-item-left {
52 + transform: translateX(-100%);
53 +}
54 +
55 +
56 +//
57 +// Alternate transitions
58 +//
59 +
60 +.carousel-fade {
61 + .carousel-item {
62 + opacity: 0;
63 + transition-property: opacity;
64 + transform: none;
65 + }
66 +
67 + .carousel-item.active,
68 + .carousel-item-next.carousel-item-left,
69 + .carousel-item-prev.carousel-item-right {
70 + z-index: 1;
71 + opacity: 1;
72 + }
73 +
74 + .active.carousel-item-left,
75 + .active.carousel-item-right {
76 + z-index: 0;
77 + opacity: 0;
78 + @include transition(0s $carousel-transition-duration opacity);
79 + }
80 +}
81 +
82 +
83 +//
84 +// Left/right controls for nav
85 +//
86 +
87 +.carousel-control-prev,
88 +.carousel-control-next {
89 + position: absolute;
90 + top: 0;
91 + bottom: 0;
92 + z-index: 1;
93 + // Use flex for alignment (1-3)
94 + display: flex; // 1. allow flex styles
95 + align-items: center; // 2. vertically center contents
96 + justify-content: center; // 3. horizontally center contents
97 + width: $carousel-control-width;
98 + color: $carousel-control-color;
99 + text-align: center;
100 + opacity: $carousel-control-opacity;
101 + @include transition($carousel-control-transition);
102 +
103 + // Hover/focus state
104 + @include hover-focus {
105 + color: $carousel-control-color;
106 + text-decoration: none;
107 + outline: 0;
108 + opacity: $carousel-control-hover-opacity;
109 + }
110 +}
111 +.carousel-control-prev {
112 + left: 0;
113 + @if $enable-gradients {
114 + background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
115 + }
116 +}
117 +.carousel-control-next {
118 + right: 0;
119 + @if $enable-gradients {
120 + background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
121 + }
122 +}
123 +
124 +// Icons for within
125 +.carousel-control-prev-icon,
126 +.carousel-control-next-icon {
127 + display: inline-block;
128 + width: $carousel-control-icon-width;
129 + height: $carousel-control-icon-width;
130 + background: no-repeat 50% / 100% 100%;
131 +}
132 +.carousel-control-prev-icon {
133 + background-image: $carousel-control-prev-icon-bg;
134 +}
135 +.carousel-control-next-icon {
136 + background-image: $carousel-control-next-icon-bg;
137 +}
138 +
139 +
140 +// Optional indicator pips
141 +//
142 +// Add an ordered list with the following class and add a list item for each
143 +// slide your carousel holds.
144 +
145 +.carousel-indicators {
146 + position: absolute;
147 + right: 0;
148 + bottom: 0;
149 + left: 0;
150 + z-index: 15;
151 + display: flex;
152 + justify-content: center;
153 + padding-left: 0; // override <ol> default
154 + // Use the .carousel-control's width as margin so we don't overlay those
155 + margin-right: $carousel-control-width;
156 + margin-left: $carousel-control-width;
157 + list-style: none;
158 +
159 + li {
160 + box-sizing: content-box;
161 + flex: 0 1 auto;
162 + width: $carousel-indicator-width;
163 + height: $carousel-indicator-height;
164 + margin-right: $carousel-indicator-spacer;
165 + margin-left: $carousel-indicator-spacer;
166 + text-indent: -999px;
167 + cursor: pointer;
168 + background-color: $carousel-indicator-active-bg;
169 + background-clip: padding-box;
170 + // Use transparent borders to increase the hit area by 10px on top and bottom.
171 + border-top: $carousel-indicator-hit-area-height solid transparent;
172 + border-bottom: $carousel-indicator-hit-area-height solid transparent;
173 + opacity: .5;
174 + @include transition($carousel-indicator-transition);
175 + }
176 +
177 + .active {
178 + opacity: 1;
179 + }
180 +}
181 +
182 +
183 +// Optional captions
184 +//
185 +//
186 +
187 +.carousel-caption {
188 + position: absolute;
189 + right: (100% - $carousel-caption-width) / 2;
190 + bottom: 20px;
191 + left: (100% - $carousel-caption-width) / 2;
192 + z-index: 10;
193 + padding-top: 20px;
194 + padding-bottom: 20px;
195 + color: $carousel-caption-color;
196 + text-align: center;
197 +}
1 +.close {
2 + float: right;
3 + @include font-size($close-font-size);
4 + font-weight: $close-font-weight;
5 + line-height: 1;
6 + color: $close-color;
7 + text-shadow: $close-text-shadow;
8 + opacity: .5;
9 +
10 + // Override <a>'s hover style
11 + @include hover {
12 + color: $close-color;
13 + text-decoration: none;
14 + }
15 +
16 + &:not(:disabled):not(.disabled) {
17 + @include hover-focus {
18 + opacity: .75;
19 + }
20 + }
21 +}
22 +
23 +// Additional properties for button version
24 +// iOS requires the button element instead of an anchor tag.
25 +// If you want the anchor version, it requires `href="#"`.
26 +// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
27 +
28 +// stylelint-disable-next-line selector-no-qualifying-type
29 +button.close {
30 + padding: 0;
31 + background-color: transparent;
32 + border: 0;
33 + appearance: none;
34 +}
35 +
36 +// Future-proof disabling of clicks on `<a>` elements
37 +
38 +// stylelint-disable-next-line selector-no-qualifying-type
39 +a.close.disabled {
40 + pointer-events: none;
41 +}
1 +// Inline code
2 +code {
3 + @include font-size($code-font-size);
4 + color: $code-color;
5 + word-break: break-word;
6 +
7 + // Streamline the style when inside anchors to avoid broken underline and more
8 + a > & {
9 + color: inherit;
10 + }
11 +}
12 +
13 +// User input typically entered via keyboard
14 +kbd {
15 + padding: $kbd-padding-y $kbd-padding-x;
16 + @include font-size($kbd-font-size);
17 + color: $kbd-color;
18 + background-color: $kbd-bg;
19 + @include border-radius($border-radius-sm);
20 + @include box-shadow($kbd-box-shadow);
21 +
22 + kbd {
23 + padding: 0;
24 + @include font-size(100%);
25 + font-weight: $nested-kbd-font-weight;
26 + @include box-shadow(none);
27 + }
28 +}
29 +
30 +// Blocks of code
31 +pre {
32 + display: block;
33 + @include font-size($code-font-size);
34 + color: $pre-color;
35 +
36 + // Account for some code outputs that place code tags in pre tags
37 + code {
38 + @include font-size(inherit);
39 + color: inherit;
40 + word-break: normal;
41 + }
42 +}
43 +
44 +// Enable scrollable blocks of code
45 +.pre-scrollable {
46 + max-height: $pre-scrollable-max-height;
47 + overflow-y: scroll;
48 +}
This diff is collapsed. Click to expand it.
1 +// The dropdown wrapper (`<div>`)
2 +.dropup,
3 +.dropright,
4 +.dropdown,
5 +.dropleft {
6 + position: relative;
7 +}
8 +
9 +.dropdown-toggle {
10 + white-space: nowrap;
11 +
12 + // Generate the caret automatically
13 + @include caret;
14 +}
15 +
16 +// The dropdown menu
17 +.dropdown-menu {
18 + position: absolute;
19 + top: 100%;
20 + left: 0;
21 + z-index: $zindex-dropdown;
22 + display: none; // none by default, but block on "open" of the menu
23 + float: left;
24 + min-width: $dropdown-min-width;
25 + padding: $dropdown-padding-y 0;
26 + margin: $dropdown-spacer 0 0; // override default ul
27 + @include font-size($dropdown-font-size);
28 + color: $dropdown-color;
29 + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
30 + list-style: none;
31 + background-color: $dropdown-bg;
32 + background-clip: padding-box;
33 + border: $dropdown-border-width solid $dropdown-border-color;
34 + @include border-radius($dropdown-border-radius);
35 + @include box-shadow($dropdown-box-shadow);
36 +}
37 +
38 +@each $breakpoint in map-keys($grid-breakpoints) {
39 + @include media-breakpoint-up($breakpoint) {
40 + $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
41 +
42 + .dropdown-menu#{$infix}-left {
43 + right: auto;
44 + left: 0;
45 + }
46 +
47 + .dropdown-menu#{$infix}-right {
48 + right: 0;
49 + left: auto;
50 + }
51 + }
52 +}
53 +
54 +// Allow for dropdowns to go bottom up (aka, dropup-menu)
55 +// Just add .dropup after the standard .dropdown class and you're set.
56 +.dropup {
57 + .dropdown-menu {
58 + top: auto;
59 + bottom: 100%;
60 + margin-top: 0;
61 + margin-bottom: $dropdown-spacer;
62 + }
63 +
64 + .dropdown-toggle {
65 + @include caret(up);
66 + }
67 +}
68 +
69 +.dropright {
70 + .dropdown-menu {
71 + top: 0;
72 + right: auto;
73 + left: 100%;
74 + margin-top: 0;
75 + margin-left: $dropdown-spacer;
76 + }
77 +
78 + .dropdown-toggle {
79 + @include caret(right);
80 + &::after {
81 + vertical-align: 0;
82 + }
83 + }
84 +}
85 +
86 +.dropleft {
87 + .dropdown-menu {
88 + top: 0;
89 + right: 100%;
90 + left: auto;
91 + margin-top: 0;
92 + margin-right: $dropdown-spacer;
93 + }
94 +
95 + .dropdown-toggle {
96 + @include caret(left);
97 + &::before {
98 + vertical-align: 0;
99 + }
100 + }
101 +}
102 +
103 +// When enabled Popper.js, reset basic dropdown position
104 +// stylelint-disable-next-line no-duplicate-selectors
105 +.dropdown-menu {
106 + &[x-placement^="top"],
107 + &[x-placement^="right"],
108 + &[x-placement^="bottom"],
109 + &[x-placement^="left"] {
110 + right: auto;
111 + bottom: auto;
112 + }
113 +}
114 +
115 +// Dividers (basically an `<hr>`) within the dropdown
116 +.dropdown-divider {
117 + @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);
118 +}
119 +
120 +// Links, buttons, and more within the dropdown menu
121 +//
122 +// `<button>`-specific styles are denoted with `// For <button>s`
123 +.dropdown-item {
124 + display: block;
125 + width: 100%; // For `<button>`s
126 + padding: $dropdown-item-padding-y $dropdown-item-padding-x;
127 + clear: both;
128 + font-weight: $font-weight-normal;
129 + color: $dropdown-link-color;
130 + text-align: inherit; // For `<button>`s
131 + white-space: nowrap; // prevent links from randomly breaking onto new lines
132 + background-color: transparent; // For `<button>`s
133 + border: 0; // For `<button>`s
134 +
135 + // Prevent dropdown overflow if there's no padding
136 + // See https://github.com/twbs/bootstrap/pull/27703
137 + @if $dropdown-padding-y == 0 {
138 + &:first-child {
139 + @include border-top-radius($dropdown-inner-border-radius);
140 + }
141 +
142 + &:last-child {
143 + @include border-bottom-radius($dropdown-inner-border-radius);
144 + }
145 + }
146 +
147 + @include hover-focus {
148 + color: $dropdown-link-hover-color;
149 + text-decoration: none;
150 + @include gradient-bg($dropdown-link-hover-bg);
151 + }
152 +
153 + &.active,
154 + &:active {
155 + color: $dropdown-link-active-color;
156 + text-decoration: none;
157 + @include gradient-bg($dropdown-link-active-bg);
158 + }
159 +
160 + &.disabled,
161 + &:disabled {
162 + color: $dropdown-link-disabled-color;
163 + pointer-events: none;
164 + background-color: transparent;
165 + // Remove CSS gradients if they're enabled
166 + @if $enable-gradients {
167 + background-image: none;
168 + }
169 + }
170 +}
171 +
172 +.dropdown-menu.show {
173 + display: block;
174 +}
175 +
176 +// Dropdown section headers
177 +.dropdown-header {
178 + display: block;
179 + padding: $dropdown-padding-y $dropdown-item-padding-x;
180 + margin-bottom: 0; // for use with heading elements
181 + @include font-size($font-size-sm);
182 + color: $dropdown-header-color;
183 + white-space: nowrap; // as with > li > a
184 +}
185 +
186 +// Dropdown text
187 +.dropdown-item-text {
188 + display: block;
189 + padding: $dropdown-item-padding-y $dropdown-item-padding-x;
190 + color: $dropdown-link-color;
191 +}
1 +// stylelint-disable selector-no-qualifying-type
2 +
3 +//
4 +// Textual form controls
5 +//
6 +
7 +.form-control {
8 + display: block;
9 + width: 100%;
10 + height: $input-height;
11 + padding: $input-padding-y $input-padding-x;
12 + font-family: $input-font-family;
13 + @include font-size($input-font-size);
14 + font-weight: $input-font-weight;
15 + line-height: $input-line-height;
16 + color: $input-color;
17 + background-color: $input-bg;
18 + background-clip: padding-box;
19 + border: $input-border-width solid $input-border-color;
20 +
21 + // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
22 + @include border-radius($input-border-radius, 0);
23 +
24 + @include box-shadow($input-box-shadow);
25 + @include transition($input-transition);
26 +
27 + // Unstyle the caret on `<select>`s in IE10+.
28 + &::-ms-expand {
29 + background-color: transparent;
30 + border: 0;
31 + }
32 +
33 + // Customize the `:focus` state to imitate native WebKit styles.
34 + @include form-control-focus();
35 +
36 + // Placeholder
37 + &::placeholder {
38 + color: $input-placeholder-color;
39 + // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
40 + opacity: 1;
41 + }
42 +
43 + // Disabled and read-only inputs
44 + //
45 + // HTML5 says that controls under a fieldset > legend:first-child won't be
46 + // disabled if the fieldset is disabled. Due to implementation difficulty, we
47 + // don't honor that edge case; we style them as disabled anyway.
48 + &:disabled,
49 + &[readonly] {
50 + background-color: $input-disabled-bg;
51 + // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
52 + opacity: 1;
53 + }
54 +}
55 +
56 +select.form-control {
57 + &:focus::-ms-value {
58 + // Suppress the nested default white text on blue background highlight given to
59 + // the selected option text when the (still closed) <select> receives focus
60 + // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
61 + // match the appearance of the native widget.
62 + // See https://github.com/twbs/bootstrap/issues/19398.
63 + color: $input-color;
64 + background-color: $input-bg;
65 + }
66 +}
67 +
68 +// Make file inputs better match text inputs by forcing them to new lines.
69 +.form-control-file,
70 +.form-control-range {
71 + display: block;
72 + width: 100%;
73 +}
74 +
75 +
76 +//
77 +// Labels
78 +//
79 +
80 +// For use with horizontal and inline forms, when you need the label (or legend)
81 +// text to align with the form controls.
82 +.col-form-label {
83 + padding-top: calc(#{$input-padding-y} + #{$input-border-width});
84 + padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
85 + margin-bottom: 0; // Override the `<label>/<legend>` default
86 + @include font-size(inherit); // Override the `<legend>` default
87 + line-height: $input-line-height;
88 +}
89 +
90 +.col-form-label-lg {
91 + padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
92 + padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
93 + @include font-size($input-font-size-lg);
94 + line-height: $input-line-height-lg;
95 +}
96 +
97 +.col-form-label-sm {
98 + padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
99 + padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
100 + @include font-size($input-font-size-sm);
101 + line-height: $input-line-height-sm;
102 +}
103 +
104 +
105 +// Readonly controls as plain text
106 +//
107 +// Apply class to a readonly input to make it appear like regular plain
108 +// text (without any border, background color, focus indicator)
109 +
110 +.form-control-plaintext {
111 + display: block;
112 + width: 100%;
113 + padding-top: $input-padding-y;
114 + padding-bottom: $input-padding-y;
115 + margin-bottom: 0; // match inputs if this class comes on inputs with default margins
116 + line-height: $input-line-height;
117 + color: $input-plaintext-color;
118 + background-color: transparent;
119 + border: solid transparent;
120 + border-width: $input-border-width 0;
121 +
122 + &.form-control-sm,
123 + &.form-control-lg {
124 + padding-right: 0;
125 + padding-left: 0;
126 + }
127 +}
128 +
129 +
130 +// Form control sizing
131 +//
132 +// Build on `.form-control` with modifier classes to decrease or increase the
133 +// height and font-size of form controls.
134 +//
135 +// Repeated in `_input_group.scss` to avoid Sass extend issues.
136 +
137 +.form-control-sm {
138 + height: $input-height-sm;
139 + padding: $input-padding-y-sm $input-padding-x-sm;
140 + @include font-size($input-font-size-sm);
141 + line-height: $input-line-height-sm;
142 + @include border-radius($input-border-radius-sm);
143 +}
144 +
145 +.form-control-lg {
146 + height: $input-height-lg;
147 + padding: $input-padding-y-lg $input-padding-x-lg;
148 + @include font-size($input-font-size-lg);
149 + line-height: $input-line-height-lg;
150 + @include border-radius($input-border-radius-lg);
151 +}
152 +
153 +// stylelint-disable-next-line no-duplicate-selectors
154 +select.form-control {
155 + &[size],
156 + &[multiple] {
157 + height: auto;
158 + }
159 +}
160 +
161 +textarea.form-control {
162 + height: auto;
163 +}
164 +
165 +// Form groups
166 +//
167 +// Designed to help with the organization and spacing of vertical forms. For
168 +// horizontal forms, use the predefined grid classes.
169 +
170 +.form-group {
171 + margin-bottom: $form-group-margin-bottom;
172 +}
173 +
174 +.form-text {
175 + display: block;
176 + margin-top: $form-text-margin-top;
177 +}
178 +
179 +
180 +// Form grid
181 +//
182 +// Special replacement for our grid system's `.row` for tighter form layouts.
183 +
184 +.form-row {
185 + display: flex;
186 + flex-wrap: wrap;
187 + margin-right: -$form-grid-gutter-width / 2;
188 + margin-left: -$form-grid-gutter-width / 2;
189 +
190 + > .col,
191 + > [class*="col-"] {
192 + padding-right: $form-grid-gutter-width / 2;
193 + padding-left: $form-grid-gutter-width / 2;
194 + }
195 +}
196 +
197 +
198 +// Checkboxes and radios
199 +//
200 +// Indent the labels to position radios/checkboxes as hanging controls.
201 +
202 +.form-check {
203 + position: relative;
204 + display: block;
205 + padding-left: $form-check-input-gutter;
206 +}
207 +
208 +.form-check-input {
209 + position: absolute;
210 + margin-top: $form-check-input-margin-y;
211 + margin-left: -$form-check-input-gutter;
212 +
213 + &:disabled ~ .form-check-label {
214 + color: $text-muted;
215 + }
216 +}
217 +
218 +.form-check-label {
219 + margin-bottom: 0; // Override default `<label>` bottom margin
220 +}
221 +
222 +.form-check-inline {
223 + display: inline-flex;
224 + align-items: center;
225 + padding-left: 0; // Override base .form-check
226 + margin-right: $form-check-inline-margin-x;
227 +
228 + // Undo .form-check-input defaults and add some `margin-right`.
229 + .form-check-input {
230 + position: static;
231 + margin-top: 0;
232 + margin-right: $form-check-inline-input-margin-x;
233 + margin-left: 0;
234 + }
235 +}
236 +
237 +
238 +// Form validation
239 +//
240 +// Provide feedback to users when form field values are valid or invalid. Works
241 +// primarily for client-side validation via scoped `:invalid` and `:valid`
242 +// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
243 +// server side validation.
244 +
245 +@each $state, $data in $form-validation-states {
246 + @include form-validation-state($state, map-get($data, color), map-get($data, icon));
247 +}
248 +
249 +// Inline forms
250 +//
251 +// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
252 +// forms begin stacked on extra small (mobile) devices and then go inline when
253 +// viewports reach <768px.
254 +//
255 +// Requires wrapping inputs and labels with `.form-group` for proper display of
256 +// default HTML form controls and our custom form controls (e.g., input groups).
257 +
258 +.form-inline {
259 + display: flex;
260 + flex-flow: row wrap;
261 + align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
262 +
263 + // Because we use flex, the initial sizing of checkboxes is collapsed and
264 + // doesn't occupy the full-width (which is what we want for xs grid tier),
265 + // so we force that here.
266 + .form-check {
267 + width: 100%;
268 + }
269 +
270 + // Kick in the inline
271 + @include media-breakpoint-up(sm) {
272 + label {
273 + display: flex;
274 + align-items: center;
275 + justify-content: center;
276 + margin-bottom: 0;
277 + }
278 +
279 + // Inline-block all the things for "inline"
280 + .form-group {
281 + display: flex;
282 + flex: 0 0 auto;
283 + flex-flow: row wrap;
284 + align-items: center;
285 + margin-bottom: 0;
286 + }
287 +
288 + // Allow folks to *not* use `.form-group`
289 + .form-control {
290 + display: inline-block;
291 + width: auto; // Prevent labels from stacking above inputs in `.form-group`
292 + vertical-align: middle;
293 + }
294 +
295 + // Make static controls behave like regular ones
296 + .form-control-plaintext {
297 + display: inline-block;
298 + }
299 +
300 + .input-group,
301 + .custom-select {
302 + width: auto;
303 + }
304 +
305 + // Remove default margin on radios/checkboxes that were used for stacking, and
306 + // then undo the floating of radios and checkboxes to match.
307 + .form-check {
308 + display: flex;
309 + align-items: center;
310 + justify-content: center;
311 + width: auto;
312 + padding-left: 0;
313 + }
314 + .form-check-input {
315 + position: relative;
316 + flex-shrink: 0;
317 + margin-top: 0;
318 + margin-right: $form-check-input-margin-x;
319 + margin-left: 0;
320 + }
321 +
322 + .custom-control {
323 + align-items: center;
324 + justify-content: center;
325 + }
326 + .custom-control-label {
327 + margin-bottom: 0;
328 + }
329 + }
330 +}
1 +// Bootstrap functions
2 +//
3 +// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
4 +
5 +// Ascending
6 +// Used to evaluate Sass maps like our grid breakpoints.
7 +@mixin _assert-ascending($map, $map-name) {
8 + $prev-key: null;
9 + $prev-num: null;
10 + @each $key, $num in $map {
11 + @if $prev-num == null or unit($num) == "%" {
12 + // Do nothing
13 + } @else if not comparable($prev-num, $num) {
14 + @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
15 + } @else if $prev-num >= $num {
16 + @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
17 + }
18 + $prev-key: $key;
19 + $prev-num: $num;
20 + }
21 +}
22 +
23 +// Starts at zero
24 +// Used to ensure the min-width of the lowest breakpoint starts at 0.
25 +@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
26 + $values: map-values($map);
27 + $first-value: nth($values, 1);
28 + @if $first-value != 0 {
29 + @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
30 + }
31 +}
32 +
33 +// Replace `$search` with `$replace` in `$string`
34 +// Used on our SVG icon backgrounds for custom forms.
35 +//
36 +// @author Hugo Giraudel
37 +// @param {String} $string - Initial string
38 +// @param {String} $search - Substring to replace
39 +// @param {String} $replace ('') - New value
40 +// @return {String} - Updated string
41 +@function str-replace($string, $search, $replace: "") {
42 + $index: str-index($string, $search);
43 +
44 + @if $index {
45 + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
46 + }
47 +
48 + @return $string;
49 +}
50 +
51 +// Color contrast
52 +@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
53 + $r: red($color);
54 + $g: green($color);
55 + $b: blue($color);
56 +
57 + $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
58 +
59 + @if ($yiq >= $yiq-contrasted-threshold) {
60 + @return $dark;
61 + } @else {
62 + @return $light;
63 + }
64 +}
65 +
66 +// Retrieve color Sass maps
67 +@function color($key: "blue") {
68 + @return map-get($colors, $key);
69 +}
70 +
71 +@function theme-color($key: "primary") {
72 + @return map-get($theme-colors, $key);
73 +}
74 +
75 +@function gray($key: "100") {
76 + @return map-get($grays, $key);
77 +}
78 +
79 +// Request a theme color level
80 +@function theme-color-level($color-name: "primary", $level: 0) {
81 + $color: theme-color($color-name);
82 + $color-base: if($level > 0, $black, $white);
83 + $level: abs($level);
84 +
85 + @return mix($color-base, $color, $level * $theme-color-interval);
86 +}
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff could not be displayed because it is too large.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.