Commit 2d2f0254 authored by zheming.hu's avatar zheming.hu

学习精灵中小学

parents

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

# Created by .ignore support plugin (hsz.mobi)
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.externalNativeBuild
.DS_Store
/build
!/build/pdf.js
!/build/pdf.worker.js
!/build/pdf.js.map
!/build/pdf.worker.js.map
/captures
# Built application files
*.apk
*.ap_
# Files for the Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Others
.idea/
*.iml
#sH_ETextbook/signing.properties
#sH_ETextbook/zjh.keystore
NDK-dec/.classpath
NDK-dec/.cproject
NDK-dec/.project
NDK-dec/.settings/
NDK-dec/obj/
*/class_files.txt
genius_base/src/main/java/com/chineseall/genius/base/greendao/
genius_data_shh/src/main/java/com/chineseall/genius/shh/db/greendao/
!/genius_base/src/main/assets/pdfjs-2.4.456-es5-dist/build
ext {
// android = [
// api_is_official = Boolean.TRUE
// ]
}
\ No newline at end of file
apply plugin: 'com.android.library'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
java.srcDirs = ['src/main/java']
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/nieyinyin/android-sdks/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
package cn.onlinecache.breakpad;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("cn.onlinecache.breakpad.test", appContext.getPackageName());
}
}
<manifest package="cn.onlinecache.breakpad"
xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
>
</application>
</manifest>
package cn.onlinecache.breakpad;
import android.text.TextUtils;
import android.util.Log;
/**
* Created on by nieyinyin 30/11/2016.
*/
public class NativeBreakpad {
private static String TAG = "NativeBreakpad";
static boolean loadBreakpadSuccess = false;
static {
try {
System.loadLibrary("breakpad");
loadBreakpadSuccess = true;
} catch (Exception e) {
loadBreakpadSuccess = false;
Log.e(TAG, "fail to load breakpad");
}
}
/**
* init breakpad
* @param dumpFileDir the directory of dump file
* @return true: init success false: init fail
*/
public static boolean init(String dumpFileDir){
if (TextUtils.isEmpty(dumpFileDir)) {
Log.e(TAG, "dumpFileDir can not be empty");
return false;
}
if (loadBreakpadSuccess) {
return nativeInit(dumpFileDir) > 0 ;
}
return false;
}
private static native int nativeInit(String dumpFileDir);
/**
* don't use this method in your production app!!
*/
public static int testNativeCrash(){
if (loadBreakpadSuccess){
Log.d(TAG, "test native crash .......................");
return nativeTestCrash();
}
return -1;
}
private static native int nativeTestCrash();
}
<resources>
<string name="app_name">Breakpad</string>
</resources>
package cn.onlinecache.breakpad;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.20'
ext.anko_version = '0.8.2'
repositories {
mavenCentral()
google()
maven {url 'http://maven.aliyun.com'}
jcenter()
maven { url 'https://maven.google.com' }
maven { url 'https://jitpack.io' }
jcenter() {
url "http://jcenter.bintray.com/"
}
maven {
url 'https://dl.bintray.com/kotlin/kotlin-dev/'
}
}
dependencies {
classpath "com.android.tools.build:gradle:${localBuildToolsVersion}"
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // add plugin
//美团
classpath "com.meituan.robust:gradle-plugin:$localRobustVersion"
classpath "com.meituan.robust:auto-patch-plugin:$localRobustVersion"
}
}
allprojects {
repositories {
mavenCentral()
google()
maven {url 'http://maven.aliyun.com'}
jcenter()
maven { url 'https://maven.google.com' }
maven { url 'https://jitpack.io' }
maven {
url 'https://dl.bintray.com/kotlin/kotlin-dev/'
}
flatDir {
//for finding aar
dirs project(':support').file('libs')
// dirs project(':pdf_lib').file('libs')
dirs project(':genius_base').file('libs')
}
}
}
ext {
compileSdkVersion = 26
buildToolsVersion = "27.0.3"
minSdkVersion = 16
targetSdkVersion = 26
gsonVersion = "2.8.3"
greendaoVersion = "3.2.2"
frescoVersion = "1.13.0"
appcompatVersion = "26.1.0"
android_support_design_version="27.1.1"
}
task clean(type: Delete) {
delete rootProject.buildDir
}
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
System.out.println(Arrays.toString(arguments.values()) + " name " + project.getName());
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
repositories {
flatDir {
dirs 'libs','../pdf_lib/libs'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile project(':genius_base')
compile project(':genius_data_shh')
compile project(':support')
}
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.chineseall.chineseall_log" />
package com.chineseall.chineseall_log;
/**
* Created by cchen on 2018/8/20.
*/
public enum DeleteNoteWay {
//pdf jump page
IN_MANAGE(1),
IN_NOTE_LIST(2),
IN_BOOK(3);
private int code;
DeleteNoteWay(int i) {
this.code = i;
}
public int getCode() {
return code;
}
}
package com.chineseall.chineseall_log;
/**
* Created by cchen on 2018/8/20.
*/
public enum JumpPageType {
//pdf jump page
SLIDE(1),
CATALOG(2),
NOTE(3),
INDEX(4);
private int code;
JumpPageType(int i) {
this.code = i;
}
public int getCode() {
return code;
}
}
package com.chineseall.chineseall_log;
/**
* Created by fanshixiang on 2018/8/16.
*/
public enum LogEventCode {
//LOGIN
EVENT_APP_OPEN(1),
EVENT_APP_CLOSE(2),
EVENT_LOGINVIEW_MODELCHOOSE(3),
EVENT_LOGINVIEW_OPENAGREEMENT(4),
EVENT_LOGINVIEW_LOGIN(5),
//SHELF
EVENT_BOOKSHELVES_ENTER(6),
EVENT_BOOKSHELVES_VIEWMODELCHANGE(7),
event_bookselves_download(8),
event_bookselves_pauseDownload(9),
event_bookselves_goOnDownload(10),
event_bookselves_move(11),
event_bookselves_remove(12),
event_bookselves_moveToCurrent(13),
event_bookselves_filter(14),
event_bookselves_searchBook(15),
//personal center
event_personCenter_enter(16),
event_personCenter_changeHeaderImage(17),
event_personCenter_changePassword(18),
event_personCenter_changeStudent_Password(19),
event_personCenter_checkVersion(20),
event_personCenter_modelChoose(21),
event_personCenter_logout(22),
event_personCenter_openAgreement(23),
//book detail
event_book_enterBook(24),
event_book_openMenu(25),
event_book_openChapters(26),
event_book_openNoteList(27),
event_book_openResourceList(28),
event_book_changeDoublePage(29),
event_book_hideNote(30),
event_book_pageChange(31),
//3rd resources
event_book_searchResource(32),
event_book_openResource(33),
event_book_changeResourceFilter(34),
//note
event_note_changeNoteModel(35),
event_note_openManagement(36),
event_note_create(37),
event_note_revise(38),
event_note_remove(39),
event_note_search(40),
event_note_upload(41),
event_note_spreadTag(42),
event_note_tagManagement(43),
event_note_addTag(44),
event_note_removeTag(45),
event_note_reviseTag(46),
event_note_openNoteFilter(47),
event_note_noteFilterSearch(48),
event_note_NoteFilterResetting(49),
event_note_lookNote(50),
event_note_playAudios(51),
event_note_playVideo(52),
event_note_lookPicture(53),
event_note_lookDocument(54),
event_note_downloadCloudNote(55),
event_note_shareNote(56),
event_note_revokeShare(57),
event_note_downloadShareNote(58),
event_note_createShareFile(59),
event_note_reviseShareFile(60),
event_note_moveToShareFile(61),
event_note_openFile(62),
event_note_lookStudentSubmit(63),
event_note_lookStudentShareNotes(64),
event_note_shareNoteView(65),
event_note_shareNoteFilter(66),
event_bookselves_moveToCommon(67),
event_bookselves_moveBack(68),
event_book_playResource(70),
event_browser_Open(71),
event_browser_jump(72),
event_personCenter_openHeaderImage(73),
event_note_exportNote(74),
event_note_shareNotePreview(76),
event_note_importOtherBookNote(77),
event_note_removeCloudNote(79),
event_note_uplodNoteBreak(80),
event_note_downloadNoteBreak(81),
event_browser_forward(82),
event_browser_back(83),
event_browser_refresh(84),
event_browser_home(85),
event_browser_copyResourceURL(86),
event_bookSelves_scan(87),
event_resource_playResource(88),
event_resource_playerListChange(89),
event_resource_playerListClose(90),
event_note_filingNote(91),
event_note_CreateNewFilingNoteFile(92),
event_note_renameNewFilingNoteFile(93),
event_note_deleteNewFilingNoteFile(94),
event_note_cancelFilingNote(95),
event_note_filingNoteUpdata(96),
event_note_filingNoteDownload(97),
event_note_shareLocalFilingNote(98),
event_note_shareCloudFilingNote(99)
;
// 定义私有变量
private int code;
LogEventCode(int i) {
this.code = i;
}
public int getCode() {
return code;
}
}
package com.chineseall.chineseall_log;
/**
* Created by cchen on 2018/8/20.
*/
public enum LoginType {
//LOGIN
ACCOUNT_PASSWORD(1),
PASSWORD(2),
AUTO(3),
OFFLINE(4);
private int code;
LoginType(int i) {
this.code = i;
}
public int getCode() {
return code;
}
}
package com.chineseall.chineseall_log.shh
import android.Manifest
import android.location.Address
import android.location.Location
import android.os.Build
import android.os.Handler
import android.os.Looper
import android.support.v4.content.PermissionChecker
import android.support.v4.content.PermissionChecker.PERMISSION_GRANTED
import com.chineseall.genius.constant.ConstantUtil
import com.chineseall.genius.xxjl.ShhBaseApplication
import com.chineseall.genius.xxjl.db.greendao.ShhLogInfoDao
import com.chineseall.genius.xxjl.manager.ShhConfigInfoManager
import com.chineseall.pdflib.ThreadPoolProxyFactory
import com.chineseall.net.interfaces.IResponseCallBack
import com.chineseall.net.requestdata.ExecutorTaskBuilder
import com.chineseall.net.requestdata.FProtocol
import com.chineseall.net.utils.DeviceUtil
import com.chineseall.net.utils.NetWorkUtil
import org.json.JSONArray
import org.json.JSONObject
import java.lang.Exception
import java.util.*
object ShhUpLoadLogUtil {
fun uploadOrClearLogs() {
val uploadLogUrl = ShhConfigInfoManager.getLogUploadUrl()
if (uploadLogUrl.isEmpty()) return
ThreadPoolProxyFactory.getThreadPoolProxy().execute(object : Runnable {
override fun run() {
val shhLogInfos = ShhBaseApplication.getInstance().publicDaoSession.shhLogInfoDao.queryBuilder()
.where(ShhLogInfoDao.Properties.IsUpload.eq(ConstantUtil.NOT_UPLOADED)).limit(PACKAGESIZE).list()
if (shhLogInfos.isNullOrEmpty()) {
ShhBaseApplication.getInstance().publicDaoSession.shhLogInfoDao.queryBuilder()
.where(ShhLogInfoDao.Properties.IsUpload.eq(ConstantUtil.UPLOADED)).buildDelete().executeDeleteWithoutDetachingEntities()
continueCheckUpload()
return
}
if (!NetWorkUtil.isWifiConnect(ShhBaseApplication.getInstance())) return
val jsonArray = JSONArray()
for (shhLogInfo in shhLogInfos) {
val jsonObject_total = JSONObject()
jsonObject_total.put("userInfo", JSONObject(shhLogInfo.userJson))
jsonObject_total.put("appInfo", getDeviceJson())
jsonObject_total.put("eventInfo", getEventJson(shhLogInfo.event_code, shhLogInfo.event_content, shhLogInfo.event_time))
jsonArray.put(jsonObject_total)
}
ExecutorTaskBuilder().setPath(uploadLogUrl)
.setMethod(FProtocol.HttpMethod.POST_JSON)
.setJsonToPost(jsonArray.toString())
.setCallBack(object : IResponseCallBack {
override fun resultDataMistake(p0: Int, p1: FProtocol.NetDataProtocol.ResponseStatus?, p2: String?) {
continueCheckUpload()
}
override fun resultDataSuccess(p0: Int, p1: String?) {
val resultObj = JSONObject(p1 ?: "")
if (resultObj.getBoolean("success")) {
ShhLogManager.updateLogState(shhLogInfos)
continueCheckUpload()
}
}
})
.build()
.execute()
}
})
}
fun continueCheckUpload() {
Handler(Looper.getMainLooper()).postDelayed({ uploadOrClearLogs() }, getUploadDelay().toLong())
}
fun getEventJson(event_id: String, event_content: Map<String, String>, event_time: String): JSONObject {
val jsonObject_event = JSONObject()
jsonObject_event.put("eventId", event_id)
if (!event_content.isNullOrEmpty()) {
for ((key, value) in event_content) {
if ("bookselves_viewModel_now" == key || "app_model_now" == key) {
jsonObject_event.put(key, value.toInt())
} else if ("book_eTextBook_id" == key && value.contains("[") && value.contains("]")) {
val jsonElements = JSONArray()
val substring = value.substring(1, value.length - 1).replace("\"", "")
val strings = substring.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (str in strings) {
jsonElements.put(str)
}
jsonObject_event.put(key, jsonElements)
} else if ("book_note__serverId" == key && value.contains("[") && value.contains("]")) {
val jsonElements = JSONArray()
val substring = value.substring(1, value.length - 1).replace("\"", "")
val strings = substring.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
for (str in strings) {
jsonElements.put(str)
}
jsonObject_event.put(key, jsonElements)
} else {
jsonObject_event.put(key, value)
}
}
}
jsonObject_event.put("trigger_time", event_time)
return jsonObject_event
}
fun getDeviceJson(): JSONObject {
val jsonObject = JSONObject()
jsonObject.put("appId", "03")
jsonObject.put("appVersonId", "02")
jsonObject.put("device_network_ip", ConstantUtil.getIPAddress(ShhBaseApplication.getInstance()))
jsonObject.put("device_platform_name", ConstantUtil.getDeviceTypeCode(ShhBaseApplication.getInstance()))
jsonObject.put("device_app_verson", DeviceUtil.getAppVersionName(ShhBaseApplication.getInstance()))
var deviceID = ""
if (PERMISSION_GRANTED == PermissionChecker.checkCallingOrSelfPermission(ShhBaseApplication.getInstance(), Manifest.permission.READ_PHONE_STATE)) {
deviceID = DeviceUtil.getDeviceId(ShhBaseApplication.getInstance())
}
jsonObject.put("device_machine_uuid", deviceID)
jsonObject.put("device_machine_cpu", Build.CPU_ABI)
jsonObject.put("device_machine_memory", ConstantUtil.getInternalToatalSpace(ShhBaseApplication.getInstance()))
jsonObject.put("device_machine_verson", DeviceUtil.getModel())
jsonObject.put("device_system_verson", Build.VERSION.RELEASE)
var location: Location? = null
try {
if (PERMISSION_GRANTED == PermissionChecker.checkCallingOrSelfPermission(ShhBaseApplication.getInstance(), Manifest.permission.ACCESS_FINE_LOCATION)) {
location = ConstantUtil.getLastLocation(ShhBaseApplication.getInstance())
}
} catch (e: Exception) {
e.printStackTrace()
}
if (null == location) {
jsonObject.put("device_location_position", "")
} else {
jsonObject.put("device_location_position", "${location.longitude},${location.latitude}")
}
var address: Address? = null
if (location != null)
address = ConstantUtil.getAddress(location.longitude, location.latitude)
jsonObject.put("device_location_country", address?.countryName)
jsonObject.put("device_location_province", address?.adminArea)
jsonObject.put("device_location_city", address?.locality)
jsonObject.put("device_location_area", address?.subLocality)
return jsonObject
}
//日志上传间隔时间 60-120秒
private fun getUploadDelay(): Int {
val k = Random().nextInt(61) + 60
return k * 1000
}
val PACKAGESIZE: Int = 50
}
\ No newline at end of file
<resources>
<string name="app_name">chineseall_log</string>
</resources>
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'org.greenrobot.greendao'
apply plugin: 'kotlin-kapt'
apply from: "../api.gradle"
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
ndk {
abiFilters "armeabi-v7a"
}
}
android {
dataBinding {
enabled = true
}
}
buildTypes {
debug {
buildConfigField "boolean", "api_is_official", "false"
}
release {
minifyEnabled false
buildConfigField "boolean", "api_is_official", "true"
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
publishNonDefault true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
greendao {
schemaVersion 8//数据库版本号, add if new java bean
//8 Record add token (String)
//7 Record add urlsJson (String)
//6 LogInfo add userJson (String)
//5 use GeniusUser instead of GeniusLoginInfo\GeniusUserInfo
//4 GeniusNoteInfo add extra1
daoPackage 'com.chineseall.genius.base.greendao'//设置DaoMaster、DaoSession、Dao包名
targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录
//targetGenDirTest:设置生成单元测试目录
//generateTests:设置自动生成单元测试用例
}
repositories {
flatDir {
dirs 'libs', '../pdf_lib/libs' //this way we can find the .aar file in libs folder
}
google()
jcenter()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.android.support:appcompat-v7:$appcompatVersion"
compile 'com.android.support:recyclerview-v7:26.1.0'
compile "com.facebook.fresco:fresco:$frescoVersion"
api 'com.android.support:multidex:1.0.3'
api 'com.android.support:multidex-instrumentation:1.0.3'
api 'com.yanzhenjie.recyclerview:support:1.3.1'
//SerializationService for entity
//compile "com.alibaba:arouter-api:$arouter_api_version"
compile "org.greenrobot:greendao:$greendaoVersion"
releaseCompile 'net.zetetic:android-database-sqlcipher:3.5.2'
compile project(path: ':support')
// compile(name: 'dec_lib-release', ext: 'aar')
//aac
compile 'android.arch.lifecycle:runtime:1.1.1'
compile 'android.arch.lifecycle:extensions:1.1.1'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
//recyclerView selector
compile('com.bignerdranch.android:recyclerview-multiselect:0.2') {
exclude group: 'com.android.support', module: 'appcompat-v7'
exclude group: 'com.android.support', module: 'recyclerview-v7'
}
compile "com.android.support:design:$android_support_design_version"
compile project(':breakpad')
compile project(':pdf_lib')
implementation project(':genius_data_shh')
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
compile "org.jetbrains.anko:anko-common:$anko_version"
// kapt "com.android.databinding:compiler:3.1.0"
// kapt "androidx.databinding:databinding-compiler:3.5.0-alpha06"
compile "com.google.code.gson:gson:$gsonVersion"
//tools
compile 'com.facebook.stetho:stetho:1.5.0'
compile 'com.facebook.stetho:stetho-okhttp3:1.5.0'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
//aac to mp3
compile 'com.github.adrielcafe:AndroidAudioConverter:0.0.8'
//get mp3 duration
// compile 'com.github.wseemann:FFmpegMediaMetadataRetriever:1.0.14'
api 'com.tencent:mmkv:1.0.18'
compile project(path: ':jni_lib')
api 'com.tencent.tbs.tbssdk:sdk:43903'
compile 'org.apache.commons:commons-lang3:3.5'
}
kapt {
generateStubs = true
}
project.afterEvaluate {
if (project.plugins.hasPlugin('org.greenrobot.greendao')) {
def taskGraph = project.getGradle().getTaskGraph()
taskGraph.whenReady {
Task greendaoPrepareTask = project.tasks.getByName("greendaoPrepare")
Task greendaoTask = project.tasks.getByName("greendao")
Task debugKotlin = project.tasks.getByName("kaptDebugKotlin")
Task releaseKotlin = project.tasks.getByName("kaptReleaseKotlin")
debugKotlin.doFirst {
greendaoPrepareTask.execute()
greendaoTask.execute()
}
releaseKotlin.doFirst {
greendaoPrepareTask.execute()
greendaoTask.execute()
}
}
}
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
与业务相关的支持模块
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.chineseall.genius.base">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:name=".ReaderBaseApplication"
tools:replace="name">
<activity
android:name=".webview.WebViewActivity"
android:screenOrientation="landscape"
android:hardwareAccelerated="true"
android:exported="false"
android:windowSoftInputMode="adjustPan"
android:theme="@style/FullscreenTheme" />
<activity
android:name="com.chineseall.genius.base.v.TipLoginActivity"
android:launchMode="singleTask"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/dialogstyle" />
<activity
android:name="com.chineseall.genius.update.ui.UpdateActivity"
android:launchMode="singleTop"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/update_ui" />
<activity
android:name="com.chineseall.genius.update.ui.ShhUpdateActivity"
android:launchMode="singleTop"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/transparent_" />
<service android:name="com.chineseall.genius.update.service.UpdateService" />
<activity
android:name="com.chineseall.genius.activity.SysVideoBrowserActivity"
android:launchMode="singleTop"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/FullscreenTheme" />
<activity
android:name="com.chineseall.genius.activity.NoteResBrowseActivity"
android:launchMode="singleTop"
android:exported="false"
android:screenOrientation="landscape"
android:theme="@style/FullscreenTheme" />
<activity
android:name="com.chineseall.genius.activity.ImageBrowserActivity"
android:screenOrientation="landscape"
android:exported="false"
android:launchMode="singleTop"
android:theme="@style/FullscreenTheme" />
</application>
</manifest>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/* latin-ext */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 300;
src: local('Barlow Condensed Light'), local('BarlowCondensed-Light'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTxwL3I-JCGChYJ8VI-L6OO_au7B47rxz3jWuZEC.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 300;
src: local('Barlow Condensed Light'), local('BarlowCondensed-Light'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTxwL3I-JCGChYJ8VI-L6OO_au7B47rxz3bWuQ.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 400;
src: local('Barlow Condensed Regular'), local('BarlowCondensed-Regular'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTx3L3I-JCGChYJ8VI-L6OO_au7B6x_T2kn3.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 400;
src: local('Barlow Condensed Regular'), local('BarlowCondensed-Regular'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTx3L3I-JCGChYJ8VI-L6OO_au7B6xHT2g.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin-ext */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 700;
src: local('Barlow Condensed Bold'), local('BarlowCondensed-Bold'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTxwL3I-JCGChYJ8VI-L6OO_au7B46r2z3jWuZEC.woff2) format('woff2');
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
/* latin */
@font-face {
font-family: 'Barlow Condensed';
font-style: normal;
font-weight: 700;
src: local('Barlow Condensed Bold'), local('BarlowCondensed-Bold'), url(https://fonts.gstatic.com/s/barlowcondensed/v1/HTxwL3I-JCGChYJ8VI-L6OO_au7B46r2z3bWuQ.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 100px;
text-align: center;
line-height: 100px;
cursor: pointer;
}
</style>
</head>
<body>
<div id="img">图片</div>
<div id="video">视频</div>
<div id="audio">音频</div>
<div id="pdf">pdf</div>
</body>
<script src="./js/jquery-1.8.3.min.js"></script>
<script>
$("#img").on('click', function () {
window.open(encodeURI(encodeURI("./index-loca.html?file_path=" + 'https://img.zcool.cn/community/01ce6d5eef48aea801215aa03d7568.jpg@3000w_1l_0o_100sh.jpg' + "&file_type=" + 'png' + "&file_title=" + '涨工资' + "&file_desc=" + '想多了')))
// file_path&file_type=png&file_title=mmm&file_desc=xxxx
})
$("#video").on('click', function () {
window.open(encodeURI(encodeURI("./index-loca.html?file_path=" + './e640931518b36a4fba409f76a120be70.mp4' + "&file_type=" + 'mp4' + "&file_title=" + '涨工资' + "&file_desc=" + '想多了')))
})
$("#audio").on('click', function () {
window.open(encodeURI(encodeURI("./index-loca.html?file_path=" + './images/mp3.mp3' + "&file_type=" + 'mp3' + "&file_title=" + '涨工资' + "&file_desc=" + '想多了')))
})
$("#pdf").on('click', function () {
window.open(encodeURI(encodeURI("./index-loca.html?file_path=" + './8e83de09011789ee1dac7fa99a265e74.pdf' + "&file_type=" + 'pdf' + "&file_title=" + '涨工资' + "&file_desc=" + '想多了')))
})
</script>
</html>
\ No newline at end of file
.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
pre.prettyprint {
border: 0;
border-left: 3px solid rgb(204, 204, 204);
margin-left: 2em;
padding: 0.5em;
font-size: 110%;
display: block;
font-family: "Consolas", "Monaco", "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
margin: 1em 0px;
white-space: pre;
}
This diff is collapsed.
/**
* Project: HandyEditor.
* Author: A.J <804644245@qq.com>
* Copyright: http://www.catfish-cms.com All rights reserved.
*/
.HandyEditor_menu{min-height:35px;}.HandyEditor_menu_item,.HandyEditor_menu_item:visited{text-decoration:none;cursor:pointer;}.HandyEditor_menu_gap{width:0px;border:solid 1px;margin:10px 5px;}.HandyEditor .HandyEditor_newdiv{position:absolute;border:solid 1px #ddd;background-color:#fff;border-radius:6px;-moz-border-radius:6px;-webkit-border-radius:6px;box-shadow:0 1px 3px rgba(0,0,0,0.6);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.6);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.6);padding:10px;z-index:10000;}.HandyEditor .HandyEditor_newdiv .HandyEditor_newdiv_down{margin:5px;padding:0px;cursor:pointer;}.HandyEditor .HandyEditor_newdiv .HandyEditor_newdiv_gap{height:0px;border:solid 1px #eee;}.HandyEditor_editor{padding:15px;font-size:16px;outline:none;overflow-x:auto;}.HandyEditor_editor pre{background-color:#f8f8f8;padding:10px;border:0px;}.HandyEditor_editor blockquote{border: 0px;}.HandyEditor_editor .prettyprint{border-left:3px solid rgb(204,204,204);}.HandyEditor_editor p{margin:10px 0px;padding:0px;}.HandyEditor_editor table{border:1px solid #ccc;border-collapse:collapse;}.HandyEditor_editor table tr th,.HandyEditor_editor table tr td{border:1px solid #ccc;padding:10px;}.HandyEditor_newdiv_down h1,.HandyEditor_newdiv_down h2,.HandyEditor_newdiv_down h3,.HandyEditor_newdiv_down h4,.HandyEditor_newdiv_down h5,.HandyEditor_newdiv_down h6,.HandyEditor_newdiv_down p{margin:10px 0px;padding:0px;}.HandyEditor_newdiv_down_colorblock{display:inline-block;margin:6px;border:solid 1px #ccc;width:15px;height:15px;cursor:pointer;}.HandyEditor_newdiv_down_expression{display:inline-block;margin:4px;padding:0px;border:0px;width:35px;height:35px;cursor:pointer;}.HandyEditor_newdiv_down_expression_img{width:35px;height:35px;}.HandyEditor_newtextarea_textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;}@font-face{font-family:'handyEditor';src:url('../font/handyEditor.eot?76878990');src:url('../font/handyEditor.eot?76878990#iefix') format('embedded-opentype'),url('../font/handyEditor.woff2?76878990') format('woff2'),url('../font/handyEditor.woff?76878990') format('woff'),url('../font/handyEditor.ttf?76878990') format('truetype'),url('../font/handyEditor.svg?76878990#handyEditor') format('svg');font-weight:normal;font-style:normal;}[class^="he-"]:before,[class*=" he-"]:before{font-family:"handyEditor";font-style:normal;font-weight:normal;speak:none;display:inline-block;text-decoration:inherit;width:1em;margin-right:.2em;text-align:center;font-variant:normal;text-transform:none;line-height:1em;margin-left:.2em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}.he-bold:before{content:'\e800';}.he-italic:before{content:'\e801';}.he-align-left:before{content:'\e802';}.he-align-center:before{content:'\e803';}.he-forward:before{content:'\e804';}.he-align-right:before{content:'\e805';}.he-indent-left:before{content:'\e806';}.he-indent-right:before{content:'\e807';}.he-scissors:before{content:'\e808';}.he-doc:before{content:'\e809';}.he-align-justify:before{content:'\e80a';}.he-link:before{content:'\e80b';}.he-picture:before{content:'\e80c';}.he-video-alt:before{content:'\e80d';}.he-music:before{content:'\e80e';}.he-attach:before{content:'\e80f';}.he-quote:before{content:'\e810';}.he-font:before{content:'\e811';}.he-font-1:before{content:'\e812';}.he-fontsize:before{content:'\e813';}.he-facebook:before{content:'\e814';}.he-cursor:before{content:'\e815';}.he-text-height:before{content:'\e816';}.he-text-width:before{content:'\e817';}.he-minus:before{content:'\e818';}.he-trash:before{content:'\e819';}.he-info:before{content:'\e81a';}.he-help-circled-alt:before{content:'\e81b';}.he-font-2:before{content:'\e81c';}.he-check-empty:before{content:'\e81d';}.he-stop:before{content:'\e81e';}.he-cancel:before{content:'\e81f';}.he-help-circled:before{content:'\e820';}.he-resize-full:before{content:'\e821';}.he-resize-small:before{content:'\e822';}.he-ok:before{content:'\e823';}.he-pencil:before{content:'\e824';}.he-code:before{content:'\e825';}.he-brush:before{content:'\e827';}.he-spin3:before{content:'\e832';}.he-spin6:before{content:'\e839';}.he-globe:before{content:'\f018';}.he-docs:before{content:'\f0c5';}.he-list-bullet:before{content:'\f0ca';}.he-list-numbered:before{content:'\f0cb';}.he-strike:before{content:'\f0cc';}.he-underline:before{content:'\f0cd';}.he-table:before{content:'\f0ce';}.he-paste:before{content:'\f0ea';}.he-h-sigh:before{content:'\f0fd';}.he-reply:before{content:'\f112';}.he-smile:before{content:'\f118';}.he-unlink:before{content:'\f127';}.he-superscript:before{content:'\f12b';}.he-subscript:before{content:'\f12c';}.he-anchor:before{content:'\f13d';}.he-file-code:before{content:'\f1c9';}.he-window-maximize:before{content:'\f2d0';}.he-imdb:before{content:'\f2d8';}.he-vkontakte:before{content:'\f354';}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type="text/css">
small{font-size: 14px;color: #aaa;}
pre{padding: 5px;background-color: #eee;}
.textcenter{text-align: center;}
</style>
</head>
<body>
<textarea id="editor" name="editor" rows="5" style="display: none;"></textarea>
<br>
<button onclick="getHtml()">获取HTML</button>&nbsp;&nbsp;
<button onclick="getText()">获取纯文本</button>
<script src="HandyEditor.min.js"></script>
<script type="text/javascript">
var he = HE.getEditor('editor');
function getHtml(){
alert(he.getHtml());
}
function getText(){
alert(he.getText());
}
</script>
</body>
</html>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
image_view_last_id=0;(function($){jQuery.fn.imageView=function(settings){var $container=this;if($container.length==0)return false;var container=$container[0];var $img=$('img',container);var img=$img[0];if(!$img.attr('id')){image_view_last_id++;$img.attr('id','image_view_'+image_view_last_id)}var id=$img.attr('id');settings=jQuery.extend({width:500,height:400,fullsize:$img.attr('rel'),mousewheel:false},settings);settings['src']=$img.attr('src');$img.data('mousedown',false);$img.data('cannot_minimize',false);$img.data('state',0);$container.addClass('iv-loading');$container.width(settings['width']);$container.height(settings['height']);$img.css('visibility','hidden');$img.css('position','absolute');$img.css('left',0);$img.css('top',0);if(img.complete){setTimeout(function(){loaded()},100)}else{$(img).one('load',function(){loaded()})}function loaded(){settings['imgwidth']=$img.width();settings['imgheight']=$img.height();$img.css('left',settings['width']/2-$img.width()/2);$img.css('top',settings['height']/2-$img.height()/2);$container.click(function(){if($img.data('state')==0){$container.addClass('iv-loading');$img.attr('src',settings['fullsize']);settings['loading']=true;cursor();$img.one('load',function(){$container.removeClass('iv-cache');$img.css('left',settings['width']/2-$img.width()/2);$img.css('top',settings['height']/2-$img.height()/2);$container.removeClass('iv-loading');settings['loading']=false;$img.data('state',1);cursor()})}else if(!$img.data('cannot_minimize')){$img.attr('src',settings['src']);settings['loading']=true;cursor();if(img.complete){$img.css('left',settings['width']/2-$img.width()/2);$img.css('top',settings['height']/2-$img.height()/2);$img.data('state',0);settings['loading']=false;cursor()}else{$container.addClass('iv-loading');$img.one('load',function(){$container.removeClass('iv-loading');$img.css('left',settings['width']/2-$img.width()/2);$img.css('top',settings['height']/2-$img.height()/2);$img.data('state',0);settings['loading']=false;cursor()})}}return false});$img.bind('mousedown.imgview',function(event){$img.data('mousedown',true);$img.data('cannot_minimize',false);settings['pageX']=event.pageX;settings['pageY']=event.pageY;return false});$(document).bind('mouseup.imgview',function(event){$img.data('mousedown',false);return false});$(document).bind('mousemove.imgview',function(event){if($img.data('mousedown')&&($img.data('state')==1)&&(!settings['loading'])){var dx=event.pageX-settings['pageX'];var dy=event.pageY-settings['pageY'];if((dx==0)&&(dy==0)){return false}var newX=parseInt($img.css('left'))+dx;if(newX>0)newX=0;if(newX<settings['width']-$img.width())newX=settings['width']-$img.width()+1;var newY=parseInt($img.css('top'))+dy;if(newY>0)newY=0;if(newY<settings['height']-$img.height())newY=settings['height']-$img.height()+1;if(settings['width']>=$img.width()){newX=settings['width']/2-$img.width()/2}if(settings['height']>=$img.height()){newY=settings['height']/2-$img.height()/2}$img.css('left',newX+'px');$img.css('top',newY+'px');settings['pageX']=event.pageX;settings['pageY']=event.pageY;$img.data('cannot_minimize',true)}return false});function cursor(){if(settings['loading']){$container.css('cursor','progress')}else{if($img.data('state')==0){if($.browser.mozilla){$container.css('cursor','-moz-zoom-in')}else{$container.css('cursor','pointer')}}else{$container.css('cursor','move')}}}$img.css('visibility','visible');$container.removeClass('iv-loading');cursor()}}})(jQuery);
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment