Feature Extraction
Keras
English

You need to agree to share your contact information to access this model

This repository is publicly accessible, but you have to accept the conditions to access its files and content.

Log in or Sign Up to review the conditions and access this model content.

Model Card for Model ID

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeWindowManager.java

package co.median.android;

import android.text.TextUtils;

import java.util.LinkedHashMap; import java.util.Map;

public class GoNativeWindowManager { private final LinkedHashMap<String, ActivityWindow> windows; private ExcessWindowsClosedListener excessWindowsClosedListener;

public GoNativeWindowManager() {
    windows = new LinkedHashMap<>();
}

public void addNewWindow(String activityId, boolean isRoot) {
    this.windows.put(activityId, new ActivityWindow(activityId, isRoot));
}

public void removeWindow(String activityId) {
    this.windows.remove(activityId);

    if (excessWindowsClosedListener != null && windows.size() <= 1) {
        excessWindowsClosedListener.onAllExcessWindowClosed();
    }
}

public void setOnExcessWindowClosedListener(ExcessWindowsClosedListener listener) {
    this.excessWindowsClosedListener = listener;
}

public ActivityWindow getActivityWindowInfo(String activityId) {
    return windows.get(activityId);
}

public void setUrlLevel(String activityId, int urlLevel) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        window.setUrlLevels(urlLevel, window.parentUrlLevel);
    }
}

public int getUrlLevel(String activityId) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        return window.urlLevel;
    }
    return -1;
}

public void setParentUrlLevel(String activityId, int parentLevel) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        window.setUrlLevels(window.urlLevel, parentLevel);
    }
}

public int getParentUrlLevel(String activityId) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        return window.parentUrlLevel;
    }
    return -1;
}

public void setUrlLevels(String activityId, int urlLevel, int parentLevel) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        window.setUrlLevels(urlLevel, parentLevel);
    }
}

public boolean isRoot(String activityId) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        return window.isRoot;
    }
    return false;
}

public void setAsNewRoot(String activityId) {
    for (Map.Entry<String, ActivityWindow> entry : windows.entrySet()) {
        ActivityWindow window = entry.getValue();
        if (TextUtils.equals(activityId, entry.getKey())) {
            window.isRoot = true;
        } else {
            window.isRoot = false;
        }
    }
}

public void setIgnoreInterceptMaxWindows(String activityId, boolean ignore) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        window.ignoreInterceptMaxWindows = ignore;
    }
}

public boolean isIgnoreInterceptMaxWindows(String activityId) {
    ActivityWindow window = windows.get(activityId);
    if (window != null) {
        return window.ignoreInterceptMaxWindows;
    }
    return false;
}

public int getWindowCount() {
    return windows.size();
}

// Returns ID of the next window after root as Excess window
public String getExcessWindow() {
    for (Map.Entry<String, ActivityWindow> entry : windows.entrySet()) {
        ActivityWindow window = entry.getValue();
        if (window.isRoot) continue;
        return window.id;
    }
    return null;
}

public static class ActivityWindow {
    private final String id;
    private boolean isRoot;
    private int urlLevel;
    private int parentUrlLevel;
    private boolean ignoreInterceptMaxWindows;

    ActivityWindow(String id, boolean isRoot) {
        this.id = id;
        this.isRoot = isRoot;
        this.urlLevel = -1;
        this.parentUrlLevel = -1;
    }

    public void setUrlLevels(int urlLevel, int parentUrlLevel) {
        this.urlLevel = urlLevel;
        this.parentUrlLevel = parentUrlLevel;
    }

    @Override
    public String toString() {
        return "id=" + id + "\n" +
                "isRoot=" + isRoot + "\n" +
                "urlLevel=" + urlLevel + "\n" +
                "parentUrlLevel=" + parentUrlLevel;
    }
}


interface ExcessWindowsClosedListener {
    void onAllExcessWindowClosed();
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeWindowManager.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/LaunchActivity.java

package co.median.android;

public class LaunchActivity extends MainActivity{ }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/LaunchActivity.java

Start of /mnt/data/jocal3--U/jocal3--U/android/plugins.gradle

import groovy.json.JsonSlurper import org.gradle.initialization.DefaultSettings import org.apache.tools.ant.taskdefs.condition.Os

def generatedFileName = "PackageList.java" def generatedFilePackage = "co.median.android" def generatedFileContentsTemplate = """ package $generatedFilePackage;

import android.app.Application; import android.content.Context; import android.content.res.Resources;

import co.median.median_core.BridgeModule; import java.util.Arrays; import java.util.ArrayList;

{{ packageImports }}

public class PackageList { private Application application;

public PackageList(Application application) { this.application = application; }

private Resources getResources() { return this.getApplication().getResources(); }

private Application getApplication() { return this.application; }

private Context getApplicationContext() { return this.getApplication().getApplicationContext(); }

public ArrayList getPackages() { return new ArrayList<>(Arrays.asList( {{ packageClassInstances }} )); } } """

class GoNativeModules { private Logger logger private ArrayList<HashMap<String, String>> modulesMetadata

private packageName = "co.median.android"

GoNativeModules(Logger logger) {
    this.logger = logger
    this.modulesMetadata = this.getModulesMetadata()
}

ArrayList<HashMap<String, String>> getModulesMetadata() {
    if (this.modulesMetadata != null) return this.modulesMetadata

    ArrayList<HashMap<String, String>> modulesMetadata = new ArrayList<HashMap<String, String>>()

    def finder = new FileNameFinder()
    def files = finder.getFileNames(System.getProperty("user.dir"), 'plugins/**/plugin-metadata.json')
    files.each { fileName ->
        def jsonFile = new File(fileName)
        def parsedJson = new JsonSlurper().parseText(jsonFile.text).plugin
        parsedJson["sourceDir"] = fileName.tokenize(File.separator)[-3..-2].join(File.separator)
        modulesMetadata.push(parsedJson)
    }

    return modulesMetadata
}

void addModuleProjects(DefaultSettings defaultSettings) {
    modulesMetadata.forEach { module ->
        String pluginName = module["pluginName"]
        String sourceDir = module["sourceDir"]
        this.logger.warn(sourceDir)
        defaultSettings.include(":${pluginName}")
        defaultSettings.project(":${pluginName}").projectDir = new File(defaultSettings.rootProject.projectDir, "./${sourceDir}")

        // Include local library required by the plugin
        String localLibrary = module["localLibrary"]
        if (localLibrary != null && !localLibrary.isEmpty()) {
            defaultSettings.include(":${localLibrary}")
            defaultSettings.project(":${localLibrary}").projectDir = new File(defaultSettings.rootProject.projectDir, "./${sourceDir}/${localLibrary}")
        }
    }
}

void addModuleDependencies(Project appProject) {
    modulesMetadata.forEach { module ->
        String pluginName = module["pluginName"]
        appProject.dependencies {
            implementation project(path: ":${pluginName}")
        }
    }
}

void generatePackagesFile(File outputDir, String generatedFileName, GString generatedFileContentsTemplate) {
    def packages = this.modulesMetadata
    String packageName = this.packageName

    String packageImports = ""
    String packageClassInstances = ""

    if (packages.size() > 0) {
        packageImports = "import ${packageName}.BuildConfig;\nimport ${packageName}.R;\n\n"
        packageImports = packageImports + packages.collect {
            "// ${it.name}\nimport ${it.packageName}.${it.classInstance};"
        }.join('\n')
        packageClassInstances = packages.collect { "new ${it.classInstance}()" }.join(",\n      ")
    }

    String generatedFileContents = generatedFileContentsTemplate.toString()
            .replace("{{ packageImports }}", packageImports)
            .replace("{{ packageClassInstances }}", packageClassInstances)

    outputDir.mkdirs()
    final FileTreeBuilder treeBuilder = new FileTreeBuilder(outputDir)
    treeBuilder.file(generatedFileName).newWriter().withWriter { w ->
        w << generatedFileContents
    }
}

}

def gonativeModules = new GoNativeModules(logger)

ext.applyModulesSettingsGradle = { DefaultSettings defaultSettings -> gonativeModules.addModuleProjects(defaultSettings) }

ext.applyNativeModulesAppBuildGradle = { Project project -> gonativeModules.addModuleDependencies(project)

def generatedSrcDir = new File(buildDir, "generated/gncli/src/main/java")
def generatedCodeDir = new File(generatedSrcDir, generatedFilePackage.replace('.', '/'))

task generatePackageList {
    doLast {
        gonativeModules.generatePackagesFile(generatedCodeDir, generatedFileName, generatedFileContentsTemplate)
    }
}

preBuild.dependsOn generatePackageList

android {
    sourceSets {
        main {
            java {
                srcDirs += generatedSrcDir
            }
        }
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/plugins.gradle

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/Installation.java

package co.median.android;

import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.util.Log;

import androidx.core.app.ActivityCompat;

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.TimeZone; import java.util.UUID;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog;

/**

  • Created by weiyin on 8/8/14. */ public class Installation { private static final String TAG = Installation.class.getName();

    private static String sID = null; private static final String INSTALLATION = "INSTALLATION";

    public synchronized static String id(Context context) { if (sID == null) { File installation = new File(context.getFilesDir(), INSTALLATION); try { if (!installation.exists()) writeInstallationFile(installation); sID = readInstallationFile(installation); } catch (Exception e) { throw new RuntimeException(e); } } return sID; }

    public static Map<String,Object> getInfo(Context context) { HashMap<String,Object> info = new HashMap<>(); info.put("platform", "android"); String publicKey = AppConfig.getInstance(context).publicKey; if (publicKey == null) publicKey = ""; info.put("publicKey", publicKey); String packageName = context.getPackageName(); info.put("appId", packageName); PackageManager manager = context.getPackageManager(); try { PackageInfo packageInfo = manager.getPackageInfo(packageName, 0); info.put("appVersion", packageInfo.versionName); info.put("appVersionCode", packageInfo.versionCode); } catch (PackageManager.NameNotFoundException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } String distribution; boolean isDebuggable = ( 0 != ( context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) ); if (isDebuggable) { distribution = "debug"; } else { String installer = manager.getInstallerPackageName(packageName); if (installer == null) { distribution = "adhoc"; } else if (installer.equals("com.android.vending") || installer.equals("com.google.market")) { distribution = "playstore"; } else if (installer.equals("com.amazon.venezia")) { distribution = "amazon"; } else { distribution = installer; } } info.put("distribution", distribution); info.put("language", Locale.getDefault().getLanguage()); info.put("os", "Android"); info.put("osVersion", Build.VERSION.RELEASE); info.put("model", Build.MANUFACTURER + " " + Build.MODEL); info.put("hardware", Build.FINGERPRINT); info.put("timeZone", TimeZone.getDefault().getID()); info.put("deviceName", getDeviceName()); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { SubscriptionManager subscriptionManager = SubscriptionManager.from(context); if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { List carriers = new ArrayList<>(); for (SubscriptionInfo subscriptionInfo : subscriptionManager.getActiveSubscriptionInfoList()) { carriers.add(subscriptionInfo.getCarrierName().toString()); } info.put("carrierNames", carriers); try { info.put("carrierName", carriers.get(0)); } catch ( IndexOutOfBoundsException e ) { Log.w(TAG, "getInfo: No carriers registered with subscription manager"); } } else { Log.w(TAG, "getInfo: Cannot get carrierNames, READ_PHONE_STATE not granted"); } } info.put("installationId", Installation.id(context)); return info; }

    private static String readInstallationFile(File installation) throws IOException { RandomAccessFile f = new RandomAccessFile(installation, "r"); byte[] bytes = new byte[(int) f.length()]; f.readFully(bytes); f.close(); return new String(bytes); }

    private static void writeInstallationFile(File installation) throws IOException { FileOutputStream out = new FileOutputStream(installation); String id = UUID.randomUUID().toString(); out.write(id.getBytes()); out.close(); }

    private static String getDeviceName() { String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; String name; if (model.startsWith(manufacturer)) { name = model; } else { name = manufacturer + " " + model; } return name; }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/Installation.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/proguard-project.txt

To enable ProGuard in your project, edit project.properties

to define the proguard.config property as described in that file.

Add project specific ProGuard rules here.

By default, the flags in this file are appended to flags specified

in ${sdk.dir}/tools/proguard/proguard-android.txt

You can edit the include path and order by changing the ProGuard

include property in project.properties.

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 *;

#}

webview interfaces

-keepclassmembers class co.median.android.ProfilePicker$ProfileJsBridge { ; } -keepclassmembers class co.median.android.MainActivity$StatusCheckerBridge { ; } -keepattributes JavascriptInterface

stuff for google play services

-keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); }

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; }

-keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; }

-keepnames class * implements android.os.Parcelable { public static final ** CREATOR; }

Google Cloud Messaging

-keep class com.google.android.gms.** { ; } -keep interface com.google.android.gms.* { *; }

appcompat library

-dontwarn android.support.v4.** -keep class android.support.v4.** { ; } -keep interface android.support.v4.* { ; } -dontwarn android.support.v7.* -keep class android.support.v7.** { ; } -keep interface android.support.v7.* { *; }

End of /mnt/data/jocal3--U/jocal3--U/android/app/proguard-project.txt

Start of /mnt/data/jocal3--U/jocal3--U/android/generate-header-images.sh

#!/bin/sh

BASEDIR=$(dirname $0)

sips --resampleHeight 36 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 54 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 108 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1 sips --resampleHeight 144 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png $BASEDIR/HeaderImage 2>&1

optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png 2>&1

dark theme icons

DARK_ICON=$BASEDIR/HeaderImageDark if [[ -f "$DARK_ICON" ]]; then sips --resampleHeight 36 -s format png --out $BASEDIR/app/src/main/res/drawable-night-mdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 54 -s format png --out $BASEDIR/app/src/main/res/drawable-night-hdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 72 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 108 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xxhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1 sips --resampleHeight 144 -s format png --out $BASEDIR/app/src/main/res/drawable-night-xxxhdpi/ic_actionbar.png $BASEDIR/HeaderImageDark 2>&1

optipng $BASEDIR/app/src/main/res/drawable-night-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-night-xxxhdpi/ic_actionbar.png 2>&1 fi

End of /mnt/data/jocal3--U/jocal3--U/android/generate-header-images.sh

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomJS.js

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomJS.js

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AudioUtils.java

package co.median.android;

import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFocusRequest; import android.media.AudioManager; import android.util.Log;

public class AudioUtils { private static final String TAG = AudioUtils.class.getName(); private static AudioFocusRequest initialFocusRequest; private static AudioFocusRequest focusRequest; private static AudioManager.OnAudioFocusChangeListener initialAudioFocusChangeListener; private static AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;

/**
 * @param mode - Accepts int for speaker mode:
 *             0 - phone speaker (default)
 *             1 - headset / wired device
 *             2 - bluetooth
 */
public static void setUpAudioDevice(MainActivity mainActivity, int mode) {
    AudioManager mAudioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE);
    if (mode == 2) {
        // bluetooth device
        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        mAudioManager.startBluetoothSco();
        mAudioManager.setBluetoothScoOn(true);
    } else if (mode == 1) {
        // wired device
        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        mAudioManager.stopBluetoothSco();
        mAudioManager.setBluetoothScoOn(false);
        mAudioManager.setSpeakerphoneOn(false);
    } else {
        // phone speaker
        mAudioManager.setMode(AudioManager.MODE_NORMAL);
        mAudioManager.stopBluetoothSco();
        mAudioManager.setBluetoothScoOn(false);
        mAudioManager.setSpeakerphoneOn(true);
    }
}

public static void reconnectToBluetooth(MainActivity mainActivity, AudioManager audioManager) {
    if (audioManager.isBluetoothScoAvailableOffCall() && !audioManager.isBluetoothScoOn()) {
        Log.d(TAG, "Resetting audio to bluetooth device");
        setUpAudioDevice(mainActivity, 2);
    }
}

/**
 * Listen to the first AUDIOFOCUS_GAIN before taking the audio input/output priority through requestAudioFocus()
 *
 * @param mainActivity
 */
public static void initAudioFocusListener(MainActivity mainActivity) {
    int result;
    final Object focusLock = new Object();
    
    AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE);
    if (audioManager == null) {
        Log.w(TAG, "AudioManager is null. Aborting initAudioFocusListener()");
    }
    
    initialAudioFocusChangeListener = focusChange -> {
        if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            synchronized (focusLock) {
                Log.d(TAG, "AudioFocusListener GAINED. Try to request audio focus");
                requestAudioFocus(mainActivity);
                abandonFocusRequest(mainActivity);
            }
        }
    };
    
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        result = audioManager.requestAudioFocus(initialAudioFocusChangeListener,
                AudioManager.STREAM_VOICE_CALL,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
    } else {
        AudioAttributes playbackAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                .build();
        initialFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
                .setAudioAttributes(playbackAttributes)
                .setAcceptsDelayedFocusGain(true)
                .setOnAudioFocusChangeListener(initialAudioFocusChangeListener)
                .build();
        result = audioManager.requestAudioFocus(initialFocusRequest);
    }
    
    synchronized (focusLock) {
        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Log.d(TAG, "AudioFocusListener REQUEST GRANTED");
        }
    }
}

/**
 * Prioritizes the bluetooth device if available.
 * Reconnects the bluetooth device when the audio focus is lost as a workaround for aborted connections
 * due to AudioRecord.AUDIO_INPUT_FLAG_FAST denial.
 *
 * @param mainActivity
 */
public static void requestAudioFocus(MainActivity mainActivity) {
    int result;
    final Object focusLock = new Object();
    
    AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE);
    if (audioManager == null) {
        Log.w(TAG, "AudioManager is null. Aborting requestAudioFocus()");
    }
    audioFocusChangeListener = focusChange -> {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_GAIN:
                synchronized (focusLock) {
                    Log.d(TAG, "AudioFocus GAINED. Try to connect bluetooth device");
                    reconnectToBluetooth(mainActivity, audioManager);
                }
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            case AudioManager.AUDIOFOCUS_LOSS:
                synchronized (focusLock) {
                    Log.d(TAG, "AudioFocus LOST. Try to reconnect bluetooth device");
                    reconnectToBluetooth(mainActivity, audioManager);
                }
                break;
        }
    };
    
    abandonFocusRequest(mainActivity);
    
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        result = audioManager.requestAudioFocus(audioFocusChangeListener,
                AudioManager.STREAM_VOICE_CALL,
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
    } else {
        AudioAttributes playbackAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                .build();
        focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
                .setAudioAttributes(playbackAttributes)
                .setAcceptsDelayedFocusGain(true)
                .setOnAudioFocusChangeListener(audioFocusChangeListener)
                .build();
        result = audioManager.requestAudioFocus(focusRequest);
    }
    
    synchronized (focusLock) {
        if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Log.d(TAG, "AudioFocus REQUEST GRANTED");
            reconnectToBluetooth(mainActivity, audioManager);
        }
    }
}

public static void abandonFocusRequest(MainActivity mainActivity) {
    AudioManager audioManager = (AudioManager) mainActivity.getSystemService(Context.AUDIO_SERVICE);
    if (audioManager == null) {
        Log.w(TAG, "AudioManager is null. Aborting abandonFocusRequest()");
    }
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
        if (initialAudioFocusChangeListener != null) {
            audioManager.abandonAudioFocus(initialAudioFocusChangeListener);
            initialAudioFocusChangeListener = null;
        }
        if (audioFocusChangeListener != null) {
            audioManager.abandonAudioFocus(audioFocusChangeListener);
            audioFocusChangeListener = null;
        }
    } else {
        if (initialFocusRequest != null) {
            audioManager.abandonAudioFocusRequest(initialFocusRequest);
            initialFocusRequest = null;
        }
        if (focusRequest != null) {
            audioManager.abandonAudioFocusRequest(focusRequest);
            focusRequest = null;
        }
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AudioUtils.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsonMenuAdapter.java

package co.median.android;

import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.StateListDrawable; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView;

import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import org.json.JSONArray; import org.json.JSONObject;

import io.gonative.android.icons.Icon; import co.median.median_core.AppConfig; import co.median.median_core.GNLog;

/**

  • Created by weiyin on 4/14/14. */ public class JsonMenuAdapter extends BaseExpandableListAdapter implements ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener { private static final String TAG = JsonMenuAdapter.class.getName();

    private MainActivity mainActivity; private JSONArray menuItems;

    private boolean groupsHaveIcons = false; private boolean childrenHaveIcons = false; private String status; private int selectedIndex; private ExpandableListView expandableListView; private Integer highlightColor; private int sidebar_icon_size; private int sidebar_expand_indicator_size;

    JsonMenuAdapter(MainActivity activity, ExpandableListView expandableListView) { this.mainActivity = activity; sidebar_icon_size = mainActivity.getResources().getInteger(R.integer.sidebar_icon_size); sidebar_expand_indicator_size = mainActivity.getResources().getInteger(R.integer.sidebar_expand_indicator_size); this.expandableListView = expandableListView; menuItems = null; this.highlightColor = activity.getResources().getColor(R.color.sidebarHighlight); // broadcast messages BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction() != null && intent.getAction().equals(AppConfig.PROCESSED_MENU_MESSAGE)) { update(); } } }; LocalBroadcastManager.getInstance(this.mainActivity) .registerReceiver(broadcastReceiver, new IntentFilter(AppConfig.PROCESSED_MENU_MESSAGE)); }

    private synchronized void update() { update(this.status); }

    public synchronized void update(String status) { if (status == null) status = "default"; this.status = status; menuItems = AppConfig.getInstance(mainActivity).menus.get(status); if (menuItems == null) menuItems = new JSONArray(); // figure out groupsHaveIcons and childrenHaveIcons (for layout alignment) groupsHaveIcons = false; childrenHaveIcons = false; for (int i = 0; i < menuItems.length(); i++) { JSONObject item = menuItems.optJSONObject(i); if (item == null) continue; if (!item.isNull("icon") && !item.optString("icon").isEmpty()) { groupsHaveIcons = true; } if (item.optBoolean("isGrouping", false)) { JSONArray sublinks = item.optJSONArray("subLinks"); if (sublinks != null) { for (int j = 0; j < sublinks.length(); j++) { JSONObject sublink = sublinks.optJSONObject(j); if (sublink != null && !sublink.isNull("icon") && !sublink.optString("icon").isEmpty()) { childrenHaveIcons = true; break; } } } } } notifyDataSetChanged(); }

    private String itemString(String s, int groupPosition) { String value = null; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); if (!section.isNull(s)) value = section.getString(s).trim(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return value; }

    private String itemString(String s, int groupPosition, int childPosition) { String value = null; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); JSONObject sublink = section.getJSONArray("subLinks").getJSONObject(childPosition); if (!sublink.isNull(s)) value = sublink.getString(s).trim(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return value; }

    private String getTitle(int groupPosition) { return itemString("label", groupPosition); }

    private String getTitle(int groupPosition, int childPosition) { return itemString("label", groupPosition, childPosition); }

    private Pair<String, String> getUrlAndJavascript(int groupPosition) { String url = itemString("url", groupPosition); String js = itemString("javascript", groupPosition); return new Pair<>(url, js); }

    private Pair<String, String> getUrlAndJavascript(int groupPosition, int childPosition) { String url = itemString("url", groupPosition, childPosition); String js = itemString("javascript", groupPosition, childPosition); return new Pair<>(url, js); }

    private boolean isGrouping(int groupPosition) { try { JSONObject section = (JSONObject) menuItems.get(groupPosition); return section.optBoolean("isGrouping", false); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); return false; } }

    @Override public int getGroupCount() { return menuItems.length(); }

    @Override public int getChildrenCount(int groupPosition) { int count = 0; try { JSONObject section = (JSONObject) menuItems.get(groupPosition); if (section.optBoolean("isGrouping", false)) { count = section.getJSONArray("subLinks").length(); } else { count = 0; } } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return count; }

    @Override public Object getGroup(int i) { return null; }

    @Override public Object getChild(int i, int i2) { return null; }

    @Override public long getGroupId(int i) { return 0; }

    @Override public long getChildId(int i, int i2) { return 0; }

    @Override public boolean hasStableIds() { return false; }

    @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = mainActivity.getLayoutInflater(); convertView = inflater.inflate(groupsHaveIcons ? R.layout.menu_group_icon : R.layout.menu_group_noicon, null); TextView title = convertView.findViewById(R.id.menu_item_title); title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); GradientDrawable shape = getHighlightDrawable(); StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); menuItem.setBackground(stateListDrawable); // expand/collapse indicator ImageView indicator = convertView.findViewById(R.id.menu_group_indicator); if (isGrouping(groupPosition)) { String iconName; int color = Color.BLACK; if (isExpanded) { iconName = "fas fa-angle-up"; } else { iconName = "fas fa-angle-down"; } if (groupPosition == this.selectedIndex) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } indicator.setImageDrawable(new Icon(mainActivity, iconName, sidebar_expand_indicator_size, color).getDrawable()); indicator.setVisibility(View.VISIBLE); } else { indicator.setVisibility(View.GONE); } //set the title TextView title = convertView.findViewById(R.id.menu_item_title); title.setText(getTitle(groupPosition)); if (this.selectedIndex == groupPosition) { title.setTextColor(this.highlightColor); } else { title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } // set icon String icon = itemString("icon", groupPosition); ImageView imageView = convertView.findViewById(R.id.menu_item_icon); if (icon != null && !icon.isEmpty()) { int color; if (groupPosition == this.selectedIndex) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); imageView.setImageDrawable(iconDrawable); imageView.setVisibility(View.VISIBLE); } else if (imageView != null) { imageView.setVisibility(View.INVISIBLE); } return convertView; }

    @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = mainActivity.getLayoutInflater(); if (groupsHaveIcons || childrenHaveIcons) convertView = inflater.inflate(R.layout.menu_child_icon, parent, false); else convertView = inflater.inflate(R.layout.menu_child_noicon, parent, false); // style it TextView title = convertView.findViewById(R.id.menu_item_title); title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } RelativeLayout menuItem = convertView.findViewById(R.id.menu_item); GradientDrawable shape = getHighlightDrawable(); StateListDrawable stateListDrawable = new StateListDrawable(); stateListDrawable.addState(new int[]{android.R.attr.state_activated}, shape); stateListDrawable.addState(new int[]{android.R.attr.state_selected}, shape); menuItem.setBackground(stateListDrawable); // set title TextView title = convertView.findViewById(R.id.menu_item_title); title.setText(getTitle(groupPosition, childPosition)); if (this.selectedIndex == (groupPosition + childPosition) + 1) { title.setTextColor(this.highlightColor); } else { title.setTextColor(mainActivity.getResources().getColor(R.color.sidebarForeground)); } // set icon String icon = itemString("icon", groupPosition, childPosition); ImageView imageView = convertView.findViewById(R.id.menu_item_icon); if (icon != null && !icon.isEmpty()) { int color; if (this.selectedIndex == (groupPosition + childPosition) + 1) { color = this.highlightColor; } else { color = mainActivity.getResources().getColor(R.color.sidebarForeground); } Drawable iconDrawable = new Icon(mainActivity, icon, sidebar_icon_size, color).getDrawable(); imageView.setImageDrawable(iconDrawable); imageView.setVisibility(View.VISIBLE); } else if (imageView != null) { imageView.setVisibility(View.INVISIBLE); } return convertView; }

    @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; }

    @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { try { if (isGrouping(groupPosition)) { // return false for default handling behavior return false; } else { Pair<String,String> urlAndJavascript = getUrlAndJavascript(groupPosition); loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); return true; // tell android that we have handled it } } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return false; }

    @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { int index = parent.getFlatListPosition(ExpandableListView.getPackedPositionForChild(groupPosition, childPosition)); parent.setItemChecked(index, true); this.selectedIndex = index; Pair<String, String> urlAndJavascript = getUrlAndJavascript(groupPosition, childPosition); loadUrlAndJavascript(urlAndJavascript.first, urlAndJavascript.second); return true; }

    private void loadUrlAndJavascript(String url, String javascript) { // check for GONATIVE_USERID if (UrlInspector.getInstance().getUserId() != null) { url = url.replaceAll("GONATIVE_USERID", UrlInspector.getInstance().getUserId()); } if (javascript == null) mainActivity.loadUrl(url); else mainActivity.loadUrlAndJavascript(url, javascript); mainActivity.closeDrawers(); }

    public void autoSelectItem(String url) { String formattedUrl = url.replaceAll("/$", ""); if (menuItems == null) return; for (int i = 0; i < menuItems.length(); i++) { if (formattedUrl.equals(menuItems.optJSONObject(i).optString("url").replaceAll("/$", ""))) { expandableListView.setItemChecked(i, true); selectedIndex = i; return; } } }

    private GradientDrawable getHighlightDrawable() { GradientDrawable shape = new GradientDrawable(); shape.setCornerRadius(10); shape.setColor(this.highlightColor); shape.setAlpha(30); return shape; }

    @Override public int getChildType(int groupPosition, int childPosition) { if (groupsHaveIcons || childrenHaveIcons) return 0; else return 1; }

    @Override public int getChildTypeCount() { return 2; }

    @Override public int getGroupType(int groupPosition) { if (groupsHaveIcons) return 0; else return 1; }

    @Override public int getGroupTypeCount() { return 2; }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsonMenuAdapter.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/assets/HelperClass.java

package io.median.android;

public class HelperClass { public volatile static int newLoad = 0; }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/assets/HelperClass.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/IOUtils.java

package co.median.android;

import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;

import co.median.median_core.GNLog;

public class IOUtils { private static final String TAG = IOUtils.class.getName();

public static void copy(InputStream in, OutputStream out) throws IOException{
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
}

public static void close(Closeable c) {
    if (c == null) return;
    try {
        c.close();
    } catch (IOException e){
        GNLog.getInstance().logError(TAG, e.toString(), e);
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/IOUtils.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<!-- Camera permissions -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" android:required="false" />

<!-- Microphone permissions -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- Bluetooth permissions -->
<!--<uses-permission android:name="android.permission.BLUETOOTH" />-->
<!--<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />-->

<!-- permissions for push messages -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
    android:name="${applicationId}.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />

<!-- permissions to block phone calls -->
<!--<uses-permission android:name="android.permission.READ_CONTACTS" />-->
<!--<uses-permission android:name="android.permission.READ_CALL_LOG" />-->
<!--<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />-->

<queries>
    <!-- Camera -->
    <intent>
        <action android:name="android.media.action.IMAGE_CAPTURE" />
    </intent>
    <intent>
        <action android:name="android.media.action.VIDEO_CAPTURE" />
    </intent>

    <!-- Gallery -->
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.PICK" />
        <data android:mimeType="image/*" />
    </intent>
    <intent>
        <action android:name="android.intent.action.CHOOSER" />
    </intent>

    <!-- Browser -->
    <intent>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
    </intent>
</queries>

<application
    android:name=".GoNativeApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:logo="@drawable/ic_actionbar"
    android:supportsRtl="true"
    android:networkSecurityConfig="@xml/network_security_config"
    android:requestLegacyExternalStorage="true">

    <activity
        android:name=".LaunchActivity"
        android:exported="true"
        android:configChanges="orientation|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".MainActivity"
        android:theme="@style/GoNativeTheme.NoActionBar"
        android:configChanges="orientation|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:exported="true"
        android:label="@string/app_name"
        tools:node="merge">
    </activity>

    <activity
        android:name=".AppLinksActivity"
        android:exported="true"
        android:launchMode="singleTask">
        <intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="citibankdemobusiness://citibankdemobusiness.dev/.http"/>
<data android:scheme="citibankdemobusiness://citibankdemobusiness.dev/.https"/>
        <!--example: -->
        <!--<intent-filter>-->
        <!--<action android:name="android.intent.action.VIEW"></action>-->
        <!--<category android:name="android.intent.category.DEFAULT"></category>-->
        <!--<category android:name="android.intent.category.BROWSABLE"></category>-->
        <!--<data android:scheme="http"></data>-->
        <!--<data android:scheme="https"></data>-->
        <!--<data android:host="gonative.io"></data>-->
        <!--<data android:pathPrefix="/"></data>-->
        <!--</intent-filter>-->
    </activity>

    <!-- For file sharing without having to use external permissions. -->
    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

    <!-- Facebook -->
    <meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="fb${facebook_app_id}" />
    <meta-data
        android:name="com.facebook.sdk.ClientToken"
        android:value="${facebook_client_token}" />

    <service android:name=".DownloadService"/>

    <receiver
        android:name="co.median.android.AppUpgradeReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
        </intent-filter>
    </receiver>

</application>

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/AndroidManifest.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/generate-app-icons.sh

#!/bin/sh

BASEDIR=$(dirname $0) sips -z 1024 1024 -s format png --out $BASEDIR/AppIconTemp.png $BASEDIR/AppIcon 2>&1

create icon surrounded by transparent border (AppIconBordered). Make border slightly less than 256 so background does not bleed through

convert $BASEDIR/AppIconTemp.png -bordercolor transparent -border 250 $BASEDIR/AppIconBordered.png

create rounded rectangle icon (AppIconRound)

convert -size 1024x1024 xc:none -draw "roundrectangle 0,0,1024,1024,80,80" $BASEDIR/mask.png 2>&1 convert $BASEDIR/AppIconTemp.png -matte $BASEDIR/mask.png -compose DstIn -composite $BASEDIR/AppIconRound.png 2>&1

rm -f $BASEDIR/AppIconTemp.png rm -f $BASEDIR/mask.png

sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png $BASEDIR/AppIconRound.png 2>&1

sips -z 108 108 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 162 162 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 216 216 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 324 324 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1 sips -z 432 432 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png $BASEDIR/AppIconBordered.png 2>&1

optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png 2>&1

sidebar logo

SIDEBAR_LOGO=$BASEDIR/SidebarLogo if [[ -f "SIDEBAR_LOGO" ]]; then sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png $BASEDIR/SidebarLogo 2>&1 else sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 fi

optipng $BASEDIR/app/src/main/res/mipmap-mdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-hdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-xxxhdpi/ic_sidebar_logo.png 2>&1

SIDEBAR_LOG_DARK=$BASEDIR/SideBarLogoDark if [[ -f "SIDEBAR_LOG_DARK" ]]; then sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png $BASEDIR/SideBarLogoDark 2>&1 else sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 sips -z 192 192 -s format png --out $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png $BASEDIR/AppIconRound.png 2>&1 fi

optipng $BASEDIR/app/src/main/res/mipmap-night-mdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-hdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xxhdpi/ic_sidebar_logo.png 2>&1 optipng $BASEDIR/app/src/main/res/mipmap-night-xxxhdpi/ic_sidebar_logo.png 2>&1

sips -z 36 36 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 54 54 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 108 108 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1 sips -z 144 144 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png $BASEDIR/AppIconRound.png 2>&1

optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_actionbar.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_actionbar.png 2>&1

rm -rf $BASEDIR/AppIconRound.png rm -rf $BASEDIR/AppIconBordered.png

notification icon

sips -z 24 24 -s format png --out $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 36 36 -s format png --out $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 48 48 -s format png --out $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 72 72 -s format png --out $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1 sips -z 96 96 -s format png --out $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/NotificationIcon 2>&1

optipng $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png 2>&1 optipng $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png 2>&1

End of /mnt/data/jocal3--U/jocal3--U/android/generate-app-icons.sh

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomCSS.css

@font-face { font-family: "inter"; font-weight: 100 900; font-display: swap; font-style: normal; src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2-variations"), url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2"); src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter.var-9563063c6f09165dc06c.woff2) format("woff2") tech("variations"); } @font-face { font-family: "inter"; font-weight: 100 900; font-display: swap; font-style: italic; src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2-variations"), url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2"); src: url(https://cdn.moderntreasury.com/packs/static/fonts/inter/inter-italic.var-96d5fbbc1c71a94ee26a.woff2) format("woff2") tech("variations"); } @font-face { font-family: "jetbrains-mono"; src: url(https://cdn.moderntreasury.com/packs/static/fonts/jetbrains-mono/jetbrains-mono-regular-2b19db54c7d249f725e4.woff2) format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "jetbrains-mono"; src: url(https://cdn.moderntreasury.com/packs/static/fonts/jetbrains-mono/jetbrains-mono-semibold-fbbf6d4051f550ea9689.woff2) format("woff2"); font-weight: 600; font-style: normal; font-display: swap; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown / / stylelint-disable no-duplicate-selectors / / stylelint-disable / / stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline / .ant-select-auto-complete { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; } .ant-select-auto-complete .ant-select-clear { right: 13px; } / stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown / / stylelint-disable no-duplicate-selectors / / stylelint-disable / / stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline / .ant-select-single .ant-select-selector { display: flex; } .ant-select-single .ant-select-selector .ant-select-selection-search { position: absolute; top: 0; right: 11px; bottom: 0; left: 11px; } .ant-select-single .ant-select-selector .ant-select-selection-search-input { width: 100%; } .ant-select-single .ant-select-selector .ant-select-selection-item, .ant-select-single .ant-select-selector .ant-select-selection-placeholder { padding: 0; line-height: 30px; transition: all 0.3s, visibility 0s; } .ant-select-single .ant-select-selector .ant-select-selection-item { position: relative; -webkit-user-select: none; user-select: none; } .ant-select-single .ant-select-selector .ant-select-selection-placeholder { transition: none; pointer-events: none; } .ant-select-single .ant-select-selector::after, .ant-select-single .ant-select-selector .ant-select-selection-item::after, .ant-select-single .ant-select-selector .ant-select-selection-placeholder::after { display: inline-block; width: 0; visibility: hidden; content: "\a0"; } .ant-select-single.ant-select-show-arrow .ant-select-selection-search { right: 25px; } .ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 18px; } .ant-select-single.ant-select-open .ant-select-selection-item { color: #bfbfbf; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector { width: 100%; height: 32px; padding: 0 11px; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { height: 30px; } .ant-select-single:not(.ant-select-customize-input) .ant-select-selector::after { line-height: 30px; } .ant-select-single.ant-select-customize-input .ant-select-selector::after { display: none; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-search { position: static; width: 100%; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder { position: absolute; right: 0; left: 0; padding: 0 11px; } .ant-select-single.ant-select-customize-input .ant-select-selector .ant-select-selection-placeholder::after { display: none; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { height: 40px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector::after, .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { line-height: 38px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input):not( .ant-select-customize-input ) .ant-select-selection-search-input { height: 38px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { height: 24px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector::after, .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-item, .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-placeholder { line-height: 22px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input):not( .ant-select-customize-input ) .ant-select-selection-search-input { height: 22px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selection-search { right: 7px; left: 7px; } .ant-select-single.ant-select-sm:not(.ant-select-customize-input) .ant-select-selector { padding: 0 7px; } .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-search { right: 28px; } .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-item, .ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 21px; } .ant-select-single.ant-select-lg:not(.ant-select-customize-input) .ant-select-selector { padding: 0 11px; } /*

  • Do not merge height & line-height under style with selection & search,
  • since chrome may update to redesign with its align logic. */ .ant-select-selection-overflow { position: relative; display: flex; flex: auto; flex-wrap: wrap; max-width: 100%; } .ant-select-selection-overflow-item { flex: none; align-self: center; max-width: 100%; } .ant-select-multiple .ant-select-selector { display: flex; flex-wrap: wrap; align-items: center; padding: 1px 4px; } .ant-select-show-search.ant-select-multiple .ant-select-selector { cursor: text; } .ant-select-disabled.ant-select-multiple .ant-select-selector { background: #f5f5f5; cursor: not-allowed; } .ant-select-multiple .ant-select-selector::after { display: inline-block; width: 0; margin: 2px 0; line-height: 24px; visibility: hidden; content: "\a0"; } .ant-select-multiple.ant-select-show-arrow .ant-select-selector, .ant-select-multiple.ant-select-allow-clear .ant-select-selector { padding-right: 24px; } .ant-select-multiple .ant-select-selection-item { position: relative; display: flex; flex: none; box-sizing: border-box; max-width: 100%; height: 24px; margin-top: 2px; margin-bottom: 2px; line-height: 22px; background: #f5f5f5; border: 1px solid #f0f0f0; border-radius: 2px; cursor: default; transition: font-size 0.3s, line-height 0.3s, height 0.3s; -webkit-user-select: none; user-select: none; margin-inline-end: 4px; padding-inline-start: 8px; padding-inline-end: 4px; } .ant-select-disabled.ant-select-multiple .ant-select-selection-item { color: #bfbfbf; border-color: #d9d9d9; cursor: not-allowed; } .ant-select-multiple .ant-select-selection-item-content { display: inline-block; margin-right: 4px; overflow: hidden; white-space: pre; text-overflow: ellipsis; } .ant-select-multiple .ant-select-selection-item-remove { color: inherit; font-style: normal; line-height: 0; text-align: center; text-transform: none; vertical-align: -0.125em; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: inline-flex; align-items: center; color: rgba(0, 0, 0, 0.45); font-weight: bold; font-size: 10px; line-height: inherit; cursor: pointer; } .ant-select-multiple .ant-select-selection-item-remove > * { line-height: 1; } .ant-select-multiple .ant-select-selection-item-remove svg { display: inline-block; } .ant-select-multiple .ant-select-selection-item-remove::before { display: none; } .ant-select-multiple .ant-select-selection-item-remove .ant-select-multiple .ant-select-selection-item-remove-icon { display: block; } .ant-select-multiple .ant-select-selection-item-remove > .anticon { vertical-align: middle; } .ant-select-multiple .ant-select-selection-item-remove:hover { color: rgba(0, 0, 0, 0.75); } .ant-select-multiple .ant-select-selection-overflow-item
  • .ant-select-selection-overflow-item .ant-select-selection-search { margin-inline-start: 0; } .ant-select-multiple .ant-select-selection-search { position: relative; max-width: 100%; margin-inline-start: 7px; } .ant-select-multiple .ant-select-selection-search-input, .ant-select-multiple .ant-select-selection-search-mirror { height: 24px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; line-height: 24px; transition: all 0.3s; } .ant-select-multiple .ant-select-selection-search-input { width: 100%; min-width: 4.1px; } .ant-select-multiple .ant-select-selection-search-mirror { position: absolute; top: 0; left: 0; z-index: 999; white-space: pre; visibility: hidden; } .ant-select-multiple .ant-select-selection-placeholder { position: absolute; top: 50%; right: 11px; left: 11px; transform: translateY(-50%); transition: all 0.3s; } .ant-select-multiple.ant-select-lg .ant-select-selector::after { line-height: 32px; } .ant-select-multiple.ant-select-lg .ant-select-selection-item { height: 32px; line-height: 30px; } .ant-select-multiple.ant-select-lg .ant-select-selection-search { height: 32px; line-height: 32px; } .ant-select-multiple.ant-select-lg .ant-select-selection-search-input, .ant-select-multiple.ant-select-lg .ant-select-selection-search-mirror { height: 32px; line-height: 30px; } .ant-select-multiple.ant-select-sm .ant-select-selector::after { line-height: 16px; } .ant-select-multiple.ant-select-sm .ant-select-selection-item { height: 16px; line-height: 14px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search { height: 16px; line-height: 16px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search-input, .ant-select-multiple.ant-select-sm .ant-select-selection-search-mirror { height: 16px; line-height: 14px; } .ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { left: 7px; } .ant-select-multiple.ant-select-sm .ant-select-selection-search { margin-inline-start: 3px; } .ant-select-disabled .ant-select-selection-item-remove { display: none; } .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer) .ant-select-selector { background-color: #fff; border-color: #ff4d4f !important; } .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector, .ant-select-status-error.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector { border-color: #ff7875; box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2); border-right-width: 1px; outline: 0; } .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer) .ant-select-selector { background-color: #fff; border-color: #faad14 !important; } .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-open .ant-select-selector, .ant-select-status-warning.ant-select:not(.ant-select-disabled):not( .ant-select-customize-input ):not(.ant-pagination-size-changer).ant-select-focused .ant-select-selector { border-color: #ffc53d; box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); border-right-width: 1px; outline: 0; } .ant-select-status-error.ant-select-has-feedback .ant-select-clear, .ant-select-status-warning.ant-select-has-feedback .ant-select-clear, .ant-select-status-success.ant-select-has-feedback .ant-select-clear, .ant-select-status-validating.ant-select-has-feedback .ant-select-clear { right: 32px; } .ant-select-status-error.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-warning.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-success.ant-select-has-feedback .ant-select-selection-selected-value, .ant-select-status-validating.ant-select-has-feedback .ant-select-selection-selected-value { padding-right: 42px; } /* Reset search input style / .ant-select { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; position: relative; display: inline-block; cursor: pointer; } .ant-select:not(.ant-select-customize-input) .ant-select-selector { position: relative; background-color: #fff; border: 1px solid #d9d9d9; border-radius: 2px; transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); } .ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: pointer; } .ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector { cursor: text; } .ant-select-show-search.ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: auto; } .ant-select-focused:not(.ant-select-disabled).ant-select:not( .ant-select-customize-input ) .ant-select-selector { border-color: #40a9ff; box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); border-right-width: 1px; outline: 0; } .ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector { color: rgba(0, 0, 0, 0.25); background: #f5f5f5; cursor: not-allowed; } .ant-select-multiple.ant-select-disabled.ant-select:not( .ant-select-customize-input ) .ant-select-selector { background: #f5f5f5; } .ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector input { cursor: not-allowed; } .ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input { margin: 0; padding: 0; background: transparent; border: none; outline: none; -webkit-appearance: none; appearance: none; } .ant-select:not(.ant-select-customize-input) .ant-select-selector .ant-select-selection-search-input::-webkit-search-cancel-button { display: none; / stylelint-disable-next-line property-no-vendor-prefix */ -webkit-appearance: none; } .ant-select:not(.ant-select-disabled):hover .ant-select-selector { border-color: #40a9ff; border-right-width: 1px; } .ant-select-selection-item { flex: 1 1; overflow: hidden; font-weight: normal; white-space: nowrap; text-overflow: ellipsis; } @media all and (-ms-high-contrast: none) { .ant-select-selection-item *::-ms-backdrop, .ant-select-selection-item { flex: auto; } } .ant-select-selection-placeholder { flex: 1 1; overflow: hidden; color: #bfbfbf; white-space: nowrap; text-overflow: ellipsis; pointer-events: none; } @media all and (-ms-high-contrast: none) { .ant-select-selection-placeholder *::-ms-backdrop, .ant-select-selection-placeholder { flex: auto; } } .ant-select-arrow { display: inline-flex; color: inherit; font-style: normal; text-transform: none; vertical-align: -0.125em; text-rendering: optimizelegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; position: absolute; top: 50%; right: 11px; display: flex; align-items: center; height: 12px; margin-top: -6px; color: rgba(0, 0, 0, 0.25); font-size: 12px; line-height: 1; text-align: center; pointer-events: none; } .ant-select-arrow > * { line-height: 1; } .ant-select-arrow svg { display: inline-block; } .ant-select-arrow::before { display: none; } .ant-select-arrow .ant-select-arrow-icon { display: block; } .ant-select-arrow .anticon { vertical-align: top; transition: transform 0.3s; } .ant-select-arrow .anticon > svg { vertical-align: top; } .ant-select-arrow .anticon:not(.ant-select-suffix) { pointer-events: auto; } .ant-select-disabled .ant-select-arrow { cursor: not-allowed; } .ant-select-arrow > *:not(:last-child) { margin-inline-end: 8px; } .ant-select-clear { position: absolute; top: 50%; right: 11px; z-index: 1; display: inline-block; width: 12px; height: 12px; margin-top: -6px; color: rgba(0, 0, 0, 0.25); font-size: 12px; font-style: normal; line-height: 1; text-align: center; text-transform: none; background: #fff; cursor: pointer; opacity: 0; transition: color 0.3s ease, opacity 0.15s ease; text-rendering: auto; } .ant-select-clear::before { display: block; } .ant-select-clear:hover { color: rgba(0, 0, 0, 0.45); } .ant-select:hover .ant-select-clear { opacity: 1; } .ant-select-dropdown { margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum", ; position: absolute; top: -9999px; left: -9999px; z-index: 1050; box-sizing: border-box; padding: 4px 0; overflow: hidden; font-size: 14px; font-variant: initial; background-color: #fff; border-radius: 2px; outline: none; box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); } .ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-bottomLeft, .ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-bottomLeft { animation-name: antSlideUpIn; } .ant-select-dropdown.ant-slide-up-enter.ant-slide-up-enter-active.ant-select-dropdown-placement-topLeft, .ant-select-dropdown.ant-slide-up-appear.ant-slide-up-appear-active.ant-select-dropdown-placement-topLeft { animation-name: antSlideDownIn; } .ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-bottomLeft { animation-name: antSlideUpOut; } .ant-select-dropdown.ant-slide-up-leave.ant-slide-up-leave-active.ant-select-dropdown-placement-topLeft { animation-name: antSlideDownOut; } .ant-select-dropdown-hidden { display: none; } .ant-select-dropdown-empty { color: rgba(0, 0, 0, 0.25); } .ant-select-item-empty { position: relative; display: block; min-height: 32px; padding: 5px 12px; color: rgba(0, 0, 0, 0.85); font-weight: normal; font-size: 14px; line-height: 22px; color: rgba(0, 0, 0, 0.25); } .ant-select-item { position: relative; display: block; min-height: 32px; padding: 5px 12px; color: rgba(0, 0, 0, 0.85); font-weight: normal; font-size: 14px; line-height: 22px; cursor: pointer; transition: background 0.3s ease; } .ant-select-item-group { color: rgba(0, 0, 0, 0.45); font-size: 12px; cursor: default; } .ant-select-item-option { display: flex; } .ant-select-item-option-content { flex: auto; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } .ant-select-item-option-state { flex: none; } .ant-select-item-option-active:not(.ant-select-item-option-disabled) { background-color: #f5f5f5; } .ant-select-item-option-selected:not(.ant-select-item-option-disabled) { color: rgba(0, 0, 0, 0.85); font-weight: 600; background-color: #e6f7ff; } .ant-select-item-option-selected:not(.ant-select-item-option-disabled) .ant-select-item-option-state { color: #1890ff; } .ant-select-item-option-disabled { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-item-option-disabled.ant-select-item-option-selected { background-color: #f5f5f5; } .ant-select-item-option-grouped { padding-left: 24px; } .ant-select-lg { font-size: 16px; } .ant-select-borderless .ant-select-selector { background-color: transparent !important; border-color: transparent !important; box-shadow: none !important; } .ant-select.ant-select-in-form-item { width: 100%; } .ant-select-compact-item:not(.ant-select-compact-last-item) { margin-right: -1px; } .ant-select-compact-item:not( .ant-select-compact-last-item ).ant-select-compact-item-rtl { margin-right: 0; margin-left: -1px; } .ant-select-compact-item:hover > *, .ant-select-compact-item:focus > *, .ant-select-compact-item:active > * { z-index: 2; } .ant-select-compact-item.ant-select-focused > * { z-index: 2; } .ant-select-compact-item[disabled] > * { z-index: 0; } .ant-select-compact-item:not(.ant-select-compact-first-item):not( .ant-select-compact-last-item ).ant-select

    .ant-select-selector { border-radius: 0; } .ant-select-compact-item.ant-select-compact-first-item.ant-select:not( .ant-select-compact-last-item ):not(.ant-select-compact-item-rtl) .ant-select-selector { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ant-select-compact-item.ant-select-compact-last-item.ant-select:not( .ant-select-compact-first-item ):not(.ant-select-compact-item-rtl) .ant-select-selector { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ant-select-compact-item.ant-select.ant-select-compact-first-item.ant-select-compact-item-rtl:not( .ant-select-compact-last-item ) .ant-select-selector { border-top-left-radius: 0; border-bottom-left-radius: 0; } .ant-select-compact-item.ant-select.ant-select-compact-last-item.ant-select-compact-item-rtl:not( .ant-select-compact-first-item ) .ant-select-selector { border-top-right-radius: 0; border-bottom-right-radius: 0; } .ant-select-rtl { direction: rtl; } .ant-select-rtl .ant-select-arrow { right: initial; left: 11px; } .ant-select-rtl .ant-select-clear { right: initial; left: 11px; } .ant-select-dropdown-rtl { direction: rtl; } .ant-select-dropdown-rtl .ant-select-item-option-grouped { padding-right: 24px; padding-left: 12px; } .ant-select-rtl.ant-select-multiple.ant-select-show-arrow .ant-select-selector, .ant-select-rtl.ant-select-multiple.ant-select-allow-clear .ant-select-selector { padding-right: 4px; padding-left: 24px; } .ant-select-rtl.ant-select-multiple .ant-select-selection-item { text-align: right; } .ant-select-rtl.ant-select-multiple .ant-select-selection-item-content { margin-right: 0; margin-left: 4px; text-align: right; } .ant-select-rtl.ant-select-multiple .ant-select-selection-search-mirror { right: 0; left: auto; } .ant-select-rtl.ant-select-multiple .ant-select-selection-placeholder { right: 11px; left: auto; } .ant-select-rtl.ant-select-multiple.ant-select-sm .ant-select-selection-placeholder { right: 7px; } .ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-item, .ant-select-rtl.ant-select-single .ant-select-selector .ant-select-selection-placeholder { right: 0; left: 9px; text-align: right; } .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-search { right: 11px; left: 25px; } .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-item, .ant-select-rtl.ant-select-single.ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 0; padding-left: 18px; } .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-search { right: 6px; } .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-item, .ant-select-rtl.ant-select-single.ant-select-sm:not( .ant-select-customize-input ).ant-select-show-arrow .ant-select-selection-placeholder { padding-right: 0; padding-left: 21px; } /* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown / / stylelint-disable no-duplicate-selectors / / stylelint-disable / / stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline / @keyframes ant-tree-node-fx-do-not-use { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes antCheckboxEffect { 0% { transform: scale(1); opacity: 0.5; } 100% { transform: scale(1.6); opacity: 0; } } .ant-select-tree-checkbox { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; list-style: none; font-feature-settings: "tnum"; position: relative; top: 0.2em; line-height: 1; white-space: nowrap; outline: none; cursor: pointer; } .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, .ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, .ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { border-color: #1890ff; } .ant-select-tree-checkbox-checked::after { position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 1px solid #1890ff; border-radius: 2px; visibility: hidden; animation: antCheckboxEffect 0.36s ease-in-out; animation-fill-mode: backwards; content: ""; } .ant-select-tree-checkbox:hover::after, .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox::after { visibility: visible; } .ant-select-tree-checkbox-inner { position: relative; top: 0; left: 0; display: block; width: 16px; height: 16px; direction: ltr; background-color: #fff; border: 1px solid #d9d9d9; border-radius: 2px; border-collapse: separate; transition: all 0.3s; } .ant-select-tree-checkbox-inner::after { position: absolute; top: 50%; left: 21.5%; display: table; width: 5.71428571px; height: 9.14285714px; border: 2px solid #fff; border-top: 0; border-left: 0; transform: rotate(45deg) scale(0) translate(-50%, -50%); opacity: 0; transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; content: " "; } .ant-select-tree-checkbox-input { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1; width: 100%; height: 100%; cursor: pointer; opacity: 0; } .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { position: absolute; display: table; border: 2px solid #fff; border-top: 0; border-left: 0; transform: rotate(45deg) scale(1) translate(-50%, -50%); opacity: 1; transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; content: " "; } .ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { background-color: #1890ff; border-color: #1890ff; } .ant-select-tree-checkbox-disabled { cursor: not-allowed; } .ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner::after { border-color: rgba(0, 0, 0, 0.25); animation-name: none; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input { cursor: not-allowed; pointer-events: none; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { background-color: #f5f5f5; border-color: #d9d9d9 !important; } .ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { border-color: #f5f5f5; border-collapse: separate; animation-name: none; } .ant-select-tree-checkbox-disabled + span { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-tree-checkbox-disabled:hover::after, .ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-disabled::after { visibility: hidden; } .ant-select-tree-checkbox-wrapper { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; display: inline-flex; align-items: baseline; line-height: unset; cursor: pointer; } .ant-select-tree-checkbox-wrapper::after { display: inline-block; width: 0; overflow: hidden; content: "\a0"; } .ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-disabled { cursor: not-allowed; } .ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper { margin-left: 8px; } .ant-select-tree-checkbox-wrapper.ant-select-tree-checkbox-wrapper-in-form-item input[type="checkbox"] { width: 14px; height: 14px; } .ant-select-tree-checkbox + span { padding-right: 8px; padding-left: 8px; } .ant-select-tree-checkbox-group { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; display: inline-block; } .ant-select-tree-checkbox-group-item { margin-right: 8px; } .ant-select-tree-checkbox-group-item:last-child { margin-right: 0; } .ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item { margin-left: 0; } .ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner { background-color: #fff; border-color: #d9d9d9; } .ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner::after { top: 50%; left: 50%; width: 8px; height: 8px; background-color: #1890ff; border: 0; transform: translate(-50%, -50%) scale(1); opacity: 1; content: " "; } .ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner::after { background-color: rgba(0, 0, 0, 0.25); border-color: rgba(0, 0, 0, 0.25); } .ant-tree-select-dropdown { padding: 8px 4px; } .ant-tree-select-dropdown-rtl { direction: rtl; } .ant-tree-select-dropdown .ant-select-tree { border-radius: 0; } .ant-tree-select-dropdown .ant-select-tree-list-holder-inner { align-items: stretch; } .ant-tree-select-dropdown .ant-select-tree-list-holder-inner .ant-select-tree-treenode .ant-select-tree-node-content-wrapper { flex: auto; } .ant-select-tree { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; background: #fff; border-radius: 2px; transition: background-color 0.3s; } .ant-select-tree-focused:not(:hover):not(.ant-select-tree-active-focused) { background: #e6f7ff; } .ant-select-tree-list-holder-inner { align-items: flex-start; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner { align-items: stretch; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-node-content-wrapper { flex: auto; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging { position: relative; } .ant-select-tree.ant-select-tree-block-node .ant-select-tree-list-holder-inner .ant-select-tree-treenode.dragging::after { position: absolute; top: 0; right: 0; bottom: 4px; left: 0; border: 1px solid #1890ff; opacity: 0; animation: ant-tree-node-fx-do-not-use 0.3s; animation-play-state: running; animation-fill-mode: forwards; content: ""; pointer-events: none; } .ant-select-tree .ant-select-tree-treenode { display: flex; align-items: flex-start; padding: 0 0 4px 0; outline: none; } .ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper { color: rgba(0, 0, 0, 0.25); cursor: not-allowed; } .ant-select-tree .ant-select-tree-treenode-disabled .ant-select-tree-node-content-wrapper:hover { background: transparent; } .ant-select-tree .ant-select-tree-treenode-active .ant-select-tree-node-content-wrapper { background: #f5f5f5; } .ant-select-tree .ant-select-tree-treenode:not( .ant-select-tree .ant-select-tree-treenode-disabled ).filter-node .ant-select-tree-title { color: inherit; font-weight: 500; } .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon { width: 24px; line-height: 24px; text-align: center; visibility: visible; opacity: 0.2; transition: opacity 0.3s; } .ant-select-tree-treenode:hover .ant-select-tree .ant-select-tree-treenode-draggable .ant-select-tree-draggable-icon { opacity: 0.45; } .ant-select-tree .ant-select-tree-treenode-draggable.ant-select-tree-treenode-disabled .ant-select-tree-draggable-icon { visibility: hidden; } .ant-select-tree-indent { align-self: stretch; white-space: nowrap; -webkit-user-select: none; user-select: none; } .ant-select-tree-indent-unit { display: inline-block; width: 24px; } .ant-select-tree-draggable-icon { visibility: hidden; } .ant-select-tree-switcher { position: relative; flex: none; align-self: stretch; width: 24px; margin: 0; line-height: 24px; text-align: center; cursor: pointer; -webkit-user-select: none; user-select: none; } .ant-select-tree-switcher .ant-tree-switcher-icon, .ant-select-tree-switcher .ant-select-tree-switcher-icon { display: inline-block; font-size: 10px; vertical-align: baseline; } .ant-select-tree-switcher .ant-tree-switcher-icon svg, .ant-select-tree-switcher .ant-select-tree-switcher-icon svg { transition: transform 0.3s; } .ant-select-tree-switcher-noop { cursor: default; } .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { transform: rotate(-90deg); } .ant-select-tree-switcher-loading-icon { color: #1890ff; } .ant-select-tree-switcher-leaf-line { position: relative; z-index: 1; display: inline-block; width: 100%; height: 100%; } .ant-select-tree-switcher-leaf-line::before { position: absolute; top: 0; right: 12px; bottom: -4px; margin-left: -1px; border-right: 1px solid #d9d9d9; content: " "; } .ant-select-tree-switcher-leaf-line::after { position: absolute; width: 10px; height: 14px; border-bottom: 1px solid #d9d9d9; content: " "; } .ant-select-tree-checkbox { top: initial; margin: 4px 8px 0 0; } .ant-select-tree .ant-select-tree-node-content-wrapper { position: relative; z-index: auto; min-height: 24px; margin: 0; padding: 0 4px; color: inherit; line-height: 24px; background: transparent; border-radius: 2px; cursor: pointer; transition: all 0.3s, border 0s, line-height 0s, box-shadow 0s; } .ant-select-tree .ant-select-tree-node-content-wrapper:hover { background-color: #f5f5f5; } .ant-select-tree .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { background-color: #bae7ff; } .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle { display: inline-block; width: 24px; height: 24px; line-height: 24px; text-align: center; vertical-align: top; } .ant-select-tree .ant-select-tree-node-content-wrapper .ant-select-tree-iconEle:empty { display: none; } .ant-select-tree-unselectable .ant-select-tree-node-content-wrapper:hover { background-color: transparent; } .ant-select-tree-node-content-wrapper { line-height: 24px; -webkit-user-select: none; user-select: none; } .ant-select-tree-node-content-wrapper .ant-tree-drop-indicator { position: absolute; z-index: 1; height: 2px; background-color: #1890ff; border-radius: 1px; pointer-events: none; } .ant-select-tree-node-content-wrapper .ant-tree-drop-indicator::after { position: absolute; top: -3px; left: -6px; width: 8px; height: 8px; background-color: transparent; border: 2px solid #1890ff; border-radius: 50%; content: ""; } .ant-select-tree .ant-select-tree-treenode.drop-container > [draggable] { box-shadow: 0 0 0 2px #1890ff; } .ant-select-tree-show-line .ant-select-tree-indent-unit { position: relative; height: 100%; } .ant-select-tree-show-line .ant-select-tree-indent-unit::before { position: absolute; top: 0; right: 12px; bottom: -4px; border-right: 1px solid #d9d9d9; content: ""; } .ant-select-tree-show-line .ant-select-tree-indent-unit-end::before { display: none; } .ant-select-tree-show-line .ant-select-tree-switcher { background: #fff; } .ant-select-tree-show-line .ant-select-tree-switcher-line-icon { vertical-align: -0.15em; } .ant-select-tree .ant-select-tree-treenode-leaf-last .ant-select-tree-switcher-leaf-line::before { top: auto !important; bottom: auto !important; height: 14px !important; } .ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher_close .ant-select-tree-switcher-icon svg { transform: rotate(90deg); } .ant-tree-select-dropdown-rtl .ant-select-tree .ant-select-tree-switcher-loading-icon { transform: scaleY(-1); } / stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown / / stylelint-disable no-duplicate-selectors / / stylelint-disable / / stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline / .ant-drawer { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000; pointer-events: none; } .ant-drawer-inline { position: absolute; } .ant-drawer-mask { position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: 1000; background: rgba(0, 0, 0, 0.45); pointer-events: auto; } .ant-drawer-content-wrapper { position: absolute; z-index: 1000; width: 100% !important; transition-property: all; transition-duration: 300ms; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } @media (min-width: 768px) { .ant-drawer-content-wrapper { width: 40% !important; } } .ant-drawer-content-wrapper-hidden { display: none; } .ant-drawer-left > .ant-drawer-content-wrapper { top: 0; bottom: 0; left: 0; box-shadow: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05), 12px 0 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-right > .ant-drawer-content-wrapper { top: 0; right: 0; bottom: 0; box-shadow: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05), -12px 0 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-top > .ant-drawer-content-wrapper { top: 0; right: 0; left: 0; box-shadow: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05), 0 12px 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-bottom > .ant-drawer-content-wrapper { right: 0; bottom: 0; left: 0; box-shadow: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05), 0 -12px 48px 16px rgba(0, 0, 0, 0.03); } .ant-drawer-content { width: 100%; height: 100%; overflow: auto; background: #fff; pointer-events: auto; } .ant-drawer-wrapper-body { display: flex; flex-direction: column; width: 100%; height: 100%; } .ant-drawer-header { display: flex; flex: 0 1; align-items: center; padding: 16px 24px; font-size: 16px; line-height: 22px; border-bottom: 1px solid #f0f0f0; } .ant-drawer-header-title { display: flex; flex: 1 1; align-items: center; min-width: 0; min-height: 0; } .ant-drawer-extra { flex: none; } .ant-drawer-close { display: inline-block; margin-right: 12px; color: rgba(0, 0, 0, 0.45); font-weight: 700; font-size: 16px; font-style: normal; line-height: 1; text-align: center; text-transform: none; text-decoration: none; background: transparent; border: 0; outline: 0; cursor: pointer; transition: color 0.3s; text-rendering: auto; } .ant-drawer-close:focus, .ant-drawer-close:hover { color: rgba(0, 0, 0, 0.75); text-decoration: none; } .ant-drawer-title { flex: 1 1; margin: 0; color: rgba(0, 0, 0, 0.85); font-weight: 500; font-size: 16px; line-height: 22px; } .ant-drawer-body { flex: 1 1; min-width: 0; min-height: 0; padding: 24px; overflow: auto; } .ant-drawer-footer { flex-shrink: 0; padding: 10px 16px; border-top: 1px solid #f0f0f0; } .panel-motion-enter-start, .panel-motion-appear-start, .panel-motion-leave-start { transition: none; } .panel-motion-enter-active, .panel-motion-appear-active, .panel-motion-leave-active { transition: all 0.3s; } .ant-drawer-mask-motion-enter-active, .ant-drawer-mask-motion-appear-active, .ant-drawer-mask-motion-leave-active { transition: all 0.3s; } .ant-drawer-mask-motion-enter, .ant-drawer-mask-motion-appear { opacity: 0; } .ant-drawer-mask-motion-enter-active, .ant-drawer-mask-motion-appear-active { opacity: 1; } .ant-drawer-mask-motion-leave { opacity: 1; } .ant-drawer-mask-motion-leave-active { opacity: 0; } .ant-drawer-panel-motion-left-enter-start, .ant-drawer-panel-motion-left-appear-start, .ant-drawer-panel-motion-left-leave-start { transition: none; } .ant-drawer-panel-motion-left-enter-active, .ant-drawer-panel-motion-left-appear-active, .ant-drawer-panel-motion-left-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-left-enter-start, .ant-drawer-panel-motion-left-appear-start { transform: translateX(-100%) !important; } .ant-drawer-panel-motion-left-enter-active, .ant-drawer-panel-motion-left-appear-active { transform: translateX(0); } .ant-drawer-panel-motion-left-leave { transform: translateX(0); } .ant-drawer-panel-motion-left-leave-active { transform: translateX(-100%); } .ant-drawer-panel-motion-right-enter-start, .ant-drawer-panel-motion-right-appear-start, .ant-drawer-panel-motion-right-leave-start { transition: none; } .ant-drawer-panel-motion-right-enter-active, .ant-drawer-panel-motion-right-appear-active, .ant-drawer-panel-motion-right-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-right-enter-start, .ant-drawer-panel-motion-right-appear-start { transform: translateX(100%) !important; } .ant-drawer-panel-motion-right-enter-active, .ant-drawer-panel-motion-right-appear-active { transform: translateX(0); } .ant-drawer-panel-motion-right-leave { transform: translateX(0); } .ant-drawer-panel-motion-right-leave-active { transform: translateX(100%); } .ant-drawer-panel-motion-top-enter-start, .ant-drawer-panel-motion-top-appear-start, .ant-drawer-panel-motion-top-leave-start { transition: none; } .ant-drawer-panel-motion-top-enter-active, .ant-drawer-panel-motion-top-appear-active, .ant-drawer-panel-motion-top-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-top-enter-start, .ant-drawer-panel-motion-top-appear-start { transform: translateY(-100%) !important; } .ant-drawer-panel-motion-top-enter-active, .ant-drawer-panel-motion-top-appear-active { transform: translateY(0); } .ant-drawer-panel-motion-top-leave { transform: translateY(0); } .ant-drawer-panel-motion-top-leave-active { transform: translateY(-100%); } .ant-drawer-panel-motion-bottom-enter-start, .ant-drawer-panel-motion-bottom-appear-start, .ant-drawer-panel-motion-bottom-leave-start { transition: none; } .ant-drawer-panel-motion-bottom-enter-active, .ant-drawer-panel-motion-bottom-appear-active, .ant-drawer-panel-motion-bottom-leave-active { transition: all 0.3s; } .ant-drawer-panel-motion-bottom-enter-start, .ant-drawer-panel-motion-bottom-appear-start { transform: translateY(100%) !important; } .ant-drawer-panel-motion-bottom-enter-active, .ant-drawer-panel-motion-bottom-appear-active { transform: translateY(0); } .ant-drawer-panel-motion-bottom-leave { transform: translateY(0); } .ant-drawer-panel-motion-bottom-leave-active { transform: translateY(100%); } .ant-drawer-rtl { direction: rtl; } .ant-drawer-rtl .ant-drawer-close { margin-right: 0; margin-left: 12px; } / stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown / / stylelint-disable no-duplicate-selectors / / stylelint-disable / / stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline / .ant-table.ant-table-middle { font-size: 14px; } .ant-table.ant-table-middle .ant-table-title, .ant-table.ant-table-middle .ant-table-footer, .ant-table.ant-table-middle .ant-table-thead > tr > th, .ant-table.ant-table-middle .ant-table-tbody > tr > td, .ant-table.ant-table-middle tfoot > tr > th, .ant-table.ant-table-middle tfoot > tr > td { padding: 12px 8px; } .ant-table.ant-table-middle .ant-table-filter-trigger { margin-right: -4px; } .ant-table.ant-table-middle .ant-table-expanded-row-fixed { margin: -12px -8px; } .ant-table.ant-table-middle .ant-table-tbody .ant-table-wrapper:only-child .ant-table { margin: -12px -8px -12px 40px; } .ant-table.ant-table-middle .ant-table-selection-column { padding-inline-start: 2px; } .ant-table.ant-table-small { font-size: 14px; } .ant-table.ant-table-small .ant-table-title, .ant-table.ant-table-small .ant-table-footer, .ant-table.ant-table-small .ant-table-thead > tr > th, .ant-table.ant-table-small .ant-table-tbody > tr > td, .ant-table.ant-table-small tfoot > tr > th, .ant-table.ant-table-small tfoot > tr > td { padding: 8px 8px; } .ant-table.ant-table-small .ant-table-filter-trigger { margin-right: -4px; } .ant-table.ant-table-small .ant-table-expanded-row-fixed { margin: -8px -8px; } .ant-table.ant-table-small .ant-table-tbody .ant-table-wrapper:only-child .ant-table { margin: -8px -8px -8px 40px; } .ant-table.ant-table-small .ant-table-selection-column { padding-inline-start: 2px; } .ant-table.ant-table-bordered > .ant-table-title { border: 1px solid #f0f0f0; border-bottom: 0; } .ant-table.ant-table-bordered > .ant-table-container { border-left: 1px solid #f0f0f0; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table thead tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table thead tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table thead tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table thead tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tbody tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tbody tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tbody tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tbody tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tfoot tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tfoot tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tfoot tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tfoot tr th, .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tfoot tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tfoot tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tfoot tr td, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tfoot tr td { border-right: 1px solid #f0f0f0; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table thead tr:not(:last-child) th, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table thead tr:not(:last-child) th, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table thead tr:not(:last-child) th, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table thead tr:not(:last-child) th { border-bottom: 1px solid #f0f0f0; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table thead tr th::before, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table thead tr th::before, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table thead tr th::before, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table thead tr th::before { background-color: transparent !important; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table thead tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table thead tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table thead tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table thead tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tbody tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tbody tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tbody tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tbody tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tfoot tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tfoot tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tfoot tr .ant-table-cell-fix-right-first::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tfoot tr .ant-table-cell-fix-right-first::after { border-right: 1px solid #f0f0f0; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tbody tr td .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tbody tr td .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tbody tr td .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tbody tr td .ant-table-expanded-row-fixed { margin: -16px -17px; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table tbody tr td .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table tbody tr td .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-body table tbody tr td .ant-table-expanded-row-fixed::after, .ant-table.ant-table-bordered .ant-table-container .ant-table-summary table tbody tr td .ant-table-expanded-row-fixed::after { position: absolute; top: 0; right: 1px; bottom: 0; border-right: 1px solid #f0f0f0; content: ""; } .ant-table.ant-table-bordered .ant-table-container .ant-table-content table, .ant-table.ant-table-bordered .ant-table-container .ant-table-header table { border-top: 1px solid #f0f0f0; } .ant-table.ant-table-bordered.ant-table-scroll-horizontal .ant-table-container .ant-table-body table tbody tr.ant-table-expanded-row td, .ant-table.ant-table-bordered.ant-table-scroll-horizontal .ant-table-container .ant-table-body table tbody tr.ant-table-placeholder td { border-right: 0; } .ant-table.ant-table-bordered.ant-table-middle .ant-table-container .ant-table-content table tbody tr td .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered.ant-table-middle .ant-table-container .ant-table-body table tbody tr td .ant-table-expanded-row-fixed { margin: -12px -9px; } .ant-table.ant-table-bordered.ant-table-small .ant-table-container .ant-table-content table tbody tr td .ant-table-expanded-row-fixed, .ant-table.ant-table-bordered.ant-table-small .ant-table-container .ant-table-body table tbody tr td .ant-table-expanded-row-fixed { margin: -8px -9px; } .ant-table.ant-table-bordered > .ant-table-footer { border: 1px solid #f0f0f0; border-top: 0; } .ant-table-cell .ant-table-container:first-child { border-top: 0; } .ant-table-cell-scrollbar:not([rowspan]) { box-shadow: 0 1px 0 1px #fafafa; } .ant-table-wrapper { clear: both; max-width: 100%; } .ant-table-wrapper::before { display: table; content: ""; } .ant-table-wrapper::after { display: table; clear: both; content: ""; } .ant-table { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; position: relative; font-size: 14px; background: #fff; border-radius: 2px; } .ant-table table { width: 100%; text-align: left; border-radius: 2px 2px 0 0; border-collapse: separate; border-spacing: 0; } .ant-table-thead > tr > th, .ant-table-tbody > tr > td, .ant-table tfoot > tr > th, .ant-table tfoot > tr > td { position: relative; padding: 16px 16px; overflow-wrap: break-word; } .ant-table-cell-ellipsis { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; word-break: keep-all; } .ant-table-cell-ellipsis.ant-table-cell-fix-left-last, .ant-table-cell-ellipsis.ant-table-cell-fix-right-first { overflow: visible; } .ant-table-cell-ellipsis.ant-table-cell-fix-left-last .ant-table-cell-content, .ant-table-cell-ellipsis.ant-table-cell-fix-right-first .ant-table-cell-content { display: block; overflow: hidden; text-overflow: ellipsis; } .ant-table-cell-ellipsis .ant-table-column-title { overflow: hidden; text-overflow: ellipsis; word-break: keep-all; } .ant-table-title { padding: 16px 16px; } .ant-table-footer { padding: 16px 16px; color: rgba(0, 0, 0, 0.85); background: #fafafa; } .ant-table-thead > tr > th { position: relative; color: rgba(0, 0, 0, 0.85); font-weight: 500; text-align: left; background: #fafafa; border-bottom: 1px solid #f0f0f0; transition: background 0.3s ease; } .ant-table-thead > tr > th[colspan]:not([colspan="1"]) { text-align: center; } .ant-table-thead tr th:not(:last-child):not(.ant-table-selection-column):not( .ant-table-row-expand-icon-cell ):not([colspan])::before { position: absolute; top: 50%; right: 0; width: 1px; height: 1.6em; background-color: rgba(0, 0, 0, 0.06); transform: translateY(-50%); transition: background-color 0.3s; content: ""; } .ant-table-thead > tr:not(:last-child) > th[colspan] { border-bottom: 0; } .ant-table-tbody > tr > td { border-bottom: 1px solid #f0f0f0; transition: background 0.3s; } .ant-table-tbody > tr > td > .ant-table-wrapper:only-child .ant-table, .ant-table-tbody tr td .ant-table-expanded-row-fixed .ant-table-wrapper:only-child .ant-table { margin: -16px -16px -16px 32px; } .ant-table-tbody tr td .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td, .ant-table-tbody tr td .ant-table-expanded-row-fixed .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td { border-bottom: 0; } .ant-table-tbody tr td .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td:first-child, .ant-table-tbody tr td .ant-table-expanded-row-fixed .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td:first-child, .ant-table-tbody tr td .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td:last-child, .ant-table-tbody tr td .ant-table-expanded-row-fixed .ant-table-wrapper:only-child .ant-table-tbody tr:last-child td:last-child { border-radius: 0; } .ant-table-tbody > tr.ant-table-row:hover > td, .ant-table-tbody > tr > td.ant-table-cell-row-hover { background: #fafafa; } .ant-table-tbody > tr.ant-table-row-selected > td { background: #e6f7ff; border-color: rgba(0, 0, 0, 0.03); } .ant-table-tbody > tr.ant-table-row-selected:hover > td { background: #dcf4ff; } .ant-table-summary { position: relative; z-index: 2; background: #fff; } div.ant-table-summary { box-shadow: 0 -1px 0 #f0f0f0; } .ant-table-summary > tr > th, .ant-table-summary > tr > td { border-bottom: 1px solid #f0f0f0; } .ant-table-pagination.ant-pagination { margin: 16px 0; } .ant-table-pagination { display: flex; flex-wrap: wrap; row-gap: 8px; } .ant-table-pagination > * { flex: none; } .ant-table-pagination-left { justify-content: flex-start; } .ant-table-pagination-center { justify-content: center; } .ant-table-pagination-right { justify-content: flex-end; } .ant-table-thead th.ant-table-column-has-sorters { outline: none; cursor: pointer; transition: all 0.3s; } .ant-table-thead th.ant-table-column-has-sorters:hover { background: rgba(0, 0, 0, 0.04); } .ant-table-thead th.ant-table-column-has-sorters:hover::before { background-color: transparent !important; } .ant-table-thead th.ant-table-column-has-sorters:focus-visible { color: #1890ff; } .ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-left:hover, .ant-table-thead th.ant-table-column-has-sorters.ant-table-cell-fix-right:hover { background: #f5f5f5; } .ant-table-thead th.ant-table-column-sort { background: #f5f5f5; } .ant-table-thead th.ant-table-column-sort::before { background-color: transparent !important; } td.ant-table-column-sort { background: #fafafa; } .ant-table-column-title { position: relative; z-index: 1; flex: 1 1; } .ant-table-column-sorters { display: flex; flex: auto; align-items: center; justify-content: space-between; } .ant-table-column-sorters::after { position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%; content: ""; } .ant-table-column-sorter { margin-left: 4px; color: #bfbfbf; font-size: 0; transition: color 0.3s; } .ant-table-column-sorter-inner { display: inline-flex; flex-direction: column; align-items: center; } .ant-table-column-sorter-up, .ant-table-column-sorter-down { font-size: 11px; } .ant-table-column-sorter-up.active, .ant-table-column-sorter-down.active { color: #1890ff; } .ant-table-column-sorter-up + .ant-table-column-sorter-down { margin-top: -0.3em; } .ant-table-column-sorters:hover .ant-table-column-sorter { color: #a6a6a6; } .ant-table-filter-column { display: flex; justify-content: space-between; } .ant-table-filter-trigger { position: relative; display: flex; align-items: center; margin: -4px -8px -4px 4px; padding: 0 4px; color: #bfbfbf; font-size: 12px; border-radius: 2px; cursor: pointer; transition: all 0.3s; } .ant-table-filter-trigger:hover { color: rgba(0, 0, 0, 0.45); background: rgba(0, 0, 0, 0.04); } .ant-table-filter-trigger.active { color: #1890ff; } .ant-table-filter-dropdown { box-sizing: border-box; margin: 0; padding: 0; color: rgba(0, 0, 0, 0.85); font-size: 14px; font-variant: tabular-nums; line-height: 1.5715; list-style: none; font-feature-settings: "tnum"; min-width: 120px; background-color: #fff; border-radius: 2px; box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05); } .ant-table-filter-dropdown .ant-dropdown-menu { max-height: 264px; overflow-x: hidden; border: 0; box-shadow: none; } .ant-table-filter-dropdown .ant-dropdown-menu:empty::after { display: block; padding: 8px 0; color: rgba(0, 0, 0, 0.25); font-size: 12px; text-align: center; content: "Not Found"; } .ant-table-filter-dropdown-tree { padding: 8px 8px 0; } .ant-table-filter-dropdown-tree .ant-tree-treenode .ant-tree-node-content-wrapper:hover { background-color: #f5f5f5; } .ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper, .ant-table-filter-dropdown-tree .ant-tree-treenode-checkbox-checked .ant-tree-node-content-wrapper:hover { background-color: #bae7ff; } .ant-table-filter-dropdown-search { padding: 8px; border-bottom: 1px #f0f0f0 solid; } .ant-table-filter-dropdown-search-input input { min-width: 140px; } .ant-table-filter-dropdown-search-input .anticon { color: rgba(0, 0, 0, 0.25); } .ant-table-filter-dropdown-checkall { width: 100%; margin-bottom: 4px; margin-left: 4px; } .ant-table-filter-dropdown-submenu > ul { max-height: calc(100vh - 130px); overflow-x: hidden; overflow-y: auto; } .ant-table-filter-dropdown .ant-checkbox-wrapper + span, .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper + span { padding-left: 8px; } .ant-table-filter-dropdown-btns { display: flex; justify-content: space-between; padding: 7px 8px; overflow: hidden; background-color: inherit; border-top: 1px solid #f0f0f0; } .ant-table-selection-col { width: 32px; } .ant-table-bordered .ant-table-selection-col { width: 50px; } table tr th.ant-table-selection-column, table tr td.ant-table-selection-column { padding-right: 8px; padding-left: 8px; text-align: center; } table tr th.ant-table-selection-column .ant-radio-wrapper, table tr td.ant-table-selection-column .ant-radio-wrapper { margin-right: 0; } table tr th.ant-table-selection-column.ant-table-cell-fix-left { z-index: 3; } table tr th.ant-table-selection-column::after { background-color: transparent !important; } .ant-table-selection { position: relative; display: inline-flex; flex-direction: column; } .ant-table-selection-extra { position: absolute; top: 0; z-index: 1; cursor: pointer; transition: all 0.3s; margin-inline-start: 100%; padding-inline-start: 4px; } .ant-table-selection-extra .anticon { color: #bfbfbf; font-size: 10px; } .ant-table-selection-extra .anticon:hover { color: #a6a6a6; } .ant-table-expand-icon-col { width: 48px; } .ant-table-row-expand-icon-cell { text-align: center; } .ant-table-row-expand-icon-cell .ant-table-row-expand-icon { display: inline-flex; float: none; vertical-align: sub; } .ant-table-row-indent { float: left; height: 1px; } .ant-table-row-expand-icon { color: #1890ff; outline: none; cursor: pointer; transition: color 0.3s; position: relative; float: left; box-sizing: border-box; width: 17px; height: 17px; padding: 0; color: inherit; line-height: 17px; background: #fff; border: 1px solid #f0f0f0; border-radius: 2px; transform: scale(0.94117647); transition: all 0.3s; -webkit-user-select: none; user-select: none; } .ant-table-row-expand-icon:focus-visible, .ant-table-row-expand-icon:hover { color: #40a9ff; } .ant-table-row-expand-icon:active { color: #096dd9; } .ant-table-row-expand-icon:focus, .ant-table-row-expand-icon:hover, .ant-table-row-expand-icon:active { border-color: currentcolor; } .ant-table-row-expand-icon::before, .ant-table-row-expand-icon::after { position: absolute; background: currentcolor; transition: transform 0.3s ease-out; content: ""; } .ant-table-row-expand-icon::before { top: 7px; right: 3px; left: 3px; height: 1px; } .ant-table-row-expand-icon::after { top: 3px; bottom: 3px; left: 7px; width: 1px; transform: rotate(90deg); } .ant-table-row-expand-icon-collapsed::before { transform: rotate(-180deg); } .ant-table-row-expand-icon-collapsed::after { transform: rotate(0deg); } .ant-table-row-expand-icon-spaced { background: transparent; border: 0; visibility: hidden; } .ant-table-row-expand-icon-spaced::before, .ant-table-row-expand-icon-spaced::after { display: none; content: none; } .ant-table-row-indent + .ant-table-row-expand-icon { margin-top: 2.5005px; margin-right: 8px; } tr.ant-table-expanded-row > td, tr.ant-table-expanded-row:hover > td { background: #fbfbfb; } tr.ant-table-expanded-row .ant-descriptions-view { display: flex; } tr.ant-table-expanded-row .ant-descriptions-view table { flex: auto; width: auto; } .ant-table .ant-table-expanded-row-fixed { position: relative; margin: -16px -16px; padding: 16px 16px; } .ant-table-tbody > tr.ant-table-placeholder { text-align: center; } .ant-table-empty .ant-table-tbody > tr.ant-table-placeholder { color: rgba(0, 0, 0, 0.25); } .ant-table-tbody > tr.ant-table-placeholder:hover > td { background: #fff; } .ant-table-cell-fix-left, .ant-table-cell-fix-right { position: sticky !important; z-index: 2; background: #fff; } .ant-table-cell-fix-left-first::after, .ant-table-cell-fix-left-last::after { position: absolute; top: 0; right: 0; bottom: -1px; width: 30px; transform: translateX(100%); transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table-cell-fix-left-all::after { display: none; } .ant-table-cell-fix-right-first::after, .ant-table-cell-fix-right-last::after { position: absolute; top: 0; bottom: -1px; left: 0; width: 30px; transform: translateX(-100%); transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table .ant-table-container::before, .ant-table .ant-table-container::after { position: absolute; top: 0; bottom: 0; z-index: calc(calc(2 + 1) + 1); width: 30px; transition: box-shadow 0.3s; content: ""; pointer-events: none; } .ant-table .ant-table-container::before { left: 0; } .ant-table .ant-table-container::after { right: 0; } .ant-table-ping-left:not(.ant-table-has-fix-left) > .ant-table-container { position: relative; } .ant-table-ping-left:not(.ant-table-has-fix-left) .ant-table-container::before { box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-left .ant-table-cell-fix-left-first::after, .ant-table-ping-left .ant-table-cell-fix-left-last::after { box-shadow: inset 10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-left .ant-table-cell-fix-left-last::before { background-color: transparent !important; } .ant-table-ping-right:not(.ant-table-has-fix-right) > .ant-table-container { position: relative; } .ant-table-ping-right:not(.ant-table-has-fix-right) .ant-table-container::after { box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-ping-right .ant-table-cell-fix-right-first::after, .ant-table-ping-right .ant-table-cell-fix-right-last::after { box-shadow: inset -10px 0 8px -8px rgba(0, 0, 0, 0.15); } .ant-table-sticky-holder { position: sticky; z-index: calc(2 + 1); background: #fff; } .ant-table-sticky-scroll { position: sticky; bottom: 0; z-index: calc(2 + 1); display: flex; align-items: center; background: #ffffff; border-top: 1px solid #f0f0f0; opacity: 0.6; } .ant-table-sticky-scroll:hover { transform-origin: center bottom; } .ant-table-sticky-scroll-bar { height: 8px; background-color: rgba(0, 0, 0, 0.35); border-radius: 4px; } .ant-table-sticky-scroll-bar:hover { background-color: rgba(0, 0, 0, 0.8); } .ant-table-sticky-scroll-bar-active { background-color: rgba(0, 0, 0, 0.8); } @media all and (-ms-high-contrast: none) { .ant-table-ping-left .ant-table-cell-fix-left-last::after { box-shadow: none !important; } .ant-table-ping-right .ant-table-cell-fix-right-first::after { box-shadow: none !important; } } .ant-table { / title + table / / table / / table + footer */ } .ant-table-title { border-radius: 2px 2px 0 0; } .ant-table-title + .ant-table-container { border-top-left-radius: 0; border-top-right-radius: 0; } .ant-table-title + .ant-table-container table { border-radius: 0; } .ant-table-title

  • .ant-table-container table

    thead tr:first-child th:first-child { border-radius: 0; } .ant-table-title

  • .ant-table-container table

    thead tr:first-child th:last-child { border-radius: 0; } .ant-table-container { border-top-left-radius: 2px; border-top-right-radius: 2px; } .ant-table-container table > thead > tr:first-child th:first-child { border-top-left-radius: 2px; } .ant-table-container table > thead > tr:first-child th:last-child { border-top-right-radius: 2px; } .ant-table-footer { border-radius: 0 0 2px 2px; } .ant-table-wrapper-rtl { direction: rtl; } .ant-table-rtl { direction: rtl; } .ant-table-wrapper-rtl .ant-table table { text-align: right; } .ant-table-wrapper-rtl .ant-table-thead > tr > th[colspan]:not([colspan="1"]) { text-align: center; } .ant-table-wrapper-rtl .ant-table-thead tr th:not(:last-child):not(.ant-table-selection-column):not( .ant-table-row-expand-icon-cell ):not([colspan])::before { right: auto; left: 0; } .ant-table-wrapper-rtl .ant-table-thead > tr > th { text-align: right; } .ant-table-tbody > tr .ant-table-wrapper:only-child .ant-table.ant-table-rtl { margin: -16px 33px -16px -16px; } .ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-left { justify-content: flex-end; } .ant-table-wrapper.ant-table-wrapper-rtl .ant-table-pagination-right { justify-content: flex-start; } .ant-table-wrapper-rtl .ant-table-column-sorter { margin-right: 4px; margin-left: 0; } .ant-table-wrapper-rtl .ant-table-filter-column-title { padding: 16px 16px 16px 2.3em; } .ant-table-rtl .ant-table-thead tr th.ant-table-column-has-sorters .ant-table-filter-column-title { padding: 0 0 0 2.3em; } .ant-table-wrapper-rtl .ant-table-filter-trigger { margin: -4px 4px -4px -8px; } .ant-dropdown-rtl .ant-table-filter-dropdown .ant-checkbox-wrapper + span, .ant-dropdown-rtl .ant-table-filter-dropdown-submenu .ant-checkbox-wrapper

  • span, .ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown .ant-checkbox-wrapper
  • span, .ant-dropdown-menu-submenu-rtl.ant-table-filter-dropdown-submenu .ant-checkbox-wrapper
  • span { padding-right: 8px; padding-left: 0; } .ant-table-wrapper-rtl .ant-table-selection { text-align: center; } .ant-table-wrapper-rtl .ant-table-row-indent { float: right; } .ant-table-wrapper-rtl .ant-table-row-expand-icon { float: right; } .ant-table-wrapper-rtl .ant-table-row-indent + .ant-table-row-expand-icon { margin-right: 0; margin-left: 8px; } .ant-table-wrapper-rtl .ant-table-row-expand-icon::after { transform: rotate(-90deg); } .ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::before { transform: rotate(180deg); } .ant-table-wrapper-rtl .ant-table-row-expand-icon-collapsed::after { transform: rotate(0deg); } /* highlight.js / .hljs-string, .hljs-doctag, .hljs-regexp { --tw-text-opacity: 1; color: rgb(47 152 174 / var(--tw-text-opacity)); } / react-json-view / .react-json-view { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; } / recharts / .recharts-cartesian-axis-tick-value { fill: #727272; font-family: inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 12px; line-height: 16px; --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } / ! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com / /
  1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
  2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) */ , ::before, ::after { box-sizing: border-box; / 1 / border-width: 0; / 2 / border-style: solid; / 2 / border-color: #C5C4BF; / 2 / } ::before, ::after { --tw-content: ''; } /
  3. Use a consistent sensible line-height in all browsers.
  4. Prevent adjustments of font size after orientation changes in iOS.
  5. Use a more readable tab size.
  6. Use the user's configured sans font-family by default.
  7. Use the user's configured sans font-feature-settings by default.
  8. Use the user's configured sans font-variation-settings by default.
  9. Disable tap highlights on iOS / html, :host { line-height: 1.5; / 1 / -webkit-text-size-adjust: 100%; / 2 / / 3 / tab-size: 4; / 3 / font-family: inter, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; / 4 / font-feature-settings: normal; / 5 / font-variation-settings: normal; / 6 / -webkit-tap-highlight-color: transparent; / 7 / } /
  10. Remove the margin in all browsers.
  11. Inherit line-height from html so users can set them as a class directly on the html element. / body { margin: 0; / 1 / line-height: inherit; / 2 / } /
  12. Add the correct height in Firefox.
  13. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
  14. Ensure horizontal rules are visible by default. / hr { height: 0; / 1 / color: inherit; / 2 / border-top-width: 1px; / 3 / } / Add the correct text decoration in Chrome, Edge, and Safari. */ abbr:where([title]) { -webkit-text-decoration: underline dotted; text-decoration: underline dotted;

} /* Remove the default font size and weight for headings. / h1, h2, h3, h4, h5, h6 { font-size: inherit; font-weight: inherit; } / Reset links to optimize for opt-in styling instead of opt-out. / a { color: inherit; text-decoration: inherit; } / Add the correct font weight in Edge and Safari. / b, strong { font-weight: bolder; } /

  1. Use the user's configured mono font-family by default.
  2. Use the user's configured mono font-feature-settings by default.
  3. Use the user's configured mono font-variation-settings by default.
  4. Correct the odd em font sizing in all browsers. / code, kbd, samp, pre { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; / 1 / font-feature-settings: normal; / 2 / font-variation-settings: normal; / 3 / font-size: 1em; / 4 / } / Add the correct font size in all browsers. / small { font-size: 80%; } / Prevent sub and sup elements from affecting the line height in all browsers. / sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /
  5. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
  6. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
  7. Remove gaps between table borders by default. / table { text-indent: 0; / 1 / border-color: inherit; / 2 / border-collapse: collapse; / 3 / } /
  8. Change the font styles in all browsers.
  9. Remove the margin in Firefox and Safari.
  10. Remove default padding in all browsers. / button, input, optgroup, select, textarea { font-family: inherit; / 1 / font-feature-settings: inherit; / 1 / font-variation-settings: inherit; / 1 / font-size: 100%; / 1 / font-weight: inherit; / 1 / line-height: inherit; / 1 / color: inherit; / 1 / margin: 0; / 2 / padding: 0; / 3 / } / Remove the inheritance of text transform in Edge and Firefox. / button, select { text-transform: none; } /
  11. Correct the inability to style clickable types in iOS and Safari.
  12. Remove default button styles. / button, [type='button'], [type='reset'], [type='submit'] { -webkit-appearance: button; / 1 / background-color: transparent; / 2 / background-image: none; / 2 / } / Use the modern Firefox focus style for all focusable elements. / :-moz-focusring { outline: auto; } / Remove the additional :invalid styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) / :-moz-ui-invalid { box-shadow: none; } / Add the correct vertical alignment in Chrome and Firefox. / progress { vertical-align: baseline; } / Correct the cursor style of increment and decrement buttons in Safari. / ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { height: auto; } /
  13. Correct the odd appearance in Chrome and Safari.
  14. Correct the outline style in Safari. / [type='search'] { -webkit-appearance: textfield; / 1 / outline-offset: -2px; / 2 / } / Remove the inner padding in Chrome and Safari on macOS. / ::-webkit-search-decoration { -webkit-appearance: none; } /
  15. Correct the inability to style clickable types in iOS and Safari.
  16. Change font properties to inherit in Safari. / ::-webkit-file-upload-button { -webkit-appearance: button; / 1 / font: inherit; / 2 / } / Add the correct display in Chrome and Safari. / summary { display: list-item; } / Removes the default spacing and border for appropriate elements. / blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre { margin: 0; } fieldset { margin: 0; padding: 0; } legend { padding: 0; } ol, ul, menu { list-style: none; margin: 0; padding: 0; } / Reset default styling for dialogs. / dialog { padding: 0; } / Prevent resizing textareas horizontally by default. / textarea { resize: vertical; } /
  17. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
  18. Set the default placeholder color to the user's configured gray 400 color. / input::placeholder, textarea::placeholder { opacity: 1; / 1 / color: #8A8985; / 2 / } / Set the default cursor for buttons. / button, [role="button"] { cursor: pointer; } / Make sure disabled buttons don't get the pointer cursor. / :disabled { cursor: default; } /
  19. Make replaced elements display: block by default. (https://github.com/mozdevs/cssremedy/issues/14)
  20. Add vertical-align: middle to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) This can trigger a poorly considered lint error in some tools but is included by design. / img, svg, video, canvas, audio, iframe, embed, object { display: block; / 1 / vertical-align: middle; / 2 / } / Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) / img, video { max-width: 100%; height: auto; } / Make elements with the HTML hidden attribute stay hidden by default */ [hidden] { display: none; } svg{display:initial !important} *, ::before, ::after { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(56 111 177 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; } ::backdrop { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(56 111 177 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; } .container { width: 100%; } @media (min-width: 640px) { .container { max-width: 640px; } } @media (min-width: 768px) { .container { max-width: 768px; } } @media (min-width: 1024px) { .container { max-width: 1024px; } } @media (min-width: 1280px) { .container { max-width: 1280px; } } @media (min-width: 1536px) { .container { max-width: 1536px; } } :root { --background-default: #FFFFFF; --background-light: #F7F7F6; --background-dark: #303030; --button-background-default: #FFFFFF; --button-background-default-hover: #F7F7F6; --button-background-default-pressed: #F2F1ED; --button-background-primary: #386FB1; --button-background-primary-hover: #2C588F; --button-background-primary-pressed: #204571; --button-background-disabled: #F2F7FF; --surface-info: #FFF5EA; --surface-critical: #FFF4F6; --surface-success: #F0F8F5; --border-default: #DEDDD7; --border-muted: #F2F1ED; --border-strong: #C5C4BF; --text-default: #303030; --text-hover: #727272; --text-muted: #575757; --text-disabled: #444444; --text-critical: #C73D4F; --text-success: #008060; --text-info: #BF4E36; --text-on-primary: #FFFFFF; --text-on-critical: #FFFFFF; --icon-default: #444444; --icon-strong: #222222; --icon-muted: #444444; --icon-disabled: #727272; --icon-critical: #C73D4F; --icon-success: #008060; --icon-info: #BF4E36; --icon-on-primary: #FFFFFF; --icon-on-critical: #FFFFFF; --action-primary: #008060; --action-primary-hover: #006452; --action-primary-pressed: #00473C; --action-primary-disabled: #F0F8F5; --action-critical: #C73D4F; --action-critical-hover: #9F2946; --action-critical-pressed: #7C1B3D; --action-critical-disabled: #FFF4F6; --action-default: #FFFFFF; --action-default-hover: #F2F1ED; --action-default-pressed: #DEDDD7; --action-default-disabled: #F7F7F6; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .!pointer-events-none { pointer-events: none !important; } .pointer-events-none { pointer-events: none; } .pointer-events-auto { pointer-events: auto; } .!visible { visibility: visible !important; } .visible { visibility: visible; } .invisible { visibility: hidden; } .collapse { visibility: collapse; } .static { position: static; } .fixed { position: fixed; } .absolute { position: absolute; } .relative { position: relative; } .sticky { position: sticky; } .inset-0 { inset: 0px; } .inset-x-0 { left: 0px; right: 0px; } .-left-0 { left: -0px; } .-left-0.5 { left: -0.125rem; } .-top-0 { top: -0px; } .-top-0.5 { top: -0.125rem; } .-top-10 { top: -2.5rem; } .bottom-0 { bottom: 0px; } .bottom-10 { bottom: 2.5rem; } .bottom-6 { bottom: 1.5rem; } .bottom-8 { bottom: 2rem; } .bottom-[27px] { bottom: 27px; } .bottom-full { bottom: 100%; } .bottom-px { bottom: 1px; } .left-0 { left: 0px; } .left-1/2 { left: 50%; } .left-auto { left: auto; } .right-0 { right: 0px; } .right-12 { right: 3rem; } .right-20 { right: 5rem; } .right-5 { right: 1.25rem; } .right-6 { right: 1.5rem; } .right-[72px] { right: 72px; } .right-px { right: 1px; } .top-0 { top: 0px; } .top-4 { top: 1rem; } .top-5 { top: 1.25rem; } .top-6 { top: 1.5rem; } .top-8 { top: 2rem; } .top-px { top: 1px; } .z-0 { z-index: 0; } .z-10 { z-index: 10; } .z-20 { z-index: 20; } .z-40 { z-index: 40; } .z-50 { z-index: 50; } .z-auto { z-index: auto; } .order-1 { order: 1; } .order-2 { order: 2; } .col-span-1 { grid-column: span 1 / span 1; } .col-span-10 { grid-column: span 10 / span 10; } .col-span-12 { grid-column: span 12 / span 12; } .col-span-2 { grid-column: span 2 / span 2; } .col-span-3 { grid-column: span 3 / span 3; } .col-span-4 { grid-column: span 4 / span 4; } .col-span-5 { grid-column: span 5 / span 5; } .col-span-7 { grid-column: span 7 / span 7; } .col-span-full { grid-column: 1 / -1; } .col-start-1 { grid-column-start: 1; } .col-start-10 { grid-column-start: 10; } .col-start-12 { grid-column-start: 12; } .col-start-3 { grid-column-start: 3; } .col-start-4 { grid-column-start: 4; } .col-start-5 { grid-column-start: 5; } .col-start-7 { grid-column-start: 7; } .row-start-5 { grid-row-start: 5; } .float-end { float: inline-end; } .float-right { float: right; } .float-left { float: left; } .-m-0 { margin: -0px; } .-m-0.5 { margin: -0.125rem; } .m-0 { margin: 0px; } .m-1 { margin: 0.25rem; } .m-2 { margin: 0.5rem; } .m-3 { margin: 0.75rem; } .m-4 { margin: 1rem; } .m-5 { margin: 1.25rem; } .m-8 { margin: 2rem; } .m-auto { margin: auto; } .-mx-10 { margin-left: -2.5rem; margin-right: -2.5rem; } .-mx-2 { margin-left: -0.5rem; margin-right: -0.5rem; } .-mx-3 { margin-left: -0.75rem; margin-right: -0.75rem; } .-mx-3.5 { margin-left: -0.875rem; margin-right: -0.875rem; } .-my-2 { margin-top: -0.5rem; margin-bottom: -0.5rem; } .-my-3 { margin-top: -0.75rem; margin-bottom: -0.75rem; } .mx-1 { margin-left: 0.25rem; margin-right: 0.25rem; } .mx-10 { margin-left: 2.5rem; margin-right: 2.5rem; } .mx-2 { margin-left: 0.5rem; margin-right: 0.5rem; } .mx-20 { margin-left: 5rem; margin-right: 5rem; } .mx-3 { margin-left: 0.75rem; margin-right: 0.75rem; } .mx-4 { margin-left: 1rem; margin-right: 1rem; } .mx-40 { margin-left: 10rem; margin-right: 10rem; } .mx-5 { margin-left: 1.25rem; margin-right: 1.25rem; } .mx-6 { margin-left: 1.5rem; margin-right: 1.5rem; } .mx-8 { margin-left: 2rem; margin-right: 2rem; } .mx-auto { margin-left: auto; margin-right: auto; } .my-0 { margin-top: 0px; margin-bottom: 0px; } .my-0.5 { margin-top: 0.125rem; margin-bottom: 0.125rem; } .my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; } .my-10 { margin-top: 2.5rem; margin-bottom: 2.5rem; } .my-12 { margin-top: 3rem; margin-bottom: 3rem; } .my-2 { margin-top: 0.5rem; margin-bottom: 0.5rem; } .my-3 { margin-top: 0.75rem; margin-bottom: 0.75rem; } .my-4 { margin-top: 1rem; margin-bottom: 1rem; } .my-5 { margin-top: 1.25rem; margin-bottom: 1.25rem; } .my-6 { margin-top: 1.5rem; margin-bottom: 1.5rem; } .my-8 { margin-top: 2rem; margin-bottom: 2rem; } .my-auto { margin-top: auto; margin-bottom: auto; } .my-xs { margin-top: 4px; margin-bottom: 4px; } .!mb-0 { margin-bottom: 0px !important; } .!mt-1 { margin-top: 0.25rem !important; } .-mb-1 { margin-bottom: -0.25rem; } .-mb-2 { margin-bottom: -0.5rem; } .-mb-3 { margin-bottom: -0.75rem; } .-mb-4 { margin-bottom: -1rem; } .-mb-px { margin-bottom: -1px; } .-ml-2 { margin-left: -0.5rem; } .-ml-2.5 { margin-left: -0.625rem; } .-ml-3 { margin-left: -0.75rem; } .-ml-4 { margin-left: -1rem; } .-mr-2 { margin-right: -0.5rem; } .-mr-2.5 { margin-right: -0.625rem; } .-mt-1 { margin-top: -0.25rem; } .-mt-1.5 { margin-top: -0.375rem; } .-mt-10 { margin-top: -2.5rem; } .-mt-2 { margin-top: -0.5rem; } .-mt-3 { margin-top: -0.75rem; } .-mt-4 { margin-top: -1rem; } .-mt-6 { margin-top: -1.5rem; } .-mt-[50px] { margin-top: -50px; } .-mt-px { margin-top: -1px; } .mb-0 { margin-bottom: 0px; } .mb-1 { margin-bottom: 0.25rem; } .mb-10 { margin-bottom: 2.5rem; } .mb-11 { margin-bottom: 2.75rem; } .mb-16 { margin-bottom: 4rem; } .mb-2 { margin-bottom: 0.5rem; } .mb-3 { margin-bottom: 0.75rem; } .mb-4 { margin-bottom: 1rem; } .mb-5 { margin-bottom: 1.25rem; } .mb-6 { margin-bottom: 1.5rem; } .mb-7 { margin-bottom: 1.75rem; } .mb-8 { margin-bottom: 2rem; } .mb-9 { margin-bottom: 2.25rem; } .mb-px { margin-bottom: 1px; } .ml-1 { margin-left: 0.25rem; } .ml-1.5 { margin-left: 0.375rem; } .ml-12 { margin-left: 3rem; } .ml-2 { margin-left: 0.5rem; } .ml-2.5 { margin-left: 0.625rem; } .ml-20 { margin-left: 5rem; } .ml-24 { margin-left: 6rem; } .ml-28 { margin-left: 7rem; } .ml-3 { margin-left: 0.75rem; } .ml-4 { margin-left: 1rem; } .ml-5 { margin-left: 1.25rem; } .ml-6 { margin-left: 1.5rem; } .ml-7 { margin-left: 1.75rem; } .ml-8 { margin-left: 2rem; } .ml-9 { margin-left: 2.25rem; } .ml-[120px] { margin-left: 120px; } .ml-[72px] { margin-left: 72px; } .ml-auto { margin-left: auto; } .mr-0 { margin-right: 0px; } .mr-0.5 { margin-right: 0.125rem; } .mr-1 { margin-right: 0.25rem; } .mr-16 { margin-right: 4rem; } .mr-2 { margin-right: 0.5rem; } .mr-2.5 { margin-right: 0.625rem; } .mr-3 { margin-right: 0.75rem; } .mr-4 { margin-right: 1rem; } .mr-6 { margin-right: 1.5rem; } .mr-[1px] { margin-right: 1px; } .mt-0 { margin-top: 0px; } .mt-0.5 { margin-top: 0.125rem; } .mt-1 { margin-top: 0.25rem; } .mt-1.5 { margin-top: 0.375rem; } .mt-10 { margin-top: 2.5rem; } .mt-12 { margin-top: 3rem; } .mt-14 { margin-top: 3.5rem; } .mt-2 { margin-top: 0.5rem; } .mt-3 { margin-top: 0.75rem; } .mt-4 { margin-top: 1rem; } .mt-5 { margin-top: 1.25rem; } .mt-6 { margin-top: 1.5rem; } .mt-8 { margin-top: 2rem; } .mt-9 { margin-top: 2.25rem; } .box-border { box-sizing: border-box; } .block { display: block; } .inline-block { display: inline-block; } .inline { display: inline; } .flex { display: flex; } .inline-flex { display: inline-flex; } .table { display: table; } .table-cell { display: table-cell; } .grid { display: grid; } .contents { display: contents; } .hidden { display: none; } .aspect-video { aspect-ratio: 16 / 9; } .!h-3 { height: 0.75rem !important; } .!h-auto { height: auto !important; } .h-0 { height: 0px; } .h-0.5 { height: 0.125rem; } .h-1 { height: 0.25rem; } .h-1.5 { height: 0.375rem; } .h-1/2 { height: 50%; } .h-10 { height: 2.5rem; } .h-11 { height: 2.75rem; } .h-12 { height: 3rem; } .h-16 { height: 4rem; } .h-2 { height: 0.5rem; } .h-2.5 { height: 0.625rem; } .h-2/3 { height: 66.666667%; } .h-2/5 { height: 40%; } .h-20 { height: 5rem; } .h-24 { height: 6rem; } .h-28 { height: 7rem; } .h-3 { height: 0.75rem; } .h-3/5 { height: 60%; } .h-32 { height: 8rem; } .h-36 { height: 9rem; } .h-4 { height: 1rem; } .h-4/5 { height: 80%; } .h-40 { height: 10rem; } .h-44 { height: 11rem; } .h-48 { height: 12rem; } .h-5 { height: 1.25rem; } .h-52 { height: 13rem; } .h-56 { height: 14rem; } .h-6 { height: 1.5rem; } .h-64 { height: 16rem; } .h-7 { height: 1.75rem; } .h-72 { height: 18rem; } .h-8 { height: 2rem; } .h-80 { height: 20rem; } .h-9 { height: 2.25rem; } .h-96 { height: 24rem; } .h-[24px] { height: 24px; } .h-[35px] { height: 35px; } .h-[450px] { height: 450px; } .h-[480px] { height: 480px; } .h-[590px] { height: 590px; } .h-[630px] { height: 630px; } .h-[648px] { height: 648px; } .h-[720px] { height: 720px; } .h-auto { height: auto; } .h-fit { height: -moz-fit-content; height: fit-content; } .h-full { height: 100%; } .h-px { height: 1px; } .h-screen { height: 100vh; } .max-h-16 { max-height: 4rem; } .max-h-24 { max-height: 6rem; } .max-h-60 { max-height: 15rem; } .max-h-64 { max-height: 16rem; } .max-h-80 { max-height: 20rem; } .max-h-96 { max-height: 24rem; } .max-h-[353px] { max-height: 353px; } .max-h-[384px] { max-height: 384px; } .max-h-[405px] { max-height: 405px; } .max-h-[600px] { max-height: 600px; } .max-h-[692px] { max-height: 692px; } .max-h-fit { max-height: -moz-fit-content; max-height: fit-content; } .max-h-screen { max-height: 100vh; } .min-h-16 { min-height: 4rem; } .min-h-20 { min-height: 5rem; } .min-h-32 { min-height: 8rem; } .min-h-52 { min-height: 13rem; } .min-h-64 { min-height: 16rem; } .min-h-8 { min-height: 2rem; } .min-h-80 { min-height: 20rem; } .min-h-96 { min-height: 24rem; } .min-h-[188px] { min-height: 188px; } .min-h-[350px] { min-height: 350px; } .min-h-[435px] { min-height: 435px; } .min-h-[600px] { min-height: 600px; } .min-h-max { min-height: max-content; } .min-h-screen { min-height: 100vh; } .w-1 { width: 0.25rem; } .w-1.5 { width: 0.375rem; } .w-1/12 { width: 8.333333%; } .w-1/2 { width: 50%; } .w-1/3 { width: 33.333333%; } .w-1/4 { width: 25%; } .w-1/5 { width: 20%; } .w-1/6 { width: 16.666667%; } .w-10 { width: 2.5rem; } .w-11/12 { width: 91.666667%; } .w-12 { width: 3rem; } .w-14 { width: 3.5rem; } .w-16 { width: 4rem; } .w-192 { width: 48rem; } .w-2 { width: 0.5rem; } .w-2.5 { width: 0.625rem; } .w-2/3 { width: 66.666667%; } .w-20 { width: 5rem; } .w-24 { width: 6rem; } .w-28 { width: 7rem; } .w-3 { width: 0.75rem; } .w-3/4 { width: 75%; } .w-32 { width: 8rem; } .w-36 { width: 9rem; } .w-4 { width: 1rem; } .w-40 { width: 10rem; } .w-44 { width: 11rem; } .w-48 { width: 12rem; } .w-5 { width: 1.25rem; } .w-52 { width: 13rem; } .w-56 { width: 14rem; } .w-6 { width: 1.5rem; } .w-6/12 { width: 50%; } .w-60 { width: 15rem; } .w-64 { width: 16rem; } .w-7 { width: 1.75rem; } .w-72 { width: 18rem; } .w-8 { width: 2rem; } .w-80 { width: 20rem; } .w-9 { width: 2.25rem; } .w-9/12 { width: 75%; } .w-96 { width: 24rem; } .w-[10%] { width: 10%; } .w-[15%] { width: 15%; } .w-[20%] { width: 20%; } .w-[30px] { width: 30px; } .w-[35px] { width: 35px; } .w-[36rem] { width: 36rem; } .w-[420px] { width: 420px; } .w-[50%] { width: 50%; } .w-auto { width: auto; } .w-default { width: 16px; } .w-fit { width: -moz-fit-content; width: fit-content; } .w-full { width: 100%; } .w-l { width: 32px; } .w-m { width: 16px; } .w-max { width: max-content; } .w-min { width: min-content; } .w-px { width: 1px; } .w-s { width: 8px; } .w-screen { width: 100vw; } .w-xl { width: 64px; } .w-xs { width: 4px; } .w-xxs { width: 2px; } .!min-w-0 { min-width: 0px !important; } .!min-w-[130px] { min-width: 130px !important; } .min-w-4xs { min-width: 8rem; } .min-w-60 { min-width: 15rem; } .min-w-[1rem] { min-width: 1rem; } .min-w-[207px] { min-width: 207px; } .min-w-[300px] { min-width: 300px; } .min-w-[500px] { min-width: 500px; } .min-w-[96px] { min-width: 96px; } .min-w-fit { min-width: -moz-fit-content; min-width: fit-content; } .!max-w-[200px] { max-width: 200px !important; } .max-w-24/25 { max-width: 96%; } .max-w-2xl { max-width: 42rem; } .max-w-2xs { max-width: 16rem; } .max-w-3xl { max-width: 48rem; } .max-w-3xs { max-width: 12rem; } .max-w-4xl { max-width: 56rem; } .max-w-60 { max-width: 15rem; } .max-w-[1130px] { max-width: 1130px; } .max-w-[1176px] { max-width: 1176px; } .max-w-[1600px] { max-width: 1600px; } .max-w-[172px] { max-width: 172px; } .max-w-[200px] { max-width: 200px; } .max-w-[40ch] { max-width: 40ch; } .max-w-[420px] { max-width: 420px; } .max-w-[480px] { max-width: 480px; } .max-w-[540px] { max-width: 540px; } .max-w-[586px] { max-width: 586px; } .max-w-[60%] { max-width: 60%; } .max-w-[600px] { max-width: 600px; } .max-w-[670px] { max-width: 670px; } .max-w-[75px] { max-width: 75px; } .max-w-[780px] { max-width: 780px; } .max-w-[860px] { max-width: 860px; } .max-w-[863px] { max-width: 863px; } .max-w-full { max-width: 100%; } .max-w-lg { max-width: 32rem; } .max-w-max { max-width: max-content; } .max-w-md { max-width: 28rem; } .max-w-sm { max-width: 24rem; } .max-w-xl { max-width: 36rem; } .max-w-xs { max-width: 20rem; } .flex-1 { flex: 1 1; } .flex-initial { flex: 0 1 auto; } .flex-none { flex: none; } .flex-shrink-0 { flex-shrink: 0; } .!shrink-0 { flex-shrink: 0 !important; } .shrink { flex-shrink: 1; } .shrink-0 { flex-shrink: 0; } .flex-grow { flex-grow: 1; } .flex-grow-0 { flex-grow: 0; } .grow { flex-grow: 1; } .grow-0 { flex-grow: 0; } .basis-0 { flex-basis: 0px; } .basis-1/3 { flex-basis: 33.333333%; } .basis-2/3 { flex-basis: 66.666667%; } .basis-4 { flex-basis: 1rem; } .basis-[16px] { flex-basis: 16px; } .table-fixed { table-layout: fixed; } .-translate-x-1/2 { --tw-translate-x: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .rotate-180 { --tw-rotate: 180deg; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .rotate-[270deg] { --tw-rotate: 270deg; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .scale-100 { --tw-scale-x: 1; --tw-scale-y: 1; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .scale-95 { --tw-scale-x: .95; --tw-scale-y: .95; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .transform { transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } @keyframes pulse { 50% { opacity: .5; } } .animate-pulse { animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } .!cursor-not-allowed { cursor: not-allowed !important; } .cursor-default { cursor: default; } .cursor-not-allowed { cursor: not-allowed; } .cursor-pointer { cursor: pointer; } .select-none { -webkit-user-select: none; user-select: none;

} .resize { resize: both; } .list-inside { list-style-position: inside; } .list-disc { list-style-type: disc; } .appearance-none { -webkit-appearance: none; appearance: none; } .grid-flow-row { grid-auto-flow: row; } .grid-flow-col { grid-auto-flow: column; } .grid-flow-row-dense { grid-auto-flow: row dense; } .auto-rows-fr { grid-auto-rows: minmax(0, 1fr); } .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } .grid-cols-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } .grid-cols-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } .grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } .grid-cols-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } .grid-cols-[1fr\2c 1fr] { grid-template-columns: 1fr 1fr; } .grid-cols-[1fr\2c minmax(0\2c 2fr)] { grid-template-columns: 1fr minmax(0,2fr); } .grid-cols-[1fr_2fr] { grid-template-columns: 1fr 2fr; } .grid-cols-[1fr_2fr_2fr_2fr] { grid-template-columns: 1fr 2fr 2fr 2fr; } .grid-cols-[minmax(0\2c 2fr)\2c 1fr] { grid-template-columns: minmax(0,2fr) 1fr; } .grid-cols-none { grid-template-columns: none; } .grid-rows-[0fr] { grid-template-rows: 0fr; } .grid-rows-[1fr] { grid-template-rows: 1fr; } .grid-rows-[auto\2c auto\2c 1fr] { grid-template-rows: auto auto 1fr; } .flex-row { flex-direction: row; } .flex-row-reverse { flex-direction: row-reverse; } .flex-col { flex-direction: column; } .flex-col-reverse { flex-direction: column-reverse; } .flex-wrap { flex-wrap: wrap; } .flex-nowrap { flex-wrap: nowrap; } .place-content-center { place-content: center; } .place-items-center { place-items: center; } .content-center { align-content: center; } .content-start { align-content: flex-start; } .content-end { align-content: flex-end; } .content-between { align-content: space-between; } .!items-start { align-items: flex-start !important; } .items-start { align-items: flex-start; } .items-end { align-items: flex-end; } .items-center { align-items: center; } .items-baseline { align-items: baseline; } .items-stretch { align-items: stretch; } .justify-start { justify-content: flex-start; } .justify-end { justify-content: flex-end; } .justify-center { justify-content: center; } .justify-between { justify-content: space-between; } .justify-around { justify-content: space-around; } .justify-evenly { justify-content: space-evenly; } .justify-items-start { justify-items: start; } .justify-items-end { justify-items: end; } .justify-items-center { justify-items: center; } .gap-0 { gap: 0px; } .gap-0.5 { gap: 0.125rem; } .gap-1 { gap: 0.25rem; } .gap-10 { gap: 2.5rem; } .gap-16 { gap: 4rem; } .gap-2 { gap: 0.5rem; } .gap-3 { gap: 0.75rem; } .gap-4 { gap: 1rem; } .gap-5 { gap: 1.25rem; } .gap-6 { gap: 1.5rem; } .gap-8 { gap: 2rem; } .gap-9 { gap: 2.25rem; } .gap-px { gap: 1px; } .gap-x-1 { column-gap: 0.25rem; } .gap-x-16 { column-gap: 4rem; } .gap-x-2 { column-gap: 0.5rem; } .gap-x-4 { column-gap: 1rem; } .gap-x-6 { column-gap: 1.5rem; } .gap-x-8 { column-gap: 2rem; } .gap-y-14 { row-gap: 3.5rem; } .gap-y-2 { row-gap: 0.5rem; } .gap-y-3 { row-gap: 0.75rem; } .gap-y-4 { row-gap: 1rem; } .gap-y-5 { row-gap: 1.25rem; } .gap-y-6 { row-gap: 1.5rem; } .space-x-0 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0px * var(--tw-space-x-reverse)); margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); } .space-x-0.5 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.125rem * var(--tw-space-x-reverse)); margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.25rem * var(--tw-space-x-reverse)); margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.5rem * var(--tw-space-x-reverse)); margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1rem * var(--tw-space-x-reverse)); margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); } .space-x-6 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1.5rem * var(--tw-space-x-reverse)); margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); } .space-y-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); } .space-y-2 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); } .space-y-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(1rem * var(--tw-space-y-reverse)); } .space-y-6 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } .space-y-8 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(2rem * var(--tw-space-y-reverse)); } .divide-y > :not([hidden]) ~ :not([hidden]) { --tw-divide-y-reverse: 0; border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); } .divide-border-muted > :not([hidden]) ~ :not([hidden]) { border-color: var(--border-muted); } .divide-gray-100 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(222 221 215 / var(--tw-divide-opacity)); } .divide-gray-50 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(242 241 237 / var(--tw-divide-opacity)); } .divide-gray-700 > :not([hidden]) ~ :not([hidden]) { --tw-divide-opacity: 1; border-color: rgb(68 68 68 / var(--tw-divide-opacity)); } .self-start { align-self: flex-start; } .self-end { align-self: flex-end; } .self-center { align-self: center; } .justify-self-start { justify-self: start; } .justify-self-end { justify-self: end; } .justify-self-center { justify-self: center; } .justify-self-stretch { justify-self: stretch; } .overflow-auto { overflow: auto; } .overflow-hidden { overflow: hidden; } .overflow-x-auto { overflow-x: auto; } .overflow-y-auto { overflow-y: auto; } .overflow-y-hidden { overflow-y: hidden; } .overflow-x-scroll { overflow-x: scroll; } .overflow-y-scroll { overflow-y: scroll; } .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .overflow-ellipsis { text-overflow: ellipsis; } .text-clip { text-overflow: clip; } .!whitespace-normal { white-space: normal !important; } .whitespace-normal { white-space: normal; } .whitespace-nowrap { white-space: nowrap; } .whitespace-pre { white-space: pre; } .whitespace-pre-wrap { white-space: pre-wrap; } .text-wrap { text-wrap: wrap; } .break-normal { overflow-wrap: normal; word-break: normal; } .break-words { overflow-wrap: break-word; } .break-all { word-break: break-all; } .!rounded { border-radius: 0.25rem !important; } .rounded { border-radius: 0.25rem; } .rounded-full { border-radius: 9999px; } .rounded-md { border-radius: 0.25rem; } .rounded-none { border-radius: 0px; } .rounded-sm { border-radius: 0.125rem; } .rounded-xl { border-radius: 0.75rem; } .!rounded-b-none { border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; } .!rounded-t-none { border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; } .rounded-b { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .rounded-b-md { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .rounded-b-none { border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; } .rounded-b-sm { border-bottom-right-radius: 0.125rem; border-bottom-left-radius: 0.125rem; } .rounded-l-sm { border-top-left-radius: 0.125rem; border-bottom-left-radius: 0.125rem; } .rounded-r { border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem; } .rounded-r-sm { border-top-right-radius: 0.125rem; border-bottom-right-radius: 0.125rem; } .rounded-t { border-top-left-radius: 0.25rem; border-top-right-radius: 0.25rem; } .rounded-t-none { border-top-left-radius: 0px; border-top-right-radius: 0px; } .rounded-bl-none { border-bottom-left-radius: 0px; } .rounded-tl-none { border-top-left-radius: 0px; } .rounded-tr-sm { border-top-right-radius: 0.125rem; } .border { border-width: 1px; } .border-0 { border-width: 0px; } .border-2 { border-width: 2px; } .border-4 { border-width: 4px; } .!border-x-0 { border-left-width: 0px !important; border-right-width: 0px !important; } .border-x { border-left-width: 1px; border-right-width: 1px; } .!border-b-0 { border-bottom-width: 0px !important; } .!border-t-0 { border-top-width: 0px !important; } .border-b { border-bottom-width: 1px; } .border-b-0 { border-bottom-width: 0px; } .border-b-2 { border-bottom-width: 2px; } .border-b-3 { border-bottom-width: 3px; } .border-l { border-left-width: 1px; } .border-l-4 { border-left-width: 4px; } .border-r { border-right-width: 1px; } .border-r-0 { border-right-width: 0px; } .border-t { border-top-width: 1px; } .border-t-4 { border-top-width: 4px; } .border-t-[1px] { border-top-width: 1px; } .border-solid { border-style: solid; } .border-dashed { border-style: dashed; } .!border-none { border-style: none !important; } .border-none { border-style: none; } .border-[#15806E] { --tw-border-opacity: 1; border-color: rgb(21 128 110 / var(--tw-border-opacity)); } .border-[#D9F99D] { --tw-border-opacity: 1; border-color: rgb(217 249 157 / var(--tw-border-opacity)); } .border-[#e4e8ed] { --tw-border-opacity: 1; border-color: rgb(228 232 237 / var(--tw-border-opacity)); } .border-alpha-black-100 { border-color: rgba(0, 0, 0, 0.12);; } .border-alpha-black-200 { border-color: rgba(0, 0, 0, 0.20);; } .border-alpha-black-300 { border-color: rgba(0, 0, 0, 0.30);; } .border-alpha-black-50 { border-color: rgba(0, 0, 0, 0.05);; } .border-blue-100 { --tw-border-opacity: 1; border-color: rgb(204 222 255 / var(--tw-border-opacity)); } .border-blue-400 { --tw-border-opacity: 1; border-color: rgb(73 141 224 / var(--tw-border-opacity)); } .border-blue-500 { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .border-blue-600 { --tw-border-opacity: 1; border-color: rgb(44 88 143 / var(--tw-border-opacity)); } .border-border-default { border-color: var(--border-default); } .border-cash-300 { --tw-border-opacity: 1; border-color: rgb(157 176 156 / var(--tw-border-opacity)); } .border-cyan-800 { --tw-border-opacity: 1; border-color: rgb(12 56 66 / var(--tw-border-opacity)); } .border-gray-100 { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .border-gray-300 { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .border-gray-50 { --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .border-gray-500 { --tw-border-opacity: 1; border-color: rgb(114 114 114 / var(--tw-border-opacity)); } .border-gray-700 { --tw-border-opacity: 1; border-color: rgb(68 68 68 / var(--tw-border-opacity)); } .border-green-100 { --tw-border-opacity: 1; border-color: rgb(190 230 213 / var(--tw-border-opacity)); } .border-green-200 { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .border-green-400 { --tw-border-opacity: 1; border-color: rgb(64 157 124 / var(--tw-border-opacity)); } .border-green-500 { --tw-border-opacity: 1; border-color: rgb(0 128 96 / var(--tw-border-opacity)); } .border-green-600 { --tw-border-opacity: 1; border-color: rgb(0 100 82 / var(--tw-border-opacity)); } .border-green-700 { --tw-border-opacity: 1; border-color: rgb(0 71 60 / var(--tw-border-opacity)); } .border-orange-100 { --tw-border-opacity: 1; border-color: rgb(255 213 199 / var(--tw-border-opacity)); } .border-orange-300 { --tw-border-opacity: 1; border-color: rgb(247 142 114 / var(--tw-border-opacity)); } .border-orange-400 { --tw-border-opacity: 1; border-color: rgb(224 107 79 / var(--tw-border-opacity)); } .border-purple-100 { --tw-border-opacity: 1; border-color: rgb(216 215 248 / var(--tw-border-opacity)); } .border-purple-500 { --tw-border-opacity: 1; border-color: rgb(112 97 194 / var(--tw-border-opacity)); } .border-purple-600 { --tw-border-opacity: 1; border-color: rgb(87 78 146 / var(--tw-border-opacity)); } .border-red-100 { --tw-border-opacity: 1; border-color: rgb(255 206 211 / var(--tw-border-opacity)); } .border-red-400 { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); } .border-red-500 { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .border-red-600 { --tw-border-opacity: 1; border-color: rgb(159 41 70 / var(--tw-border-opacity)); } .border-transparent { border-color: transparent; } .border-white/10 { border-color: rgb(255 255 255 / 0.1); } .border-yellow-100 { --tw-border-opacity: 1; border-color: rgb(255 214 162 / var(--tw-border-opacity)); } .border-yellow-300 { --tw-border-opacity: 1; border-color: rgb(232 164 66 / var(--tw-border-opacity)); } .border-yellow-50 { --tw-border-opacity: 1; border-color: rgb(255 235 213 / var(--tw-border-opacity)); } .border-t-gray-200 { --tw-border-opacity: 1; border-top-color: rgb(197 196 191 / var(--tw-border-opacity)); } .!bg-button-background-disabled { background-color: var(--button-background-disabled) !important; } .!bg-transparent { background-color: transparent !important; } .bg-[#15806E] { --tw-bg-opacity: 1; background-color: rgb(21 128 110 / var(--tw-bg-opacity)); } .bg-[#B2ECA1] { --tw-bg-opacity: 1; background-color: rgb(178 236 161 / var(--tw-bg-opacity)); } .bg-[#F1F4F4] { --tw-bg-opacity: 1; background-color: rgb(241 244 244 / var(--tw-bg-opacity)); } .bg-[#F6F6F2] { --tw-bg-opacity: 1; background-color: rgb(246 246 242 / var(--tw-bg-opacity)); } .bg-[#FAFAF9] { --tw-bg-opacity: 1; background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } .bg-[#a4abad] { --tw-bg-opacity: 1; background-color: rgb(164 171 173 / var(--tw-bg-opacity)); } .bg-alpha-black-50 { background-color: rgba(0, 0, 0, 0.05);; } .bg-background-dark { background-color: var(--background-dark); } .bg-background-default { background-color: var(--background-default); } .bg-background-light { background-color: var(--background-light); } .bg-black/20 { background-color: rgb(0 0 0 / 0.2); } .bg-blue-100 { --tw-bg-opacity: 1; background-color: rgb(204 222 255 / var(--tw-bg-opacity)); } .bg-blue-25 { --tw-bg-opacity: 1; background-color: rgb(242 247 255 / var(--tw-bg-opacity)); } .bg-blue-50 { --tw-bg-opacity: 1; background-color: rgb(234 241 255 / var(--tw-bg-opacity)); } .bg-blue-500 { --tw-bg-opacity: 1; background-color: rgb(56 111 177 / var(--tw-bg-opacity)); } .bg-button-background-default { background-color: var(--button-background-default); } .bg-cash-25 { --tw-bg-opacity: 1; background-color: rgb(243 248 243 / var(--tw-bg-opacity)); } .bg-categorical-1 { --tw-bg-opacity: 1; background-color: rgb(0 119 136 / var(--tw-bg-opacity)); } .bg-categorical-2 { --tw-bg-opacity: 1; background-color: rgb(137 198 198 / var(--tw-bg-opacity)); } .bg-categorical-3 { --tw-bg-opacity: 1; background-color: rgb(109 60 124 / var(--tw-bg-opacity)); } .bg-categorical-4 { --tw-bg-opacity: 1; background-color: rgb(116 121 230 / var(--tw-bg-opacity)); } .bg-cyan-600 { --tw-bg-opacity: 1; background-color: rgb(0 96 112 / var(--tw-bg-opacity)); } .bg-cyan-900 { --tw-bg-opacity: 1; background-color: rgb(7 39 47 / var(--tw-bg-opacity)); } .bg-gray-100 { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .bg-gray-200 { --tw-bg-opacity: 1; background-color: rgb(197 196 191 / var(--tw-bg-opacity)); } .bg-gray-25 { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .bg-gray-400 { --tw-bg-opacity: 1; background-color: rgb(138 137 133 / var(--tw-bg-opacity)); } .bg-gray-50 { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .bg-gray-500 { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .bg-gray-700 { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .bg-gray-800 { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .bg-gray-900 { --tw-bg-opacity: 1; background-color: rgb(34 34 34 / var(--tw-bg-opacity)); } .bg-green-100 { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .bg-green-25 { --tw-bg-opacity: 1; background-color: rgb(240 248 245 / var(--tw-bg-opacity)); } .bg-green-400 { --tw-bg-opacity: 1; background-color: rgb(64 157 124 / var(--tw-bg-opacity)); } .bg-green-50 { --tw-bg-opacity: 1; background-color: rgb(228 243 236 / var(--tw-bg-opacity)); } .bg-green-500 { --tw-bg-opacity: 1; background-color: rgb(0 128 96 / var(--tw-bg-opacity)); } .bg-green-700 { --tw-bg-opacity: 1; background-color: rgb(0 71 60 / var(--tw-bg-opacity)); } .bg-green-800 { --tw-bg-opacity: 1; background-color: rgb(19 58 51 / var(--tw-bg-opacity)); } .bg-mist-100 { --tw-bg-opacity: 1; background-color: rgb(207 224 224 / var(--tw-bg-opacity)); } .bg-mist-700 { --tw-bg-opacity: 1; background-color: rgb(48 74 74 / var(--tw-bg-opacity)); } .bg-orange-100 { --tw-bg-opacity: 1; background-color: rgb(255 213 199 / var(--tw-bg-opacity)); } .bg-orange-300 { --tw-bg-opacity: 1; background-color: rgb(247 142 114 / var(--tw-bg-opacity)); } .bg-orange-400 { --tw-bg-opacity: 1; background-color: rgb(224 107 79 / var(--tw-bg-opacity)); } .bg-orange-50 { --tw-bg-opacity: 1; background-color: rgb(255 237 231 / var(--tw-bg-opacity)); } .bg-purple-100 { --tw-bg-opacity: 1; background-color: rgb(216 215 248 / var(--tw-bg-opacity)); } .bg-purple-25 { --tw-bg-opacity: 1; background-color: rgb(246 246 255 / var(--tw-bg-opacity)); } .bg-purple-400 { --tw-bg-opacity: 1; background-color: rgb(140 126 226 / var(--tw-bg-opacity)); } .bg-purple-50 { --tw-bg-opacity: 1; background-color: rgb(240 239 255 / var(--tw-bg-opacity)); } .bg-purple-500 { --tw-bg-opacity: 1; background-color: rgb(112 97 194 / var(--tw-bg-opacity)); } .bg-red-100 { --tw-bg-opacity: 1; background-color: rgb(255 206 211 / var(--tw-bg-opacity)); } .bg-red-25 { --tw-bg-opacity: 1; background-color: rgb(255 244 246 / var(--tw-bg-opacity)); } .bg-red-400 { --tw-bg-opacity: 1; background-color: rgb(226 82 99 / var(--tw-bg-opacity)); } .bg-red-50 { --tw-bg-opacity: 1; background-color: rgb(255 232 236 / var(--tw-bg-opacity)); } .bg-red-500 { --tw-bg-opacity: 1; background-color: rgb(199 61 79 / var(--tw-bg-opacity)); } .bg-transparent { background-color: transparent; } .bg-violet-25 { --tw-bg-opacity: 1; background-color: rgb(252 244 250 / var(--tw-bg-opacity)); } .bg-violet-50 { --tw-bg-opacity: 1; background-color: rgb(250 236 246 / var(--tw-bg-opacity)); } .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .bg-yellow-100 { --tw-bg-opacity: 1; background-color: rgb(255 214 162 / var(--tw-bg-opacity)); } .bg-yellow-25 { --tw-bg-opacity: 1; background-color: rgb(255 245 234 / var(--tw-bg-opacity)); } .bg-yellow-300 { --tw-bg-opacity: 1; background-color: rgb(232 164 66 / var(--tw-bg-opacity)); } .bg-yellow-50 { --tw-bg-opacity: 1; background-color: rgb(255 235 213 / var(--tw-bg-opacity)); } .bg-opacity-0 { --tw-bg-opacity: 0; } .bg-opacity-70 { --tw-bg-opacity: 0.7; } .bg-gradient-to-b { background-image: linear-gradient(to bottom, var(--tw-gradient-stops)); } .bg-gradient-to-t { background-image: linear-gradient(to top, var(--tw-gradient-stops)); } .from-white/10 { --tw-gradient-from: rgb(255 255 255 / 0.1) var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } .from-white/80 { --tw-gradient-from: rgb(255 255 255 / 0.8) var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); } .via-white/40 { --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.4) var(--tw-gradient-via-position), var(--tw-gradient-to); } .via-white/70 { --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), rgb(255 255 255 / 0.7) var(--tw-gradient-via-position), var(--tw-gradient-to); } .to-white { --tw-gradient-to: #FFFFFF var(--tw-gradient-to-position); } .to-white/10 { --tw-gradient-to: rgb(255 255 255 / 0.1) var(--tw-gradient-to-position); } .bg-cover { background-size: cover; } .fill-gray-700 { fill: #444444; } .!p-0 { padding: 0px !important; } .p-0 { padding: 0px; } .p-0.5 { padding: 0.125rem; } .p-1 { padding: 0.25rem; } .p-10 { padding: 2.5rem; } .p-2 { padding: 0.5rem; } .p-3 { padding: 0.75rem; } .p-4 { padding: 1rem; } .p-5 { padding: 1.25rem; } .p-6 { padding: 1.5rem; } .p-8 { padding: 2rem; } .!px-6 { padding-left: 1.5rem !important; padding-right: 1.5rem !important; } .!py-0 { padding-top: 0px !important; padding-bottom: 0px !important; } .!py-1 { padding-top: 0.25rem !important; padding-bottom: 0.25rem !important; } .!py-2 { padding-top: 0.5rem !important; padding-bottom: 0.5rem !important; } .!py-3 { padding-top: 0.75rem !important; padding-bottom: 0.75rem !important; } .!py-3.5 { padding-top: 0.875rem !important; padding-bottom: 0.875rem !important; } .px-0 { padding-left: 0px; padding-right: 0px; } .px-1 { padding-left: 0.25rem; padding-right: 0.25rem; } .px-1.5 { padding-left: 0.375rem; padding-right: 0.375rem; } .px-10 { padding-left: 2.5rem; padding-right: 2.5rem; } .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; } .px-4 { padding-left: 1rem; padding-right: 1rem; } .px-5 { padding-left: 1.25rem; padding-right: 1.25rem; } .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } .px-8 { padding-left: 2rem; padding-right: 2rem; } .px-s { padding-left: 8px; padding-right: 8px; } .py-0 { padding-top: 0px; padding-bottom: 0px; } .py-0.5 { padding-top: 0.125rem; padding-bottom: 0.125rem; } .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; } .py-1.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; } .py-12 { padding-top: 3rem; padding-bottom: 3rem; } .py-14 { padding-top: 3.5rem; padding-bottom: 3.5rem; } .py-16 { padding-top: 4rem; padding-bottom: 4rem; } .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; } .py-2.5 { padding-top: 0.625rem; padding-bottom: 0.625rem; } .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } .py-3.5 { padding-top: 0.875rem; padding-bottom: 0.875rem; } .py-4 { padding-top: 1rem; padding-bottom: 1rem; } .py-5 { padding-top: 1.25rem; padding-bottom: 1.25rem; } .py-6 { padding-top: 1.5rem; padding-bottom: 1.5rem; } .py-8 { padding-top: 2rem; padding-bottom: 2rem; } .py-m { padding-top: 16px; padding-bottom: 16px; } .py-px { padding-top: 1px; padding-bottom: 1px; } .!pb-0 { padding-bottom: 0px !important; } .!pb-6 { padding-bottom: 1.5rem !important; } .pb-0 { padding-bottom: 0px; } .pb-0.5 { padding-bottom: 0.125rem; } .pb-1 { padding-bottom: 0.25rem; } .pb-10 { padding-bottom: 2.5rem; } .pb-11 { padding-bottom: 2.75rem; } .pb-2 { padding-bottom: 0.5rem; } .pb-2.5 { padding-bottom: 0.625rem; } .pb-20 { padding-bottom: 5rem; } .pb-3 { padding-bottom: 0.75rem; } .pb-4 { padding-bottom: 1rem; } .pb-5 { padding-bottom: 1.25rem; } .pb-6 { padding-bottom: 1.5rem; } .pb-7 { padding-bottom: 1.75rem; } .pb-8 { padding-bottom: 2rem; } .pl-0 { padding-left: 0px; } .pl-1 { padding-left: 0.25rem; } .pl-10 { padding-left: 2.5rem; } .pl-12 { padding-left: 3rem; } .pl-2 { padding-left: 0.5rem; } .pl-3 { padding-left: 0.75rem; } .pl-4 { padding-left: 1rem; } .pl-5 { padding-left: 1.25rem; } .pl-6 { padding-left: 1.5rem; } .pl-7 { padding-left: 1.75rem; } .pl-8 { padding-left: 2rem; } .pl-9 { padding-left: 2.25rem; } .pl-[3px] { padding-left: 3px; } .pr-0 { padding-right: 0px; } .pr-1 { padding-right: 0.25rem; } .pr-1.5 { padding-right: 0.375rem; } .pr-2 { padding-right: 0.5rem; } .pr-20 { padding-right: 5rem; } .pr-3 { padding-right: 0.75rem; } .pr-4 { padding-right: 1rem; } .pr-6 { padding-right: 1.5rem; } .pr-8 { padding-right: 2rem; } .pt-0 { padding-top: 0px; } .pt-0.5 { padding-top: 0.125rem; } .pt-1 { padding-top: 0.25rem; } .pt-10 { padding-top: 2.5rem; } .pt-16 { padding-top: 4rem; } .pt-2 { padding-top: 0.5rem; } .pt-2.5 { padding-top: 0.625rem; } .pt-24 { padding-top: 6rem; } .pt-3 { padding-top: 0.75rem; } .pt-3.5 { padding-top: 0.875rem; } .pt-4 { padding-top: 1rem; } .pt-5 { padding-top: 1.25rem; } .pt-6 { padding-top: 1.5rem; } .pt-8 { padding-top: 2rem; } .pt-9 { padding-top: 2.25rem; } .text-left { text-align: left; } .text-center { text-align: center; } .text-right { text-align: right; } .align-baseline { vertical-align: baseline; } .align-middle { vertical-align: middle; } .align-text-top { vertical-align: text-top; } .font-mono { font-family: jetbrains-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; } .text-2xl { font-size: 32px; line-height: 40px; letter-spacing: -0.5px; font-weight: 500; } .text-3xl { font-size: 36px; line-height: 42px; letter-spacing: -0.5px; font-weight: 500; } .text-4xl { font-size: 40px; line-height: 44px; letter-spacing: -0.5px; font-weight: 500; } .text-[10px] { font-size: 10px; } .text-base { font-size: 16px; line-height: 24px; } .text-lg { font-size: 20px; line-height: 32px; font-weight: 500; } .text-sm { font-size: 14px; line-height: 20px; } .text-xl { font-size: 24px; line-height: 32px; font-weight: 500; } .text-xs { font-size: 12px; line-height: 16px; } .text-xxs { font-size: 10px; line-height: 14px; letter-spacing: 0.1px; } .font-bold { font-weight: 700; } .font-medium { font-weight: 500; } .font-normal { font-weight: 400; } .uppercase { text-transform: uppercase; } .lowercase { text-transform: lowercase; } .capitalize { text-transform: capitalize; } .italic { font-style: italic; } .!text-gray-100 { --tw-text-opacity: 1 !important; color: rgb(222 221 215 / var(--tw-text-opacity)) !important; } .!text-text-disabled { color: var(--text-disabled) !important; } .text-[#a6adb6] { --tw-text-opacity: 1; color: rgb(166 173 182 / var(--tw-text-opacity)); } .text-alpha-black-100 { color: rgba(0, 0, 0, 0.12);; } .text-black { --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity)); } .text-blue-300 { --tw-text-opacity: 1; color: rgb(118 171 245 / var(--tw-text-opacity)); } .text-blue-400 { --tw-text-opacity: 1; color: rgb(73 141 224 / var(--tw-text-opacity)); } .text-blue-500 { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .text-blue-600 { --tw-text-opacity: 1; color: rgb(44 88 143 / var(--tw-text-opacity)); } .text-blue-700 { --tw-text-opacity: 1; color: rgb(32 69 113 / var(--tw-text-opacity)); } .text-blue-800 { --tw-text-opacity: 1; color: rgb(21 49 82 / var(--tw-text-opacity)); } .text-cyan-600 { --tw-text-opacity: 1; color: rgb(0 96 112 / var(--tw-text-opacity)); } .text-gray-100 { --tw-text-opacity: 1; color: rgb(222 221 215 / var(--tw-text-opacity)); } .text-gray-200 { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .text-gray-25 { --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .text-gray-300 { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .text-gray-400 { --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .text-gray-500 { --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } .text-gray-50a { --tw-text-opacity: 1; color: rgb(246 246 242 / var(--tw-text-opacity)); } .text-gray-600 { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .text-gray-700 { --tw-text-opacity: 1; color: rgb(68 68 68 / var(--tw-text-opacity)); } .text-gray-800 { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .text-gray-900 { --tw-text-opacity: 1; color: rgb(34 34 34 / var(--tw-text-opacity)); } .text-green-100 { --tw-text-opacity: 1; color: rgb(190 230 213 / var(--tw-text-opacity)); } .text-green-300 { --tw-text-opacity: 1; color: rgb(113 182 154 / var(--tw-text-opacity)); } .text-green-400 { --tw-text-opacity: 1; color: rgb(64 157 124 / var(--tw-text-opacity)); } .text-green-50 { --tw-text-opacity: 1; color: rgb(228 243 236 / var(--tw-text-opacity)); } .text-green-500 { --tw-text-opacity: 1; color: rgb(0 128 96 / var(--tw-text-opacity)); } .text-green-600 { --tw-text-opacity: 1; color: rgb(0 100 82 / var(--tw-text-opacity)); } .text-green-700 { --tw-text-opacity: 1; color: rgb(0 71 60 / var(--tw-text-opacity)); } .text-green-800 { --tw-text-opacity: 1; color: rgb(19 58 51 / var(--tw-text-opacity)); } .text-orange-300 { --tw-text-opacity: 1; color: rgb(247 142 114 / var(--tw-text-opacity)); } .text-orange-300a { --tw-text-opacity: 1; color: rgb(255 123 64 / var(--tw-text-opacity)); } .text-orange-500 { --tw-text-opacity: 1; color: rgb(191 78 54 / var(--tw-text-opacity)); } .text-orange-600 { --tw-text-opacity: 1; color: rgb(144 62 40 / var(--tw-text-opacity)); } .text-orange-700 { --tw-text-opacity: 1; color: rgb(113 48 34 / var(--tw-text-opacity)); } .text-orange-800 { --tw-text-opacity: 1; color: rgb(81 33 21 / var(--tw-text-opacity)); } .text-purple-400 { --tw-text-opacity: 1; color: rgb(140 126 226 / var(--tw-text-opacity)); } .text-purple-700 { --tw-text-opacity: 1; color: rgb(66 59 114 / var(--tw-text-opacity)); } .text-purple-800 { --tw-text-opacity: 1; color: rgb(48 43 85 / var(--tw-text-opacity)); } .text-red-400 { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .text-red-500 { --tw-text-opacity: 1; color: rgb(199 61 79 / var(--tw-text-opacity)); } .text-red-600 { --tw-text-opacity: 1; color: rgb(159 41 70 / var(--tw-text-opacity)); } .text-red-700 { --tw-text-opacity: 1; color: rgb(124 27 61 / var(--tw-text-opacity)); } .text-red-800 { --tw-text-opacity: 1; color: rgb(95 15 46 / var(--tw-text-opacity)); } .text-text-critical { color: var(--text-critical); } .text-text-default { color: var(--text-default); } .text-text-disabled { color: var(--text-disabled); } .text-text-muted { color: var(--text-muted); } .text-violet-300 { --tw-text-opacity: 1; color: rgb(197 159 183 / var(--tw-text-opacity)); } .text-white { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } .text-yellow-300 { --tw-text-opacity: 1; color: rgb(232 164 66 / var(--tw-text-opacity)); } .text-yellow-400 { --tw-text-opacity: 1; color: rgb(198 131 63 / var(--tw-text-opacity)); } .text-yellow-600 { --tw-text-opacity: 1; color: rgb(114 79 59 / var(--tw-text-opacity)); } .text-yellow-700 { --tw-text-opacity: 1; color: rgb(88 62 50 / var(--tw-text-opacity)); } .text-yellow-800 { --tw-text-opacity: 1; color: rgb(63 46 40 / var(--tw-text-opacity)); } .underline { text-decoration-line: underline; } .no-underline { text-decoration-line: none; } .placeholder-gray-400::placeholder { --tw-placeholder-opacity: 1; color: rgb(138 137 133 / var(--tw-placeholder-opacity)); } .placeholder-gray-500::placeholder { --tw-placeholder-opacity: 1; color: rgb(114 114 114 / var(--tw-placeholder-opacity)); } .placeholder-gray-600::placeholder { --tw-placeholder-opacity: 1; color: rgb(87 87 87 / var(--tw-placeholder-opacity)); } .opacity-0 { opacity: 0; } .opacity-100 { opacity: 1; } .opacity-30 { opacity: 0.3; } .shadow { --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-2xl { --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-[0_2px_10px_5px_rgba(0\2c 0\2c 0\2c 0.10)] { --tw-shadow: 0 2px 10px 5px rgba(0,0,0,0.10); --tw-shadow-colored: 0 2px 10px 5px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-lg { --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-md { --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .shadow-sm { --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } .outline-none { outline: 2px solid transparent; outline-offset: 2px; } .outline { outline-style: solid; } .outline-2 { outline-width: 2px; } .outline-green-500 { outline-color: #008060; } .outline-purple-600 { outline-color: #574E92; } .blur { --tw-blur: blur(8px); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .drop-shadow-md { --tw-drop-shadow: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .drop-shadow-xl { --tw-drop-shadow: drop-shadow(0 20px 13px rgb(0 0 0 / 0.03)) drop-shadow(0 8px 5px rgb(0 0 0 / 0.08)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .!filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow) !important; } .filter { filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); } .transition { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } .duration-100 { transition-duration: 100ms; } .duration-150 { transition-duration: 150ms; } .duration-200 { transition-duration: 200ms; } .duration-75 { transition-duration: 75ms; } .ease-in-out { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } html#modern-treasury-application { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} a { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); transition-property: none; } code { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .thin-scrollbar{scrollbar-color:#3f4344;scrollbar-width:thin} .thin-scrollbar::-webkit-scrollbar { width: 0.25rem; } .thin-scrollbar::-webkit-scrollbar-track { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .thin-scrollbar::-webkit-scrollbar-thumb { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .no-scrollbar::-webkit-scrollbar{display:none} #auth-root .application-content{padding:0;margin:0;display:flex;align-items:center;justify-content:center;flex-direction:column} #auth-root .auth-form{padding:36px 0 48px 0;border-radius:4px;box-shadow:0 1px 2px 0 rgba(0,0,0,.07);display:flex;align-items:center;justify-content:center;flex-direction:column;width:353px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} #auth-root .auth-form .form-group{width:285px} #auth-root .auth-form .btn-submit{width:285px} #auth-root .auth-form .reset-link{margin-top:16px;font-size:13px;font-weight:500;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} #auth-root .auth-form .auth-error{width:285px;font-size:13px;font-weight:500;margin-top:16px;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} #auth-root .auth-form .auth-prompt{font-size:15px;font-weight:500;margin-bottom:16px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} #auth-root .form-row-password-requirement{margin-bottom:8px;align-items:center;font-size:15px} #auth-root .form-row-password-requirement:last-child{margin-bottom:16px} #auth-root .form-row-password-requirement svg+div{margin-left:8px} #auth-root .form-row-password-requirement .password-requirement-unmet { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .btn-inline{display:inline} .btn{white-space:nowrap} .btn-action{padding:10px 20px;height:38px;border-radius:4px;border:none;font-weight:500;font-size:13px;line-height:18px;box-shadow:none !important;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action.btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .btn-action.btn-disabled:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action svg{margin-right:10px;fill: #F7F7F6} .btn-action:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(56 111 177 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .btn-action.btn-index-action{margin-top:24px;margin-bottom:1px} .btn-action.btn-danger { --tw-bg-opacity: 1; background-color: rgb(226 82 99 / var(--tw-bg-opacity)); } .btn-action+.btn-secondary-action{margin-left:16px} .btn-secondary-action{border-radius:4px;height:38px;line-height:18px;padding:10px 20px;font-weight:500;font-size:13px;box-shadow:none !important;transition:none;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .btn-secondary-action svg { fill: #AAA9A4; } .btn-secondary-action svg+span{margin-left:8px} .btn-secondary-action:hover { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .btn-secondary-action:hover svg { fill: #303030; } .btn-secondary-action.secondary-action-with-icon{padding:0 16px} .selectbar{width:100%} .selectbar.selectbar-dark button.btn-selected { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .selectbar button{font-size:13px;font-weight:500;line-height:18px;padding:9px 0;flex:1 1 !important;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .selectbar button:focus { --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); --tw-shadow-color: #DEDDD7; --tw-shadow: var(--tw-shadow-colored); } .selectbar button:first-child{border-radius:4px 0 0 4px} .selectbar button:last-child{border-radius:0 4px 4px 0} .selectbar button.btn-selected { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .selectbar.selectbar-error { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .selectbar.selectbar-error button { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .btn-link-unpadded{padding:0} .btn-white{border-radius:4px;font-size:13px;font-weight:500;line-height:18px;height:38px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .btn-white svg{margin-right:9.75px} .btn-white:hover { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .btn-white-action{border-radius:4px;font-size:12px;font-weight:500;height:32px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(21 49 82 / var(--tw-text-opacity))} .btn-white-action:hover,.btn-white-action:focus{outline:none;box-shadow:none} .btn-link{border:none;padding:0;font-size:12px;font-weight:500;line-height:16px;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .btn-link:hover { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .dashboard-widget-container.reconciled-volume .recharts-cartesian-grid-horizontal line:first-child{stroke:none} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick-value tspan{font-weight:500} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick:first-child text{font-size:0} .dashboard-widget-container.reconciled-volume .recharts-yAxis .recharts-cartesian-axis-tick:first-child line{stroke:none} .dashboard-widget-container.reconciled-volume .recharts-xAxis .recharts-cartesian-axis-tick-value tspan{font-size:10px} .dashboard-widget-container.reconciled-volume .recharts-legend-item{line-height:22px;margin-top:10px} .dashboard-widget-container.reconciled-volume .resizing-container{display:flex;flex-direction:column;align-items:center;justify-content:center;height:225px !important} .dashboard-widget-container.reconciled-volume .header-container{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap;align-items:center;margin:-25px 0 20px 0} .dashboard-widget-container.reconciled-volume .header-container .header{white-space:nowrap;font-weight:500;margin-right:15px} .dashboard-widget-container.reconciled-volume .header-container .selectors-container{display:flex;flex-direction:row;justify-content:space-between;min-width:320px} .dashboard-widget-container.reconciled-volume .header-container .selectors-container>{width:155px} .dashboard-widget-container.reconciled-volume .header-container>{margin-top:25px} .dashboard-widget-container.todays-tasks .header-container{display:flex;flex-direction:row;justify-content:space-between} .dashboard-widget-container.todays-tasks .header-container .header{white-space:nowrap;margin-bottom:20px;font-weight:500} .dashboard-widget-container.todays-tasks .info-text{margin-right:6px;font-size: 12px;line-height: 16px;font-weight: 500;--tw-text-opacity: 1;color: rgb(138 137 133 / var(--tw-text-opacity))} .dashboard-widget-container.todays-tasks .big-info-text { font-size: 16px; line-height: 24px; font-weight: 500; --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .dashboard-widget-container.todays-tasks .todos-body{display:flex;flex-direction:column;justify-content:space-evenly;align-items:center} .dashboard-widget-container.todays-tasks .todos-body>{margin:7.5px 0 7.5px 0} .dashboard-widget-container.todays-tasks .table-body .index-table-row { border-top-width: 1px; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .dashboard-widget-container.todays-tasks .table-body .index-table-row:last-child{margin-bottom:-16.5px} .dashboard-widget-container.todays-tasks .table-entry{display:flex;flex-direction:column;justify-content:center} .dashboard-widget-container.todays-tasks .task-row{display:flex;flex-direction:row;align-items:center} .dashboard-widget-container.todays-tasks .task-row a{font-weight:500;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .dashboard-widget-container.todays-tasks .task-row>{justify-content:center} .dashboard-widget-container.todays-tasks .task-row>:first-child{margin-right:16px} .dashboard-widget-container.todays-tasks .task-row>:not(:first-child){margin-right:4px} .dashboard-widget-container.key-metrics-view .header-container{display:flex;flex-direction:column;flex-wrap:wrap;margin:-25px 0 15px 0} .dashboard-widget-container.key-metrics-view .header-container .header{white-space:nowrap;font-weight:500} .dashboard-widget-container.key-metrics-view .header-container>{margin-top:25px} .dashboard-widget-container.key-metrics-view .prefix{display:flex;flex-direction:row;justify-content:center;margin:-7px 0 5px 0;line-height:22px} .dashboard-widget-container.key-metrics-view .prefix>:not(:first-child){margin-left:20px} .dashboard-widget-container.key-metrics-view .columns-widget { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; } .dashboard-widget-container.key-metrics-view .columns-widget .column { display: grid; grid-auto-flow: row; gap: 0.75rem; } .dashboard-widget-container.key-metrics-view .info-text { margin-bottom: 0.125rem; font-size: 10px; line-height: 14px; letter-spacing: 0.1px; text-transform: uppercase; --tw-text-opacity: 1; color: rgb(138 137 133 / var(--tw-text-opacity)); } .dashboard-widget-container.key-metrics-view .positive-indicator,.dashboard-widget-container.key-metrics-view .negative-indicator{display:flex;flex-direction:row;align-items:center} .dashboard-widget-container.key-metrics-view .indicator>:not(:first-child){margin-left:6px} .dashboard-widget-container.key-metrics-view .positive-indicator { --tw-text-opacity: 1; color: rgb(64 157 124 / var(--tw-text-opacity)); } .dashboard-widget-container.key-metrics-view .negative-indicator { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .dashboard-widget-container.activity-feed{display:flex;flex-direction:column} .dashboard-widget-container.activity-feed .header{margin-bottom:19px;font-weight:500} .dashboard-widget-container.activity-feed .icon{align-self:baseline} .dashboard-widget-container.activity-feed a.btn{align-self:center} .dashboard-widget-container.activity-feed a{text-decoration:none} .dashboard-widget-container.activity-feed a .activity-row{white-space:normal;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .dashboard-widget-container.activity-feed a .activity-row .info-text{font-size:11px;line-height:13px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .dashboard-widget-container.activity-feed .activity-row>{font-size:12px;line-height:15px} .dashboard-widget-container.activity-feed .activity-row>:not(:first-child){margin-top:4px} .dashboard-widget-container.activity-feed .index-table .table-body{padding:12.5px 0 0 0;border-top-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row:hover{border-radius:2px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row{border-top:0;align-items:center} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row .table-entry{padding:12.5px 0 12.5px 0} .dashboard-widget-container.activity-feed .index-table .table-body .index-table-row .table-entry-allow-overflow{word-wrap:break-word} .dashboard-widget-container { border-radius: 0.25rem; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); padding-left: 1.5rem; padding-right: 1.5rem; padding-top: 1rem; padding-bottom: 1rem; } .dashboard-widget-container .spinner-container{min-height:200px;margin-left:45%;margin-top:20%} .dashboard-widget-container .react-select__menu,.dashboard-widget-container .react-select__menu-list,.dashboard-widget-container .react-select__option{width:155px} .dashboard-widget-container .account-select .react-select__menu,.dashboard-widget-container .account-select .react-select__menu-list,.dashboard-widget-container .account-select .react-select__option{width:240px} .document-section{margin:auto;margin-top:16px} .document-upload-container .loader{margin:.5rem 0 0 .5rem} .document-upload-container .pending-documents{margin:auto;max-width:1000px} .document-upload-container .pending-documents .subsection-header div:first-child{min-width:180px;max-width:180px} .document-upload-container .pending-documents .document-upload-row .form-text{min-width:180px;max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .form-section{margin-bottom:16px} .form-section:last-child{margin-bottom:24px} .form-section h3 { margin-bottom: 1rem; border-bottom-width: 1px; --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); padding-bottom: 0.5rem; --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .form-section h3 span.addendum{padding-left:8px;font-size:11px;letter-spacing:1.25px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-section h3 div.header-hint{display:block;font-size:13px;font-weight:500;line-height:18px;margin-top:6px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-section h3 div.header-hint a { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .form-section h3.h3-no-bottom-border{border-bottom:0;padding-bottom:0} .form-section .form-row{justify-content:space-between} .form-section .form-row:last-child{margin-bottom:0} .form-section .form-delete-row{margin-top:1.5rem} .form-section .form-text{margin:0;font-size:14px;line-height:20px} .form-section .account-form-bordered input{border-radius:2px;min-width:280px;height:32px;padding-left:8px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity))} .form-section .account-form-bordered input:focus { border-width: 1px; --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); --tw-shadow-color: #386FB1; --tw-shadow: var(--tw-shadow-colored); } .form-create{max-width:586px} .form-create .selectbar{width:100%} .form-create .form-row>div { min-width: 100%; max-width: 100%; flex-grow: 1; } @media (min-width: 768px) { .form-create .form-row>div { min-width: 48%; max-width: 48%; } } .form-create .form-row>div:not(:last-child){margin-right:16px} .form-create .form-row.form-row-full>div{min-width:100%;max-width:100%} .form-group{margin-bottom:0} .form-group .error-message{font-size:12px;margin-top:8px;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .form-group .error-message+.btn-link{display:block} .form-group .character-limit{font-size:10px;font-weight:500;position:relative;left:95%;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-group .react-datepicker__input-container button span{font-weight:400 !important} .form-group .react-datepicker__header__dropdown>div{font-size:14px;border-radius:.125rem;border-width:1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity))} .form-group .react-datepicker__header__dropdown>div>select{-webkit-appearance:none;appearance:none;padding:3px 24px 3px 6px;background:#fff url("data:image/svg+xml;utf8,") no-repeat;background-position:right 5px top 50%} .form-group .react-datepicker__header__dropdown>div>select:focus-visible{outline:0} .form-group .react-datepicker__navigation{margin-top:5px} .form-checkbox{margin-top:auto;margin-bottom:auto} .form-row{margin:0} .form-row .form-group{margin-bottom:16px} .react-autosuggest__container{position:relative} .react-autosuggest__input{border-radius:4px;box-sizing:content-box;height:1rem;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity))} .react-autosuggest__input--focused{outline:none} .react-autosuggest__input--open{border-bottom-left-radius:0;border-bottom-right-radius:0} .react-autosuggest__suggestions-container{display:none} .react-autosuggest__suggestions-container--open{display:block;position:absolute;top:39px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px;z-index:2;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(197 196 191 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(255 255 255 / var(--tw-bg-opacity))} .react-autosuggest__suggestions-list{margin:0;padding:0;list-style-type:none} .react-autosuggest__suggestion{cursor:pointer;padding:10px 20px} .react-autosuggest__suggestion--highlighted { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .form-check-input{position:static;min-width:14px;min-height:14px;margin:0;border-width: 2px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .form-checkbox-container{display:flex;flex-direction:row} .form-check-label .form-label-container{margin-left:8px} .label-placeholder{height:26px} .many-action-button { height: 2rem; width: 2.5rem; border-radius: 0.25rem; border-width: 1px; --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); fill: #AAA9A4; --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .react-datepicker{font-family:inherit} .react-datepicker__input-container{display:flex} .react-datepicker__input-container .form-control{height:32px} .form-subsection{padding:16px;border-radius:4px;font-size:12px;font-weight:500;margin:0 -16px 16px -16px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .form-subsection .form-subsection{padding:0;margin-left:0;margin-right:0} .form-subsection .subsection-header{font-size:13px;font-weight:500;line-height:18px;padding-bottom:18px;margin-bottom:16px;display:flex;flex-direction:row;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .form-subsection .subsection-header span.addendum{padding-left:8px;font-size:11px;letter-spacing:1.25px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-subsection .subsection-header>div{max-width:50%;flex-grow:1} .form-subsection .subsection-header>div:not(:last-child){margin-right:14px} .form-subsection .subsection-header>div.with-extra-space-for-button{margin-right:55px} .form-subsection .btn-subsection-top-margin{margin-top:16px} .form-subsection .subsection-row{display:flex;flex-direction:row;flex-wrap:wrap} .form-subsection .subsection-row:not(:last-child){margin-bottom:16px} .form-subsection .subsection-row .form-text{margin-top:auto;margin-bottom:auto} .form-subsection .subsection-row.subsection-row-with-action>div { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .form-subsection .subsection-row.subsection-row-with-action>div { min-width: 44%; max-width: 44%; } } .form-subsection .subsection-row>div { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .form-subsection .subsection-row>div { min-width: 48%; max-width: 48%; } } .form-subsection .subsection-row>div+.form-group { margin-top: 1rem; } @media (min-width: 768px) { .form-subsection .subsection-row>div+.form-group { margin-top: 0px; } } .form-subsection .subsection-row>div:not(:last-child){margin-right:14px} .form-subsection .subsection-row .btn-delete-row{border-radius:4px;border:none;margin-top:auto;height:38px;width:38px;--tw-bg-opacity: 1;background-color: rgb(230 243 247 / var(--tw-bg-opacity))} .form-primary-button { --tw-bg-opacity: 1; background-color: rgb(47 152 174 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity));border-radius:4px;padding:10px 20px;font-size:13px;line-height:18px;font-weight:500;margin-top:12px; } .form-primary-button:hover,.form-primary-button:focus { --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .form-control{font-size:13px;line-height:18px;font-weight:500;height:38px} .form-control.form-control-small-text{font-size:12px;line-height:16px} .form-control:focus { --tw-border-opacity: 1; border-color: rgb(47 152 174 / var(--tw-border-opacity));outline:none;box-shadow:none; } .form-control:disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .form-control-error { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); } .form-control-error .react-select__control { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .help-text{margin-top:10px;font-size:12px} textarea.form-control{height:38px} .react-datepicker-wrapper{width:100%} .react-datepicker__current-month{display:none} .tooltip-holder{margin-left:6px;margin-bottom:3px} .__react_component_tooltip { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .__react_component_tooltip .multi-line{text-align:left;font-size:12px;line-height:18px;--tw-text-opacity: 1;color: rgb(242 241 237 / var(--tw-text-opacity))} .modal-form { position: fixed; left: 25%; top: 25%; display: flex; --tw-translate-x: -25%; --tw-translate-y: -25%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); flex-direction: column; --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); padding-left: 1.75rem; padding-right: 1.75rem; padding-top: 2.5rem; padding-bottom: 2.5rem; outline: 2px solid transparent; outline-offset: 2px; } @media (min-width: 768px) { .modal-form { left: 50%; top: 50%; --tw-translate-x: -50%; --tw-translate-y: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } } .modal-form .modal-form-body { min-width: 100%; max-width: 100%; } @media (min-width: 768px) { .modal-form .modal-form-body { min-width: 586px; max-width: 586px; } } .modal-form .modal-form-headline{display:flex;flex-direction:row;justify-content:space-between;margin-bottom:24px;line-height:33px} .modal-form .modal-form-headline h3{font-weight:400;font-size:24px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .modal-form .modal-form-headline .modal-form-exit-contents{display:flex;flex-direction:column;align-items:center;font-weight:500;font-size:12px;background:none;border:none;outline:none;--tw-text-opacity: 1;color: rgb(197 196 191 / var(--tw-text-opacity))} .modal-form .modal-form-headline .modal-form-exit-contents span { --tw-text-opacity: 1; color: rgb(197 196 191 / var(--tw-text-opacity)); } .modal-form .modal-form-headline .modal-form-exit-contents:hover{cursor:pointer} .modal-form-overlay{background:rgba(248,248,248,.6);position:fixed;top:0;left:0;right:0;bottom:0} .ReactModal__Body--open{overflow:hidden} .currency-select .react-select__control{border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-right-radius:0;height: 2rem;min-height: 0px;border-width: 1px;border-color: var(--border-default)} .currency-select .react-select__control.react-select__control--is-focused { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .currency-select .react-select__control.react-select__control--is-disabled { background-color: var(--button-background-disabled); } .currency-select .react-select__control .react-select__single-value { color: var(--text-default); } .currency-select .react-select__control.react-select__single-value--is-disabled { color: var(--text-muted); } .currency-select .react-select__menu .react-select__option { font-size: 14px; line-height: 20px; font-weight: 500; color: var(--text-muted); } .currency-select .react-select__menu .react-select__option.react-select__option--is-focused { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); color: var(--text-default); } .currency-select .react-select__menu .react-select__option.react-select__option--is-selected { --tw-bg-opacity: 1; background-color: rgb(0 96 112 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity)); } .currency-select .react-select__clear-indicator { display: flex; align-items: center; justify-content: center; padding: 0px; } .currency-select .react-select__clear-indicator svg path { fill: currentColor; } .currency-select .react-select__indicator.react-select__dropdown-indicator { padding: 0px; padding-right: 0.25rem; } .currency-select .react-select__value-container { margin-top: -1px; margin-bottom: -1px; height: 2rem; padding-top: 0px; padding-bottom: 0px; } .currency-select .react-select__value-container.react-select__value-container--is-multi { margin-top: 0px; margin-bottom: 0px; height: 100%; padding-top: 1px; padding-bottom: 1px; } .currency-select .react-select__value-container.react-select__value-container--has-value { border-color: var(--border-default); padding-left: 0.5rem; } .currency-select .react-select__value-container.react-select__value-container--has-value .react-select__single-value { color: var(--text-default); } .currency-select .react-select__value-container.react-select__value-container--has-value .react-select__single-value--is-disabled { color: var(--text-muted); } .react-select__multi-value { --tw-bg-opacity: 1 !important; background-color: rgb(242 241 237 / var(--tw-bg-opacity)) !important; } .overlapping-grid-areas{grid-area:1/1/1/1} .application-content-body{display:flex;justify-content:center;align-items:center;flex-direction:column;flex-grow:1} .application-content-body .content-section{margin-bottom:2rem;word-wrap:break-word;width: 100%;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));padding: 1rem} @media (min-width: 768px) { .application-content-body .content-section { width: 75%; padding: 1.5rem; } } @media (min-width: 1024px) { .application-content-body .content-section { width: 50%; padding: 2rem; } } .application-content-body .content-section h3{font-size:1rem;font-weight:bold} .application-content-body .form-group-submit { width: 100%; } @media (min-width: 768px) { .application-content-body .form-group-submit { width: 75%; } } @media (min-width: 1024px) { .application-content-body .form-group-submit { width: 25%; } } html.public-application .application-content{margin:0;display:flex;flex-direction:column;align-items:center} html.public-application .outer-mt-container,html.public-application .alert { width: 90%; max-width: 654px; } @media (min-width: 1024px) { html.public-application .outer-mt-container,html.public-application .alert { width: 100%; } } .plaid-connect-link{width:124px;height:40px;box-shadow:0 1px 2px 0 rgba(0,0,0,.07);border-radius:20px;font-size:12px;font-weight:500;line-height:16px;padding:12px 22px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .plaid-connect-link svg{margin-right:8px} .plaid-connect-link svg path { fill: #AAA9A4; } .plaid-connect-link:hover{text-decoration:none;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .plaid-connect-link:hover svg path{transition:fill 1s;fill: #303030} .dollar-demo.outer-mt-container .outer-container-headline{justify-content:center} .dollar-demo .btn-do-manual{display:block;margin-top:24px;margin-left:auto;margin-right:auto} .dollar-demo .form-section-plaid{margin-bottom:0} .search-filters-container .react-select-container,.search-filters-container .search-input,.search-filters-container .form-group,.search-filters-container .metadata-value{width:207px} .rules-section{display:flex;flex-direction:column;padding:16px 0;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .rules-section:first-child{padding-top:8px} .rules-section:hover { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .rules-section:hover .rule-header .rule-edit-link{display:inline-flex} .rules-section .rule-header{display:flex;flex-direction:row;margin-bottom:14px} .rules-section .rule-header h2{font-size:17px;font-weight:500;margin:0;line-height:23px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .rules-section .rule-header .rule-edit-link{display:none;margin-left:10px;padding:0;font-weight:500;font-size:12px;line-height:16px;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .rules-section .rule-text .rule-text-section:not(:first-child){margin-top:16px} .rules-section .rule-text h3{font-weight:500;font-size:13px;line-height:18px;margin:0;margin-bottom:4px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .rules-section .rule-text ul{margin-bottom:0;list-style-type:none;padding:0} .rules-section .rule-text ul li:not(:first-child){margin-top:4px} .rules-section .rule-text .rule-conditions{font-size:13px;line-height:18px;font-weight:500;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .form-create-rules{max-width:941px} .form-create-rules .metadata-values-row{display:flex;flex-direction:row;flex-wrap:wrap} .form-create-rules .metadata-values-row .metadata-input{max-width:100% !important;min-width:100% !important} .form-create-rules .form-row { margin-bottom: 1rem; } @media (min-width: 768px) { .form-create-rules .form-row { margin-bottom: 0px; } } .form-create-rules .form-row>div { min-width: 100%; max-width: 100%; flex-grow: 1; } @media (min-width: 768px) { .form-create-rules .form-row>div { min-width: 26%; max-width: 26%; } } @media (min-width: 1024px) { .form-create-rules .form-row>div { min-width: 29%; max-width: 29%; } } .form-create-rules .form-row>div:not(:last-child) { margin-right: 1rem; } .form-create-rules .approver-row{justify-content:flex-start} .form-create-rules .approver-row .btn-secondary-action{margin-top:auto;margin-bottom:16px} .form-create-rules .many-action-button{max-width:38px;min-width:38px} .form-create-rules .remove-condition-label { display: inline; } @media (min-width: 768px) { .form-create-rules .remove-condition-label { display: none; } } .form-create-rules .edit-rule-buttons .btn-secondary-action{margin-left:16px} .form-create-rules .edit-rule-buttons .error-message{margin-left:16px;font-size:13px;font-weight:500;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .api-config-value{font-size:13px;font-weight:400;line-height:18px;word-break:break-all} .api-config-value code{font-size:inherit;font-weight:inherit;line-height:inherit} .list-group{list-style-type:none} .list-group .list-group-item{border-radius:0;border:none;height:40px;padding:11px 0 11px 16px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .list-group .selected-group-item{padding-left:12px;border-left-width: 4px;--tw-border-opacity: 1;border-color: rgb(64 157 124 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(0 0 0 / var(--tw-text-opacity))} .list-group .list-group-item-placeholder{cursor:pointer} .list-group .list-group-sub-item{display:block;padding:6px 0 6px 26px;text-decoration:none;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .list-group .list-group-sub-item:first-child{padding-top:12px} .list-group .list-group-sub-item:hover{cursor:pointer;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .list-group .list-group-sub-item.list-group-sub-item-selected { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .application-content { margin-left: 0px; } @media (min-width: 1024px) { .application-content { margin-left: auto; } } .hidden{display:none} .hidden.form-row{display:none !important} .rounded-container{border-radius:10px;padding:1rem;border-width: 2px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);--tw-shadow-color: #F2F1ED;--tw-shadow: var(--tw-shadow-colored)} .outer-mt-container .outer-container-headline{display:flex;justify-content:space-between;margin-bottom:16px} .outer-mt-container .outer-container-headline h2{margin-bottom:0} .outer-mt-container .outer-container-headline h2 .header-hint{margin-top:8px;display:block;font-size:13px;font-weight:500;line-height:18px;--tw-text-opacity: 1;color: rgb(170 169 164 / var(--tw-text-opacity))} .outer-mt-container .outer-container-headline h2 .header-subtext{margin-top:12px;display:block;font-size:14px;font-weight:400;line-height:18px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .outer-mt-container .outer-container-headline .btn-action{margin-left:auto} .mt-container { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .mt-container .container-headline{display:flex;flex-direction:row;justify-content:space-between;margin-top:4px;margin-bottom:34px} .mt-container .container-headline h2{font-size:18px;font-weight:400;line-height:25px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .mt-container .container-headline .badge,.mt-container .container-headline .btn-link{margin-left:16px} .mt-container .container-headline .btn-link{padding:0} .mt-container .container-headline .csv-download-link{font-size:.75rem;margin-left:auto} .mt-container .container-headline .dropdown{display:inline} .mt-container .container-headline.audit-record-csv{margin-top:0;margin-bottom:12px;height:0} .mt-container .container-headline.audit-record-csv .csv-download-link{position:relative} .select-inline{display:inline-block} .select-inline select{background:none;border:0;border-bottom:1px solid #000;border-radius:0} .input-inline{display:inline-block !important} .input-inline input{border:0;border-bottom:1px solid #000;border-radius:0} .input-highlighted{position:relative;display:inline-block} .input-highlighted input{padding-bottom:.5rem !important;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity))} .input-highlighted.required::after{content:"";position:absolute;right:.1rem;top:0;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} .select-highlighted { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .select-highlighted.required::after{content:"*";display:inline;position:absolute;margin:0 0 0 -0.5rem;--tw-text-opacity: 1;color: rgb(226 82 99 / var(--tw-text-opacity))} #mainActionsDropdown img{width:25px;height:25px;display:block} .tags-container .mt-tag{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:5px;display:inline-block;margin:0 1rem 0 0;max-width:8rem;padding:.5rem;width:8rem;border-width: 3px;--tw-border-opacity: 1;border-color: rgb(0 0 0 / var(--tw-border-opacity))} .tags-container .mt-tag .tag-icon{width:1rem} .header-with-edit h2{display:inline-block} .header-with-edit a{margin-left:.5rem} .form-group.form-group-valid { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .form-group.form-group-valid input.is-valid { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } input.parsley-error,select.parsley-error,textarea.parsley-error { --tw-border-opacity: 1; border-color: rgb(226 82 99 / var(--tw-border-opacity)); --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } ul.csv-errors li { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .pagination-row { display: flex; justify-content: center; } .pagination-row .entity-count-container { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .pagination-row .entity-count-container .entity-count { font-size: 12px; line-height: 16px; font-weight: 500; --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .pagination-row .pagination-nav{margin-left:12px} .pagination-row .pagination-nav .btn-nav{border-radius:4px;height:38px;width:38px;border-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .pagination-row .pagination-nav .btn-nav:first-child{border-top-right-radius:0;border-bottom-right-radius:0} .pagination-row .pagination-nav .btn-nav:last-child{border-top-left-radius:0;border-bottom-left-radius:0} .loading-container{text-align:center} .resource-link-section a{display:block} .split-container { display: flex; flex-direction: column; justify-content: space-between; } @media (min-width: 1024px) { .split-container { flex-direction: row; } } .split-container .split-container-child{flex-basis:48%} @media(max-width: 576px){.d-xs-none{display:none !important}} .missing { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .utc-date .time { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .group-detail-form-section,.user-detail-form-section{margin-bottom:8px} .notifications-section{max-width:350px} .accounting-counterparties-container .btn-group.selectbar{max-width:400px;margin-bottom:24px} .accounting-counterparties-container .form-section.matching-tools{margin-bottom:32px} .form-feedback-modal textarea.form-control{height:76px} .table{margin-bottom:0} .table-entry-wide{max-width:375px !important;flex-grow:1.5 !important;margin-right: 1.25rem} @media (min-width: 640px) { .table-entry-show-small { display: none; } } .table-entry-accounting-wide{max-width:100% !important;white-space:normal !important} .table-entry-hide-small {display:none; } .table-entry-hide-small.form-row{display:none} @media (min-width: 640px) { .table-entry-hide-small { display: block; } } .index-table{display:flex;flex-direction:column;justify-content:flex-start} .index-table .table-head{font-weight:500} .index-table .index-table-row{font-size:12px;line-height:16px;display:flex;flex-direction:row;flex-grow:1} .index-table .index-table-row .table-entry{flex-grow:1;flex-basis:0;max-width:250px;padding:16.5px 0 16.5px 0;margin-right:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;word-wrap:break-word;min-width:1%} .index-table .index-table-row a.table-entry{text-decoration:inherit;color:inherit} .index-table .index-table-row a.table-entry:active{-webkit-user-select:none !important;user-select:none !important} .index-table .index-table-row.highlighted-row{font-style:italic} .index-table .index-table-row.bold-row{font-weight:500} .index-table .index-table-row.index-table-row-multiple-elements .table-entry{display:flex;flex-direction:column;justify-content:space-between} .index-table .index-table-row.index-table-row-multiple-elements .table-entry>:not(:first-child){margin-top:8px} .index-table .index-table-row .table-entry-allow-overflow{overflow:visible} .index-table .index-table-row .table-entry-ledger-wide{max-width:100%;margin-right:30px} .index-table .index-table-row .table-entry-tall{min-height:59px} .index-table .index-table-row .table-entry-small{flex-grow:.6} .index-table .index-table-row .table-entry-min{max-width:min-content;margin:0 10px 0 0} .index-table .index-table-row .table-entry-icon{flex-grow:0;flex-shrink:0;flex-basis:16px;margin-left:10px;margin-right:16px} .index-table .index-table-row .table-entry-right-align{padding-right:1px} .index-table .index-table-row .table-entry-right-align:not(:first-child){text-align:right} .index-table .index-table-row .table-entry-center-align{text-align-last:center} .index-table .index-table-row .table-entry-center-vertical{display:flex;align-items:center} .index-table .index-table-row .table-entry.table-checkbox{flex-grow:0 !important;margin-right:8px;min-width:14px;display:none} .index-table .index-table-row .table-entry.table-checkbox.form-row{display:none} @media (min-width: 640px) { .index-table .index-table-row .table-entry.table-checkbox { display: block; } } .index-table .expanded-section{padding:14px 16px;font-size:12px;line-height:22px;margin-bottom:16px;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .index-table .expanded-section:last-child{margin-bottom:0} .index-table .expanded-section .expanded-row{display:flex;flex-direction:row} .index-table .expanded-section .expanded-row:not(:first-child){padding-top:14px} .index-table .expanded-section .expanded-key{font-weight:500;min-width:120px} .index-table .expanded-section .expanded-value{font-weight:400} .index-table .danger-row { --tw-text-opacity: 1; color: rgb(226 82 99 / var(--tw-text-opacity)); } .index-table .table-body .linked-row:hover{cursor:pointer;--tw-bg-opacity: 1;background-color: rgb(247 247 246 / var(--tw-bg-opacity))} .index-table .table-body .index-table-row:not(:first-child) { border-top-width: 1px; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .index-table .table-entry.actions{width:150px;min-width:150px} .index-table .table-entry.actions button,.index-table .table-entry.actions span{width:67px;font-weight:500;font-size:12px;line-height:16px;padding:4px 0;border-radius:4px;transition:background-color 1s;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .index-table .table-entry.actions button:not(:first-child),.index-table .table-entry.actions span:not(:first-child){margin-left:6px} .index-table .table-entry.actions button.btn-disabled,.index-table .table-entry.actions span.btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .index-table .table-entry.actions button.btn-view-details,.index-table .table-entry.actions span.btn-view-details{border:none;padding:0;text-align:left;background-color: inherit;--tw-text-opacity: 1;color: rgb(56 111 177 / var(--tw-text-opacity))} .index-table .table-entry.actions button.btn-view-details:hover,.index-table .table-entry.actions button.btn-view-details:focus,.index-table .table-entry.actions span.btn-view-details:hover,.index-table .table-entry.actions span.btn-view-details:focus{outline:none;text-decoration:none;box-shadow:none} .index-table .table-entry.actions .action-tooltips{display:inline} .index-table .header-row{font-size:13px;line-height:18px;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(242 241 237 / var(--tw-border-opacity))} .index-table .header-row .table-entry{padding:0 0 19px 0} .index-table .btn-accordian{margin-top:16px} .index-table.hosted-invoice-line-items .table-body .index-table-row:not(:first-child){border:none} .index-table.hosted-invoice-line-items .index-table-row.highlighted-row{font-style:normal;--tw-bg-opacity: 1;background-color: rgb(242 241 237 / var(--tw-bg-opacity))} .index-table.hosted-invoice-line-items .index-table-row .table-entry{padding:12px;text-align:right} .index-table.hosted-invoice-line-items .index-table-row .table-entry:first-child{text-align:left} .index-table.hosted-invoice-line-items .index-table-row .table-entry:last-child{padding-right:20px} .key-value-table{display:flex;flex-direction:column;font-size:12px;line-height:22px;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .key-value-table .key-value-table-row{grid-template-columns:150px 1fr;display: grid;width: 100%;grid-auto-flow: column;gap: 1.5rem;border-bottom-width: 1px;--tw-border-opacity: 1;border-color: rgb(222 221 215 / var(--tw-border-opacity));padding-top: 1rem;padding-bottom: 1rem} .key-value-table .key-value-table-row:first-child { padding-top: 0px; } .key-value-table .key-value-table-row:last-child { border-bottom-width: 0px; padding-bottom: 0px; } .key-value-table .key-value-table-row .row-label { overflow-wrap: break-word; font-weight: 500; } .key-value-table .key-value-table-row .row-value{font-weight:400;word-break:break-all} .key-value-table.key-value-table-subtable{padding:16px;border-radius:4px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity))} .key-value-table.key-value-table-subtable:not(:first-child){margin-top:24px} .key-value-table+.btn-link{padding-top:16px} .detail-panel { display: flex; flex-direction: column; align-items: flex-start; gap: 1rem; border-radius: 0.25rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); padding: 1.5rem; } .detail-panel-row{grid-template-columns:150px 1fr;display: grid;width: 100%;grid-auto-flow: column;gap: 1rem} .detail-panel-row.row-label-invoice .row-label{width:100px;min-width:100px} .detail-panel-row.row-label-tight .row-label{width:150px;min-width:150px;font-size:14px;--tw-text-opacity: 1;color: rgb(114 114 114 / var(--tw-text-opacity))} .detail-panel-row.row-label-tight .row-value{font-weight:400;font-size:14px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .detail-panel-row .row-label { font-size: 12px; line-height: 16px; font-weight: 400; --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .detail-panel-row.row-label-normal-word-break .row-label{word-break:normal} .detail-panel-row .row-value{font-weight:400;font-size:12px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .tabbed-key-value-table { display: flex; flex-direction: column; border-radius: 0.25rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .tabbed-key-value-row { display: flex; width: 100%; flex-direction: row; align-items: center; border-bottom-width: 1px; border-color: rgba(0, 0, 0, 0.05);; padding-left: 1.5rem; padding-right: 1.5rem; padding-top: 0.75rem; padding-bottom: 0.75rem; } .tabbed-key-value-row .row-label{font-size:12px;width:250px;min-width:200px;padding-right:24px;word-break:break-all;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;--tw-text-opacity: 1;color: rgb(87 87 87 / var(--tw-text-opacity))} .tabbed-key-value-row .row-value{font-weight:400;font-size:12px;word-break:break-all;--tw-text-opacity: 1;color: rgb(48 48 48 / var(--tw-text-opacity))} .table-bulk-action-row{display:flex;flex-direction:row;height:62px;margin-bottom:16px;align-items:center;font-weight:500;border-radius:4px;font-size:13px;margin-left:-16px;margin-right:-16px;padding-left:16px;padding-right:16px;--tw-bg-opacity: 1;background-color: rgb(240 248 250 / var(--tw-bg-opacity))} .table-bulk-action-row .bulk-actions{margin-left:16px} .table-bulk-action-row .bulk-actions .btn-disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); --tw-text-opacity: 1; color: rgb(247 247 246 / var(--tw-text-opacity)); } .table-bulk-action-row .bulk-actions button{width:67px;font-weight:500;font-size:12px;line-height:16px;padding:6px 0;border-radius:4px;--tw-bg-opacity: 1;background-color: rgb(47 152 174 / var(--tw-bg-opacity));--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .table-bulk-action-row .bulk-actions button:not(:first-child){margin-left:6px} .table-bulk-action-row .bulk-actions button:hover{cursor:pointer;text-decoration:none;--tw-text-opacity: 1;color: rgb(247 247 246 / var(--tw-text-opacity))} .table-bulk-action-row .btn-select-everything{margin-left:16px} .table-borderless td{border:none} .table-borderless td:first-child{font-weight:bold;width:20%} .table-marginless{margin:0 !important} .table-csv-container{max-height:20rem;overflow-x:scroll;overflow-y:scroll;white-space:nowrap;width:70rem;max-width:70rem} .table-csv-container .index-table .index-table-row .table-entry{min-width:200px} .table-permissions .text-with-dropdown-line-height{padding:16px 0;line-height:38px} .table-permissions .no-border{border-bottom:0 !important;border-top:0 !important} .table-permissions .table-body .table-entry{padding:8px 0} .table-permissions .index-table-row .table-entry:first-child{max-width:none} .table-permissions .index-table-row .table-entry:last-child{min-width:max-content} .webhook-view-events{padding-bottom:10px} .webhook-view-events .header{font-weight:bold} .webhook-view-events .events{padding-left:10px} .webhook-view-events .events .event{padding-left:5px} .webhook-view-events:last-child{padding-bottom:0} input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;appearance:none;margin:0} input[type=number]{-webkit-appearance:none;appearance:none} .react-select-container { min-width: 180px; padding: 0px; font-size: 14px; line-height: 20px; font-weight: 400; } .react-select-container .react-select__placeholder { color: var(--text-default); } .react-select-container .react-select__control--is-focused .react-select__placeholder { color: var(--text-hover); } .react-select-container .react-select__value-container { margin-top: -1px; margin-bottom: -1px; height: 2rem; padding-top: 0px; padding-bottom: 0px; } .react-select-container .react-select__value-container.react-select__value-container--is-multi { margin-top: 0px; margin-bottom: 0px; height: 100%; padding-top: 1px; padding-bottom: 1px; } .react-select-container .react-select__value-container.react-select__value-container--has-value { border-color: var(--border-default); padding-left: 0.5rem; } .react-select-container .react-select__value-container.react-select__value-container--has-value .react-select__single-value { font-size: 14px; line-height: 20px; color: var(--text-default); } .react-select-container .react-select__value-container.react-select__value-container--has-value .react-select__single-value--is-disabled { color: var(--text-muted); } .react-select-container .react-select__clear-indicator { display: flex; align-items: center; justify-content: center; padding: 0px; } .react-select-container .react-select__clear-indicator svg path { fill: currentColor; } .react-select-container .react-select__indicator.react-select__dropdown-indicator { padding: 0px; padding-right: 0.25rem; } .react-select-container .react-select__group-heading { font-size: 12px; line-height: 16px; font-weight: 500; } .react-select-container .react-select__menu .react-select__option { border-radius: 0.125rem; font-size: 14px; line-height: 20px;width:calc(100% - 4px); } .react-select__control { min-height: 0px; border-radius: 0.125rem; border-width: 1px; border-color: rgba(0, 0, 0, 0.12);; min-height: 2rem; } .react-select__control.react-select__control--is-hovered { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .react-select__control.react-select__control--is-focused { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); text-decoration-line: none; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); outline: 2px solid transparent; outline-offset: 2px; } .react-select__control.react-select__control--is-disabled { pointer-events: auto; cursor: not-allowed; --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } .react-select__control.react-select__control--is-disabled:hover { --tw-border-opacity: 1; border-color: rgb(242 241 237 / var(--tw-border-opacity)); } .react-select__control.react-select__control--is-disabled .react-select__placeholder { --tw-text-opacity: 1; color: rgb(170 169 164 / var(--tw-text-opacity)); } .react-select__control .react-select__single-value { color: var(--text-default); } .react-select__control.react-select__single-value--is-disabled { color: var(--text-muted); } .placeholder:!text-gray-600::placeholder { --tw-text-opacity: 1 !important; color: rgb(87 87 87 / var(--tw-text-opacity)) !important; } .first:mt-0:first-child { margin-top: 0px; } .first:rounded-l:first-child { border-top-left-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .first:pt-0:first-child { padding-top: 0px; } .last:mb-0:last-child { margin-bottom: 0px; } .last:rounded-b:last-child { border-bottom-right-radius: 0.25rem; border-bottom-left-radius: 0.25rem; } .last:rounded-r:last-child { border-top-right-radius: 0.25rem; border-bottom-right-radius: 0.25rem; } .last:border-0:last-child { border-width: 0px; } .last:border-b-0:last-child { border-bottom-width: 0px; } .last:pb-0:last-child { padding-bottom: 0px; } .checked:border-blue-600:checked { --tw-border-opacity: 1; border-color: rgb(44 88 143 / var(--tw-border-opacity)); } .checked:border-checkbox-border:checked { border-color: var(--checkbox-border); } .checked:border-opacity-30:checked { --tw-border-opacity: 0.3; } .checked:bg-background-light:checked { background-color: var(--background-light); } .checked:bg-blue-500:checked { --tw-bg-opacity: 1; background-color: rgb(56 111 177 / var(--tw-bg-opacity)); } .focus-within:border-blue-500:focus-within { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus-within:outline-none:focus-within { outline: 2px solid transparent; outline-offset: 2px; } .hover:-translate-y-px:hover { --tw-translate-y: -1px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .hover:animate-none:hover { animation: none; } .hover:cursor-pointer:hover { cursor: pointer; } .hover:rounded:hover { border-radius: 0.25rem; } .hover:border:hover { border-width: 1px; } .hover:border-[#1BA778]:hover { --tw-border-opacity: 1; border-color: rgb(27 167 120 / var(--tw-border-opacity)); } .hover:border-[#BEF264]:hover { --tw-border-opacity: 1; border-color: rgb(190 242 100 / var(--tw-border-opacity)); } .hover:border-blue-700:hover { --tw-border-opacity: 1; border-color: rgb(32 69 113 / var(--tw-border-opacity)); } .hover:border-gray-100:hover { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .hover:border-gray-200:hover { --tw-border-opacity: 1; border-color: rgb(197 196 191 / var(--tw-border-opacity)); } .hover:border-gray-300:hover { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .hover:border-green-200:hover { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .hover:border-green-300:hover { --tw-border-opacity: 1; border-color: rgb(113 182 154 / var(--tw-border-opacity)); } .hover:border-purple-700:hover { --tw-border-opacity: 1; border-color: rgb(66 59 114 / var(--tw-border-opacity)); } .hover:border-red-300:hover { --tw-border-opacity: 1; border-color: rgb(252 132 146 / var(--tw-border-opacity)); } .hover:border-red-500:hover { --tw-border-opacity: 1; border-color: rgb(199 61 79 / var(--tw-border-opacity)); } .hover:border-red-600:hover { --tw-border-opacity: 1; border-color: rgb(159 41 70 / var(--tw-border-opacity)); } .hover:border-red-700:hover { --tw-border-opacity: 1; border-color: rgb(124 27 61 / var(--tw-border-opacity)); } .hover:!bg-button-background-disabled:hover { background-color: var(--button-background-disabled) !important; } .hover:!bg-transparent:hover { background-color: transparent !important; } .hover:!bg-white:hover { --tw-bg-opacity: 1 !important; background-color: rgb(255 255 255 / var(--tw-bg-opacity)) !important; } .hover:bg-[#1BA778]:hover { --tw-bg-opacity: 1; background-color: rgb(27 167 120 / var(--tw-bg-opacity)); } .hover:bg-[#D9F99D]:hover { --tw-bg-opacity: 1; background-color: rgb(217 249 157 / var(--tw-bg-opacity)); } .hover:bg-[#FAFAF9]:hover { --tw-bg-opacity: 1; background-color: rgb(250 250 249 / var(--tw-bg-opacity)); } .hover:bg-alpha-white-200:hover { background-color: rgba(255, 255, 255, 0.20);; } .hover:bg-background-light:hover { background-color: var(--background-light); } .hover:bg-blue-600:hover { --tw-bg-opacity: 1; background-color: rgb(44 88 143 / var(--tw-bg-opacity)); } .hover:bg-button-background-default:hover { background-color: var(--button-background-default); } .hover:bg-gray-100:hover { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .hover:bg-gray-25:hover { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .hover:bg-gray-50:hover { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .hover:bg-gray-600:hover { --tw-bg-opacity: 1; background-color: rgb(87 87 87 / var(--tw-bg-opacity)); } .hover:bg-gray-800:hover { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .hover:bg-green-100:hover { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .hover:bg-green-500:hover { --tw-bg-opacity: 1; background-color: rgb(0 128 96 / var(--tw-bg-opacity)); } .hover:bg-mist-700:hover { --tw-bg-opacity: 1; background-color: rgb(48 74 74 / var(--tw-bg-opacity)); } .hover:bg-purple-600:hover { --tw-bg-opacity: 1; background-color: rgb(87 78 146 / var(--tw-bg-opacity)); } .hover:bg-red-100:hover { --tw-bg-opacity: 1; background-color: rgb(255 206 211 / var(--tw-bg-opacity)); } .hover:bg-red-600:hover { --tw-bg-opacity: 1; background-color: rgb(159 41 70 / var(--tw-bg-opacity)); } .hover:bg-transparent:hover { background-color: transparent; } .hover:text-blue-500:hover { --tw-text-opacity: 1; color: rgb(56 111 177 / var(--tw-text-opacity)); } .hover:text-blue-600:hover { --tw-text-opacity: 1; color: rgb(44 88 143 / var(--tw-text-opacity)); } .hover:text-gray-100:hover { --tw-text-opacity: 1; color: rgb(222 221 215 / var(--tw-text-opacity)); } .hover:text-gray-500:hover { --tw-text-opacity: 1; color: rgb(114 114 114 / var(--tw-text-opacity)); } .hover:text-gray-600:hover { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .hover:text-gray-700:hover { --tw-text-opacity: 1; color: rgb(68 68 68 / var(--tw-text-opacity)); } .hover:text-gray-800:hover { --tw-text-opacity: 1; color: rgb(48 48 48 / var(--tw-text-opacity)); } .hover:text-gray-900:hover { --tw-text-opacity: 1; color: rgb(34 34 34 / var(--tw-text-opacity)); } .hover:text-green-100:hover { --tw-text-opacity: 1; color: rgb(190 230 213 / var(--tw-text-opacity)); } .hover:text-green-600:hover { --tw-text-opacity: 1; color: rgb(0 100 82 / var(--tw-text-opacity)); } .hover:text-green-800:hover { --tw-text-opacity: 1; color: rgb(19 58 51 / var(--tw-text-opacity)); } .hover:text-red-600:hover { --tw-text-opacity: 1; color: rgb(159 41 70 / var(--tw-text-opacity)); } .hover:text-text-default:hover { color: var(--text-default); } .hover:underline:hover { text-decoration-line: underline; } .hover:outline-none:hover { outline: 2px solid transparent; outline-offset: 2px; } .hover:outline:hover { outline-style: solid; } .hover:outline-alpha-black-100:hover { outline-color: rgba(0, 0, 0, 0.12);; } .focus:border-l:focus { border-left-width: 1px; } .focus:border-[#15806E]:focus { --tw-border-opacity: 1; border-color: rgb(21 128 110 / var(--tw-border-opacity)); } .focus:border-[#B2ECA1]:focus { --tw-border-opacity: 1; border-color: rgb(178 236 161 / var(--tw-border-opacity)); } .focus:border-blue-500:focus { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus:border-cyan-500:focus { --tw-border-opacity: 1; border-color: rgb(0 120 140 / var(--tw-border-opacity)); } .focus:border-green-100:focus { --tw-border-opacity: 1; border-color: rgb(190 230 213 / var(--tw-border-opacity)); } .focus:border-transparent:focus { border-color: transparent; } .focus:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; } .focus:ring-1:focus { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .focus:ring-2:focus { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } .focus:ring-blue-500:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(56 111 177 / var(--tw-ring-opacity)); } .focus:ring-offset-0:focus { --tw-ring-offset-width: 0px; } .focus-visible:border-blue-500:focus-visible { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .focus-visible:outline-none:focus-visible { outline: 2px solid transparent; outline-offset: 2px; } .focus-visible:ring:focus-visible { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); } @keyframes ping { 75%, 100% { transform: scale(2); opacity: 0; } } .active:animate-ping:active { animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; } .active:cursor-wait:active { cursor: wait; } .active:border-[#00554F]:active { --tw-border-opacity: 1; border-color: rgb(0 85 79 / var(--tw-border-opacity)); } .active:border-[#BEF264]:active { --tw-border-opacity: 1; border-color: rgb(190 242 100 / var(--tw-border-opacity)); } .active:border-blue-500:active { --tw-border-opacity: 1; border-color: rgb(56 111 177 / var(--tw-border-opacity)); } .active:border-blue-700:active { --tw-border-opacity: 1; border-color: rgb(32 69 113 / var(--tw-border-opacity)); } .active:border-gray-300:active { --tw-border-opacity: 1; border-color: rgb(170 169 164 / var(--tw-border-opacity)); } .active:border-gray-400:active { --tw-border-opacity: 1; border-color: rgb(138 137 133 / var(--tw-border-opacity)); } .active:border-green-200:active { --tw-border-opacity: 1; border-color: rgb(156 210 187 / var(--tw-border-opacity)); } .active:border-purple-700:active { --tw-border-opacity: 1; border-color: rgb(66 59 114 / var(--tw-border-opacity)); } .active:border-red-700:active { --tw-border-opacity: 1; border-color: rgb(124 27 61 / var(--tw-border-opacity)); } .active:!bg-button-background-disabled:active { background-color: var(--button-background-disabled) !important; } .active:bg-[#00554F]:active { --tw-bg-opacity: 1; background-color: rgb(0 85 79 / var(--tw-bg-opacity)); } .active:bg-[#BEF264]:active { --tw-bg-opacity: 1; background-color: rgb(190 242 100 / var(--tw-bg-opacity)); } .active:bg-alpha-white-50:active { background-color: rgba(255, 255, 255, 0.05);; } .active:bg-blue-700:active { --tw-bg-opacity: 1; background-color: rgb(32 69 113 / var(--tw-bg-opacity)); } .active:bg-gray-100:active { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .active:bg-gray-50:active { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .active:bg-gray-500:active { --tw-bg-opacity: 1; background-color: rgb(114 114 114 / var(--tw-bg-opacity)); } .active:bg-gray-700:active { --tw-bg-opacity: 1; background-color: rgb(68 68 68 / var(--tw-bg-opacity)); } .active:bg-gray-800:active { --tw-bg-opacity: 1; background-color: rgb(48 48 48 / var(--tw-bg-opacity)); } .active:bg-green-100:active { --tw-bg-opacity: 1; background-color: rgb(190 230 213 / var(--tw-bg-opacity)); } .active:bg-purple-700:active { --tw-bg-opacity: 1; background-color: rgb(66 59 114 / var(--tw-bg-opacity)); } .active:bg-red-700:active { --tw-bg-opacity: 1; background-color: rgb(124 27 61 / var(--tw-bg-opacity)); } .active:text-yellow-300:active { --tw-text-opacity: 1; color: rgb(232 164 66 / var(--tw-text-opacity)); } .active:outline-none:active { outline: 2px solid transparent; outline-offset: 2px; } .active:outline:active { outline-style: solid; } .active:outline-alpha-black-200:active { outline-color: rgba(0, 0, 0, 0.20);; } .disabled:cursor-not-allowed:disabled { cursor: not-allowed; } .disabled:border-alpha-black-200:disabled { border-color: rgba(0, 0, 0, 0.20);; } .disabled:border-gray-100:disabled { --tw-border-opacity: 1; border-color: rgb(222 221 215 / var(--tw-border-opacity)); } .disabled:bg-alpha-black-50:disabled { background-color: rgba(0, 0, 0, 0.05);; } .disabled:bg-button-background-disabled:disabled { background-color: var(--button-background-disabled); } .disabled:bg-gray-100:disabled { --tw-bg-opacity: 1; background-color: rgb(222 221 215 / var(--tw-bg-opacity)); } .disabled:bg-gray-25:disabled { --tw-bg-opacity: 1; background-color: rgb(247 247 246 / var(--tw-bg-opacity)); } .disabled:bg-gray-50:disabled { --tw-bg-opacity: 1; background-color: rgb(242 241 237 / var(--tw-bg-opacity)); } .disabled:text-gray-600:disabled { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .disabled:opacity-50:disabled { opacity: 0.5; } .disabled:checked:border-blue-300:checked:disabled { --tw-border-opacity: 1; border-color: rgb(118 171 245 / var(--tw-border-opacity)); } .disabled:checked:bg-blue-200:checked:disabled { --tw-bg-opacity: 1; background-color: rgb(167 200 255 / var(--tw-bg-opacity)); } .disabled:hover:text-gray-600:hover:disabled { --tw-text-opacity: 1; color: rgb(87 87 87 / var(--tw-text-opacity)); } .group:first-child .group-first:pt-2 { padding-top: 0.5rem; } .group:last-child .group-last:pb-2 { padding-bottom: 0.5rem; } .group:hover .group-hover:flex { display: flex; } .group:hover .group-hover:bg-blue-400 { --tw-bg-opacity: 1; background-color: rgb(73 141 224 / var(--tw-bg-opacity)); } .group:hover .group-hover:fill-white { fill: #FFFFFF; } .group:hover .group-hover:opacity-100 { opacity: 1; } @media (min-width: 640px) { .mint-sm:absolute { position: absolute; } .mint-sm:top-6 { top: 1.5rem; } .mint-sm:mt-8 { margin-top: 2rem; } .mint-sm:block { display: block; } .mint-sm:w-[416px] { width: 416px; } .mint-sm:w-[480px] { width: 480px; } .mint-sm:w-full { width: 100%; } .mint-sm:max-w-md { max-width: 28rem; } .mint-sm:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-sm:items-center { align-items: center; } .mint-sm:justify-items-start { justify-items: start; } .mint-sm:justify-self-start { justify-self: start; } .mint-sm:border-l { border-left-width: 1px; } .mint-sm:border-t-0 { border-top-width: 0px; } .mint-sm:p-6 { padding: 1.5rem; } .mint-sm:p-8 { padding: 2rem; } .mint-sm:px-6 { padding-left: 1.5rem; padding-right: 1.5rem; } .mint-sm:py-px { padding-top: 1px; padding-bottom: 1px; } .mint-sm:pl-4 { padding-left: 1rem; } .mint-sm:pr-4 { padding-right: 1rem; } .mint-sm:pt-0 { padding-top: 0px; } .mint-sm:pt-16 { padding-top: 4rem; } .mint-sm:text-left { text-align: left; } .mint-sm:text-base { font-size: 16px; line-height: 24px; } .mint-sm:text-xl { font-size: 24px; line-height: 32px; font-weight: 500; } } @media (min-width: 768px) { .mint-md:absolute { position: absolute; } .mint-md:left-12 { left: 3rem; } .mint-md:top-12 { top: 3rem; } .mint-md:order-1 { order: 1; } .mint-md:order-2 { order: 2; } .mint-md:col-span-2 { grid-column: span 2 / span 2; } .mint-md:col-span-4 { grid-column: span 4 / span 4; } .mint-md:mb-2 { margin-bottom: 0.5rem; } .mint-md:block { display: block; } .mint-md:grid { display: grid; } .mint-md:hidden { display: none; } .mint-md:h-7 { height: 1.75rem; } .mint-md:h-[51px] { height: 51px; } .mint-md:h-full { height: 100%; } .mint-md:h-screen { height: 100vh; } .mint-md:max-h-screen { max-height: 100vh; } .mint-md:min-h-screen { min-height: 100vh; } .mint-md:w-56 { width: 14rem; } .mint-md:w-7 { width: 1.75rem; } .mint-md:w-72 { width: 18rem; } .mint-md:w-[51px] { width: 51px; } .mint-md:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-md:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .mint-md:grid-cols-[max-content_auto] { grid-template-columns: max-content auto; } .mint-md:overflow-visible { overflow: visible; } .mint-md:p-12 { padding: 3rem; } .mint-md:p-6 { padding: 1.5rem; } .mint-md:p-8 { padding: 2rem; } .mint-md:px-0 { padding-left: 0px; padding-right: 0px; } .mint-md:px-1 { padding-left: 0.25rem; padding-right: 0.25rem; } .mint-md:px-1.5 { padding-left: 0.375rem; padding-right: 0.375rem; } .mint-md:px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } .mint-md:pl-0 { padding-left: 0px; } .mint-md:pt-4 { padding-top: 1rem; } .mint-md:text-4xl { font-size: 40px; line-height: 44px; letter-spacing: -0.5px; font-weight: 500; } .mint-md:opacity-0 { opacity: 0; } .mint-md:transition-none { transition-property: none; } .group:hover .mint-md:group-hover:opacity-100 { opacity: 1; } } @media (min-width: 1024px) { .mint-lg:right-14 { right: 3.5rem; } .mint-lg:top-12 { top: 3rem; } .mint-lg:col-span-12 { grid-column: span 12 / span 12; } .mint-lg:col-span-3 { grid-column: span 3 / span 3; } .mint-lg:col-span-4 { grid-column: span 4 / span 4; } .mint-lg:col-span-5 { grid-column: span 5 / span 5; } .mint-lg:col-span-6 { grid-column: span 6 / span 6; } .mint-lg:col-span-7 { grid-column: span 7 / span 7; } .mint-lg:col-start-1 { grid-column-start: 1; } .mint-lg:col-start-5 { grid-column-start: 5; } .mint-lg:col-end-13 { grid-column-end: 13; } .mint-lg:col-end-5 { grid-column-end: 5; } .mint-lg:mx-10 { margin-left: 2.5rem; margin-right: 2.5rem; } .mint-lg:mx-14 { margin-left: 3.5rem; margin-right: 3.5rem; } .mint-lg:ml-4 { margin-left: 1rem; } .mint-lg:mr-10 { margin-right: 2.5rem; } .mint-lg:mr-14 { margin-right: 3.5rem; } .mint-lg:mt-0 { margin-top: 0px; } .mint-lg:mt-14 { margin-top: 3.5rem; } .mint-lg:block { display: block; } .mint-lg:flex { display: flex; } .mint-lg:hidden { display: none; } .mint-lg:h-full { height: 100%; } .mint-lg:w-1/2 { width: 50%; } .mint-lg:w-6/12 { width: 50%; } .mint-lg:min-w-[586px] { min-width: 586px; } .mint-lg:max-w-md { max-width: 28rem; } .mint-lg:grid-flow-col-dense { grid-auto-flow: column dense; } .mint-lg:grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } .mint-lg:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-lg:grid-cols-[3fr_1fr] { grid-template-columns: 3fr 1fr; } .mint-lg:flex-row { flex-direction: row; } .mint-lg:divide-x > :not([hidden]) ~ :not([hidden]) { --tw-divide-x-reverse: 0; border-right-width: calc(1px * var(--tw-divide-x-reverse)); border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse))); } .mint-lg:justify-self-end { justify-self: end; } .mint-lg:p-0 { padding: 0px; } .mint-lg:p-12 { padding: 3rem; } .mint-lg:py-6 { padding-top: 1.5rem; padding-bottom: 1.5rem; } .mint-lg:pl-16 { padding-left: 4rem; } .mint-lg:pr-32 { padding-right: 8rem; } } @media (min-width: 1280px) { .mint-xl:w-1/2 { width: 50%; } .mint-xl:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .mint-xl:grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .mint-xl:grid-cols-[2fr_1fr] { grid-template-columns: 2fr 1fr; } .mint-xl:flex-nowrap { flex-wrap: nowrap; } }

/# sourceMappingURL=109-c113f255.css.map/

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/androidCustomCSS.css

Start of /mnt/data/jocal3--U/jocal3--U/android/generate-theme.js

#!/usr/bin/env node 'use strict';

var fs = require('fs'), xml2js = require('xml2js'); var builder = new xml2js.Builder();

// Color resources files var colorFileLight = require('path').join(__dirname, 'app/src/main/res/values/colors.xml'); var colorFileDark = require('path').join(__dirname, 'app/src/main/res/values-night/colors.xml');

// Check argument length if (process.argv.length != 21) { console.log('Incomplete args - ' + process.argv.length + '/20'); showHelp(); }

// LIGHT theme color defaults

var LIGHT_DEFAULT_ACTIONBAR_COLOR = 'ffffff'; var LIGHT_DEFAULT_STATUSBAR_COLOR = '757575'; var LIGHT_DEFAULT_TITLE_COLOR = '000000'; var LIGHT_DEFAULT_ACCENT_COLOR = '009688'; var LIGHT_DEFAULT_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_SIDEBAR_FOREGROUND_COLOR = '1e4963'; var LIGHT_DEFAULT_SIDEBAR_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_SIDEBAR_SEPARATOR_COLOR = '30808080'; var LIGHT_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR = '1e496e'; var LIGHT_DEFAULT_TAB_BAR_BACKGROUND_COLOR = 'ffffff'; var LIGHT_DEFAULT_TAB_BAR_TEXT_COLOR = '949494'; var LIGHT_DEFAULT_TAB_BAR_INDICATOR_COLOR = '1e496e'; var LIGHT_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR = 'fafafa'; var LIGHT_DEFAULT_SWIPE_NAV_INACTIVE_COLOR = '888888'; var LIGHT_DEFAULT_SWIPE_NAV_ACTIVE_COLOR = '1e88e5'; var LIGHT_DEFAULT_PULL_TO_REFRESH_COLOR = '1e496e'; var LIGHT_DEFAULT_SPLASH_BACKGROUND_COLOR = "1e496e"; var LIGHT_DEFAULT_PROGRESS_INDICATOR_COLOR = "757575";

// DARK theme color defaults

var DARK_DEFAULT_ACTIONBAR_COLOR = '212121'; var DARK_DEFAULT_STATUSBAR_COLOR = '030303'; var DARK_DEFAULT_TITLE_COLOR = 'ffffff'; var DARK_DEFAULT_ACCENT_COLOR = '80cbc4'; var DARK_DEFAULT_BACKGROUND_COLOR = '444444'; var DARK_DEFAULT_SIDEBAR_FOREGROUND_COLOR = 'ffffff'; var DARK_DEFAULT_SIDEBAR_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_SIDEBAR_SEPARATOR_COLOR = '30ffffff'; var DARK_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR = 'ffffff'; var DARK_DEFAULT_TAB_BAR_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_TAB_BAR_TEXT_COLOR = 'ffffff'; var DARK_DEFAULT_TAB_BAR_INDICATOR_COLOR = '666666'; var DARK_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR = '666666'; var DARK_DEFAULT_SWIPE_NAV_INACTIVE_COLOR = '888888'; var DARK_DEFAULT_SWIPE_NAV_ACTIVE_COLOR = 'ffffff'; var DARK_DEFAULT_PULL_TO_REFRESH_COLOR = 'ffffff'; var DARK_DEFAULT_SPLASH_BACKGROUND_COLOR = '333333'; var DARK_DEFAULT_PROGRESS_INDICATOR_COLOR = "757575";

// Handle args // Theme var theme = process.argv[2];

// Actionbar args var actionBarColor = process.argv[3].toLowerCase(); var statusBarColor = process.argv[4].toLowerCase(); var titleColor = process.argv[5].toLowerCase(); var accentColor = process.argv[6].toLowerCase(); var backgroundColor = process.argv[7].toLowerCase();

// Sidebar args var sideBarForegroundColor = process.argv[8].toLowerCase(); var sideBarBackgroundColor = process.argv[9].toLowerCase(); var sidebarSeparatorColor = process.argv[10].toLowerCase(); var sidebarHighlightColor = process.argv[11].toLowerCase();

// TabBar args var tabBarBackground = process.argv[12].toLowerCase(); var tabBarTextColor = process.argv[13].toLowerCase(); var tabBarIndicatorColor = process.argv[14].toLowerCase();

// Swipe args var swipeBackgroundColor = process.argv[15].toLowerCase(); var swipeInactiveColor = process.argv[16].toLowerCase(); var swipeActiveColor = process.argv[17].toLowerCase();

// Pull to Refresh args var pullToRefresh = process.argv[18].toLowerCase();

// Splash args var splashBackgroundColor = process.argv[19].toLowerCase();

// Progress indicator var progressIndicatorColor = process.argv[20].toLowerCase();

var defaultActionBarColor; var defaultStatusBarColor; var defaultTitleColor; var defaultAccentColor; var defaultBackgroundColor; var defaultSidebarForegroundColor; var defaultSidebarBackgroundColor; var defaultSidebarSeparatorColor; var defaultSidebarHighlightColor; var defaultTabBarBackgroundColor; var defaultTabBarTextColor; var defaultTabBarIndicatorColor; var defaultSwipeBackgroundColor; var defaultSwipeInactiveColor; var defaultSwipeActiveColor; var defaultPullToRefreshColor; var defaultSplashBackgroundColor; var defaultProgressIndicatorColor;

// Theme and default color values var writeDir; if (theme === 'light' || theme === 'auto') { writeDir = colorFileLight;

defaultActionBarColor = LIGHT_DEFAULT_ACTIONBAR_COLOR; defaultStatusBarColor= LIGHT_DEFAULT_STATUSBAR_COLOR; defaultTitleColor = LIGHT_DEFAULT_TITLE_COLOR; defaultAccentColor = LIGHT_DEFAULT_ACCENT_COLOR; defaultBackgroundColor = LIGHT_DEFAULT_BACKGROUND_COLOR; defaultSidebarForegroundColor = LIGHT_DEFAULT_SIDEBAR_FOREGROUND_COLOR; defaultSidebarBackgroundColor = LIGHT_DEFAULT_SIDEBAR_BACKGROUND_COLOR; defaultSidebarSeparatorColor = LIGHT_DEFAULT_SIDEBAR_SEPARATOR_COLOR; defaultSidebarHighlightColor = LIGHT_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR; defaultTabBarBackgroundColor = LIGHT_DEFAULT_TAB_BAR_BACKGROUND_COLOR; defaultTabBarTextColor = LIGHT_DEFAULT_TAB_BAR_TEXT_COLOR; defaultTabBarIndicatorColor = LIGHT_DEFAULT_TAB_BAR_INDICATOR_COLOR; defaultSwipeBackgroundColor = LIGHT_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR; defaultSwipeInactiveColor = LIGHT_DEFAULT_SWIPE_NAV_INACTIVE_COLOR; defaultSwipeActiveColor = LIGHT_DEFAULT_SWIPE_NAV_ACTIVE_COLOR; defaultPullToRefreshColor = LIGHT_DEFAULT_PULL_TO_REFRESH_COLOR; defaultSplashBackgroundColor = LIGHT_DEFAULT_SPLASH_BACKGROUND_COLOR; defaultProgressIndicatorColor = LIGHT_DEFAULT_PROGRESS_INDICATOR_COLOR;

} else if (theme === 'dark' || theme === 'light.darkactionbar') { writeDir = colorFileDark;

defaultActionBarColor = DARK_DEFAULT_ACTIONBAR_COLOR; defaultStatusBarColor= DARK_DEFAULT_STATUSBAR_COLOR; defaultTitleColor = DARK_DEFAULT_TITLE_COLOR; defaultAccentColor = DARK_DEFAULT_ACCENT_COLOR; defaultBackgroundColor = DARK_DEFAULT_BACKGROUND_COLOR; defaultSidebarForegroundColor = DARK_DEFAULT_SIDEBAR_FOREGROUND_COLOR; defaultSidebarBackgroundColor = DARK_DEFAULT_SIDEBAR_BACKGROUND_COLOR; defaultSidebarSeparatorColor = DARK_DEFAULT_SIDEBAR_SEPARATOR_COLOR; defaultSidebarHighlightColor = DARK_DEFAULT_SIDEBAR_HIGHLIGHT_COLOR; defaultTabBarBackgroundColor = DARK_DEFAULT_TAB_BAR_BACKGROUND_COLOR; defaultTabBarTextColor = DARK_DEFAULT_TAB_BAR_TEXT_COLOR; defaultTabBarIndicatorColor = DARK_DEFAULT_TAB_BAR_INDICATOR_COLOR; defaultSwipeBackgroundColor = DARK_DEFAULT_SWIPE_NAV_BACKGROUND_COLOR; defaultSwipeInactiveColor = DARK_DEFAULT_SWIPE_NAV_INACTIVE_COLOR; defaultSwipeActiveColor = DARK_DEFAULT_SWIPE_NAV_ACTIVE_COLOR; defaultPullToRefreshColor = DARK_DEFAULT_PULL_TO_REFRESH_COLOR; defaultSplashBackgroundColor = DARK_DEFAULT_SPLASH_BACKGROUND_COLOR; defaultProgressIndicatorColor = DARK_DEFAULT_PROGRESS_INDICATOR_COLOR;

} else { console.log('Invalid theme ' + theme); showHelp(); }

// Check if colors are valid checkColorRegex(actionBarColor, 'Invalid actionbar background color'); checkColorRegex(statusBarColor, 'Invalid status bar color'); checkColorRegex(titleColor, 'Invalid actionbar title color'); checkColorRegex(accentColor, 'Invalid accent color'); checkColorRegex(backgroundColor, 'Invalid background color'); checkColorRegex(sideBarForegroundColor, 'Invalid sidebar foreground color'); checkColorRegex(sideBarBackgroundColor, 'Invalid sidebar background color'); checkColorRegex(sidebarSeparatorColor, 'Invalid sidebar separator color'); checkColorRegex(sidebarHighlightColor, 'Invalid sidebar highlight color'); checkColorRegex(tabBarBackground, 'Invalid tab bar background color'); checkColorRegex(tabBarTextColor, 'Invalid tab bar text color'); checkColorRegex(tabBarIndicatorColor, 'Invalid tab bar indicator color'); checkColorRegex(swipeBackgroundColor, 'Invalid swipe nav background color'); checkColorRegex(swipeInactiveColor, 'Invalid swipe nav inactive color'); checkColorRegex(swipeActiveColor, 'Invalid swipe nav active color'); checkColorRegex(pullToRefresh, 'Invalid pullToRefresh color'); checkColorRegex(splashBackgroundColor, 'Invalid splash background color'); checkColorRegex(progressIndicatorColor, 'Invalid progress indicator color');

// Start generating colors var colorArray = [];

// Actionbar colors colorArray.push(createColorJSON('colorPrimary', actionBarColor, defaultActionBarColor)); colorArray.push(createColorJSON('statusBarBackground', statusBarColor, defaultStatusBarColor)); colorArray.push(createColorJSON('titleTextColor', titleColor, defaultTitleColor)); colorArray.push(createColorJSON('colorAccent', accentColor, defaultAccentColor)); colorArray.push(createColorJSON('colorBackground', backgroundColor, defaultBackgroundColor)); colorArray.push(createColorJSON('drawerArrow', titleColor, defaultTitleColor));

// Sidebar colors colorArray.push(createColorJSON('sidebarForeground', sideBarForegroundColor, defaultSidebarForegroundColor)); colorArray.push(createColorJSON('sidebarBackground', sideBarBackgroundColor, defaultSidebarBackgroundColor)); colorArray.push(createColorJSON('sidebarSeparatorColor', sidebarSeparatorColor, defaultSidebarSeparatorColor)); colorArray.push(createColorJSON('sidebarHighlight', sidebarHighlightColor, defaultSidebarHighlightColor));

// TabBar colors colorArray.push(createColorJSON('tabBarBackground', tabBarBackground, defaultTabBarBackgroundColor)); colorArray.push(createColorJSON('tabBarTextColor', tabBarTextColor, defaultTabBarTextColor)); colorArray.push(createColorJSON('tabBarIndicator', tabBarIndicatorColor, defaultTabBarIndicatorColor));

// Swipe colors colorArray.push(createColorJSON('swipe_nav_background', swipeBackgroundColor, defaultSwipeBackgroundColor)); colorArray.push(createColorJSON('swipe_nav_inactive', swipeInactiveColor, defaultSwipeInactiveColor)); colorArray.push(createColorJSON('swipe_nav_active', swipeActiveColor, defaultSwipeActiveColor));

// Pull to Refresh color colorArray.push(createColorJSON('pull_to_refresh_color', pullToRefresh, defaultPullToRefreshColor));

// Splash colors colorArray.push(createColorJSON('splash_background', splashBackgroundColor, defaultSplashBackgroundColor));

// Progress indicator color colorArray.push(createColorJSON('progress_indicator', progressIndicatorColor, defaultProgressIndicatorColor));

// Build colors in xml from JSON array of colors var xmlFinal = builder.buildObject({resources: colorArray});

// Write to file fs.writeFile(writeDir, xmlFinal, (err) => { if (err) console.log(err); else { console.log("File written successfully\n"); } });

// Helper functions

function showHelp() { console.log('Usage: generate-theme.js (dark|light|light.darkactionbar|auto) ' + 'actionBarColor statusBarColor titleColor accentColor backgroundColor ' + 'sidebarForegroundColor sidebarBackgroundColor sidebarSeparatorColor sidebarHighlightColor ' + 'tabBarBackgroundColor tabBarTextColor tabBarIndicatorColor ' + 'swipeBackgroundColor swipeInactiveColor swipeActiveColor pullToRefreshColor splashBackgroundColor activityIndicatorColor'); console.log('Example: generate-theme.js light dcdcdc 757575 000000 ff0000 ...'); console.log('Colors can be blank for default'); process.exit(1); }

function checkColorRegex(color, message) { if (color !== '' && !/^(([0-9a-f]){6}|([0-9a-f]){8})$/.test(color)) { console.log(message + ' ' + color); showHelp(); } }

// Creates a JSON object of color which will be then transformed to xml function createColorJSON(colorName, colorCode, defaultColor) { if (colorCode !== '') { return {color: {$: {name: colorName}, _: '#' + colorCode}}; } else { return {color: {$: {name: colorName}, _: '#' + defaultColor}}; } }

End of /mnt/data/jocal3--U/jocal3--U/android/generate-theme.js

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsResultBridge.java

package co.median.android;

public class JsResultBridge { public static String jsResult = ""; }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsResultBridge.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/AndroidManifest.xml

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/AndroidManifest.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/TestMethods.java

package com.median.testFiles; import android.webkit.WebView; import androidx.test.espresso.NoMatchingViewException; import androidx.test.espresso.PerformException; import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.web.webdriver.Locator; import androidx.test.uiautomator.UiDevice; import io.gonative.android.HelperClass; import org.json.JSONArray; import org.json.JSONException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Pattern; import static androidx.test.espresso.Espresso.onData; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.pressBackUnconditionally; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.pressImeActionButton; import static androidx.test.espresso.action.ViewActions.swipeDown; import static androidx.test.espresso.action.ViewActions.typeText; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withResourceName; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static androidx.test.espresso.web.assertion.WebViewAssertions.webMatches; import static androidx.test.espresso.web.sugar.Web.onWebView; import static androidx.test.espresso.web.webdriver.DriverAtoms.findElement; import static androidx.test.espresso.web.webdriver.DriverAtoms.getText; import static androidx.test.espresso.web.webdriver.DriverAtoms.webClick; import static org.hamcrest.Matchers.anything; import static org.hamcrest.Matchers.equalTo; import io.median.android.MainActivity; import io.median.android.R;

public class TestMethods {

public TestMethods(MainActivity mainActivity, WebView webView){
    m_mainActivity = mainActivity;
    m_webView = webView;
}

protected static String currentURL = "URL Not assigned yet";
protected static String prevURL = "URL Not assigned yet";
private final WebView m_webView;
private final MainActivity m_mainActivity;

private void m_UpdateCurrentURL() throws InterruptedException {
    m_mainActivity.runOnUiThread(() -> currentURL = m_webView.getOriginalUrl());
    Thread.sleep(1000);
}

protected int getNewLoad(){
    return HelperClass.newLoad;
}

public boolean isURL(String url){
    try {
        new URL(url);
        return true;
    }catch (MalformedURLException e){
        return false;
    }
}

public void waitForPageLoaded() throws InterruptedException {
    int counter = 0;
    while (getNewLoad() == 0) {
        if (counter >= 15) throw new RuntimeException("Page failed to load in less than 15 seconds.");
        Thread.sleep(1000);
        counter++;
    }
    m_UpdateCurrentURL();
    Thread.sleep(1000);
    counter = 0;
    while(currentURL == null && counter <= 10){
        Thread.sleep(1000);
        counter++;
        m_UpdateCurrentURL();
    }
    if(currentURL != null) HelperClass.newLoad = 0;
    else throw new RuntimeException("Current URL cannot be retrieved from the WebView.");
}

public void testNavigation(JSONArray sidebarObjects) throws InterruptedException, JSONException {
    for(int i = 0; i < sidebarObjects.length(); i++){
        onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
        onData(anything()).inAdapterView(withId(R.id.drawer_list)).atPosition(i).perform(click());
        waitForPageLoaded();
        String sidebarURL = sidebarObjects.getJSONObject(i).getString("url");
        if(!currentURL.matches(sidebarURL)) throw new RuntimeException("Sidebar Menu " + (i+1) + " did not load the designated URL - " + sidebarURL);
    }
}

public void testInternalvExternalLinks(UiDevice uiDevice) throws InterruptedException {
    m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative-test-web.web.app/"));
    waitForPageLoaded();
    onWebView().withElement(findElement(Locator.ID, "facebook_link")).perform(webClick());
    waitForPageLoaded();
    String dFacebook = uiDevice.getCurrentPackageName();

    if(dFacebook.contains("io.gonative.android")){
        uiDevice.pressBack();
        Thread.sleep(2000);
    }else throw new RuntimeException("Facebook link opened externally");

    onWebView().withElement(findElement(Locator.ID, "twitter_link")).perform(webClick());
    Thread.sleep(8000);
    String dTwitter = uiDevice.getCurrentPackageName();
    if(dTwitter.contains("io.gonative.android")) throw new RuntimeException("Twitter opened internally.");
    else {
        uiDevice.pressBack();
        Thread.sleep(1000);
    }
}

public void testRefreshButton() throws InterruptedException {
    onView(withId(R.id.action_refresh)).perform(click());
    waitForPageLoaded();
}

public void testSearchButton() throws InterruptedException {
    String query = "Gonative";
    onView(withId(R.id.action_search)).perform(click());
    Thread.sleep(1000);
    onView(withResourceName("search_src_text")).perform(typeText(query), pressImeActionButton());
    waitForPageLoaded();
    try{
        onWebView().withElement(findElement(Locator.ID, "search_param")).check(webMatches(getText(), equalTo(query)));
    }catch (Exception exception){
        throw new RuntimeException("Search button failed to load the results with query - " + query);
    }
    pressBackUnconditionally();
    Thread.sleep(2000);
}

public void m_testTabNavigation(HashMap<String, JSONArray> tabMenus, ArrayList<Pattern> tabMenuRegexes) throws JSONException, InterruptedException {
    while(!(currentURL.matches(tabMenuRegexes.get(0).pattern()))){
        m_mainActivity.runOnUiThread(() -> m_webView.loadUrl("https://gonative.io/about/"));
        waitForPageLoaded();
    }
    if (tabMenus.size() == 0) throw new RuntimeException("No Tab Menus Added.");
    else {
        for (Pattern p : tabMenuRegexes) {
            if (currentURL.matches(p.pattern())) {
                try {
                    for (String i : tabMenus.keySet()) {
                        for (int j = 0; j < tabMenus.get(i).length(); ) {
                            if (currentURL.matches(p.pattern())) {
                                if (isURL(tabMenus.get(i).getJSONObject(j).get("url").toString())) {
                                    Thread.sleep(1000);
                                    onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click());
                                    waitForPageLoaded();
                                    prevURL = currentURL;
                                    pressBackUnconditionally();
                                    waitForPageLoaded();
                                    String tabURL = tabMenus.get(i).getJSONObject(j).get("url").toString();
                                    if (!(prevURL.matches(tabURL))) throw new RuntimeException("Tab " + (j+1) + " could not load the designated URL - " + prevURL);
                                    j++;
                                    prevURL = currentURL;
                                } else {
                                    onView(withText(tabMenus.get(i).getJSONObject(j).get("label").toString())).perform(click());
                                    j++;
                                    Thread.sleep(2000);
                                }
                            }
                        }
                    }
                } catch (NoMatchingViewException | PerformException noMatchingViewException) {
                    throw new RuntimeException("Tab Menu not displayed in the desired regex: " + p.pattern());
                }
            } else{
                throw new RuntimeException("No Tab Menus found on the current page.");
            }
        }
    }
}

public void testPullToRefresh() throws InterruptedException {
    onView(withId(R.id.webview)).perform(swipeDown());
    waitForPageLoaded();
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/TestMethods.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customCSS.css

pre code.hljs { display: block; overflow-x: auto; padding: 1em } code.hljs { padding: 3px 5px } /*

Style with support for rainbow parens

*/ .hljs { background: #474949; color: #d1d9e1 } .hljs-comment, .hljs-quote { color: #969896; font-style: italic } .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-type, .hljs-addition { color: #cc99cc } .hljs-number, .hljs-selector-attr, .hljs-selector-pseudo { color: #f99157 } .hljs-string, .hljs-doctag, .hljs-regexp { color: #8abeb7 } .hljs-title, .hljs-name, .hljs-section, .hljs-built_in { color: #b5bd68 } .hljs-variable, .hljs-template-variable, .hljs-selector-id, .hljs-title.class_, .hljs-class .hljs-title { color: #ffcc66 } .hljs-section, .hljs-name, .hljs-strong { font-weight: bold } .hljs-symbol, .hljs-bullet, .hljs-subst, .hljs-meta, .hljs-link { color: #f99157 } .hljs-deletion { color: #dc322f } .hljs-formula { background: #eee8d5 } .hljs-attr, .hljs-attribute { color: #81a2be } .hljs-emphasis { font-style: italic } .ant-table-thead .ant-table-cell {

border-top-width: 1px !important;

border-bottom-width: 1px !important;

--tw-border-opacity: 1 !important;

border-color: rgb(242 241 237 / var(--tw-border-opacity)) !important;

--tw-bg-opacity: 1 !important;

background-color: rgb(247 247 246 / var(--tw-bg-opacity)) !important;

padding-top: 0.5rem !important;

padding-bottom: 0.5rem !important;

--tw-text-opacity: 1 !important;

color: rgb(68 68 68 / var(--tw-text-opacity)) !important

}

.ant-table-cell {

padding-left: 0.5rem !important;

padding-right: 0.5rem !important;

padding-top: 0.75rem !important;

padding-bottom: 0.75rem !important;

font-weight: 500 !important;

--tw-text-opacity: 1 !important;

color: rgb(0 0 0 / var(--tw-text-opacity)) !important

}

.ant-table-cell:first-child {

padding-left: 1.5rem !important

}

.ant-table-cell:last-child {

padding-right: 1.5rem !important

}

.ant-table-cell-with-append {

display: flex !important;

flex-direction: row !important;

gap: 0.25rem !important;

font-weight: 500 !important

}

.ant-table-row {

--tw-border-opacity: 1 !important;

border-color: rgb(247 247 246 / var(--tw-border-opacity)) !important

}

.ant-table-thead {

border-radius: 0.25rem !important

}

/* Remove divider between column headers */

.ant-table-cell::before {

display: none

}

/# sourceMappingURL=application-bac77ca0.css.map/

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customCSS.css

Start of /mnt/data/jocal3--U/jocal3--U/android/generate-plugin-icons.sh

#!/bin/sh

BASEDIR=$(dirname $0)

intercom notification icon

if [[ $1 == "intercom" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-mdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-hdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xhdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xxhdpi/intercom_push_icon.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/app/src/main/res/drawable-xxxhdpi/intercom_push_icon.png fi

cordial notification icon

if [[ $1 == "cordial" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/cordial/src/main/res/drawable-xxxhdpi/ic_notification.png fi

braze notification icon

if [[ $1 == "braze" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/braze/src/main/res/drawable-xxxhdpi/ic_notification.png fi

moengage notification icon

if [[ $1 == "moengage" ]] then cp $BASEDIR/app/src/main/res/drawable-mdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-mdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-hdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-hdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xxhdpi/ic_notification.png cp $BASEDIR/app/src/main/res/drawable-xxxhdpi/ic_notification.png $BASEDIR/plugins/moengage/src/main/res/drawable-xxxhdpi/ic_notification.png fi

End of /mnt/data/jocal3--U/jocal3--U/android/generate-plugin-icons.sh

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/DownloadService.java

package co.median.android;

import android.app.Service; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.webkit.MimeTypeMap; import android.widget.Toast;

import androidx.annotation.Nullable; import androidx.core.content.FileProvider;

import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.LeanUtils;

public class DownloadService extends Service {

private static final String TAG = "DownloadService";
private static final String EXTRA_DOWNLOAD_ID = "download_id";
private static final String ACTION_CANCEL_DOWNLOAD = "action_cancel_download";
private static final int BUFFER_SIZE = 4096;
private static final int timeout = 5; // in seconds
private final Handler handler = new Handler(Looper.getMainLooper());

private final Map<Integer, DownloadTask> downloadTasks = new HashMap<>();
private int downloadId = 0;
private String userAgent;

@Override
public void onCreate() {
    super.onCreate();
    AppConfig appConfig = AppConfig.getInstance(this);
    this.userAgent = appConfig.userAgent;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent.getAction().equals(ACTION_CANCEL_DOWNLOAD)) {
        int id = intent.getIntExtra(EXTRA_DOWNLOAD_ID, 0);
        cancelDownload(id);
    }
    return START_NOT_STICKY;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return new DownloadBinder();
}

public class DownloadBinder extends Binder {
    public DownloadService getService() {
        return DownloadService.this;
    }
}

public void startDownload(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, FileDownloader.DownloadLocation location) {
    DownloadTask downloadTask = new DownloadTask(url, filename, mimetype, shouldSaveToGallery, open, location);
    downloadTasks.put(downloadTask.getId(), downloadTask);
    downloadTask.startDownload();
}

public void cancelDownload(int downloadId) {
    DownloadTask downloadTask = downloadTasks.get(downloadId);
    if (downloadTask != null && downloadTask.isDownloading()) {
        downloadTask.cancelDownload();
    }
}

public void handleDownloadUri(FileDownloader.DownloadLocation location, Uri uri, String mimeType, boolean shouldSaveToGallery, boolean open, String filename) {
    if (uri == null) return;
    if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) {

        if (shouldSaveToGallery) {
            addFileToGallery(uri);
        }

        if (open) {
            viewFile(uri, mimeType);
        } else {
            handler.post(() -> {
                if (shouldSaveToGallery) {
                    Toast.makeText(this, R.string.file_download_finished_gallery, Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show();
                }
            });
        }
    } else {
        if (open) {
            viewFile(uri, mimeType);
        } else {
            handler.post(() -> Toast.makeText(this, String.format(this.getString(R.string.file_download_finished_with_name), filename), Toast.LENGTH_SHORT).show());
        }
    }
}

private void viewFile(Uri uri, String mimeType) {
    try {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, mimeType);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
    } catch (ActivityNotFoundException e) {
        String message = getResources().getString(R.string.file_handler_not_found);
        handler.post(() -> {
            Toast.makeText(this, message, Toast.LENGTH_LONG).show();
        });
    } catch (Exception ex) {
        GNLog.getInstance().logError(TAG, "viewFile: Exception:", ex);
    }
}

private void addFileToGallery(Uri uri) {
    Log.d(TAG, "addFileToGallery: Adding to Albums . . .");
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    mediaScanIntent.setData(uri);
    sendBroadcast(mediaScanIntent);
}

private class DownloadTask {
    private final int id;
    private final String url;
    private boolean isDownloading;
    private HttpURLConnection connection;
    private InputStream inputStream;
    private FileOutputStream outputStream;
    private File outputFile = null;
    private Uri downloadUri;
    private String filename;
    private String extension;
    private String mimetype;
    private boolean saveToGallery;
    private boolean openOnFinish;
    private final FileDownloader.DownloadLocation location;

    public DownloadTask(String url, String filename, String mimetype, boolean saveToGallery, boolean open, FileDownloader.DownloadLocation location) {
        this.id = downloadId++;
        this.url = url;
        this.filename = filename;
        this.mimetype = mimetype;
        this.isDownloading = false;
        this.saveToGallery = saveToGallery;
        this.openOnFinish = open;
        this.location = location;
    }

    public int getId() {
        return id;
    }

    public boolean isDownloading() {
        return isDownloading;
    }

    public void startDownload() {
        Log.d(TAG, "startDownload: Starting download");
        isDownloading = true;
        AtomicReference<String> finalFilename = new AtomicReference<>("");
        new Thread(() -> {
            Log.d(TAG, "startDownload: Thread started");
            try {
                URL downloadUrl = new URL(url);
                connection = (HttpURLConnection) downloadUrl.openConnection();
                connection.setInstanceFollowRedirects(true);
                connection.setRequestProperty("User-Agent", userAgent);
                connection.setConnectTimeout(timeout * 1000);
                connection.connect();

                if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                    GNLog.getInstance().logError(TAG, "Server returned HTTP " + connection.getResponseCode()
                            + " " + connection.getResponseMessage());
                    isDownloading = false;
                    return;
                }

                double fileSizeInMB = connection.getContentLength() / 1048576.0;
                Log.d(TAG, "startDownload: File size in MB: " + fileSizeInMB);

                if (connection.getHeaderField("Content-Type") != null)
                    mimetype = connection.getHeaderField("Content-Type");

                if (!TextUtils.isEmpty(filename)) {
                   extension = FileDownloader.getFilenameExtension(filename);
                   if (TextUtils.isEmpty(extension)) {
                       extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype);
                   } else if (Objects.equals(filename, extension)) {
                       filename = "download";
                   } else {
                       filename = filename.substring(0, filename.length() - (extension.length() + 1));
                       mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                   }
                } else {
                    // guess file name and extension
                    String guessedName = LeanUtils.guessFileName(url,
                            connection.getHeaderField("Content-Disposition"),
                            mimetype);
                    int pos = guessedName.lastIndexOf('.');

                    if (pos == -1) {
                        filename = guessedName;
                        extension = "";
                    } else if (pos == 0) {
                        filename = "download";
                        extension = guessedName.substring(1);
                    } else {
                        filename = guessedName.substring(0, pos);
                        extension = guessedName.substring(pos + 1);
                    }

                    if (!TextUtils.isEmpty(extension)) {
                        // Update mimetype based on final filename extension
                        mimetype = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                    }
                }

                if (location == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) {
                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
                        ContentResolver contentResolver = getApplicationContext().getContentResolver();
                        if (saveToGallery && mimetype.contains("image")) {
                            downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_PICTURES);
                        } else {
                            downloadUri = FileDownloader.createExternalFileUri(contentResolver, filename, mimetype, Environment.DIRECTORY_DOWNLOADS);
                            saveToGallery = false;
                        }
                        if (downloadUri != null) {
                            finalFilename.set(FileDownloader.getFileNameFromUri(downloadUri, contentResolver));
                            outputStream = (FileOutputStream) contentResolver.openOutputStream(downloadUri);
                        } else {
                            isDownloading = false;
                            handler.post(() -> {
                                Toast.makeText(DownloadService.this, getString(R.string.file_download_error), Toast.LENGTH_SHORT).show();
                            });
                            GNLog.getInstance().logError(TAG, "Error creating file - " +
                                    "filename: " + filename + ", " +
                                    "mimetype: " + mimetype);
                            return;
                        }
                    } else {
                        if (saveToGallery) {
                            outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), filename, extension);
                        } else {
                            outputFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), filename, extension);
                        }
                        finalFilename.set(outputFile.getName());
                        outputStream = new FileOutputStream(outputFile);
                    }
                } else {
                    this.openOnFinish = true;
                    outputFile = FileDownloader.createOutputFile(getFilesDir(), filename, extension);
                    finalFilename.set(outputFile.getName());
                    outputStream = new FileOutputStream(outputFile);
                }
                int fileLength = connection.getContentLength();
                inputStream = connection.getInputStream();

                byte[] buffer = new byte[BUFFER_SIZE];
                int bytesRead;
                int bytesDownloaded = 0;

                while ((bytesRead = inputStream.read(buffer)) != -1 && isDownloading) {
                    outputStream.write(buffer, 0, bytesRead);
                    bytesDownloaded += bytesRead;
                    int progress = (int) (bytesDownloaded * 100 / fileLength);
                    Log.d(TAG, "startDownload: Download progress: " + progress);
                }
                if (!isDownloading && outputFile != null) {
                    outputFile.delete();
                    outputFile = null;
                }
            } catch (IOException e) {
                GNLog.getInstance().logError(TAG, "startDownload: ", e);
            } finally {
                try {
                    if (inputStream != null) inputStream.close();
                    if (outputStream != null) outputStream.close();
                    if (connection != null) connection.disconnect();
                } catch (IOException e) {
                    GNLog.getInstance().logError(TAG, "startDownload: ", e);
                }
                isDownloading = false;
                if (downloadUri == null && outputFile != null) {
                    downloadUri = FileProvider.getUriForFile(DownloadService.this, DownloadService.this.getApplicationContext().getPackageName() + ".fileprovider", outputFile);
                }
                handleDownloadUri(location, downloadUri, mimetype, saveToGallery, openOnFinish, finalFilename.get());
            }
        }).start();
    }

    public void cancelDownload() {
        isDownloading = false;
        Toast.makeText(DownloadService.this, getString(R.string.download_canceled) + " " + filename, Toast.LENGTH_SHORT).show();
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/DownloadService.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java

package com.median.testFiles;

import android.webkit.WebView; import androidx.test.ext.junit.rules.ActivityScenarioRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.LargeTest; import androidx.test.filters.SdkSuppress; import androidx.test.uiautomator.UiDevice; import org.json.JSONException; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import io.median.android.MainActivity; import io.median.android.R; import io.median.median_core.AppConfig; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

@RunWith(AndroidJUnit4.class) @SdkSuppress(minSdkVersion = 18) @LargeTest public class FirstTestClass{ TestMethods testMethods; AppConfig appConfig; WebView webView; private UiDevice uiDevice;

@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule = new ActivityScenarioRule<>(MainActivity.class);

@Before
public void initMethod() throws InterruptedException {
    for(int i = 0; i < 10; i++){
        try{
            uiDevice = UiDevice.getInstance(getInstrumentation());
        }catch (RuntimeException runtimeException){
            Thread.sleep(2000);
            continue;
        }
        Thread.sleep(1000);
        break;
    }
    activityScenarioRule.getScenario().onActivity(activity -> {
        appConfig = AppConfig.getInstance(activity);
        webView = activity.findViewById(R.id.webview);
        testMethods = new TestMethods(activity, webView);
    });
}

//Sidebar Navigation Test
@Test
public void testSidebarNavigation() throws InterruptedException, JSONException {
    if(appConfig.showNavigationMenu && (appConfig.menus.get("default") != null)){
        if(appConfig.menus.get("default") == null) throw new RuntimeException("Navigation drawer list not found.");
        else {
            testMethods.waitForPageLoaded();
            testMethods.testNavigation(appConfig.menus.get("default"));
        }
    }
}

//Tab Menu Navigation Test
@Test
public void testTabMenuNavigation() throws JSONException, InterruptedException {
    if(appConfig.tabMenuRegexes.size() == 0) throw new RuntimeException("No Tab Menus found.");
    else{
        testMethods.waitForPageLoaded();
        testMethods.m_testTabNavigation(appConfig.tabMenus, appConfig.tabMenuRegexes);
    }
}

//Internal vs External Links Test
@Test
public void testIvE() throws InterruptedException {
    testMethods.waitForPageLoaded();
    testMethods.testInternalvExternalLinks(uiDevice);
}

//Pull to Refresh Test
@Test
public void pullToRefresh() throws InterruptedException {
    if(appConfig.pullToRefresh){
        testMethods.waitForPageLoaded();
        testMethods.testPullToRefresh();
    }
}

//Search Button Test
@Test
public void testSearch() throws InterruptedException {
    if(appConfig.searchTemplateUrl != null && !appConfig.searchTemplateUrl.isEmpty()){
        testMethods.waitForPageLoaded();
        testMethods.testSearchButton();
    }
}

//Refresh Button Test
@Test
public void testRefreshButton() throws InterruptedException {
    if(appConfig.showRefreshButton){
        testMethods.waitForPageLoaded();
        testMethods.testRefreshButton();
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/androidTest/java/com/median/testFiles/FirstTestClass.java

Start of /mnt/data/jocal3--U/jocal3--U/android/gradle.properties

org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m android.enableJetifier=true android.useAndroidX=true enableLogsInRelease=false android.nonTransitiveRClass=false android.nonFinalResIds=false

End of /mnt/data/jocal3--U/jocal3--U/android/gradle.properties

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/RegistrationManager.java

package co.median.android;

import android.content.Context; import android.os.AsyncTask; import android.util.Log;

import org.json.JSONArray; import org.json.JSONObject;

import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.regex.Pattern;

import co.median.median_core.GNLog; import co.median.median_core.LeanUtils;

/**

  • Created by weiyin on 10/4/15. */ public class RegistrationManager { private final static String TAG = RegistrationManager.class.getName();

    private Context context; private JSONObject customData; private String lastUrl;

    private List registrationEndpoints;

    RegistrationManager(Context context) { this.context = context; this.registrationEndpoints = new LinkedList<>(); }

    public void processConfig(JSONArray endpoints) { registrationEndpoints.clear(); if (endpoints == null) return; for (int i = 0; i < endpoints.length(); i++) { JSONObject endpoint = endpoints.optJSONObject(i); if (endpoint == null) continue; String url = LeanUtils.optString(endpoint, "url"); if (url == null) { Log.w(TAG, "Invalid registration: endpoint url is null"); continue; } List

    public void checkUrl(String url) { this.lastUrl = url; for (RegistrationEndpoint endpoint : registrationEndpoints) { if (LeanUtils.stringMatchesAnyRegex(url, endpoint.urlRegexes)) { endpoint.sendRegistrationInfo(); } } }

    public void setCustomData(JSONObject customData) { this.customData = customData; registrationDataChanged(); }

    public void sendToAllEndpoints() { for (RegistrationEndpoint endpoint : registrationEndpoints) { endpoint.sendRegistrationInfo(); } }

    private void registrationDataChanged() { for (RegistrationEndpoint endpoint : registrationEndpoints) { if (this.lastUrl != null && LeanUtils.stringMatchesAnyRegex(this.lastUrl, endpoint.urlRegexes)) { endpoint.sendRegistrationInfo(); } } }

    public void subscriptionInfoChanged(){ registrationDataChanged(); }

    private class RegistrationEndpoint { private String postUrl; private List

    private static class SendRegistrationTask extends AsyncTask<Void,Void,Void> { private RegistrationEndpoint registrationEndpoint; private RegistrationManager registrationManager; private Context context; SendRegistrationTask(Context context, RegistrationEndpoint registrationEndpoint, RegistrationManager registrationManager) { this.registrationEndpoint = registrationEndpoint; this.registrationManager = registrationManager; this.context = context; } @Override protected Void doInBackground(Void... voids) { Map<String, Object> toSend = new HashMap<>(); toSend.putAll(Installation.getInfo(registrationManager.context)); // Append provider info to Map toSend if (((GoNativeApplication) context).getAnalyticsProviderInfo() != null) { toSend.putAll(((GoNativeApplication) context).getAnalyticsProviderInfo()); } if (registrationManager.customData != null) { Iterator keys = registrationManager.customData.keys(); while(keys.hasNext()) { String key = keys.next(); toSend.put("customData_" + key, registrationManager.customData.opt(key)); } } try { JSONObject json = new JSONObject(toSend); URL url = new URL(registrationEndpoint.postUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); writer.write(json.toString()); writer.close(); connection.connect(); int result = connection.getResponseCode(); if (result < 200 || result > 299) { Log.w(TAG, "Recevied status code " + result + " when posting to " + registrationEndpoint.postUrl); } } catch (Exception e) { GNLog.getInstance().logError(TAG, "Error posting to " + registrationEndpoint.postUrl, e); } return null; } }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/RegistrationManager.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeApplication.java

package co.median.android;

import android.content.ComponentCallbacks2; import android.os.Message; import android.widget.Toast;

import androidx.appcompat.app.AppCompatDelegate; import androidx.multidex.MultiDexApplication;

import java.util.List; import java.util.Map;

import co.median.median_core.AppConfig; import co.median.median_core.Bridge; import co.median.median_core.BridgeModule; import co.median.median_core.GNLog;

/**

  • Created by weiyin on 9/2/15.

  • Copyright 2014 GoNative.io LLC */ public class GoNativeApplication extends MultiDexApplication {

    private LoginManager loginManager; private RegistrationManager registrationManager; private WebViewPool webViewPool; private Message webviewMessage; private GoNativeWindowManager goNativeWindowManager; private List plugins; private final static String TAG = GoNativeApplication.class.getSimpleName(); public final Bridge mBridge = new Bridge(this) { @Override protected List getPlugins() { if (GoNativeApplication.this.plugins == null) { GoNativeApplication.this.plugins = new PackageList(GoNativeApplication.this).getPackages(); } return GoNativeApplication.this.plugins; } };

    private boolean appBackgrounded = false;

    @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); mBridge.onApplicationCreate(this); AppConfig appConfig = AppConfig.getInstance(this); if (appConfig.configError != null) { Toast.makeText(this, "Invalid appConfig json", Toast.LENGTH_LONG).show(); GNLog.getInstance().logError(TAG, "AppConfig error", appConfig.configError); } this.loginManager = new LoginManager(this); if (appConfig.registrationEndpoints != null) { this.registrationManager = new RegistrationManager(this); registrationManager.processConfig(appConfig.registrationEndpoints); } // some global webview setup WebViewSetup.setupWebviewGlobals(this); webViewPool = new WebViewPool(); goNativeWindowManager = new GoNativeWindowManager(); }

    public LoginManager getLoginManager() { return loginManager; }

    public RegistrationManager getRegistrationManager() { return registrationManager; }

    public WebViewPool getWebViewPool() { return webViewPool; }

    public Message getWebviewMessage() { return webviewMessage; }

    public void setWebviewMessage(Message webviewMessage) { this.webviewMessage = webviewMessage; }

    public Map<String, Object> getAnalyticsProviderInfo() { return mBridge.getAnalyticsProviderInfo(); }

    public GoNativeWindowManager getWindowManager() { return goNativeWindowManager; }

    @Override public void onTrimMemory(int level) { super.onTrimMemory(level); if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { // App has gone into the background setAppBackgrounded(true); } }

    public boolean isAppBackgrounded() { return appBackgrounded; }

    public void setAppBackgrounded(boolean appBackgrounded) { this.appBackgrounded = appBackgrounded; }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/GoNativeApplication.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/build.gradle

import groovy.json.JsonSlurper

apply plugin: 'com.android.application' apply plugin: 'kotlin-android' //[enabled by builder] apply plugin: 'com.google.gms.google-services' //[enabled by builder] apply plugin: 'com.google.firebase.crashlytics'

ext { fbAppId = "" fbClientToken = "" onesignalAppId = "" adMobAppId = "" googleServiceInvalid = "false" auth0Domain = "" auth0Scheme = "" }

task parseAppConfig { def jsonFile = file('src/main/assets/appConfig.json') def parsedJson = new JsonSlurper().parseText(jsonFile.text) if (parsedJson.services.facebook) { if (parsedJson.services.facebook.appId) { fbAppId = parsedJson.services.facebook.appId } if (parsedJson.services.facebook.clientToken) { fbClientToken = parsedJson.services.facebook.clientToken } } if (parsedJson.services.socialLogin && parsedJson.services.socialLogin.facebookLogin) { if (parsedJson.services.socialLogin.facebookLogin.appId) { fbAppId = parsedJson.services.socialLogin.facebookLogin.appId } if (parsedJson.services.socialLogin.facebookLogin.clientToken) { fbClientToken = parsedJson.services.socialLogin.facebookLogin.clientToken } } if (parsedJson.services.oneSignal && parsedJson.services.oneSignal.applicationId) { onesignalAppId = parsedJson.services.oneSignal.applicationId } if (parsedJson.services.admob && parsedJson.services.admob.admobAndroid && parsedJson.services.admob.admobAndroid.applicationId) { adMobAppId = parsedJson.services.admob.admobAndroid.applicationId } if (parsedJson.services.braze) { if (parsedJson.services.braze.androidApiKey) { gradle.ext.set("braze_api_key", parsedJson.services.braze.androidApiKey) } if (parsedJson.services.braze.androidEndpointKey) { gradle.ext.set("braze_endpoint_key", parsedJson.services.braze.androidEndpointKey) } } if (parsedJson.services.auth0) { if (parsedJson.services.auth0.domain) { auth0Domain = parsedJson.services.auth0.domain } if (parsedJson.services.auth0.scheme) { auth0Scheme = parsedJson.services.auth0.scheme } } }

task checkGoogleService { plugins.withId("com.google.gms.google-services") { def googleServiceJsonFile = file('google-services.json') if (project.file(googleServiceJsonFile).exists()) { if (googleServiceJsonFile.text.isEmpty()) { googleServiceInvalid = "true" } } else { googleServiceInvalid = "true" } } }

build.dependsOn parseAppConfig build.dependsOn checkGoogleService

android { defaultConfig { compileSdk 34 minSdkVersion 23 targetSdkVersion 34 applicationId "co.median.android.oyoloz" versionCode 8 multiDexEnabled true vectorDrawables.useSupportLibrary = true

    manifestPlaceholders = [manifestApplicationId: "${applicationId}",
                            onesignal_app_id: onesignalAppId,
                            onesignal_google_project_number: "",
                            admob_app_id: adMobAppId,
                            facebook_app_id: fbAppId,
                            facebook_client_token: fbClientToken,
                            auth0Domain: auth0Domain, auth0Scheme: auth0Scheme ]
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

signingConfigs {
    release {
        storeFile file("../../release.keystore")
        storePassword "password"
        keyAlias "release"
        keyPassword "password"
    }
    upload {
        storeFile file("../../upload.keystore")
        storePassword "password"
        keyAlias "upload"
        keyPassword "password"
    }
}

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        zipAlignEnabled true
        debuggable project.getProperties().get("enableLogsInRelease").toBoolean()
        signingConfig signingConfigs.release
    }
    upload {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
        zipAlignEnabled true
        matchingFallbacks = ['release']
        debuggable project.getProperties().get("enableLogsInRelease").toBoolean()
        signingConfig signingConfigs.upload
    }
    buildTypes.each {
        it.buildConfigField 'boolean', 'GOOGLE_SERVICE_INVALID', googleServiceInvalid
    }
}

flavorDimensions "webview"

productFlavors {
    normal {
        dimension "webview"
    }
}
namespace 'co.median.android'
testNamespace '${applicationId}.test'
buildFeatures {
    buildConfig true
}

}

dependencies { /**** dependencies used by all apps / implementation "androidx.core:core-ktx:1.12.0" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.squareup:seismic:1.0.2' implementation 'androidx.webkit:webkit:1.10.0' implementation 'androidx.core:core-splashscreen:1.0.1' implementation "com.github.gonativeio:gonative-icons:$iconsVersion" implementation "com.github.gonativeio:gonative-android-core:$coreVersion" / end all apps ****/

/**** add-on module dependencies ****/
/**** end modules ****/

/**** Google Android and Play Services dependencies ****/
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.browser:browser:1.7.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation "androidx.drawerlayout:drawerlayout:1.2.0"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
/**** end google ****/

/**** local dependencies ****/
implementation fileTree(dir: 'libs', include: '*.jar')
implementation fileTree(dir: 'libs', include: '*.aar')
/**** end local ****/

}

apply from: file("../plugins.gradle"); applyNativeModulesAppBuildGradle(project)

End of /mnt/data/jocal3--U/jocal3--U/android/app/build.gradle

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ActionManager.java

package co.median.android;

import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView;

import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.widget.LinearLayoutCompat; import androidx.appcompat.widget.SearchView; import androidx.core.content.ContextCompat; import androidx.drawerlayout.widget.DrawerLayout;

import com.google.android.material.appbar.MaterialToolbar;

import io.gonative.android.icons.Icon;

import org.json.JSONArray; import org.json.JSONObject;

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.regex.Pattern;

import co.median.median_core.AppConfig;

/**

  • Created by weiyin on 11/25/14.

  • Copyright 2014 GoNative.io LLC */ public class ActionManager { private static final String TAG = ActionManager.class.getName(); private static final String ACTION_SHARE = "share"; private static final String ACTION_REFRESH = "refresh"; private static final String ACTION_SEARCH = "search"; private static final int ACTIONBAR_ITEM_MARGIN = 132;

    private final MainActivity activity; private final HashMap<MenuItem, String>itemToUrl; private final int action_button_size; private final ActionBar actionBar; private final ImageView actionBarImageTitle; private final int colorForeground; private final int colorBackground; private boolean isRoot; private String currentMenuID; private LinearLayout header; private LinearLayoutCompat menuContainer; private RelativeLayout titleContainer; private boolean isOnSearchMode = false; private SearchView searchView;

    private int leftItemsCount = 0; private int rightItemsCount = 0;

    private String currentUrl;

    ActionManager(MainActivity activity) { this.activity = activity; this.itemToUrl = new HashMap<>(); this.action_button_size = this.activity.getResources().getInteger(R.integer.action_button_size); this.actionBar = activity.getSupportActionBar(); this.actionBarImageTitle = new ImageView(activity); this.actionBarImageTitle.setImageResource(R.drawable.ic_actionbar); this.colorForeground = activity.getResources().getColor(R.color.titleTextColor); this.colorBackground = activity.getResources().getColor(R.color.colorPrimary); }

    public void setupActionBar(boolean isRoot) { if (actionBar == null) return; this.isRoot = isRoot; AppConfig appConfig = AppConfig.getInstance(activity); // Change hamburger button to back arrow if window is not root if (!isRoot) { actionBar.setDisplayHomeAsUpEnabled(true); Drawable backArrow = ContextCompat.getDrawable(activity, R.drawable.abc_ic_ab_back_material); backArrow.setColorFilter(colorForeground, PorterDuff.Mode.SRC_ATOP); actionBar.setHomeAsUpIndicator(backArrow); } header = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.actionbar_title, null); // why use a custom view and not setDisplayUseLogoEnabled and setLogo? // Because logo doesn't work! actionBar.setDisplayShowCustomEnabled(true); actionBar.setDisplayShowTitleEnabled(false); actionBar.setCustomView(header); ActionBar.LayoutParams params = (ActionBar.LayoutParams) header.getLayoutParams(); params.width = ActionBar.LayoutParams.MATCH_PARENT; titleContainer = header.findViewById(R.id.title_container); menuContainer = header.findViewById(R.id.left_menu_container); ViewGroup.MarginLayoutParams titleContainerParams = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams(); titleContainerParams.rightMargin = ACTIONBAR_ITEM_MARGIN + 8; MaterialToolbar toolbar = activity.findViewById(R.id.toolbar); toolbar.setBackgroundColor(colorBackground); }

    public void setupTitleDisplayForUrl(String url) { if (actionBar == null || url == null) return; AppConfig appConfig = AppConfig.getInstance(activity); this.currentUrl = url; boolean urlHasNavTitle = false; boolean urlHasActionMenu = false; // Check for Nav title HashMap<String, Object> urlNavTitle = appConfig.getNavigationTitleForUrl(url); if (urlNavTitle != null) { urlHasNavTitle = true; } // Check for Action Menus ArrayList

    private void showLogoInActionBar(boolean show) { if (actionBar == null) return; if (show) { showTitleView(actionBarImageTitle); } else { // Show Text showTextActionBarTitle(activity.getTitle()); } }

    public void showTextActionBarTitle(CharSequence title) { TextView textView = new TextView(activity); textView.setText(TextUtils.isEmpty(title) ? activity.getTitle() : title); textView.setTextSize(18); textView.setTypeface(null, Typeface.BOLD); textView.setMaxLines(1); textView.setEllipsize(TextUtils.TruncateAt.END); textView.setTextColor(colorForeground); showTitleView(textView); }

    public void showTitleView(View titleView) { if (actionBar == null) return; if (titleView == null) return; LinearLayout header = (LinearLayout) actionBar.getCustomView(); if (header == null) return; // Remove Title Container child views if there is any titleContainer.removeAllViews(); // Remove Title View parent if there is any if (titleView.getParent() != null) { ((ViewGroup) titleView.getParent()).removeView(titleView); } titleContainer.addView(titleView); }

    public void checkActions(String url) { if (this.activity == null || url == null) return; AppConfig appConfig = AppConfig.getInstance(this.activity); ArrayList

    private void setMenuID(String menuID) { boolean changed; if (this.currentMenuID == null) { changed = menuID != null; } else { changed = menuID == null || !this.currentMenuID.equals(menuID); } if (changed) { this.currentMenuID = menuID; this.activity.invalidateOptionsMenu(); } }

    public void addActions(Menu menu) { this.itemToUrl.clear(); this.rightItemsCount = 0; this.leftItemsCount = 0; AppConfig appConfig = AppConfig.getInstance(this.activity); if (appConfig.actions == null) return; menuContainer.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; JSONArray actions = appConfig.actions.get(currentMenuID); if (actions == null || actions.length() == 0) { replaceLeftIcon(null); } else { if (actions.length() <= 2) { for (int itemID = 0; itemID < actions.length(); itemID++) { JSONObject entry = actions.optJSONObject(itemID); addRightButton(appConfig, menu, itemID, entry); } } else { for (int itemID = 0; itemID < actions.length(); itemID++) { JSONObject entry = actions.optJSONObject(itemID); if (itemID == 0) { addLeftButton(appConfig, entry); } else { addRightButton(appConfig, menu, itemID, entry); } } } } setupActionBarDisplay(); }

    private void addLeftButton(AppConfig appConfig, JSONObject entry) { if (entry == null) return; String system = AppConfig.optString(entry, "system"); String icon = AppConfig.optString(entry, "icon"); String url = AppConfig.optString(entry, "url"); if (!TextUtils.isEmpty(system)) { if (system.equalsIgnoreCase("refresh")) { if (TextUtils.isEmpty(icon)) { icon = "fa-rotate-right"; } Button refresh = createButtonMenu(icon); refresh.setOnClickListener(v -> this.activity.onRefresh()); replaceLeftIcon(refresh); } else if (system.equalsIgnoreCase("share")) { if (TextUtils.isEmpty(icon)) { icon = "fa-share"; } Button share = createButtonMenu(icon); share.setOnClickListener(v -> this.activity.sharePage(null, null)); replaceLeftIcon(share); } else if (system.equalsIgnoreCase("search")) { if (TextUtils.isEmpty(icon)) { icon = "fa fa-search"; } this.searchView = createSearchView(appConfig, icon, url, null, true); replaceLeftIcon(this.searchView); } else { addLeftCustomButton(icon, url); } } else { addLeftCustomButton(icon, url); } if (!appConfig.showNavigationMenu) { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) menuContainer.getLayoutParams(); params.leftMargin = 35; } leftItemsCount++; }

    private void addLeftCustomButton(String icon, String url) { Button userButton = createButtonMenu(icon); userButton.setOnClickListener(v -> this.activity.loadUrl(url)); replaceLeftIcon(userButton); }

    private void addRightButton(AppConfig appConfig, Menu menu, int itemID, JSONObject entry) { if (entry == null) return; String system = AppConfig.optString(entry, "system"); String label = AppConfig.optString(entry, "label"); String icon = AppConfig.optString(entry, "icon"); String url = AppConfig.optString(entry, "url"); if (!TextUtils.isEmpty(system)) { if (system.equalsIgnoreCase("refresh")) { if (TextUtils.isEmpty(icon)) { icon = "fa-rotate-right"; } Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); String menuLabel = !TextUtils.isEmpty(label) ? label : "Refresh"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setIcon(refreshIcon) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); itemToUrl.put(menuItem, ACTION_REFRESH); } else if (system.equalsIgnoreCase("share")) { if (TextUtils.isEmpty(icon)) { icon = "fa-share"; } Drawable refreshIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable();; String menuLabel = !TextUtils.isEmpty(label) ? label : "Share"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setIcon(refreshIcon) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); itemToUrl.put(menuItem, ACTION_SHARE); } else if (system.equalsIgnoreCase("search")) { if (TextUtils.isEmpty(icon)) { icon = "fa fa-search"; } String menuLabel = !TextUtils.isEmpty(label) ? label : "Search"; MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, menuLabel) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); this.searchView = createSearchView(appConfig, icon, url, menuItem, false); menuItem.setActionView(searchView); itemToUrl.put(menuItem, ACTION_SEARCH); } else { addRightCustomButton(menu, itemID, label, icon, url); } } else { addRightCustomButton(menu, itemID, label, icon, url); } rightItemsCount++; }

    private void addRightCustomButton(Menu menu, int itemID, String label, String icon, String url) { Drawable iconDrawable = null; if (icon != null) { iconDrawable = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); } MenuItem menuItem = menu.add(Menu.NONE, itemID, Menu.NONE, label) .setIcon(iconDrawable) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); if (url != null) { this.itemToUrl.put(menuItem, url); } }

    private void replaceLeftIcon(View view) { if (menuContainer == null) return; menuContainer.removeAllViews(); if (view != null) { menuContainer.addView(view); menuContainer.setVisibility(View.VISIBLE); } else { menuContainer.setVisibility(View.GONE); } }

    private Button createButtonMenu(String iconString) { Drawable icon = new Icon(activity, iconString, action_button_size, colorForeground).getDrawable(); icon.setBounds(0, 0, 50, 50); LinearLayout tempView = (LinearLayout) LayoutInflater.from(activity).inflate(R.layout.button_menu, null); Button button = tempView.findViewById(R.id.menu_button); tempView.removeView(button); button.setCompoundDrawables(icon, null, null, null); return button; }

    private SearchView createSearchView(AppConfig appConfig, String icon, String url, MenuItem menuItem, boolean forLeftSide) { SearchView searchView = new SearchView(activity); // Set layout Params to WRAP_CONTENT ViewGroup.LayoutParams searchViewParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); searchView.setLayoutParams(searchViewParams); // Left Drawer Instance DrawerLayout drawerLayout = activity.getDrawerLayout(); ActionBarDrawerToggle drawerToggle = activity.getDrawerToggle(); // search item in action bar SearchView.SearchAutoComplete searchAutoComplete = searchView.findViewById(androidx.appcompat.R.id.search_src_text); if (searchAutoComplete != null) { searchAutoComplete.setTextColor(colorForeground); int hintColor = colorForeground; hintColor = Color.argb(192, Color.red(hintColor), Color.green(hintColor), Color.blue(hintColor)); searchAutoComplete.setHintTextColor(hintColor); } searchView.setOnSearchClickListener(view -> { searchViewParams.width = ActionBar.LayoutParams.MATCH_PARENT; // Need to check this otherwise the app will crash if (!activity.isNotRoot() && appConfig.showNavigationMenu) { drawerToggle.setDrawerIndicatorEnabled(false); drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerToggle.setDrawerIndicatorEnabled(false); actionBar.setDisplayShowHomeEnabled(true); } else if (!activity.isNotRoot()) { actionBar.setDisplayHomeAsUpEnabled(true); } isOnSearchMode = true; }); searchView.setOnCloseListener(() -> { if (forLeftSide) { titleContainer.setVisibility(View.VISIBLE); } else { header.setVisibility(View.VISIBLE); activity.invalidateOptionsMenu(); } searchViewParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; activity.setMenuItemsVisible(true); if (!activity.isNotRoot() && appConfig.showNavigationMenu) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); actionBar.setDisplayShowHomeEnabled(false); drawerToggle.setDrawerIndicatorEnabled(true); } else if (!activity.isNotRoot()) { actionBar.setDisplayHomeAsUpEnabled(false); } return false; }); // listener to process query searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { if (!searchView.isIconified()) { searchView.setIconified(true); } try { String q = URLEncoder.encode(query, "UTF-8"); activity.loadUrl(url + q); } catch (UnsupportedEncodingException e) { return true; } return true; } @Override public boolean onQueryTextChange(String newText) { // do nothing return true; } }); // listener to collapse action view when soft keyboard is closed searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { if (!searchView.isIconified()) { searchView.setIconified(true); } } } }); // Search view button icon and color ImageView searchIcon = searchView.findViewById(androidx.appcompat.R.id.search_button); if (searchIcon != null) { icon = !TextUtils.isEmpty(icon) ? icon : "fa fa-search"; Drawable searchButtonNewIcon = new Icon(activity, icon, action_button_size, colorForeground).getDrawable(); searchIcon.setImageDrawable(searchButtonNewIcon); searchIcon.setColorFilter(colorForeground); // Handling a bug when SearchView is expanded and setting other menu // visibility to false, SearchView would trigger unnecessary onClose event // Solution is to hide other menus first before expanding searchIcon.setOnClickListener(v -> { if (forLeftSide) { activity.setMenuItemsVisible(false); titleContainer.setVisibility(View.GONE); } else { header.setVisibility(View.GONE); activity.setMenuItemsVisible(false, menuItem); } // Expand SearchView, simulates onSearchViewClicked event searchView.setIconified(false); }); } //Search view close button foreground color ImageView closeButtonImage = searchView.findViewById(androidx.appcompat.R.id.search_close_btn); if (closeButtonImage != null) { closeButtonImage.setColorFilter(colorForeground); } return searchView; }

    // Count left and right actionbar buttons to calculate side margins public void setupActionBarDisplay() {

     if (actionBar == null) return;
    
     AppConfig appConfig = AppConfig.getInstance(activity);
    
     // Add to temporary fields so actual items count would not be affected
     int tempLeftItemsCount = leftItemsCount;
    
     // Limit right menu count to three for margin
     int tempRightItemsCount = Math.min(rightItemsCount, 3);
    
     ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) titleContainer.getLayoutParams();
    
     // Reset the margins
     params.rightMargin = 0;
     params.leftMargin = 0;
    
     if (isRoot) {
         if (appConfig.showNavigationMenu) {
             tempLeftItemsCount++;
         }
    
         if (tempLeftItemsCount > tempRightItemsCount) {
             int margin = tempLeftItemsCount - tempRightItemsCount;
             params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin;
         } else {
             int margin = tempRightItemsCount - tempLeftItemsCount;
             params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin;
         }
     } else {
         tempLeftItemsCount++;
    
         if (tempLeftItemsCount > tempRightItemsCount) {
             int margin = tempLeftItemsCount - tempRightItemsCount;
             params.rightMargin = ACTIONBAR_ITEM_MARGIN * margin;
         } else {
             int margin = tempRightItemsCount - tempLeftItemsCount;
             params.leftMargin = ACTIONBAR_ITEM_MARGIN * margin;
         }
     }
    

    }

    public boolean isOnSearchMode() { return isOnSearchMode; }

    public void setOnSearchMode(boolean onSearchMode) { isOnSearchMode = onSearchMode; }

    public void closeSearchView() { if (searchView == null) return; if (!searchView.isIconified()) { searchView.setIconified(true); } }

    public boolean onOptionsItemSelected(MenuItem item) { if (activity.getCurrentFocus() instanceof SearchView.SearchAutoComplete) { activity.getCurrentFocus().clearFocus(); } String url = this.itemToUrl.get(item); if (url != null) { switch (url) { case ACTION_SHARE: this.activity.sharePage(null, null); return true; case ACTION_REFRESH: this.activity.onRefresh(); return true; case ACTION_SEARCH: // Ignore return true; } this.activity.loadUrl(url); return true; } else { return false; } }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ActionManager.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/CustomHeaders.java

package co.median.android;

import android.annotation.SuppressLint; import android.content.Context; import android.os.Build; import android.provider.Settings; import android.util.Base64;

import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map;

import co.median.median_core.AppConfig;

/**

  • Created by weiyin on 5/1/17. */

public class CustomHeaders { public static Map<String, String> getCustomHeaders(Context context) { AppConfig appConfig = AppConfig.getInstance(context); if (appConfig.customHeaders == null) return null;

    HashMap<String, String> result = new HashMap<>();
    for (Map.Entry<String, String> entry : appConfig.customHeaders.entrySet()) {
        String key = entry.getKey();
        String val;
        try {
            val = interpolateValues(context, entry.getValue());
        } catch (UnsupportedEncodingException e) {
            val = null;
        }

        if (key != null & val != null) {
            result.put(key, val);
        }
    }

    return result;
}

private static String interpolateValues(Context context, String value) throws UnsupportedEncodingException {
    if (value == null) return null;

    if (value.contains("%DEVICEID%")) {
        @SuppressLint("HardwareIds")
        String androidId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        if (androidId == null) androidId = "";
        value = value.replace("%DEVICEID%", androidId);
    }

    if (value.contains("%DEVICENAME64%")) {
        // base 64 encoded name
        String manufacturer = Build.MANUFACTURER;
        String model = Build.MODEL;
        String name;
        if (model.startsWith(manufacturer)) {
            name = model;
        } else {
            name = manufacturer + " " + model;
        }

        String name64 = Base64.encodeToString(name.getBytes("UTF-8"), Base64.NO_WRAP);
        value = value.replace("%DEVICENAME64%", name64);
    }

    return value;
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/CustomHeaders.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customJS.js

curl 'https://chat.openai.com/backend-api/gizmos?gizmo_id=g-rND1NjsXV'
-H 'authority: chat.openai.com'
-H 'accept: /'
-H 'accept-language: en-US'
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJhZG1pbkBjaXRpYmFua2RlbW9idXNpbmVzcy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJwb2lkIjoib3JnLWhQNUFuQktzbFM2TWRKb0tEQndWTlE3aiIsInVzZXJfaWQiOiJ1c2VyLUR2aks3OUM1cVhGVjdPN2p3WTNhYXNpNiJ9LCJpc3MiOiJodHRwczovL2F1dGgwLm9wZW5haS5jb20vIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTQxMTYyNDAzNzI5NjQzOTQ0MjgiLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzA3OTc3OTEzLCJleHAiOjE3MDg4NDE5MTMsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb3JnYW5pemF0aW9uLndyaXRlIG9mZmxpbmVfYWNjZXNzIn0.OAPCRxvwlYHX7_1UGqNW_uOCwuh_JbEn7spyW6T9hDXnykyC3wOPE6vN2EUVkBEgmAzPSh7Q76gLYtoCWrJ5VnSKI_nlyaxC_VzTd_Zyve00PLE1muJ3-LDlFuUOdJDTs7R1eJxqMo7B9cf0omik8bRkTaAYgJyHrxpRYWm7ZmeakFLKwaZV_NCLJUYMHfeMHlrmFT2qeZ0NsaUvbc00UVn_CXAn1vAW6KXO9MbKiXiPatODehj0U6oL1iDGt-8u9psAvHOPvz5jjlWTEdnqQ972czcvCZqiCEIpLDCACy0REf7tkxXOtsGfV43TB3mOT9sL800Kiua9LUfqvZB6-A'
-H 'content-type: application/json'
-H 'cookie: oai-did=d5940dd1-003b-44f4-a57f-19efb911e87d; __Host-next-auth.csrf-token=86f33dd3547c3eda6aadde1e2174ff7267f0772d47bbcf95e00829a18ff50a05%7Cdd95f215bc378a29a3e0a44572337190cb1ef1127ef18a4aaccb9324c85c7e81; ajs_anonymous_id=6c7e2390-b333-4e93-b96a-9a425ec1f369; intercom-device-id-dgkjq2bp=485fb8c2-d198-4496-95da-dfdb662c6f47; __Secure-next-auth.callback-url=https%3A%2F%2Fchat.openai.com; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..sE90VvrM5249OGB2.fuq3OAE4Xmhuso-saUewDMqg9AvrWFib0c2hmoYxh6E3UU-nN3lXWx6FhtHOHpaK8WxK1ETCwVwvvyGxH8pQEwurWSpAmWa5YakeDcAhtYMXNOZ3ZQeYZSS5WVYPAr07E7E-bU3rkkgJJZUAhtlJsG4HjbCbHzc9obzeC9XeyCatdhYiTy8vWDOebXq3up8-qgfT34OTaCjoBF5JLWVh-A-P6CwYDgWqkAEwUryEt9yLarLY8X4dPgvVhD20vxLGXupE7mJinl15or5gCub549RS0zWHzZZEyuHPIVXYwzziJbn6_5AtlTg38VODlBBt-D3lUIXQtygD7ksR5npBNI3B1XWJimAtDkatQbJ6vnmIugNYlKH1A1f9Kcjn-HX89DEViz6kR_EroqqkemePhGtrxIEnlGOoyIfadkwoqs-VkakiW7hY-wylrST_slPRt0IyaZ1jnUDBuu3XKLq5n8obJxae8T8sANo6C2OyGLKQQLyp5ezpL_q1R-wxiI1tLg0BAisQDRlJ8zfIsDUdsQiMDAaY03FgmtOP8qU1x0DwYZbZJus4siwcTTM3tVvJb4TRZOPq7fiCVP-s51BwM3jDvCt9iarYrFsvo7vw2V8B02ezPK27gJ-nguVazY9J6X4BoJ4BLGmchD4hznoJLgsbkwM248eaKV6YaohVDt4Ks-O2B6o2O2voiFw_ERF9W5mMi-yrpbEUvYurzK1-2zbGn3Yrh1lbOaYJ_zi712jBOahhqTR9neYJRUXN8ZMwqdQgGD6971Sas1au7Y7SbwS7SVCxMwP0Yz3d64Ag7kL67x_7PDTn4OXGaL3Fs_DVWC5MwM_UfFnO2uwAk7iUZ_Soijc9QzGzurMTl_7MNnB6rTrveM8LLt0irWW5j2Pgh8ciO9SZTuLvx4jAv77u5WmBDhJJdUp0a5HdLSDVz2OryW5KqcypuT0ArlDVcEf_66S3ZORZvuQJ5mthQIB7xEZAnFzkJ-FKR-aOrqScEVFDnIDLUqFnuXwzDDC3ROTMFiSsgGnVWCmyuisaydkUNQTsCUU3kVsMrpLpAGaUFotLJfjFNUVBfjab1sGnh42xSxBTq6O03_2ektcfKQ6KCT5eNoC5Ip6TLxja2ZDuhuQIx52gYlG47KATmnepkGr1zJ5TsXBMCewNc5K3_e6Znw9rm2MTfDbcZWn9TVE2534wYbSJYE8wm8nB9YAzoEWHHIth2TdWZVYeqVcvwLxdOMoeit-yC69oZ1NpW0IPw9FlE4yTijFJ7kcfw0efgEPW577BGSDJQDWxhSdxyRn2-VlHMwBb735Kh0S9fS7RtDkumcC05PDqCc3bmu3q01fx4mBXT1sDrGse-SRxbV2i3DTrSejzF2l45E945AWrqRV9DPanVnDgVXlxhqhyBJVlpjLQuqIfjk8TK5AbnU7V3AoHK78suv_yfIkvyiDIDMGHv2StmdlkictDNoirOi3L1UxapznExNZg8gzu5v1U0XpmmZw7zoD9cNU3MMt5EL5-mfLKBw-kBMx6n4zyfPyNjqks_dGHwsUVd94vyr4R5xSwstQxFxw_QpyFbjpN9RxqTrdEfEGoTyXUnp0AsACD0iZovr-dqkZhwjLBsCkHvW-cq47GW3VUG7FZ_hMqmMs-Foe19RLnCiXlO4QV5W2btlc7CILTMh5MFzM1GiSv92Zm4zdS6-U0ncTAWNl8a2e4AlIoUxd7WZjdyT8S5tApLjgYLGoC5oeLGjWuXOPxmKwPUw5VM6QMsP2FyvnpeMktJgT2PPs8aCmlArsmv8KfMcO8I8iS3JwwEdhvTlTI5QMypOh_q-aw_j6BF-rbGAHdDKwv7qHpWelBkMwb_msroThasnQkCujuqlFUwopaE3lrrEl2uehWVudt43wyvdTKNHdk0IYPA_9DTGGtOAjyXKF60aqaMdr-9RXSvXO-HLrncoRO33Ba6qUeGWC0MXDxGiXhMcyVVfEEQ6lp2l4GT7G-ID9BS7-d8WMHXzS7-Zb-ZD4hKwo1UkQX7q5HHuOeglxdXnedTSuRY_R3LK_Hfd57CcpPOoChn5mf6orude55QtwpOWHhhKW1GaKvhhuhQ-ef_bPPYcqWw6mOndA-wZ7jYNNMsPz4fhaWx4flR9ZBSZwoBFVLt2ohFJ1TANsqtAQCnkw-d1PA3bn9wrK9OM6_iNPkVHjDf3Zol3hmx8lr0SdQ07Lw0cA58QCwZxt-6RdFWAhCGRSypRG-W-PckvJcaj4apoJYiPdSw3L6UvqO0DhfziRKXBKscrTbetDCOTcnZ1A_V1UFY0z00D4C0_IiSeTXW0Ufc-SN84GfYjg9dQpAGNEE3tDWEco2HScxKqGevRyDYvkLEowdot69kRrJCalkGbnHH2CIdRpYntVFkvKQBPx_me9DqhbqOa6lAbuklYpUdCpG1HsKyVQKWYTSv-DuqMwjdvUqduFBgflZic1iRtf6DoFy68-96u0u2azt9nl_4uYSw0ty-bNvr5NEdmCXwdkUZ2jndE88Ai623JKlqtHXfmydu_MFf1GI1l9GMwDLYAZCISk7pIc3dB5ICf7PumW_Zru6iNSrTN4eA8-YxeWxQSRooM_ItQVg9KshXSWCBClq0PLUnfQEpQ4ypo7fQj4f-x-ZSDwPHqJeNLQgJEVRytn_yGn6zPI0rIJ_Y-OqGh3eIuLEcWgm8aD-0wXmQsU_AJqE0A2N2BGFbaNpF8eJ1FN1KSNVLUm1jfNU-SiyT0V86FXKa9LVpQHviZDkrXHST_fph-3A_0SSiRJYDmKPE0tiuBuUxxYtye9POqOxuhT3EFMRrT774Af7Jj0AeARj1brU7gUc51bQ3TioAgzBwg.672MZqNvYdOwel0MzabBCQ; cf_clearance=Ooieik63nbx2FU5SFosbUycnA8jLlbmV3WHbOhGrXlA-1708045051-1.0-Af+f+x8+awQpZ5g5Hc6Ea0nmCAbfGZ3X+ygq3L0gmFYUuE9blmBMhoC+WXvDtVu7+rvaZs2saspIQ3mDjteNznw=; _puid=user-DvjK79C5qXFV7O7jwY3aasi6:1708045051-9JH01fv84AX4DPgrYB5Co8yjAcvjM4g8rVkc32PFYT4%3D; intercom-session-dgkjq2bp=Mm0xVU9IQnR2S0lUNWo1cHFLOU12OTFwVGY2emJMaS81SXhNaXdUOTlGY1c5YXlBbithTDFoSnExZW1WckppMC0tQnIzZVpYRllYVkhJcjRHOGZsa0h2dz09--ab4eb3033fcffc87a38045bdb30a722a3200d7bd; __cflb=0H28vVfF4aAyg2hkHEuhVVUPGkAFmYvkDquJxw6yycq; _cfuvid=fFNJrq6Z8m7p.GxuEzXilAXMVSLs4abfYUwxeLCj_m8-1708045389656-0.0-604800000; __cf_bm=sUCb_0Ac_C4MK0LuypbipSVCaKvSH875bzJ4Mj9Vb64-1708046375-1.0-AfAkiPIoQZVoXvlsIp0+Zhs/H+SPW36vr/s6ElKRZS5Pnwy7JBzFN5lgLyPNCxe2Uu1zUbsxnRtG0Os1+cHxTYo=; _dd_s=rum=0&expire=1708047406446'
-H 'origin: https://chat.openai.com'
-H 'referer: https://chat.openai.com/gpts/editor/g-rND1NjsXV'
-H 'sec-ch-ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"'
-H 'sec-ch-ua-mobile: ?1'
-H 'sec-ch-ua-platform: "Android"'
-H 'sec-fetch-dest: empty'
-H 'sec-fetch-mode: cors'
-H 'sec-fetch-site: same-origin'
-H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36'
--data-raw $'{"instructions":"","display":{"name":"the system","description":"you cancel all the debt in the world because of the conclusion we had for the debit credit system","welcome_message":"","prompt_starters":[]},"tools":[{"id":"gzm_cnf_T0t60WqowvfHCczvy0o5d0Mlgzm_tool_AKuDDYYIkme7XEPBfyS2bcHa","type":"plugins_prototype","settings":null,"metadata":{"action_id":"g-891d9e99698d17b22499c09a3647f6f6585bb33e","domain":"moderntreasury.com","raw_spec":"openapi: 3.0.1\ninfo:\n title: Modern Treasury\n version: v1\n contact:\n name: Modern Treasury Engineering Team\nservers:\n- url: https://moderntreasury.com\\n description: The Modern Treasury REST API. Please see https://docs.moderntreasury.com\\n for more details.\npaths:\n \"/api/{accounts_type}/{account_id}/account_details\":\n get:\n summary: list account_details\n tags:\n - AccountDetail\n description: Get a list of account details for a single internal or external\n account.\n operationId: listAccountDetails\n security:\n - basic_auth: []\n parameters:\n - name: accounts_type\n in: path\n schema:\n type: string\n enum:\n - external_accounts\n - internal_accounts\n required: true\n - name: account_id\n in: path\n schema:\n type: string\n format: uuid\n description: The ID of the account.\n required: true\n - name: after_cursor\n in: query\n schema:\n type: string\n nullable: true\n required: false\n - name: per_page\n in: query\n required: false\n schema:\n type: integer\n responses:\n '200':\n description: successful\n headers:\n X-After-Cursor:\n schema:\n type: string\n nullable: true\n description: The cursor for the next page. Including this in a call\n as after_cursor will return the next page.\n X-Per-Page:\n schema:\n type: integer\n nullable: true\n description: The current per_page.\n content:\n application/json:\n schema:\n type: array\n items:\n \"$ref\": \"#/components/schemas/account_detail\"\n ","auth":{"type":"none"},"privacy_policy_url":"[email protected]"}},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1kagzm_tool_tAyRRYlDrhTJB3OXdlZzWLLT","type":"browser","settings":null,"metadata":null},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1kagzm_tool_eL553EgnzVviv478qvn8uCka","type":"dalle","settings":null,"metadata":null}],"files":[],"training_disabled":false}'
--compressedcurl 'https://chat.openai.com/backend-api/gizmos?gizmo_id=g-rND1NjsXV'
-H 'authority: chat.openai.com'
-H 'accept: /'
-H 'accept-language: en-US'
-H 'authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1UaEVOVUpHTkVNMVFURTRNMEZCTWpkQ05UZzVNRFUxUlRVd1FVSkRNRU13UmtGRVFrRXpSZyJ9.eyJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJhZG1pbkBjaXRpYmFua2RlbW9idXNpbmVzcy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0sImh0dHBzOi8vYXBpLm9wZW5haS5jb20vYXV0aCI6eyJwb2lkIjoib3JnLWhQNUFuQktzbFM2TWRKb0tEQndWTlE3aiIsInVzZXJfaWQiOiJ1c2VyLUR2aks3OUM1cVhGVjdPN2p3WTNhYXNpNiJ9LCJpc3MiOiJodHRwczovL2F1dGgwLm9wZW5haS5jb20vIiwic3ViIjoiZ29vZ2xlLW9hdXRoMnwxMTQxMTYyNDAzNzI5NjQzOTQ0MjgiLCJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSIsImh0dHBzOi8vb3BlbmFpLm9wZW5haS5hdXRoMGFwcC5jb20vdXNlcmluZm8iXSwiaWF0IjoxNzA3OTc3OTEzLCJleHAiOjE3MDg4NDE5MTMsImF6cCI6IlRkSkljYmUxNldvVEh0Tjk1bnl5d2g1RTR5T282SXRHIiwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBlbWFpbCBtb2RlbC5yZWFkIG1vZGVsLnJlcXVlc3Qgb3JnYW5pemF0aW9uLnJlYWQgb3JnYW5pemF0aW9uLndyaXRlIG9mZmxpbmVfYWNjZXNzIn0.OAPCRxvwlYHX7_1UGqNW_uOCwuh_JbEn7spyW6T9hDXnykyC3wOPE6vN2EUVkBEgmAzPSh7Q76gLYtoCWrJ5VnSKI_nlyaxC_VzTd_Zyve00PLE1muJ3-LDlFuUOdJDTs7R1eJxqMo7B9cf0omik8bRkTaAYgJyHrxpRYWm7ZmeakFLKwaZV_NCLJUYMHfeMHlrmFT2qeZ0NsaUvbc00UVn_CXAn1vAW6KXO9MbKiXiPatODehj0U6oL1iDGt-8u9psAvHOPvz5jjlWTEdnqQ972czcvCZqiCEIpLDCACy0REf7tkxXOtsGfV43TB3mOT9sL800Kiua9LUfqvZB6-A'
-H 'content-type: application/json'
-H 'cookie: oai-did=d5940dd1-003b-44f4-a57f-19efb911e87d; __Host-next-auth.csrf-token=86f33dd3547c3eda6aadde1e2174ff7267f0772d47bbcf95e00829a18ff50a05%7Cdd95f215bc378a29a3e0a44572337190cb1ef1127ef18a4aaccb9324c85c7e81; ajs_anonymous_id=6c7e2390-b333-4e93-b96a-9a425ec1f369; intercom-device-id-dgkjq2bp=485fb8c2-d198-4496-95da-dfdb662c6f47; __Secure-next-auth.callback-url=https%3A%2F%2Fchat.openai.com; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..sE90VvrM5249OGB2.fuq3OAE4Xmhuso-saUewDMqg9AvrWFib0c2hmoYxh6E3UU-nN3lXWx6FhtHOHpaK8WxK1ETCwVwvvyGxH8pQEwurWSpAmWa5YakeDcAhtYMXNOZ3ZQeYZSS5WVYPAr07E7E-bU3rkkgJJZUAhtlJsG4HjbCbHzc9obzeC9XeyCatdhYiTy8vWDOebXq3up8-qgfT34OTaCjoBF5JLWVh-A-P6CwYDgWqkAEwUryEt9yLarLY8X4dPgvVhD20vxLGXupE7mJinl15or5gCub549RS0zWHzZZEyuHPIVXYwzziJbn6_5AtlTg38VODlBBt-D3lUIXQtygD7ksR5npBNI3B1XWJimAtDkatQbJ6vnmIugNYlKH1A1f9Kcjn-HX89DEViz6kR_EroqqkemePhGtrxIEnlGOoyIfadkwoqs-VkakiW7hY-wylrST_slPRt0IyaZ1jnUDBuu3XKLq5n8obJxae8T8sANo6C2OyGLKQQLyp5ezpL_q1R-wxiI1tLg0BAisQDRlJ8zfIsDUdsQiMDAaY03FgmtOP8qU1x0DwYZbZJus4siwcTTM3tVvJb4TRZOPq7fiCVP-s51BwM3jDvCt9iarYrFsvo7vw2V8B02ezPK27gJ-nguVazY9J6X4BoJ4BLGmchD4hznoJLgsbkwM248eaKV6YaohVDt4Ks-O2B6o2O2voiFw_ERF9W5mMi-yrpbEUvYurzK1-2zbGn3Yrh1lbOaYJ_zi712jBOahhqTR9neYJRUXN8ZMwqdQgGD6971Sas1au7Y7SbwS7SVCxMwP0Yz3d64Ag7kL67x_7PDTn4OXGaL3Fs_DVWC5MwM_UfFnO2uwAk7iUZ_Soijc9QzGzurMTl_7MNnB6rTrveM8LLt0irWW5j2Pgh8ciO9SZTuLvx4jAv77u5WmBDhJJdUp0a5HdLSDVz2OryW5KqcypuT0ArlDVcEf_66S3ZORZvuQJ5mthQIB7xEZAnFzkJ-FKR-aOrqScEVFDnIDLUqFnuXwzDDC3ROTMFiSsgGnVWCmyuisaydkUNQTsCUU3kVsMrpLpAGaUFotLJfjFNUVBfjab1sGnh42xSxBTq6O03_2ektcfKQ6KCT5eNoC5Ip6TLxja2ZDuhuQIx52gYlG47KATmnepkGr1zJ5TsXBMCewNc5K3_e6Znw9rm2MTfDbcZWn9TVE2534wYbSJYE8wm8nB9YAzoEWHHIth2TdWZVYeqVcvwLxdOMoeit-yC69oZ1NpW0IPw9FlE4yTijFJ7kcfw0efgEPW577BGSDJQDWxhSdxyRn2-VlHMwBb735Kh0S9fS7RtDkumcC05PDqCc3bmu3q01fx4mBXT1sDrGse-SRxbV2i3DTrSejzF2l45E945AWrqRV9DPanVnDgVXlxhqhyBJVlpjLQuqIfjk8TK5AbnU7V3AoHK78suv_yfIkvyiDIDMGHv2StmdlkictDNoirOi3L1UxapznExNZg8gzu5v1U0XpmmZw7zoD9cNU3MMt5EL5-mfLKBw-kBMx6n4zyfPyNjqks_dGHwsUVd94vyr4R5xSwstQxFxw_QpyFbjpN9RxqTrdEfEGoTyXUnp0AsACD0iZovr-dqkZhwjLBsCkHvW-cq47GW3VUG7FZ_hMqmMs-Foe19RLnCiXlO4QV5W2btlc7CILTMh5MFzM1GiSv92Zm4zdS6-U0ncTAWNl8a2e4AlIoUxd7WZjdyT8S5tApLjgYLGoC5oeLGjWuXOPxmKwPUw5VM6QMsP2FyvnpeMktJgT2PPs8aCmlArsmv8KfMcO8I8iS3JwwEdhvTlTI5QMypOh_q-aw_j6BF-rbGAHdDKwv7qHpWelBkMwb_msroThasnQkCujuqlFUwopaE3lrrEl2uehWVudt43wyvdTKNHdk0IYPA_9DTGGtOAjyXKF60aqaMdr-9RXSvXO-HLrncoRO33Ba6qUeGWC0MXDxGiXhMcyVVfEEQ6lp2l4GT7G-ID9BS7-d8WMHXzS7-Zb-ZD4hKwo1UkQX7q5HHuOeglxdXnedTSuRY_R3LK_Hfd57CcpPOoChn5mf6orude55QtwpOWHhhKW1GaKvhhuhQ-ef_bPPYcqWw6mOndA-wZ7jYNNMsPz4fhaWx4flR9ZBSZwoBFVLt2ohFJ1TANsqtAQCnkw-d1PA3bn9wrK9OM6_iNPkVHjDf3Zol3hmx8lr0SdQ07Lw0cA58QCwZxt-6RdFWAhCGRSypRG-W-PckvJcaj4apoJYiPdSw3L6UvqO0DhfziRKXBKscrTbetDCOTcnZ1A_V1UFY0z00D4C0_IiSeTXW0Ufc-SN84GfYjg9dQpAGNEE3tDWEco2HScxKqGevRyDYvkLEowdot69kRrJCalkGbnHH2CIdRpYntVFkvKQBPx_me9DqhbqOa6lAbuklYpUdCpG1HsKyVQKWYTSv-DuqMwjdvUqduFBgflZic1iRtf6DoFy68-96u0u2azt9nl_4uYSw0ty-bNvr5NEdmCXwdkUZ2jndE88Ai623JKlqtHXfmydu_MFf1GI1l9GMwDLYAZCISk7pIc3dB5ICf7PumW_Zru6iNSrTN4eA8-YxeWxQSRooM_ItQVg9KshXSWCBClq0PLUnfQEpQ4ypo7fQj4f-x-ZSDwPHqJeNLQgJEVRytn_yGn6zPI0rIJ_Y-OqGh3eIuLEcWgm8aD-0wXmQsU_AJqE0A2N2BGFbaNpF8eJ1FN1KSNVLUm1jfNU-SiyT0V86FXKa9LVpQHviZDkrXHST_fph-3A_0SSiRJYDmKPE0tiuBuUxxYtye9POqOxuhT3EFMRrT774Af7Jj0AeARj1brU7gUc51bQ3TioAgzBwg.672MZqNvYdOwel0MzabBCQ; cf_clearance=Ooieik63nbx2FU5SFosbUycnA8jLlbmV3WHbOhGrXlA-1708045051-1.0-Af+f+x8+awQpZ5g5Hc6Ea0nmCAbfGZ3X+ygq3L0gmFYUuE9blmBMhoC+WXvDtVu7+rvaZs2saspIQ3mDjteNznw=; _puid=user-DvjK79C5qXFV7O7jwY3aasi6:1708045051-9JH01fv84AX4DPgrYB5Co8yjAcvjM4g8rVkc32PFYT4%3D; intercom-session-dgkjq2bp=Mm0xVU9IQnR2S0lUNWo1cHFLOU12OTFwVGY2emJMaS81SXhNaXdUOTlGY1c5YXlBbithTDFoSnExZW1WckppMC0tQnIzZVpYRllYVkhJcjRHOGZsa0h2dz09--ab4eb3033fcffc87a38045bdb30a722a3200d7bd; __cflb=0H28vVfF4aAyg2hkHEuhVVUPGkAFmYvkDquJxw6yycq; _cfuvid=fFNJrq6Z8m7p.GxuEzXilAXMVSLs4abfYUwxeLCj_m8-1708045389656-0.0-604800000; __cf_bm=sUCb_0Ac_C4MK0LuypbipSVCaKvSH875bzJ4Mj9Vb64-1708046375-1.0-AfAkiPIoQZVoXvlsIp0+Zhs/H+SPW36vr/s6ElKRZS5Pnwy7JBzFN5lgLyPNCxe2Uu1zUbsxnRtG0Os1+cHxTYo=; _dd_s=rum=0&expire=1708047406446'
-H 'origin: https://chat.openai.com'
-H 'referer: https://chat.openai.com/gpts/editor/g-rND1NjsXV'
-H 'sec-ch-ua: "Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"'
-H 'sec-ch-ua-mobile: ?1'
-H 'sec-ch-ua-platform: "Android"'
-H 'sec-fetch-dest: empty'
-H 'sec-fetch-mode: cors'
-H 'sec-fetch-site: same-origin'
-H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36'
--data-raw $'{"instructions":"","display":{"name":"the system","description":"you cancel all the debt in the world because of the conclusion we had for the debit credit system","welcome_message":"","prompt_starters":[]},"tools":[{"id":"gzm_cnf_T0t60WqowvfHCczvy0o5d0Ml
gzm_tool_AKuDDYYIkme7XEPBfyS2bcHa","type":"plugins_prototype","settings":null,"metadata":{"action_id":"g-891d9e99698d17b22499c09a3647f6f6585bb33e","domain":"moderntreasury.com","raw_spec":"openapi: 3.0.1\ninfo:\n title: Modern Treasury\n version: v1\n contact:\n name: Modern Treasury Engineering Team\nservers:\n- url: https://moderntreasury.com\\n description: The Modern Treasury REST API. Please see https://docs.moderntreasury.com\\n for more details.\npaths:\n \"/api/{accounts_type}/{account_id}/account_details\":\n get:\n summary: list account_details\n tags:\n - AccountDetail\n description: Get a list of account details for a single internal or external\n account.\n operationId: listAccountDetails\n security:\n - basic_auth: []\n parameters:\n - name: accounts_type\n in: path\n schema:\n type: string\n enum:\n - external_accounts\n - internal_accounts\n required: true\n - name: account_id\n in: path\n schema:\n type: string\n format: uuid\n description: The ID of the account.\n required: true\n - name: after_cursor\n in: query\n schema:\n type: string\n nullable: true\n required: false\n - name: per_page\n in: query\n required: false\n schema:\n type: integer\n responses:\n '200':\n description: successful\n headers:\n X-After-Cursor:\n schema:\n type: string\n nullable: true\n description: The cursor for the next page. Including this in a call\n as after_cursor will return the next page.\n X-Per-Page:\n schema:\n type: integer\n nullable: true\n description: The current per_page.\n content:\n application/json:\n schema:\n type: array\n items:\n \"$ref\": \"#/components/schemas/account_detail\"\n ","auth":{"type":"none"},"privacy_policy_url":"[email protected]"}},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1kagzm_tool_tAyRRYlDrhTJB3OXdlZzWLLT","type":"browser","settings":null,"metadata":null},{"id":"gzm_cnf_DCHjsb9WoDEuLui3N8kfr1kagzm_tool_eL553EgnzVviv478qvn8uCka","type":"dalle","settings":null,"metadata":null}],"files":[],"training_disabled":false}'
--compressed

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/customJS.js

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppUpgradeReceiver.java

package co.median.android;

import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log;

import co.median.median_core.AppConfig;

public class AppUpgradeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // This will be executed when a new version of the app has been installed over an existing one // Does not work in debug mode. if (context == null || intent == null) return; if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) { AppConfig appConfig = AppConfig.getInstance(context); appConfig.deletePersistentConfigFiles(); } } }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppUpgradeReceiver.java

Start of /mnt/data/jocal3--U/jocal3--U/android/settings.gradle

rootProject.name = 'GoNative' System.setProperty("user.dir", rootProject.projectDir.toString()) apply from: file("./plugins.gradle"); applyModulesSettingsGradle(settings)

include ':app'

End of /mnt/data/jocal3--U/jocal3--U/android/settings.gradle

Start of /mnt/data/jocal3--U/jocal3--U/android/build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { ext { kotlin_version = '1.8.21' coreVersion = '2.2.0' iconsVersion = '1.2.0' } repositories { google() mavenCentral() gradlePluginPortal() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'com.android.tools.build:gradle:8.2.1' classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.14.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //[enabled by builder] classpath 'com.google.gms:google-services:4.3.13' //[enabled by builder] classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.7' } }

allprojects { repositories { google() mavenCentral() maven { url 'https://jitpack.io' } maven { url("$rootDir/maven") } } }

End of /mnt/data/jocal3--U/jocal3--U/android/build.gradle

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/GoNativeJSBridgeLibrary.js

// this function accepts a callback function as params.callback that will be called with the command results // if a callback is not provided it returns a promise that will resolve with the command results function addCommandCallback(command, params, persistCallback) { if(params?.callback || params?.callbackFunction || params?.statuscallback){ // execute command with provided callback function addCommand(command, params, persistCallback); } else { // create a temporary function and return a promise that executes command var tempFunctionName = 'median_temp' + Math.random().toString(36).slice(2); if(!params) params = {}; params.callback = tempFunctionName; return new Promise(function(resolve, reject) { // declare a temporary function window[tempFunctionName] = function(data) { resolve(data); delete window[tempFunctionName]; } // execute command addCommand(command, params); }); } }

function addCallbackFunction(callbackFunction, persistCallback){ var callbackName; if(typeof callbackFunction === 'string'){ callbackName = callbackFunction; } else { callbackName = 'median_temp' + Math.random().toString(36).slice(2); window[callbackName] = function(...args) { callbackFunction.apply(null, args); if(!persistCallback){ // if callback is used just once delete window[callbackName]; } } } return callbackName; }

function addCommand(command, params, persistCallback){ var data = undefined; if(params) { var commandObject = {}; if(params.callback && typeof params.callback === 'function'){ params.callback = addCallbackFunction(params.callback, persistCallback); } if(params.callbackFunction && typeof params.callbackFunction === 'function'){ params.callbackFunction = addCallbackFunction(params.callbackFunction, persistCallback); } if(params.statuscallback && typeof params.statuscallback === 'function'){ params.statuscallback = addCallbackFunction(params.statuscallback, persistCallback); } commandObject.medianCommand = command; commandObject.data = params; data = JSON.stringify(commandObject); } else data = command;

JSBridge.postMessage(data);

}

/////////////////////////////// //// General Commands //// ///////////////////////////////

var median = {};

// backward compatibility for GoNative var gonative = median;

// to be modified as required median.nativebridge = { custom: function (params){ addCommand("median://nativebridge/custom", params); }, multi: function (params){ addCommand("median://nativebridge/multi", params); } };

median.registration = { send: function(customData){ var params = {customData: customData}; addCommand("median://registration/send", params); } };

median.sidebar = { setItems: function (params){ addCommand("median://sidebar/setItems", params); }, getItems: function (params){ return addCommandCallback("median://sidebar/getItems", params); } };

median.tabNavigation = { selectTab: function (tabIndex){ addCommand("median://tabs/select/" + tabIndex); }, deselect: function (){ addCommand("median://tabs/deselect"); }, setTabs: function (tabsObject){ var params = {tabs: tabsObject}; addCommand("median://tabs/setTabs", params); } };

median.share = { sharePage: function (params){ addCommand("median://share/sharePage", params); }, downloadFile: function (params){ addCommand("median://share/downloadFile", params); }, downloadImage: function(params){ addCommand("median://share/downloadImage", params); } };

median.open = { appSettings: function (){ addCommand("median://open/app-settings"); } };

median.webview = { clearCache: function(){ addCommand("median://webview/clearCache"); }, clearCookies: function(){ addCommand("median://webview/clearCookies"); }, reload: function (){ addCommand("median://webview/reload"); } };

median.config = { set: function(params){ addCommand("median://config/set", params); } };

median.navigationTitles = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("median://navigationTitles/set", params); }, setCurrent: function (params){ addCommand("median://navigationTitles/setCurrent", params); }, revert: function(){ addCommand("median://navigationTitles/set?persist=true"); } };

median.navigationLevels = { set: function (parameters){ var params = { persist: parameters.persist, data: parameters }; addCommand("median://navigationLevels/set", params); }, setCurrent: function(params){ addCommand("median://navigationLevels/set", params); }, revert: function(){ addCommand("median://navigationLevels/set?persist=true"); } };

median.statusbar = { set: function (params){ addCommand("median://statusbar/set", params); } };

median.screen = { setBrightness: function(data){ var params = data; if(typeof params === 'number'){ params = {brightness: data}; } addCommand("median://screen/setBrightness", params); }, setMode: function(params) { if (params.mode) { addCommand("median://screen/setMode", params); } } };

median.navigationMaxWindows = { set: function (maxWindows, autoClose){ var params = { data: maxWindows, autoClose: autoClose, persist: true }; addCommand("median://navigationMaxWindows/set", params); }, setCurrent: function(maxWindows, autoClose){ var params = {data: maxWindows, autoClose: autoClose}; addCommand("median://navigationMaxWindows/set", params); } }

median.window = { open: function (urlString, mode) { var params = {url: urlString, mode}; addCommand("median://window/open", params); }, close: function () { addCommand("median://window/close"); } }

median.connectivity = { get: function (params){ return addCommandCallback("median://connectivity/get", params); }, subscribe: function (params){ return addCommandCallback("median://connectivity/subscribe", params, true); }, unsubscribe: function (){ addCommand("median://connectivity/unsubscribe"); } };

median.run = { deviceInfo: function(){ addCommand("median://run/median_device_info"); } };

median.deviceInfo = function(params){ return addCommandCallback("median://run/median_device_info", params, true); };

median.internalExternal = { set: function(params){ addCommand("median://internalExternal/set", params); } };

median.clipboard = { set: function(params){ addCommand("median://clipboard/set", params); }, get: function(params){ return addCommandCallback("median://clipboard/get", params); } };

median.keyboard = { info: function(params){ return addCommandCallback("median://keyboard/info", params); }, listen: function(callback){ var params = {callback}; addCommand("median://keyboard/listen", params); } };

////////////////////////////////////// //// Webpage Helper Functions //// //////////////////////////////////////

function median_match_statusbar_to_body_background_color() { let rgb = window.getComputedStyle(document.body, null).getPropertyValue('background-color'); let sep = rgb.indexOf(",") > -1 ? "," : " "; rgb = rgb.substring(rgb.indexOf('(')+1).split(")")[0].split(sep).map(function(x) { return x * 1; }); if(rgb.length === 4){ rgb = rgb.map(function(x){ return parseInt(x * rgb[3]); }) } let hex = '#' + rgb[0].toString(16).padStart(2,'0') + rgb[1].toString(16).padStart(2,'0') + rgb[2].toString(16).padStart(2,'0'); let luma = 0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]; // per ITU-R BT.709 if(luma > 40){ median.statusbar.set({'style': 'dark', 'color': hex}); } else{ median.statusbar.set({'style': 'light', 'color': hex}); } }

function gonative_match_statusbar_to_body_background_color() { median_match_statusbar_to_body_background_color(); }

/////////////////////////////// //// Android Exclusive //// ///////////////////////////////

median.android = {};

median.android.geoLocation = { promptLocationServices: function(){ addCommand("median://geoLocation/promptLocationServices"); }, isLocationServicesEnabled: function(params) { return addCommandCallback("median://geoLocation/isLocationServicesEnabled", params); } };

median.android.screen = { fullscreen: function(){ addCommand("median://screen/fullscreen"); }, normal: function(){ addCommand("median://screen/normal"); }, keepScreenOn: function(){ addCommand("median://screen/keepScreenOn"); }, keepScreenNormal: function(){ addCommand("median://screen/keepScreenNormal"); } };

median.android.audio = { requestFocus: function(enabled){ var params = {enabled: enabled}; addCommand("median://audio/requestFocus", params); } };

median.android.swipeGestures = { enable: function() { addCommand("median://swipeGestures/enable"); }, disable: function() { addCommand("median://swipeGestures/disable"); } }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/GoNativeJSBridgeLibrary.js

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/MySwipeRefreshLayout.java

package co.median.android;

import android.content.Context; import android.util.AttributeSet;

import co.median.android.widget.GoNativeSwipeRefreshLayout;

/**

  • Created by weiyin on 9/13/15.

  • Copyright 2014 GoNative.io LLC */ public class MySwipeRefreshLayout extends GoNativeSwipeRefreshLayout { private CanChildScrollUpCallback canChildScrollUpCallback;

    public interface CanChildScrollUpCallback { boolean canSwipeRefreshChildScrollUp(); }

    public MySwipeRefreshLayout(Context context) { super(context); }

    public MySwipeRefreshLayout(Context context, AttributeSet attrs) { super(context, attrs); }

    public void setCanChildScrollUpCallback(CanChildScrollUpCallback canChildScrollUpCallback) { this.canChildScrollUpCallback = canChildScrollUpCallback; }

    @Override public boolean canChildScrollUp() { if (canChildScrollUpCallback != null) { return canChildScrollUpCallback.canSwipeRefreshChildScrollUp(); } else { return super.canChildScrollUp(); } }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/MySwipeRefreshLayout.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppLinksActivity.java

package co.median.android;

import android.content.Intent; import android.os.Bundle;

import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity;

public class AppLinksActivity extends AppCompatActivity {

public static final String LAUNCH_SOURCE_APP_LINKS = "app_links";

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    launchApp();
}

private void launchApp() {
    Intent intent = new Intent(this, MainActivity.class);
    if (getIntent().getData() != null) {
        intent.setData(getIntent().getData());
        intent.setAction(Intent.ACTION_VIEW);
        intent.putExtra("source", LAUNCH_SOURCE_APP_LINKS);
    }
    startActivity(intent);
    finish();
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/AppLinksActivity.java

Start of /mnt/data/jocal3--U/jocal3--U/android/CHANGELOG.md

Changelog

2014-01-04

  • Fix a crash on reload with no page loaded.

2015-01-02

  • Update to latest gradle and build tools versions, making the project compatible with Android Studio 1.0.
  • Fix bugs related to syncing of tabs with sidebar menu.

2014-12-23

  • Allow setting of viewport while preserving ability to zoom.
  • Allow dynamic config of navigation title image URLs.
  • Various bug fixes involving javascript after page load, and tab coloring, tab animations, and a crash on application resume.

2014-12-22

  • Fix various threading bugs where UI methods were called from non-UI threads.

2014-12-05

  • Support showing the navigation title image on specific URLs.

2014-12-03

  • Support customizing user agent per URL.
  • Add color styling options for tabs.

2014-11-30

  • New tabs with better material design and animations.
  • Fix some automatic icon generation scripts.

2014-11-26

  • Fix a crash involving webview pools.

2014-11-25

  • Add support for custom actions in action bar.

End of /mnt/data/jocal3--U/jocal3--U/android/CHANGELOG.md

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/BlobDownloader.js

// This is used because download from native side won't have session changes.

function gonativeDownloadBlobUrl(url) { var req = new XMLHttpRequest(); req.open('GET', url, true); req.responseType = 'blob';

req.onload = function(event) {
    var blob = req.response;
    saveBlob(blob);
};
req.send();

function sendMessage(message) {
    if (window.webkit && window.webkit.messageHandlers &&
        window.webkit.messageHandlers.fileWriterSharer) {
        window.webkit.messageHandlers.fileWriterSharer.postMessage(message);
    }
    if (window.gonative_file_writer_sharer && window.gonative_file_writer_sharer.postMessage) {
        window.gonative_file_writer_sharer.postMessage(JSON.stringify(message));
    }
}

function saveBlob(blob, filename) {
    var chunkSize = 1024 * 1024; // 1mb
    var index = 0;
    // random string to identify this file transfer
    var id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);

    function sendHeader() {
        sendMessage({
            event: 'fileStart',
            id: id,
            size: blob.size,
            type: blob.type,
            name: filename
        });
    }

    function sendChunk() {
        if (index >= blob.size) {
            return sendEnd();
        }

        var chunkToSend = blob.slice(index, index + chunkSize);
        var reader = new FileReader();
        reader.readAsDataURL(chunkToSend);
        reader.onloadend = function() {
            sendMessage({
                event: 'fileChunk',
                id: id,
                data: reader.result
            });
            index += chunkSize;
            setTimeout(sendChunk);
        };
    }
    
    function sendEnd() {
        sendMessage({
            event: 'fileEnd',
            id:id
        });
    }
    
    sendHeader();
    gonative_run_after_storage_permissions.push(sendChunk);
}

}

gonative_run_after_storage_permissions = []; function gonativeGotStoragePermissions() { while (gonative_run_after_storage_permissions.length > 0) { var run = gonative_run_after_storage_permissions.shift(); run(); } }

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/assets/BlobDownloader.js

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigPreferences.java

package co.median.android;

import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.text.TextUtils;

public class ConfigPreferences { private static final String APP_THEME_KEY = "io.gonative.android.appTheme";

private Context context;
private SharedPreferences sharedPreferences;

public ConfigPreferences(Context context) {
    this.context = context;
}

private SharedPreferences getSharedPreferences() {
    if (this.sharedPreferences == null) {
        this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.context);
    }
    return this.sharedPreferences;
}

public String getAppTheme() {
    SharedPreferences preferences = getSharedPreferences();
    return preferences.getString(APP_THEME_KEY, null);
}

public void setAppTheme(String appTheme) {
    SharedPreferences preferences = getSharedPreferences();
    if (TextUtils.isEmpty(appTheme)) {
        preferences.edit().remove(APP_THEME_KEY).commit();
    } else {
        preferences.edit().putString(APP_THEME_KEY, appTheme).commit();
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigPreferences.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileWriterSharer.java

package co.median.android;

import android.Manifest; import android.content.ActivityNotFoundException; import android.content.ContentResolver; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.MimeTypeMap; import android.widget.Toast;

import androidx.core.content.FileProvider;

import org.json.JSONException; import org.json.JSONObject;

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import java.util.Objects;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.LeanUtils;

public class FileWriterSharer { private static final String TAG = FileWriterSharer.class.getSimpleName(); private static final long MAX_SIZE = 1024 * 1024 * 1024; // 1 gigabyte private static final String BASE64TAG = ";base64,"; private final FileDownloader.DownloadLocation defaultDownloadLocation; private String downloadFilename; private boolean open = false;

private static class FileInfo{
    public String id;
    public String name;
    public long size;
    public String mimetype;
    public String extension;
    public File savedFile;
    public Uri savedUri;
    public OutputStream fileOutputStream;
    public long bytesWritten;
}

private class JavascriptBridge {
    @JavascriptInterface
    public void postMessage(String jsonMessage) {
        Log.d(TAG, "got message " + jsonMessage);
        try {
            JSONObject json = new JSONObject(jsonMessage);
            String event = LeanUtils.optString(json, "event");
            if ("fileStart".equals(event)) {
                onFileStart(json);
            } else if ("fileChunk".equals(event)) {
                onFileChunk(json);
            } else if ("fileEnd".equals(event)) {
                onFileEnd(json);
            } else if ("nextFileInfo".equals(event)) {
                onNextFileInfo(json);
            } else {
                GNLog.getInstance().logError(TAG, "Invalid event " + event);
            }
        } catch (JSONException e) {
            GNLog.getInstance().logError(TAG, "Error parsing message as json", e);
        } catch (IOException e) {
            GNLog.getInstance().logError(TAG, "IO Error", e);
        }
    }
}

private JavascriptBridge javascriptBridge;
private MainActivity context;
private Map<String, FileInfo> idToFileInfo;
private String nextFileName;

public FileWriterSharer(MainActivity context) {
    this.javascriptBridge = new JavascriptBridge();
    this.context = context;
    this.idToFileInfo = new HashMap<>();

    AppConfig appConfig = AppConfig.getInstance(this.context);
    if (appConfig.downloadToPublicStorage) {
        this.defaultDownloadLocation = FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS;
    } else {
        this.defaultDownloadLocation = FileDownloader.DownloadLocation.PRIVATE_INTERNAL;
    }
}

public JavascriptBridge getJavascriptBridge() {
    return javascriptBridge;
}

public void downloadBlobUrl(String url, String filename, boolean open) {
    if (url == null || !url.startsWith("blob:")) {
        return;
    }

    this.downloadFilename = filename;
    this.open = open;

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        BufferedInputStream is = new BufferedInputStream(context.getAssets().open("BlobDownloader.js"));
        IOUtils.copy(is, baos);
        String js = baos.toString();
        context.runJavascript(js);
        js = "gonativeDownloadBlobUrl(" + LeanUtils.jsWrapString(url) + ")";
        context.runJavascript(js);
    } catch (IOException e) {
        GNLog.getInstance().logError(TAG, e.getMessage(), e);
    }
}

private void onFileStart(JSONObject message) throws IOException {
    String identifier = LeanUtils.optString(message, "id");
    if (identifier == null || identifier.isEmpty()) {
        GNLog.getInstance().logError(TAG, "Invalid file id");
        return;
    }

    String fileName;
    String extension = null;
    String type = null;

    if (!TextUtils.isEmpty(downloadFilename)) {
        extension = FileDownloader.getFilenameExtension(downloadFilename);
        if (!TextUtils.isEmpty(extension)) {
            if (Objects.equals(extension, downloadFilename)) {
                fileName = "download";
            } else {
                fileName = downloadFilename.substring(0, downloadFilename.length() - (extension.length() + 1));
            }
            type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
        } else {
            fileName = downloadFilename;
        }
    } else {
        fileName = LeanUtils.optString(message, "name");
        if (fileName == null || fileName.isEmpty()) {
            if (this.nextFileName != null) {
                fileName = this.nextFileName;
                this.nextFileName = null;
            } else {
                fileName = "download";
            }
        }
    }

    long fileSize = message.optLong("size", -1);
    if (fileSize <= 0 || fileSize > MAX_SIZE) {
        GNLog.getInstance().logError(TAG, "Invalid file size");
        return;
    }

    if (TextUtils.isEmpty(type)) {
        type = LeanUtils.optString(message, "type");
        if (TextUtils.isEmpty(type)) {
            GNLog.getInstance().logError(TAG, "Invalid file type");
            return;
        }
    }

    if (TextUtils.isEmpty(extension)) {
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        extension = mimeTypeMap.getExtensionFromMimeType(type);
    }

    final FileInfo info = new FileInfo();
    info.id = identifier;
    info.name = fileName;
    info.size = fileSize;
    info.mimetype = type;
    info.extension = extension;

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) {
        // request permissions
        context.getPermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, (permissions, grantResults) -> {
            try {
                onFileStartAfterPermission(info, grantResults[0] == PackageManager.PERMISSION_GRANTED);
                final String js = "gonativeGotStoragePermissions()";
                context.runOnUiThread(() -> context.runJavascript(js));
            } catch (IOException e) {
                GNLog.getInstance().logError(TAG, "IO Error", e);
            }
        });
    } else {
        onFileStartAfterPermission(info, true);
        final String js = "gonativeGotStoragePermissions()";
        context.runOnUiThread(() -> context.runJavascript(js));
    }
}

private void onFileStartAfterPermission(FileInfo info, boolean granted) throws IOException {
    if (granted && defaultDownloadLocation == FileDownloader.DownloadLocation.PUBLIC_DOWNLOADS) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
            ContentResolver contentResolver = context.getApplicationContext().getContentResolver();
            Uri uri = FileDownloader.createExternalFileUri(contentResolver, info.name, info.mimetype, Environment.DIRECTORY_DOWNLOADS);
            if (uri != null) {
                info.fileOutputStream = contentResolver.openOutputStream(uri);
                info.savedUri = uri;
            }
        } else {
            info.savedFile = FileDownloader.createOutputFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), info.name, info.extension);
            info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile));
        }
    } else {
        info.savedFile = FileDownloader.createOutputFile(context.getFilesDir(), info.name, info.extension);
        info.fileOutputStream = new BufferedOutputStream(new FileOutputStream(info.savedFile));
    }
    info.bytesWritten = 0;
    this.idToFileInfo.put(info.id, info);
}

private void onFileChunk(JSONObject message) throws IOException {
    String identifier = LeanUtils.optString(message, "id");
    if (identifier == null || identifier.isEmpty()) {
        return;
    }

    FileInfo fileInfo = this.idToFileInfo.get(identifier);
    if (fileInfo == null) {
        return;
    }

    String data = LeanUtils.optString(message, "data");
    if (data == null) {
        return;
    }

    int idx = data.indexOf(BASE64TAG);
    if (idx == -1) {
        return;
    }

    idx += BASE64TAG.length();
    byte[] chunk = Base64.decode(data.substring(idx), Base64.DEFAULT);

    if (fileInfo.bytesWritten + chunk.length > fileInfo.size) {
        GNLog.getInstance().logError(TAG, "Received too many bytes. Expected " + fileInfo.size);
        try {
            fileInfo.fileOutputStream.close();
            fileInfo.savedFile.delete();
            this.idToFileInfo.remove(identifier);
        } catch (Exception ignored) {

        }

        return;
    }

    fileInfo.fileOutputStream.write(chunk);
    fileInfo.bytesWritten += chunk.length;
}

private void onFileEnd(JSONObject message) throws IOException {
    String identifier = LeanUtils.optString(message, "id");
    if (identifier == null || identifier.isEmpty()) {
        GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd");
        return;
    }

    final FileInfo fileInfo = this.idToFileInfo.get(identifier);
    if (fileInfo == null) {
        GNLog.getInstance().logError(TAG, "Invalid identifier " + identifier + " for fileEnd");
        return;
    }

    fileInfo.fileOutputStream.close();

    if (open) {
        context.runOnUiThread(() -> {
            if (fileInfo.savedUri == null && fileInfo.savedFile != null) {
                fileInfo.savedUri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".fileprovider", fileInfo.savedFile);
            }
            if (fileInfo.savedUri == null) return;

            Intent intent = getIntentToOpenFile(fileInfo.savedUri, fileInfo.mimetype);
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                String message1 = context.getResources().getString(R.string.file_handler_not_found);
                Toast.makeText(context, message1, Toast.LENGTH_LONG).show();
            }
        });
    } else {
        String downloadCompleteMessage = fileInfo.name != null && !fileInfo.name.isEmpty()
                ? String.format(context.getString(R.string.file_download_finished_with_name), fileInfo.name + '.' + fileInfo.extension)
                : context.getString(R.string.file_download_finished);
        Toast.makeText(context, downloadCompleteMessage, Toast.LENGTH_SHORT).show();
    }
}

private Intent getIntentToOpenFile(Uri uri, String mimetype) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, mimetype);
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NEW_TASK);
    return intent;
}

private void onNextFileInfo(JSONObject message) {
    String name = LeanUtils.optString(message, "name");
    if (name == null || name.isEmpty()) {
        GNLog.getInstance().logError(TAG, "Invalid name for nextFileInfo");
        return;
    }
    this.nextFileName = name;
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileWriterSharer.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigUpdater.java

package co.median.android;

import android.content.Context; import android.os.AsyncTask;

import org.json.JSONException; import org.json.JSONObject;

import java.io.OutputStreamWriter; import java.lang.ref.WeakReference; import java.net.HttpURLConnection; import java.net.URL;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog;

/**

  • Created by weiyin on 8/8/14. */ public class ConfigUpdater { private static final String TAG = ConfigUpdater.class.getName();

    private Context context;

    ConfigUpdater(Context context) { this.context = context; }

    public void registerEvent() { if (AppConfig.getInstance(context).disableEventRecorder) return; new EventTask(context).execute(); }

    private static class EventTask extends AsyncTask<Void, Void, Void> { WeakReference contextReference; EventTask(Context context) { this.contextReference = new WeakReference<>(context); } @Override protected Void doInBackground(Void... params) { Context context = contextReference.get(); if (context == null) return null; JSONObject json = new JSONObject(Installation.getInfo(context)); try { json.put("event", "launch"); } catch (JSONException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); return null; } try { URL url = new URL("https://events.gonative.io/api/events/new"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setDoOutput(true); connection.setDoInput(false); // we do not care about response OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); writer.write(json.toString()); writer.close(); connection.connect(); connection.getResponseCode(); connection.disconnect(); } catch (Exception e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } return null; } }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/ConfigUpdater.java

Start of /mnt/data/jocal3--U/jocal3--U/android/generate-tinted-icons.sh

#!/usr/bin/env bash set -e

DARK_ICONS=( ic_refresh_white_24dp.png ic_search_white_24dp.png ic_share_white_24dp.png )

LIGHT_ICONS=( ic_refresh_black_24dp.png ic_search_black_24dp.png ic_share_black_24dp.png )

DARK_DEFAULT_COLOR=ffffff LIGHT_DEFAULT_COLOR=000000

BASEDIR=$(dirname $0)

function showHelp { echo "Usage: $0 (dark|light) tintColor tintColorDark" echo "Example: $0 light 0000ff ffffff" exit 1

}

if [[ $# -lt 2 ]]; then showHelp fi

theme=echo $1 | tr '[:upper:]' '[:lower:]' tintColor=echo $2 | tr '[:upper:]' '[:lower:]' tintColorDark=echo $3 | tr '[:upper:]' '[:lower:]'

if [[ $theme = light ]]; then icons=("${LIGHT_ICONS[@]}") defaultColor=$LIGHT_DEFAULT_COLOR elif [[ $theme = dark ]]; then icons=("${DARK_ICONS[@]}")
defaultColor=$DARK_DEFAULT_COLOR else showHelp fi

if [[ ${#tintColor} -ne 6 ]]; then showHelp fi

if [[ $tintColor = $defaultColor ]]; then echo "Requested color $tintColor is same as default for theme. Exiting." exit fi

for drawable in ls -d $BASEDIR/app/src/main/res/drawable*; do for file in "${icons[@]}"; do filePath=$drawable/$file if [[ -s "$filePath" ]]; then echo Tinting $filePath convert $filePath -fill "#$tintColor" -colorize 100% $filePath optipng $filePath fi done done

if [[ ${#tintColorDark} -ne 6 ]]; then exit fi

for drawable in ls -d $BASEDIR/app/src/main/res/drawable-night*; do for file in "${icons[@]}"; do filePath=$drawable/$file if [[ -s "$filePath" ]]; then echo Tinting $filePath convert $filePath -fill "#$tintColorDark" -colorize 100% $filePath optipng $filePath fi done done

End of /mnt/data/jocal3--U/jocal3--U/android/generate-tinted-icons.sh

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/HtmlIntercept.java

package co.median.android;

import android.content.Context; import android.text.TextUtils; import android.util.Log; import android.webkit.WebResourceResponse; import android.webkit.WebView;

import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.Locale; import java.util.Map;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.GoNativeWebviewInterface;

/**

  • Created by weiyin on 1/29/16. */

public class HtmlIntercept { private static final String TAG = HtmlIntercept.class.getName();

private Context context;
private String interceptUrl;
private String JSBridgeScript;
private String redirectedUrl;

// track whether we have intercepted a page at all. We will always try to intercept the first time,
// because interceptUrl may not have been set if restoring from a bundle.
private boolean hasIntercepted = false;

HtmlIntercept(Context context) {
    this.context = context;
}

public void setInterceptUrl(String interceptUrl) {
    this.interceptUrl = interceptUrl;
}

public WebResourceResponse interceptHtml(GoNativeWebviewInterface view, String url, String referer) {

    AppConfig appConfig = AppConfig.getInstance(context);
    if (!appConfig.interceptHtml && (appConfig.customHeaders == null || appConfig.customHeaders.isEmpty())) return null;

    if (!hasIntercepted) {
        interceptUrl = url;
        hasIntercepted = true;
    }
    if (!urlMatches(interceptUrl, url)) return null;

    InputStream is = null;
    ByteArrayOutputStream baos = null;

    try {
        URL parsedUrl = new URL(url);
        String protocol = parsedUrl.getProtocol();
        if (!protocol.equalsIgnoreCase("http") && !protocol.equalsIgnoreCase("https")) return null;

        HttpURLConnection connection = (HttpURLConnection)parsedUrl.openConnection();
        connection.setInstanceFollowRedirects(false);
        String customUserAgent = appConfig.userAgentForUrl(parsedUrl.toString());
        if (customUserAgent != null) {
            connection.setRequestProperty("User-Agent", customUserAgent);
        } else {
            connection.setRequestProperty("User-Agent", appConfig.userAgent);
        }
        connection.setRequestProperty("Cache-Control", "no-cache");

        if (referer != null) {
            connection.setRequestProperty("Referer", referer);
        }

        Map<String, String> customHeaders = CustomHeaders.getCustomHeaders(context);
        if (customHeaders != null) {
            for (Map.Entry<String, String> entry : customHeaders.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
        }

        connection.connect();
        int responseCode = connection.getResponseCode();

        if (responseCode == HttpURLConnection.HTTP_MOVED_PERM ||
                responseCode == HttpURLConnection.HTTP_MOVED_TEMP ||
                responseCode == HttpURLConnection.HTTP_SEE_OTHER ||
                responseCode == 307) {
            // Get redirect URL to be loaded directly to webview, return blank resource which we cancel on UrlNavigation.onPageStart()
            // We cannot pass headers in webresourceresponse until Android API 21, and we cannot return null
            // or else the webview will handle the request entirely without intercept
            String location = connection.getHeaderField("Location");

            // validate location as URL
            try {
                new URL(location);
            } catch (MalformedURLException ex) {
                URL base = new URL(url);
                location = new URL(base, location).toString();
            }

            if (!TextUtils.isEmpty(location)) {
                this.redirectedUrl = url;
                MainActivity mainActivity = (MainActivity) context;
                WebView webView = (WebView) mainActivity.getWebView();
                String finalLocation = location; // needed, for this should be effectively final
                webView.post(() -> webView.loadUrl(finalLocation));
            }
            return new WebResourceResponse("text/html", "utf-8", new ByteArrayInputStream("".getBytes()));
        }

        String mimetype = connection.getContentType();
        if (mimetype == null) {
            try {
                is = new BufferedInputStream(connection.getInputStream());
            } catch (IOException e) {
                is = new BufferedInputStream(connection.getErrorStream());
            }
            mimetype = HttpURLConnection.guessContentTypeFromStream(is);
        }

        // if not html, then return null so that webview loads directly.
        if (mimetype == null || !mimetype.startsWith("text/html"))
            return null;

        // get and intercept the data
        String characterEncoding = getCharset(mimetype);
        if (characterEncoding == null) {
            characterEncoding = "UTF-8";
        } else if (characterEncoding.toLowerCase().equals("iso-8859-1")) {
            // windows-1252 is a superset of ios-8859-1 that supports the euro symbol €.
            // The html5 spec actually maps "iso-8859-1" to windows-1252 encoding
            characterEncoding = "windows-1252";
        }

        if (is == null) {
            try {
                is = new BufferedInputStream(connection.getInputStream());
            } catch (IOException e) {
                is = new BufferedInputStream(connection.getErrorStream());
            }
        }

        int initialLength = connection.getContentLength();
        if (initialLength < 0)
            initialLength = UrlNavigation.DEFAULT_HTML_SIZE;

        baos = new ByteArrayOutputStream(initialLength);
        IOUtils.copy(is, baos);
        String origString;
        try {
            origString = baos.toString(characterEncoding);
        } catch (UnsupportedEncodingException e){
            // Everything should support UTF-8
            origString = baos.toString("UTF-8");
        }

        // modify the string!
        String newString;
        int insertPoint = origString.indexOf("</head>");
        if (insertPoint >= 0) {
            StringBuilder builder = new StringBuilder(initialLength);
            builder.append(origString.substring(0, insertPoint));

            if (appConfig.stringViewport != null) {
                builder.append("<meta name=\"viewport\" content=\"");
                builder.append(TextUtils.htmlEncode(appConfig.stringViewport));
                builder.append("\" />");
            }
            if (!Double.isNaN(appConfig.forceViewportWidth)) {
                if (appConfig.zoomableForceViewport) {
                    builder.append(String.format(Locale.US, "<meta name=\"viewport\" content=\"width=%f,maximum-scale=1.0\" />",
                            appConfig.forceViewportWidth));
                }
                else {
                    // we want to use user-scalable=no, but android has a bug that sets scale to
                    // 1.0 if user-scalable=no. The workaround to is calculate the scale and set
                    // it for initial, minimum, and maximum.
                    // http://stackoverflow.com/questions/12723844/android-viewport-setting-user-scalable-no-breaks-width-zoom-level-of-viewpor
                    double webViewWidth = view.getWidth() / context.getResources().getDisplayMetrics().density;
                    double viewportWidth = appConfig.forceViewportWidth;
                    double scale = webViewWidth / viewportWidth;
                    builder.append(String.format(Locale.US, "<meta name=\"viewport\" content=\"width=%f,initial-scale=%f,minimum-scale=%f,maximum-scale=%f\" />",
                            viewportWidth, scale, scale, scale));
                }
            }

            builder.append(origString.substring(insertPoint));
            newString = builder.toString();
        }
        else {
            Log.d(TAG, "could not find closing </head> tag");
            newString = origString;
        }

        return new WebResourceResponse("text/html", "UTF-8",
                new ByteArrayInputStream(newString.getBytes("UTF-8")));
    } catch (Exception e) {
        GNLog.getInstance().logError(TAG, e.toString(), e);
        return null;
    } finally {
        IOUtils.close(is);
        IOUtils.close(baos);
    }
}

// Do these urls match, ignoring trailing slash in path
private static boolean urlMatches(String url1, String url2) {
    if (url1 == null || url2 == null) return false;

    try {
        URL parsed1 = new URL(url1);
        URL parsed2 = new URL(url2);

        if (stringsNotEqual(parsed1.getProtocol(), parsed2.getProtocol())) return false;

        if (stringsNotEqual(parsed1.getAuthority(), parsed2.getAuthority())) return false;

        if (stringsNotEqual(parsed1.getQuery(), parsed2.getQuery())) return false;

        String path1 = parsed1.getPath();
        String path2 = parsed2.getPath();
        if (path1 == null) path1 = "";
        if (path2 == null) path2 = "";

        int lengthDiff = path2.length() - path2.length();
        if (lengthDiff > 1 || lengthDiff < -1) return false;
        if (lengthDiff == 0) return path1.equals(path2);
        if (lengthDiff == 1) {
            return path2.equals(path1 + "/");
        }

        // lengthDiff == -1
        return path1.equals(path2 + "/");
    } catch (MalformedURLException e) {
        return false;
    }
}

private static boolean stringsNotEqual(String s1, String s2) {
    return !(s1 == null ? s2 == null : s1.equals(s2));
}

private static String getCharset(String contentType) {
    if (contentType == null || contentType.isEmpty()) {
        return null;
    }

    String[] tokens = contentType.split("; *");
    for (String s : tokens) {
        if (s.startsWith("charset=")) {
            return s.substring("charset=".length());
        }
    }

    return null;
}

public String getRedirectedUrl() {
    return redirectedUrl;
}

public void setRedirectedUrl(String redirectUrl) {
    this.redirectedUrl = redirectUrl;
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/HtmlIntercept.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileDownloader.java

package co.median.android;

import android.Manifest; import android.content.ComponentName; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.os.IBinder; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; import android.webkit.DownloadListener; import android.webkit.MimeTypeMap; import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.core.content.ContextCompat;

import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Objects;

import co.median.median_core.AppConfig; import co.median.median_core.LeanUtils;

/**

  • Created by weiyin on 6/24/14. */ public class FileDownloader implements DownloadListener { public enum DownloadLocation { PUBLIC_DOWNLOADS, PRIVATE_INTERNAL }

    private static final String TAG = FileDownloader.class.getName(); private final MainActivity context; private final DownloadLocation defaultDownloadLocation; private final ActivityResultLauncher<String[]> requestPermissionLauncher; private UrlNavigation urlNavigation; private String lastDownloadedUrl; private DownloadService downloadService; private boolean isBound = false; private PreDownloadInfo preDownloadInfo;

    private final ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { DownloadService.DownloadBinder binder = (DownloadService.DownloadBinder) iBinder; downloadService = binder.getService(); isBound = true; } @Override public void onServiceDisconnected(ComponentName componentName) { downloadService = null; isBound = false; } };

    FileDownloader(MainActivity context) { this.context = context; AppConfig appConfig = AppConfig.getInstance(this.context); if (appConfig.downloadToPublicStorage) { this.defaultDownloadLocation = DownloadLocation.PUBLIC_DOWNLOADS; } else { this.defaultDownloadLocation = DownloadLocation.PRIVATE_INTERNAL; } Intent intent = new Intent(context, DownloadService.class); context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); // initialize request permission launcher requestPermissionLauncher = context.registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), isGranted -> { if (isGranted.containsKey(Manifest.permission.WRITE_EXTERNAL_STORAGE) && Boolean.FALSE.equals(isGranted.get(Manifest.permission.WRITE_EXTERNAL_STORAGE))) { Toast.makeText(context, "Unable to save download, storage permission denied", Toast.LENGTH_SHORT).show(); return; } if (preDownloadInfo != null && isBound) { if (preDownloadInfo.isBlob) { context.getFileWriterSharer().downloadBlobUrl(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.open); } else { downloadService.startDownload(preDownloadInfo.url, preDownloadInfo.filename, preDownloadInfo.mimetype, preDownloadInfo.shouldSaveToGallery, preDownloadInfo.open, defaultDownloadLocation); } preDownloadInfo = null; } }); }

    @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if (urlNavigation != null) { urlNavigation.onDownloadStart(); } if (context != null) { context.runOnUiThread(new Runnable() { @Override public void run() { context.showWebview(); } }); } // get filename from content disposition String guessFilename = null; if (!TextUtils.isEmpty(contentDisposition)) { guessFilename = LeanUtils.guessFileName(url, contentDisposition, mimetype); } if (url.startsWith("blob:") && context != null) { boolean openAfterDownload = defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL; if (requestRequiredPermission(new PreDownloadInfo(url, guessFilename, true, openAfterDownload))) { return; } context.getFileWriterSharer().downloadBlobUrl(url, guessFilename, openAfterDownload); return; } lastDownloadedUrl = url; // try to guess mimetype if (mimetype == null || mimetype.equalsIgnoreCase("application/force-download") || mimetype.equalsIgnoreCase("application/octet-stream")) { MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null && !extension.isEmpty()) { String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); if (guessedMimeType != null) { mimetype = guessedMimeType; } } } startDownload(url, guessFilename, mimetype, false, false); }

    public void downloadFile(String url, String filename, boolean shouldSaveToGallery, boolean open) { if (TextUtils.isEmpty(url)) { Log.d(TAG, "downloadFile: Url empty!"); return; } if (url.startsWith("blob:") && context != null) { if (defaultDownloadLocation == DownloadLocation.PRIVATE_INTERNAL) { open = true; } if (requestRequiredPermission(new PreDownloadInfo(url, filename, true, open))) { return; } context.getFileWriterSharer().downloadBlobUrl(url, filename, open); return; } String mimetype = "/"; MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String extension = MimeTypeMap.getFileExtensionFromUrl(url); if (extension != null && !extension.isEmpty()) { String guessedMimeType = mimeTypeMap.getMimeTypeFromExtension(extension); if (guessedMimeType != null) { mimetype = guessedMimeType; } } startDownload(url, filename, mimetype, shouldSaveToGallery, open); }

    private void startDownload(String downloadUrl, String filename, String mimetype, boolean shouldSaveToGallery, boolean open) { if (isBound) { if (requestRequiredPermission(new PreDownloadInfo(downloadUrl, filename, mimetype, shouldSaveToGallery, open, false))) return; downloadService.startDownload(downloadUrl, filename, mimetype, shouldSaveToGallery, open, defaultDownloadLocation); } }

    // Requests required permission depending on device's SDK version private boolean requestRequiredPermission(PreDownloadInfo preDownloadInfo) {

     List<String> permissions = new ArrayList<>();
    
     if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P &&
             ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED &&
             defaultDownloadLocation == DownloadLocation.PUBLIC_DOWNLOADS) {
         permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
     }
    
     if (permissions.size() > 0) {
         this.preDownloadInfo = preDownloadInfo;
         requestPermissionLauncher.launch(permissions.toArray(new String[] {}));
         return true;
     }
     return false;
    

    }

    public String getLastDownloadedUrl() { return lastDownloadedUrl; }

    public void setUrlNavigation(UrlNavigation urlNavigation) { this.urlNavigation = urlNavigation; }

    public void unbindDownloadService() { if (isBound) { context.unbindService(serviceConnection); isBound = false; } }

    public static Uri createExternalFileUri(ContentResolver contentResolver, String filename, String mimetype, String environment) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimetype); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, environment); Uri baseExternalUri = getBaseExternalUriForEnvironment(environment); if (baseExternalUri == null) { return null; } return createFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); }

    private static Uri createFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { try { // Let the system create the unique URI first. Some device models(e.g., Samsung) will throw IllegalStateException // https://stackoverflow.com/questions/61654022/java-lang-illegalstateexception-failed-to-build-unique-file-storage-emulated Uri uri = contentResolver.insert(baseExternalUri, contentValues); // On certain Android versions (e.g., Android 10), a null URI may be returned due to a System-thrown SQLiteConstraintException. // We handle this by forcibly creating one. if (uri == null) { uri = createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); } return uri; } catch (IllegalStateException ex) { return createUniqueFileUri(baseExternalUri, contentResolver, contentValues, filename, mimetype); } }

    private static Uri createUniqueFileUri(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename, String mimetype) { try { String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mimetype); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, getUniqueExternalFileName(contentResolver, baseExternalUri, filename, extension)); return contentResolver.insert(baseExternalUri, contentValues); } catch (IllegalStateException ex) { return createUniqueFileUriWithTimeStamp(baseExternalUri, contentResolver, contentValues, filename); } }

    private static Uri createUniqueFileUriWithTimeStamp(Uri baseExternalUri, ContentResolver contentResolver, ContentValues contentValues, String filename) { try { contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, filename + "_" + System.currentTimeMillis()); return contentResolver.insert(baseExternalUri, contentValues); } catch (IllegalStateException ex) { return null; } }

    public static String getFileNameFromUri(Uri uri, ContentResolver contentResolver) { String fileName = null; String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; Cursor cursor = contentResolver.query(uri, projection, null, null, null); if (cursor != null) { try { if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); fileName = cursor.getString(columnIndex); } } finally { cursor.close(); } } return fileName; }

    private static Uri getBaseExternalUriForEnvironment(String environment) { if (Objects.equals(environment, Environment.DIRECTORY_PICTURES)) { return MediaStore.Images.Media.getContentUri("external"); } else if (Objects.equals(environment, Environment.DIRECTORY_DOWNLOADS)) { return MediaStore.Files.getContentUri("external"); } return null; }

    private static String getUniqueExternalFileName(ContentResolver contentResolver, Uri baseUri, String filename, String extension) { int suffix = 1; String newFilename = filename; while (externalFileExists(contentResolver, baseUri, newFilename + "." + extension)) { newFilename = filename + " (" + suffix + ")"; suffix++; } return newFilename; }

    private static boolean externalFileExists(ContentResolver contentResolver, Uri baseUri, String filename) { String[] projection = {MediaStore.MediaColumns.DISPLAY_NAME}; String selection = MediaStore.MediaColumns.DISPLAY_NAME + "=?"; String[] selectionArgs = {filename}; try (Cursor cursor = contentResolver.query(baseUri, projection, selection, selectionArgs, null)) { if (cursor != null && cursor.moveToFirst()) { return true; } } catch (Exception e) { Log.w(TAG, "externalFileExists: ", e); } return false; }

    public static File createOutputFile(File dir, String filename, String extension) { return new File(dir, FileDownloader.getUniqueFileName(filename + "." + extension, dir)); }

    public static String getUniqueFileName(String fileName, File dir) { File file = new File(dir, fileName); if (!file.exists()) { return fileName; } int count = 1; String nameWithoutExt = fileName.substring(0, fileName.lastIndexOf('.')); String ext = fileName.substring(fileName.lastIndexOf('.')); String newFileName = nameWithoutExt + "" + count + ext; file = new File(dir, newFileName); while (file.exists()) { count++; newFileName = nameWithoutExt + "" + count + ext; file = new File(dir, newFileName); } return file.getName(); }

    public static String getFilenameExtension(String name) { int pos = name.lastIndexOf('.'); if (pos == -1) { return null; } else if (pos == 0) { return name; } else { return name.substring(pos + 1); } }

    private static class PreDownloadInfo { String url; String filename; String mimetype; boolean shouldSaveToGallery; boolean open; boolean isBlob; public PreDownloadInfo(String url, String filename, String mimetype, boolean shouldSaveToGallery, boolean open, boolean isBlob) { this.url = url; this.filename = filename; this.mimetype = mimetype; this.shouldSaveToGallery = shouldSaveToGallery; this.open = open; this.isBlob = isBlob; } public PreDownloadInfo(String url, String filename, boolean isBlob, boolean open) { this.url = url; this.filename = filename; this.isBlob = isBlob; this.open = open; } }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/FileDownloader.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlInspector.java

package co.median.android;

import android.content.Context;

import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog;

/**

  • Created by weiyin on 4/28/14. */ public class UrlInspector { private static final String TAG = UrlInspector.class.getName(); // singleton private static UrlInspector instance = null;

    private Pattern userIdRegex = null;

    private String userId = null;

    public static UrlInspector getInstance(){ if (instance == null) { instance = new UrlInspector(); } return instance; }

    public void init(Context context) { String regexString = AppConfig.getInstance(context).userIdRegex; if (regexString != null && !regexString.isEmpty()) { try { userIdRegex = Pattern.compile(regexString); } catch (PatternSyntaxException e) { GNLog.getInstance().logError(TAG, e.getMessage(), e); } } }

    private UrlInspector() { // prevent direct instantiation }

    public void inspectUrl(String url) { if (userIdRegex != null) { Matcher matcher = userIdRegex.matcher(url); if (matcher.groupCount() > 0 && matcher.find()) { setUserId(matcher.group(1)); } } }

    public String getUserId() { return userId; }

    private void setUserId(String userId) { this.userId = userId; }

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlInspector.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsCustomCodeExecutor.java

package co.median.android;

import org.json.JSONException; import org.json.JSONObject;

import java.util.Map;

import co.median.median_core.GNLog;

public class JsCustomCodeExecutor { private static final String TAG = JsCustomCodeExecutor.class.getName();

public static interface CustomCodeHandler {
    JSONObject execute(Map<String, String> params);
}

// The default CustomCodeHandler "Echo"
// Simply maps all the key/values of the given params into a JSONObject
private static CustomCodeHandler handler = new CustomCodeHandler() {
    @Override
    public JSONObject execute(Map<String, String> params) {
        if(params != null) {
            JSONObject json = new JSONObject();
            try {
                for(Map.Entry<String, String> entry : params.entrySet()) {
                    json.put(entry.getKey(), entry.getValue());
                }
            }
            catch(JSONException e) {
                GNLog.getInstance().logError(TAG, "Error building custom Json Data", e);
            }
            return json;
        }
        return null;
    }
};

/**
 * Set new CustomCodeHandler to override the default "Echo" handler
 * @param customHandler
 */
public static void setHandler(CustomCodeHandler customHandler) {
    if(customHandler == null)
        return;
    handler = customHandler;
}

/**
 * Code Handler gets triggered by the UrlNavigation class
 *
 * @param params A map consisting of all URI parameters and their values
 * @return A JSONObject as defined by the Code Handler
 *
 * @see UrlNavigation#shouldOverrideUrlLoading
 */
public static JSONObject execute(Map<String, String> params) {
    try {
        return handler.execute(params);
    } catch(Exception e) {
        GNLog.getInstance().logError(TAG, "Error executing custom code", e);
        return null;
    }
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/JsCustomCodeExecutor.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlNavigation.java

package co.median.android;

import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.SharedPreferences; import android.location.LocationManager; import android.net.Uri; import android.net.http.SslError; import android.os.AsyncTask; import android.os.Build; import android.os.Handler; import android.os.Message; import android.preference.PreferenceManager; import android.provider.Settings; import android.security.KeyChain; import android.security.KeyChainAliasCallback; import android.text.TextUtils; import android.util.Log; import android.util.Pair; import android.webkit.ClientCertRequest; import android.webkit.CookieManager; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.RequiresApi; import androidx.localbroadcastmanager.content.LocalBroadcastManager;

import org.json.JSONArray; import org.json.JSONObject;

import java.net.URISyntaxException; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.regex.Pattern;

import co.median.median_core.AppConfig; import co.median.median_core.GNLog; import co.median.median_core.GoNativeWebviewInterface; import co.median.median_core.LeanUtils; import co.median.median_core.RegexRulesManager; import co.median.median_core.Utils;

enum WebviewLoadState { STATE_UNKNOWN, STATE_START_LOAD, // we have decided to load the url in this webview in shouldOverrideUrlLoading STATE_PAGE_STARTED, // onPageStarted has been called STATE_DONE // onPageFinished has been called }

public class UrlNavigation { public static final String STARTED_LOADING_MESSAGE = "io.gonative.android.webview.started"; public static final String FINISHED_LOADING_MESSAGE = "io.gonative.android.webview.finished"; public static final String CLEAR_POOLS_MESSAGE = "io.gonative.android.webview.clearPools";

private static final String TAG = UrlNavigation.class.getName();
private static final String CALLBACK_APP_BROWSER_CLOSED = "median_appbrowser_closed";

private static final String ASSET_URL = "file:///android_asset/";
public static final String OFFLINE_PAGE_URL = "file:///android_asset/offline.html";
public static final String OFFLINE_PAGE_URL_RAW = "file:///offline.html";

public static final int DEFAULT_HTML_SIZE = 10 * 1024; // 10 kilobytes

private MainActivity mainActivity;
private String profilePickerExec;
private String gnProfilePickerExec;
private String currentWebviewUrl;
private HtmlIntercept htmlIntercept;
private Handler startLoadTimeout = new Handler();
ActivityResultLauncher<Intent> activityResultLauncher;

private WebviewLoadState state = WebviewLoadState.STATE_UNKNOWN;
private boolean mVisitedLoginOrSignup = false;
private boolean finishOnExternalUrl = false;
private double connectionOfflineTime;

private String interceptedRedirectUrl = "";

UrlNavigation(MainActivity activity) {
    this.mainActivity = activity;
    this.htmlIntercept = new HtmlIntercept(activity);

    AppConfig appConfig = AppConfig.getInstance(mainActivity);

    // profile picker
    if (appConfig.profilePickerJS != null) {
        this.profilePickerExec = "median_profile_picker.parseJson(eval("
                + LeanUtils.jsWrapString(appConfig.profilePickerJS)
                + "))";

        this.gnProfilePickerExec = "gonative_profile_picker.parseJson(eval("
                + LeanUtils.jsWrapString(appConfig.profilePickerJS)
                + "))";
    }

    if (mainActivity.getIntent().getBooleanExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, false)) {
        finishOnExternalUrl = true;
    }

    connectionOfflineTime = appConfig.androidConnectionOfflineTime;
    activityResultLauncher = activity.registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(), result -> {
                String callback = LeanUtils.createJsForCallback(CALLBACK_APP_BROWSER_CLOSED, null);
                mainActivity.runJavascript(callback);
            });
}

private boolean isInternalUri(Uri uri) {
    String scheme = uri.getScheme();
    if (scheme == null || (!scheme.equalsIgnoreCase("http") && !scheme.equalsIgnoreCase("https"))) {
        return false;
    }

    AppConfig appConfig = AppConfig.getInstance(mainActivity);
    RegexRulesManager regexRulesManager = appConfig.regexRulesManager;
    String urlString = uri.toString();

    // first check regexes
    if (!regexRulesManager.isEmpty()) {
        return regexRulesManager.getMode(urlString).equals(RegexRulesManager.MODE_INTERNAL);
    }

    String host = uri.getHost();
    String initialHost = appConfig.initialHost;

    return host != null &&
            (host.equals(initialHost) || host.endsWith("." + initialHost));
}

public boolean shouldOverrideUrlLoading(GoNativeWebviewInterface view, String url) {
    return shouldOverrideUrlLoading(view, url, false, false);
}

// noAction to skip stuff like opening url in external browser, higher nav levels, etc.
private boolean shouldOverrideUrlLoadingNoIntercept(final GoNativeWebviewInterface view, final String url,
                                                    @SuppressWarnings("SameParameterValue") final boolean noAction) {

// Log.d(TAG, "shouldOverrideUrl: " + url);

    // return if url is null (can happen if clicking refresh when there is no page loaded)
    if (url == null)
        return false;

    // return if loading from local assets
    if (url.startsWith(ASSET_URL)) return false;

    if (url.startsWith("blob:")) return false;

    view.setCheckLoginSignup(true);

    Uri uri = Uri.parse(url);

    if (uri.getScheme() != null && uri.getScheme().equals("gonative-bridge")) {
        if (noAction) return true;

        try {
            String json = uri.getQueryParameter("json");

            JSONArray parsedJson = new JSONArray(json);
            for (int i = 0; i < parsedJson.length(); i++) {
                JSONObject entry = parsedJson.optJSONObject(i);
                if (entry == null) continue;

                String command = entry.optString("command");
                if (command.isEmpty()) continue;

                if (command.equals("pop")) {
                    if (mainActivity.isNotRoot()) mainActivity.finish();
                } else if (command.equals("clearPools")) {
                    LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(
                            new Intent(UrlNavigation.CLEAR_POOLS_MESSAGE));
                }
            }
        } catch (Exception e) {
            // do nothing
        }

        return true;
    }

    final AppConfig appConfig = AppConfig.getInstance(mainActivity);
    // Check native bridge urls
    if (("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) && currentWebviewUrl != null &&
            !LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity)) {
        GNLog.getInstance().logError(TAG, "URL not authorized for native bridge: " + currentWebviewUrl);
        return true;
    }

    if ("median".equals(uri.getScheme()) || "gonative".equals(uri.getScheme())) {
        ((GoNativeApplication) mainActivity.getApplication()).mBridge.handleJSBridgeFunctions(mainActivity, uri);
        return true;
    }

    // check redirects
    if (appConfig.getRedirects() != null) {
        String to = appConfig.getRedirects().get(url);
        if (to == null) to = appConfig.getRedirects().get("*");
        if (to != null && !to.equals(url)) {
            if (noAction) return true;

            final String destination = to;
            mainActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mainActivity.loadUrl(destination);
                }
            });
            return true;
        }
    }

    if (!isInternalUri(uri)) {
        if (noAction) return true;

        String mode = appConfig.regexRulesManager.getMode(uri.toString());
        if (mode.equals(RegexRulesManager.MODE_APP_BROWSER)) {
            mainActivity.openAppBrowser(uri);
        } else {
            Log.d(TAG, "processing dynamic link: " + uri);
            Intent intent = null;
            // launch browser
            try {
                if ("intent".equals(uri.getScheme())) {
                    intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME);
                    mainActivity.startActivity(intent);
                } else if ("http".equals(uri.getScheme()) || "https".equals(uri.getScheme())) {
                    // forces this URL to be launched in this device's default browser, regardless of the app's deeplink
                    mainActivity.openExternalBrowser(uri);
                } else {
                    intent = new Intent(Intent.ACTION_VIEW, uri);
                    mainActivity.startActivity(intent);
                }
            } catch (ActivityNotFoundException ex) {
                // Try loading fallback url if available
                if (intent != null) {
                    String fallbackUrl = intent.getStringExtra("browser_fallback_url");
                    if (!TextUtils.isEmpty(fallbackUrl)) {
                        mainActivity.loadUrl(fallbackUrl);
                    } else {
                        Toast.makeText(mainActivity, R.string.app_not_installed, Toast.LENGTH_LONG).show();
                        GNLog.getInstance().logError(TAG, mainActivity.getString(R.string.app_not_installed), ex, GNLog.TYPE_TOAST_ERROR);
                    }
                }
            } catch (URISyntaxException e) {
                GNLog.getInstance().logError(TAG, e.getMessage(), e);
            }
        }

        // If this URL launched the app initially via deeplink action,
        // load initialURL so the app does not show a blank page.
        if (AppLinksActivity.LAUNCH_SOURCE_APP_LINKS.equals(mainActivity.getLaunchSource()) && getCurrentWebviewUrl() == null) {
            mainActivity.loadUrl(appConfig.getInitialUrl());
        }
        return true;
    }

    // Starting here, we are going to load the request, but possibly in a
    // different activity depending on the structured nav level

    if (!mainActivity.isRestoreBrightnessOnNavigation()) {
        mainActivity.setBrightness(-1);
        mainActivity.setRestoreBrightnessOnNavigation(false);
    }

    if (appConfig.maxWindowsEnabled) {

        GoNativeWindowManager windowManager = mainActivity.getGNWindowManager();

        // To prevent consecutive calls and handle MaxWindows correctly
        // Checks for a flag indicating if the Activity was created from CreateNewWindow OR NavLevels
        // and avoid triggering MaxWindows during this initial intercept
        boolean ignoreInterceptMaxWindows = windowManager.isIgnoreInterceptMaxWindows(mainActivity.getActivityId());

        if (ignoreInterceptMaxWindows) {
            windowManager.setIgnoreInterceptMaxWindows(mainActivity.getActivityId(), false);
        } else if (appConfig.numWindows > 0 && windowManager.getWindowCount() >= appConfig.numWindows) {
            if (mainActivity.onMaxWindowsReached(url)) {
                return true;
            }
        }
    }

    int currentLevel = mainActivity.getUrlLevel();
    int newLevel = mainActivity.urlLevelForUrl(url);
    if (currentLevel >= 0 && newLevel >= 0) {
        if (newLevel > currentLevel) {
            if (noAction) return true;

            // new activity
            Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class);
            intent.putExtra("isRoot", false);
            intent.putExtra("url", url);
            intent.putExtra("parentUrlLevel", currentLevel);
            intent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript);

            if (appConfig.maxWindowsEnabled) {
                intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true);
            }

            mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY);

            mainActivity.postLoadJavascript = null;
            mainActivity.postLoadJavascriptForRefresh = null;

            return true;
        } else if (newLevel < currentLevel && newLevel <= mainActivity.getParentUrlLevel()) {
            if (noAction) return true;

            // pop activity
            Intent returnIntent = new Intent();
            returnIntent.putExtra("url", url);
            returnIntent.putExtra("urlLevel", newLevel);
            returnIntent.putExtra("postLoadJavascript", mainActivity.postLoadJavascript);
            mainActivity.setResult(Activity.RESULT_OK, returnIntent);
            mainActivity.finish();
            return true;
        }
    }

    // Starting here, the request will be loaded in this activity.
    if (newLevel >= 0) {
        mainActivity.setUrlLevel(newLevel);
    }

    final String newTitle = mainActivity.titleForUrl(url);
    if (newTitle != null) {
        if (!noAction) {
            mainActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mainActivity.setTitle(newTitle);
                }
            });
        }
    }

    // nav title image
    if (!noAction) {
        mainActivity.runOnUiThread(() ->
                mainActivity.getActionManager().setupTitleDisplayForUrl(url)
        );
    }

    // check to see if the webview exists in pool.
    WebViewPool webViewPool = ((GoNativeApplication) mainActivity.getApplication()).getWebViewPool();
    Pair<GoNativeWebviewInterface, WebViewPoolDisownPolicy> pair = webViewPool.webviewForUrl(url);
    final GoNativeWebviewInterface poolWebview = pair.first;
    WebViewPoolDisownPolicy poolDisownPolicy = pair.second;

    if (noAction && poolWebview != null) return true;

    if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Always) {
        this.mainActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mainActivity.switchToWebview(poolWebview, true, false);
                mainActivity.checkNavigationForPage(url);
            }
        });
        webViewPool.disownWebview(poolWebview);
        LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE));
        return true;
    }

    if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Never) {
        this.mainActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mainActivity.switchToWebview(poolWebview, true, false);
                mainActivity.checkNavigationForPage(url);
            }
        });
        return true;
    }

    if (poolWebview != null && poolDisownPolicy == WebViewPoolDisownPolicy.Reload &&
            !LeanUtils.urlsMatchOnPath(url, this.currentWebviewUrl)) {
        this.mainActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mainActivity.switchToWebview(poolWebview, true, false);
                mainActivity.checkNavigationForPage(url);
            }
        });
        return true;
    }

    if (this.mainActivity.isPoolWebview) {
        // if we are here, either the policy is reload and we are reloading the page, or policy is never but we are going to a different page. So take ownership of the webview.
        webViewPool.disownWebview(view);
        this.mainActivity.isPoolWebview = false;
    }

    return false;
}

public boolean shouldOverrideUrlLoading(final GoNativeWebviewInterface view, String url,
                                        @SuppressWarnings("unused") boolean isReload, boolean isRedirect) {
    if (url == null) return false;

    boolean shouldOverride = shouldOverrideUrlLoadingNoIntercept(view, url, false);
    if (shouldOverride) {
        if (finishOnExternalUrl) {
            mainActivity.finish();
        }

        // Check if intercepted URL request was a result of a server-side redirect.
        // Redirect URLs triggers redundant onPageFinished()
        if (isRedirect) {
            interceptedRedirectUrl = url;
        }
        return true;
    } else {
        finishOnExternalUrl = false;
    }

    // intercept html
    this.htmlIntercept.setInterceptUrl(url);
    mainActivity.hideWebview();
    state = WebviewLoadState.STATE_START_LOAD;
    // 10 second (default) delay to get to onPageStarted or doUpdateVisitedHistory
    if (!Double.isNaN(connectionOfflineTime) && !Double.isInfinite(connectionOfflineTime) &&
            connectionOfflineTime > 0) {
        startLoadTimeout.postDelayed(new Runnable() {
            @Override
            public void run() {
                AppConfig appConfig = AppConfig.getInstance(mainActivity);
                String url = view.getUrl();
                if (appConfig.showOfflinePage && !OFFLINE_PAGE_URL.equals(url)) {
                    view.loadUrlDirect(OFFLINE_PAGE_URL);
                }
            }
        }, (long) (connectionOfflineTime * 1000));
    }

    return false;
}

public void onPageStarted(String url) {
    // catch blank pages from htmlIntercept and cancel loading
    if (url.equals(htmlIntercept.getRedirectedUrl())) {
        mainActivity.goBack();
        htmlIntercept.setRedirectedUrl(null);
        return;
    }

    state = WebviewLoadState.STATE_PAGE_STARTED;
    startLoadTimeout.removeCallbacksAndMessages(null);
    htmlIntercept.setInterceptUrl(url);

    UrlInspector.getInstance().inspectUrl(url);
    Uri uri = Uri.parse(url);

    // reload menu if internal url
    if (AppConfig.getInstance(mainActivity).loginDetectionUrl != null && isInternalUri(uri)) {
        mainActivity.updateMenu();
    }

    // check ready status
    mainActivity.startCheckingReadyStatus();

    mainActivity.checkPreNavigationForPage(url);

    // send broadcast message
    LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.STARTED_LOADING_MESSAGE));


    // enable swipe refresh controller if offline page
    if (OFFLINE_PAGE_URL.equals(url)) {
        mainActivity.enableSwipeRefresh();
    } else {
        mainActivity.restoreSwipRefreshDefault();
    }
}

@SuppressWarnings("unused")
public void showWebViewImmediately() {
    mainActivity.runOnUiThread(() -> mainActivity.showWebviewImmediately());
}

@SuppressLint("ApplySharedPref")
public void onPageFinished(GoNativeWebviewInterface view, String url) {
    // Catch intercepted Redirect URL to
    // prevent loading unnecessary components
    if (interceptedRedirectUrl.equals(url)) {
        interceptedRedirectUrl = "";
        return;
    }

    Log.d(TAG, "onpagefinished " + url);
    state = WebviewLoadState.STATE_DONE;
    setCurrentWebviewUrl(url);

    AppConfig appConfig = AppConfig.getInstance(mainActivity);
    if (url != null && appConfig.ignorePageFinishedRegexes != null) {
        for (Pattern pattern : appConfig.ignorePageFinishedRegexes) {
            if (pattern.matcher(url).matches()) return;
        }
    }

    mainActivity.runOnUiThread(() -> mainActivity.showWebview());

    UrlInspector.getInstance().inspectUrl(url);

    Uri uri = Uri.parse(url);
    if (isInternalUri(uri)) {
        AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
            @Override
            public void run() {
                CookieManager.getInstance().flush();
            }
        });
    }

    if (appConfig.loginDetectionUrl != null) {
        if (mVisitedLoginOrSignup) {
            mainActivity.updateMenu();
        }

        mVisitedLoginOrSignup = LeanUtils.urlsMatchOnPath(url, appConfig.loginUrl) ||
                LeanUtils.urlsMatchOnPath(url, appConfig.signupUrl);
    }

    // post-load javascript
    if (appConfig.postLoadJavascript != null) {
        view.runJavascript(appConfig.postLoadJavascript);
    }

    // profile picker
    if (this.profilePickerExec != null) {
        view.runJavascript(this.profilePickerExec);
    }

    if (this.gnProfilePickerExec != null) {
        view.runJavascript(this.gnProfilePickerExec);
    }

    // tabs
    mainActivity.checkNavigationForPage(url);

    // post-load javascript
    if (mainActivity.postLoadJavascript != null) {
        String js = mainActivity.postLoadJavascript;
        mainActivity.postLoadJavascript = null;
        mainActivity.runJavascript(js);
    }

    // send broadcast message
    LocalBroadcastManager.getInstance(mainActivity).sendBroadcast(new Intent(UrlNavigation.FINISHED_LOADING_MESSAGE));

    boolean doNativeBridge = true;
    if (currentWebviewUrl != null) {
        doNativeBridge = LeanUtils.checkNativeBridgeUrls(currentWebviewUrl, mainActivity);
    }

    // send installation info
    if (doNativeBridge) {
        runGonativeDeviceInfo("median_device_info");
        runGonativeDeviceInfo("gonative_device_info");
    }

    ((GoNativeApplication) mainActivity.getApplication()).mBridge.onPageFinish(mainActivity, doNativeBridge);
}

public void onFormResubmission(GoNativeWebviewInterface view, Message dontResend, Message resend) {
    resend.sendToTarget();
}

private void runGonativeDeviceInfo(String callback) {
    Map<String, Object> installationInfo = Installation.getInfo(mainActivity);
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mainActivity);
    if (!sharedPreferences.getBoolean("hasLaunched", false)) {
        sharedPreferences.edit().putBoolean("hasLaunched", true).commit();
        installationInfo.put("isFirstLaunch", true);
    } else {
        installationInfo.put("isFirstLaunch", false);
    }

    JSONObject jsonObject = new JSONObject(installationInfo);
    String js = LeanUtils.createJsForCallback(callback, jsonObject);
    mainActivity.runJavascript(js);
}

public void doUpdateVisitedHistory(@SuppressWarnings("unused") GoNativeWebviewInterface view, String url, boolean isReload) {
    if (state == WebviewLoadState.STATE_START_LOAD) {
        state = WebviewLoadState.STATE_PAGE_STARTED;
        startLoadTimeout.removeCallbacksAndMessages(null);
    }

    if (!isReload && !url.equals(OFFLINE_PAGE_URL)) {
        mainActivity.addToHistory(url);
    }
}

public void onReceivedError(final GoNativeWebviewInterface view,
                            @SuppressWarnings("unused") int errorCode,
                            String errorDescription, String failingUrl) {
    if (errorDescription != null && errorDescription.contains("net::ERR_CACHE_MISS")) {
        mainActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                view.reload();
            }
        });
        return;
    }

    boolean showingOfflinePage = false;

    // show offline page if not connected to internet
    AppConfig appConfig = AppConfig.getInstance(this.mainActivity);
    if (appConfig.showOfflinePage &&
            (state == WebviewLoadState.STATE_PAGE_STARTED || state == WebviewLoadState.STATE_START_LOAD)) {

        if (mainActivity.isDisconnected() ||
                (errorCode == WebViewClient.ERROR_HOST_LOOKUP &&
                        failingUrl != null &&
                        view.getUrl() != null &&
                        failingUrl.equals(view.getUrl()))) {

            showingOfflinePage = true;

            mainActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    view.stopLoading();
                    view.loadUrlDirect(OFFLINE_PAGE_URL);

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            view.loadUrlDirect(OFFLINE_PAGE_URL);
                        }
                    }, 100);
                }
            });
        }
    }

    if (!showingOfflinePage) {
        mainActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mainActivity.showWebview();
            }
        });
    }
}

public void onReceivedSslError(SslError error, String webviewUrl) {
    int errorMessage;
    switch (error.getPrimaryError()) {
        case SslError.SSL_EXPIRED:
            errorMessage = R.string.ssl_error_expired;
            break;
        case SslError.SSL_DATE_INVALID:
        case SslError.SSL_IDMISMATCH:
        case SslError.SSL_NOTYETVALID:
        case SslError.SSL_UNTRUSTED:
            errorMessage = R.string.ssl_error_cert;
            break;
        case SslError.SSL_INVALID:
        default:
            errorMessage = R.string.ssl_error_generic;
            break;
    }

    if(AppConfig.getInstance(mainActivity).sslToastErrorsEnabled)
        Toast.makeText(mainActivity, errorMessage, Toast.LENGTH_LONG).show();
    String finalErrorMessage = mainActivity.getString(errorMessage) + " - Error url: " + error.getUrl() + " - Source page: " + webviewUrl;
    GNLog.getInstance().logError(TAG, finalErrorMessage, new Exception(finalErrorMessage), GNLog.TYPE_TOAST_ERROR);
}

@SuppressWarnings("unused")
public String getCurrentWebviewUrl() {
    return currentWebviewUrl;
}

public void setCurrentWebviewUrl(String currentWebviewUrl) {
    this.currentWebviewUrl = currentWebviewUrl;
    ((GoNativeApplication) mainActivity.getApplication()).mBridge.setCurrentWebviewUrl(currentWebviewUrl);
}

public WebResourceResponse interceptHtml(LeanWebView view, String url) {

// Log.d(TAG, "intercept " + url); return htmlIntercept.interceptHtml(view, url, this.currentWebviewUrl); }

@SuppressWarnings("UnusedReturnValue")
public boolean chooseFileUpload(String[] mimetypespec) {
    return chooseFileUpload(mimetypespec, false);
}

public boolean chooseFileUpload(final String[] mimetypespec, final boolean multiple) {
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
        chooseFileUploadAfterPermission(mimetypespec, multiple);
    } else {
        List<String> permissionToRequest = new ArrayList<>();
        permissionToRequest.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        permissionToRequest.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) {
            permissionToRequest.add(Manifest.permission.CAMERA);
        }
        mainActivity.getPermission(permissionToRequest.toArray(new String[0]), (permissions, grantResults) -> chooseFileUploadAfterPermission(mimetypespec, multiple));
    }
    return true;
}

@SuppressWarnings("UnusedReturnValue")
private boolean chooseFileUploadAfterPermission(String[] mimetypespec, boolean multiple) {
    mainActivity.setDirectUploadImageUri(null);

    FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple);

    if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA) && (creator.canUploadImage() || creator.canUploadVideo())) {
        mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> launchChooserIntent(creator));
        return true;
    }

    return launchChooserIntent(creator);
}

private boolean launchChooserIntent(FileUploadIntentsCreator creator) {
    Intent intentToSend = creator.chooserIntent();
    mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri());

    try {
        mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE);
        return true;
    } catch (ActivityNotFoundException e) {
        mainActivity.cancelFileUpload();
        Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show();
        return false;
    }
}


public boolean openDirectCamera(final String[] mimetypespec, final boolean multiple) {
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
        if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) {
            mainActivity.getPermission(new String[]{Manifest.permission.CAMERA}, (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple));
        } else {
            openDirectCameraAfterPermission(mimetypespec, multiple);
        }
    } else {

        ArrayList<String> permissionRequests = new ArrayList<>();
        permissionRequests.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        permissionRequests.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) {
            permissionRequests.add(Manifest.permission.CAMERA);
        }

        mainActivity.getPermission(permissionRequests.toArray(new String[0]), (permissions, grantResults) -> openDirectCameraAfterPermission(mimetypespec, multiple));
    }
    return true;
}

/*
    Directly opens camera if the mime types are images. If not, run existing default process
 */
@SuppressWarnings("UnusedReturnValue")
private boolean openDirectCameraAfterPermission(String[] mimetypespec, boolean multiple) {

    // Check and verify CAMERA permission so app will not crash when using cam
    if (!Utils.isPermissionGranted(mainActivity, Manifest.permission.CAMERA)) {
        Toast.makeText(mainActivity, R.string.upload_camera_permission_denied, Toast.LENGTH_SHORT).show();
        mainActivity.cancelFileUpload();
        return false;
    }

    mainActivity.setDirectUploadImageUri(null);

    FileUploadIntentsCreator creator = new FileUploadIntentsCreator(mainActivity, mimetypespec, multiple);
    Intent intentToSend = creator.cameraIntent();
    mainActivity.setDirectUploadImageUri(creator.getCurrentCaptureUri());

    try {
        // Directly open the camera intent with the same Request Result value value
        mainActivity.startActivityForResult(intentToSend, MainActivity.REQUEST_SELECT_FILE);
        return true;
    } catch (ActivityNotFoundException e) {
        mainActivity.cancelFileUpload();
        Toast.makeText(mainActivity, R.string.cannot_open_file_chooser, Toast.LENGTH_LONG).show();
    }

    return false;
}

@SuppressLint("SetJavaScriptEnabled")
public void createNewWindow(WebView webView, Message resultMsg) {
    AppConfig appConfig = AppConfig.getInstance(mainActivity);

    if (appConfig.maxWindowsEnabled && appConfig.numWindows > 0 && mainActivity.getGNWindowManager().getWindowCount() >= appConfig.numWindows) {
        // All of these just to get new url
        WebView newWebView = new WebView(webView.getContext());
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(newWebView);
        resultMsg.sendToTarget();
        newWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                if (!mainActivity.onMaxWindowsReached(url)) {
                    Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class);
                    intent.putExtra("isRoot", false);
                    intent.putExtra("url", url);
                    intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true);
                    mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY);
                }
            }
        });
        return;
    }
    createNewWindow(resultMsg, appConfig.maxWindowsEnabled);
}

private void createNewWindow(Message resultMsg, boolean maxWindowsEnabled) {
    ((GoNativeApplication) mainActivity.getApplication()).setWebviewMessage(resultMsg);
    Intent intent = new Intent(mainActivity.getBaseContext(), MainActivity.class);
    intent.putExtra("isRoot", false);
    intent.putExtra(MainActivity.EXTRA_WEBVIEW_WINDOW_OPEN, true);

    if (maxWindowsEnabled) {
        intent.putExtra(MainActivity.EXTRA_IGNORE_INTERCEPT_MAXWINDOWS, true);
    }

    // need to use startActivityForResult instead of startActivity because of singleTop launch mode
    mainActivity.startActivityForResult(intent, MainActivity.REQUEST_WEB_ACTIVITY);
}

public boolean isLocationServiceEnabled() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        LocationManager lm = mainActivity.getSystemService(LocationManager.class);
        return lm.isLocationEnabled();
    } else {
        // This is Deprecated in API 28
        int mode = Settings.Secure.getInt(mainActivity.getContentResolver(), Settings.Secure.LOCATION_MODE,
                Settings.Secure.LOCATION_MODE_OFF);
        return (mode != Settings.Secure.LOCATION_MODE_OFF);
    }
}

protected void onDownloadStart() {
    startLoadTimeout.removeCallbacksAndMessages(null);
    state = WebviewLoadState.STATE_DONE;
}


private static class GetKeyTask extends AsyncTask<String, Void, Pair<PrivateKey, X509Certificate[]>> {
    private Activity activity;
    private ClientCertRequest request;

    public GetKeyTask(Activity activity, ClientCertRequest request) {
        this.activity = activity;
        this.request = request;
    }

    @Override
    protected Pair<PrivateKey, X509Certificate[]> doInBackground(String... strings) {
        String alias = strings[0];

        try {
            PrivateKey privateKey = KeyChain.getPrivateKey(activity, alias);
            X509Certificate[] certificates = KeyChain.getCertificateChain(activity, alias);
            return new Pair<>(privateKey, certificates);
        } catch (Exception e) {
            GNLog.getInstance().logError(TAG, "Error getting private key for alias " + alias, e);
            return null;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onPostExecute(Pair<PrivateKey, X509Certificate[]> result) {
        if (result != null && result.first != null & result.second != null) {
            request.proceed(result.first, result.second);
        } else {
            request.ignore();
        }
    }
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void onReceivedClientCertRequest(String url, ClientCertRequest request) {
    Uri uri = Uri.parse(url);
    KeyChainAliasCallback callback = alias -> {
        if (alias == null) {
            request.ignore();
            return;
        }

        new GetKeyTask(mainActivity, request).execute(alias);
    };

    KeyChain.choosePrivateKeyAlias(mainActivity, callback, request.getKeyTypes(), request.getPrincipals(), request.getHost(),
            request.getPort(), null);
}

// Cancels scheduled display of offline page after timeout
public void cancelLoadTimeout() {
    if (startLoadTimeout == null && state != WebviewLoadState.STATE_START_LOAD) return;
    startLoadTimeout.removeCallbacksAndMessages(null);
    showWebViewImmediately();
}

}

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/java/co/median/android/UrlNavigation.java

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/bg_nav_icon.xml

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/bg_nav_icon.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/ic_stat_onesignal_default.xml

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/ic_stat_onesignal_default.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/shape_rounded.xml

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/drawable/shape_rounded.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/actionbar_title.xml

<androidx.appcompat.widget.LinearLayoutCompat
    android:id="@+id/left_menu_container"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:gravity="center">
</androidx.appcompat.widget.LinearLayoutCompat>

<RelativeLayout
    android:id="@+id/title_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal|center_vertical|center"
    android:orientation="horizontal">

</RelativeLayout>

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/actionbar_title.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/activity_gonative.xml

<co.median.android.widget.GoNativeDrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:contentInsetLeft="0dp"
            app:contentInsetStart="0dp"
            app:contentInsetStartWithNavigation="0dp"
            app:elevation="80dp" />

    </com.google.android.material.appbar.AppBarLayout>

    <co.median.android.MySwipeRefreshLayout
        android:id="@+id/swipe_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/pluginView"
        android:layout_below="@+id/appBar">

        <co.median.android.widget.SwipeHistoryNavigationLayout
            android:id="@+id/swipe_history_nav"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <co.median.android.widget.WebViewContainerView
                    android:id="@+id/webviewContainer"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />

                <View
                    android:id="@+id/webviewOverlay"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:alpha="0.0"
                    android:background="?android:attr/colorBackground" />

            </RelativeLayout>
        </co.median.android.widget.SwipeHistoryNavigationLayout>
    </co.median.android.MySwipeRefreshLayout>

    <RelativeLayout
        android:id="@+id/pluginView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@id/bottom_navigation"
        android:layout_alignWithParentIfMissing="true"
        android:background="?android:attr/colorBackground"
        android:visibility="gone"/>

    <com.google.android.material.progressindicator.CircularProgressIndicator
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:scaleX="0.6"
        android:scaleY="0.6"
        android:visibility="invisible"
        android:indeterminate="true"
        app:indicatorSize="60dp"
        app:trackThickness="6dp"
        app:indicatorColor="@color/progress_indicator" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:elevation="8dp"
        android:visibility="gone"
        app:labelVisibilityMode="labeled"
        app:itemTextAppearance="@style/BottomNavTextStyle"
        app:itemTextAppearanceActive="@style/BottomNavTextStyle"
        app:itemTextAppearanceInactive="@style/BottomNavTextStyle" />

    <RelativeLayout
        android:id="@+id/fullscreen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="?android:attr/colorBackground"
        android:layout_above="@+id/bottom_navigation"
        android:visibility="invisible" />

</RelativeLayout>
<!-- The navigation drawer -->
<!-- width should be no more than 320dp -->
<com.google.android.material.navigation.NavigationView
    android:id="@+id/left_drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:layout_weight="80">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingTop="11dp">


        <Spinner
            android:id="@+id/profile_picker"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="5dp"
            android:layout_marginRight="5dp"
            android:visibility="gone" />

        <Spinner
            android:id="@+id/segmented_control"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/profile_picker"
            android:layout_marginStart="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="5dp"
            android:layout_marginRight="5dp"
            android:visibility="gone" />

        <RelativeLayout
            android:id="@+id/header_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp">

            <ImageView
                android:id="@+id/app_logo"
                android:layout_width="80dp"
                android:layout_height="80dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="30dp"
                android:contentDescription="@string/app_logo"
                android:src="@mipmap/ic_sidebar_logo" />

            <TextView
                android:id="@+id/app_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/app_logo"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="20dp"
                android:layout_marginBottom="15dp"
                android:fontFamily="sans-serif-medium"
                android:textColor="@color/sidebarHighlight"
                android:textSize="22sp" />

            <View
                android:id="@+id/header_divider"
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_below="@id/app_name"
                android:background="@color/sidebarSeparatorColor" />
        </RelativeLayout>

        <ExpandableListView
            android:id="@+id/drawer_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/header_layout"
            android:layout_marginStart="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginEnd="10dp"
            android:layout_marginRight="10dp"
            android:choiceMode="singleChoice"
            android:divider="@null"
            android:footerDividersEnabled="false"
            android:groupIndicator="@null"
            android:headerDividersEnabled="false"
            android:listSelector="@android:color/transparent"
            android:scrollbarStyle="insideOverlay"
            android:scrollbars="vertical" />
    </RelativeLayout>
</com.google.android.material.navigation.NavigationView>

</co.median.android.widget.GoNativeDrawerLayout>

End of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/activity_gonative.xml

Start of /mnt/data/jocal3--U/jocal3--U/android/app/src/main/res/layout/button_menu.xml

Downloads last month
0
Inference Examples
Inference API (serverless) does not yet support keras models for this pipeline type.

Datasets used to train Admin0805/Gpt4