commit cbb13d94a031a354234ddf3aeab5352c4133e8ec Author: Siniša Sovilj Date: Fri Jan 8 16:08:25 2021 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05469d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +# Project exclude paths +/.gradle/ +/.idea/ +**/build/ +!src/**/build/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..660129c --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2020] [Siniša Sovilj] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..454576e --- /dev/null +++ b/README.md @@ -0,0 +1,223 @@ +# Kotlin System Dynamics Toolkit + +**Kotlin SD Toolkit** or *ksdtookit* is a tool suitable for both: +- modelling larger, hierarchical **system dynamics** (SD) models +(supporting modules) and +- for automatic generation of **interactive simulators** for multiple +target platforms: *desktop*, *web* or *mobile* using Kotlin programming language. + +## Intro + +*Kotlin* is a new (first appeared in 2011), statically-typed programming +language, with: +- modern, more expressive syntax, +- null-pointer exception safety, +- both object-oriented and functional programming capabilities, +- interoperable with all existing Java libraries and frameworks, and +- since 2017 Google’s preferred language for Android application development; + +*Kotlin* also excels in developing internal, **domain-specific language** +(internal DSL), which allows adapting general-purpose language (e.g. *Kotlin*) to solve problems of +specific domain (e.g. system dynamics). + +*ksdtookit* consists of three modules: +1. *ksdtoolkit-core* - core module for SD modelling & simulation, + with exporters (CSV, PNG), and desktop simulator app, +2. *ksdtoolkit-mobapp* - mobile simulator app module, +3. *ksdtoolkit-webapp* - web simulator app module. + + +## Usage + +#### Example: + +Modelling Innovation / Product diffusion SD model (also known as Bass diffusion model). + +![](images/Figure01.png?raw=true) + +#### 0. Setup +``` +// Static properties (optional) +companion object { + const val TOTAL_POPULATION_VALUE = 10000 // [customer] + const val ADVERTISING_EFFECTIVENESS_VALUE = 0.011 // [1/year] + const val CONTACT_RATE_VALUE = 100 // [1/year] + const val ADOPTION_FRACTION_VALUE = 0.015 // [] + + const val INITIAL_TIME_VALUE = 0 // [year] + const val FINAL_TIME_VALUE = 10 // [year] + const val TIME_STEP_VALUE = 0.25 // [year] +} +``` + +#### 1. Model +``` +init { + val model = Model() + + // Override default model properties + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.integration = EulerIntegration() + model.name = "Innovation/Product Diffusion Model" // optional +``` + +#### 2. Entities +##### Constants +``` + val TOTAL_POPULATION = model.constant("TOTAL_POPULATION") + val ADVERTISING_EFFECTIVENESS = model.constant("ADVERTISING_EFFECTIVENESS") + val CONTACT_RATE = model.constant("CONTACT_RATE") + val ADOPTION_FRACTION = model.constant("ADOPTION_FRACTION") +``` + +##### Converters +``` + val adoptionFromAdvertising = + model.converter("adoptionFromAdvertising") + val adoptionFromWordOfMouth = + model.converter("adoptionFromWordOfMouth") +``` +##### Stocks +``` + val Potential_Adopters = model.stock("Potential_Adopters") + val Adopters = model.stock("Adopters") +``` +##### Flows +``` + val adoptionRate = model.flow("adoptionRate") +``` +##### Modules +``` +``` + +#### 3. Initial values +##### Stocks +``` + Potential_Adopters.initialValue = { TOTAL_POPULATION } + Adopters.initialValue = { 0.0 } +``` + +#### 4. Equations +##### Constants +``` + TOTAL_POPULATION.equation = { TOTAL_POPULATION_VALUE } + ADVERTISING_EFFECTIVENESS.equation = { ADVERTISING_EFFECTIVENESS_VALUE } + CONTACT_RATE.equation = { CONTACT_RATE_VALUE } + ADOPTION_FRACTION.equation = { ADOPTION_FRACTION_VALUE } +``` +##### Converters +``` + adoptionFromAdvertising.equation = + { Potential_Adopters * ADVERTISING_EFFECTIVENESS } + adoptionFromWordOfMouth.equation = + { CONTACT_RATE * ADOPTION_FRACTION * + Potential_Adopters * Adopters / TOTAL_POPULATION } +``` +##### Stocks +``` + Potential_Adopters.equation = { - adoptionRate } + Adopters.equation = { adoptionRate } +``` +##### Flows +``` + adoptionRate.equation = + { adoptionFromAdvertising + adoptionFromWordOfMouth } +``` +##### Modules +``` +``` + +#### 5. Simulation +``` + val simulation = Simulation(model) +``` + +#### 6. Outputs +``` + simulation.outputs { + CsvExporter("output.csv", ";")) // Text + PngExporter("chart.png")) // Image + WinSimulator() // Desktop + WebSimulator() // Web + MobSimulator() // Mobile + } +``` + +#### 7. Run +``` + simulation.run() +} +``` + + +## Testing + +Whole *ksdtoolkit* project and all three project modules (*ksdtoolkit-core*, *ksdtoolkit-mobapp*, *ksdtoolkit-webapp*) +are designed as **Gradle** project/modules (using *Gradle Kotlin DSL*). Therefore, use **Gradlew Wrapper** +(*gradlew* in Windows or *./gradlew* in Linux/Mac) for +clean, build, test and run project/modules. + +To run Gradle tasks, from IntelliJ one can use *Terminal window* (be in the root path where *gradlew* file is located). +(Instead of Terminal, an alternative is to install and use Gradle Plugin in IntelliJ.) + +To clean and build whole project (and all modules) use: + ``` + gradlew clean build + ``` +(Close PngExporter and WinSimulator windows to allow build to finish). + + +#### Desktop simulator +To build only *ksdtoolkit-core* module use: +``` +gradlew :ksdtoolkit-core:build +``` +Build will also run all unit tests located in *./ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtookit/* + +The last unit test `5_SimulationOutputsTest` contains output tests where e.g. *WinSimulator* is launched. + +![](images/Figure02.png?raw=true) + + +#### Web simulator +To build *ksdtoolkit-webapp* module and run web server use: +``` +gradlew :ksdtoolkit-webapp:appStart +``` +The web simulator will be accessible at: ```http://localhost:8080/``` + +![](images/Figure03.png?raw=true) +(Valid developer licence numbers are needed for using *Vaadin Charts* and *Vaadin Spreadsheet*). + + +#### Mobile simulator +In IntelliJ first create and launch Android emulator (Tools | Android | AVD Manager). +To build *ksdtoolkit-mobapp* module and install *apk* file on Android emulator use: +``` +gradlew :ksdtoolkit-mobapp:appStart +``` +The mobile simulator will be automatically launched. + +![](images/Figure04.png?raw=true) + + +## Authors + + - **Siniša Sovilj**1 + - **Darko Etinger**1 + - **Krešimir Pripužić**2 + +1 = Juraj Dobrila University of Pula, Faculty of Informatics, HR-52100 Pula, CROATIA \ +2 = University of Zagreb, Faculty of Electrical Engineering and Computing, HR-10000 Zagreb, CROATIA + + +## License +This project is licensed under the Apache License 2.0 License. See the [LICENSE](LICENSE) file for details. + + +## Acknowledgments +Kotlin SD Toolkit was inspired by the great work of: +* Drost & Stein - [System Dynamics Java-Framework](https://github.com/matthiasstein/SystemDynamics-Framework), +* Schroeck - [Business Prototyping Toolkit for Python](https://github.com/transentis/bptk_py_tutorial). diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..e981b72 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,22 @@ +/** + * Root project. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +plugins { + +} + +allprojects { + repositories { + google() + jcenter() + mavenCentral() + maven(url="https://maven.google.com") + maven(url="https://jitpack.io") + } +} + +group = "hr.unpu" +version = "1.0-SNAPSHOT" \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..80519f5 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +kotlin.code.style=official +systemProp.vaadin.charts.developer.license=c0171602-2326-457a-837d-226c949709f1 +systemProp.vaadin.spreadsheet.developer.license=8bf94b9d-b891-47b0-bad3-971445a274a5 +vaadin.charts.developer.license=c0171602-2326-457a-837d-226c949709f1 +vaadin.spreadsheet.developer.license=8bf94b9d-b891-47b0-bad3-971445a274a5 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..1f3fdbc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/images/Figure01.png b/images/Figure01.png new file mode 100644 index 0000000..c3d518f Binary files /dev/null and b/images/Figure01.png differ diff --git a/images/Figure02.png b/images/Figure02.png new file mode 100644 index 0000000..3db74f1 Binary files /dev/null and b/images/Figure02.png differ diff --git a/images/Figure03.png b/images/Figure03.png new file mode 100644 index 0000000..83a1cc2 Binary files /dev/null and b/images/Figure03.png differ diff --git a/images/Figure04.png b/images/Figure04.png new file mode 100644 index 0000000..404f2e1 Binary files /dev/null and b/images/Figure04.png differ diff --git a/ksdtoolkit-core/build.gradle.kts b/ksdtoolkit-core/build.gradle.kts new file mode 100644 index 0000000..e6da834 --- /dev/null +++ b/ksdtoolkit-core/build.gradle.kts @@ -0,0 +1,46 @@ +/** + * Subproject: "ksdtoolkit-core". + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("org.jetbrains.kotlin.jvm") +} + +tasks.withType { + enabled = true +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + implementation("org.jetbrains.kotlin:kotlin-reflect") + + testImplementation("org.jetbrains.kotlin:kotlin-test") + + testImplementation("org.jetbrains.kotlin:kotlin-test-junit") + + implementation("org.hamcrest:hamcrest-all:1.3") + + implementation("ch.qos.logback:logback-classic:1.2.3") + implementation("ch.qos.logback:logback-core:1.2.3") + + implementation("org.slf4j:slf4j-api:1.7.30") +} + +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + jvmTarget = "1.8" +} + +val compileTestKotlin: KotlinCompile by tasks +compileTestKotlin.kotlinOptions { + jvmTarget = "1.8" +} + +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/ksdtoolkit-core/output_chart.png b/ksdtoolkit-core/output_chart.png new file mode 100644 index 0000000..7518cbd Binary files /dev/null and b/ksdtoolkit-core/output_chart.png differ diff --git a/ksdtoolkit-core/output_data.csv b/ksdtoolkit-core/output_data.csv new file mode 100644 index 0000000..d5837cb --- /dev/null +++ b/ksdtoolkit-core/output_data.csv @@ -0,0 +1,482 @@ +Module.inflow;outflow;Module.CONSTANT;Module.converter;Module.outflow;Module.INITIAL_STOCK;INITIAL_STOCK;converter;CONSTANT;inflow;Stock;Module.Stock +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 +0.833333;0.833333;10;0.008333;0.833333;100;100;0.008333;10;0.833333;100;100 \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Constant.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Constant.kt new file mode 100644 index 0000000..7de6cc4 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Constant.kt @@ -0,0 +1,11 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Constant entity. + * + * Constant class extends abstract class ModelEntity and only passes 'name' to the abstract class. + * + * @property name Constant name (only passed to the abstract class ModelEntity). + */ + +class Constant(name: String) : ModelEntity(name) \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Converter.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Converter.kt new file mode 100644 index 0000000..e666eab --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Converter.kt @@ -0,0 +1,82 @@ +package hr.unipu.ksdtoolkit.entities + +import java.util.* +import kotlin.IllegalArgumentException + +/** + * Converter entity. + * + * Converter calculates a current value of a target [ModelEntity] in a time step, representing the cause-effect + * relationship between [ModelEntity] instances. Converters takes input data and converts it into some outputs + * signal. Converter calculations depends on the [equation] that has been delivered to the converter. + * Details: + * - Converters are used to disaggregate the complex functions that define flows into their constituent parts. + * - Converters may be influenced by stocks and can influence other converters. + * - In general, it converts [inputEntities] into an [targetEntity]. + * - E.g. Unlike flows (which are special kinds of converters), they cannot directly influence a stock. + * + * @param targetEntity Target (outputs) model entity (calculated value). + * @param inputEntities Input model entities (that influence calculation). + * + */ +class Converter(name: String) : ModelEntity(name) { + + private var inputEntities = arrayListOf() + lateinit var targetEntity: ModelEntity + + + constructor(targetEntity: ModelEntity, + vararg inputEntities: ModelEntity + ) : this(targetEntity.name) { + + Collections.addAll(this.inputEntities, *inputEntities) + this.targetEntity = targetEntity + + } + + + /** + * Convert the target model entity to a value. + */ + fun convert() { + for (input in this.inputEntities) { + if (!input.isCurrentValueCalculated && input.converter != null) { + input.converter!!.convert() + } + } + + targetEntity.currentValue = _equation?.invoke() ?: 0.0 + targetEntity.isCurrentValueCalculated = true + } + + + /** + * Add multiple input model entities. + */ + fun addInputs(vararg inputs: ModelEntity) { + for (input in inputs) { + this.addInput(input) + } + } + + + /** + * Add an input for the target entity. + */ + private fun addInput(input: ModelEntity) { + if (!inputAlreadyAdded(input)) { + this.inputEntities.add(input) + } else { + throw IllegalArgumentException("Duplicate variable exception.") + } + } + + + /** + * Determine if a ModelEntity has been already added to the Converter. + */ + private fun inputAlreadyAdded(input: ModelEntity): Boolean { + return inputEntities.contains(input) + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Flow.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Flow.kt new file mode 100644 index 0000000..5385905 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Flow.kt @@ -0,0 +1,13 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Flow entity. + * + * Flow can be an "input_flow" or "output_flow", which difference defines "change_rate" of a [Stock]. + * Flows are special kind of converters. Flows can also be inputEntities to other converters. + * + * @property name Flow name (only passed to the abstract class ModelEntity). + */ + +class Flow(name: String) : ModelEntity(name) + diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/IFunction.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/IFunction.kt new file mode 100644 index 0000000..39f6ecd --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/IFunction.kt @@ -0,0 +1,11 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Function interface. + * (Not used anymore, just for legacy.) + */ +interface IFunction { + fun calculateEntityValue(): Double +} + + diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Model.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Model.kt new file mode 100644 index 0000000..7b1dc2b --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Model.kt @@ -0,0 +1,222 @@ +package hr.unipu.ksdtoolkit.entities + +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.integration.Integration +import java.text.DecimalFormat +import kotlin.IllegalArgumentException +import kotlin.reflect.full.createInstance + +/** + * Model class represents simulation model. + * + * Model defines all [ModelEntity] instances and their cause-effect relationships. + */ + +open class Model( + /** + * Primary constructor. + */ + var initialTime: Number = 0.0, + var finalTime: Number = 100.0, + var timeStep: Number = 0.25, + var integrationType: Integration = EulerIntegration(), + var name: String = "", + var timeUnit: String = "", + + val entities: HashMap = hashMapOf(), + val converters: ArrayList = arrayListOf(), + val modules: HashMap = hashMapOf(), + + var currentTime: Double = initialTime.toDouble() + +) { + + /** + * Getter: list of stocks. + */ + val stocks: List + get() { + val stocks = ArrayList() + val modelEntities = ArrayList(this.entities.values) + modelEntities.forEach { modelEntity -> + if (modelEntity is Stock) { + stocks.add(modelEntity) + } + } + return stocks + } + + + /** + * Getter: list of model entity keys. + */ + val modelEntitiesKeys: List + get() { + return ArrayList(this.entities.keys) + } + + + /** + * Getter: list of model entity units. + */ + val modelEntitiesUnits: List + get() { + val modelEntities = this.entities + val modelEntityUnits = ArrayList() + modelEntities.forEach { modelEntity -> + modelEntityUnits.add(modelEntity.value.unit) + } + return modelEntityUnits + } + + + /** + * Getter: list of model entity values. + */ + val modelEntitiesValues: List + get() { + val modelEntityValues = ArrayList() + val modelEntities = ArrayList(this.entities.values) + modelEntities.forEach { modelEntity -> + modelEntityValues.add(DecimalFormat("#.######").format(modelEntity.currentValue)) + } + return modelEntityValues + } + + + /** + * Create a new model entity. + */ + fun createModelEntity(entityType: ModelEntityType, name: String): ModelEntity? { + val modelEntity: ModelEntity + when (entityType) { + ModelEntityType.STOCK -> modelEntity = Stock(name) + ModelEntityType.FLOW -> modelEntity = Flow(name) + ModelEntityType.CONSTANT -> modelEntity = Constant(name) + ModelEntityType.CONVERTER -> modelEntity = Converter(name) + } + this.addModelEntity(modelEntity) + return modelEntity + } + + + /** + * Create a new entity - Stock. + */ + fun stock(name: String): Stock { + val modelEntity: ModelEntity = Stock(name) + this.addModelEntity(modelEntity) + return modelEntity as Stock + } + + + /** + * Create a new entity - Flow. + */ + fun flow(name: String): Flow { + val modelEntity: ModelEntity = Flow(name) + this.addModelEntity(modelEntity) + return modelEntity as Flow + } + + + /** + * Create a new entity - Constant. + */ + fun constant(name: String): Constant { + val modelEntity: ModelEntity = Constant(name) + this.addModelEntity(modelEntity) + return modelEntity as Constant + } + + + /** + * Create a new entity - Converter. + */ + fun converter(name: String): Converter { + val modelEntity: ModelEntity = Converter(name) + this.addModelEntity(modelEntity) + return modelEntity as Converter + } + + + /** + * Add model entity to the model. + */ + fun addModelEntity(modelEntity: ModelEntity) { + if (!existModelEntity(modelEntity)) { + this.entities[modelEntity.name] = modelEntity + } else { + throw IllegalArgumentException("Duplicate model entity.") + } + + } + + + /** + * Check whether model already contains a model entity or not. + */ + private fun existModelEntity(modelEntity: ModelEntity): Boolean { + return this.entities.containsKey(modelEntity.name) + } + + + /** + * Create a new converter. + */ + fun createConverter(entity: ModelEntity, vararg inputs: ModelEntity): Converter { + val converter = Converter(entity, *inputs) + this.addConverter(converter) + entity.converter = converter + return converter + } + + + /** + * Add converter to model. + */ + private fun addConverter(converter: Converter) { + this.converters.add(converter) + } + + + /** + * Create a new module. + */ + fun createModule(moduleName: String, modelPath: String): Model { + val moduleObject = Class.forName(modelPath).kotlin.createInstance() + val module = moduleObject as Model + module.name = moduleName + this.addModule(module) + return module + } + + + /** + * Add module to model. + */ + private fun addModule(module: Model) { + if (!existModule(module)) { + this.modules[module.name] = module + } else { + throw IllegalArgumentException("Duplicate model module.") + } + } + + + /** + * Check whether model already contains a module or not. + */ + private fun existModule(module: Model): Boolean { + return this.modules.containsKey(module.name) + } + + + /** + * Print model entities. + */ + override fun toString(): String { + return "Model [entities = ${this.entities} ]" + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntity.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntity.kt new file mode 100644 index 0000000..5733a82 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntity.kt @@ -0,0 +1,152 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Abstract class that represents SD entities: [Stock], [Flow] or [Constant]. + * + * @property name Entity name. + * @property currentValue Entity current value (during integrationType). Default 0.0. + * @property previousValue Entity previous value (in previous step of integrationType). Default 0.0. + * @property equation Entity equation (for integrationType). Default null. + * @property isCurrentValueCalculated Flag: 'true' if the current value has already been calculated in integrationType + * process, and (default) 'false' otherwise. + * @property converter Entity converter (for converting one entity to another): default is 'null'. + */ + +abstract class ModelEntity( + /** + * Primary constructor. + */ + var name: String, + var description: String = "", + var unit: String = "", + var currentValue: Double = 0.0, + var previousValue: Double = 0.0, + var isCurrentValueCalculated: Boolean = false, + var converter: Converter? = null + +) { + + val _equation: (()->Double?)? + get() { + val invocationResult = equation?.invoke() + return when(invocationResult) { + is Double -> { + this.isCurrentValueCalculated = true + + { invocationResult as Double? } + } + is ModelEntity -> { + + if (invocationResult.isCurrentValueCalculated == false) { + this.isCurrentValueCalculated = false + } else { + this.isCurrentValueCalculated = true + } + { (invocationResult as ModelEntity).currentValue } + } + is Int -> { + this.isCurrentValueCalculated = true + { invocationResult.toDouble() } + } + else -> { + { null } + } + } + } + var equation: (()->Any?)? = null + + + /** + * Overridden methods. + */ + override fun toString(): String { + return "ModelEntity[ name=${this.name}, value=${this.currentValue}, previousValue=${this.previousValue} ]" + } + + + /** + * Operator overloading: times. + */ + operator fun times(other: Any): Double { + return when (other) { + is ModelEntity -> this.currentValue * other.currentValue + is Double -> this.currentValue * other + is Int -> this.currentValue * (other.toDouble()) + else -> 0.0 + } + } + + + /** + * Operator overloading: plus. + */ + operator fun plus(other: Any): Double { + return when(other) { + is ModelEntity -> this.currentValue + other.currentValue + is Double -> this.currentValue + other + is Int -> this.currentValue + (other.toDouble()) + else -> 0.0 + } + } + + + /** + * Operator overloading: minus. + */ + operator fun minus(other: Any): Double { + return when(other) { + is ModelEntity -> this.currentValue - other.currentValue + is Double -> this.currentValue - other + is Int -> this.currentValue - (other.toDouble()) + else -> 0.0 + } + } + + + /** + * Operator overloading: div. + */ + operator fun div(other: Any): Double { + return when(other) { + is ModelEntity -> if (other != 0) this.currentValue / other.currentValue else 0.0 + is Double -> if (other != 0) this.currentValue / other else 0.0 + is Int -> this.currentValue / (other.toDouble()) + else -> 0.0 + } + } + + + /** + * Operator overloading: unaryMinus. + */ + operator fun unaryMinus(): Double { + return this.currentValue * (-1.0) + } + +} + + +/** + * For commutativity - extension function on Double: div. + */ +operator fun Double.div(other: Any): Double { + return when (other) { + is ModelEntity -> if (other != 0) this / other.currentValue else 0.0 + is Double -> if (other != 0) this / other else 0.0 + is Int -> this / (other.toDouble()) + else -> 0.0 + } +} + + +/** + * For commutativity - extension function on Double: times. + */ +operator fun Double.times(other: Any): Double { + return when (other) { + is ModelEntity -> this * other.currentValue + is Double -> this * other + is Int -> this * (other.toDouble()) + else -> 0.0 + } +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntityType.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntityType.kt new file mode 100644 index 0000000..295e1e2 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/ModelEntityType.kt @@ -0,0 +1,10 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Three entities of system dynamics models: [Stock], [Flow] and [Constant]. + * [Flow] and [Converter] are basically the same entity, but with different roles. + * + */ +enum class ModelEntityType { + STOCK, FLOW, CONSTANT, CONVERTER +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Stock.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Stock.kt new file mode 100644 index 0000000..f548940 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/entities/Stock.kt @@ -0,0 +1,37 @@ +package hr.unipu.ksdtoolkit.entities + +/** + * Stock entity. + * + * Stock has one or more "input" and "outputs" [Flow] instances, integrates (accumulates) their difference or "change + * rate", and represents a "memory" of a current state of the dynamics system. + * Stocks can be only influenced by flows. + * + * @property name Stock name (only passed to the abstract class ModelEntity). + */ +class Stock(name: String) : ModelEntity(name) { + + val _initialValue: (()->Double?)? + get() { + val invocationResult = initialValue?.invoke() + return when(invocationResult) { + is Double -> { + { invocationResult as Double? } + } + is ModelEntity -> { + { invocationResult.equation?.invoke().toString().toDouble() } + } + is Int -> { + { invocationResult.toDouble() } + } + else -> null + } + } + var initialValue: (()->Any?)? = null + + + init { + this.isCurrentValueCalculated = true + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/EulerIntegration.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/EulerIntegration.kt new file mode 100644 index 0000000..f3e0bcf --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/EulerIntegration.kt @@ -0,0 +1,18 @@ +package hr.unipu.ksdtoolkit.integration + +/** + * Euler method for numeric integrationType implementation. + * + * The class is extends [Integration] abstract class. + */ +class EulerIntegration : Integration() { + + override fun integrate() { + for(stock in stocks) { + val calculatedValue = stock.currentValue + ( stock._equation?.invoke() ?: 0.0 ) * dt + stock.currentValue = calculatedValue + stock.isCurrentValueCalculated = true + } + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/Integration.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/Integration.kt new file mode 100644 index 0000000..bccea18 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/Integration.kt @@ -0,0 +1,18 @@ +package hr.unipu.ksdtoolkit.integration + +import hr.unipu.ksdtoolkit.entities.Stock + +/** + * Abstract class that describes an integrationType process. + */ +abstract class Integration { + + var dt: Double = 0.0 + var stocks: List = arrayListOf() + var converters: List = arrayListOf() + + /** + * Abstract method for numeric integrationType that has to be implemented (by methods: Euler, Runge-Kutta, etc.) + */ + abstract fun integrate() +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/RungeKuttaIntegration.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/RungeKuttaIntegration.kt new file mode 100644 index 0000000..5a24dcc --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/integration/RungeKuttaIntegration.kt @@ -0,0 +1,30 @@ +package hr.unipu.ksdtoolkit.integration + +/** + * Runge-Kutta method for numeric integrationType implementation. + * + * The class is extends [Integration] abstract class. + */ +class RungeKuttaIntegration : Integration() { + + override fun integrate() { + val k = Array(this.stocks.size) { DoubleArray(4) } + for (i in 0..3) { + var j = 0 + for (stock in this.stocks) { + k[j][i] = (stock._equation?.invoke() ?: 0.0) * this.dt + if (i < 2) + stock.currentValue = stock.previousValue + k[j][i] / 2 + else if (i == 2) + stock.currentValue = stock.previousValue + k[j][i] + else { + val calculatedValue = stock.previousValue + k[j][0] / 6 + k[j][1] / 3 + k[j][2] / 3 + k[j][3] / 6 + stock.currentValue = calculatedValue + } + stock.isCurrentValueCalculated = true + j++ + } + } + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelBassDiffusion.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelBassDiffusion.kt new file mode 100644 index 0000000..3576a95 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelBassDiffusion.kt @@ -0,0 +1,131 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration + +/** + * SD model of Bass Diffusion. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +open class ModelBassDiffusion : Model() { + + // Static properties: + companion object { + const val INITIAL_TARGET_MARKET_SIZE_KEY = "INITIAL_TARGET_MARKET_SIZE" + const val INITIAL_CUSTOMER_BASE_SIZE_KEY = "INITIAL_CUSTOMER_BASE_SIZE" + const val ADVERTISING_BUDGET_KEY = "ADVERTISING_BUDGET" + const val PERSONS_REACHED_PER_EURO_KEY = "PERSONS_REACHED_PER_EURO" + const val ADVERTISING_SUCCESS_RATE_KEY = "ADVERTISING_SUCCESS_RATE" + const val WORD_OF_MOUTH_CONTACT_RATE_KEY = "WORD_OF_MOUTH_CONTACT_RATE" + const val WORD_OF_MOUTH_SUCCESS_RATE_KEY = "WORD_OF_MOUTH_SUCCESS_RATE" + + const val INITIAL_TARGET_MARKET_SIZE_VALUE= 6e6 // [customer] + const val INITIAL_CUSTOMER_BASE_SIZE_VALUE = 0.0 // [customer] + const val ADVERTISING_BUDGET_VALUE = 10000.0 // [EUR/month] + const val PERSONS_REACHED_PER_EURO_VALUE = 100.0 // [customer/EUR] + const val ADVERTISING_SUCCESS_RATE_VALUE = 1.0 // [%] + const val WORD_OF_MOUTH_CONTACT_RATE_VALUE = 1 // [1/month] + const val WORD_OF_MOUTH_SUCCESS_RATE_VALUE = 10.0 // [%] + + const val INITIAL_TIME_VALUE = 0.0 + const val FINAL_TIME_VALUE = 60.0 + const val TIME_STEP_VALUE = 0.25 + } + + + init { + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this // inheritance: Model() + // alternative: Model(INITIAL_TIME_VALUE, FINAL_TIME_VALUE, TIME_STEP_VALUE, EulerIntegration()) + + // override default model properties: + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.integrationType = EulerIntegration() + model.name = "Bass Diffusion Model" // name is optional + + + + // 2. Create all system elements: + + // - 2a. Variables + val INITIAL_TARGET_MARKET_SIZE= model.constant(INITIAL_TARGET_MARKET_SIZE_KEY) + val INITIAL_CUSTOMER_BASE_SIZE = model.constant(INITIAL_CUSTOMER_BASE_SIZE_KEY) + val ADVERTISING_BUDGET = model.constant(ADVERTISING_BUDGET_KEY) + val PERSONS_REACHED_PER_EURO = model.constant(PERSONS_REACHED_PER_EURO_KEY) + val ADVERTISING_SUCCESS_RATE = model.constant(ADVERTISING_SUCCESS_RATE_KEY) + val WORD_OF_MOUTH_CONTACT_RATE = model.constant(WORD_OF_MOUTH_CONTACT_RATE_KEY) + val WORD_OF_MOUTH_SUCCESS_RATE = model.constant(WORD_OF_MOUTH_SUCCESS_RATE_KEY) + + val marketSaturationPct = model.converter("marketSaturationPct") + val potentialCustomersReachedThroughAdvertising = model.converter("potentialCustomersReachedThroughAdvertising") + val acquisitionThroughAdvertising = model.converter("acquisitionThroughAdvertising") + val potentialCustomersReachedThroughWordOfMouth = model.converter("potentialCustomersReachedThroughWordOfMouth") + val acquisitionThroughWordOfMouth = model.converter("acquisitionThroughWordOfMouth") + + // - 2b. Stocks + val Customer_Base = model.stock("Customer_Base") + val Advertising_Customers = model.stock("Advertising_Customers") + val WordOfMouth_Customers = model.stock("WordOfMouth_Customers") + + // - 2c. Flows + val customerAcquisition = model.flow("customerAcquisition") + val advCustomerIn = model.flow("advCustomerIn") + val womCustomerIn = model.flow("womCustomerIn") + + + + // 3. Initial values: + + // - 3a. Stocks + + Customer_Base.initialValue = { INITIAL_CUSTOMER_BASE_SIZE } + Advertising_Customers.initialValue = { 0.0 } + WordOfMouth_Customers.initialValue = { 0.0 } + + + + // 4. Equations: + + // - 4a. Variables + INITIAL_TARGET_MARKET_SIZE.equation = { INITIAL_TARGET_MARKET_SIZE_VALUE } + INITIAL_CUSTOMER_BASE_SIZE.equation = { INITIAL_CUSTOMER_BASE_SIZE_VALUE } + ADVERTISING_BUDGET.equation = { ADVERTISING_BUDGET_VALUE } + PERSONS_REACHED_PER_EURO.equation = { PERSONS_REACHED_PER_EURO_VALUE } + ADVERTISING_SUCCESS_RATE.equation = { ADVERTISING_SUCCESS_RATE_VALUE } + WORD_OF_MOUTH_CONTACT_RATE.equation = { WORD_OF_MOUTH_CONTACT_RATE_VALUE } + WORD_OF_MOUTH_SUCCESS_RATE.equation = { WORD_OF_MOUTH_SUCCESS_RATE_VALUE } + + // - 4b. Stocks + + Customer_Base.equation = { customerAcquisition } + Advertising_Customers.equation = { advCustomerIn } + WordOfMouth_Customers.equation = { womCustomerIn } + + // - 4c. Flows + customerAcquisition.equation = { advCustomerIn + womCustomerIn } + advCustomerIn.equation = { acquisitionThroughAdvertising } + womCustomerIn.equation = { acquisitionThroughWordOfMouth } + + // - 4d. Converters: + + marketSaturationPct.equation = { Customer_Base / INITIAL_TARGET_MARKET_SIZE * 100.0 } + + potentialCustomersReachedThroughAdvertising.equation = + { PERSONS_REACHED_PER_EURO * ADVERTISING_BUDGET * (1.0 - marketSaturationPct / 100.0) } + + acquisitionThroughAdvertising.equation = + { potentialCustomersReachedThroughAdvertising * ADVERTISING_SUCCESS_RATE / 100.0 } + + potentialCustomersReachedThroughWordOfMouth.equation = + { WORD_OF_MOUTH_CONTACT_RATE * Customer_Base * (1 - marketSaturationPct / 100.0) } + + acquisitionThroughWordOfMouth.equation = + { potentialCustomersReachedThroughWordOfMouth * WORD_OF_MOUTH_SUCCESS_RATE / 100.0 } + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelGenericSD.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelGenericSD.kt new file mode 100644 index 0000000..37bd0bd --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelGenericSD.kt @@ -0,0 +1,131 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.modules.ModuleGenericCompoundDecrease + +/** + * SD model of Simple Compound Interest. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +open class ModelGenericSD : Model() { + + // Static properties: + companion object { + const val CONSTANT_KEY = "CONSTANT" + const val CONVERTER_KEY = "converter" + const val INITIAL_STOCK_KEY = "INITIAL_STOCK" + const val INFLOW_KEY = "inflow" + const val OUTFLOW_KEY = "outflow" + const val STOCK_KEY = "Stock" + + const val CONSTANT_VALUE = 10 // [%] + const val INITIAL_STOCK_VALUE = 100 // [€] + const val INITIAL_TIME_VALUE = 0 // [month] + const val FINAL_TIME_VALUE = 120 // [month] + const val TIME_STEP_VALUE = 0.25 // [month] + } + + + init { + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this // inheritance: Model() + + /* + val model = Model( + initialTime = 0, + finalTime = 100, + timeStep = 0.25, + integrationType = EulerIntegration() + ) + */ + + + /* + val model = Model(0, 100, 0.25, EulerIntegration()) + // alternative: Model(INITIAL_TIME_VALUE, FINAL_TIME_VALUE, TIME_STEP_VALUE, EulerIntegration()) + */ + + + // override default model properties: + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.integrationType = EulerIntegration() + model.name = "Generic SD Model" // name is optional + model.timeUnit = "month" // unit is optional + + + + // 2. Create all system elements: + + // - 2a. Variables (Constants) + val CONSTANT = model.constant(CONSTANT_KEY) + val INITIAL_STOCK = model.constant(INITIAL_STOCK_KEY) + + // - 2b. Variables (Converters) + val converter = model.converter(CONVERTER_KEY) + + // - 2c. Stocks + val Stock = model.stock(STOCK_KEY) + + // - 2d. Flows + val inflow = model.flow(INFLOW_KEY) + val outflow = model.flow(OUTFLOW_KEY) + + // - 2e. Modules + val Module = model.createModule( + "Module", + "hr.unipu.ksdtoolkit.modules.ModuleGenericCompoundDecrease" + ) as ModuleGenericCompoundDecrease + + + // - 2f. (Optional): Entities' descriptions + CONSTANT.description = "Annual flow rate in [%/year]" + INITIAL_STOCK.description = "Initial capital in [EUR] in the beginning of the simulation." + converter.description = "Converts percentage to decimal." + Stock.description = "Accumulated capital in [EUR] at specific point in time." + inflow.description = "Interest inflow in [EUR / chosen unit of time], e.g. [EUR/month]." + outflow.description = "Interest outflow in [EUR / chosen unit of time], e.g. [EUR/month]." + + // - 2g. (Optional): Entities' units + CONSTANT.unit = "%/year" + INITIAL_STOCK.unit = "€" + Stock.unit = "€" + inflow.unit = "€/month" + outflow.unit = "€/month" + + + // 3. Initial values: + + // - 3a. Stocks + Stock.initialValue = { INITIAL_STOCK } // Accepts: Double, Int or ModelEntity + + + + // 4. Equations: + + // - 4a. Constants + CONSTANT.equation = { CONSTANT_VALUE } + INITIAL_STOCK.equation = { INITIAL_STOCK_VALUE } + + // - 4b. Converters + converter.equation = { CONSTANT / 100.0 / 12.0 } + + // - 4c. Stocks + Stock.equation = { inflow - outflow } // Function type can be either Double or ModelEntity. + + // - 4d. Flows: + inflow.equation = { Stock * converter } // Simplified converters so that only equations are used. + outflow.equation = { Module.outflow } // Alternative, instead of lambda, member reference: Module::outflow + + // - 4e. Modules: + Module.inflow.equation = { outflow } + + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInheritedCompoundInterest.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInheritedCompoundInterest.kt new file mode 100644 index 0000000..8ff370b --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInheritedCompoundInterest.kt @@ -0,0 +1,71 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.integration.RungeKuttaIntegration + +/** + * Inheritance of Simple Compound Interest Model. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +class ModelInheritedCompoundInterest : ModelSimpleCompoundInterest() { + + // Static properties: + companion object { + const val INTEREST_RATE_KEY = "INTEREST_RATE" + const val INITIAL_CAPITAL_KEY = "INITIAL_CAPITAL" + const val INTEREST_KEY = "interest" + const val CAPITAL_KEY = "Capital" + + const val INTEREST_RATE_VALUE = -0.1 / 12 + const val INITIAL_CAPITAL_VALUE = 200.0 + const val INITIAL_TIME_VALUE = 0.0 + const val FINAL_TIME_VALUE = 240.0 + const val TIME_STEP_VALUE = 0.25 + } + + + // 1. Create the model (with the parameters) + val modelInherited = this // inheritance: ModelSimpleCompoundInterest() + //val modelInherited = object : ModelSimpleCompoundInterest() {} + + + init { + + // overriding default model properties: + modelInherited.initialTime = INITIAL_TIME_VALUE + modelInherited.finalTime = FINAL_TIME_VALUE + modelInherited.timeStep = TIME_STEP_VALUE + modelInherited.integrationType = RungeKuttaIntegration() + modelInherited.name = "Inherited Compound Interest Model" + + // changing inherited model constants + modelInherited.entities[INITIAL_CAPITAL_KEY]?.equation = { INITIAL_CAPITAL_VALUE } + modelInherited.entities[INTEREST_RATE_KEY]?.equation = { INTEREST_RATE_VALUE } + + modelInherited.INITIAL_CAPITAL.equation = { 200.0 } + modelInherited.INTEREST_RATE.equation = { -0.1 / 12 } + } + + val ModuleSimpleCompound1 = modelInherited.createModule( + "ModuleSimpleCompound1", + "hr.unipu.ksdtoolkit.models.ModelSimpleCompoundInterest" + ) as ModelSimpleCompoundInterest + + val ModuleSimpleCompound2 = object : ModelSimpleCompoundInterest() {} + + init { + modelInherited.modules["ModuleSimpleCompound1"]?.entities!!["INITIAl_CAPITAL"]?.equation = { 1000.0 } + + modelInherited.ModuleSimpleCompound1.INITIAL_CAPITAL.equation = { 1000.0 } + + modelInherited.ModuleSimpleCompound2.INITIAL_CAPITAL.equation = { 1000.0 } + } + + val some_converter_in_parent = modelInherited.converter("some_converter_in_parent") + + init { + some_converter_in_parent.equation = { modelInherited.ModuleSimpleCompound1.INITIAL_CAPITAL } + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInnovationDiffusion.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInnovationDiffusion.kt new file mode 100644 index 0000000..b3745a7 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelInnovationDiffusion.kt @@ -0,0 +1,113 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.entities.div +import hr.unipu.ksdtoolkit.entities.times +import hr.unipu.ksdtoolkit.integration.RungeKuttaIntegration + +/** + * SD model of Bass Diffusion. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +open class ModelInnovationDiffusion : Model() { + + // Static properties: + companion object { + const val TOTAL_POPULATION_KEY = "TOTAL_POPULATION" + const val ADVERTISING_EFFECTIVENESS_KEY = "ADVERTISING_EFFECTIVENESS" + const val CONTACT_RATE_KEY = "CONTACT_RATE" + const val ADOPTION_FRACTION_KEY = "ADOPTION_FRACTION" + + const val TOTAL_POPULATION_VALUE = 10000.0 // [customer] + const val ADVERTISING_EFFECTIVENESS_VALUE = 0.011 // [1/year] + const val CONTACT_RATE_VALUE = 100.0 // [1/year] + const val ADOPTION_FRACTION_VALUE = 0.015 // [ ] + + const val INITIAL_TIME_VALUE = 0.0 + const val FINAL_TIME_VALUE = 10.0 + const val TIME_STEP_VALUE = 0.25 + } + + + init { + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this // inheritance: Model() + // alternative: Model(INITIAL_TIME_VALUE, FINAL_TIME_VALUE, TIME_STEP_VALUE, EulerIntegration()) + + // override default model properties: + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.timeUnit = "year" // optional + + //model.integrationType = EulerIntegration() + model.integrationType = RungeKuttaIntegration() + model.name = "Innovation/Product Diffusion Model" + + + + // 2. Create all system elements: + + // - 2a. Variables (Constants) + val TOTAL_POPULATION = model.constant("TOTAL_POPULATION") + val ADVERTISING_EFFECTIVENESS = model.constant("ADVERTISING_EFFECTIVENESS") + val CONTACT_RATE = model.constant("CONTACT_RATE") + val ADOPTION_FRACTION = model.constant("ADOPTION_FRACTION") + + // - 2b. Variables (Converters) + val adoptionFromAdvertising = model.converter("adoptionFromAdvertising") + val adoptionFromWordOfMouth = model.converter("adoptionFromWordOfMouth") + + // - 2c. Stocks + val Potential_Adopters = model.stock("Potential_Adopters") + val Adopters = model.stock("Adopters") + + // - 2d. Flows + val adoptionRate = model.flow("adoptionRate") + + // - 2g. (Optional): Entities' units + TOTAL_POPULATION.unit = "customer" + ADVERTISING_EFFECTIVENESS.unit = "1/year" + CONTACT_RATE.unit = "1/year" + ADOPTION_FRACTION.unit = "" + Potential_Adopters.unit = "customer" + Adopters.unit = "customer" + adoptionRate.unit = "customer/year" + + + + // 3. Initial values: + + // - 3a. Stocks + Potential_Adopters.initialValue = { TOTAL_POPULATION } + Adopters.initialValue = { 0.0 } + + + + // 4. Equations: + + // - 4a. Constants: + TOTAL_POPULATION.equation = { TOTAL_POPULATION_VALUE } + ADVERTISING_EFFECTIVENESS.equation = { ADVERTISING_EFFECTIVENESS_VALUE } + CONTACT_RATE.equation = { CONTACT_RATE_VALUE } + ADOPTION_FRACTION.equation = { ADOPTION_FRACTION_VALUE } + + // - 4b. Converters: + adoptionFromAdvertising.equation = { Potential_Adopters * ADVERTISING_EFFECTIVENESS } + adoptionFromWordOfMouth.equation = { CONTACT_RATE * ADOPTION_FRACTION * + Potential_Adopters * Adopters / TOTAL_POPULATION } + + // - 4c. Stocks + Potential_Adopters.equation = { - adoptionRate } + Adopters.equation = { adoptionRate } + + // - 4d. Flows + adoptionRate.equation = { adoptionFromAdvertising + adoptionFromWordOfMouth } + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelSimpleCompoundInterest.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelSimpleCompoundInterest.kt new file mode 100644 index 0000000..8f03ede --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelSimpleCompoundInterest.kt @@ -0,0 +1,100 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration + +/** + * SD model of Simple Compound Interest. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +open class ModelSimpleCompoundInterest : Model() { + + // Static properties: + companion object { + const val INTEREST_RATE_KEY = "INTEREST_RATE" + const val INITIAL_CAPITAL_KEY = "INITIAL_CAPITAL" + const val INTEREST_KEY = "interest" + const val CAPITAL_KEY = "Capital" + + const val INTEREST_RATE_VALUE = 0.1 / 12 + const val INITIAL_CAPITAL_VALUE = 100.0 + const val INITIAL_TIME_VALUE = 0.0 + const val FINAL_TIME_VALUE = 120.0 + const val TIME_STEP_VALUE = 0.25 + } + + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this // inheritance: Model() + // alternative: + //val model = Model(INITIAL_TIME_VALUE, FINAL_TIME_VALUE, TIME_STEP_VALUE, EulerIntegration()) + + + init { + + // override default model properties: + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.integrationType = EulerIntegration() + model.name = "Simple Compound Interest Model" // name is optional + model.timeUnit = "month" // timeUnit is optional + + } + + + // 2. Create all system elements: + + // - 2a. Variables + val INTEREST_RATE = model.constant(INTEREST_RATE_KEY) // Using: constant() function + val INITIAL_CAPITAL = model.constant(INITIAL_CAPITAL_KEY) // Using: constant() function + + // - 2b. Stocks + val Capital = model.stock(CAPITAL_KEY) // Using: stock() function + + // - 2c. Flows + val interest = model.flow(INTEREST_KEY) // Using: flow() function + + // - 2e. Modules + + + init { + + // - 2f. (Optional): Entities' descriptions + INTEREST_RATE.description = "Annual flow rate in [%/year]" + INITIAL_CAPITAL.description = "Initial capital in [EUR] in the beginning of the simulation." + Capital.description = "Accumulated capital in [EUR] at specific point in time." + interest.description = "Interest flow in [EUR / chosen unit of time], " + + "e.g. [EUR/month] due to paying flow on the Capital." + + // - 2g. (Optional): Entities' units + INTEREST_RATE.unit = "%/year" + INITIAL_CAPITAL.unit = "€" + Capital.unit = "€" + interest.unit = "€/month" + + + // 3. Initial values: + + // - 3a. Stocks + Capital.initialValue = { INITIAL_CAPITAL } // Accepts: Double or ModelEntity + + + + // 4. Equations: + + // - 4a. Variables + INTEREST_RATE.equation = { INTEREST_RATE_VALUE } + INITIAL_CAPITAL.equation = { INITIAL_CAPITAL_VALUE } + + // - 4b. Stocks + Capital.equation = { interest } // Function type can be either Double or ModelEntity. + + // - 4c. Converters: + interest.equation = { Capital * INTEREST_RATE } + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelTestSpeed.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelTestSpeed.kt new file mode 100644 index 0000000..7132c60 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/models/ModelTestSpeed.kt @@ -0,0 +1,92 @@ +package hr.unipu.ksdtoolkit.models + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration + +/** + * SD model of Simple Compound Interest. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +open class ModelTestSpeed : Model() { + + // Static properties: + companion object { + const val INITIAL_STOCK_KEY = "INITIAL_STOCK" + const val FLOW_KEY = "flow" + const val STOCK_KEY = "Stock" + + const val INITIAL_STOCK_VALUE = 1 // [] + const val FLOW_VALUE = 1 // [] + const val INITIAL_TIME_VALUE = 0 // [] + const val FINAL_TIME_VALUE = 1e7 // [] 1e7 for comparison (Vensim = cca30sec., BPTK-Py = cca153sec.) + const val TIME_STEP_VALUE = 1 // [] + } + + + // Time_steps=1e3 -> Time elapsed=0.093 -> 0.036 sec + // Time_steps=1e4 -> Time elapsed=0.192 -> 0.099 sec + // Time_steps=1e5 -> Time elapsed=0.704 -> 0.389 sec + // Time_steps=1e6 -> Time elapsed=4.367 -> 1.034 sec + // Time_steps=1e7 -> Time elapsed=27.99 -> 7.082 sec + + init { + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this + + // override default model properties: + model.initialTime = INITIAL_TIME_VALUE + model.finalTime = FINAL_TIME_VALUE + model.timeStep = TIME_STEP_VALUE + model.integrationType = EulerIntegration() + model.name = "SD Model for testing speed" // name is optional + + + + // 2. Create all system elements: + + // - 2a. Variables (Constants) + val INITIAL_STOCK = model.constant(INITIAL_STOCK_KEY) + + // - 2b. Variables (Converters) + + // - 2c. Stocks + val Stock = model.stock(STOCK_KEY) + + // - 2d. Flows + val flow = model.flow(FLOW_KEY) + + // - 2e. Modules + + // - 2f. (Optional): Entities' descriptions + + + + // 3. Initial values: + + // - 3a. Stocks + Stock.initialValue = { INITIAL_STOCK } // Accepts: Double, Int or ModelEntity + + + + // 4. Equations: + + // - 4a. Constants + INITIAL_STOCK.equation = { INITIAL_STOCK_VALUE } + + // - 4b. Converters + + // - 4c. Stocks + Stock.equation = { flow } // Function type can be either Double or ModelEntity. + + // - 4d. Flows: + flow.equation = { 1.0 } // Simplified converters so that only equations are used. + + // - 4e. Modules: + + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/modules/ModuleGenericCompoundDecrease.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/modules/ModuleGenericCompoundDecrease.kt new file mode 100644 index 0000000..6c4feb0 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/modules/ModuleGenericCompoundDecrease.kt @@ -0,0 +1,97 @@ +package hr.unipu.ksdtoolkit.modules + +import hr.unipu.ksdtoolkit.entities.Model + +/** + * SD model of Simple Compound Interest. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +open class ModuleGenericCompoundDecrease : Model() { + + // Static properties: + companion object { + const val CONSTANT_KEY = "CONSTANT" + const val CONVERTER_KEY = "converter" + const val INITIAL_STOCK_KEY = "INITIAL_STOCK" + const val OUTFLOW_KEY = "outflow" + const val INFLOW_KEY = "inflow" + const val STOCK_KEY = "Stock" + + const val CONSTANT_VALUE = 10.0 // [%] + const val INITIAL_STOCK_VALUE = 100.0 // [€] + } + + + // 1. Create the model (with setup of: time boundaries & time step & integrationType type) + val model = this // inheritance: Model() + // alternative: Model(INITIAL_TIME_VALUE, FINAL_TIME_VALUE, TIME_STEP_VALUE, EulerIntegration()) + + + init { + // override default model properties: + model.name = "Generic Compound Decrease Module" // name is optional + } + + + // 2. Create all system elements: + + // - 2a. Variables: Constants + val CONSTANT = model.constant(CONSTANT_KEY) + val INITIAL_STOCK = model.constant(INITIAL_STOCK_KEY) + + // - 2b. Variable: Converters + val converter = model.converter(CONVERTER_KEY) + + // - 2c. Stocks + val Stock = model.stock(STOCK_KEY) + + // - 2d. Flows + val inflow = model.flow(INFLOW_KEY) + val outflow = model.flow(OUTFLOW_KEY) + + // - 2e. Modules + // n/a + + init { + // - 2f. (Optional): Entities' descriptions + CONSTANT.description = "Annual flow rate in [%/year]" + INITIAL_STOCK.description = "Initial capital in [EUR] in the beginning of the simulation." + converter.description = "Converts percentage to decimal." + Stock.description = "Accumulated capital in [EUR] at specific point in time." + inflow.description = "Interest inflow in [EUR / chosen unit of time], e.g. [EUR/month]" + outflow.description = "Interest outflow in [EUR / chosen unit of time], e.g. [EUR/month]" + + + + // 3. Initial values: + + // - 3a. Stocks + Stock.initialValue = { INITIAL_STOCK } // Accepts: Double, Int or ModelEntity + + + + // 4. Equations: + + // - 4a. Variables (Constants) + CONSTANT.equation = { CONSTANT_VALUE } + INITIAL_STOCK.equation = { INITIAL_STOCK_VALUE } + + // - 4b. Variables (Converters) + converter.equation = { CONSTANT / 100.0 / 12.0 } + + // - 4c. Stocks + Stock.equation = { inflow - outflow } // Function type can be either Double or ModelEntity. + + // - 4d. Flows: + inflow.equation = { } // Not defined. Can be also defined as: { null }. Module input. + outflow.equation = { Stock * converter } // Simplified converters so that only equations are used. + + // - 4e. Modules: + // n/a + + + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/CsvExporter.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/CsvExporter.kt new file mode 100644 index 0000000..a6cac99 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/CsvExporter.kt @@ -0,0 +1,98 @@ +package hr.unipu.ksdtoolkit.outputs + + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import org.slf4j.LoggerFactory +import java.io.FileWriter +import java.io.IOException +import java.util.logging.Level +import java.util.logging.Logger + +/** + * Class for exporting simulation data in CSV format + * (also implements the [SimulationEventListener] interface). + */ +class CsvExporter(private val csvFile: String = "output.csv", // Default name. + private val separator: String = ";" // Default separator. +) : ISimulationEventHandler { + + val sb = StringBuilder() + + private val string: String + get() { + val last = sb.lastIndexOf("\n") + if (last >= 0 && sb.length - last == 1) { + sb.delete(last, sb.length) + } + return sb.toString() + } + + + /** + * Implementation of method simulationInitialized() from ISimulationEventHandler interface. + * Method 1) clears StringBuilder content and 2) writes simulation data, after initialization. + */ + override fun simulationInitialized(model: Model) { + clearContent() + writeTimeStepValues(model.modelEntitiesKeys) + } + + /** + * Implementation of method simulationInitialized() from ISimulationEventHandler interface. + * Method 1) clears StringBuilder content and 2) writes simulation data, after every time step. + */ + override fun timeStepCalculated(model: Model) { + writeTimeStepValues(model.modelEntitiesValues) + } + + /** + * Implementation of method simulationInitialized() from ISimulationEventHandler interface. + * Method saves simulation data into CSV file, after simulation is finished. + */ + override fun simulationFinished(model: Model) { + saveFile() + } + + + /** + * Clear CSV content. + */ + private fun clearContent() { + sb.delete(0, sb.length) + } + + + /** + * Write all simulation data for one timestep to the CSV. + * + * @param modelEntityValues values of the model entities. + */ + private fun writeTimeStepValues(modelEntityValues: List) { + var first = true + for (value in modelEntityValues) { + if (!first) { + sb.append(separator) + } + sb.append(value) + first = false + } + sb.append("\n") + } + + /** + * Save data to CSV file. + */ + private fun saveFile() { + try { + FileWriter(csvFile).use { writer -> + writer.append(string) + writer.flush() + LoggerFactory.getLogger(javaClass).info("CSV file saved.") + } + } catch (exception: IOException) { + LoggerFactory.getLogger(javaClass).error("Unable to save file.", exception) + } + } + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporter.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporter.kt new file mode 100644 index 0000000..8d1d86f --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporter.kt @@ -0,0 +1,50 @@ +package hr.unipu.ksdtoolkit.outputs + +import hr.unipu.ksdtoolkit.entities.Model +import javafx.application.Application.launch +import javafx.application.Platform +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import hr.unipu.ksdtoolkit.simulations.Simulation +import javafx.application.Application +import javafx.stage.Stage +import org.slf4j.LoggerFactory +import java.lang.IllegalStateException + + +/** + * Class that implements the [SimulationEventListener] interface and controls the chart plotting. + */ +class PngExporter(fileName: String) : ISimulationEventHandler { + + companion object { + lateinit var simulation: Simulation + } + + init { + PngExporterApp.fileName = fileName + PngExporterApp.model = simulation.model + PngExporterApp.simulation = simulation + } + + override fun simulationInitialized(model: Model) { + PngExporterApp.addSeries(model.modelEntitiesKeys) + } + + override fun timeStepCalculated(model: Model) { + PngExporterApp.addValues(model.modelEntitiesValues, model.currentTime) + } + + override fun simulationFinished(model: Model) { + // Application is not just a window, it's a Process. + // Thus only one Application.launch() is allowed per VM. + try { + LoggerFactory.getLogger(javaClass).info("PngExporterApp launching attempt.") + PngExporterApp.pngExporterListener = this + launch(PngExporterApp::class.java) + + } catch (exception: IllegalStateException) { + LoggerFactory.getLogger(javaClass).error("PngExporterApp launching failed.", exception) + } + + } +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporterApp.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporterApp.kt new file mode 100644 index 0000000..38d8de2 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/PngExporterApp.kt @@ -0,0 +1,186 @@ +package hr.unipu.ksdtoolkit.outputs + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import hr.unipu.ksdtoolkit.simulations.Simulation +import javafx.application.Application +import javafx.application.Platform +import javafx.embed.swing.SwingFXUtils +import javafx.scene.Group +import javafx.scene.Scene +import javafx.scene.chart.LineChart +import javafx.scene.chart.NumberAxis +import javafx.scene.chart.XYChart +import javafx.scene.chart.XYChart.Series +import javafx.scene.layout.BorderPane +import javafx.stage.Stage +import org.slf4j.LoggerFactory + +import javax.imageio.ImageIO +import java.io.File +import java.text.NumberFormat +import java.text.ParseException +import java.util.ArrayList +import java.util.Locale +import kotlin.time.measureTimedValue + +/** + * JavaFX app for chart plotting & exporting. + */ +class PngExporterApp : Application() { + + companion object { + + lateinit var model: Model + lateinit var simulation: Simulation + lateinit var pngExporterListener: ISimulationEventHandler + + var fileName: String = "outputs.png" + lateinit var series: ArrayList> + private var width = 800.0 + private var height = 600.0 + + /** + * Add series names to the chart. + * + * @param modelEntityNames list of model entity names. + */ + fun addSeries(modelEntityNames: List) { + series = ArrayList>() + for (modelEntityName in modelEntityNames) { + val s = Series() + s.name = modelEntityName + series.add(s) + } + } + + /** + * Add values to the chart series. + * + * @param modelEntityValues list of model entity values. + * @param currentTime current model time. + */ + fun addValues(modelEntityValues: List, currentTime: Double) { + for (i in modelEntityValues.indices) { + val valueString = modelEntityValues[i] + val format = NumberFormat.getInstance(Locale.US) + val number: Number + try { + number = format.parse(valueString) + val value = number.toDouble() + series[i].data?.add(XYChart.Data(currentTime, value)) + } catch (exception: ParseException) { + LoggerFactory.getLogger(javaClass).error("Error with parsing model entity values.", exception) + } + + } + } + + /** + * Set scene width and height. + * + * @param width width. + * @param height height. + */ + fun setSize(width: Double, height: Double) { + Companion.width = width + Companion.height = height + } + + /** + * Save the chart as an image. + * + * @param scene Scene + */ + private fun saveToFile(scene: Scene) { + val image = scene.snapshot(null) + val outputFile = File(fileName) + val bImage = SwingFXUtils.fromFXImage(image, null) + ImageIO.write(bImage, "png", outputFile) + LoggerFactory.getLogger(javaClass).info("PNG file saved.") + } + } + + + override fun start(stage: Stage) { + + LoggerFactory.getLogger(javaClass).info("PngExporterApp started.") + + val root = Group() + + val scene = Scene(root, width, height) + + val lineChart = createLineChart(model.name) + lineChart.createSymbols = false + lineChart.stylesheets.add("/Style2.css") + lineChart.data.addAll(series) + + val borderPane = BorderPane() + borderPane.prefHeightProperty().bind(scene.heightProperty()) + borderPane.prefWidthProperty().bind(scene.widthProperty()) + borderPane.center = lineChart + + root.children.add(borderPane) + + saveToFile(scene) + + stage.scene = scene + stage.show() + + val doOutputHandlersContainOtherJavaFxApp = simulation.outputHandlers.any { + it.javaClass.name == "hr.unipu.ksdtoolkit.outputs.WinSimulator" + } + if (doOutputHandlersContainOtherJavaFxApp) { + simulation.outputHandlers.remove(pngExporterListener) + Platform.setImplicitExit(true) + Platform.runLater { WinSimulatorApp().start(Stage()) } + } + LoggerFactory.getLogger(javaClass).info("PngExporterApp exit.") + + } + + + /** + * Create LineChart. + * + * @param title line chart title + * @return line chart + */ + private fun createLineChart(title: String): LineChart { + + val xAxis = NumberAxis() + val yAxis = NumberAxis() + xAxis.label = "Time [${model.timeUnit}]" + yAxis.label = "Value []" + + val lineChart = LineChart(xAxis, yAxis) + + lineChart.animated = false + + setAxisBounds(lineChart, + min = simulation.model.initialTime.toDouble(), + max = simulation.model.finalTime.toDouble(), + isXAxis = true + ) + + lineChart.title = title + return lineChart + } + + + /** + * Setting axis bounds. + */ + fun setAxisBounds(myChart: LineChart, min: Double, max: Double, isXAxis: Boolean) { + val axis: NumberAxis = if (isXAxis) { + myChart.xAxis as NumberAxis + } else { + myChart.yAxis as NumberAxis + } + axis.isAutoRanging = false + axis.lowerBound = min + axis.upperBound = max + } + + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulator.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulator.kt new file mode 100644 index 0000000..99f8709 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulator.kt @@ -0,0 +1,48 @@ +package hr.unipu.ksdtoolkit.outputs + +import hr.unipu.ksdtoolkit.entities.Constant +import hr.unipu.ksdtoolkit.entities.Model +import javafx.application.Application.launch +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.slf4j.LoggerFactory + + +/** + * Class that implements the [ISimulationEventHandler] interface and controls the chart printing. + * + */ +class WinSimulator() : ISimulationEventHandler { + + companion object { + lateinit var simulation: Simulation + } + + init { + WinSimulatorApp.simulation = simulation + } + + override fun simulationInitialized(model: Model) { + WinSimulatorApp.addSeriesNames(model.modelEntitiesKeys) + WinSimulatorApp.addSeriesConstants(model.entities.filterValues { it is Constant }) + + } + + override fun timeStepCalculated(model: Model) { + WinSimulatorApp.addSeriesValues(model.modelEntitiesValues, model.currentTime) + } + + override fun simulationFinished(model: Model) { + try { + // Application is not just a window, it's a Process. + // Thus only one Application#launch() is allowed per VM. + LoggerFactory.getLogger(javaClass).info("WinSimulatorApp launching attempt.") + WinSimulatorApp.winSimulatorListener = this + launch(WinSimulatorApp::class.java) + + } catch (exception: IllegalStateException) { + LoggerFactory.getLogger(javaClass).error("WinSimulatorApp launching failed.", exception) + } + + } +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulatorApp.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulatorApp.kt new file mode 100644 index 0000000..8697e48 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/outputs/WinSimulatorApp.kt @@ -0,0 +1,351 @@ +package hr.unipu.ksdtoolkit.outputs + +import javafx.application.Application +import javafx.embed.swing.SwingFXUtils +import javafx.event.ActionEvent +import javafx.event.EventHandler +import javafx.geometry.Insets +import javafx.scene.Cursor +import javafx.scene.Scene +import javafx.scene.chart.LineChart +import javafx.scene.chart.NumberAxis +import javafx.scene.chart.XYChart +import javafx.scene.chart.XYChart.Series +import javafx.scene.control.* +import javafx.scene.input.MouseButton +import javafx.scene.layout.BorderPane +import javafx.scene.layout.VBox +import javafx.stage.Stage +import hr.unipu.ksdtoolkit.entities.ModelEntity +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import hr.unipu.ksdtoolkit.simulations.Simulation +import javafx.application.Platform +import javafx.event.Event +import javafx.scene.input.KeyCode +import javafx.scene.input.KeyEvent +import org.slf4j.LoggerFactory + +import javax.imageio.ImageIO +import java.io.File +import java.io.IOException +import java.text.NumberFormat +import java.text.ParseException +import java.util.ArrayList +import java.util.Locale +import java.util.logging.Level +import java.util.logging.Logger + +/** + * JavaFX app for chart plotting and interactive simulation. + */ +class WinSimulatorApp : Application() { + + companion object { + + private lateinit var scene: Scene + private lateinit var series: ArrayList> + private lateinit var seriesConstants: ArrayList> + private lateinit var checkBoxes: ArrayList + private lateinit var textFields: ArrayList + private lateinit var lineChart: LineChart + private var width = 800.0 + private var height = 600.0 + + + lateinit var simulation: Simulation + lateinit var winSimulatorListener: ISimulationEventHandler + + /** + * Add names of entities to names of series. + * + * @param modelEntityNames list of model entity names. + */ + fun addSeriesNames(modelEntityNames: List) { + series = ArrayList() + for (modelEntityName in modelEntityNames) { + val s = Series() + s.name = modelEntityName + series.add(s) + } + } + + /** + * Add constants for text fields. + * + * @param modelEntityConstants list of model entity (constants) names. + */ + fun addSeriesConstants(modelEntityConstants: Map) { + seriesConstants = ArrayList() + for (modelEntityConstant in modelEntityConstants) { + val s = Series() + s.name = modelEntityConstant.key + val value = modelEntityConstant.value.currentValue + s.data.add(XYChart.Data(0.0, value)) + seriesConstants.add(s) + } + } + + /** + * Add values to chart series. + * + * @param modelEntityValues list of model entity values. + * @param currentTime current model time. + */ + fun addSeriesValues(modelEntityValues: List, currentTime: Double) { + for (i in modelEntityValues.indices) { + val valueString = modelEntityValues[i] + val format = NumberFormat.getInstance(Locale.US) + val number: Number + try { + number = format.parse(valueString) + val value = number.toDouble() + series[i].data?.add(XYChart.Data(currentTime, value)) + } catch (ex: ParseException) { + Logger.getLogger(WinSimulatorApp::class.java.getName()).log(Level.SEVERE, null, ex) + } + } + } + + + /** + * Set scene width and height. + * + * @param width width. + * @param height height. + */ + fun setSize(width: Double, height: Double) { + Companion.width = width + Companion.height = height + } + + /** + * Save the chart as an image. + * + * @param scene Scene + */ + private fun saveToFile(scene: Scene) { + val image = scene.snapshot(null) + val outputFile = File("chart.png") + val bImage = SwingFXUtils.fromFXImage(image, null) + try { + ImageIO.write(bImage, "png", outputFile) + } catch (e: IOException) { + throw RuntimeException(e) + } + + } + } + + override fun start(stage: Stage) { + + LoggerFactory.getLogger(javaClass).info("WinSimulatorApp started.") + + stage.title = "WinSimulator" + val root = BorderPane() + + scene = Scene(root, width, height) + + lineChart = this.createLineChart("") + lineChart.data.addAll(series) + lineChart.cursor = Cursor.CROSSHAIR + lineChart.animated = false + addTooltips() + addLineChartContextMenu() + + checkBoxes = ArrayList() + for (s in series) { + val cb = CheckBox(s.name) + cb.onAction = EventHandler { this.updateLineChart(it) } + cb.isSelected = true + checkBoxes.add(cb) + } + + textFields = ArrayList() + for (s in seriesConstants) { + + val tf1 = Label(s.name) + val tf2 = TextField(s.data[0].yValue.toString()) + val tf3 = VBox(tf1, tf2) + + tf2.onAction = EventHandler { this.reRunSimulation(it) } + + tf2.onKeyPressed = EventHandler { + if (it.code == KeyCode.TAB) { + this.reRunSimulation(it) + } + } + + textFields.add(tf3) + } + + + val dataLabel1 = Label("Constants:") + val vbox1 = VBox(8.0) + vbox1.children.addAll(dataLabel1) + vbox1.children.addAll(textFields) + vbox1.padding = Insets(20.0, 10.0, 20.0, 10.0) + + val dataLabel2 = Label("Entities:") + val vbox2 = VBox(8.0) + vbox2.children.addAll(dataLabel2) + vbox2.children.addAll(checkBoxes) + vbox2.padding = Insets(20.0, 10.0, 20.0, 0.0) + + root.left = vbox1 + root.center = lineChart + root.right = vbox2 + + stage.scene = scene + stage.show() + + val doOutputHandlersContainOtherJavaFxApp = + simulation.outputHandlers.any { it.javaClass.name == "hr.unipu.ksdtoolkit.outputs.PngExporter" } + if (doOutputHandlersContainOtherJavaFxApp) { + simulation.outputHandlers.remove(winSimulatorListener) + + Platform.setImplicitExit(true) + + Platform.runLater { PngExporterApp().start(Stage()) } + + } + + } + + + /** + * Re-run simulation (with new value of model constant). + * + * @param event Event + */ + private fun reRunSimulation(event: Event) { + + val tf = event.source as TextField + val text = tf.text + val label = (tf.parent.childrenUnmodifiable[0] as Label).text + + val isModuleEntity = label.contains('.') + val moduleName = label.substringBefore(".") + val entityName = label.substringAfter(".") + + val oldValue = + if (isModuleEntity) { + simulation.model.modules[moduleName]?.entities?.get(entityName)?.currentValue + } else { + simulation.model.entities[label]?.currentValue + } + + val newValue = try { + text.toDouble() + } catch (exception: Exception) { + LoggerFactory.getLogger(javaClass).error("WinSimulatorApp: incorrect input.", exception) + tf.text = oldValue.toString() + oldValue + } + + if (isModuleEntity) { + simulation.model.modules[moduleName]?.entities?.get(entityName)?.equation = { newValue } + } else { + simulation.model.entities[label]?.equation = { newValue } + } + + simulation.run() + + refreshChart() + + } + + + /** + * Add/remove lines from chart. + * + * @param event Event + */ + private fun updateLineChart(event: Event) { + val checkBox = event.source as CheckBox + val text = checkBox.text + for (s in series) { + if (text == s.name) { + if (checkBox.isSelected) { + lineChart.data.add(s) + } else { + lineChart.data.remove(s) + } + } + } + } + + + /** + * Refresh whole chart. + */ + private fun refreshChart() { + lineChart.data?.clear() + for (s in series) { + for (cb in checkBoxes) { + val textCheckBox = cb.text + if (textCheckBox == s.name) { + if (cb.isSelected) { + lineChart.data.add(s) + } else { + lineChart.data.remove(s) + } + } + } + } + } + + + /** + * Create a LineChart + * + * @param title line chart title + * @return line chart + */ + private fun createLineChart(title: String): LineChart { + + val xAxis = NumberAxis() + val yAxis = NumberAxis() + xAxis.label = "Time" + yAxis.label = "Value" + + val lineChart = LineChart(xAxis, yAxis) + lineChart.title = title + + return lineChart + } + + + /** + * Add a context menu to line chart. + */ + private fun addLineChartContextMenu() { + val saveAsFile = MenuItem("Save as file.") + saveAsFile.setOnAction { event -> saveToFile(scene) } + val menu = ContextMenu(saveAsFile) + lineChart.setOnMouseClicked { event -> + if (MouseButton.SECONDARY == event.button) { + menu.show(lineChart, event.screenX, event.screenY) + } + } + } + + + /** + * Add tooltips to chart. + */ + private fun addTooltips() { + + for (i in 0 until lineChart.data.size) { + for (j in 0 until lineChart.data[i].data.size) { + val dot = lineChart.data[i].data[j] + Tooltip.install(dot.node, Tooltip("Time = ${dot.xValue}\n" + + "Value = ${dot.yValue}")) + + dot.node.setOnMouseEntered { event -> dot.node.styleClass.add("onHover") } + dot.node.setOnMouseExited { event -> dot.node.styleClass.remove("onHover") } + } + } + } + + +} diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/ISimulationEventHandler.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/ISimulationEventHandler.kt new file mode 100644 index 0000000..66cb3a0 --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/ISimulationEventHandler.kt @@ -0,0 +1,21 @@ +package hr.unipu.ksdtoolkit.simulations + +import hr.unipu.ksdtoolkit.entities.Model + +interface ISimulationEventHandler { + /** + * Handler for a simulation initialization event. + */ + fun simulationInitialized(model: Model) + + /** + * Handler for a finished calculation for one time step. + */ + fun timeStepCalculated(model: Model) + + /** + * Handler for a finished simulation event. + */ + fun simulationFinished(model: Model) + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/Simulation.kt b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/Simulation.kt new file mode 100644 index 0000000..e8c824d --- /dev/null +++ b/ksdtoolkit-core/src/main/kotlin/hr.unipu.ksdtoolkit/simulations/Simulation.kt @@ -0,0 +1,315 @@ +package hr.unipu.ksdtoolkit.simulations + +import hr.unipu.ksdtoolkit.entities.* +import hr.unipu.ksdtoolkit.outputs.CsvExporter +import hr.unipu.ksdtoolkit.outputs.PngExporter +import hr.unipu.ksdtoolkit.outputs.WinSimulator +import org.slf4j.LoggerFactory + + +/** + * Simulation class represents & controls SD simulation. + */ +class Simulation(val model: Model) { + + val outputHandlers = ArrayList() + + var timeElapsed = 0.0 + val timeSteps = (model.finalTime.toDouble() - model.initialTime.toDouble()) / model.timeStep.toDouble() + + /** + * Running simulation. + */ + fun run() { + + val start = System.currentTimeMillis() + + runAllPreparations() + while (this.finalTimeReached()) { + runOneTimeStep() + + + timeElapsed = (System.currentTimeMillis() - start) / 1000.0 + } + + LoggerFactory.getLogger(javaClass).info(" Simulation current time (finished): ${model.currentTime}") + LoggerFactory.getLogger(javaClass).info(" TOTAL TIME ELAPSED: $timeElapsed \n") + + this.fireSimulationFinishedEvent(model) + } + + + + /** + * Prepare all before while loop integration. + */ + fun runAllPreparations() { + this.copyModuleEntitiesToParent() + this.prepareInitialValues() + this.prepareValuesForFirstTimestep() + this.fireSimulationInitializedEvent(this.model) + this.executeConverters() + this.fireTimeStepCalculatedEvent(this.model) + } + + + /** + * Run integration for one time step. + */ + fun runOneTimeStep() { + this.updateCurrentTime() + this.prepareValuesForNextTimestep() + this.model.integrationType.integrate() + this.executeConverters() + this.fireTimeStepCalculatedEvent(this.model) + } + + + /** + * Copy all module entities into the parent model before simulation. + */ + private fun copyModuleEntitiesToParent() { + for (( moduleName , module) in model.modules) { + module.entities.forEach { ( modelEntityName , modelEntity) -> + modelEntity.name = "${moduleName}.${modelEntityName}" + if (!model.entities.containsKey(modelEntity.name)) + model.addModelEntity(modelEntity) + } + } + } + + + /** + * Prepare all initial model values for running the simulation. + */ + private fun prepareInitialValues() { + this.model.currentTime = this.model.initialTime.toDouble() + this.model.entities.forEach { (k, v) -> + when (v) { + is Stock -> { + v.currentValue = v._initialValue?.invoke() ?: 0.0 + } + is Constant -> { + v.currentValue = v._equation?.invoke() ?: 0.0 + } + } + v.isCurrentValueCalculated = false + } + this.model.integrationType.stocks = model.stocks + this.model.integrationType.converters = model.converters + this.model.integrationType.dt = model.timeStep.toDouble() + + } + + + /** + * Prepare all Stocks whose current value is already calculated + * for the first timestep. + */ + private fun prepareValuesForFirstTimestep() { + this.model.entities.forEach { (k, v) -> + if (v is Stock && this.model.currentTime == this.model.initialTime) { + v.isCurrentValueCalculated = true + } + if (v is Constant && this.model.currentTime == this.model.initialTime) { + v.isCurrentValueCalculated = true + } + } + } + + + /** + * Fires an event for the initialization of the simulation. + * + * @param model [Model] for the simulation. + */ + private fun fireSimulationInitializedEvent(model: Model) { + this.outputHandlers.forEach { listener -> listener.simulationInitialized(this.model) } + } + + + /** + * Execute the converters. + */ + private fun executeConverters() { + for (converter in this.model.converters) { + if (!converter.targetEntity.isCurrentValueCalculated) { + converter.convert() + } + } + + var hasSucceeded = false + var numberOfTries = 0 + while (!hasSucceeded && numberOfTries<10) { + numberOfTries++ + this.model.entities.forEach { (_, v) -> + val invocationResult = v._equation?.invoke() + if (v.isCurrentValueCalculated && invocationResult != null) { + when (v) { + is Converter -> { + v.currentValue = invocationResult + v.isCurrentValueCalculated = true + + } + is Flow -> { + v.currentValue = invocationResult + v.isCurrentValueCalculated = true + + } + } + } + } + if (this.model.entities.all { it.value.isCurrentValueCalculated } ) { + hasSucceeded = true + } else { + + this.model.entities.filter { it.value.isCurrentValueCalculated == false }.forEach { + + } + + } + } + + + this.model.entities.filter { !it.value.isCurrentValueCalculated }.forEach { (_, v) -> + val invocationResult = v._equation?.invoke() + if (!v.isCurrentValueCalculated) { + LoggerFactory.getLogger(javaClass).info("Not yet calculated: ${v.toString()}") + } + } + + + } + + + /** + * Fire an event for a finished calculation of a time step. + * + * @param model [Model] for the simulation. + */ + private fun fireTimeStepCalculatedEvent(model: Model) { + this.outputHandlers.forEach { listener -> listener.timeStepCalculated(model) } + } + + + /** + * Update the current time by adding one time step. + */ + private fun updateCurrentTime() { + model.currentTime = model.currentTime + model.timeStep.toDouble() + + if ( (model.currentTime / model.timeStep.toDouble()).rem(timeSteps / 10.0) == 0.0 ) { + LoggerFactory.getLogger(javaClass). + info(" Simulation percentage: ${model.currentTime / model.timeStep.toDouble() / timeSteps * 100}%, " + + "Simulation current time: ${model.currentTime}") + LoggerFactory.getLogger(javaClass). + info(" Time elapsed: $timeElapsed") + } + } + + + /** + * Prepare all values for the next timestep. + */ + private fun prepareValuesForNextTimestep() { + this.model.entities.forEach { (_, v) -> + v.previousValue = v.currentValue + when (v) { + is Constant -> v.isCurrentValueCalculated = true + else -> v.isCurrentValueCalculated = false + } + } + } + + + /** + * Method that controls if the final time has been reached. + * + * @return true only if the final time has been reached. + */ + private fun finalTimeReached(): Boolean { + return this.model.currentTime < this.model.finalTime.toDouble() + } + + + /** + * Fires an event for a finished simulation. + * + * @param model [Model] for the simulation. + */ + private fun fireSimulationFinishedEvent(model: Model) { + this.outputHandlers.forEach { listener -> listener.simulationFinished(model) } + } + + + /** + * Adds an listener that handles simulation events (in classical API form). + * + * @param listener [SimulationEventListener] + */ + fun addSimulationEventListener(listener: ISimulationEventHandler) { + val isListenerAlreadyAvailable = this.outputHandlers.contains(listener) + if (!isListenerAlreadyAvailable) { + this.outputHandlers.add(listener) + } + } + + + /** + * Removes a [SimulationEventListener]. + * + * @param listener [SimulationEventListener] + */ + fun removeSimulationEventListener(listener: ISimulationEventHandler) { + this.outputHandlers.remove(listener) + } + + + /** + * Adds an listener that handles simulation events (in form of lambda expression). + */ + fun addSimulationEventListener( + listenerAction: Simulation.() -> ISimulationEventHandler + ) : Unit { + outputHandlers.add(listenerAction(this)) + } + + + /** + * Adds multiple listeners that handles simulation events (using lambda with receiver). + */ + val outputs = SimulationEventListenersHandler() + inner class SimulationEventListenersHandler { + fun add(listener: ISimulationEventHandler) { + this@Simulation.outputHandlers.add(listener) + } + + fun CsvExporter(csvFile: String = "output.csv", separator: String = ";"): CsvExporter { + val listener = hr.unipu.ksdtoolkit.outputs.CsvExporter(csvFile, separator) + add(listener) + return listener + } + + fun PngExporter(pngFile: String = "output.png"): PngExporter { + PngExporter.simulation = this@Simulation + val listener = hr.unipu.ksdtoolkit.outputs.PngExporter(pngFile) + add(listener) + return listener + } + + fun WinSimulator(): WinSimulator { + WinSimulator.simulation = this@Simulation + val listener = hr.unipu.ksdtoolkit.outputs.WinSimulator() + add(listener) + return listener + } + + operator fun invoke( + body: SimulationEventListenersHandler.() -> Unit) { + body() + } + } + + + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/resources/Style1.css b/ksdtoolkit-core/src/main/resources/Style1.css new file mode 100644 index 0000000..ddec748 --- /dev/null +++ b/ksdtoolkit-core/src/main/resources/Style1.css @@ -0,0 +1,11 @@ +.chart-series-line{ + -fx-stroke-width: 1px; + -fx-stroke:#eedede; + -fx-effect: null; +} +.chart-vertical-grid-lines { + -fx-stroke: #cccccc; +} +.chart-horizontal-grid-lines { + -fx-stroke: #cccccc; +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/resources/Style2.css b/ksdtoolkit-core/src/main/resources/Style2.css new file mode 100644 index 0000000..5910d10 --- /dev/null +++ b/ksdtoolkit-core/src/main/resources/Style2.css @@ -0,0 +1,45 @@ +.chart-plot-background { + -fx-border-color: black; + -fx-border-width: 4px; + /*-fx-border-insets: -2px;*/ + -fx-background: white; +} + +.axis:top { + -fx-border-color: transparent; +} + +.axis:right { + -fx-border-color: transparent; +} + +.axis:bottom { + -fx-border-color: transparent; +} + +.axis:left { + -fx-border-color: transparent; +} + +.chart-vertical-grid-lines { + -fx-stroke: transparent; +} + +.chart-horizontal-grid-lines { + -fx-stroke: transparent; +} + +.chart-legend { + -fx-background-color: white; + -fx-padding: 20px; +} + +/*.chart-major-vertical-grid-lines {*/ +/* -fx-stroke: #dddddd;*/ +/* -fx-stroke-width: 1.0;*/ +/*}*/ + +/*.chart-major-horizontal-grid-lines {*/ +/* -fx-stroke: #dddddd;*/ +/* -fx-stroke-width: 1.0;*/ +/*}*/ \ No newline at end of file diff --git a/ksdtoolkit-core/src/main/resources/Style3.css b/ksdtoolkit-core/src/main/resources/Style3.css new file mode 100644 index 0000000..cb78f06 --- /dev/null +++ b/ksdtoolkit-core/src/main/resources/Style3.css @@ -0,0 +1,21 @@ +.chart { + -fx-padding: 10px; + -fx-background: white; + /*-fx-background-image: url("icon.png");*/ +} +.chart-content { + -fx-padding: 30px; + +} +.chart-legend { + -fx-background-color: transparent; + -fx-padding: 20px; +} + +.chart-legend-item-symbol{ + -fx-background-radius: 0; +} + +.chart-legend-item{ + -fx-text-fill: #191970; +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/1_EntitiesTest.kt b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/1_EntitiesTest.kt new file mode 100644 index 0000000..011205b --- /dev/null +++ b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/1_EntitiesTest.kt @@ -0,0 +1,141 @@ +package hr.unipu.ksdtoolkit + +import hr.unipu.ksdtoolkit.entities.* +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.integration.Integration +import hr.unipu.ksdtoolkit.modules.ModuleGenericCompoundDecrease +import org.hamcrest.CoreMatchers.`is` +import org.hamcrest.CoreMatchers.instanceOf +import org.junit.Assert +import org.junit.Assert.assertThat +import org.junit.Before +import org.junit.Test + +/** + * Unit testing all entities: Model, Constant, Converter, Flow, Stock, Module. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class `1_EntitiesTest` { + val model: Model + val CONSTANT: Constant + val converter: Converter + val flow: Flow + val Stock: Stock + val Module: ModuleGenericCompoundDecrease + + + // Prepare model and model entities for testing. + init { + model = Model() + + model.name = "Model_name" + model.initialTime = 0.0 + model.finalTime = 100.0 + model.timeStep = 0.25 + model.integrationType = EulerIntegration() + + CONSTANT = model.constant("CONSTANT_NAME") + CONSTANT.equation = { 1.0 } + + converter = model.converter("converter_name") + converter.equation = { 2 * 1.0 } + + flow = model.flow("flow_name") + flow.equation = { 1 + 1.0 } + + Stock = model.stock("Stock_name") + Stock.initialValue = { 0.0 } + Stock.equation = { -1.0 } + + Module = model.createModule( + "Module", + "hr.unipu.ksdtoolkit.modules.ModuleGenericCompoundDecrease" + ) as ModuleGenericCompoundDecrease + } + + + @Test fun constantTest() { + + // Testing that constant is created. + assertThat(CONSTANT.name, `is`("CONSTANT_NAME")) + + // Testing that constant value is set. + assertThat(CONSTANT.equation?.invoke() as Double, `is`(1.0)) + } + + + @Test fun converterTest() { + + // Testing that converter is created. + assertThat(converter.name, `is`("converter_name")) + + // Testing that converter equation works. + assertThat(converter.equation?.invoke() as Double, `is`(2.0)) + } + + + @Test fun flowTest() { + + // Testing that flow is created. + assertThat(flow.name, `is`("flow_name")) + + // Testing that flow equation works. + assertThat(flow.equation?.invoke() as Double, `is`(2.0)) + } + + + // Abstract method ModelEntity is tested using implementation of concrete classes. + /* + @Test fun modelEntityTest() { } + */ + + + @Test fun stockTest() { + + // Testing that Stock is created. + assertThat(Stock.name, `is`("Stock_name")) + + // Testing Stock initial value works. + assertThat(Stock.initialValue?.invoke() as Double, `is`(0.0)) + + // Testing Stock equation works. + assertThat(Stock.equation?.invoke() as Double, `is`(-1.0)) + } + + + @Test fun moduleTest() { + + // Testing that Module is created. + assertThat(Module.name, `is`("Module")) + + // Test that all Module entities can be accessed. + assertThat(Module.entities.keys, `is`(setOf("CONSTANT", "INITIAL_STOCK", "Stock", + "inflow", "outflow", "converter" ))) + + // Testing equation in Module works. + assertThat(Module.INITIAL_STOCK.equation?.invoke() as Double, `is`(100.0)) + } + + + @Test fun modelTest() { + + // Testing that model is created. + assertThat(model.name, `is`("Model_name")) + + // Testing that setup works correctly. + assertThat(model.initialTime.toDouble(), `is`(0.0)) + assertThat(model.finalTime.toDouble(), `is`(100.0)) + assertThat(model.timeStep.toDouble(), `is`(0.25)) + + // Testing that setting integration type works correctly. + assertThat(model.integrationType, instanceOf(EulerIntegration::class.java)) + + // Testing that all entities are in the model. + assertThat(model.entities, `is`(hashMapOf("CONSTANT_NAME" to CONSTANT, + "converter_name" to converter, + "flow_name" to flow, + "Stock_name" to Stock))) + } + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/2_IntegrationsTest.kt b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/2_IntegrationsTest.kt new file mode 100644 index 0000000..0f7379c --- /dev/null +++ b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/2_IntegrationsTest.kt @@ -0,0 +1,84 @@ +package hr.unipu.ksdtoolkit + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.entities.Stock +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.integration.RungeKuttaIntegration +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.hamcrest.CoreMatchers.* +import org.hamcrest.Matchers.closeTo +import org.junit.Assert.* +import org.junit.Test + +/** + * Unit testing numeric integrations: Euler type and RungeKutta type. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class `2_IntegrationsTest` { + + private val model: Model + private val Stock: Stock + private val simulation: Simulation + + // Prepare model and model entities for testing. + init { + model = Model() + model.initialTime = 0.0 + model.finalTime = 100.0 + model.timeStep = 0.25 + + Stock = model.stock("Stock_name") + Stock.initialValue = { 0.0 } + Stock.equation = { -1.0 } + + simulation = Simulation(model) + } + + + @Test fun EulerItegrationTest() { + + model.integrationType = EulerIntegration() + simulation.runAllPreparations() + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(-0.25)) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(-0.50)) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(-0.75)) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(-1.00)) + + } + + + @Test fun RugneKuttaIntegrationTest() { + + model.integrationType = RungeKuttaIntegration() + simulation.runAllPreparations() + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(closeTo(-0.25, 0.01))) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(closeTo(-0.50, 0.01))) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(closeTo(-0.75, 0.01))) + + simulation.runOneTimeStep() + assertThat(Stock.currentValue as Double, `is`(closeTo(-1.00, 0.01))) + } + + + // Abstract method Integration is tested using implementation of concrete classes. + /* + @Test fun ``2_IntegrationsTest``() { } + */ + +} + diff --git a/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/3_ModelsTest.kt b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/3_ModelsTest.kt new file mode 100644 index 0000000..b1b9a65 --- /dev/null +++ b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/3_ModelsTest.kt @@ -0,0 +1,162 @@ +package hr.unipu.ksdtoolkit + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.integration.EulerIntegration +import hr.unipu.ksdtoolkit.models.* +import org.hamcrest.CoreMatchers.* +import hr.unipu.ksdtoolkit.entities.* +import org.hamcrest.Matchers.closeTo +import org.junit.Assert.* +import org.junit.Test + +/** + * Unit testing models: + * - GenericSD, + * - SimpleCompoundInterest, InheritedCompoundInterest, + * - BassDiffusion, InnovationDiffusion, + * - TestSpeed model. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class `3_ModelsTest` { + + private val model1: Model + private val model2: Model + private val model3: Model + private val model4: Model + private val model5: Model + private val model6: Model + + init { + model1 = ModelGenericSD() + model2 = ModelSimpleCompoundInterest() + model3 = ModelInheritedCompoundInterest() + model4 = ModelBassDiffusion() + model5 = ModelInnovationDiffusion() + model6 = ModelTestSpeed() + } + + + @Test + fun model1Test() { + + // Testing that model is created. + assertThat(model1.name, `is`("Generic SD Model")) + + // Testing that setup works correctly. + assertThat(model1.initialTime.toDouble(), `is`(0.0)) + assertThat(model1.finalTime.toDouble(), `is`(120.0)) + assertThat(model1.timeStep.toDouble(), `is`(0.25)) + + // Testing that setting integration type works correctly. + assertThat(model1.integrationType, instanceOf(EulerIntegration::class.java)) + + // Testing Stock initial value works. + assertThat((model1.entities["Stock"] as Stock)._initialValue?.invoke(), `is`(100.0)) + + // Testing that all entities are in the model. + assertThat( + model1.entities.keys, `is`( + hashMapOf( + "CONSTANT" to Constant("CONSTANT"), + "INITIAL_STOCK" to Constant("INITIAL_STOCK"), + "converter" to Converter("converter"), + "inflow" to Flow("inflow"), + "outflow" to Flow("outflow"), + "Stock" to Stock("Stock") + ).keys + ) + ) + + assertThat( + model1.entities.keys, `is`( + setOf( + "CONSTANT", + "INITIAL_STOCK", + "converter", + "inflow", + "outflow", + "Stock" + ) + ) + ) + + // Testing equation in model works. + assertThat( (((model1.entities["Stock"] as Stock) + .initialValue?.invoke() as ModelEntity) + .equation?.invoke() as Int).toDouble(), `is`(closeTo(100.0, 0.001))) + + // Testing that Module is created. + assertThat(model1.modules["Module"]?.name, `is`("Module")) + + // Test that all Module entities can be accessed. + assertThat(model1.modules["Module"]?.entities?.keys, `is`(setOf("CONSTANT", "INITIAL_STOCK", "Stock", + "inflow", "outflow", "converter" ))) + + // Testing equation in Module works. + assertThat( (model1.modules["Module"]?.entities!!["Stock"] as Stock)._initialValue?.invoke(), + `is`(100.0)) + + + } + + + + @Test + fun model2Test() { + + // Testing that model is created. + assertThat(model2.name, `is`("Simple Compound Interest Model")) + + // Other assertions are similar to the first test. + + } + + + + @Test + fun model3Test() { + + // Testing that model is created. + assertThat(model3.name, `is`("Inherited Compound Interest Model")) + + // Other assertions are similar to the first test. + + } + + + @Test + fun model4Test() { + + // Testing that model is created. + assertThat(model4.name, `is`("Bass Diffusion Model")) + + // Other assertions are similar to the first test. + + } + + + @Test + fun model5Test() { + + // Testing that model is created. + assertThat(model5.name, `is`("Innovation/Product Diffusion Model")) + + // Other assertions are similar to the first test. + + } + + + @Test + fun model6Test() { + + // Testing that model is created. + assertThat(model6.name, `is`("SD Model for testing speed")) + + // Other assertions are similar to the first test. + + } + + +} + diff --git a/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/4_SimulationRunTest.kt b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/4_SimulationRunTest.kt new file mode 100644 index 0000000..02db96d --- /dev/null +++ b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/4_SimulationRunTest.kt @@ -0,0 +1,179 @@ +package hr.unipu.ksdtoolkit + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.models.* +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.hamcrest.CoreMatchers.* +import org.hamcrest.Matchers.closeTo +import org.junit.Assert.* +import org.junit.Test +import org.slf4j.LoggerFactory +import hr.unipu.ksdtoolkit.models.ModelTestSpeed as ModelTestSpeed + + +/** + * Unit testing simulation run for all models: + * - GenericSD, + * - SimpleCompoundInterest, InheritedCompoundInterest, + * - BassDiffusion, InnovationDiffusion, + * - TestSpeed model. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class `4_SimulationRunTest` { + + private var myModel: Model + private val myModel1: Model + private val myModel2: Model + private val myModel3: Model + private val myModel4: Model + private val myModel5: Model + private val myModel6: Model + + private var mySimulation: Simulation + private val mySimulation1: Simulation + private val mySimulation2: Simulation + private val mySimulation3: Simulation + private val mySimulation4: Simulation + private val mySimulation5: Simulation + private val mySimulation6: Simulation + + + init { + // 1-3. Create the model + myModel1 = ModelGenericSD() + myModel2 = ModelSimpleCompoundInterest() + myModel3 = ModelInheritedCompoundInterest() + myModel4 = ModelBassDiffusion() + myModel5 = ModelInnovationDiffusion() + myModel6 = ModelTestSpeed() + + + // 4. Create the simulation + mySimulation1 = Simulation(myModel1) + mySimulation2 = Simulation(myModel2) + mySimulation3 = Simulation(myModel3) + mySimulation4 = Simulation(myModel4) + mySimulation5 = Simulation(myModel5) + mySimulation6 = Simulation(myModel6) + + + // select the model & simulation for the output + myModel = myModel1 + mySimulation = mySimulation1 + + } + + + @Test + fun simulation1RunTest() { + + // Testing that model is passed to simulation. + assertThat(mySimulation1.model.name, `is`("Generic SD Model")) + + + // Testing that setup works correctly. + assertThat(mySimulation1.model.initialTime.toDouble(), `is`(0.0)) + assertThat(mySimulation1.model.finalTime.toDouble(), `is`(120.0)) + assertThat(mySimulation1.model.timeStep.toDouble(), `is`(0.25)) + + + // Testing model & simulation at time=0 (beginning of simulation). + LoggerFactory.getLogger(javaClass).info("Running Simulation 0: at final time=0") + myModel1.finalTime = 0 + mySimulation1.run() + assertThat(myModel1.entities["INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["Module.converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Module.CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["Module.INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + + + // Testing model & simulation at time=60 (middle of simulation). + LoggerFactory.getLogger(javaClass).info("Running Simulation 1: at final time=60") + myModel1.finalTime = 60 + mySimulation1.run() + assertThat(myModel1.entities["INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["Module.converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Module.CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["Module.INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + + + + // Testing model & simulation at time=120 (end of simulation). + LoggerFactory.getLogger(javaClass).info("Running Simulation 2: at final time=120") + myModel1.finalTime = 120 + mySimulation1.run() + assertThat(myModel1.entities["INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.inflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.outflow"]?.currentValue, `is`(closeTo(0.8333, 0.001))) + assertThat(myModel1.entities["Module.Stock"]?.currentValue, `is`(closeTo(100.0, 0.001))) + assertThat(myModel1.entities["Module.converter"]?.currentValue, `is`(closeTo(0.0083, 0.001))) + assertThat(myModel1.entities["Module.CONSTANT"]?.currentValue, `is`(closeTo(10.0, 0.001))) + assertThat(myModel1.entities["Module.INITIAL_STOCK"]?.currentValue, `is`(closeTo(100.0, 0.001))) + + + } + + + @Test + fun simulation2RunTest() { + + // Testing that model is passed to simulation + assertThat(mySimulation2.model.name, `is`("Simple Compound Interest Model")) + } + + + @Test + fun simulation3RunTest() { + + // Testing that model is passed to simulation + assertThat(mySimulation3.model.name, `is`("Inherited Compound Interest Model")) + } + + + @Test + fun simulation4RunTest() { + + // Testing that model is passed to simulation + assertThat(mySimulation4.model.name, `is`("Bass Diffusion Model")) + } + + + @Test + fun simulation5RunTest() { + + // Testing that model is passed to simulation + assertThat(mySimulation5.model.name, `is`("Innovation/Product Diffusion Model")) + } + + + @Test + fun simulation6RunTest() { + + // Testing that model is passed to simulation + assertThat(mySimulation6.model.name, `is`("SD Model for testing speed")) + } + + +} \ No newline at end of file diff --git a/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/5_SimulationOutputsTest.kt b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/5_SimulationOutputsTest.kt new file mode 100644 index 0000000..c734d1e --- /dev/null +++ b/ksdtoolkit-core/src/test/kotlin/hr.unipu.ksdtoolkit/5_SimulationOutputsTest.kt @@ -0,0 +1,141 @@ +package hr.unipu.ksdtoolkit + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.models.* +import hr.unipu.ksdtoolkit.outputs.* +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.junit.Test +import org.hamcrest.CoreMatchers.* +import org.hamcrest.Matchers.closeTo +import org.junit.Assert.* +import org.slf4j.LoggerFactory +import java.io.File + +/** + * Unit testing simulation outputs: + * - CsvExporter + * - PngExporter + * - WinSimulator + * - WebSimulator + * - MobSimulator + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class `5_SimulationOutputsTest` { + + private var model: Model + private var simulation: Simulation + private lateinit var csvExporter: CsvExporter // ISimulationEventHandler needed for tests. + private lateinit var pngExporter: PngExporter // ISimulationEventHandler needed for tests. + private lateinit var winSimulator: WinSimulator // ISimulationEventHandler needed for tests. + + init { + + // 1-3. Create the model + model = ModelGenericSD() + //model = ModelSimpleCompoundInterest() + //model = ModelInheritedCompoundInterest() + //model = ModelBassDiffusion() + //model = ModelInnovationDiffusion() + //model = ModelTestSpeed() + + + // 4. Create the simulation + simulation = Simulation(model) + + + // 5. Add results handlers + simulation.outputs { + csvExporter = CsvExporter("output_data.csv", ";") + pngExporter = PngExporter("output_chart.png") + winSimulator = WinSimulator() + + // !!! Mobile simulator test has to be run from Android Test, because Java modules + // cannot depend on Android modules (reverse is ok). + //MobSimulator() + + //WebSimulator() + } + + // 6. Run the simulation + simulation.run() + + } + + + + @Test fun csvExporterTest() { + + LoggerFactory.getLogger(javaClass).info("\n---CsvExporterTest---") + + // Testing that sb is created. + assertThat(csvExporter.sb, instanceOf(StringBuilder::class.java)) + + + // Testing that sb contains all simulation data keys. + val entities = simulation.model.modelEntitiesKeys + for (entity in entities) { + assertThat(csvExporter.sb.toString(), containsString(entity)) + } + + // Testing that sb contains all simulation data values. + val values = simulation.model.modelEntitiesValues + for (value in values) { + assertThat(csvExporter.sb.toString(), containsString(value)) + } + + // Testing that CSV file is saved. + assertTrue(File("output_data.csv").exists()); + + } + + + + @Test fun pngExporterTest() { + + LoggerFactory.getLogger(javaClass).info("\n---PngExporterTest---") + + // Testing that PngExporterApp is initialized. + assertThat(PngExporterApp.fileName, `is`("output_chart.png")) + + // Testing that PngExporterApp contains all data series. + val entities = simulation.model.modelEntitiesKeys + for (entity in entities) { + assertThat(PngExporterApp.series.toString(), containsString(entity)) + } + + // Testing that PngExporterApp contains all simulation data values. + val values = simulation.model.modelEntitiesValues + for ((index,value) in values.withIndex()) { + // Quick & dirty to replace decimal point format from "," to "." + assertThat(PngExporterApp.series[index].data[0].yValue.toString().replace(",",".").toDouble(), + `is`(closeTo(value.replace(",",".").toDouble(), 0.001))) + } + + // Testing that PNG file is saved. + assertTrue(File("output_chart.png").exists()); + + + } + + @Test fun winSimulatorTest() { + LoggerFactory.getLogger(javaClass).info("\n---WinSimulatorTest---") + } + + +/* + + // !!! Mobile simulator test has to be run from Android Test. + @Test fun MobSimulatorTest() { + LoggerFactory.getLogger(javaClass).info("---MobSimulatorTest---") + } + + + @Test fun WebSimulatorTest() { + LoggerFactory.getLogger(javaClass).info("---WebSimulatorTest---") + } + + */ + + +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/build.gradle.kts b/ksdtoolkit-mobapp/build.gradle.kts new file mode 100644 index 0000000..e340fea --- /dev/null +++ b/ksdtoolkit-mobapp/build.gradle.kts @@ -0,0 +1,93 @@ +/** + * Subproject: "ksdtoolkit-mobapp". + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +plugins { + + id("com.android.application") + + /** + * !!! Problems if "kotlin-android" and "kotlin-android-extensions" are included with plugin "com.android.application" + * - SOLUTION: Use full names e.g. "org.jetbrains.kotlin.android.extensions", so that + * pluginManagement in settings.gradle.kts can recognize name. + */ + id("org.jetbrains.kotlin.android") + + id("org.jetbrains.kotlin.android.extensions") +} + + +android { + compileSdkVersion(28) + buildToolsVersion("29.0.3") + defaultConfig { + applicationId = "hr.unipu.mobilesimulatorapp" + minSdkVersion(24) + targetSdkVersion(28) + versionCode = 1 + versionName = "1.0" + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + testBuildType = "debug" + buildTypes { + getByName("debug") { + isMinifyEnabled = false + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + getByName("release") { + isMinifyEnabled = true + proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + } + } + compileOptions { + setSourceCompatibility(JavaVersion.VERSION_1_8) + setTargetCompatibility(JavaVersion.VERSION_1_8) + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } +} + + +dependencies { + implementation(project(path = ":ksdtoolkit-core", configuration = "default")) + + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + + api("com.google.android.material:material:1.3.0-alpha04") + + implementation("com.github.PhilJay:MPAndroidChart:v3.1.0") + + implementation("org.jetbrains.kotlin:kotlin-reflect:1.4.20") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20") + + implementation("androidx.core:core-ktx:1.3.2") + implementation("androidx.appcompat:appcompat:1.2.0") + implementation("androidx.constraintlayout:constraintlayout:2.0.4") + + testImplementation("junit:junit:4.13.1") + testImplementation("org.mockito:mockito-core:3.1.0") + testImplementation("androidx.test:core:1.3.0") + + androidTestImplementation("androidx.test:core:1.3.0") + androidTestImplementation("androidx.test:core-ktx:1.3.0") + androidTestImplementation("androidx.test:runner:1.3.0") + androidTestImplementation("androidx.test:rules:1.3.0") + androidTestImplementation("org.hamcrest:hamcrest-library:1.3") + androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0") + androidTestImplementation("androidx.test.ext:junit:1.1.2") + androidTestImplementation("androidx.test.ext:junit-ktx:1.1.2") + androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0") +} + + +tasks.register("appStart") { + dependsOn(":ksdtoolkit-mobapp:installDebug") + doLast { + exec { + commandLine("cmd", "/c", "adb", "shell", "am", "start", "-n", "hr.unipu.mobilesimulatorapp/.MobSimulatorApp") + } + } +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/gradle.properties b/ksdtoolkit-mobapp/gradle.properties new file mode 100644 index 0000000..23339e0 --- /dev/null +++ b/ksdtoolkit-mobapp/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official diff --git a/ksdtoolkit-mobapp/src/androidTest/java/hr/unipu/mobilesimulatorapp/MobSimulatorInstrumentedTest.kt b/ksdtoolkit-mobapp/src/androidTest/java/hr/unipu/mobilesimulatorapp/MobSimulatorInstrumentedTest.kt new file mode 100644 index 0000000..4dc7e9c --- /dev/null +++ b/ksdtoolkit-mobapp/src/androidTest/java/hr/unipu/mobilesimulatorapp/MobSimulatorInstrumentedTest.kt @@ -0,0 +1,106 @@ +package hr.unipu.mobilesimulatorapp + +import android.app.PendingIntent.getActivity +import android.content.pm.PackageManager +import androidx.core.content.ContextCompat.startActivity +import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.launchActivity +import androidx.test.ext.junit.rules.activityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.models.ModelGenericSD +import hr.unipu.ksdtoolkit.models.ModelInnovationDiffusion +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.hamcrest.CoreMatchers.* +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.Matchers +import org.junit.* +import org.junit.runner.RunWith +import org.slf4j.LoggerFactory + + +/** + * Instrumented test, which will execute on an Android device or emulator. + * - These tests have access to Instrumentation APIs, give you access to information such as the Context of the app + * you are testing, and let you control the app under test from your test code. + * - The Gradle build interprets these test source sets in the same manner as it does for your project's app source + * sets, which allows you to create tests based on build variants. + * - More info: https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests + */ + +@RunWith(AndroidJUnit4::class) // AndroidJUnit4 as default test runner. +class MobSimulatorInstrumentedTest { + + @After fun launchApp() { + launchActivity() + Thread.sleep(30000) // Automatic Testing closes app after tests are finished. + // Manual testing needs this pause for postponing the app closing. + } + + private val model: Model + private var simulation: Simulation + + init { + // Create generic model. + //model = ModelGenericSD() + model = ModelInnovationDiffusion() + + // Create the simulation. + simulation = Simulation(model) + + // Add results handlers. + MobSimulatorApp.simulation = simulation // Add simulation (and model) objects to app companion. + simulation.addSimulationEventListener(MobSimulator()) + + // Run the simulation + simulation.run() + } + + + /** + * Testing that simulation results are accessible from the mobile app. + */ + @Test fun mobSimulatorTest() { + + // Initial test that testing framework is working. + // - Testing that context of the app under test is correct. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertThat(appContext.packageName, containsString("hr.unipu.mobilesimulatorapp")) + + + // Testing that model is accessible from the mobile app. + Assert.assertNotNull(model.name) + LoggerFactory.getLogger(javaClass).info("\n---modelTest---") + + + // Testing that simulation is accessible from the mobile app. + // - Testing that model is passed to simulation. + Assert.assertNotNull(MobSimulatorApp.simulation.model.name) + LoggerFactory.getLogger(javaClass).info("\n---simulationTest---") + + + // Testing that MobSimulatorApp contains all data series. + val entities = MobSimulatorApp.simulation.model.modelEntitiesKeys + for (entity in entities) { + Assert.assertThat(MobSimulatorApp.seriesName.toString(), containsString(entity)) + } + LoggerFactory.getLogger(javaClass).info("---mobSimulatorTest---") + + + // Testing that MobSimulatorApp contains all simulation data values. + val values = simulation.model.modelEntitiesValues + for ((index, value) in values.withIndex()) { + Assert.assertThat( + MobSimulatorApp.seriesValue[index][0].y.toString().replace(",", ".").toDouble(), + `is`(Matchers.closeTo(value.replace(",", ".").toDouble(), 0.001)) + ) + } + + } + + + + + +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/AndroidManifest.xml b/ksdtoolkit-mobapp/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9778bc2 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulator.kt b/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulator.kt new file mode 100644 index 0000000..cb75d28 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulator.kt @@ -0,0 +1,27 @@ +package hr.unipu.mobilesimulatorapp + +import hr.unipu.ksdtoolkit.entities.Constant +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler + +/** + * Class that implements the [SimulationEventListener] interface and controls the chart printing on Android. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class MobSimulator : ISimulationEventHandler { + + override fun simulationInitialized(model: Model) { + MobSimulatorApp.addConstants(model.entities.filterValues { it is Constant }) + MobSimulatorApp.addSeriesNames(model.modelEntitiesKeys) + } + + override fun timeStepCalculated(model: Model) { + MobSimulatorApp.addSeriesValues(model.modelEntitiesValues, model.currentTime) + } + + override fun simulationFinished(model: Model) { + MobSimulatorApp.simulationFinished = true + } + +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulatorApp.kt b/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulatorApp.kt new file mode 100644 index 0000000..8334081 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/java/hr/unipu/mobilesimulatorapp/MobSimulatorApp.kt @@ -0,0 +1,248 @@ +package hr.unipu.mobilesimulatorapp + +import android.annotation.SuppressLint +import android.content.pm.ActivityInfo +import android.graphics.Color +import android.os.Bundle +import android.text.InputType +import android.util.TypedValue +import android.view.View +import android.view.ViewGroup +import android.widget.* +import androidx.appcompat.app.AppCompatActivity +import com.github.mikephil.charting.charts.LineChart +import com.github.mikephil.charting.components.YAxis +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineData +import com.github.mikephil.charting.data.LineDataSet +import com.github.mikephil.charting.highlight.Highlight +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet +import com.github.mikephil.charting.listener.OnChartValueSelectedListener +import hr.unipu.ksdtoolkit.entities.ModelEntity +import hr.unipu.ksdtoolkit.models.ModelInnovationDiffusion +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.slf4j.LoggerFactory + +/** + * Android mobile simulator app - for chart plotting and interactive simulation. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class MobSimulatorApp : AppCompatActivity() { + + init { + + /**---Creating: model, simulation and run.---**/ + + // 1. Create a demo model. + val model = ModelInnovationDiffusion() // Or other models: ModelGenericSD(), ModelTestSpeed(), etc. + + // 2. Create the simulation. + simulation = Simulation(model) + + // 3. Add results handlers + simulation.addSimulationEventListener(MobSimulator()) + + // 4. Run simulation (so that all expressions are invoked for time=0). + simulation.run() + + } + + companion object { + public lateinit var simulation: Simulation + + public var simulationFinished: Boolean = false + public var seriesName: ArrayList = ArrayList() + public var seriesValue: ArrayList> = ArrayList() + public var constantsName: ArrayList = ArrayList() + public var constantsValue: ArrayList = ArrayList() + public var time: ArrayList = ArrayList() + public val lineDataSets: ArrayList = ArrayList() + + fun addSeriesNames(modelEntityNames: List) { + seriesName = ArrayList() + seriesValue = ArrayList() + for (modelEntityName in modelEntityNames) { + seriesName.add(modelEntityName) + seriesValue.add(ArrayList()) + lineDataSets.add(LineDataSet(null, "")) + } + } + + fun addSeriesValues(modelEntityValues: List, currentTime: Double) { + time.add(currentTime) + for (i in 0..modelEntityValues.indices.last) { + val valueString = modelEntityValues[i] + val value = valueString.toFloat() + val entry = Entry(currentTime.toFloat(), value) + seriesValue[i].add(entry) + } + } + + fun addConstants(modelEntityConstants: Map) { + constantsName = ArrayList() + constantsValue = ArrayList() + for (modelEntityConstant in modelEntityConstants) { + constantsName.add(modelEntityConstant.key) + val value = modelEntityConstant.value.currentValue.toFloat() + val entry = Entry(0f, value) + constantsValue.add(entry) + } + } + + } + + + @SuppressLint("SourceLockedOrientationActivity") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + LoggerFactory.getLogger(javaClass).info("---onCreate() invoked.---") + + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) + + drawUI() + } + + + /** + * Creating layout programmatically (dynamically). + */ + private fun drawUI() { + LoggerFactory.getLogger(javaClass).info("---drawUI() invoked.---") + + val rootLayout = ScrollView(this) + rootLayout.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + val linearLayoutHorizontal = LinearLayout(this) + val linearLayoutHorizontalParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + linearLayoutHorizontal.orientation = LinearLayout.HORIZONTAL + rootLayout.addView(linearLayoutHorizontal, linearLayoutHorizontalParams) + + val linearLayoutVertical = LinearLayout(this) + + linearLayoutVertical.id = R.id.insertPoint + linearLayoutVertical.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + linearLayoutVertical.orientation = LinearLayout.VERTICAL + linearLayoutHorizontal.addView(linearLayoutVertical) + + for (s in MobSimulatorApp.constantsName) { + val textView = TextView(this) + textView.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + textView.text = s + textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + linearLayoutVertical.addView(textView) + + val editText = EditText(this) + editText.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + editText.setEms(5) + editText.inputType = InputType.TYPE_CLASS_NUMBER + val indexOfEntity = simulation.model.modelEntitiesKeys.indexOf(s) + editText.setText(simulation.model.modelEntitiesValues[indexOfEntity]) + editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10F) + editText.setOnFocusChangeListener(object : View.OnFocusChangeListener { + override fun onFocusChange(v: View?, hasFocus: Boolean) { + if (!hasFocus) { + val newValue = editText.text.toString().toDouble() + val modelVariableName = textView.text + simulation.model.entities[modelVariableName]?.equation = { newValue } + refreshUI() + } + } + }) + linearLayoutVertical.addView(editText) + } + + val lineChart = LineChart(this) + + val myColorsPalette = intArrayOf( + Color.rgb(217, 80, 138), + Color.rgb(254, 149, 7), + Color.rgb(254, 247, 120), + Color.rgb(106, 167, 134), + Color.rgb(53, 194, 209), + Color.rgb(64, 89, 128), + Color.rgb(149, 165, 124), + Color.rgb(217, 184, 162), + Color.rgb(191, 134, 134), + Color.rgb(179, 48, 80) + ) + val numberOfColorInPalette = myColorsPalette.size + + for (i in seriesValue.indices) { + lineDataSets[i] = LineDataSet(seriesValue[i], seriesName[i]) + lineDataSets[i].color = myColorsPalette[i.rem(numberOfColorInPalette)] + lineDataSets[i].circleHoleColor = myColorsPalette[i.rem(numberOfColorInPalette)] + lineDataSets[i].setCircleColor(myColorsPalette[i.rem(numberOfColorInPalette)]) + lineDataSets[i].setDrawValues(false) + lineDataSets[i].setAxisDependency(YAxis.AxisDependency.LEFT) + } + + lineChart.data = LineData(lineDataSets as List?) + + lineChart.setOnChartValueSelectedListener(object : OnChartValueSelectedListener { + override fun onValueSelected(e: Entry?, h: Highlight?) { + fun Float.format(digits: Int) = "%.${digits}f".format(this) + val tooltipText = "x=${e?.x?.format(2)}, y=${e?.y?.format(2)}" + LoggerFactory.getLogger(javaClass).info("---Value selected: $tooltipText---") + Toast.makeText(this@MobSimulatorApp, tooltipText, Toast.LENGTH_SHORT).show() + } + override fun onNothingSelected() { } + }) + + lineChart.layoutParams = ViewGroup.LayoutParams( + + ViewGroup.LayoutParams.MATCH_PARENT, + + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 250F, this.resources.displayMetrics).toInt() + ) + lineChart.id = R.id.lineChart + linearLayoutHorizontal.addView(lineChart) + + setContentView(rootLayout); + } + + + private fun runSimulation() { + LoggerFactory.getLogger(javaClass).info("---runSimulation() invoked.---") + + if (MobSimulatorApp.simulationFinished == false) { + val doesNotContainMobSimulatorListener = simulation.outputHandlers.filterIsInstance(MobSimulator()::class.java).isEmpty() + if (doesNotContainMobSimulatorListener) { + + simulation.addSimulationEventListener(MobSimulator()) + } + + simulation.run() + } + } + + + private fun refreshUI() { + LoggerFactory.getLogger(javaClass).info("---refreshUI() invoked.---") + + MobSimulatorApp.simulationFinished = false + runSimulation() + + drawUI() + } + + +} + + diff --git a/ksdtoolkit-mobapp/src/main/java/resources/Style1.css b/ksdtoolkit-mobapp/src/main/java/resources/Style1.css new file mode 100644 index 0000000..ddec748 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/java/resources/Style1.css @@ -0,0 +1,11 @@ +.chart-series-line{ + -fx-stroke-width: 1px; + -fx-stroke:#eedede; + -fx-effect: null; +} +.chart-vertical-grid-lines { + -fx-stroke: #cccccc; +} +.chart-horizontal-grid-lines { + -fx-stroke: #cccccc; +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/java/resources/Style2.css b/ksdtoolkit-mobapp/src/main/java/resources/Style2.css new file mode 100644 index 0000000..5910d10 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/java/resources/Style2.css @@ -0,0 +1,45 @@ +.chart-plot-background { + -fx-border-color: black; + -fx-border-width: 4px; + /*-fx-border-insets: -2px;*/ + -fx-background: white; +} + +.axis:top { + -fx-border-color: transparent; +} + +.axis:right { + -fx-border-color: transparent; +} + +.axis:bottom { + -fx-border-color: transparent; +} + +.axis:left { + -fx-border-color: transparent; +} + +.chart-vertical-grid-lines { + -fx-stroke: transparent; +} + +.chart-horizontal-grid-lines { + -fx-stroke: transparent; +} + +.chart-legend { + -fx-background-color: white; + -fx-padding: 20px; +} + +/*.chart-major-vertical-grid-lines {*/ +/* -fx-stroke: #dddddd;*/ +/* -fx-stroke-width: 1.0;*/ +/*}*/ + +/*.chart-major-horizontal-grid-lines {*/ +/* -fx-stroke: #dddddd;*/ +/* -fx-stroke-width: 1.0;*/ +/*}*/ \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/java/resources/Style3.css b/ksdtoolkit-mobapp/src/main/java/resources/Style3.css new file mode 100644 index 0000000..cb78f06 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/java/resources/Style3.css @@ -0,0 +1,21 @@ +.chart { + -fx-padding: 10px; + -fx-background: white; + /*-fx-background-image: url("icon.png");*/ +} +.chart-content { + -fx-padding: 30px; + +} +.chart-legend { + -fx-background-color: transparent; + -fx-padding: 20px; +} + +.chart-legend-item-symbol{ + -fx-background-radius: 0; +} + +.chart-legend-item{ + -fx-text-fill: #191970; +} \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/drawable-v24/ic_launcher_foreground.xml b/ksdtoolkit-mobapp/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/drawable/ic_launcher_background.xml b/ksdtoolkit-mobapp/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ksdtoolkit-mobapp/src/main/res/layout/activity_main.xml b/ksdtoolkit-mobapp/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..3149fc6 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/layout/activity_main.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/layout/my_view.xml b/ksdtoolkit-mobapp/src/main/res/layout/my_view.xml new file mode 100644 index 0000000..07fcda1 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/layout/my_view.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher.png b/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher_round.png b/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher.png b/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher_round.png b/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/ksdtoolkit-mobapp/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/ksdtoolkit-mobapp/src/main/res/values/colors.xml b/ksdtoolkit-mobapp/src/main/res/values/colors.xml new file mode 100644 index 0000000..030098f --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #6200EE + #3700B3 + #03DAC5 + diff --git a/ksdtoolkit-mobapp/src/main/res/values/dimens.xml b/ksdtoolkit-mobapp/src/main/res/values/dimens.xml new file mode 100644 index 0000000..b65bec9 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 5px + 5px + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/values/ids.xml b/ksdtoolkit-mobapp/src/main/res/values/ids.xml new file mode 100644 index 0000000..0a20606 --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/values/ids.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/ksdtoolkit-mobapp/src/main/res/values/strings.xml b/ksdtoolkit-mobapp/src/main/res/values/strings.xml new file mode 100644 index 0000000..7b0458b --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + MobSimulator + input + diff --git a/ksdtoolkit-mobapp/src/main/res/values/styles.xml b/ksdtoolkit-mobapp/src/main/res/values/styles.xml new file mode 100644 index 0000000..d9eedac --- /dev/null +++ b/ksdtoolkit-mobapp/src/main/res/values/styles.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ksdtoolkit-mobapp/src/test/java/hr/unipu/mobilesimulatorapp/MobSimulatorLocalUnitTest.kt b/ksdtoolkit-mobapp/src/test/java/hr/unipu/mobilesimulatorapp/MobSimulatorLocalUnitTest.kt new file mode 100644 index 0000000..c04d3f7 --- /dev/null +++ b/ksdtoolkit-mobapp/src/test/java/hr/unipu/mobilesimulatorapp/MobSimulatorLocalUnitTest.kt @@ -0,0 +1,60 @@ +package hr.unipu.mobilesimulatorapp + + +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.models.* +import hr.unipu.ksdtoolkit.simulations.Simulation +import org.hamcrest.CoreMatchers +import org.junit.Test + +import org.junit.Assert.* +import org.slf4j.LoggerFactory + +/** + * Local unit test, which will execute on local JVM. + * - Use these tests to minimize execution time when your tests have no Android framework dependencies or + * when you can mock the Android framework dependencies. + * - More info: https://developer.android.com/training/testing/unit-testing/local-unit-tests + */ +class MobSimulatorLocalUnitTest { + + private val model: Model + private var simulation: Simulation + + init { + // Create generic model. + model = ModelGenericSD() + + // Create the simulation. + simulation = Simulation(model) + + // Add results handlers. + MobSimulatorApp.simulation = simulation // Add simulation (and model) objects to app companion. + simulation.addSimulationEventListener(MobSimulator()) + + // Run the simulation + //simulation.run() + } + + + + // Testing that model is accessible from mobile app. + @Test fun modelTest() { + + LoggerFactory.getLogger(javaClass).info("\n---modelTest---") + + // Testing that model is created. + assertThat(MobSimulatorApp.simulation.model.name, CoreMatchers.`is`("Generic SD Model")) + } + + + // Testing that simulation is accessible from mobile app. + @Test fun simulationTest() { + + LoggerFactory.getLogger(javaClass).info("\n---simulationTest---") + + // Testing that model is passed to simulation. + assertThat(MobSimulatorApp.simulation.model.name, CoreMatchers.`is`("Generic SD Model")) + } + +} \ No newline at end of file diff --git a/ksdtoolkit-webapp/build.gradle.kts b/ksdtoolkit-webapp/build.gradle.kts new file mode 100644 index 0000000..a882230 --- /dev/null +++ b/ksdtoolkit-webapp/build.gradle.kts @@ -0,0 +1,160 @@ +/** + * Subproject: "ksdtoolkit-webapp". + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + +import org.gradle.api.tasks.testing.logging.TestExceptionFormat +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + + +plugins { + id("org.jetbrains.kotlin.jvm") + + id("org.gretty") version "3.0.3" + + id("com.devsoap.plugin.vaadin") version "2.0.0.beta2" +} + +defaultTasks("clean", "build") + +repositories { + mavenCentral() + jcenter() + maven(url = "http://maven.vaadin.com/vaadin-addons" ) // vaadin-addons +} + + +tasks.withType().all { + kotlinOptions.jvmTarget = "1.8" +} + +vaadin { + version = "8.5.2" +} + +gretty { + contextPath = "/" + servletContainer = "jetty9.4" +} + +tasks.withType { + useJUnitPlatform() + testLogging { + + exceptionFormat = TestExceptionFormat.FULL + } +} + +val staging by configurations.creating + +dependencies { + implementation(project(path = ":ksdtoolkit-core", configuration = "default")) + + implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) + + implementation("org.apache.poi:poi:3.15") + + implementation("com.github.mvysny.karibudsl:karibu-dsl-v8:1.0.3") + + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + implementation("org.jetbrains.kotlin:kotlin-reflect") + + implementation("org.slf4j:slf4j-simple:1.7.30") + + implementation("org.slf4j:jul-to-slf4j:1.7.30") + + testImplementation("com.github.mvysny.kaributesting:karibu-testing-v8:1.2.6") + testImplementation("com.github.mvysny.dynatest:dynatest-engine:0.19") + + implementation("com.vaadin:vaadin-themes:${vaadin.version}") + implementation("com.vaadin:vaadin-client-compiled:${vaadin.version}") + + implementation("com.vaadin:vaadin-push:${vaadin.version}") + implementation("com.vaadin:vaadin-server:${vaadin.version}") + implementation("javax.servlet:javax.servlet-api:4.0.1") + + implementation("com.vaadin:vaadin-charts:4.0.5") + implementation("com.vaadin:vaadin-spreadsheet:2.0.1") + + implementation("org.vaadin.addons:dcharts-widget:1.7.0") + + runtimeOnly("com.google.gwt:gwt-servlet:2.8.2") + + staging("com.heroku:webapp-runner-main:9.0.36.1") +} + + +tasks { + val copyToLib by registering(Copy::class) { + into("$buildDir/server") + from(staging) { + include("webapp-runner*") + } + } + val stage by registering { + dependsOn("build", copyToLib) + } +} + +tasks.withType { + enabled = true +} + +tasks.withType { + doFirst { + setJvmArgs("-Dvaadin.spreadsheet.developer.license=\${.vaadin.charts.developer.license}", + "-Dvaadin.charts.developer.license=\${.vaadin.spreadsheet.developer.license}") + } +} + +val compileKotlin: KotlinCompile by tasks +compileKotlin.kotlinOptions { + jvmTarget = "1.8" +} + +val compileTestKotlin: KotlinCompile by tasks +compileTestKotlin.kotlinOptions { + jvmTarget = "1.8" +} + + + + + + + + + + + + + + + +/** + * How to add breakpoint for debugging in Gradle+gretty? + * - Start the gretty plug-in, appStartDebug, run directly (normal mode), without debugging. + * - Set up remote debugging. Add Remote, click on configuration. + * The configuration port is synchronized with the project gretty configuration: debugPort=5005 + * Select the corresponding module. + * - Perform debugging. + * Start the web project first (in Normal mode), then start the remote just configured (in Debug mode), + * and then complete gretty remote debugging. + * - Project can be started from Terminal as well: + * e.g. gradlew tasks -Dorg.gradle.debug=true --no-daemon + * - To stop all Gradle daemons: + * e.g. gradlew --stop + * - Run 'gradle appStop' to stop the server. + */ + +gretty { + jvmArgs = mutableListOf("-Xmx1024m", "-XX:MaxPermSize=512m") + servletContainer = "jetty9.4" + contextPath = "/" + scanInterval = 0 + inplaceMode = "hard" + debugPort = 5005 + debugSuspend = true +} \ No newline at end of file diff --git a/ksdtoolkit-webapp/gradle.properties b/ksdtoolkit-webapp/gradle.properties new file mode 100644 index 0000000..2ccc62e --- /dev/null +++ b/ksdtoolkit-webapp/gradle.properties @@ -0,0 +1,4 @@ +vaadin.charts.developer.license=c0171602-2326-457a-837d-226c949709f1 +vaadin.spreadsheet.developer.license=8bf94b9d-b891-47b0-bad3-971445a274a5 +systemProp.vaadin.charts.developer.license=c0171602-2326-457a-837d-226c949709f1 +systemProp.vaadin.spreadsheet.developer.license=8bf94b9d-b891-47b0-bad3-971445a274a5 \ No newline at end of file diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/WebSimulator.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/WebSimulator.kt new file mode 100644 index 0000000..1e344a3 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/WebSimulator.kt @@ -0,0 +1,28 @@ +package hr.unipu.websimulatorapp + +import hr.unipu.ksdtoolkit.entities.Constant +import hr.unipu.ksdtoolkit.entities.Model +import hr.unipu.ksdtoolkit.simulations.ISimulationEventHandler +import hr.unipu.websimulatorapp.webapp.WebSimulatorApp + +/** + * Class that implements the [SimulationEventListener] interface and controls the chart printing on web. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ +class WebSimulator : ISimulationEventHandler { + + override fun simulationInitialized(model: Model) { + WebSimulatorApp.addConstants(model.entities.filterValues { it is Constant }) + WebSimulatorApp.addSeriesNames(model.modelEntitiesKeys) + + } + + override fun timeStepCalculated(model: Model) { + WebSimulatorApp.addSeriesValues(model.modelEntitiesValues, model.currentTime) + } + + override fun simulationFinished(model: Model) { + WebSimulatorApp.simulationFinished = true + } +} diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomLabelTextField.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomLabelTextField.kt new file mode 100644 index 0000000..c024179 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomLabelTextField.kt @@ -0,0 +1,50 @@ +package hr.unipu.websimulatorapp.webapp + +import com.vaadin.ui.* +import com.vaadin.ui.themes.ValoTheme + +class CustomLabelTextField : CustomField() { + val textField = TextField() + private val labelText = Label() + var modelVariableName = "" + + override fun initContent(): Component { + + labelText.styleName = ValoTheme.LABEL_SMALL + labelText.setWidth("200px") + + textField.styleName = ValoTheme.TEXTFIELD_SMALL + textField.setWidth("100px") + + + val myLayout = HorizontalLayout() + myLayout.addComponents(labelText) + myLayout.addComponent(textField) + myLayout.setComponentAlignment(labelText, Alignment.MIDDLE_LEFT) + myLayout.setComponentAlignment(textField, Alignment.MIDDLE_RIGHT) + myLayout.styleName = ValoTheme.LAYOUT_COMPONENT_GROUP + + return myLayout + } + + override fun getValue(): String { + return textField.value + } + + override fun setValue(value: String) { + this.textField.value = value + } + + override fun getCaption(): String { + return labelText.caption + } + + override fun setCaption(caption: String) { + this.labelText.caption = caption + } + + override fun doSetValue(s: String) { + + } + +} diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomSliderLabel.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomSliderLabel.kt new file mode 100644 index 0000000..2ebcf5c --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomSliderLabel.kt @@ -0,0 +1,72 @@ +package hr.unipu.websimulatorapp.webapp + +import com.vaadin.server.Sizeable +import com.vaadin.ui.* +import com.vaadin.ui.themes.ValoTheme + +class CustomSliderLabel : CustomField() { + private val sliderCaption = Label() + val slider = Slider() + private val sliderValue = Label() + var modelVariableName = "" + + override fun initContent(): Component { + + sliderCaption.styleName = ValoTheme.LABEL_SMALL + sliderCaption.setWidth("200px") + + slider.styleName = ValoTheme.TEXTFIELD_SMALL + slider.setWidth(100f, Sizeable.Unit.PERCENTAGE) + + sliderValue.styleName = ValoTheme.LABEL_SMALL + sliderValue.setWidth("100px") + + val myLayout = HorizontalLayout() + myLayout.addComponent(sliderCaption) + myLayout.addComponent(slider) + myLayout.addComponent(sliderValue) + myLayout.setComponentAlignment(sliderCaption, Alignment.MIDDLE_LEFT) + myLayout.setComponentAlignment(slider, Alignment.MIDDLE_LEFT) + myLayout.setComponentAlignment(sliderValue, Alignment.MIDDLE_RIGHT) + myLayout.styleName = ValoTheme.LAYOUT_COMPONENT_GROUP + + return myLayout + } + + override fun getValue(): String { + return sliderValue.value + } + + override fun setValue(value: String) { + this.sliderValue.value = value + } + + fun setValue(value: Double?) { + this.slider.value = value!! + } + + override fun getCaption(): String { + return sliderCaption.value + } + + override fun setCaption(value: String) { + this.sliderCaption.value = value + } + + override fun doSetValue(s: String) { + + } + + fun setResolution(resolution: Int) { + this.slider.resolution = resolution + } + + fun setMin(resolution: Double) { + this.slider.min = resolution + } + + fun setMax(resolution: Double) { + this.slider.max = resolution + } + +} diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomTextFieldButton.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomTextFieldButton.kt new file mode 100644 index 0000000..7c4809b --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomTextFieldButton.kt @@ -0,0 +1,41 @@ +package hr.unipu.websimulatorapp.webapp + +import com.vaadin.server.FontAwesome +import com.vaadin.server.Sizeable +import com.vaadin.ui.* +import com.vaadin.ui.themes.ValoTheme + +class CustomTextFieldButton : CustomField() { + private val textField = TextField() + + override fun initContent(): Component { + + textField.setWidth(100f, Sizeable.Unit.PERCENTAGE) + textField.styleName = ValoTheme.TEXTFIELD_SMALL + textField.styleName = ValoTheme.TEXTFIELD_BORDERLESS + textField.isReadOnly = true + + val button = Button() + button.addStyleName(ValoTheme.BUTTON_ICON_ONLY) + button.icon = FontAwesome.USER + + val myLayout = CssLayout() + myLayout.addComponents(textField, button) + myLayout.styleName = ValoTheme.LAYOUT_COMPONENT_GROUP + return myLayout + } + + override fun getValue(): String { + return textField.value + } + + override fun setValue(value: String) { + this.textField.value = value + } + + override fun doSetValue(s: String) { + + } + + +} diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomWindowSettings.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomWindowSettings.kt new file mode 100644 index 0000000..9ef5c10 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/CustomWindowSettings.kt @@ -0,0 +1,39 @@ +package hr.unipu.websimulatorapp.webapp + +import com.vaadin.server.Sizeable +import com.vaadin.ui.FormLayout +import com.vaadin.ui.TextField +import com.vaadin.ui.Window + + +class CustomWindowSettings @JvmOverloads constructor(caption: String = "Simulation Settings") : Window(caption) { + + init { + this.setWidth(400.0f, Sizeable.Unit.PIXELS) + + val form = FormLayout() + + val tf1 = TextField("Initial time:") + tf1.value = WebSimulatorApp.simulation.model.initialTime.toString() + tf1.addValueChangeListener { valueChangeEvent -> WebSimulatorApp.simulation.model.initialTime = java.lang.Double.parseDouble(valueChangeEvent.value) } + form.addComponent(tf1) + + val tf2 = TextField("Final time:") + tf2.value = WebSimulatorApp.simulation.model.finalTime.toString() + tf2.addValueChangeListener { valueChangeEvent -> WebSimulatorApp.simulation.model.finalTime = java.lang.Double.parseDouble(valueChangeEvent.value) } + form.addComponent(tf2) + + val tf3 = TextField("Time step:") + tf3.value = WebSimulatorApp.simulation.model.timeStep.toString() + tf3.addValueChangeListener { valueChangeEvent -> WebSimulatorApp.simulation.model.timeStep = java.lang.Double.parseDouble(valueChangeEvent.value) } + form.addComponent(tf3) + + + this.addCloseListener { closeEvent -> + WebSimulatorApp.simulationFinished == false + } + + form.setMargin(true) + this.content = form + } +} diff --git a/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/WebSimulatorApp.kt b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/WebSimulatorApp.kt new file mode 100644 index 0000000..2c759e2 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/kotlin/hr/unipu/websimulatorapp/webapp/WebSimulatorApp.kt @@ -0,0 +1,568 @@ +package hr.unipu.websimulatorapp.webapp + + +import com.vaadin.addon.charts.Chart +import com.vaadin.addon.charts.model.* +import com.vaadin.addon.spreadsheet.Spreadsheet +import com.vaadin.annotations.PreserveOnRefresh +import com.vaadin.annotations.Theme +import com.vaadin.annotations.VaadinServletConfiguration +import com.vaadin.external.org.slf4j.LoggerFactory +import com.vaadin.server.* +import com.vaadin.shared.ui.ValueChangeMode +import com.vaadin.ui.* +import com.vaadin.ui.Label +import com.vaadin.ui.themes.ValoTheme +import hr.unipu.ksdtoolkit.entities.ModelEntity +import hr.unipu.ksdtoolkit.models.* +import hr.unipu.ksdtoolkit.simulations.Simulation +import hr.unipu.websimulatorapp.WebSimulator +import org.apache.poi.ss.usermodel.Cell +import java.text.ParseException +import java.util.* +import java.util.logging.Level +import java.util.logging.Logger +import javax.servlet.annotation.WebServlet + +/** + * Vaadin web simulator app - for chart plotting and interactive simulation. + * + * @author [Siniša Sovilj](mailto:sinisa.sovilj@unipu.hr) + */ + + +@Theme("mytheme") +@PreserveOnRefresh +class WebSimulatorApp : UI() { + + init { + + LoggerFactory.getLogger(javaClass).info("---WebSimulatorApp init invoked.---") + + /**---Creating: model, simulation and run.---**/ + + // 1. Create a model. + val model = ModelInnovationDiffusion() + //val model = ModelGenericSD() + //val model = ModelSimpleCompoundInterest() + //val model = ModelInheritedCompoundInterest() + //val model = ModelBassDiffusion() + //val model = ModelTestSpeed() + + // 2. Create the simulation. + simulation = Simulation(model) + + // 3. Add results handlers + simulation.addSimulationEventListener(WebSimulator()) + + // 4. Run simulation (so that all expressions are invoked for time=0). + simulation.run() + + } + + + /** + * Class member variables. + */ + private var timeUnit = simulation.model.timeUnit + + + /** + * Static variables and methods. + */ + companion object { + + private val LAYOUT_WIDTH_COLUMN1 = "450px" + private val LAYOUT_WIDTH_COLUMN2 = "450px" + private val LAYOUT_WIDTH_COLUMN3 = "600px" + private val CHART_WIDTH: String = "450px" + private val CHART_HEIGHT: String = "350px" + private val DATA_IN_ROWS = true + + private var seriesNames: ArrayList = ArrayList() + private var seriesUnits: ArrayList = ArrayList() + private var seriesValues: ArrayList = ArrayList() + private var time: ArrayList = ArrayList() + private var constantsName: ArrayList = ArrayList() + private var constantsValue: ArrayList = ArrayList() + + public lateinit var simulation: Simulation + public var simulationFinished: Boolean = false + + + /** + * Add series names to web simulator (for chart series). + * + * @param modelEntityNames list of model entity names. + */ + fun addSeriesNames(modelEntityNames: List) { + + LoggerFactory.getLogger(javaClass).info("---SeriesNames added.---") + + seriesNames = ArrayList() + seriesValues = ArrayList() + seriesUnits = ArrayList() + time = ArrayList() + val modelEntityUnits = simulation.model.modelEntitiesUnits + for (modelEntityName in modelEntityNames) { + val index = modelEntityNames.indexOf(modelEntityName) + val modelEntityUnit = modelEntityUnits[index] + seriesNames.add(modelEntityName) + seriesUnits.add(modelEntityUnit) + val series = ListSeries() + series.name = modelEntityName + seriesValues.add(series) + } + } + + + /** + * Add constants to web simulator. + * + * @param modelEntityConstants list of model constants. + */ + fun addConstants(modelEntityConstants: Map) { + + constantsName = ArrayList() + constantsValue = ArrayList() + + for (modelEntityConstant in modelEntityConstants) { + constantsName.add(modelEntityConstant.key) + val value = modelEntityConstant.value.currentValue + val item = DataSeriesItem(0, value) + constantsValue.add(item) + } + } + + + /** + * Add series values to web simulator (for chart series). + * + * @param modelEntityValues list of myModel entity values. + * @param currentTime current myModel time. + */ + fun addSeriesValues(modelEntityValues: List, currentTime: Double) { + time.add(currentTime) + for (i in 0..modelEntityValues.indices.last) { + val valueString = modelEntityValues[i] + try { + val value = valueString.toDouble() + seriesValues[i].addData(value) + } catch (exception: ParseException) { + Logger.getLogger(WebSimulatorApp::class.java.name).log( + Level.SEVERE, "Parsing entity values from model unsuccessful.", exception) + } + + } + } + } + + + /** + * Vaadin Servlet. + */ + @WebServlet(urlPatterns = ["/*"], name = "MyUIServlet", asyncSupported = true) + @VaadinServletConfiguration(ui = WebSimulatorApp::class, productionMode = false) + class MyUIServlet : VaadinServlet() + + + /** + * Vaadin init() method - entry point in the web application. + */ + override fun init(vaadinRequest: VaadinRequest) { + + LoggerFactory.getLogger(javaClass).info("---Vaadin 'init' method invoked.---") + + runSimulation() + + drawUI() + + } + + + /** + * Draw UI - for drawing and re-drawing. + */ + private fun drawUI() { + + LoggerFactory.getLogger(javaClass).info("---'draw' method invoked.---") + + val contentVertical = VerticalLayout() + val contentHorizontal = HorizontalLayout() + val layoutGrid = GridLayout(3, 2) + + val header = Label("WebSimulator: ${simulation.model.name}") + header.styleName = ValoTheme.LABEL_H2 + contentVertical.addComponent(header) + contentVertical.setComponentAlignment(header, Alignment.TOP_CENTER) + contentVertical.addComponent(layoutGrid) + contentHorizontal.addComponent(contentVertical) + content = contentHorizontal + + + val layoutInput = createInputSection() + layoutGrid.addComponent(layoutInput, 0, 0) + + val layoutModel = createBackendSection() + layoutGrid.addComponent(layoutModel, 1, 0) + + val layoutOutput1 = createChartSection() + layoutGrid.addComponent(layoutOutput1, 2, 0) + + val layoutControl = createControlSection() + layoutGrid.addComponent(layoutControl, 0, 1) + + var layoutOutput2 = VerticalLayout() + + if (false) layoutOutput2 = createGridSection() + if (true) layoutOutput2 = createSpreadsheetSection() + + layoutGrid.addComponent(layoutOutput2, 2, 1) + } + + + private fun runSimulation() { + + if (WebSimulatorApp.simulationFinished == false) { + val doesNotContainWebSimulatorListener = simulation.outputHandlers.filterIsInstance(WebSimulator::class.java).isEmpty() + if (doesNotContainWebSimulatorListener) { + + simulation.addSimulationEventListener(WebSimulator()) + } + LoggerFactory.getLogger(javaClass).info("---Simulation (re)-run()---") + simulation.run() + } + } + + + /** + * Re-run simulation & refresh UI. + */ + private fun refreshUI() { + WebSimulatorApp.simulationFinished = false + runSimulation() + drawUI() + } + + + /** + * Create Input section. + */ + private fun createInputSection(): VerticalLayout { + val layoutInput = VerticalLayout() + layoutInput.setWidth(LAYOUT_WIDTH_COLUMN1) + + val lblInput = Label("INPUT (parameters):") + lblInput.setHeight("24px") + lblInput.styleName = ValoTheme.LABEL_COLORED + layoutInput.addComponent(lblInput) + + for (s in WebSimulatorApp.constantsName) { + + val labelTextField = CustomLabelTextField() + labelTextField.caption = s + val indexOfEntity = simulation.model.modelEntitiesKeys.indexOf(s) + labelTextField.value = simulation.model.modelEntitiesValues[indexOfEntity] + labelTextField.modelVariableName = simulation.model.modelEntitiesKeys[indexOfEntity] + labelTextField.textField.valueChangeMode = + ValueChangeMode.LAZY + labelTextField.textField.valueChangeTimeout = 1600 + labelTextField.textField.addValueChangeListener { valueChangeEvent -> + + LoggerFactory.getLogger(javaClass).info("Value changed in: $valueChangeEvent") + + val newValue = valueChangeEvent.value.toDouble() + Notification.show("Value changed:", newValue.toString(), Notification.Type.TRAY_NOTIFICATION); + + val modelVariableName = labelTextField.modelVariableName + simulation.model.entities[modelVariableName]?.equation = { newValue } + refreshUI() + } + layoutInput.addComponent(labelTextField) + } + + return layoutInput + } + + + /** + * Create Control section. + */ + private fun createControlSection(): VerticalLayout { + val layoutControl = VerticalLayout() + + val lblControl = Label("CONTROL (simulation):") + lblControl.setHeight("24px") + lblControl.styleName = ValoTheme.LABEL_COLORED + + val buttonControl = Button("Simulation Settings") + val window = CustomWindowSettings("Simulation Settings") + buttonControl.addClickListener { clickEvent -> + this.ui.ui.addWindow(window) + } + window.addCloseListener { + refreshUI() + } + + val buttonRun = Button("Run Simulation") + buttonRun.addClickListener { e -> + refreshUI() + } + layoutControl.addComponent(lblControl) + layoutControl.addComponent(buttonControl) + layoutControl.addComponents(buttonRun) + return layoutControl + } + + + /** + * Create image of the SD model. + */ + private fun createBackendSection(): VerticalLayout { + val layoutModel = VerticalLayout() + layoutModel.setWidth(LAYOUT_WIDTH_COLUMN2) + + val lblModel = Label("MODEL (backend):") + lblModel.setHeight("24px") + lblModel.styleName = ValoTheme.LABEL_COLORED + + val imageFileName0 = "/" + "NoModelImage.png" + val imageFileName1 = "/" + simulation.model.javaClass.name.substringAfterLast(".") + ".png" + val imageFileName2 = "/" + simulation.model.javaClass.name.substringAfterLast(".") + ".jpg" + val sc = VaadinServlet.getCurrent().servletContext + val path0 = sc.getRealPath(imageFileName0) + val path1 = sc.getRealPath(imageFileName1) + val path2 = sc.getRealPath(imageFileName2) + + val loader: ClassLoader = this::class.java.getClassLoader() + val url0 = loader.getResource(imageFileName0) + val url1 = loader.getResource(imageFileName1) + val url2 = loader.getResource(imageFileName2) + + val path = if (url1 != null) { + path1 + } else { + if (url2 != null) { + path2 + } else { + path0 + } + } + + val resource = ClassResource("/" + path.substringAfterLast("""\""")) + val image = Image(null, resource) + + image.setSizeFull() + + layoutModel.addComponent(lblModel) + layoutModel.addComponent(image) + + return layoutModel + } + + + /** + * Create output Chart section. + */ + private fun createChartSection(): VerticalLayout { + val layoutOutput1 = VerticalLayout() + layoutOutput1.setWidth(LAYOUT_WIDTH_COLUMN3) + + val lblOutput1 = Label("OUTPUT (graph):") + lblOutput1.setHeight("24px") + lblOutput1.styleName = ValoTheme.LABEL_COLORED + + val chart = Chart() + + val configuration = chart.configuration + configuration.chart.type = ChartType.LINE + configuration.title.text = "" + configuration.subTitle.text = "" + + val yAxis = configuration.getyAxis() + yAxis.setTitle("Value") + + val xAxis = configuration.getxAxis() + xAxis.setTitle("Time [$timeUnit]") + + val legend = configuration.legend + legend.layout = LayoutDirection.VERTICAL + legend.align = HorizontalAlign.RIGHT + legend.verticalAlign = VerticalAlign.TOP + legend.borderWidth = 0 + + val startTime = time[0] + val endTime = time[time.size - 1] + val intervalTime = time[1] - time[0] + val plotOptions = PlotOptionsLine() + plotOptions.pointStart = startTime + plotOptions.pointInterval = intervalTime + configuration.setPlotOptions(plotOptions) + + if (seriesNames.maxOf { it.length } > 25) { + legend.enabled = false + } + + for (i in 0 until Companion.seriesValues.size) { + configuration.addSeries(Companion.seriesValues[i]) + } + chart.drawChart(configuration) + + layoutOutput1.addComponent(lblOutput1) + layoutOutput1.addComponent(chart) + + return layoutOutput1 + } + + + /** + * Create output Grid section. + */ + private fun createGridSection(): VerticalLayout { + + val layoutOutput2 = VerticalLayout() + + val lblOutput2 = Label("OUTPUT (grid):") + lblOutput2.setHeight("24px") + lblOutput2.styleName = ValoTheme.LABEL_COLORED + + val dataRowsSize = Companion.seriesValues.size + + val rowNames = mutableListOf("Time" + " [${simulation.model.timeUnit}]") + for (index in 0 until dataRowsSize) { + rowNames.add(seriesValues[index].name + " [${seriesUnits[index]}]") + } + + val rows = ArrayList>(rowNames.size * Companion.seriesValues[0].data.size) + var series1: Array + var series2: ArrayList + for (i in 0..time.indices.last) { + val fakeBean = LinkedHashMap() + for (j in 0..rowNames.indices.last) { + if (j > 0) { + series1 = (Companion.seriesValues[j - 1].data) + fakeBean[rowNames[j]] = series1[i].toString() + } else { + series2 = time + fakeBean[rowNames[j]] = series2[i].toString() + } + + } + rows.add(fakeBean) + } + + val grid = Grid>() + grid.setItems(rows) + grid.setSizeFull() + + val s = rows[0] + for (entry in s.entries) { + grid.addColumn { h -> h[entry.key] }.caption = entry.key + } + grid.styleName = "smallgrid" + + layoutOutput2.addComponent(lblOutput2) + layoutOutput2.addComponent(grid) + + return layoutOutput2 + } + + + /** + * Create output Spreadsheet section. + */ + private fun createSpreadsheetSection(): VerticalLayout { + val layoutOutput2 = VerticalLayout() + + val lblOutput2 = Label("OUTPUT (spreadsheet):") + lblOutput2.setHeight("24px") + lblOutput2.styleName = ValoTheme.LABEL_COLORED + + val dataColumnsSize = Companion.seriesValues[2].data.size + val dataRowsSize = Companion.seriesValues.size + + val sheet = Spreadsheet() + if (DATA_IN_ROWS == true) { + sheet.createNewSheet("Output", dataRowsSize + 1, dataColumnsSize + 1) + } else { + sheet.createNewSheet("Output", dataColumnsSize + 1, dataRowsSize + 1) + } + + sheet.isReportStyle = true + sheet.setWidth(LAYOUT_WIDTH_COLUMN3) + + val newCellStyle = sheet.workbook.createCellStyle() + val format = sheet.workbook.createDataFormat() + + newCellStyle.dataFormat = format.getFormat("#,##0.00") + + val rowNames = mutableListOf("Time" + " [${simulation.model.timeUnit}]") + for (index in 0 until dataRowsSize) { + rowNames.add(seriesValues[index].name + " [${seriesUnits[index]}]") + } + + for (rowName in rowNames) { + if (DATA_IN_ROWS) { + sheet.createCell(rowNames.indexOf(rowName), 0, rowName) + sheet.autofitColumn(rowNames.indexOf(rowName)) + } else { + sheet.createCell(0, rowNames.indexOf(rowName), rowName) + sheet.autofitColumn(rowNames.indexOf(rowName)) + } + + } + + + /* + run { + var i = 0 + while (i < dataLength) { + val point = Companion.seriesValue[2].data[i] + Companion.seriesValue[2].updatePoint(i, point as Double * 12.0 * 100.0) + i = i + 1 + } + } + */ + + val rows = ArrayList>(rowNames.size * Companion.seriesValues[0].data.size) + var series1: Array + var series2: ArrayList + for (i in 0..time.indices.last) { + val fakeBean = LinkedHashMap() + for (j in 0..rowNames.indices.last) { + if (j > 0) { + series1 = (Companion.seriesValues[j - 1].data) + fakeBean[rowNames[j]] = series1[i].toString() + } else { + series2 = time + fakeBean[rowNames[j]] = series2[i].toString() + } + + } + rows.add(fakeBean) + } + + val cellsToRefresh = ArrayList() + var cell: Cell + for (rowName in rowNames) { + for (row in rows) { + if (DATA_IN_ROWS) { + cell = sheet.createCell(rowNames.indexOf(rowName), rows.indexOf(row) + 1, row[rowName]?.toDouble()) + } else { + cell = sheet.createCell(rows.indexOf(row) + 1, rowNames.indexOf(rowName), row[rowName]?.toDouble()) + } + + cell.cellStyle = newCellStyle + cellsToRefresh.add(cell) + } + sheet.autofitColumn(rowNames.indexOf(rowName)) + } + sheet.refreshCells(cellsToRefresh) + + layoutOutput2.addComponent(lblOutput2) + sheet.setSizeFull() + layoutOutput2.addComponent(sheet) + return layoutOutput2 + } + +} diff --git a/ksdtoolkit-webapp/src/main/resources/AppWidgetset.gwt.xml b/ksdtoolkit-webapp/src/main/resources/AppWidgetset.gwt.xml new file mode 100644 index 0000000..8e9f9c9 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/resources/AppWidgetset.gwt.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ksdtoolkit-webapp/src/main/resources/ModelGenericSD.png b/ksdtoolkit-webapp/src/main/resources/ModelGenericSD.png new file mode 100644 index 0000000..bab74ac Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/ModelGenericSD.png differ diff --git a/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.jpg b/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.jpg new file mode 100644 index 0000000..2d6da0e Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.jpg differ diff --git a/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.png b/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.png new file mode 100644 index 0000000..2ea7dfd Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/ModelInnovationDiffusion.png differ diff --git a/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.jpg b/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.jpg new file mode 100644 index 0000000..010797a Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.jpg differ diff --git a/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.png b/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.png new file mode 100644 index 0000000..9cd0b0d Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/ModelSimpleCompoundInterest.png differ diff --git a/ksdtoolkit-webapp/src/main/resources/NoModelImage.png b/ksdtoolkit-webapp/src/main/resources/NoModelImage.png new file mode 100644 index 0000000..b14ad43 Binary files /dev/null and b/ksdtoolkit-webapp/src/main/resources/NoModelImage.png differ diff --git a/ksdtoolkit-webapp/src/main/resources/README b/ksdtoolkit-webapp/src/main/resources/README new file mode 100644 index 0000000..faabc74 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/resources/README @@ -0,0 +1 @@ +Please add your static resources here diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-legacy.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-legacy.scss new file mode 100644 index 0000000..9d306c1 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-legacy.scss @@ -0,0 +1,1148 @@ +@import "styles/grouping"; + +$spreadsheet-border: 1px solid #C7C7C7 !default; +$spreadsheet-base-font-family: Helvetica !default; +$spreadsheet-base-font-size: 14px !default; +$spreadsheet-header-font-size: 13px !default; +$default-font-color: #6a6a6a !default; +$functionbar-background-color: #ffffff !default; +$functionbar-font-color: #6a6a6a !default; +$address-field-background: #fafafa !default; +$sheet-selector-background: #fafafa !default; +$inactive-tab-background: #fafafa !default; +$active-tab-background: #ffffff !default; +$inactive-tab-text-color: #6a6a6a !default; +$active-tab-text-color: #2584e2 !default; +$tab-action-button-color: #464646 !default; +$tab-action-button-inactive-color: #d6d6d6 !default; +$header-border: 1px solid #C7C7C7 !default; +$header-bg-color: #f5f5f5 !default; +$selected-header-bg-color: #e6edf4 !default; +$selected-header-border-color: #63b1ff !default; +$col-header-gradient-top-color: #fcfcfc !default; +$col-header-gradient-bottom-color: #ededed !default; +$resize-line-color: #b8b8ff !default; +$inactive-resize-line-color: #c7c7c7 !default; +$cell-background-color: #ffffff !default; +$cell-comment-triangle-color: #FFCF16 !default; +$cell-invalidformula-triangle-color: #f00 !default; +$freeze-pane-border: 1px solid black !default; +$sheet-selection-border-color: #197de0 !default; +$sheet-selection-corner-color: #197de1 !default; +$sheet-selection-extend-corner-color: #40b527 !default; +$sheet-selection-extend-inside-bg-color: rgba(235, 247, 233, 0.8) !default; +$sheet-selection-range-bg-color: rgba(232, 242, 252, 0.8) !default; +$sheet-selection-highlight-outline-color: #222222 !default; +$popup-button-border-color: #A7A7A7 !default; +$popup-button-arrow-color: #676767 !default; +$popup-overlay-bg-color: #fff !default; +$popup-overlay-text-color: #474747 !default; +$popup-button-overlay-height: 275px; +$cell-comment-bg-color: #fff !default; +$cell-comment-border-color: #A7A7A7 !default; +$spreadsheet-header-grouping-color: #C7C7C7 !default; +$spreadsheet-freeze-pane-border: 1px solid $default-font-color !default; + +@mixin spreadsheet-legacy { + .v-spreadsheet { + overflow: hidden; + position: relative; + + padding-bottom: 29px; + padding-left: 50px; + padding-top: 57px; + + border: $spreadsheet-border; + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-base-font-size; + color: $default-font-color; + + &.hidefunctionbar { + padding-top: 28px; + + .functionbar { + height: 0; + display: none; + } + + .sheet { + &.top-right-pane, + &.top-left-pane { + top: 0px; + } + } + .corner { + top: 0px; + } + } + + &.hidetabsheet { + padding-bottom: 0px; + + .sheet-tabsheet { + height: 0; + display: none; + } + + .sheet { + &.bottom-right-pane { + bottom: 0px; + } + } + } + + > div { + outline: none; + } + + > div, + .sheet > div { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &.row-resizing, + &.row-resizing div { + cursor: row-resize; + } + + &.col-resizing, + &.col-resizing div { + cursor: col-resize; + } + + &.selecting { + cursor: crosshair; + } + + /** FUNCTION BAR */ + .functionbar { + background-color: $functionbar-background-color; + border-bottom: $spreadsheet-border; + height: 29px; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 200; + + .functionfield, + .addressfield { + font-size: $spreadsheet-base-font-size; + height: 18px; + width: 100%; + padding: 0; + padding-left: 5px; + border: none; + box-sizing: border-box; + color: $functionbar-font-color; + outline: none; + } + + .fixed-left-panel { + float: left; + width: 180px; + height: 100%; + border-right: $spreadsheet-border; + padding-top: 6px; + box-sizing: border-box; + background: $address-field-background; + } + + .adjusting-right-panel { + overflow: hidden; + padding-right: 10px; + height: 100%; + padding-top: 6px; + box-sizing: border-box; + } + + .addressfield { + text-align: center; + background: $address-field-background; + } + + .functionfield { + font: normal normal normal 11px/normal Arial; + font-size: 14px; + } + + .formulaoverlay { + + // Replicate input style + + font: normal normal normal 11px/normal Arial; + position: absolute; + top: 6px; + left: 181px; + font-size: 14px; + pointer-events: none; + padding-left: 4px; + + //transparent + color: rgba(0, 0, 0, 0); + + span { + border-radius: 2px; + } + } + } + + /** SHEET (BOTTOM RIGHT PANE) */ + .sheet { + &.bottom-right-pane { + overflow: scroll; + right: 0; + bottom: 28px; + position: absolute; + } + + .cell { + background-color: $cell-background-color; + border-right: $spreadsheet-border; + border-bottom: $spreadsheet-border; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: visible; + padding: 0 2px; + position: absolute; + white-space: nowrap; + flex-direction: column; + justify-content: flex-end; + line-height: normal; + + &.selected-cell-highlight { + outline: solid $sheet-selection-highlight-outline-color 1px; + -moz-outline-offset: -2px; + outline-offset: -2px; + z-index: 3; + } + + > .v-button { + overflow: hidden; + text-overflow: ellipsis; + } + + &.cell-range { + background-color: rgba(232, 242, 252, 0.8); + } + } + + div { + &.cell.r { + text-align: right; + } + + &.merged-cell { + display: block; + overflow: hidden; + z-index: 5 !important; + } + + &.custom-editor-cell { + padding: 2px; + } + } + + &.bottom-right-pane div.merged-cell { + z-index: 5 !important; + } + + > input[type="text"] { + border: 0 !important; + -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + cursor: text; + display: block !important; + outline: none !important; + overflow: hidden; + padding: 0 !important; + position: absolute; + z-index: 26 !important; + } + + .floater { + border-right: 0; + border-bottom: 0; + z-index: -1; + background-color: white; + } + } + + &.nogrid .sheet .cell { + border-right: 0px; + border-bottom: 0px; + } + + .top-left-pane div.merged-cell { + z-index: 25 !important; + } + + .top-right-pane div.merged-cell, + .bottom-left-pane div.merged-cell { + z-index: 15 !important; + } + + /** SHEET FREEZE PANES */ + .top-left-pane, + .top-right-pane, + .bottom-left-pane { + border-right: $freeze-pane-border; + border-bottom: $freeze-pane-border; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: visible; + position: absolute; + + &.inactive { + border-right: 0; + border-bottom: 0; + } + } + + .bottom-left-pane { + height: 100%; + left: 0; + padding-bottom: 28px; + z-index: 10; + + .rh { + left: 0; + margin-top: 0 !important; + } + + .cell, .sheet-image { + margin-left: 50px; + } + + .sheet-selection { + margin-left: 51px; + } + } + + .top-left-pane { + left: 0; + top: 30px; + z-index: 20; + + .ch { + top: 0; + margin-left: 50px; + } + + .rh { + left: 0; + margin-top: 27px; + } + + .cell, .sheet-image { + margin-top: 27px; + margin-left: 50px; + } + + .sheet-selection { + margin-top: 28px; + margin-left: 51px; + } + } + + .top-right-pane { + top: 30px; + width: 100%; + z-index: 11; + + .ch { + top: 0; + margin-left: 0 !important; + } + + .cell, .sheet-image { + margin-top: 27px; + } + + .sheet-selection { + margin-top: 28px; + } + } + + &.noheaders { + .top-left-pane, .top-right-pane { + .cell, .sheet-image { + margin-top: 0; + } + .sheet-selection { + margin-top: 1px; + } + } + + .top-left-pane, .bottom-left-pane { + .cell, .sheet-image { + margin-left: 0; + } + .sheet-selection { + margin-left: 1px; + } + } + } + + /** SHEET HEADERS */ + .ch, .rh, .corner { + background-color: $header-bg-color; + font-family: Helvetica; + font-size: $spreadsheet-header-font-size; + overflow: hidden; + position: absolute; + text-align: center; + } + + .rh { + border-right: $header-border; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: e-resize; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 50px; + z-index: 29; + display: flex; + justify-content: center; + vertical-align: middle; + flex-direction: column; + padding-top: 3px; + + &.selected-row-header { + background: $selected-header-bg-color !important; + border-right: 2px solid $selected-header-border-color; + } + + .header-resize-dnd-first, + .header-resize-dnd-second { + background: transparent; + cursor: row-resize; + height: 3px; + position: absolute; + left: 0; + width: 49px; + z-index: 30; + } + + .header-resize-dnd-first { + top: 0; + } + + .header-resize-dnd-second { + border-bottom: $header-border; + bottom: 0; + } + + &.resize-extra { + border-bottom: $header-border; + } + } + + .ch { + background: -moz-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -webkit-gradient(left top, left bottom, color-stop(2%, $col-header-gradient-top-color), color-stop(98%, $col-header-gradient-bottom-color)); + background: -webkit-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -o-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -ms-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + /* Vaadin SASS compiler can't handle the following line */ + /* background: linear-gradient(to bottom, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='$col-header-gradient-top-color', endColorstr='$col-header-gradient-bottom-color', GradientType=0); + border-bottom: $header-border; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: s-resize; + height: 27px; + padding-top: 4px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 29; + + &.selected-column-header { + background: $selected-header-bg-color !important; + border-bottom: 2px solid $selected-header-border-color; + } + + .header-resize-dnd-first, + .header-resize-dnd-second { + background: transparent; + cursor: col-resize; + height: 27px; + position: absolute; + top: 0; + width: 3px; + z-index: 30; + } + + .header-resize-dnd-first { + left: 0; + } + + .header-resize-dnd-second { + border-right: $header-border; + right: 0; + } + + &.resize-extra { + border-right: $header-border; + } + } + + &.protected.lock-format-columns .ch, + &.protected.lock-format-rows .rh { + .header-resize-dnd-first, + .header-resize-dnd-second { + cursor: default; + } + } + + &.noheaders { + padding-left: 0px; + padding-top: 30px; /* functionbar height + 1*/ + .ch, .rh, .corner { + display: none; + } + } + + .ch.col1 .header-resize-dnd-first, + .rh.row1 .header-resize-dnd-first { + display: none; + } + + > div.resize-line { + background: $resize-line-color; + } + + .sheet > div.resize-line { + background: $inactive-resize-line-color; + } + + .resize-line, + .sheet > div.resize-line { + border: none; + height: 0; + padding: 0; + visibility: hidden; + width: 0; + z-index: 25; + position: absolute; + } + + &.col-resizing { + .resize-line, + .sheet > div.resize-line { + height: 100%; + visibility: visible; + width: 1px; + } + + > .resize-line { + margin-left: 49px; + margin-top: -30px; + } + + .sheet > div.resize-line { + margin-left: -1px; + } + } + + &.row-resizing { + .resize-line, .sheet > div.resize-line { + height: 1px; + visibility: visible; + width: 100%; + } + + > .resize-line { + margin-top: 56px; + margin-left: -50px; + } + + .sheet > div.resize-line { + margin-top: -1px; + } + } + + .corner { + cursor: default; + top: 30px; + left: 0; + width: 50px; + height: 27px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-bottom: $header-border; + border-right: $header-border; + z-index: 100; + background: -moz-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -webkit-gradient(left top, left bottom, color-stop(2%, $col-header-gradient-top-color), color-stop(98%, $col-header-gradient-bottom-color)); + background: -webkit-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -o-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -ms-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + /* Vaadin SASS compiler can't handle the following line */ + /* background: linear-gradient(to bottom, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='$col-header-gradient-top-color', endColorstr='$col-header-gradient-bottom-color', GradientType=0); + } + + /** SHEET IMAGES */ + .sheet > div.sheet-image { + background: transparent; + border: none; + cursor: default; + height: auto; + width: auto; + position: absolute; + } + + .bottom-right-pane.sheet > div.sheet-image { + z-index: 10; + } + + .top-left-pane > div.sheet-image { + z-index: 25; + } + + .top-right-pane, + .bottom-left-pane { + > div.sheet-image { + z-index: 15; + } + } + + /** CELL COMMENT */ + .sheet { + .cell-comment-triangle { + border-color: transparent $cell-comment-triangle-color transparent transparent; + border-style: solid; + border-width: 0 9px 9px 0; + height: 0; + line-height: 0; + margin: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 0; + z-index: 1; + } + + .cell-invalidformula-triangle { + border-color: transparent $cell-invalidformula-triangle-color transparent transparent; + border-style: solid; + border-width: 0 9px 9px 0; + height: 0; + line-height: 0; + margin: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 0; + z-index: 2; + } + + .comment-overlay-line { + background-color: $cell-comment-line-color !important; + border: none !important; + display: block !important; + height: 1px; + padding: 0; + position: absolute; + -webkit-transform-origin: 0% 50%; + -ms-transform-origin: 0% 50%; + transform-origin: 0% 50%; + z-index: 21; + } + } + + /** SELECTION WIDGET */ + div.sheet-selection { + background-color: transparent !important; + border: none !important; + display: block; + position: absolute; + width: 0px; + height: 0px; + overflow: visible; + pointer-events: none; + margin-left: 1px; + margin-top: 1px; + + &.col0.row0 { + display: none; + } + } + + &.notfocused .sheet-selection { + opacity: 0.6; + } + + .sheet-selection { + .s-top, .s-left, .s-bottom, .s-right { + padding: 0; + background-color: $sheet-selection-border-color; + position: absolute; + + &.extend { + background-color: $sheet-selection-extend-corner-color !important; + } + } + + .s-top { + top: -2px; + left: -2px; + height: 2px; + pointer-events: all; + } + + .s-left { + width: 2px; + padding-bottom: 1px; + } + + .s-bottom { + height: 2px; + bottom: 0; + } + + .s-right { + right: 0; + width: 2px; + } + + .s-corner { + background-color: $sheet-selection-extend-corner-color; + bottom: -2px; + cursor: crosshair; + height: 6px; + left: -2px; + outline: 2px solid white; + position: absolute; + width: 6px; + } + + &.paintmode { + background-color: $sheet-selection-extend-inside-bg-color !important; + .s-top, .s-left, .s-bottom, .s-right { + background-color: $sheet-selection-extend-corner-color; + } + } + } + + /** SHEET TABSHEET */ + .sheet-tabsheet { + background: $sheet-selector-background; + border-top: $spreadsheet-border; + bottom: 0; + cursor: default; + height: 28px; + left: 0; + overflow: hidden; + position: absolute; + width: 100%; + z-index: 50; + + .sheet-tabsheet-options { + background: $sheet-selector-background; + cursor: pointer; + display: inline-block; + height: 28px; + line-height: 20px; + position: absolute; + width: 140px; + z-index: 60; + left: 0; + top: 0; + + div { + cursor: pointer; + display: inline-block; + font-weight: bold; + position: relative; + text-align: center; + z-index: inherit; + width: 26px; + + padding-top: 4px; + color: $tab-action-button-color; + font-family: FontAwesome; + + &.scroll-tabs-beginning::before { + content: "\f053\f053"; + } + + &.scroll-tabs-end::before { + content: "\f054\f054"; + } + + &.scroll-tabs-left::before { + content: "\f053"; + } + + &.scroll-tabs-right::before { + content: "\f054"; + } + + &.add-new-tab::before { + content: "\f067"; + } + + &.scroll-tabs-beginning, + &.scroll-tabs-end { + padding: 0 2px; + } + + &:hover { + color: $sheet-selection-border-color; + } + + &.hidden { + color: $tab-action-button-inactive-color; + cursor: default; + } + } + } + + .sheet-tabsheet-container { + display: inline-block; + left: 140px; + position: absolute; + z-index: inherit; + margin-right: 206px; + height: 25px; + overflow: hidden; + -webkit-transition: margin-left 200ms; + -moz-transition: margin-left 200ms; + transition: margin-left 200ms; + white-space: nowrap; + + .sheet-tabsheet-tab { + font-family: $spreadsheet-base-font-family; + background: $inactive-tab-background; + border: $spreadsheet-border; + border-top: none; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + cursor: pointer; + display: inline-block; + font-size: 14px; + font-weight: 300; + color: $inactive-tab-text-color; + height: 20px; + margin-bottom: 5px; + margin-left: 5px; + max-width: 200px; + min-width: 50px; + overflow: hidden; + padding: 4px 8px 0; + position: relative; + text-align: center; + text-overflow: ellipsis; + top: -1px; + z-index: inherit; + + &.selected-tab { + background: $active-tab-background; + cursor: default; + color: $active-tab-text-color; + max-width: none; + position: relative; + + input[type="text"] { + font-family: $spreadsheet-base-font-family; + color: $active-tab-text-color; + border: none !important; + font-size: 14px; + font-weight: 300; + height: 20px; + outline: none !important; + padding: 0 !important; + position: relative; + top: 0; + left: 0; + width: inherit; + } + } + } + } + + .sheet-tabsheet-temp { + font-family: $spreadsheet-base-font-family; + font-size: 14px; + display: inline; + left: -5000px; + position: fixed; + white-space-collapse: preserve; + } + + .sheet-tabsheet-infolabel { + background: $sheet-selector-background; + z-index: inherit; + position: absolute; + right: 0; + font-weight: bold; + font-size: 8pt; + border-left: 1px solid rgb(169, 169, 169); + padding-left: 5px; + padding-right: 5px; + padding-top: 2px; + width: 200px; + height: 26px; + line-height: 24px; + display: inline; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + .sheet-tabsheet, + .sheet-tabsheet div { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + /** FILTER BUTTON */ + .sheet div div.popupbutton { + background: -moz-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -webkit-gradient(left top, left bottom, color-stop(2%, $col-header-gradient-top-color), color-stop(98%, $col-header-gradient-bottom-color)); + background: -webkit-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -o-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + background: -ms-linear-gradient(top, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); + /* Vaadin SASS compiler can't handle the following line */ + /* background: linear-gradient(to bottom, $col-header-gradient-top-color 2%, $col-header-gradient-bottom-color 98%); */ + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='$col-header-gradient-top-color', endColorstr='$col-header-gradient-bottom-color', GradientType=0); + bottom: 1px; + cursor: pointer; + height: 14px; + position: absolute; + right: 1px; + width: 14px; + line-height: 15px; + outline: none; + background: url(triangle-inactive.png); + background-size: 100% 100%; + box-shadow: none; + border:none; + } + + // FILTER ACTIVE BUTTON + .sheet div div.popupbutton.active { + background: url(triangle-active.png); + background-size: 100% 100%; + } + + /* TOUCH STYLES */ + .sheet-selection.touch { + &.fill { + .fill-touch-square { + position: relative; + width: 30px; + height: 30px; + margin-left: -15px; + top: -15px; + > .square { + background-color: $spreadsheet-sheet-selection-extend-corner-color; + position: absolute; + background-color: #40b527; + width: 6px; + height: 6px; + border: 2px solid white; + top: -4px; + } + } + .s-right, .s-left { + > .fill-touch-square { + top: 50%; + margin-top: -15px; + > .square { + top: 11px; + left: 11px; + } + } + } + .s-top { + > .fill-touch-square { + top: -20px; + left: 50%; + > .square { + left: 50%; + margin-top: 20px; + margin-left: -4px; + } + } + } + .s-bottom { + > .fill-touch-square { + top: -8px; + left: 50%; + > .square { + left: 50%; + margin-top: 8px; + margin-left: -4px; + } + } + } + } + + .s-corner { + width: 7px; + height: 7px; + bottom: 7px; + left: 7px; + border-radius: 5px; + background-color: $spreadsheet-sheet-selection-corner-color; + } + + .s-corner-touch { + width: 30px; + height: 30px; + position: absolute; + left: -10px; + bottom: -10px; + } + } + + @include grouping; + } + + /* CELL COMMENT OVERLAY STYLES */ + .v-spreadsheet-comment-overlay { + background: $cell-comment-bg-color; + border: 1px solid $cell-comment-border-color; + border-radius: 4px; + -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + padding: 10px; + overflow-y: auto !important; + overflow-x: hidden !important; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + + .popupContent { + overflow: visible; + } + + .comment-overlay-author { + font-size: 12px; + font-weight: bold; + white-space: nowrap; + padding-bottom: 6px; + } + + .comment-overlay-invalidformula { + color: $v-error-indicator-color; + max-width: 200px; + max-height: 150px; + white-space: pre-wrap; + } + + .comment-overlay-label { + max-width: 200px; + max-height: 150px; + white-space: pre-wrap; + } + + .comment-overlay-input { + max-width: 200px; + max-height: 150px; + font-family: 'Open Sans', sans-serif; + font-size: 16px; + font-weight: 300; + outline: none; + background: $cell-comment-bg-color; + border: none; + } + + .comment-overlay-separator { + border-bottom: $spreadsheet-border; + margin-bottom: 7px; + } + } + + // FILTER OVERLAY STYLES + .v-spreadsheet-popupbutton-overlay { + background-color: $popup-overlay-bg-color; + color: $popup-overlay-text-color; + border-radius: 4px; + -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + -moz-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + padding: 5px; + + .v-panel.spreadsheet-item-filter-layout { + background-color: transparent; + border: none; + color: $popup-overlay-text-color; + height: $popup-button-overlay-height; + .v-panel-captionwrap, + .v-panel-content, + .v-panel-deco { + background-color: transparent; + border: none; + color: $popup-overlay-text-color; + } + .v-panel-content { + height: 100%; + } + } + } + + .v-spreadsheet-popupbutton-overlay-header { + background: $popup-overlay-bg-color; + height: 20px; + position: relative; + width: 100%; + padding-bottom: 8px; + + .v-window-closebox { + position: absolute; + left: 2px; + top: 0px; + width: 16px; + height: 16px; + line-height: 16px; + font-size: 16px; + color: $popup-overlay-text-color; + } + + .header-caption { + color: $popup-overlay-text-color; + font-size: 16px; + margin: 0 30px; + text-align: center; + height: 20px; + line-height: 20px; + } + } + + .cell-range-bg-color { + background-color: $spreadsheet-sheet-selection-range-bg-color; + } +} diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-valo.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-valo.scss new file mode 100644 index 0000000..b24197f --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/_spreadsheet-valo.scss @@ -0,0 +1,1116 @@ +@import "styles/grouping"; + +@mixin spreadsheet-valo { + $spreadsheet-default-font-color: valo-font-color($v-background-color) !default; + $spreadsheet-base-font-family: $v-font-family !default; + $spreadsheet-base-font-size: $v-font-size !default; + + $spreadsheet-border: valo-border($strength: 0.8) !default; + + $spreadsheet-header-bg-color: $v-background-color !default; + $spreadsheet-header-border: $spreadsheet-border !default; + $spreadsheet-header-grouping-color: #C7C7C7 !default; + + // Fixed size due to row/column sizing from POI model + $spreadsheet-header-font-size: 13px !default; + + $spreadsheet-functionbar-background-color: valo-table-background-color() !default; + $spreadsheet-functionbar-font-color: valo-font-color($spreadsheet-functionbar-background-color) !default; + + $spreadsheet-cell-background-color: valo-table-background-color() !default; + + $spreadsheet-sheet-selection-border-color: $v-selection-color !default; + $spreadsheet-sheet-selection-corner-color: $v-selection-color !default; + + $spreadsheet-freeze-pane-border: 1px solid $spreadsheet-default-font-color !default; + + $spreadsheet-popupbutton-header-sizing: $spreadsheet-base-font-size + 4 !default; + + $spreadsheet-resize-line-color: $v-selection-color !default; + + $spreadsheet-cell-comment-triangle-color: #FFCF16 !default; + + $spreadsheet-cell-invalidformula-triangle-color: $v-error-indicator-color !default; + + // These colors should be derived from valo theme colors. + // Unfortunately due to a bug in the sass compiler, + // we can not call any sass color functions (like scale-color, + // lighten etc.) using valo variables as function parameters. + // Until the compiler is fixed we must just define the colors here. + + $spreadsheet-address-field-background: #fafafa !default; + $spreadsheet-sheet-selector-background: #fafafa !default; + $spreadsheet-inactive-tab-background: #fafafa !default; + $spreadsheet-active-tab-background: #ffffff !default; + $spreadsheet-inactive-tab-text-color: #6a6a6a !default; + $spreadsheet-active-tab-text-color: #2584e2 !default; + $spreadsheet-tab-action-button-color: #464646 !default; + $spreadsheet-tab-action-button-inactive-color: #d6d6d6 !default; + $spreadsheet-selected-header-bg-color: #e6edf4 !default; + $spreadsheet-selected-header-border-color: #63b1ff !default; + $spreadsheet-sheet-selection-extend-corner-color: #40b527 !default; + $spreadsheet-sheet-selection-extend-inside-bg-color: rgba(235, 247, 233, 0.8) !default; + $spreadsheet-sheet-selection-highlight-outline-color: #222222 !default; + $spreadsheet-sheet-selection-range-bg-color: rgba(232, 242, 252, 0.8) !default; + $spreadsheet-popup-button-arrow-color: #676767 !default; + $spreadsheet-cell-comment-line-color: #A7A7A7 !default; + $spreadsheet-fill-square-border: 2px solid $spreadsheet-cell-background-color; + + // Sizing of Spreadsheet parts + // Fixed sizes due to row/column sizing from POI model + $spreadsheet-col-header-height: 27px; + $spreadsheet-row-header-width: 50px; + $spreadsheet-toolbar-height: round(0.78 * $v-unit-size) !default; // 29px + $spreadsheet-bottom-bar-height: round(0.76 * $v-unit-size) !default; // 28px + $spreadsheet-address-input-width: round(11 * $v-font-size) !default; // 176px + $spreadsheet-field-padding: floor($v-font-size / 3) !default; // 5px + $spreadsheet-tab-action-button-width: round(0.70 * $v-unit-size) !default; // 26px + $spreadsheet-status-label-width: round(5.40 * $v-unit-size) !default; // 200px + $spreadsheet-tab-height: round(0.54 * $v-unit-size) !default; // 20px + $spreadsheet-tab-min-width: round(1.35 * $v-unit-size) !default; // 50px + $spreadsheet-tab-max-width: round(5.40 * $v-unit-size) !default; // 200px + $spreadsheet-tab-padding-vertical: round(0.05 * $v-unit-size) !default; // 2px + $spreadsheet-tab-padding-horizontal: round(0.16 * $v-unit-size) !default; // 6px + $spreadsheet-status-label-font-size: 11px !default; + $spreadsheet-border-width: max(1px, first-number($v-border)) !default; // at least 1px + $spreadsheet-tab-font-size: round(0.38 * $v-unit-size) !default; // 14px + + // Fixed sizes (do not depend on valo unit/font sizing) + $spreadsheet-selection-widget-border-width: 2px !default; + $spreadsheet-selection-widget-corner-size: 6px !default; + $spreadsheet-resize-handle-size: 3px !default; + $spreadsheet-tab-border-radius: 5px !default; + $spreadsheet-popup-button-size: 14px !default; + $spreadsheet-popup-button-margin: 1px !default; + $spreadsheet-popup-button-content-padding: 3px !default; + $spreadsheet-popup-button-overlay-height: 275px; + $spreadsheet-touch-corner-size: 7px !default; + $spreadsheet-touch-corner-left-offset: 7px !default; + $spreadsheet-touch-corner-bottom-offset: 7px !default; + $spreadsheet-touch-corner-border-radius: 5px !default; + $spreadsheet-toucharea-corner-size: 30px !default; + $spreadsheet-toucharea-corner-left-offset: -10px !default; + $spreadsheet-toucharea-corner-bottom-offset: -10px !default; + $spreadsheet-fill-square-toucharea-size: 30px; + $spreadsheet-fill-square-toucharea-offset: -15px; + $spreadsheet-fill-square-size: 6px; + $spreadsheet-fill-square-offset: -4px; + $spreadsheet-fill-square-lr-offset: 11px; + $spreadsheet-fill-square-top-offset: 20px; + $spreadsheet-fill-square-bottom-offset: 8px; + + .v-spreadsheet { + overflow: hidden; + position: relative; + + padding-bottom: $spreadsheet-toolbar-height; + padding-left: $spreadsheet-row-header-width; + padding-top: $spreadsheet-toolbar-height + $spreadsheet-bottom-bar-height; + + border: $spreadsheet-border; + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-base-font-size; + color: $spreadsheet-default-font-color; + + &.hidefunctionbar { + padding-top: $spreadsheet-col-header-height + $spreadsheet-border-width; + + .functionbar { + height: 0; + display: none; + } + + .sheet { + &.top-right-pane, + &.top-left-pane { + top: 0px; + } + } + .corner { + top: 0px; + } + } + + &.hidetabsheet { + padding-bottom: 0px; + + .sheet-tabsheet { + height: 0; + display: none; + } + + .sheet { + &.bottom-right-pane { + bottom: 0px; + } + } + } + + > div { + outline: none; + } + + > div, + .sheet > div { + -webkit-touch-callout: none; + @include user-select(none); + } + + &.row-resizing, + &.row-resizing div { + cursor: row-resize; + } + + &.col-resizing, + &.col-resizing div { + cursor: col-resize; + } + + &.selecting { + cursor: crosshair; + } + + // FUNCTION BAR + .functionbar { + background-color: $spreadsheet-functionbar-background-color; + border-bottom: $spreadsheet-border; + height: $spreadsheet-toolbar-height; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 200; + + .functionfield, + .addressfield { + @include box-sizing(border-box); + font-size: $spreadsheet-base-font-size; + height: 100%; + width: 100%; + padding: 0; + padding-left: $spreadsheet-field-padding; + border: none; + color: $spreadsheet-functionbar-font-color; + outline: none; + } + + .fixed-left-panel { + @include box-sizing(border-box); + float: left; + width: $spreadsheet-address-input-width; + height: 100%; + border-right: $spreadsheet-border; + background: $spreadsheet-address-field-background; + } + + .adjusting-right-panel { + @include box-sizing(border-box); + overflow: hidden; + padding-right: $spreadsheet-field-padding; + height: 100%; + } + + .addressfield { + text-align: center; + background: $spreadsheet-address-field-background; + } + + .functionfield { + font: 400 14px/1.55 Helvetica; + } + + .formulaoverlay { + + // Replicate input style + + font: 400 14px/1.55 Helvetica; + position: absolute; + top: 3px; + left: 181px; + pointer-events: none; + + //transparent + color: rgba(0, 0, 0, 0); + + span { + border-radius: 2px; + } + } + + } + + // SHEET (BOTTOM RIGHT PANE) + .sheet { + &.bottom-right-pane { + overflow: scroll; + right: 0; + bottom: $spreadsheet-bottom-bar-height; + position: absolute; + } + + .cell { + @include box-sizing(border-box); + background-color: $spreadsheet-cell-background-color; + border-right: $spreadsheet-border; + border-bottom: $spreadsheet-border; + overflow: visible; + padding: 0 2px; + position: absolute; + white-space: nowrap; + flex-direction: column; + justify-content: flex-end; + line-height: normal; + + &.selected-cell-highlight { + outline: solid $spreadsheet-sheet-selection-highlight-outline-color 1px; + -moz-outline-offset: -2px; + outline-offset: -2px; + z-index: 3; + } + + > .v-button { + overflow: hidden; + text-overflow: ellipsis; + } + } + + div { + &.cell.r { + text-align: right; + } + + &.merged-cell { + display: block; + overflow: hidden; + z-index: 5 !important; + } + + &.custom-editor-cell { + padding: 2px; + } + } + + &.bottom-right-pane div.merged-cell { + z-index: 5 !important; + } + + > input[type="text"] { + border: 0 !important; + -webkit-box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.75); + cursor: text; + display: block !important; + outline: none !important; + overflow: hidden; + padding: 0 !important; + position: absolute; + z-index: 26 !important; + } + + .floater { + border-right: 0; + border-bottom: 0; + z-index: -1; + background-color: white; + } + } + + &.nogrid .sheet .cell { + border-right: 0px; + border-bottom: 0px; + } + + .top-left-pane div.merged-cell { + z-index: 25 !important; + } + + .top-right-pane div.merged-cell, + .bottom-left-pane div.merged-cell { + z-index: 15 !important; + } + + // SHEET FREEZE PANES + .top-left-pane, + .top-right-pane, + .bottom-left-pane { + @include box-sizing(border-box); + border-right: $spreadsheet-freeze-pane-border; + border-bottom: $spreadsheet-freeze-pane-border; + overflow: visible; + position: absolute; + + &.inactive { + border-right: 0; + border-bottom: 0; + } + } + + .bottom-left-pane { + height: 100%; + left: 0; + padding-bottom: $spreadsheet-bottom-bar-height; + z-index: 10; + + .rh { + left: 0; + margin-top: 0 !important; + } + + .cell, .sheet-image { + margin-left: $spreadsheet-row-header-width; + } + + .sheet-selection { + margin-left: $spreadsheet-row-header-width + $spreadsheet-border-width; + } + } + + .top-left-pane { + left: 0; + top: 30px; + z-index: 20; + + .ch { + top: 0; + margin-left: $spreadsheet-row-header-width; + } + + .rh { + left: 0; + margin-top: $spreadsheet-col-header-height; + } + + .cell, .sheet-image { + margin-top: $spreadsheet-col-header-height; + margin-left: $spreadsheet-row-header-width; + } + + .sheet-selection { + margin-top: $spreadsheet-col-header-height + $spreadsheet-border-width; + margin-left: $spreadsheet-row-header-width + $spreadsheet-border-width; + } + } + + .top-right-pane { + top: $spreadsheet-toolbar-height + $spreadsheet-border-width; + width: 100%; + z-index: 11; + + .ch { + top: 0; + margin-left: 0 !important; + } + + .cell, .sheet-image { + margin-top: $spreadsheet-col-header-height; + } + + .sheet-selection { + margin-top: $spreadsheet-col-header-height + $spreadsheet-border-width; + } + } + + &.noheaders { + .top-left-pane, .top-right-pane { + .cell, .sheet-image { + margin-top: 0; + } + .sheet-selection { + margin-top: $spreadsheet-border-width; + } + } + + .top-left-pane, .bottom-left-pane { + .cell, .sheet-image { + margin-left: 0; + } + .sheet-selection { + margin-left: $spreadsheet-border-width; + } + } + } + + // SHEET HEADERS + .ch, .rh, .corner { + background-color: $spreadsheet-header-bg-color; + font-family: Helvetica; + font-size: $spreadsheet-header-font-size; + overflow: hidden; + position: absolute; + text-align: center; + } + + .rh { + @include box-sizing(border-box); + @include user-select(none); + border-right: $spreadsheet-header-border; + cursor: e-resize; + -webkit-touch-callout: none; + width: $spreadsheet-row-header-width; + z-index: 29; + display: flex; + justify-content: center; + vertical-align: middle; + flex-direction: column; + line-height: 100%; + + &.selected-row-header { + background: $spreadsheet-selected-header-bg-color !important; + border-right: $spreadsheet-border-width * 2 solid $spreadsheet-selected-header-border-color; + } + + .header-resize-dnd-first, + .header-resize-dnd-second { + background: transparent; + cursor: row-resize; + height: $spreadsheet-resize-handle-size; + position: absolute; + left: 0; + width: $spreadsheet-row-header-width - $spreadsheet-border-width; + z-index: 30; + } + + .header-resize-dnd-first { + top: 0; + } + + .header-resize-dnd-second { + border-bottom: $spreadsheet-header-border; + bottom: 0; + } + + &.resize-extra { + border-bottom: $spreadsheet-header-border; + } + } + + .ch { + @include valo-gradient($color: $spreadsheet-header-bg-color); + @include box-sizing(border-box); + @include user-select(none); + border-bottom: $spreadsheet-header-border; + cursor: s-resize; + height: $spreadsheet-col-header-height; + line-height: $spreadsheet-col-header-height; + -webkit-touch-callout: none; + z-index: 29; + + &.selected-column-header { + background: $spreadsheet-selected-header-bg-color !important; + border-bottom: $spreadsheet-border-width * 2 solid $spreadsheet-selected-header-border-color; + } + + .header-resize-dnd-first, + .header-resize-dnd-second { + background: transparent; + cursor: col-resize; + height: $spreadsheet-col-header-height; + position: absolute; + top: 0; + width: $spreadsheet-resize-handle-size; + z-index: 30; + } + + .header-resize-dnd-first { + left: 0; + } + + .header-resize-dnd-second { + border-right: $spreadsheet-header-border; + right: 0; + } + + &.resize-extra { + border-right: $spreadsheet-header-border; + } + } + + &.protected.lock-format-columns .ch, + &.protected.lock-format-rows .rh { + .header-resize-dnd-first, + .header-resize-dnd-second { + cursor: default; + } + } + + &.noheaders { + padding-left: 0px; + padding-top: $spreadsheet-toolbar-height + $spreadsheet-border-width; + .ch, .rh, .corner { + display: none; + } + } + + .ch.col1 .header-resize-dnd-first, + .rh.row1 .header-resize-dnd-first { + display: none; + } + + > div.resize-line { + background: $spreadsheet-resize-line-color; + } + + .resize-line, + .sheet > div.resize-line { + border: none; + height: 0; + padding: 0; + visibility: hidden; + width: 0; + z-index: 25; + position: absolute; + } + + &.col-resizing { + .resize-line, + .sheet > div.resize-line { + height: 100%; + visibility: visible; + width: $spreadsheet-border-width; + } + + > .resize-line { + margin-left: $spreadsheet-row-header-width - $spreadsheet-border-width; + margin-top: -($spreadsheet-col-header-height + $spreadsheet-border-width); + } + + .sheet > div.resize-line { + margin-left: -$spreadsheet-border-width; + } + } + + &.row-resizing { + .resize-line, .sheet > div.resize-line { + height: $spreadsheet-border-width; + visibility: visible; + width: 100%; + } + + > .resize-line { + margin-top: $spreadsheet-toolbar-height + $spreadsheet-bottom-bar-height - $spreadsheet-border-width; + margin-left: -$spreadsheet-row-header-width; + } + + .sheet > div.resize-line { + margin-top: -$spreadsheet-border-width;; + } + } + + .corner { + @include valo-gradient($color: $spreadsheet-header-bg-color); + @include box-sizing(border-box); + cursor: default; + top: $spreadsheet-toolbar-height + $spreadsheet-border-width; + left: 0; + width: $spreadsheet-row-header-width; + height: $spreadsheet-col-header-height; + border-bottom: $spreadsheet-header-border; + border-right: $spreadsheet-header-border; + z-index: 100; + } + + // SHEET IMAGES + .sheet > div.sheet-image { + background: transparent; + border: none; + cursor: default; + height: auto; + width: auto; + position: absolute; + } + + .bottom-right-pane.sheet > div.sheet-image { + z-index: 10; + } + + .top-left-pane > div.sheet-image { + z-index: 25; + } + + .top-right-pane, + .bottom-left-pane { + > div.sheet-image { + z-index: 15; + } + } + + // CELL COMMENT + .sheet { + .cell-comment-triangle { + border-color: transparent $spreadsheet-cell-comment-triangle-color transparent transparent; + border-style: solid; + border-width: 0 9px 9px 0; + height: 0; + line-height: 0; + margin: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 0; + z-index: 1; + } + + .cell-invalidformula-triangle { + border-color: transparent $spreadsheet-cell-invalidformula-triangle-color transparent transparent; + border-style: solid; + border-width: 0 9px 9px 0; + height: 0; + line-height: 0; + margin: 0; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 0; + z-index: 2; + } + + .comment-overlay-line { + background-color: $spreadsheet-cell-comment-line-color !important; + border: none !important; + display: block !important; + height: 1px; + padding: 0; + position: absolute; + -webkit-transform-origin: 0% 50%; + -ms-transform-origin: 0% 50%; + transform-origin: 0% 50%; + z-index: 21; + } + } + + // SELECTION WIDGET + div.sheet-selection { + background-color: transparent !important; + border: none !important; + display: block; + position: absolute; + width: 0px; + height: 0px; + overflow: visible; + pointer-events: none; + margin-left: $spreadsheet-border-width; + margin-top: $spreadsheet-border-width; + + &.col0.row0 { + display: none; + } + } + + &.notfocused .sheet-selection { + opacity: 0.6; + } + + .sheet-selection { + .s-top, .s-left, .s-bottom, .s-right { + padding: 0; + background-color: $spreadsheet-sheet-selection-border-color; + position: absolute; + + &.extend { + background-color: $spreadsheet-sheet-selection-extend-corner-color !important; + } + } + + .s-top { + top: -$spreadsheet-selection-widget-border-width; + left: -$spreadsheet-selection-widget-border-width; + height: $spreadsheet-selection-widget-border-width; + pointer-events: all; + } + + .s-left { + width: $spreadsheet-selection-widget-border-width; + padding-bottom: 1px; + } + + .s-bottom { + height: $spreadsheet-selection-widget-border-width; + bottom: 0; + } + + .s-right { + right: 0; + width: $spreadsheet-selection-widget-border-width; + } + + .s-corner { + background-color: $spreadsheet-sheet-selection-extend-corner-color; + position: absolute; + bottom: -2px; + left: -2px; + height: $spreadsheet-selection-widget-corner-size; + width: $spreadsheet-selection-widget-corner-size; + outline: 2px solid white; + cursor: crosshair; + } + + &.paintmode { + background-color: $spreadsheet-sheet-selection-extend-inside-bg-color !important; + .s-top, .s-left, .s-bottom, .s-right { + background-color: $spreadsheet-sheet-selection-extend-corner-color; + } + } + } + + // SHEET TABSHEET + .sheet-tabsheet { + background: $spreadsheet-sheet-selector-background; + border-top: $spreadsheet-border; + height: $spreadsheet-bottom-bar-height; + width: 100%; + cursor: default; + position: absolute; + bottom: 0; + left: 0; + overflow: hidden; + z-index: 50; + + .sheet-tabsheet-options { + background: $spreadsheet-sheet-selector-background; + cursor: pointer; + display: inline-block; + height: $spreadsheet-bottom-bar-height; + position: absolute; + width: $spreadsheet-tab-action-button-width * 5; + z-index: 60; + left: 0; + top: 0; + + div { + line-height: $spreadsheet-bottom-bar-height + $spreadsheet-border-width; + width: $spreadsheet-tab-action-button-width; + cursor: pointer; + display: inline-block; + font-weight: bold; + position: relative; + text-align: center; + z-index: inherit; + + color: $spreadsheet-tab-action-button-color; + font-family: FontAwesome; + + &.scroll-tabs-beginning::before { + content: "\f053\f053"; + } + + &.scroll-tabs-end::before { + content: "\f054\f054"; + } + + &.scroll-tabs-left::before { + content: "\f053"; + } + + &.scroll-tabs-right::before { + content: "\f054"; + } + + &.add-new-tab::before { + content: "\f067"; + } + + &:hover { + color: $spreadsheet-sheet-selection-border-color; + } + + &.hidden { + color: $spreadsheet-tab-action-button-inactive-color; + cursor: default; + } + } + } + + .sheet-tabsheet-container { + @include transition(margin-left 200ms); + display: inline-block; + left: $spreadsheet-tab-action-button-width * 5; + position: absolute; + z-index: inherit; + margin-right: $spreadsheet-status-label-width + $spreadsheet-field-padding + $spreadsheet-border-width; + height: $spreadsheet-tab-height + 2 * $spreadsheet-tab-padding-vertical + $spreadsheet-border-width; + overflow: hidden; + white-space: nowrap; + + .sheet-tabsheet-tab { + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-tab-font-size; + font-weight: 300; + background: $spreadsheet-inactive-tab-background; + color: $spreadsheet-inactive-tab-text-color; + border: $spreadsheet-border; + border-top: none; + border-bottom-right-radius: $spreadsheet-tab-border-radius; + border-bottom-left-radius: $spreadsheet-tab-border-radius; + cursor: pointer; + display: inline-block; + height: $spreadsheet-tab-height; + margin-left: $spreadsheet-field-padding; + max-width: $spreadsheet-tab-max-width; + min-width: $spreadsheet-tab-min-width; + overflow: hidden; + padding: $spreadsheet-tab-padding-vertical $spreadsheet-tab-padding-horizontal; + position: relative; + text-align: center; + text-overflow: ellipsis; + top: -$spreadsheet-border-width; + z-index: inherit; + + &.selected-tab { + background: $spreadsheet-active-tab-background; + cursor: default; + color: $spreadsheet-active-tab-text-color; + max-width: none; + position: relative; + + input[type="text"] { + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-tab-font-size; + color: $spreadsheet-active-tab-text-color; + border: none !important; + font-weight: 300; + height: $spreadsheet-tab-height; + outline: none !important; + padding: 0 !important; + position: relative; + top: 0; + left: 0; + width: inherit; + } + } + } + } + + .sheet-tabsheet-temp { + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-tab-font-size; + display: inline; + left: -5000px; + position: fixed; + white-space-collapse: preserve; + } + + .sheet-tabsheet-infolabel { + background: $spreadsheet-sheet-selector-background; + z-index: inherit; + position: absolute; + right: 0; + font-weight: bold; + font-size: $spreadsheet-status-label-font-size; + border-left: $spreadsheet-border; + padding-left: $spreadsheet-field-padding; + padding-right: $spreadsheet-field-padding; + width: $spreadsheet-status-label-width; + height: 100%; + line-height: $spreadsheet-bottom-bar-height + $spreadsheet-border-width; + display: inline; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + } + + .sheet-tabsheet, + .sheet-tabsheet div { + -webkit-touch-callout: none; + @include user-select(none); + } + + // FILTER BUTTON + .sheet div div.popupbutton { + @include valo-button-style($padding: 0); + @include valo-button-static-style(); + + position: absolute; + bottom: $spreadsheet-popup-button-margin; + right: $spreadsheet-popup-button-margin; + cursor: pointer; + height: $spreadsheet-popup-button-size; + width: $spreadsheet-popup-button-size; + outline: none; + background: url(triangle-inactive.png); + background-size: 100% 100%; + box-shadow: none; + border:none; + } + + // FILTER ACTIVE BUTTON + .sheet div div.popupbutton.active { + background: url(triangle-active.png); + background-size: 100% 100%; + } + + // TOUCH STYLES + .sheet-selection.touch { + &.fill { + .fill-touch-square { + position: relative; + width: $spreadsheet-fill-square-toucharea-size; + height: $spreadsheet-fill-square-toucharea-size; + margin-left: $spreadsheet-fill-square-toucharea-offset; + top: $spreadsheet-fill-square-toucharea-offset; + > .square { + position: absolute; + background-color: $spreadsheet-sheet-selection-extend-corner-color; + width: $spreadsheet-fill-square-size; + height: $spreadsheet-fill-square-size; + border: $spreadsheet-fill-square-border; + top: $spreadsheet-fill-square-offset; + } + } + .s-right, .s-left { + > .fill-touch-square { + top: 50%; + margin-top: $spreadsheet-fill-square-toucharea-offset; + > .square { + top: $spreadsheet-fill-square-lr-offset; + left: $spreadsheet-fill-square-lr-offset; + } + } + } + .s-top { + > .fill-touch-square { + top: -$spreadsheet-fill-square-top-offset; + left: 50%; + > .square { + left: 50%; + margin-top: $spreadsheet-fill-square-top-offset; + margin-left: $spreadsheet-fill-square-offset; + } + } + } + .s-bottom { + > .fill-touch-square { + top: -$spreadsheet-fill-square-bottom-offset; + left: 50%; + > .square { + left: 50%; + margin-top: $spreadsheet-fill-square-bottom-offset; + margin-left: $spreadsheet-fill-square-offset; + } + } + } + } + + .s-corner { + width: $spreadsheet-touch-corner-size; + height: $spreadsheet-touch-corner-size; + left: $spreadsheet-touch-corner-left-offset; + bottom: $spreadsheet-touch-corner-bottom-offset; + background-color: $spreadsheet-sheet-selection-corner-color; + border-radius: $spreadsheet-touch-corner-border-radius; + } + + .s-corner-touch { + width: $spreadsheet-toucharea-corner-size; + height: $spreadsheet-toucharea-corner-size; + position: absolute; + left: $spreadsheet-toucharea-corner-left-offset; + bottom: $spreadsheet-toucharea-corner-bottom-offset; + } + } + + @include grouping; + } + + // CELL COMMENT OVERLAY STYLES + .v-spreadsheet-comment-overlay { + @include valo-overlay-style; + padding: round($spreadsheet-base-font-size / 2); + overflow-y: auto !important; + overflow-x: hidden !important; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + + .popupContent { + overflow: visible; + } + + .comment-overlay-author { + padding-bottom: round($spreadsheet-base-font-size / 2); + font-size: round($spreadsheet-base-font-size * 0.75); + font-weight: bold; + white-space: nowrap; + } + + .comment-overlay-invalidformula { + color: $v-error-indicator-color; + max-width: 12 * $spreadsheet-base-font-size; + max-height: 10 * $spreadsheet-base-font-size; + white-space: pre-wrap; + word-wrap: break-word; + } + + .comment-overlay-label { + max-width: 12 * $spreadsheet-base-font-size; + max-height: 10 * $spreadsheet-base-font-size; + white-space: pre-wrap; + word-wrap: break-word; + } + + .comment-overlay-input { + max-width: 12 * $spreadsheet-base-font-size; + max-height: 10 * $spreadsheet-base-font-size; + font-family: $spreadsheet-base-font-family; + font-size: $spreadsheet-base-font-size; + font-weight: 300; + outline: none; + border: none; + } + + .comment-overlay-separator { + border-bottom: $spreadsheet-border; + margin-bottom: 7px; + } + } + + // FILTER OVERLAY STYLES + .v-spreadsheet-popupbutton-overlay { + @include valo-overlay-style; + + .v-panel.spreadsheet-item-filter-layout { + background-color: transparent; + border: none; + height: $spreadsheet-popup-button-overlay-height; + + .v-panel-captionwrap, + .v-panel-content, + .v-panel-deco { + background-color: transparent; + border: none; + } + } + } + + .v-spreadsheet-popupbutton-overlay-header { + background: $spreadsheet-popup-overlay-bg-color; + height: $spreadsheet-popupbutton-header-sizing; + position: relative; + width: 100%; + padding-bottom: round($spreadsheet-base-font-size / 2); + + .v-window-closebox { + position: absolute; + left: 0px; + top: 0px; + width: $spreadsheet-popupbutton-header-sizing; + height: $spreadsheet-popupbutton-header-sizing; + line-height: $spreadsheet-popupbutton-header-sizing; + } + + .header-caption { + margin: 0 $spreadsheet-popupbutton-header-sizing; + height: $spreadsheet-popupbutton-header-sizing; + line-height: $spreadsheet-popupbutton-header-sizing; + text-align: center; + } + } + + .cell-range-bg-color { + background-color: $spreadsheet-sheet-selection-range-bg-color; + } + +} diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/spreadsheet.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/spreadsheet.scss new file mode 100644 index 0000000..1dbecdb --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/spreadsheet.scss @@ -0,0 +1,45 @@ +@import "spreadsheet-valo"; +@import "spreadsheet-legacy"; + +$v-color-keywords: non-valo-theme !default; + +@mixin spreadsheet { + + // Very nice workaround for missing variable-exists function + @if $v-color-keywords == non-valo-theme { + @include spreadsheet-legacy; + } @else { + @include spreadsheet-valo; + } + + span.code-snippet { + font-family: "Courier New",Courier,monospace; + } + + .v-label-overlay-content { + padding: 10px; + } + + .sheet-image > .v-csslayout { + overflow: visible; + position: relative; + + .v-button-minimize-button { + top: -14px; + position: absolute; + height: auto; + padding: 0; + + &::after { + -webkit-box-shadow: none; + -moz-shadow: none; + -ms-shadow: none; + box-shadow: none; + } + + .v-button-caption { + display: none; + } + } + } +} \ No newline at end of file diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/styles/_grouping.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/styles/_grouping.scss new file mode 100644 index 0000000..b49a48a --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/styles/_grouping.scss @@ -0,0 +1,208 @@ +@mixin grouping { + .col-group-pane, + .col-group-freeze-pane { + position: absolute; + left: 0; + width: 100%; + + z-index: 11; + background-color: $address-field-background; + + border-bottom: $header-border; + box-sizing: border-box; + + .grouping { + position: absolute; + height: 7px; + border-top: 2px solid $spreadsheet-header-grouping-color; + border-left: 2px solid $spreadsheet-header-grouping-color; + cursor: pointer; + + .expand { + position: relative; + top: -7px; + float: right; + right: -4px; + height: 12px; + width: 12px; + background-color: $spreadsheet-header-grouping-color; + color: white; + border: none; + line-height: 11px; + text-align: center; + vertical-align: middle; + border-radius: 50%; + font-size: 12px; + } + + &.plus { + border: none; + + .expand { + top: -5px; + } + } + } + + .grouping.inversed { + border-right: 2px solid $spreadsheet-header-grouping-color; + border-left: none; + .expand { + right: initial; + left: -4px; + float: none; + } + } + + } + .col-group-freeze-pane { + overflow: hidden; + border-right: $spreadsheet-freeze-pane-border; + } + + .col-group-border { + position: absolute; + + .border { + position: absolute; + width: 100%; + z-index: 15; + border-bottom: 1px dotted $spreadsheet-header-grouping-color; + margin-top: 20px; + } + } + + .row-group-pane, + .row-group-freeze-pane { + position: absolute; + left: 0; + height: 100%; + + z-index: 11; + background-color: $address-field-background; + + border-right: $header-border; + box-sizing: border-box; + + .grouping { + position: absolute; + width: 8px; + border-top: 2px solid $spreadsheet-header-grouping-color; + border-left: 2px solid $spreadsheet-header-grouping-color; + cursor: pointer; + + &.plus { + border: none; + } + + .expand { + position: absolute; + bottom: -4px; + right: 2px; + height: 12px; + width: 12px; + background-color: $spreadsheet-header-grouping-color; + color: white; + border: none; + line-height: 11px; + text-align: center; + vertical-align: middle; + border-radius: 50%; + font-size: 12px; + } + + &.plus { + .expand { + right: 0; + } + } + } + .grouping.inversed { + border-top: none; + border-bottom: 2px solid $spreadsheet-header-grouping-color; + .expand { + bottom: initial; + top: -5px; + } + } + } + .row-group-freeze-pane { + overflow: hidden; + border-bottom: $spreadsheet-freeze-pane-border; + } + + .row-group-border { + position: absolute; + + .border { + position: absolute; + height: 100%; + z-index: 15; + border-right: 1px dotted $spreadsheet-header-grouping-color; + /*margin-top: 20px;*/ + } + } + + .expandbutton { + height: 18px; + width: 11px; + line-height: 18px; + font-size: 11px; + text-align: center; + cursor: pointer; + color: darken($spreadsheet-header-grouping-color, 50%); + + span { + vertical-align: text-top; + } + } + + .expandbutton:active { + border-color: gray; + } + + .col-group-summary { + .expandbutton { + margin-left: auto; + margin-right: 4px; + /*margin-top: 7px;*/ + } + } + .row-group-summary { + .expandbutton { + display: inline-block; + margin-left: 4px; + } + } + + .grouping-corner { + position: absolute; + left: 0; + z-index: 15; + border-right: $header-border; + border-bottom: $header-border; + box-sizing: border-box; + background-color: $address-field-background; + } + .col-group-summary { + position: absolute; + box-sizing: border-box; + border-bottom: $header-border; + border-right: $header-border; + background-color: $address-field-background; + z-index: 15; + } + .row-group-summary { + position: absolute; + box-sizing: border-box; + border-bottom: $header-border; + border-right: $header-border; + background-color: $address-field-background; + left: 0; + z-index: 15; + } + + .v-ie & .grouping .expand { + line-height: 13px; + } +} diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-hor.png b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-hor.png new file mode 100644 index 0000000..5935806 Binary files /dev/null and b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-hor.png differ diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-vert.png b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-vert.png new file mode 100644 index 0000000..4f8f76d Binary files /dev/null and b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/touch-border-vert.png differ diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-active.png b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-active.png new file mode 100644 index 0000000..3f7084c Binary files /dev/null and b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-active.png differ diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-inactive.png b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-inactive.png new file mode 100644 index 0000000..c2ccc50 Binary files /dev/null and b/ksdtoolkit-webapp/src/main/webapp/VAADIN/addons/spreadsheet/triangle-inactive.png differ diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/favicon.ico b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/favicon.ico new file mode 100644 index 0000000..ffb34a6 Binary files /dev/null and b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/favicon.ico differ diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss new file mode 100644 index 0000000..8309242 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss @@ -0,0 +1,72 @@ +// If you edit this file you need to compile the theme. See README.md for details. + +// Global variable overrides. Must be declared before importing Valo. + +// Defines the plaintext font size, weight and family. Font size affects general component sizing. +//$v-font-size: 16px; +//$v-font-weight: 300; +//$v-font-family: "Open Sans", sans-serif; + +// Defines the border used by all components. +//$v-border: 1px solid (v-shade 0.7); +//$v-border-radius: 4px; + +// Affects the color of some component elements, e.g Button, Panel title, etc +//$v-background-color: hsl(210, 0%, 98%); +// Affects the color of content areas, e.g Panel and Window content, TextField input etc +//$v-app-background-color: $v-background-color; + +// Affects the visual appearance of all components +//$v-gradient: v-linear 8%; +//$v-bevel-depth: 30%; +//$v-shadow-opacity: 5%; + +// Defines colors for indicating status (focus, success, failure) +//$v-focus-color: valo-focus-color(); // Calculates a suitable color automatically +//$v-friendly-color: #2c9720; +//$v-error-indicator-color: #ed473b; + +// For more information, see: https://vaadin.com/book/-/page/themes.valo.html +// Example variants can be copy/pasted from https://vaadin.com/wiki/-/wiki/Main/Valo+Examples + +@import "../valo/valo.scss"; +@import "addons.scss"; + +@mixin mytheme { + @include valo; + @include addons; + + // Insert your own theme rules here + + .smallgrid .v-grid-body .v-grid-cell { + line-height: 18px; // adjust to your needs + font-size: 12px; // adjust to your needs + } + + .csslayout{ + //text-align: left; + //font-size: 12px; + padding-left: 10px; + padding-right: 10px; + } + + .leftPosition{ + float: left; + } + + .rightPosition{ + float: right; + } + + .v-csslayout-margin { + padding-left: 10px; + padding-right: 10px; + padding-bottom: 10px; + } + + .v-textfield-my-text{ + text-align:right !important; + } + +} + diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss new file mode 100644 index 0000000..29425c5 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss @@ -0,0 +1,10 @@ +@import "mytheme.scss"; +@import "addons.scss"; + +// This file prefixes all rules with the theme name to avoid causing conflicts with other themes. +// The actual styles should be defined in mytheme.scss + +.mytheme { + @include addons; + @include mytheme; +} diff --git a/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss.cache b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss.cache new file mode 100644 index 0000000..2177c30 --- /dev/null +++ b/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss.cache @@ -0,0 +1 @@ +{"version":"8.5.2","timestamp":"1606606208150","uris":["C:/Users/Fibrillator/Documents/JAVA-KOTLIN/MyApps/MyCode - 01B_Kotlin SD Toolkit/ksdtoolkit/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/styles.scss","VAADIN/themes/valo/_valo.scss","VAADIN/themes/valo/shared/_variables.scss","VAADIN/themes/valo/util/_color.scss","VAADIN/themes/valo/util/_blend-modes.scss","VAADIN/themes/valo/util/bourbon/_bourbon.scss","VAADIN/themes/valo/util/bourbon/settings/_prefixer.scss","VAADIN/themes/valo/util/bourbon/settings/_px-to-em.scss","VAADIN/themes/valo/util/bourbon/settings/_asset-pipeline.scss","VAADIN/themes/valo/util/bourbon/helpers/_gradient-positions-parser.scss","VAADIN/themes/valo/util/bourbon/helpers/_linear-positions-parser.scss","VAADIN/themes/valo/util/bourbon/helpers/_radial-arg-parser.scss","VAADIN/themes/valo/util/bourbon/helpers/_radial-positions-parser.scss","VAADIN/themes/valo/util/bourbon/helpers/_render-gradients.scss","VAADIN/themes/valo/util/bourbon/helpers/_shape-size-stripper.scss","VAADIN/themes/valo/util/bourbon/functions/_color-lightness.scss","VAADIN/themes/valo/util/bourbon/functions/_flex-grid.scss","VAADIN/themes/valo/util/bourbon/functions/_golden-ratio.scss","VAADIN/themes/valo/util/bourbon/functions/_grid-width.scss","VAADIN/themes/valo/util/bourbon/functions/_linear-gradient.scss","VAADIN/themes/valo/util/bourbon/functions/_modular-scale.scss","VAADIN/themes/valo/util/bourbon/functions/_px-to-em.scss","VAADIN/themes/valo/util/bourbon/functions/_px-to-rem.scss","VAADIN/themes/valo/util/bourbon/functions/_radial-gradient.scss","VAADIN/themes/valo/util/bourbon/functions/_strip-units.scss","VAADIN/themes/valo/util/bourbon/functions/_tint-shade.scss","VAADIN/themes/valo/util/bourbon/functions/_transition-property-name.scss","VAADIN/themes/valo/util/bourbon/functions/_unpack.scss","VAADIN/themes/valo/util/bourbon/css3/_animation.scss","VAADIN/themes/valo/util/bourbon/css3/_appearance.scss","VAADIN/themes/valo/util/bourbon/css3/_backface-visibility.scss","VAADIN/themes/valo/util/bourbon/css3/_background.scss","VAADIN/themes/valo/util/bourbon/css3/_background-image.scss","VAADIN/themes/valo/util/bourbon/css3/_border-image.scss","VAADIN/themes/valo/util/bourbon/css3/_border-radius.scss","VAADIN/themes/valo/util/bourbon/css3/_box-sizing.scss","VAADIN/themes/valo/util/bourbon/css3/_calc.scss","VAADIN/themes/valo/util/bourbon/css3/_columns.scss","VAADIN/themes/valo/util/bourbon/css3/_filter.scss","VAADIN/themes/valo/util/bourbon/css3/_flex-box.scss","VAADIN/themes/valo/util/bourbon/css3/_font-face.scss","VAADIN/themes/valo/util/bourbon/css3/_font-feature-settings.scss","VAADIN/themes/valo/util/bourbon/css3/_hyphens.scss","VAADIN/themes/valo/util/bourbon/css3/_hidpi-media-query.scss","VAADIN/themes/valo/util/bourbon/css3/_image-rendering.scss","VAADIN/themes/valo/util/bourbon/css3/_inline-block.scss","VAADIN/themes/valo/util/bourbon/css3/_keyframes.scss","VAADIN/themes/valo/util/bourbon/css3/_linear-gradient.scss","VAADIN/themes/valo/util/bourbon/css3/_perspective.scss","VAADIN/themes/valo/util/bourbon/css3/_radial-gradient.scss","VAADIN/themes/valo/util/bourbon/css3/_transform.scss","VAADIN/themes/valo/util/bourbon/css3/_transition.scss","VAADIN/themes/valo/util/bourbon/css3/_user-select.scss","VAADIN/themes/valo/util/bourbon/css3/_placeholder.scss","VAADIN/themes/valo/util/bourbon/addons/_button.scss","VAADIN/themes/valo/util/bourbon/addons/_clearfix.scss","VAADIN/themes/valo/util/bourbon/addons/_directional-values.scss","VAADIN/themes/valo/util/bourbon/addons/_ellipsis.scss","VAADIN/themes/valo/util/bourbon/addons/_font-family.scss","VAADIN/themes/valo/util/bourbon/addons/_hide-text.scss","VAADIN/themes/valo/util/bourbon/addons/_html5-input-types.scss","VAADIN/themes/valo/util/bourbon/addons/_position.scss","VAADIN/themes/valo/util/bourbon/addons/_prefixer.scss","VAADIN/themes/valo/util/bourbon/addons/_retina-image.scss","VAADIN/themes/valo/util/bourbon/addons/_size.scss","VAADIN/themes/valo/util/bourbon/addons/_timing-functions.scss","VAADIN/themes/valo/util/bourbon/addons/_triangle.scss","VAADIN/themes/valo/util/bourbon/addons/_word-wrap.scss","VAADIN/themes/valo/util/bourbon/_bourbon-deprecated-upcoming.scss","VAADIN/themes/valo/util/_lists.scss","VAADIN/themes/valo/util/_css3.scss","VAADIN/themes/valo/util/_color.scss","VAADIN/themes/valo/util/_blend-modes.scss","VAADIN/themes/valo/util/_anim.scss","VAADIN/themes/valo/util/_gradient.scss","VAADIN/themes/valo/util/_bevel-and-shadow.scss","VAADIN/themes/valo/util/_util.scss","VAADIN/themes/valo/fonts/_fonts.scss","VAADIN/themes/valo/fonts/open-sans/_open-sans.scss","VAADIN/themes/valo/fonts/source-sans-pro/_source-sans-pro.scss","VAADIN/themes/valo/fonts/roboto/_roboto.scss","VAADIN/themes/valo/fonts/lato/_lato.scss","VAADIN/themes/valo/fonts/lora/_lora.scss","VAADIN/themes/valo/fonts/vaadin-icons/_vaadin-icons.scss","VAADIN/themes/valo/shared/_global.scss","VAADIN/themes/valo/shared/_loading-indicator.scss","VAADIN/themes/valo/shared/_contextmenu.scss","VAADIN/themes/valo/shared/_overlay.scss","VAADIN/themes/valo/shared/_tooltip.scss","VAADIN/themes/valo/shared/_reconnect-dialog.scss","VAADIN/themes/valo/components/_all.scss","VAADIN/themes/valo/components/_absolutelayout.scss","VAADIN/themes/valo/components/_accordion.scss","VAADIN/themes/valo/components/_button.scss","VAADIN/themes/valo/components/_calendar.scss","VAADIN/themes/valo/components/_checkbox.scss","VAADIN/themes/valo/components/_colorpicker.scss","VAADIN/themes/valo/components/_combobox.scss","VAADIN/themes/valo/components/_csslayout.scss","VAADIN/themes/valo/components/_customcomponent.scss","VAADIN/themes/valo/components/_customlayout.scss","VAADIN/themes/valo/components/_datefield.scss","VAADIN/themes/valo/components/_dragwrapper.scss","VAADIN/themes/valo/components/_form.scss","VAADIN/themes/valo/components/_formlayout.scss","VAADIN/themes/valo/components/_grid.scss","VAADIN/themes/valo/components/_table.scss","VAADIN/themes/valo/components/_escalator.scss","VAADIN/themes/valo/components/_gridlayout.scss","VAADIN/themes/valo/components/_label.scss","VAADIN/themes/valo/components/_link.scss","VAADIN/themes/valo/components/_loginform.scss","VAADIN/themes/valo/components/_menubar.scss","VAADIN/themes/valo/components/_nativebutton.scss","VAADIN/themes/valo/components/_nativeselect.scss","VAADIN/themes/valo/components/_notification.scss","VAADIN/themes/valo/components/_optiongroup.scss","VAADIN/themes/valo/components/_orderedlayout.scss","VAADIN/themes/valo/components/_panel.scss","VAADIN/themes/valo/components/_popupview.scss","VAADIN/themes/valo/components/_progressbar.scss","VAADIN/themes/valo/components/_richtextarea.scss","VAADIN/themes/valo/components/_slider.scss","VAADIN/themes/valo/components/_splitpanel.scss","VAADIN/themes/valo/components/_table.scss","VAADIN/themes/valo/components/_tabsheet.scss","VAADIN/themes/valo/components/_textfield.scss","VAADIN/themes/valo/components/_textarea.scss","VAADIN/themes/valo/components/_tree.scss","VAADIN/themes/valo/components/_treegrid.scss","VAADIN/themes/valo/components/_grid.scss","VAADIN/themes/valo/components/_table.scss","VAADIN/themes/valo/components/_escalator.scss","VAADIN/themes/valo/components/_tree8.scss","VAADIN/themes/valo/components/_treegrid.scss","VAADIN/themes/valo/components/_grid.scss","VAADIN/themes/valo/components/_table.scss","VAADIN/themes/valo/components/_escalator.scss","VAADIN/themes/valo/components/_treetable.scss","VAADIN/themes/valo/components/_twincolselect.scss","VAADIN/themes/valo/components/_upload.scss","VAADIN/themes/valo/components/_widget.scss","VAADIN/themes/valo/components/_window.scss","VAADIN/themes/valo/components/_valo-menu.scss","C:/Users/Fibrillator/Documents/JAVA-KOTLIN/MyApps/MyCode - 01B_Kotlin SD Toolkit/ksdtoolkit/ksdtoolkit-webapp/src/main/webapp/VAADIN/themes/mytheme/mytheme.scss"],"css":"/**\n * Checks if a list contains a certain value.\n * \n * @param {list} $list - the list to check\n * @param {value} $var - the value to search for\n * @param {bool} $recursive (false) - should any contained lists be checked for the value\n * \n * @return {bool} true if the value is found from the list, false otherwise\n * \n * @group lists\n */\n\n/**\n * Cross-browser opacity.\n *\n * @param {number} $value - opacity value from 0 to 1\n * @param {bool} $important (false) - should the property value be declared with !important\n *\n * @group util\n */\n\n@-webkit-keyframes valo-animate-in-fade {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t}\n\n@-moz-keyframes valo-animate-in-fade {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t}\n\n@keyframes valo-animate-in-fade {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-fade {\n\t\t100% {\n\t\topacity: 0;\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-fade {\n\t\t100% {\n\t\topacity: 0;\n\t}\n\t}\n\n@keyframes valo-animate-out-fade {\n\t\t100% {\n\t\topacity: 0;\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-in-slide-down {\n\t\t0% {\n\t\t-webkit-transform: translateY(-100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-in-slide-down {\n\t\t0% {\n\t\t-moz-transform: translateY(-100%);\n\t}\n\t}\n\n@keyframes valo-animate-in-slide-down {\n\t\t0% {\n\t\t-webkit-transform: translateY(-100%);\n\t\t-moz-transform: translateY(-100%);\n\t\t-ms-transform: translateY(-100%);\n\t\t-o-transform: translateY(-100%);\n\t\ttransform: translateY(-100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-in-slide-up {\n\t\t0% {\n\t\t-webkit-transform: translateY(100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-in-slide-up {\n\t\t0% {\n\t\t-moz-transform: translateY(100%);\n\t}\n\t}\n\n@keyframes valo-animate-in-slide-up {\n\t\t0% {\n\t\t-webkit-transform: translateY(100%);\n\t\t-moz-transform: translateY(100%);\n\t\t-ms-transform: translateY(100%);\n\t\t-o-transform: translateY(100%);\n\t\ttransform: translateY(100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-in-slide-left {\n\t\t0% {\n\t\t-webkit-transform: translateX(100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-in-slide-left {\n\t\t0% {\n\t\t-moz-transform: translateX(100%);\n\t}\n\t}\n\n@keyframes valo-animate-in-slide-left {\n\t\t0% {\n\t\t-webkit-transform: translateX(100%);\n\t\t-moz-transform: translateX(100%);\n\t\t-ms-transform: translateX(100%);\n\t\t-o-transform: translateX(100%);\n\t\ttransform: translateX(100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-in-slide-right {\n\t\t0% {\n\t\t-webkit-transform: translateX(-100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-in-slide-right {\n\t\t0% {\n\t\t-moz-transform: translateX(-100%);\n\t}\n\t}\n\n@keyframes valo-animate-in-slide-right {\n\t\t0% {\n\t\t-webkit-transform: translateX(-100%);\n\t\t-moz-transform: translateX(-100%);\n\t\t-ms-transform: translateX(-100%);\n\t\t-o-transform: translateX(-100%);\n\t\ttransform: translateX(-100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-slide-down {\n\t\t100% {\n\t\t-webkit-transform: translateY(100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-slide-down {\n\t\t100% {\n\t\t-moz-transform: translateY(100%);\n\t}\n\t}\n\n@keyframes valo-animate-out-slide-down {\n\t\t100% {\n\t\t-webkit-transform: translateY(100%);\n\t\t-moz-transform: translateY(100%);\n\t\t-ms-transform: translateY(100%);\n\t\t-o-transform: translateY(100%);\n\t\ttransform: translateY(100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-slide-up {\n\t\t100% {\n\t\t-webkit-transform: translateY(-100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-slide-up {\n\t\t100% {\n\t\t-moz-transform: translateY(-100%);\n\t}\n\t}\n\n@keyframes valo-animate-out-slide-up {\n\t\t100% {\n\t\t-webkit-transform: translateY(-100%);\n\t\t-moz-transform: translateY(-100%);\n\t\t-ms-transform: translateY(-100%);\n\t\t-o-transform: translateY(-100%);\n\t\ttransform: translateY(-100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-slide-left {\n\t\t100% {\n\t\t-webkit-transform: translateX(-100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-slide-left {\n\t\t100% {\n\t\t-moz-transform: translateX(-100%);\n\t}\n\t}\n\n@keyframes valo-animate-out-slide-left {\n\t\t100% {\n\t\t-webkit-transform: translateX(-100%);\n\t\t-moz-transform: translateX(-100%);\n\t\t-ms-transform: translateX(-100%);\n\t\t-o-transform: translateX(-100%);\n\t\ttransform: translateX(-100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-slide-right {\n\t\t100% {\n\t\t-webkit-transform: translateX(100%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-slide-right {\n\t\t100% {\n\t\t-moz-transform: translateX(100%);\n\t}\n\t}\n\n@keyframes valo-animate-out-slide-right {\n\t\t100% {\n\t\t-webkit-transform: translateX(100%);\n\t\t-moz-transform: translateX(100%);\n\t\t-ms-transform: translateX(100%);\n\t\t-o-transform: translateX(100%);\n\t\ttransform: translateX(100%);\n\t}\n\t}\n\n@-webkit-keyframes valo-overlay-animate-in {\n\t\t0% {\n\t\t-webkit-transform: translatey(-4px);\n\t\topacity: 0;\n\t}\n\t}\n\n@-moz-keyframes valo-overlay-animate-in {\n\t\t0% {\n\t\t-moz-transform: translatey(-4px);\n\t\topacity: 0;\n\t}\n\t}\n\n@keyframes valo-overlay-animate-in {\n\t\t0% {\n\t\t-webkit-transform: translatey(-4px);\n\t\t-moz-transform: translatey(-4px);\n\t\t-ms-transform: translatey(-4px);\n\t\t-o-transform: translatey(-4px);\n\t\ttransform: translatey(-4px);\n\t\topacity: 0;\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-slide-down-fade {\n\t\t100% {\n\t\topacity: 0;\n\t\t-webkit-transform: translatey(30%);\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-slide-down-fade {\n\t\t100% {\n\t\topacity: 0;\n\t\t-moz-transform: translatey(30%);\n\t}\n\t}\n\n@keyframes valo-animate-out-slide-down-fade {\n\t\t100% {\n\t\topacity: 0;\n\t\t-webkit-transform: translatey(30%);\n\t\t-moz-transform: translatey(30%);\n\t\t-ms-transform: translatey(30%);\n\t\t-o-transform: translatey(30%);\n\t\ttransform: translatey(30%);\n\t}\n\t}\n\n/**\n * Outputs cross-browser Valo-specific linear gradient background-image declarations.\n * \n * @group style\n * \n * @param {color} $color ($v-background-color) - The base color for the gradient color stops\n * @param {list} $gradient ($v-gradient) - Valo-specific gradient value. See the documentation for $v-gradient.\n * @param {color} $fallback (null) - A fallback color for browser which do not support linear gradients (IE8 and IE9 in particular). If null, the base $color is used instead.\n * @param {string} $direction (to bottom) - the direction of the linear gradient. The color stops are by default so that a lighter shade is at the start and a darker shade is at the end.\n */\n\n/**\n * Computes a CSS border property value for the given base color.\n *\n * @group style\n *\n * @param {list} $border ($v-border) - CSS border value which can contain any of the color keywords\n * @param {color} $color ($v-background-color) - the base color to which the color keywords are applied to\n * @param {color} $context (null) - context/surrounding color where the border is expected to appear. The color of the final border is the darker of the two parameters passed to this function.\n * @param {number} $strength (1) - adjustment for the border contrast\n *\n * @return {list} The input $border value with any color keyword replaced with the corresponding actual color\n */\n\n/**\n * Ouput selectors and properties to vertically center elements inside their parent.\n * \n * @param {string} $to-align (()) - The selector to match the elements which you wish to align vertically. The targeted elements should be inline or inline-block elements.\n * @param {string} $align (middle) - The vertical-align value, e.g. top, middle, bottom\n * @param {string} $pseudo-element (after) - Which pseudo element to use for the vertical align guide\n * \n * @group util\n */\n\n@font-face {\n\tfont-family: \"Vaadin-Icons\";\n\tsrc: url(../valo/fonts/vaadin-icons/Vaadin-Icons.eot);\n\tsrc: url(../valo/fonts/vaadin-icons/Vaadin-Icons.eot?#iefix) format(\"embedded-opentype\"), url(../valo/fonts/vaadin-icons/Vaadin-Icons.woff) format(\"woff\"), url(../valo/fonts/vaadin-icons/Vaadin-Icons.ttf) format(\"truetype\"), url(../valo/fonts/vaadin-icons/Vaadin-Icons.svg#icomoon) format(\"svg\");\n}\n\n.Vaadin-Icons {\n\tfont-family: \"Vaadin-Icons\";\n}\n\n@font-face {\n\tfont-family: ThemeIcons;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tsrc: url(../valo/util/bourbon/css3/../../../../valo/fonts/themeicons-webfont/themeicons-webfont.eot);\n\tsrc: url(../valo/util/bourbon/css3/../../../../valo/fonts/themeicons-webfont/themeicons-webfont.eot?#iefix) format(\"embedded-opentype\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/themeicons-webfont/themeicons-webfont.woff) format(\"woff\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/themeicons-webfont/themeicons-webfont.ttf) format(\"truetype\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/themeicons-webfont/themeicons-webfont.svg#ThemeIcons) format(\"svg\");\n}\n\n.ThemeIcons {\n\tfont-family: ThemeIcons;\n\tfont-style: normal;\n\tfont-weight: normal;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tdisplay: inline-block;\n\ttext-align: center;\n}\n\n@font-face {\n\tfont-family: FontAwesome;\n\tfont-weight: normal;\n\tfont-style: normal;\n\tsrc: url(../valo/util/bourbon/css3/../../../../valo/fonts/fontawesome-webfont/fontawesome-webfont.eot);\n\tsrc: url(../valo/util/bourbon/css3/../../../../valo/fonts/fontawesome-webfont/fontawesome-webfont.eot?#iefix) format(\"embedded-opentype\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/fontawesome-webfont/fontawesome-webfont.woff) format(\"woff\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/fontawesome-webfont/fontawesome-webfont.ttf) format(\"truetype\"), url(../valo/util/bourbon/css3/../../../../valo/fonts/fontawesome-webfont/fontawesome-webfont.svg#FontAwesome) format(\"svg\");\n}\n\n.FontAwesome {\n\tfont-family: FontAwesome;\n\tfont-style: normal;\n\tfont-weight: normal;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tdisplay: inline-block;\n\ttext-align: center;\n}\n\n@font-face {\n\tfont-family: \"Open Sans\";\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot);\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot?#iefix) format(\"embedded-opentype\"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.woff) format(\"woff\"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.ttf) format(\"truetype\");\n\tfont-weight: 300;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: \"Open Sans\";\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot);\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot?#iefix) format(\"embedded-opentype\"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.woff) format(\"woff\"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.ttf) format(\"truetype\");\n\tfont-weight: 400;\n\tfont-style: normal;\n}\n\n@font-face {\n\tfont-family: \"Open Sans\";\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot);\n\tsrc: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot?#iefix) format(\"embedded-opentype\"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.woff) format(\"woff\"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.ttf) format(\"truetype\");\n\tfont-weight: 600;\n\tfont-style: normal;\n}\n\n@-webkit-keyframes v-rotate-360 {\n\t\tto {\n\t\t-webkit-transform: rotate(360deg);\n\t}\n\t}\n\n@-moz-keyframes v-rotate-360 {\n\t\tto {\n\t\t-moz-transform: rotate(360deg);\n\t}\n\t}\n\n@-o-keyframes v-rotate-360 {\n\t\tto {\n\t\t-o-transform: rotate(360deg);\n\t}\n\t}\n\n@keyframes v-rotate-360 {\n\t\tto {\n\t\ttransform: rotate(360deg);\n\t}\n\t}\n\n@-webkit-keyframes v-progress-start {\n\t\t0% {\n\t\twidth: 0%;\n\t}\n\t\t100% {\n\t\twidth: 50%;\n\t}\n\t}\n\n@-moz-keyframes v-progress-start {\n\t\t0% {\n\t\twidth: 0%;\n\t}\n\t\t100% {\n\t\twidth: 50%;\n\t}\n\t}\n\n@keyframes v-progress-start {\n\t\t0% {\n\t\twidth: 0%;\n\t}\n\t\t100% {\n\t\twidth: 50%;\n\t}\n\t}\n\n@-webkit-keyframes v-progress-delay {\n\t\t0% {\n\t\twidth: 50%;\n\t}\n\t\t100% {\n\t\twidth: 90%;\n\t}\n\t}\n\n@-moz-keyframes v-progress-delay {\n\t\t0% {\n\t\twidth: 50%;\n\t}\n\t\t100% {\n\t\twidth: 90%;\n\t}\n\t}\n\n@keyframes v-progress-delay {\n\t\t0% {\n\t\twidth: 50%;\n\t}\n\t\t100% {\n\t\twidth: 90%;\n\t}\n\t}\n\n@-webkit-keyframes v-progress-wait {\n\t\t0% {\n\t\twidth: 90%;\n\t\theight: 4px;\n\t}\n\t\t3% {\n\t\twidth: 91%;\n\t\theight: 7px;\n\t}\n\t\t100% {\n\t\twidth: 96%;\n\t\theight: 7px;\n\t}\n\t}\n\n@-moz-keyframes v-progress-wait {\n\t\t0% {\n\t\twidth: 90%;\n\t\theight: 4px;\n\t}\n\t\t3% {\n\t\twidth: 91%;\n\t\theight: 7px;\n\t}\n\t\t100% {\n\t\twidth: 96%;\n\t\theight: 7px;\n\t}\n\t}\n\n@keyframes v-progress-wait {\n\t\t0% {\n\t\twidth: 90%;\n\t\theight: 4px;\n\t}\n\t\t3% {\n\t\twidth: 91%;\n\t\theight: 7px;\n\t}\n\t\t100% {\n\t\twidth: 96%;\n\t\theight: 7px;\n\t}\n\t}\n\n@-webkit-keyframes v-progress-wait-pulse {\n\t\t0% {\n\t\topacity: 1;\n\t}\n\t\t50% {\n\t\topacity: 0.1;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n@-moz-keyframes v-progress-wait-pulse {\n\t\t0% {\n\t\topacity: 1;\n\t}\n\t\t50% {\n\t\topacity: 0.1;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n@keyframes v-progress-wait-pulse {\n\t\t0% {\n\t\topacity: 1;\n\t}\n\t\t50% {\n\t\topacity: 0.1;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n/**\n * Outputs the context menu selectors and styles, which is used by Table and Tree for instance.\n * \n * @requires {mixin} valo-selection-item-style\n * @requires {mixin} valo-selection-item-selected-style\n */\n\n/**\n * The background color for overlay elements.\n *\n * @type color\n * @group overlay\n */\n\n/**\n * The backgound color for tooltips.\n *\n * @type color\n * @group tooltip\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-absolutelayout) - \n *\n * @group absolutelayout\n */\n\n/**\n * Outputs the selectors and properties for the Accordion component.\n *\n * @param {string} $primary-stylename (v-accordion) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n * @group accordion\n */\n\n/**\n * Outputs the selectors and properties for the Button component.\n *\n * @param {string} $primary-stylename (v-button) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group button\n */\n\n/**\n * A list of colors for custom event colors. Can be an empty list of you don't \n * need any custom event colors.\n * \n * @example javascript\n * // Java code\n * // 'event' is an instance of EditableCalendarEvent\n * event.setStyleName(\"color1\"); // 1st color in the list\n * event.setStyleName(\"color2\"); // 2nd color in the list\n * // etc.\n * \n * @group calendar\n */\n\n/**\n * Outputs the selectors and properties for the CheckBox component.\n *\n * @param {string} $primary-stylename (v-checkbox) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group checkbox\n */\n\n/**\n * Outputs the global selectors and properties for the ColorPicker component - styles which are\n * considered mandatory for the component to work properly.\n *\n * @param {string} $primary-stylename (v-colorpicker) - the primary style name for the selectors\n *\n * @group colorpicker\n */\n\n/**\n * Outputs the selectors and properties for the ComboBox component.\n *\n * @param {string} $primary-stylename (v-filterselect) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group combobox\n */\n\n/**\n * The amount of spacing between different widgets in a component group.\n * If null, a computed value is used ($v-border size * -1, or 1px if $v-border size is 0)\n * \n * @group csslayout\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-customcomponent) - \n *\n * @group customcomponent\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-customlayout) - \n *\n * @group customlayout\n */\n\n/**\n * Outputs the selectors and properties for the DateField component.\n *\n * @param {string} $primary-stylename (v-datefield) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group datefield\n */\n\n/**\n * Outputs the styles and selectors for the DragAndDropWrapper component.\n * \n * @param {string} $primary-stylename (v-ddwrapper) - the primary style name for the selectors\n * \n * @group drag-n-drop\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-form) - \n *\n * @group form\n */\n\n/**\n * Outputs the selectors and properties for the FormLayout component.\n *\n * @param {string} $primary-stylename (v-formlayout) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group formlayout\n */\n\n/**\n *\n * @group table\n */\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-gridlayout) - \n *\n * @group gridlayout\n */\n\n/**\n * The font weight for headers.\n * \n * @group label\n */\n\n/**\n *\n * @group link\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-loginform) - \n *\n * @group loginform\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-menubar) - \n * @param {bool} $include-additional-styles - \n *\n * @group menubar\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-nativebutton) - \n *\n * @group nativebutton\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-select) - \n *\n * @group nativeselect\n */\n\n/**\n *\n * @group notification\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-select-optiongroup) - \n * @param {bool} $include-additional-styles - \n *\n * @group optiongroup\n */\n\n/**\n *\n *\n *\n * @group orderedlayout\n */\n\n/**\n *\n * @group panel\n */\n\n@-webkit-keyframes v-popupview-animate-in {\n\t\t0% {\n\t\t-webkit-transform: scale(0);\n\t}\n\t}\n\n@-moz-keyframes v-popupview-animate-in {\n\t\t0% {\n\t\t-moz-transform: scale(0);\n\t}\n\t}\n\n@keyframes v-popupview-animate-in {\n\t\t0% {\n\t\t-webkit-transform: scale(0);\n\t\t-moz-transform: scale(0);\n\t\t-ms-transform: scale(0);\n\t\t-o-transform: scale(0);\n\t\ttransform: scale(0);\n\t}\n\t}\n\n/**\n *\n * @group progressbar\n */\n\n/**\n *\n * @group richtextarea\n */\n\n/**\n *\n * @group slider\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-splitpanel) - \n * @param {bool} $include-additional-styles - \n *\n * @group splitpanel\n */\n\n/**\n *\n * @group table\n */\n\n/**\n * Should the tabsheet content changes be animated.\n *\n * @group tabsheet\n */\n\n/**\n * The background color for text fields.\n * @group textfield\n */\n\n/**\n * Outputs the selectors and properties for the TextArea component.\n *\n * @param {string} $primary-stylename (v-textarea) - the primary style name for the selectors\n * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component\n *\n * @group textarea\n */\n\n/**\n *\n * @group tree\n */\n\n/**\n *\n * @group table\n */\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n/**\n *\n * @group table\n */\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in {\n\t\t0% {\n\t\tmargin-top: -37px;\n\t}\n\t}\n\n@-webkit-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@-moz-keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n@keyframes valo-grid-editor-footer-animate-in-alt {\n\t\t0% {\n\t\tmargin-bottom: -38px;\n\t}\n\t\t100% {\n\t\tmargin-bottom: -1px;\n\t}\n\t}\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-treetable) - \n *\n * @group treetable\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-select-twincol) - \n *\n * @group twin-column-select\n */\n\n/**\n *\n *\n * @param {string} $primary-stylename (v-upload) -\n *\n * @group upload\n */\n\n/**\n * @group window\n */\n\n@-webkit-keyframes valo-modal-window-indication {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n@-moz-keyframes valo-modal-window-indication {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n@keyframes valo-modal-window-indication {\n\t\t0% {\n\t\topacity: 0;\n\t}\n\t\t100% {\n\t\topacity: 1;\n\t}\n\t}\n\n@-webkit-keyframes valo-animate-out-scale-down-fade {\n\t\t100% {\n\t\t-webkit-transform: scale(0.8);\n\t\topacity: 0;\n\t}\n\t}\n\n@-moz-keyframes valo-animate-out-scale-down-fade {\n\t\t100% {\n\t\t-moz-transform: scale(0.8);\n\t\topacity: 0;\n\t}\n\t}\n\n@keyframes valo-animate-out-scale-down-fade {\n\t\t100% {\n\t\t-webkit-transform: scale(0.8);\n\t\t-moz-transform: scale(0.8);\n\t\t-ms-transform: scale(0.8);\n\t\t-o-transform: scale(0.8);\n\t\ttransform: scale(0.8);\n\t\topacity: 0;\n\t}\n\t}\n\n/**\n * @group valo-menu\n */\n\n.v-vaadin-version:after {\n\tcontent: \"8.5.2\";\n}\n\n.v-widget {\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: left;\n\twhite-space: normal;\n}\n\n.v-generated-body {\n\toverflow: hidden;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n.v-app {\n\theight: 100%;\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-text-size-adjust: 100%;\n\t-ms-text-size-adjust: 100%;\n\t-webkit-text-size-adjust: 100%;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.v-app input[type=\"text\"], .v-app .v-slot > .v-caption, .v-app .v-gridlayout-slot > .v-caption, .v-app .v-has-caption > .v-caption, .v-app .v-formlayout-captioncell > .v-caption, .v-app .v-csslayout > .v-caption {\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\n.v-app input::-ms-clear {\n\tdisplay: none;\n}\n\n.v-ui {\n\tposition: relative;\n}\n\n.v-ui.v-ui-embedded {\n\tmargin-top: -1px;\n\tborder-top: 1px solid transparent;\n}\n\n.v-ui:focus {\n\toutline: none;\n}\n\n.v-overlay-container {\n\twidth: 0;\n\theight: 0;\n}\n\n.v-drag-element {\n\tz-index: 60000;\n\tposition: absolute !important;\n\tcursor: default;\n}\n\n.v-clip {\n\toverflow: hidden;\n}\n\n.v-scrollable {\n\toverflow: auto;\n}\n\n.v-scrollable > .v-widget {\n\tvertical-align: middle;\n\toverflow: hidden;\n}\n\n.v-ios.v-webkit .v-scrollable {\n\t-webkit-overflow-scrolling: touch;\n}\n\n.v-ios5.v-webkit .v-scrollable {\n\t-webkit-overflow-scrolling: none;\n}\n\n.v-webkit.v-ios .v-browserframe {\n\t-webkit-overflow-scrolling: touch;\n\toverflow: auto;\n}\n\n.v-assistive-device-only, .v-assistive-device-only-label label {\n\tposition: absolute;\n\ttop: -2000px;\n\tleft: -2000px;\n\twidth: 10px;\n\toverflow: hidden;\n}\n\n.v-icon {\n\tcursor: inherit;\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.v-icon, .v-errorindicator, .v-required-field-indicator {\n\tdisplay: inline-block;\n\tline-height: inherit;\n}\n\n.v-caption {\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\tline-height: 1.55;\n}\n\n.v-captiontext {\n\tdisplay: inline-block;\n\tline-height: inherit;\n}\n\ndiv.v-layout.v-horizontal.v-widget {\n\twhite-space: nowrap;\n}\n\n.v-layout.v-vertical > .v-expand, .v-layout.v-horizontal > .v-expand {\n\tbox-sizing: border-box;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.v-slot, .v-spacing {\n\tdisplay: inline-block;\n\twhite-space: nowrap;\n\tvertical-align: top;\n}\n\n.v-vertical > .v-slot:after {\n\tdisplay: inline-block;\n\tclear: both;\n\twidth: 0;\n\theight: 0;\n\toverflow: hidden;\n}\n\n.v-vertical > .v-slot, .v-vertical > .v-expand > .v-slot {\n\tdisplay: block;\n\tclear: both;\n}\n\n.v-horizontal > .v-slot, .v-horizontal > .v-expand > .v-slot {\n\theight: 100%;\n}\n\n.v-horizontal > .v-expand > .v-slot {\n\tposition: relative;\n}\n\n.v-vertical > .v-spacing, .v-vertical > .v-expand > .v-spacing {\n\twidth: 0 !important;\n\tdisplay: block;\n\tclear: both;\n}\n\n.v-horizontal > .v-spacing, .v-horizontal > .v-expand > .v-spacing {\n\theight: 0 !important;\n}\n\n.v-align-middle:before, .v-align-bottom:before, .v-expand > .v-align-middle:before, .v-expand > .v-align-bottom:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\theight: 100%;\n\tvertical-align: middle;\n\twidth: 0;\n}\n\n.v-align-middle, .v-align-bottom {\n\twhite-space: nowrap;\n}\n\n.v-align-middle > .v-widget, .v-align-bottom > .v-widget {\n\tdisplay: inline-block;\n}\n\n.v-align-middle, .v-align-middle > .v-widget {\n\tvertical-align: middle;\n}\n\n.v-align-bottom, .v-align-bottom > .v-widget {\n\tvertical-align: bottom;\n}\n\n.v-align-center {\n\ttext-align: center;\n}\n\n.v-align-center > .v-widget {\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.v-align-right {\n\ttext-align: right;\n}\n\n.v-align-right > .v-widget {\n\tmargin-left: auto;\n}\n\n.v-has-caption, .v-has-caption > .v-caption {\n\tdisplay: inline-block;\n}\n\n.v-caption-on-left, .v-caption-on-right {\n\twhite-space: nowrap;\n}\n\n.v-caption-on-top > .v-caption, .v-caption-on-bottom > .v-caption {\n\tdisplay: block;\n}\n\n.v-caption-on-left > .v-caption {\n\tpadding-right: 0.5em;\n}\n\n.v-caption-on-left > .v-widget, .v-caption-on-right > .v-widget {\n\tdisplay: inline-block;\n}\n\n.v-has-caption.v-has-width > .v-widget {\n\twidth: 100% !important;\n}\n\n.v-has-caption.v-has-height > .v-widget {\n\theight: 100% !important;\n}\n\n.v-gridlayout {\n\tposition: relative;\n}\n\n.v-gridlayout-slot {\n\tposition: absolute;\n\tline-height: 1.55;\n}\n\n.v-gridlayout-spacing-on {\n\toverflow: hidden;\n}\n\n.v-gridlayout-spacing, .v-gridlayout-spacing-off {\n\tpadding-left: 0;\n\tpadding-top: 0;\n}\n\n.v-gridlayout-spacing-off {\n\toverflow: hidden;\n}\n\n.v-calendar-month-day-scrollable {\n\toverflow-y: scroll;\n}\n\n.v-calendar-week-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n}\n\n.v-calendar-current-time {\n\tposition: absolute;\n\tleft: 0;\n\twidth: 100%;\n\theight: 1px;\n\tbackground: red;\n\tz-index: 2;\n}\n\n.v-calendar-event-resizetop, .v-calendar-event-resizebottom {\n\tposition: absolute;\n\theight: 5%;\n\tmin-height: 3px;\n\twidth: 100%;\n\tz-index: 1;\n}\n\n.v-calendar-event-resizetop {\n\tcursor: row-resize;\n\ttop: 0;\n}\n\n.v-calendar-event-resizebottom {\n\tcursor: row-resize;\n\tbottom: 0;\n}\n\n.v-calendar-header-month td:first-child {\n\tpadding-left: 20px;\n}\n\n.v-calendar-month-sizedheight .v-calendar-month-day {\n\theight: 100px;\n}\n\n.v-calendar-month-sizedwidth .v-calendar-month-day {\n\twidth: 100px;\n}\n\n.v-calendar-header-month-Hsized .v-calendar-header-day {\n\twidth: 101px;\n}\n\n.v-calendar-header-month-Hsized td:first-child {\n\tpadding-left: 21px;\n}\n\n.v-calendar-header-day-Hsized {\n\twidth: 200px;\n}\n\n.v-calendar-week-numbers-Vsized .v-calendar-week-number {\n\theight: 100px;\n\tline-height: 100px;\n}\n\n.v-calendar-week-wrapper-Vsized {\n\theight: 400px;\n\toverflow-x: hidden !important;\n}\n\n.v-calendar-times-Vsized .v-calendar-time {\n\theight: 38px;\n}\n\n.v-calendar-times-Hsized .v-calendar-time {\n\twidth: 42px;\n}\n\n.v-calendar-day-times-Vsized .v-datecellslot, .v-calendar-day-times-Vsized .v-datecellslot-even {\n\theight: 18px;\n}\n\n.v-calendar-day-times-Hsized, .v-calendar-day-times-Hsized .v-datecellslot, .v-calendar-day-times-Hsized .v-datecellslot-even {\n\twidth: 200px;\n}\n\n.v-colorpicker-popup.v-window {\n\tmin-width: 220px !important;\n}\n\n.v-colorpicker-gradient-container {\n\toverflow: visible !important;\n}\n\n.v-colorpicker-gradient-clicklayer {\n\topacity: 0;\n\tfilter: alpha(opacity=0) ;\n}\n\n.rgb-gradient .v-colorpicker-gradient-background {\n\tbackground: url(../valo/components/img/colorpicker/gradient2.png);\n}\n\n.hsv-gradient .v-colorpicker-gradient-foreground {\n\tbackground: url(../valo/components/img/colorpicker/gradient.png);\n}\n\n.v-colorpicker-gradient-higherbox:before {\n\tcontent: \"\";\n\twidth: 11px;\n\theight: 11px;\n\tborder-radius: 7px;\n\tborder: 1px solid #fff;\n\t-webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3);\n\tbox-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3);\n\tposition: absolute;\n\tbottom: -6px;\n\tleft: -6px;\n}\n\n.v-colorpicker-popup .v-slider.v-slider-red:before {\n\tbackground-color: red;\n}\n\n.v-colorpicker-popup .v-slider.v-slider-green:before {\n\tbackground-color: green;\n}\n\n.v-colorpicker-popup .v-slider.v-slider-blue:before {\n\tbackground-color: blue;\n}\n\n.v-colorpicker-popup .v-slider.hue-slider:before {\n\tbackground: url(../valo/components/img/colorpicker/slider_hue_bg.png);\n}\n\n.v-colorpicker-popup input.v-textfield-dark {\n\tcolor: #fff;\n}\n\n.v-colorpicker-popup input.v-textfield-light {\n\tcolor: #000;\n}\n\n.v-colorpicker-grid {\n\theight: 319px;\n}\n\n.v-colorpicker-popup .colorselect td {\n\tline-height: 15px;\n}\n\n.v-table-header table, .v-table-footer table, .v-table-table {\n\tborder-spacing: 0;\n\tborder-collapse: separate;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tline-height: 1.55;\n}\n\n.v-table-resizer, .v-table-sort-indicator {\n\tfloat: right;\n}\n\n.v-table-caption-container-align-center {\n\ttext-align: center;\n}\n\n.v-table-caption-container-align-right {\n\ttext-align: right;\n}\n\n.v-table-header td, .v-table-footer td, .v-table-cell-content {\n\tpadding: 0;\n}\n\n.v-table-sort-indicator {\n\twidth: 0;\n}\n\n.v-tabsheet-hidetabs > .v-tabsheet-tabcontainer, .v-tabsheet-spacertd, .v-disabled .v-tabsheet-scroller, .v-tabsheet .v-disabled .v-tabsheet-caption-close {\n\tdisplay: none;\n}\n\n.v-tabsheet {\n\toverflow: visible !important;\n\tposition: relative;\n}\n\n.v-tabsheet-tabcontainer table, .v-tabsheet-tabcontainer tbody, .v-tabsheet-tabcontainer tr {\n\tdisplay: inline-block;\n\tborder-spacing: 0;\n\tborder-collapse: collapse;\n\tvertical-align: top;\n}\n\n.v-tabsheet-tabcontainer td {\n\tdisplay: inline-block;\n\tpadding: 0;\n}\n\n.v-tabsheet-tabs {\n\twhite-space: nowrap;\n\tbox-sizing: border-box;\n}\n\n.v-tabsheet-content {\n\tposition: relative;\n}\n\n.v-tabsheet-content > div > .v-scrollable > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.v-tabsheet-content > div > .v-scrollable > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.v-tabsheet-content > div > .v-scrollable > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.v-tabsheet-content > div > .v-scrollable > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.v-splitpanel-vertical, .v-splitpanel-horizontal {\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.v-splitpanel-hsplitter {\n\tz-index: 100;\n\tcursor: e-resize;\n\tcursor: col-resize;\n}\n\n.v-splitpanel-vsplitter {\n\tz-index: 100;\n\tcursor: s-resize;\n\tcursor: row-resize;\n}\n\n.v-splitpanel-hsplitter:after, .v-splitpanel-vsplitter:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.v-splitpanel-hsplitter div, .v-splitpanel-vsplitter div {\n\twidth: inherit;\n\theight: inherit;\n\toverflow: hidden;\n\tposition: relative;\n}\n\n.v-splitpanel-hsplitter div:before, .v-splitpanel-vsplitter div:before {\n\tbox-sizing: border-box;\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.v-disabled [class$=\"splitter\"] div {\n\tcursor: default;\n}\n\n.v-disabled [class$=\"splitter\"] div:before {\n\tdisplay: none;\n}\n\n.v-splitpanel-horizontal > div > .v-splitpanel-second-container {\n\tposition: static !important;\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.v-splitpanel-horizontal > div > .v-splitpanel-first-container {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.mytheme.v-app, .mytheme.v-app-loading {\n\tfont: 300 16px/1.55 \"Open Sans\", sans-serif;\n\tcolor: #464646;\n\tbackground-color: #fafafa;\n\tcursor: default;\n}\n\n.mytheme .v-app-loading {\n\twidth: 100%;\n\theight: 100%;\n\tbackground: #fafafa;\n}\n\n.mytheme .v-app-loading:before {\n\tcontent: \"\";\n\tposition: fixed;\n\tz-index: 100;\n\ttop: 45%;\n\tleft: 50%;\n\twidth: 28px;\n\theight: 28px;\n\tpadding: 9px;\n\tmargin-top: -24px;\n\tmargin-left: -24px;\n\tbackground: #fff url(../valo/shared/img/spinner.gif) no-repeat 50%;\n\tborder-radius: 4px;\n}\n\n.mytheme .v-loading-indicator {\n\tposition: fixed !important;\n\tz-index: 99999;\n\tleft: 0;\n\tright: auto;\n\ttop: 0;\n\twidth: 50%;\n\topacity: 1;\n\theight: 4px;\n\tbackground-color: #197de1;\n\tpointer-events: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\t-webkit-animation: v-progress-start 1000ms 200ms both;\n\t-moz-animation: v-progress-start 1000ms 200ms both;\n\tanimation: v-progress-start 1000ms 200ms both;\n}\n\n.mytheme .v-loading-indicator[style*=\"none\"] {\n\tdisplay: block !important;\n\twidth: 100% !important;\n\topacity: 0;\n\t-webkit-animation: none;\n\t-moz-animation: none;\n\tanimation: none;\n\t-webkit-transition: opacity 500ms 300ms, width 300ms;\n\t-moz-transition: opacity 500ms 300ms, width 300ms;\n\ttransition: opacity 500ms 300ms, width 300ms;\n}\n\n.mytheme .v-loading-indicator-delay {\n\twidth: 90%;\n\t-webkit-animation: v-progress-delay 3.8s forwards;\n\t-moz-animation: v-progress-delay 3.8s forwards;\n\tanimation: v-progress-delay 3.8s forwards;\n}\n\n.v-ff .mytheme .v-loading-indicator-delay {\n\twidth: 50%;\n}\n\n.mytheme .v-loading-indicator-wait {\n\twidth: 96%;\n\t-webkit-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards;\n\t-moz-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards;\n\tanimation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards;\n}\n\n.v-ff .mytheme .v-loading-indicator-wait {\n\twidth: 90%;\n}\n\n.mytheme .v-scrollable:focus {\n\toutline: none;\n}\n\n.mytheme img.v-icon {\n\tvertical-align: middle;\n}\n\n.mytheme .v-caption {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n}\n\n.mytheme .v-caption-on-left .v-caption, .mytheme .v-caption-on-right .v-caption {\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n}\n\n.mytheme .v-icon + .v-captiontext, .mytheme .v-icon + span {\n\tmargin-left: 7px;\n}\n\n.mytheme .v-icon + .v-captiontext:empty, .mytheme .v-icon + span:empty {\n\tmargin-left: 0;\n}\n\n.mytheme .v-errorindicator {\n\tcolor: #ed473b;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-errorindicator-info {\n\tcolor: #00a7f5;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator-info:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-errorindicator-warning {\n\tcolor: #fc9c00;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator-warning:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-errorindicator-error {\n\tcolor: #ed473b;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator-error:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-errorindicator-critical {\n\tcolor: #fa007d;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator-critical:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-errorindicator-system {\n\tcolor: #bb00ff;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n}\n\n.mytheme .v-errorindicator-system:before {\n\tcontent: \"!\";\n}\n\n.mytheme .v-required-field-indicator {\n\tcolor: #ed473b;\n\tpadding: 0 0.2em;\n}\n\n.mytheme select {\n\tfont: inherit;\n\tfont-weight: 400;\n\tline-height: inherit;\n\tpadding: 5px;\n\tmargin: 0;\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\tcolor: #464646;\n}\n\n.mytheme select:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-disabled {\n\tcursor: default !important;\n}\n\n.mytheme .v-drag-element {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tborder-radius: 4px;\n\toverflow: hidden;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-draggable {\n\t-moz-user-select: none !important;\n\t-ms-user-select: none !important;\n\t-webkit-user-select: none !important;\n\tuser-select: none !important;\n}\n\n.mytheme .v-tooltip {\n\tbackground-color: rgba(50, 50, 50, 0.9);\n\t-webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n\tcolor: white;\n\tpadding: 5px 9px;\n\tborder-radius: 3px;\n\tmax-width: 35em;\n\toverflow: hidden !important;\n\tfont-size: 14px;\n}\n\n.mytheme .v-tooltip div[style*=\"width\"] {\n\twidth: auto !important;\n}\n\n.mytheme .v-tooltip .v-errormessage {\n\tbackground-color: white;\n\tbackground-color: #fff;\n\tcolor: #ed473b;\n\tmargin: -5px -9px;\n\tpadding: 5px 9px;\n\tmax-height: 10em;\n\toverflow: auto;\n\tfont-weight: 400;\n}\n\n.mytheme .v-tooltip .v-errormessage h2:only-child {\n\tfont: inherit;\n\tline-height: inherit;\n}\n\n.mytheme .v-tooltip .v-errormessage-info {\n\tcolor: #00a7f5;\n}\n\n.mytheme .v-tooltip .v-errormessage-warning {\n\tcolor: #fc9c00;\n}\n\n.mytheme .v-tooltip .v-errormessage-error {\n\tcolor: #ed473b;\n}\n\n.mytheme .v-tooltip .v-errormessage-critical {\n\tcolor: #fa007d;\n}\n\n.mytheme .v-tooltip .v-errormessage-system {\n\tcolor: #bb00ff;\n}\n\n.mytheme .v-tooltip .v-tooltip-text {\n\tmax-height: 10em;\n\toverflow: auto;\n\tmargin-top: 10px;\n}\n\n.mytheme .v-tooltip .v-tooltip-text pre {\n\tmargin: 0px;\n}\n\n.mytheme .v-tooltip .v-errormessage[aria-hidden=\"true\"] + .v-tooltip-text {\n\tmargin-top: 0;\n}\n\n.mytheme .v-tooltip h1, .mytheme .v-tooltip h2, .mytheme .v-tooltip h3, .mytheme .v-tooltip h4 {\n\tcolor: inherit;\n}\n\n.mytheme .v-tooltip pre.v-tooltip-pre {\n\tfont: inherit;\n\twhite-space: pre-wrap;\n}\n\n.mytheme .v-contextmenu {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\tpadding: 4px 4px;\n}\n\n.mytheme .v-contextmenu[class*=\"animate-in\"] {\n\t-webkit-animation: valo-overlay-animate-in 120ms;\n\t-moz-animation: valo-overlay-animate-in 120ms;\n\tanimation: valo-overlay-animate-in 120ms;\n}\n\n.mytheme .v-contextmenu[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-fade 120ms;\n\t-moz-animation: valo-animate-out-fade 120ms;\n\tanimation: valo-animate-out-fade 120ms;\n}\n\n.mytheme .v-contextmenu table {\n\tborder-spacing: 0;\n}\n\n.mytheme .v-contextmenu .gwt-MenuItem {\n\tcursor: pointer;\n\tline-height: 27px;\n\tpadding: 0 20px 0 10px;\n\tborder-radius: 3px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tposition: relative;\n\tdisplay: block;\n}\n\n.mytheme .v-contextmenu .gwt-MenuItem:active:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tbackground: #0957a6;\n\topacity: 0.15;\n\tfilter: alpha(opacity=15.0) ;\n\tpointer-events: none;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-contextmenu .gwt-MenuItem .v-icon {\n\tmax-height: 27px;\n\tmargin-right: 5px;\n\tmin-width: 1em;\n}\n\n.mytheme .v-contextmenu .gwt-MenuItem-selected {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-reconnect-dialog {\n\tcolor: white;\n\ttop: 12px;\n\tright: 12px;\n\tmax-width: 100%;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tbox-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tpadding: 12px 15px;\n\tbackground-color: #444;\n\tbackground-color: rgba(68, 68, 68, 0.9);\n\tline-height: 22px;\n\ttext-align: center;\n}\n\n.mytheme .v-reconnect-dialog .text {\n\tdisplay: inline-block;\n\tpadding-left: 10px;\n}\n\n.mytheme .v-reconnect-dialog .spinner {\n\theight: 24px !important;\n\twidth: 24px !important;\n\tbox-sizing: border-box;\n\tborder: 2px solid rgba(25, 125, 225, 0.2);\n\tborder-top-color: #197de1;\n\tborder-right-color: #197de1;\n\tborder-radius: 100%;\n\t-webkit-animation: v-rotate-360 500ms infinite linear;\n\t-moz-animation: v-rotate-360 500ms infinite linear;\n\tanimation: v-rotate-360 500ms infinite linear;\n\tpointer-events: none;\n\tdisplay: none;\n\tvertical-align: middle;\n}\n\n.mytheme .v-reconnect-dialog.active .spinner {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-absolutelayout-wrapper {\n\tposition: absolute;\n}\n\n.mytheme .v-absolutelayout-margin, .mytheme .v-absolutelayout-canvas {\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-height .v-absolutelayout-margin {\n\theight: 100%;\n}\n\n.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-width .v-absolutelayout-margin {\n\twidth: 100%;\n}\n\n.mytheme .v-margin-top {\n\tpadding-top: 37px;\n}\n\n.mytheme .v-margin-right {\n\tpadding-right: 37px;\n}\n\n.mytheme .v-margin-bottom {\n\tpadding-bottom: 37px;\n}\n\n.mytheme .v-margin-left {\n\tpadding-left: 37px;\n}\n\n.mytheme .v-spacing {\n\twidth: 12px;\n\theight: 12px;\n}\n\n.mytheme .v-verticallayout-well, .mytheme .v-horizontallayout-well {\n\tbackground: #f5f5f5;\n\tcolor: #454545;\n\t-webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n}\n\n.mytheme .v-verticallayout-well > div > [class*=\"-caption\"], .mytheme .v-horizontallayout-well > div > [class*=\"-caption\"] {\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-verticallayout-well > .v-margin-top, .mytheme .v-horizontallayout-well > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-verticallayout-well > .v-margin-right, .mytheme .v-horizontallayout-well > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-verticallayout-well > .v-margin-bottom, .mytheme .v-horizontallayout-well > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-verticallayout-well > .v-margin-left, .mytheme .v-horizontallayout-well > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-verticallayout-card, .mytheme .v-horizontallayout-card {\n\tbackground: white;\n\tcolor: #474747;\n\tborder-radius: 4px;\n\tborder: 1px solid #d5d5d5;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-verticallayout-card > .v-margin-top, .mytheme .v-horizontallayout-card > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-verticallayout-card > .v-margin-right, .mytheme .v-horizontallayout-card > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-verticallayout-card > .v-margin-bottom, .mytheme .v-horizontallayout-card > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-verticallayout-card > .v-margin-left, .mytheme .v-horizontallayout-card > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-horizontallayout-wrapping {\n\twhite-space: normal !important;\n}\n\n.mytheme .v-horizontallayout-wrapping > .v-spacing + .v-slot, .mytheme .v-horizontallayout-wrapping > .v-slot:first-child {\n\tmargin-bottom: 12px;\n}\n\n.mytheme .v-horizontallayout-wrapping > .v-slot:first-child:last-child {\n\tmargin-bottom: 0;\n}\n\n.mytheme .v-button {\n\tposition: relative;\n\ttext-align: center;\n\twhite-space: nowrap;\n\toutline: none;\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-button:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\twidth: 0;\n\theight: 100%;\n\tvertical-align: middle;\n}\n\n.mytheme .v-button > div {\n\tvertical-align: middle;\n}\n\n.v-sa .mytheme .v-button:before {\n\theight: 110%;\n}\n\n.v-ff .mytheme .v-button:before {\n\theight: 107%;\n}\n\n.v-ie .mytheme .v-button:before {\n\tmargin-top: 4px;\n}\n\n.mytheme .v-button:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n}\n\n.mytheme .v-button:focus:after {\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n}\n\n.mytheme .v-button.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-button.v-disabled:after {\n\tdisplay: none;\n}\n\n.mytheme .v-button:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-button:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-button:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-button-primary {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #ecf2f8;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #1362b1;\n\tborder-top-color: #156ab3;\n\tborder-bottom-color: #1156a8;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\t-webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tpadding: 0 19px;\n\tfont-weight: bold;\n\tmin-width: 81px;\n}\n\n.mytheme .v-button-primary:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-primary:hover:after {\n\tbackground-color: rgba(90, 163, 237, 0.1);\n}\n\n.mytheme .v-button-primary:focus:after {\n\tborder: inherit;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-button-primary:active:after {\n\tbackground-color: rgba(2, 62, 122, 0.2);\n}\n\n.mytheme .v-button-friendly {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #eaf4e9;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #227719;\n\tborder-top-color: #257d1a;\n\tborder-bottom-color: #1e6b15;\n\tbackground-color: #2c9720;\n\tbackground-image: -webkit-linear-gradient(top, #2f9f22 2%, #26881b 98%);\n\tbackground-image: linear-gradient(to bottom,#2f9f22 2%, #26881b 98%);\n\t-webkit-box-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-button-friendly:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-friendly:hover:after {\n\tbackground-color: rgba(65, 211, 48, 0.1);\n}\n\n.mytheme .v-button-friendly:focus:after {\n\tborder: inherit;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-button-friendly:active:after {\n\tbackground-color: rgba(14, 86, 6, 0.2);\n}\n\n.mytheme .v-button-danger {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #f9f0ef;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #bb382e;\n\tborder-top-color: #bc3c31;\n\tborder-bottom-color: #b13028;\n\tbackground-color: #ed473b;\n\tbackground-image: -webkit-linear-gradient(top, #ee4c3f 2%, #e13e33 98%);\n\tbackground-image: linear-gradient(to bottom,#ee4c3f 2%, #e13e33 98%);\n\t-webkit-box-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-button-danger:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-danger:hover:after {\n\tbackground-color: rgba(243, 137, 129, 0.1);\n}\n\n.mytheme .v-button-danger:focus:after {\n\tborder: inherit;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-button-danger:active:after {\n\tbackground-color: rgba(146, 12, 2, 0.2);\n}\n\n.mytheme .v-button-borderless {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n\tcolor: inherit;\n}\n\n.mytheme .v-button-borderless:hover:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-borderless:active:not(.v-disabled) {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70) ;\n}\n\n.mytheme .v-button-borderless:active:not(.v-disabled):after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-borderless-colored {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n\tcolor: #197de1;\n}\n\n.mytheme .v-button-borderless-colored:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-button-borderless-colored:hover:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-borderless-colored:active:not(.v-disabled) {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70) ;\n}\n\n.mytheme .v-button-borderless-colored:active:not(.v-disabled):after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-quiet {\n\tvisibility: hidden;\n}\n\n.mytheme .v-button-quiet:focus, .mytheme .v-button-quiet:hover {\n\tvisibility: visible;\n}\n\n.mytheme .v-button-quiet [class*=\"wrap\"] {\n\tvisibility: visible;\n}\n\n.mytheme .v-button-quiet [class*=\"caption\"] {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-button-link {\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-button-link:hover:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-link:active:not(.v-disabled) {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70) ;\n}\n\n.mytheme .v-button-link:active:not(.v-disabled):after {\n\tbackground: transparent;\n}\n\n.mytheme .v-button-link:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-button-link.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-button-tiny {\n\theight: 28px;\n\tpadding: 0 13px;\n\t\n\t\n\tfont-size: 12px;\n\t\n\tborder-radius: 4px;\n}\n\n.mytheme .v-button-tiny:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-small {\n\theight: 31px;\n\tpadding: 0 14px;\n\t\n\t\n\tfont-size: 14px;\n\t\n\tborder-radius: 4px;\n}\n\n.mytheme .v-button-small:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-large {\n\theight: 44px;\n\tpadding: 0 19px;\n\t\n\t\n\tfont-size: 20px;\n\t\n\tborder-radius: 4px;\n}\n\n.mytheme .v-button-large:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-huge {\n\theight: 59px;\n\tpadding: 0 26px;\n\t\n\t\n\tfont-size: 26px;\n\t\n\tborder-radius: 4px;\n}\n\n.mytheme .v-button-huge:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-button-icon-align-right [class*=\"wrap\"] {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-button-icon-align-right .v-icon {\n\tfloat: right;\n\tmargin-left: 13px;\n}\n\n.mytheme .v-button-icon-align-right .v-icon + span:not(:empty) {\n\tmargin-left: 0;\n}\n\n.mytheme .v-button-icon-align-top {\n\theight: auto;\n\tpadding-top: 5px;\n\tpadding-bottom: 5px;\n}\n\n.mytheme .v-button-icon-align-top [class*=\"wrap\"] {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-button-icon-align-top .v-icon {\n\tdisplay: block;\n\tmargin-left: auto;\n\tmargin-right: auto;\n}\n\n.mytheme .v-button-icon-align-top .v-icon + span:not(:empty) {\n\tmargin-top: 7px;\n\tmargin-left: 0;\n}\n\n.mytheme .v-button-icon-only {\n\twidth: 37px;\n\tpadding: 0;\n}\n\n.mytheme .v-button-icon-only.v-button-tiny {\n\twidth: 28px;\n}\n\n.mytheme .v-button-icon-only.v-button-small {\n\twidth: 31px;\n}\n\n.mytheme .v-button-icon-only.v-button-large {\n\twidth: 44px;\n}\n\n.mytheme .v-button-icon-only.v-button-huge {\n\twidth: 59px;\n}\n\n.mytheme .v-button-icon-only .v-button-caption {\n\tdisplay: none;\n}\n\n.mytheme .v-checkbox {\n\tposition: relative;\n\tline-height: 19px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-checkbox.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-checkbox {\n\tpadding-left: 25px;\n}\n\n:root .mytheme .v-checkbox label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-checkbox > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-checkbox > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-checkbox > input ~ label:before, :root .mytheme .v-checkbox > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 19px;\n\theight: 19px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-checkbox > input ~ label:before {\n\theight: 18.5px;\n\tpadding: 0 9px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 19px;\n}\n\n:root .mytheme .v-checkbox > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-checkbox > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-checkbox > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-checkbox > .v-icon, .mytheme .v-checkbox > label .v-icon {\n\tmargin: 0 6px 0 3px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-checkbox.v-disabled > label, .mytheme .v-checkbox.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-checkbox.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-checkbox.v-readonly > label, .mytheme .v-checkbox.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-checkbox.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-checkbox.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-checkbox-small {\n\tposition: relative;\n\tline-height: 16px;\n\twhite-space: nowrap;\n\tfont-size: 14px;\n}\n\n.mytheme .v-checkbox-small.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-checkbox-small {\n\tpadding-left: 21px;\n}\n\n:root .mytheme .v-checkbox-small label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-checkbox-small > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-checkbox-small > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-checkbox-small > input ~ label:before, :root .mytheme .v-checkbox-small > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 16px;\n\theight: 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 11px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-checkbox-small > input ~ label:before {\n\theight: 15.5px;\n\tpadding: 0 7px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 16px;\n}\n\n:root .mytheme .v-checkbox-small > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-checkbox-small > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-checkbox-small > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-checkbox-small > .v-icon, .mytheme .v-checkbox-small > label .v-icon {\n\tmargin: 0 5px 0 3px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-checkbox-small.v-disabled > label, .mytheme .v-checkbox-small.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-checkbox-small.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox-small.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-checkbox-small.v-readonly > label, .mytheme .v-checkbox-small.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-checkbox-small.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox-small.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-checkbox-small.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-checkbox-large {\n\tposition: relative;\n\tline-height: 22px;\n\twhite-space: nowrap;\n\tfont-size: 20px;\n}\n\n.mytheme .v-checkbox-large.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-checkbox-large {\n\tpadding-left: 29px;\n}\n\n:root .mytheme .v-checkbox-large label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-checkbox-large > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-checkbox-large > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-checkbox-large > input ~ label:before, :root .mytheme .v-checkbox-large > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 22px;\n\theight: 22px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 15px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-checkbox-large > input ~ label:before {\n\theight: 22px;\n\tpadding: 0 10px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 22px;\n}\n\n:root .mytheme .v-checkbox-large > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-checkbox-large > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-checkbox-large > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-checkbox-large > .v-icon, .mytheme .v-checkbox-large > label .v-icon {\n\tmargin: 0 7px 0 4px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-checkbox-large.v-disabled > label, .mytheme .v-checkbox-large.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-checkbox-large.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox-large.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-checkbox-large.v-readonly > label, .mytheme .v-checkbox-large.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-checkbox-large.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-checkbox-large.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-checkbox-large.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect {\n\tposition: relative;\n\twidth: 185px;\n\theight: 37px;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-filterselect [class*=\"input\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 4px;\n\tpadding: 4px 9px;\n\tborder: 1px solid #c5c5c5;\n\tbackground: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 100% !important;\n\theight: 100%;\n\tpadding-right: 38px;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect [class*=\"input\"].v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect [class*=\"input\"]:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-filterselect [class*=\"input\"][class*=\"prompt\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-filterselect .v-icon + [class*=\"input\"] {\n\tpadding-left: 37px;\n}\n\n.mytheme .v-filterselect img.v-icon {\n\tmax-height: 37px;\n\tmargin-left: 9px;\n}\n\n.mytheme .v-filterselect span.v-icon {\n\tcolor: #474747;\n\twidth: 37px;\n\tline-height: 1;\n\tpadding-top: 0.12em;\n\tmargin-left: 9px;\n}\n\n.mytheme .v-filterselect[class*=\"prompt\"] > [class*=\"input\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-filterselect [class$=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tposition: absolute;\n\twidth: 37px;\n\ttop: 1px;\n\tright: 1px;\n\tbottom: 1px;\n\tborder-left: 1px solid #e4e4e4;\n\tcolor: #a3a3a3;\n\tborder-radius: 0 3px 3px 0;\n}\n\n.mytheme .v-filterselect [class$=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tposition: absolute;\n\twidth: 37px;\n\ttext-align: center;\n\ttop: 50%;\n\tline-height: 1;\n\tmargin-top: -0.47em;\n}\n\n.mytheme .v-filterselect [class$=\"button\"]:hover:before {\n\tcolor: #474747;\n}\n\n.mytheme .v-filterselect [class$=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n\tbackground-color: rgba(128, 128, 128, 0.2);\n}\n\n.mytheme .v-filterselect.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect.v-disabled [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect.v-disabled [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect.v-readonly [class*=\"input\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect.v-readonly [class*=\"input\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-filterselect.v-readonly [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect.v-readonly [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect .v-icon {\n\tposition: absolute;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect .v-icon.FontAwesome {\n\tmargin-left: 0px;\n}\n\n.mytheme .v-filterselect-error .v-filterselect-input {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-filterselect-error .v-filterselect-button {\n\tcolor: #ed473b;\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-filterselect-error-info .v-filterselect-input {\n\tborder-color: #00a7f5 !important;\n\tbackground: #fafdff;\n\tcolor: #195774;\n}\n\n.mytheme .v-filterselect-error-info .v-filterselect-button {\n\tcolor: #00a7f5;\n\tborder-color: #00a7f5;\n}\n\n.mytheme .v-filterselect-error-warning .v-filterselect-input {\n\tborder-color: #fc9c00 !important;\n\tbackground: #fffdfa;\n\tcolor: #745119;\n}\n\n.mytheme .v-filterselect-error-warning .v-filterselect-button {\n\tcolor: #fc9c00;\n\tborder-color: #fc9c00;\n}\n\n.mytheme .v-filterselect-error-error .v-filterselect-input {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-filterselect-error-error .v-filterselect-button {\n\tcolor: #ed473b;\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-filterselect-error-critical .v-filterselect-input {\n\tborder-color: #fa007d !important;\n\tbackground: #fffafc;\n\tcolor: #741947;\n}\n\n.mytheme .v-filterselect-error-critical .v-filterselect-button {\n\tcolor: #fa007d;\n\tborder-color: #fa007d;\n}\n\n.mytheme .v-filterselect-error-system .v-filterselect-input {\n\tborder-color: #bb00ff !important;\n\tbackground: #fefaff;\n\tcolor: #5c1974;\n}\n\n.mytheme .v-filterselect-error-system .v-filterselect-button {\n\tcolor: #bb00ff;\n\tborder-color: #bb00ff;\n}\n\n.mytheme .v-filterselect-suggestpopup {\n\tmargin-top: 5px !important;\n}\n\n.mytheme .v-filterselect-suggestpopup[class*=\"animate-in\"] {\n\t-webkit-animation: valo-overlay-animate-in 120ms;\n\t-moz-animation: valo-overlay-animate-in 120ms;\n\tanimation: valo-overlay-animate-in 120ms;\n}\n\n.mytheme .v-filterselect-suggestpopup [class$=\"suggestmenu\"] {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\tpadding: 4px 4px;\n\tbox-sizing: content-box;\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: block;\n}\n\n.mytheme .v-filterselect-suggestpopup table, .mytheme .v-filterselect-suggestpopup tbody, .mytheme .v-filterselect-suggestpopup tr, .mytheme .v-filterselect-suggestpopup td {\n\tdisplay: block;\n\twidth: 100%;\n\toverflow-y: hidden;\n\tfloat: left;\n\tclear: both;\n}\n\n.mytheme .v-filterselect-suggestpopup .gwt-MenuItem {\n\tcursor: pointer;\n\tline-height: 27px;\n\tpadding: 0 20px 0 10px;\n\tborder-radius: 3px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tposition: relative;\n\theight: 27px;\n\tbox-sizing: border-box;\n\ttext-overflow: ellipsis;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-filterselect-suggestpopup .gwt-MenuItem:active:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tbackground: #0957a6;\n\topacity: 0.15;\n\tfilter: alpha(opacity=15.0) ;\n\tpointer-events: none;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-suggestpopup .gwt-MenuItem .v-icon {\n\tmax-height: 27px;\n\tmargin-right: 5px;\n\tmin-width: 1em;\n}\n\n.mytheme .v-filterselect-suggestpopup .gwt-MenuItem-selected {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-filterselect-suggestpopup [class$=\"status\"] {\n\tposition: absolute;\n\tright: 4px;\n\tbackground: rgba(212, 212, 212, 0.9);\n\tcolor: #3b3b3b;\n\tborder-radius: 0 0 4px 4px;\n\theight: 23px;\n\tbottom: -23px;\n\tfont-size: 12px;\n\tline-height: 23px;\n\tpadding: 0 6px;\n\tcursor: default;\n\tpointer-events: none;\n\t-webkit-animation: valo-animate-in-slide-down 200ms 80ms backwards;\n\t-moz-animation: valo-animate-in-slide-down 200ms 80ms backwards;\n\tanimation: valo-animate-in-slide-down 200ms 80ms backwards;\n}\n\n.mytheme .v-filterselect-suggestpopup [class$=\"status\"] > * {\n\tcolor: #3b3b3b;\n\ttext-decoration: none;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"page\"] {\n\tposition: absolute;\n\tz-index: 3;\n\tright: 0;\n\topacity: 0.2;\n\tfilter: alpha(opacity=20) ;\n\tcursor: pointer;\n\t-webkit-transition: all 200ms;\n\t-moz-transition: all 200ms;\n\ttransition: all 200ms;\n\twidth: 25px;\n\theight: 25px;\n\tline-height: 25px;\n\ttext-align: center;\n\tfont-family: ThemeIcons;\n\t-webkit-transform: scale(0.8);\n\t-moz-transform: scale(0.8);\n\t-ms-transform: scale(0.8);\n\t-o-transform: scale(0.8);\n\ttransform: scale(0.8);\n\tcolor: #464646;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"page\"]:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: block;\n\tborder-radius: 50%;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"page\"]:hover {\n\topacity: 1;\n\tfilter: none ;\n\tbackground: rgba(250, 250, 250, 0.5);\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"page\"]:hover:after {\n\ttop: -10px;\n\tbottom: -10px;\n\tleft: -20px;\n\tright: -20px;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"page\"] span {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-suggestpopup:hover div[class*=\"page\"] {\n\t-webkit-transform: scale(1);\n\t-moz-transform: scale(1);\n\t-ms-transform: scale(1);\n\t-o-transform: scale(1);\n\ttransform: scale(1);\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"prev\"] {\n\ttop: 0;\n\t-webkit-transform-origin: 100% 0%;\n\t-moz-transform-origin: 100% 0%;\n\t-ms-transform-origin: 100% 0%;\n\t-o-transform-origin: 100% 0%;\n\ttransform-origin: 100% 0%;\n\tborder-radius: 0 4px 0 4px;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"prev\"]:before {\n\tcontent: \"\\f0d8\";\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"next\"] {\n\tbottom: 0;\n\t-webkit-transform-origin: 100% 100%;\n\t-moz-transform-origin: 100% 100%;\n\t-ms-transform-origin: 100% 100%;\n\t-o-transform-origin: 100% 100%;\n\ttransform-origin: 100% 100%;\n\tborder-radius: 4px 0 4px 0;\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"next\"]:before {\n\tcontent: \"\\f0d7\";\n}\n\n.mytheme .v-filterselect-suggestpopup div[class*=\"-off\"] {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-no-input {\n\tcursor: pointer;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-filterselect-no-input [class*=\"input\"] {\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\tcursor: inherit;\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\ttext-shadow: inherit;\n\ttext-overflow: ellipsis;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-no-input [class*=\"input\"]:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-filterselect-no-input [class$=\"button\"] {\n\tborder-left: none !important;\n}\n\n.mytheme .v-filterselect-no-input:hover [class$=\"button\"]:before {\n\tcolor: inherit;\n}\n\n.mytheme .v-filterselect-borderless .v-filterselect-input {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: inherit;\n}\n\n.mytheme .v-filterselect-borderless .v-filterselect-input:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect-borderless .v-filterselect-input[class*=\"prompt\"] {\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-borderless .v-filterselect-button {\n\tborder: none;\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-borderless.v-filterselect-prompt .v-filterselect-input {\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-align-right input {\n\ttext-align: right;\n}\n\n.mytheme .v-filterselect-align-center input {\n\ttext-align: center;\n}\n\n.mytheme .v-filterselect-tiny {\n\theight: 28px;\n\t\n\tfont-size: 12px;\n}\n\n.mytheme .v-filterselect-tiny [class*=\"input\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 28px;\n\t\n\tpadding: 3px 5px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 100% !important;\n\theight: 100%;\n\tpadding-right: 29px;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-tiny .v-icon + [class*=\"input\"] {\n\tpadding-left: 28px;\n}\n\n.mytheme .v-filterselect-tiny img.v-icon {\n\tmax-height: 28px;\n\tmargin-left: 5px;\n}\n\n.mytheme .v-filterselect-tiny span.v-icon {\n\t\n\twidth: 28px;\n\tline-height: 1;\n\tpadding-top: 0.12em;\n\tmargin-left: 5px;\n}\n\n.mytheme .v-filterselect-tiny [class$=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tposition: absolute;\n\twidth: 28px;\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-filterselect-tiny [class$=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tposition: absolute;\n\twidth: 28px;\n\ttext-align: center;\n\ttop: 50%;\n\tline-height: 1;\n\tmargin-top: -0.47em;\n}\n\n.mytheme .v-filterselect-tiny [class$=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-tiny.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-tiny.v-disabled [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-tiny.v-disabled [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-tiny.v-readonly [class*=\"input\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect-tiny.v-readonly [class*=\"input\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-filterselect-tiny.v-readonly [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-tiny.v-readonly [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-compact, .mytheme .v-filterselect-small {\n\theight: 31px;\n\t\n}\n\n.mytheme .v-filterselect-compact [class*=\"input\"], .mytheme .v-filterselect-small [class*=\"input\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 31px;\n\t\n\tpadding: 3px 6px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 100% !important;\n\theight: 100%;\n\tpadding-right: 32px;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-compact .v-icon + [class*=\"input\"], .mytheme .v-filterselect-small .v-icon + [class*=\"input\"] {\n\tpadding-left: 31px;\n}\n\n.mytheme .v-filterselect-compact img.v-icon, .mytheme .v-filterselect-small img.v-icon {\n\tmax-height: 31px;\n\tmargin-left: 6px;\n}\n\n.mytheme .v-filterselect-compact span.v-icon, .mytheme .v-filterselect-small span.v-icon {\n\t\n\twidth: 31px;\n\tline-height: 1;\n\tpadding-top: 0.12em;\n\tmargin-left: 6px;\n}\n\n.mytheme .v-filterselect-compact [class$=\"button\"], .mytheme .v-filterselect-small [class$=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tposition: absolute;\n\twidth: 31px;\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-filterselect-compact [class$=\"button\"]:before, .mytheme .v-filterselect-small [class$=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tposition: absolute;\n\twidth: 31px;\n\ttext-align: center;\n\ttop: 50%;\n\tline-height: 1;\n\tmargin-top: -0.47em;\n}\n\n.mytheme .v-filterselect-compact [class$=\"button\"]:active:after, .mytheme .v-filterselect-small [class$=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-compact.v-disabled, .mytheme .v-filterselect-small.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-compact.v-disabled [class$=\"button\"], .mytheme .v-filterselect-small.v-disabled [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-compact.v-disabled [class$=\"button\"]:active:after, .mytheme .v-filterselect-small.v-disabled [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-compact.v-readonly [class*=\"input\"], .mytheme .v-filterselect-small.v-readonly [class*=\"input\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect-compact.v-readonly [class*=\"input\"]:focus, .mytheme .v-filterselect-small.v-readonly [class*=\"input\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-filterselect-compact.v-readonly [class$=\"button\"], .mytheme .v-filterselect-small.v-readonly [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-compact.v-readonly [class$=\"button\"]:active:after, .mytheme .v-filterselect-small.v-readonly [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-filterselect-large {\n\theight: 44px;\n\t\n\tfont-size: 20px;\n}\n\n.mytheme .v-filterselect-large [class*=\"input\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 44px;\n\t\n\tpadding: 5px 8px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 100% !important;\n\theight: 100%;\n\tpadding-right: 45px;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-large .v-icon + [class*=\"input\"] {\n\tpadding-left: 44px;\n}\n\n.mytheme .v-filterselect-large img.v-icon {\n\tmax-height: 44px;\n\tmargin-left: 8px;\n}\n\n.mytheme .v-filterselect-large span.v-icon {\n\t\n\twidth: 44px;\n\tline-height: 1;\n\tpadding-top: 0.12em;\n\tmargin-left: 8px;\n}\n\n.mytheme .v-filterselect-large [class$=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tposition: absolute;\n\twidth: 44px;\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-filterselect-large [class$=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tposition: absolute;\n\twidth: 44px;\n\ttext-align: center;\n\ttop: 50%;\n\tline-height: 1;\n\tmargin-top: -0.47em;\n}\n\n.mytheme .v-filterselect-large [class$=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-large.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-large.v-disabled [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-large.v-disabled [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-large.v-readonly [class*=\"input\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect-large.v-readonly [class*=\"input\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-filterselect-large.v-readonly [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-large.v-readonly [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-huge {\n\theight: 59px;\n\t\n\tfont-size: 26px;\n}\n\n.mytheme .v-filterselect-huge [class*=\"input\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 59px;\n\t\n\tpadding: 7px 10px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 100% !important;\n\theight: 100%;\n\tpadding-right: 60px;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-huge .v-icon + [class*=\"input\"] {\n\tpadding-left: 59px;\n}\n\n.mytheme .v-filterselect-huge img.v-icon {\n\tmax-height: 59px;\n\tmargin-left: 10px;\n}\n\n.mytheme .v-filterselect-huge span.v-icon {\n\t\n\twidth: 59px;\n\tline-height: 1;\n\tpadding-top: 0.12em;\n\tmargin-left: 10px;\n}\n\n.mytheme .v-filterselect-huge [class$=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tposition: absolute;\n\twidth: 59px;\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-filterselect-huge [class$=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tposition: absolute;\n\twidth: 59px;\n\ttext-align: center;\n\ttop: 50%;\n\tline-height: 1;\n\tmargin-top: -0.47em;\n}\n\n.mytheme .v-filterselect-huge [class$=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-filterselect-huge.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-filterselect-huge.v-disabled [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-huge.v-disabled [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-filterselect-huge.v-readonly [class*=\"input\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-filterselect-huge.v-readonly [class*=\"input\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-filterselect-huge.v-readonly [class$=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-filterselect-huge.v-readonly [class$=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-csslayout-well {\n\tbackground: #f5f5f5;\n\tcolor: #454545;\n\t-webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n}\n\n.mytheme .v-csslayout-well > div > [class*=\"-caption\"] {\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-csslayout-well > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-csslayout-well > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-csslayout-well > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-csslayout-well > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-csslayout-card {\n\tbackground: white;\n\tcolor: #474747;\n\tborder-radius: 4px;\n\tborder: 1px solid #d5d5d5;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-csslayout-card > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-csslayout-card > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-csslayout-card > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-csslayout-card > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-csslayout-v-component-group {\n\twhite-space: nowrap;\n\tposition: relative;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget:not(:last-child) {\n\tborder-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.v-upload:not(:last-child) .v-button {\n\tborder-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget:last-child {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget.v-upload:last-child .v-button {\n\tborder-top-left-radius: 0;\n\tborder-bottom-left-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget:first-child, .mytheme .v-csslayout-v-component-group .v-caption:first-child + .v-widget {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget.v-upload:first-child .v-button, .mytheme .v-csslayout-v-component-group .v-caption:first-child + .v-widget.v-upload .v-button {\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.first.first {\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.first.first.v-upload .v-button {\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.last.last {\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.last.last.v-upload .v-button {\n\tborder-radius: 0 4px 4px 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget {\n\tvertical-align: middle;\n\tmargin-left: -1px;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget:first-child {\n\tmargin-left: 0;\n}\n\n.mytheme .v-csslayout-v-component-group .v-widget:focus, .mytheme .v-csslayout-v-component-group .v-widget[class*=\"focus\"], .mytheme .v-csslayout-v-component-group .v-widget [class*=\"focus\"] {\n\tposition: relative;\n\tz-index: 5;\n}\n\n.mytheme .v-form fieldset {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n\theight: 100%;\n}\n\n.mytheme .v-form-content {\n\theight: 100%;\n\tbox-sizing: border-box;\n}\n\n.mytheme [class*=\"spacing\"] > tbody > [class*=\"row\"] > td {\n\tpadding-top: 12px;\n}\n\n.mytheme [class*=\"spacing\"] > tbody > [class*=\"firstrow\"] > td {\n\tpadding-top: 0;\n}\n\n.mytheme [class*=\"margin-top\"] > tbody > [class*=\"firstrow\"] > td {\n\tpadding-top: 37px;\n}\n\n.mytheme [class*=\"margin-bottom\"] > tbody > [class*=\"lastrow\"] > td {\n\tpadding-bottom: 37px;\n}\n\n.mytheme [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"captioncell\"] {\n\tpadding-left: 37px;\n}\n\n.mytheme [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h2, .mytheme [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tleft: 37px;\n}\n\n.mytheme [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] {\n\tpadding-right: 37px;\n}\n\n.mytheme [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h2, .mytheme [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tright: 37px;\n}\n\n.mytheme .v-formlayout > table {\n\tborder-spacing: 0;\n\tposition: relative;\n}\n\n.mytheme .v-formlayout.v-has-width > table, .mytheme .v-formlayout.v-has-width .v-formlayout-contentcell {\n\twidth: 100%;\n}\n\n.mytheme .v-formlayout-error-indicator {\n\twidth: 19px;\n}\n\n.mytheme .v-formlayout-captioncell {\n\tvertical-align: top;\n\tline-height: 36px;\n}\n\n.mytheme .v-formlayout-captioncell .v-caption {\n\tpadding-bottom: 0;\n}\n\n.mytheme .v-formlayout-captioncell .v-caption-h2, .mytheme .v-formlayout-captioncell .v-caption-h3, .mytheme .v-formlayout-captioncell .v-caption-h4 {\n\theight: 3em;\n}\n\n.mytheme .v-formlayout-contentcell .v-checkbox, .mytheme .v-formlayout-contentcell .v-radiobutton {\n\tfont-weight: 400;\n}\n\n.mytheme .v-formlayout-contentcell > .v-label-h2, .mytheme .v-formlayout-contentcell > .v-label-h3, .mytheme .v-formlayout-contentcell > .v-label-h4 {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\twidth: auto !important;\n\tmargin-top: -0.5em;\n\tpadding-bottom: 0.5em;\n\tborder-bottom: 1px solid #dfdfdf;\n}\n\n.mytheme .v-formlayout.light > table {\n\tpadding: 0;\n}\n\n.mytheme .v-formlayout.light > table > tbody > tr > td {\n\tpadding-top: 0;\n\theight: 37px;\n\tborder-bottom: 1px solid #eaeaea;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"lastrow\"] > td {\n\tborder-bottom: none;\n}\n\n.mytheme .v-formlayout.light > table > tbody > tr > [class*=\"captioncell\"] {\n\tcolor: #7d7d7d;\n\ttext-align: right;\n\tpadding-left: 13px;\n\tline-height: 37px;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] {\n\tpadding-right: 0;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect-input, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield-textfield {\n\twidth: 100%;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect input, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield input, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-richtextarea {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 0;\n\tpadding: 4px 7px;\n\t\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tbackground: transparent;\n\tborder: none;\n\tcolor: inherit;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-richtextarea.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-richtextarea:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none;\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-richtextarea:focus {\n\tbox-shadow: none;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textfield-prompt, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea-prompt, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-filterselect-prompt input, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-datefield-prompt input {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-richtextarea {\n\theight: auto;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h2, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tborder-bottom: none;\n\tleft: 0;\n\tright: 0;\n}\n\n.mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tmargin-top: 0;\n}\n\n.mytheme .v-formlayout.light .v-richtextarea {\n\tmargin: 5px 0;\n}\n\n.mytheme .v-formlayout.light .v-filterselect-button, .mytheme .v-formlayout.light .v-datefield-button {\n\tborder: none;\n}\n\n.mytheme .v-formlayout.light .v-filterselect-button:active:after, .mytheme .v-formlayout.light .v-datefield-button:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-formlayout.light .v-datefield-button {\n\tright: 0;\n\tleft: auto;\n}\n\n.mytheme .v-formlayout.light .v-checkbox {\n\tmargin-left: 7px;\n}\n\n.mytheme .v-grid {\n\tposition: relative;\n}\n\n.mytheme .v-grid-scroller {\n\tposition: absolute;\n\tz-index: 1;\n\toutline: none;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-grid-scroller-horizontal {\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow-y: hidden;\n\t-ms-overflow-y: hidden;\n}\n\n.mytheme .v-grid-scroller-vertical {\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\toverflow-x: hidden;\n\t-ms-overflow-x: hidden;\n}\n\n.mytheme .v-grid-tablewrapper {\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n\tz-index: 5;\n}\n\n.mytheme .v-grid-tablewrapper > table {\n\tborder-spacing: 0;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-grid-header-deco, .mytheme .v-grid-footer-deco {\n\tposition: absolute;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-grid-horizontal-scrollbar-deco {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-grid-header, .mytheme .v-grid-body, .mytheme .v-grid-footer {\n\tposition: absolute;\n\tleft: 0;\n\twidth: inherit;\n\tz-index: 10;\n}\n\n.mytheme .v-grid-header, .mytheme .v-grid-header-deco {\n\ttop: 0;\n}\n\n.mytheme .v-grid-footer, .mytheme .v-grid-footer-deco {\n\tbottom: 0;\n}\n\n.mytheme .v-grid-body {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n\tz-index: 0;\n\ttop: 0;\n}\n\n.mytheme .v-grid-body .v-grid-row {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.mytheme .v-grid-row {\n\tdisplay: block;\n}\n\n.mytheme .v-grid-row > td, .mytheme .v-grid-row > th {\n\tbackground-color: white;\n}\n\n.mytheme .v-grid-row {\n\twidth: inherit;\n}\n\n.mytheme .v-grid-cell {\n\tdisplay: block;\n\tfloat: left;\n\tpadding: 2px;\n\twhite-space: nowrap;\n\tbox-sizing: border-box;\n\toverflow: hidden;\n\tfont-size: 16px;\n}\n\n.mytheme .v-grid-cell.frozen {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.mytheme .v-grid-spacer {\n\tposition: absolute;\n\tdisplay: block;\n\tbackground-color: white;\n}\n\n.mytheme .v-grid-spacer > td {\n\twidth: 100%;\n\theight: 100%;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-grid {\n\toutline: none;\n}\n\n.mytheme .v-grid-scroller-vertical, .mytheme .v-grid-scroller-horizontal {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid-scroller-vertical {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-scroller-horizontal {\n\tborder-top: none;\n}\n\n.mytheme .v-grid-tablewrapper {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid .header-drag-table {\n\tborder-spacing: 0;\n\tposition: relative;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-grid .header-drag-table .v-grid-header {\n\tposition: absolute;\n}\n\n.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-cell {\n\tborder: 1px solid #d4d4d4;\n\tmargin-top: -10px;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90);\n\tz-index: 30000;\n}\n\n.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-drop-marker {\n\tbackground-color: #197de1;\n\tposition: absolute;\n\twidth: 3px;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-radius: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tpadding: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.v-grid-sidebar-popup {\n\tright: auto;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button {\n\tbackground: transparent;\n\tborder: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\toutline: none;\n\tpadding: 0 4px;\n\ttext-align: right;\n\tline-height: 1;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button[disabled] {\n\tcursor: default;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button::-moz-focus-inner {\n\tborder: 0;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tdisplay: block;\n\tfont-family: ThemeIcons, sans-serif;\n\tfont-size: 14px;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.closed {\n\tborder-radius: 0;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button {\n\twidth: 100%;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tfont-size: 14px;\n\tline-height: 1;\n}\n\n.v-ie .mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button {\n\tvertical-align: middle;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content {\n\tpadding: 4px 0;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content .gwt-MenuBar .gwt-MenuItem .column-hiding-toggle {\n\ttext-shadow: none;\n}\n\n.mytheme .v-grid-cell {\n\tbackground-color: white;\n\tpadding: 0 18px;\n\tline-height: 37px;\n\ttext-overflow: ellipsis;\n}\n\n.mytheme .v-grid-cell > * {\n\tline-height: 1.55;\n\tvertical-align: middle;\n}\n\n.mytheme .v-grid-cell > div {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-grid-cell.frozen {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tposition: relative;\n\tz-index: 11;\n}\n\n.mytheme .v-grid-cell.frozen + th, .mytheme .v-grid-cell.frozen + td {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-cell div.component-wrap {\n\twidth: 100%;\n}\n\n.mytheme .v-grid-row > td, .mytheme .v-grid-editor-cells > div {\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid-row > td:first-child, .mytheme .v-grid-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-editor-cells.frozen > div {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tborder-left: none;\n}\n\n.mytheme .v-grid-row-stripe > td {\n\tbackground-color: #f5f5f5;\n}\n\n.mytheme .v-grid-row-selected > td {\n\tbackground: #197de1;\n}\n\n.mytheme .v-grid-row-focused > td {\n\t\n}\n\n.mytheme .v-grid-header th {\n\tposition: relative;\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n\t\n\ttext-align: left;\n}\n\n.mytheme .v-grid-header th:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-header .sort-asc, .mytheme .v-grid-header .sort-desc {\n\tpadding-right: 35px;\n}\n\n.mytheme .v-grid-header .sort-asc:after, .mytheme .v-grid-header .sort-desc:after {\n\tfont-family: ThemeIcons, sans-serif;\n\tcontent: \"\\f0de\" \" \" attr(sort-order);\n\tposition: absolute;\n\tright: 18px;\n\tfont-size: 12px;\n}\n\n.mytheme .v-grid-header .sort-desc:after {\n\tcontent: \"\\f0dd\" \" \" attr(sort-order);\n}\n\n.mytheme .v-grid-column-resize-handle {\n\tposition: absolute;\n\twidth: 36px;\n\tright: -18px;\n\ttop: 0px;\n\tbottom: 0px;\n\tcursor: col-resize;\n\tz-index: 10;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-grid-column-resize-simple-indicator {\n\tposition: absolute;\n\twidth: 3px;\n\ttop: 0px;\n\tleft: 18px;\n\tz-index: 9001;\n\tbackground: #fff;\n\tbox-shadow: 0px 0px 5px #000;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-grid-footer td {\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-top: 1px solid #d4d4d4;\n\tborder-bottom: none;\n\t\n}\n\n.mytheme .v-grid-footer td:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-header .v-grid-cell, .mytheme .v-grid-footer .v-grid-cell {\n\toverflow: visible;\n}\n\n.mytheme .v-grid-column-header-content, .mytheme .v-grid-column-footer-content {\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\tvertical-align: baseline;\n}\n\n.mytheme .v-grid-header-deco {\n\tborder-top: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-grid-footer-deco {\n\tborder-bottom: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-grid-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tborder-top: none;\n}\n\n.mytheme .v-grid-cell-focused {\n\tposition: relative;\n}\n\n.mytheme .v-grid-cell-focused:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder: 2px solid #197de1;\n\tdisplay: none;\n\tpointer-events: none;\n}\n\n.mytheme .v-grid:focus .v-grid-cell-focused:before {\n\tdisplay: block;\n}\n\n.mytheme .v-grid.v-disabled:focus .v-grid-cell-focused:before {\n\tdisplay: none;\n}\n\n.mytheme .v-grid-editor {\n\tposition: absolute;\n\tz-index: 20;\n\toverflow: hidden;\n\tleft: 0;\n\tright: 0;\n\tborder: 1px solid #d4d4d4;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tmargin-top: -1px;\n\t-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n}\n\n.mytheme .v-grid-editor.unbuffered .v-grid-editor-footer {\n\twidth: 100%;\n}\n\n.mytheme .v-grid-editor-cells {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-grid-editor-cells.frozen {\n\tz-index: 2;\n}\n\n.mytheme .v-grid-editor-cells > div {\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tvertical-align: middle;\n\tbackground: white;\n}\n\n.mytheme .v-grid-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-grid-editor-cells > div > * {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n\n.mytheme .v-grid-editor-cells > div .v-filterselect {\n\tpadding-left: 0;\n}\n\n.mytheme .v-grid-editor-cells > div input[type=\"text\"], .mytheme .v-grid-editor-cells > div input[type=\"text\"].v-filterselect-input, .mytheme .v-grid-editor-cells > div input[type=\"password\"] {\n\tpadding-left: 18px;\n}\n\n.mytheme .v-grid-editor-cells > div input[type=\"text\"]:not(.v-filterselect-input), .mytheme .v-grid-editor-cells > div input[type=\"password\"] {\n\tpadding-right: 9px;\n}\n\n.mytheme .v-grid-editor-cells > div input[type=\"checkbox\"] {\n\tmargin-left: 18px;\n}\n\n.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-filterselect {\n\tmin-width: 100%;\n\tmax-width: 100%;\n\tmin-height: 100%;\n\tmax-height: 100%;\n}\n\n.mytheme .v-grid-editor-cells > div .v-select, .mytheme .v-grid-editor-cells > div .v-select-select {\n\tmin-width: 100%;\n\tmax-width: 100%;\n}\n\n.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell {\n\tfloat: none;\n}\n\n.mytheme .v-grid-editor-cells .error::before {\n\tposition: absolute;\n\tdisplay: block;\n\theight: 0;\n\twidth: 0;\n\tcontent: \"\";\n\tborder-top: 5px solid red;\n\tborder-right: 5px solid transparent;\n}\n\n.mytheme .v-grid-editor-cells .error, .mytheme .v-grid-editor-cells .error > input {\n\tbackground-color: #fee;\n}\n\n.mytheme .v-grid-editor-footer {\n\tdisplay: table;\n\theight: 37px;\n\tborder-top: 1px solid #d4d4d4;\n\tmargin-top: -1px;\n\tbackground: white;\n\tpadding: 0 5px;\n}\n\n.mytheme .v-grid-editor-footer + .v-grid-editor-cells > div {\n\tborder-bottom: none;\n\tborder-top: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid-editor-footer:first-child {\n\tborder-top: none;\n\tmargin-top: 0;\n\tborder-bottom: 1px solid #d4d4d4;\n\tmargin-bottom: -1px;\n}\n\n.mytheme .v-grid-editor-message, .mytheme .v-grid-editor-buttons {\n\tdisplay: table-cell;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n.mytheme .v-grid-editor-message {\n\twidth: 100%;\n\tposition: relative;\n}\n\n.mytheme .v-grid-editor-message > div {\n\tposition: absolute;\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\ttop: 0;\n}\n\n.mytheme .v-grid-editor-save {\n\tmargin-right: 4px;\n}\n\n.mytheme .v-grid-spacer {\n\tpadding-left: 1px;\n}\n\n.mytheme .v-grid-spacer > td {\n\tdisplay: block;\n\tpadding: 0;\n\tbackground-color: white;\n\tborder-top: 1px solid #eeeeee;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid-spacer.stripe > td {\n\tbackground-color: #f5f5f5;\n\tborder-top: 1px solid #e5e5e5;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-grid-spacer-deco-container {\n\tborder-top: 1px solid transparent;\n\tposition: relative;\n\ttop: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-grid-spacer-deco {\n\ttop: 0;\n\tleft: 0;\n\twidth: 2px;\n\tbackground-color: #197de1;\n\tposition: absolute;\n\theight: 100%;\n\tpointer-events: none;\n}\n\n.mytheme .v-grid-cell > .v-progressbar {\n\twidth: 100%;\n}\n\n.mytheme .v-grid {\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-grid.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-grid-header .v-grid-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-grid-header .v-grid-cell.dragged {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\t-webkit-transition: opacity 0.3s ease-in-out;\n\t-moz-transition: opacity 0.3s ease-in-out;\n\ttransition: opacity 0.3s ease-in-out;\n}\n\n.mytheme .v-grid-header .v-grid-cell.dragged-column-header {\n\tmargin-top: -19px;\n}\n\n.mytheme .v-grid-footer .v-grid-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-grid-header-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-grid-footer-deco, .mytheme .v-grid-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-grid-row-selected > .v-grid-cell {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #c8dbed;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tborder-color: #1d69b4;\n}\n\n.mytheme .v-grid-row-selected > .v-grid-cell-focused:before {\n\tborder-color: #71b0ef;\n}\n\n.mytheme .v-grid-editor {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tborder-color: #197de1;\n}\n\n.mytheme .v-grid-editor-footer {\n\tfont-size: 14px;\n\tpadding: 0 6px;\n\tbackground: #fafafa;\n\t-webkit-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n}\n\n.mytheme .v-grid-editor-footer:first-child {\n\t-webkit-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n}\n\n.mytheme .v-grid-editor-cells {\n\tz-index: 1;\n}\n\n.mytheme .v-grid-editor-cells > div:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\theight: 100%;\n\tvertical-align: middle;\n}\n\n.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell {\n\tfloat: none;\n}\n\n.mytheme .v-grid-editor-cells > div .error::before {\n\tborder-top: 9px solid #ed473b;\n\tborder-right: 9px solid transparent;\n}\n\n.mytheme .v-grid-editor-cells > div .error, .mytheme .v-grid-editor-cells > div .error > input {\n\tbackground-color: #fffbfb;\n}\n\n.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 1px 0 #f2f2f2;\n\tbox-shadow: inset 0 1px 0 #f2f2f2;\n}\n\n.mytheme .v-grid-editor-cells > div input[type=\"text\"].v-datefield-textfield {\n\tpadding-left: 44.4px;\n}\n\n.mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus {\n\tposition: relative;\n}\n\n.mytheme .v-grid-editor-cells > div .v-select {\n\tpadding-left: 9px;\n\tpadding-right: 9px;\n}\n\n.mytheme .v-grid-editor-cells > div .v-checkbox {\n\tmargin: 0 9px 0 18px;\n}\n\n.mytheme .v-grid-editor-cells > div .v-checkbox > input[type=\"checkbox\"] {\n\tmargin-left: 0;\n}\n\n.mytheme .v-grid-editor-cells > div .v-checkbox > label {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-grid-editor-message > div:before {\n\tdisplay: inline-block;\n\tcolor: #ed473b;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n\tcontent: \"!\";\n}\n\n.mytheme .v-grid-editor-save, .mytheme .v-grid-editor-cancel {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tfont-weight: 400;\n\ttext-decoration: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 6px 6px;\n\tmargin: 0;\n\toutline: none;\n}\n\n.mytheme .v-grid-editor-save:hover, .mytheme .v-grid-editor-cancel:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-grid-editor-save.v-disabled, .mytheme .v-grid-editor-cancel.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-grid-spacer {\n\tmargin-top: -1px;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-content {\n\tmargin: 0 0 2px;\n\tpadding: 4px 4px 2px;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-grid-sidebar.v-contextmenu.closed {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-grid-scroller::-webkit-scrollbar {\n\tborder: none;\n}\n\n.mytheme .v-grid-scroller::-webkit-scrollbar-thumb {\n\tborder-radius: 10px;\n\tborder: 4px solid transparent;\n\tbackground: rgba(0, 0, 0, 0.3);\n\t-webkit-background-clip: content-box;\n\tbackground-clip: content-box;\n}\n\n.mytheme .v-grid-scroller-vertical::-webkit-scrollbar-thumb {\n\tmin-height: 30px;\n}\n\n.mytheme .v-grid-scroller-horizontal::-webkit-scrollbar-thumb {\n\tmin-width: 30px;\n}\n\n.mytheme .v-grid-row-drag-badge {\n\tbackground-color: red;\n\tcolor: white;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 30px;\n\tborder-radius: 10px;\n\tline-height: 30px;\n\ttext-align: center;\n\tfloat: left;\n}\n\n.mytheme .v-grid-row-drag-top, .mytheme .v-grid-row-drag-bottom {\n\tz-index: 100;\n}\n\n.mytheme .v-grid-row-drag-top:before, .mytheme .v-grid-row-drag-bottom:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\theight: 2px;\n\twidth: 100%;\n\tbackground: #197de1;\n\tpointer-events: none;\n\tborder: none;\n}\n\n.mytheme .v-grid-row-drag-bottom:after {\n\tbottom: -1px;\n}\n\n.mytheme .v-grid-row-drag-top:before {\n\ttop: -1px;\n}\n\n.mytheme .v-grid-row-drag-top:first-child:before {\n\ttop: 0;\n}\n\n.mytheme .v-grid-row-drag-center:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 2px;\n\tborder: 2px solid #197de1;\n\tpointer-events: none;\n}\n\n.mytheme .v-grid-row-selected.v-grid-row-drag-center:after {\n\tborder-color: #1463b3;\n}\n\n.mytheme .v-grid-row-selected.v-grid-row-drag-top:before, .mytheme .v-grid-row-selected.v-grid-row-drag-bottom:after {\n\tbackground: #1463b3;\n}\n\n.mytheme .v-grid-body-drag-top:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tpointer-events: none;\n\tborder: 2px solid #197de1;\n\tz-index: 100;\n}\n\n.mytheme .v-textfield {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 4px;\n\tpadding: 4px 9px;\n\tborder: 1px solid #c5c5c5;\n\tbackground: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\twidth: 185px;\n}\n\n.mytheme .v-textfield.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-textfield:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-textfield[class*=\"prompt\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-textfield-readonly {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-textfield-readonly:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-textfield-error {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-textfield-error-info {\n\tborder-color: #00a7f5 !important;\n\tbackground: #fafdff;\n\tcolor: #195774;\n}\n\n.mytheme .v-textfield-error-warning {\n\tborder-color: #fc9c00 !important;\n\tbackground: #fffdfa;\n\tcolor: #745119;\n}\n\n.mytheme .v-textfield-error-error {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-textfield-error-critical {\n\tborder-color: #fa007d !important;\n\tbackground: #fffafc;\n\tcolor: #741947;\n}\n\n.mytheme .v-textfield-error-system {\n\tborder-color: #bb00ff !important;\n\tbackground: #fefaff;\n\tcolor: #5c1974;\n}\n\n.mytheme .v-textfield-borderless {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: inherit;\n}\n\n.mytheme .v-textfield-borderless:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-textfield-borderless[class*=\"prompt\"] {\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-textfield-tiny {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 28px;\n\tborder-radius: 4px;\n\tpadding: 3px 7px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tfont-size: 12px;\n}\n\n.mytheme .v-textfield-compact, .mytheme .v-textfield-small {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 31px;\n\tborder-radius: 4px;\n\tpadding: 3px 8px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n}\n\n.mytheme .v-textfield-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-textfield-large {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 44px;\n\tborder-radius: 4px;\n\tpadding: 5px 10px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tfont-size: 20px;\n}\n\n.mytheme .v-textfield-huge {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 59px;\n\tborder-radius: 4px;\n\tpadding: 7px 12px;\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tfont-size: 26px;\n}\n\n.mytheme .v-slot-inline-icon {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 37px;\n\tline-height: 35px;\n\ttext-align: center;\n\tfont-size: 16px;\n}\n\n.mytheme .v-caption-inline-icon img.v-icon {\n\tleft: 11px;\n\tbottom: 11px;\n}\n\n.mytheme .v-textfield-inline-icon {\n\tpadding-left: 37px;\n}\n\n.mytheme .v-slot-inline-icon.v-slot-tiny {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-tiny {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-tiny .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-tiny .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-tiny span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 28px;\n\tline-height: 26px;\n\ttext-align: center;\n\tfont-size: 12px;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-tiny img.v-icon {\n\tleft: 6px;\n\tbottom: 6px;\n}\n\n.mytheme .v-textfield-inline-icon.v-textfield-tiny {\n\tpadding-left: 28px;\n}\n\n.mytheme .v-slot-inline-icon.v-slot-compact {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-compact {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-compact .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-compact .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-compact span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 31px;\n\tline-height: 29px;\n\ttext-align: center;\n\tfont-size: 16px;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-compact img.v-icon {\n\tleft: 8px;\n\tbottom: 8px;\n}\n\n.mytheme .v-textfield-inline-icon.v-textfield-compact {\n\tpadding-left: 31px;\n}\n\n.mytheme .v-slot-inline-icon.v-slot-small {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-small {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-small .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-small .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-small span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 31px;\n\tline-height: 29px;\n\ttext-align: center;\n\tfont-size: 14px;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-small img.v-icon {\n\tleft: 8px;\n\tbottom: 8px;\n}\n\n.mytheme .v-textfield-inline-icon.v-textfield-small {\n\tpadding-left: 31px;\n}\n\n.mytheme .v-slot-inline-icon.v-slot-large {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-large {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-large .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-large .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-large span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 44px;\n\tline-height: 42px;\n\ttext-align: center;\n\tfont-size: 20px;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-large img.v-icon {\n\tleft: 14px;\n\tbottom: 14px;\n}\n\n.mytheme .v-textfield-inline-icon.v-textfield-large {\n\tpadding-left: 44px;\n}\n\n.mytheme .v-slot-inline-icon.v-slot-huge {\n\tposition: relative;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-huge {\n\tpadding: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-huge .v-captiontext {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n\tmargin: 0;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-huge .v-icon {\n\tposition: absolute;\n\tz-index: 10;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-huge span.v-icon {\n\tleft: 1px;\n\tbottom: 1px;\n\twidth: 59px;\n\tline-height: 57px;\n\ttext-align: center;\n\tfont-size: 26px;\n}\n\n.mytheme .v-caption-inline-icon.v-caption-huge img.v-icon {\n\tleft: 22px;\n\tbottom: 22px;\n}\n\n.mytheme .v-textfield-inline-icon.v-textfield-huge {\n\tpadding-left: 59px;\n}\n\n.mytheme .v-textfield-align-right {\n\ttext-align: right;\n}\n\n.mytheme .v-textfield-align-center {\n\ttext-align: center;\n}\n\n.mytheme .v-textarea {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 4px;\n\tpadding: 6px;\n\tborder: 1px solid #c5c5c5;\n\tbackground: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\tresize: none;\n\twhite-space: pre-wrap;\n\twidth: 185px;\n}\n\n.mytheme .v-textarea.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-textarea:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-textarea[class*=\"prompt\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-textarea-readonly {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-textarea-readonly:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-textarea-error {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-textarea-borderless {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: inherit;\n}\n\n.mytheme .v-textarea-borderless:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-textarea-borderless[class*=\"prompt\"] {\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-textarea-tiny {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 28px;\n\tborder-radius: 4px;\n\tpadding: 6px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\tresize: none;\n\twhite-space: pre-wrap;\n\tfont-size: 12px;\n}\n\n.mytheme .v-textarea-small {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 31px;\n\tborder-radius: 4px;\n\tpadding: 6px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\tresize: none;\n\twhite-space: pre-wrap;\n\tfont-size: 14px;\n}\n\n.mytheme .v-textarea-large {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 44px;\n\tborder-radius: 4px;\n\tpadding: 6px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\tresize: none;\n\twhite-space: pre-wrap;\n\tfont-size: 20px;\n}\n\n.mytheme .v-textarea-huge {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 59px;\n\tborder-radius: 4px;\n\tpadding: 6px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\tresize: none;\n\twhite-space: pre-wrap;\n\tfont-size: 26px;\n}\n\n.mytheme .v-textarea-align-right {\n\ttext-align: right;\n}\n\n.mytheme .v-textarea-align-center {\n\ttext-align: center;\n}\n\n.mytheme .v-datefield {\n\tposition: relative;\n\twidth: 185px;\n\theight: 37px;\n\tborder-radius: 4px;\n}\n\n.mytheme .v-datefield [class*=\"textfield\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 4px;\n\tpadding: 4px 9px;\n\tborder: 1px solid #c5c5c5;\n\tbackground: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tpadding-left: 44.4px;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield [class*=\"textfield\"].v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield [class*=\"textfield\"]:focus {\n\toutline: none;\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-datefield [class*=\"textfield\"][class*=\"prompt\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-datefield[class*=\"prompt\"] > [class*=\"textfield\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-datefield [class*=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\twidth: 37px;\n\tline-height: 35px;\n\ttext-align: center;\n\tfont: inherit;\n\toutline: none;\n\tmargin: 0;\n\ttop: 1px;\n\tbottom: 1px;\n\tleft: 1px;\n\tborder: none;\n\tborder-right: 1px solid #e4e4e4;\n\tcolor: #a3a3a3;\n\tborder-radius: 3px 0 0 3px;\n}\n\n.mytheme .v-datefield [class*=\"button\"]:hover {\n\tcolor: #474747;\n}\n\n.mytheme .v-datefield [class*=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f073\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-datefield [class*=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tbackground-color: rgba(128, 128, 128, 0.2);\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield.v-disabled [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield.v-disabled [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield.v-readonly [class*=\"textfield\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield.v-readonly [class*=\"textfield\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-datefield.v-readonly [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield.v-readonly [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-error .v-datefield-textfield {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-datefield-error .v-datefield-button {\n\tcolor: #ed473b;\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-datefield-error-info .v-datefield-textfield {\n\tborder-color: #00a7f5 !important;\n\tbackground: #fafdff;\n\tcolor: #195774;\n}\n\n.mytheme .v-datefield-error-info .v-datefield-button {\n\tcolor: #00a7f5;\n\tborder-color: #00a7f5;\n}\n\n.mytheme .v-datefield-error-warning .v-datefield-textfield {\n\tborder-color: #fc9c00 !important;\n\tbackground: #fffdfa;\n\tcolor: #745119;\n}\n\n.mytheme .v-datefield-error-warning .v-datefield-button {\n\tcolor: #fc9c00;\n\tborder-color: #fc9c00;\n}\n\n.mytheme .v-datefield-error-error .v-datefield-textfield {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-datefield-error-error .v-datefield-button {\n\tcolor: #ed473b;\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-datefield-error-critical .v-datefield-textfield {\n\tborder-color: #fa007d !important;\n\tbackground: #fffafc;\n\tcolor: #741947;\n}\n\n.mytheme .v-datefield-error-critical .v-datefield-button {\n\tcolor: #fa007d;\n\tborder-color: #fa007d;\n}\n\n.mytheme .v-datefield-error-system .v-datefield-textfield {\n\tborder-color: #bb00ff !important;\n\tbackground: #fefaff;\n\tcolor: #5c1974;\n}\n\n.mytheme .v-datefield-error-system .v-datefield-button {\n\tcolor: #bb00ff;\n\tborder-color: #bb00ff;\n}\n\n.mytheme .v-datefield-full {\n\twidth: 240px;\n}\n\n.mytheme .v-datefield-day {\n\twidth: 185px;\n}\n\n.mytheme .v-datefield-month {\n\twidth: 120px;\n}\n\n.mytheme .v-datefield-year {\n\twidth: 104px;\n}\n\n.mytheme .v-datefield-popup {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\tmargin-top: 5px !important;\n\tmargin-bottom: 5px !important;\n\tmargin-right: 5px !important;\n\tcursor: default;\n\twidth: auto;\n}\n\n.mytheme .v-datefield-popup[class*=\"animate-in\"] {\n\t-webkit-animation: valo-overlay-animate-in 120ms;\n\t-moz-animation: valo-overlay-animate-in 120ms;\n\tanimation: valo-overlay-animate-in 120ms;\n}\n\n.mytheme .v-datefield-popup[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-fade 120ms;\n\t-moz-animation: valo-animate-out-fade 120ms;\n\tanimation: valo-animate-out-fade 120ms;\n}\n\n.mytheme .v-datefield-popup table {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n\tmargin: 0 auto;\n}\n\n.mytheme .v-datefield-popup td {\n\tpadding: 2px;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel {\n\tfont-size: 16px;\n\ttext-align: center;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel:focus {\n\toutline: none;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day {\n\tbox-sizing: border-box;\n\twidth: 30px;\n\theight: 26px;\n\tborder: 1px solid transparent;\n\tline-height: 26px;\n\ttext-align: center;\n\tfont-size: 14px;\n\tbackground: #fafafa;\n\tborder-radius: 2px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-offmonth {\n\tcolor: #a0a0a0;\n\tbackground: transparent;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-today {\n\tcolor: #191919;\n\tfont-weight: 600;\n\tborder-color: #afafaf;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover {\n\tcolor: #c8dbed;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tborder: none;\n\tfont-weight: 600;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tposition: relative;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover {\n\tcolor: #a0a0a0;\n\tcursor: not-allowed;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays {\n\theight: 26px;\n\tcolor: rgba(133, 133, 133, 0.85);\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays strong {\n\tfont: inherit;\n\tfont-size: 14px;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-header {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-datefield-popup td[class*=\"year\"] button, .mytheme .v-datefield-popup td[class*=\"month\"] button {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tmargin: 0;\n\tcursor: pointer;\n\tcolor: transparent;\n\tfont-size: 0;\n\twidth: 19px;\n\theight: 25px;\n\toutline: none;\n\tposition: relative;\n\tvertical-align: middle;\n}\n\n.mytheme .v-datefield-popup td[class*=\"year\"] button:before, .mytheme .v-datefield-popup td[class*=\"month\"] button:before {\n\tcolor: #a0a0a0;\n\tfont-size: 21px;\n\tline-height: 24px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n}\n\n.mytheme .v-datefield-popup td[class*=\"year\"] button:hover:before, .mytheme .v-datefield-popup td[class*=\"month\"] button:hover:before {\n\tcolor: #197de1;\n}\n\n.mytheme .v-datefield-popup td[class*=\"year\"] button.outside-range, .mytheme .v-datefield-popup td[class*=\"month\"] button.outside-range {\n\tcursor: default;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n}\n\n.mytheme .v-datefield-popup td[class*=\"year\"] button.outside-range:hover:before, .mytheme .v-datefield-popup td[class*=\"month\"] button.outside-range:hover:before {\n\tcolor: #a0a0a0;\n}\n\n.mytheme .v-datefield-popup .v-button-prevyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f100\";\n}\n\n.mytheme .v-datefield-popup .v-button-prevmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f104\";\n}\n\n.mytheme .v-datefield-popup .v-button-nextyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f101\";\n}\n\n.mytheme .v-datefield-popup .v-button-nextmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f105\";\n}\n\n.mytheme .v-datefield-popup td.v-datefield-calendarpanel-month {\n\twidth: 148px;\n\tcolor: #197de1;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month {\n\twidth: 74px;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child {\n\twidth: 30px;\n\tcolor: rgba(133, 133, 133, 0.85);\n\tfont-size: 14px;\n\tdisplay: inline-block;\n\ttext-align: left;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber {\n\tposition: relative;\n}\n\n.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumbers .v-first:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 38px;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 34px;\n\tborder-top: 1px solid #eaeaea;\n\tborder-right: 1px solid #eaeaea;\n\tborder-top-right-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\tbackground: #fafafa;\n}\n\n.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time {\n\twidth: 100%;\n\tfont-size: 14px;\n}\n\n.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time .v-label {\n\tdisplay: inline;\n\tmargin: 0 0.1em;\n\tfont-weight: 400;\n}\n\n.mytheme .v-datefield-calendarpanel {\n\tfont-size: 16px;\n\ttext-align: center;\n}\n\n.mytheme .v-datefield-calendarpanel:focus {\n\toutline: none;\n}\n\n.mytheme .v-datefield-calendarpanel-day {\n\tbox-sizing: border-box;\n\twidth: 30px;\n\theight: 26px;\n\tborder: 1px solid transparent;\n\tline-height: 26px;\n\ttext-align: center;\n\tfont-size: 14px;\n\tbackground: #fafafa;\n\tborder-radius: 2px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n}\n\n.mytheme .v-datefield-calendarpanel-day:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-datefield-calendarpanel-day-offmonth {\n\tcolor: #a0a0a0;\n\tbackground: transparent;\n}\n\n.mytheme .v-datefield-calendarpanel-day-today {\n\tcolor: #191919;\n\tfont-weight: 600;\n\tborder-color: #afafaf;\n}\n\n.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover {\n\tcolor: #c8dbed;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tborder: none;\n\tfont-weight: 600;\n}\n\n.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tposition: relative;\n}\n\n.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover {\n\tcolor: #a0a0a0;\n\tcursor: not-allowed;\n}\n\n.mytheme .v-datefield-calendarpanel-weekdays {\n\theight: 26px;\n\tcolor: rgba(133, 133, 133, 0.85);\n}\n\n.mytheme .v-datefield-calendarpanel-weekdays strong {\n\tfont: inherit;\n\tfont-size: 14px;\n}\n\n.mytheme .v-datefield-calendarpanel-header {\n\twhite-space: nowrap;\n}\n\n.mytheme td[class*=\"year\"] button, .mytheme td[class*=\"month\"] button {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tmargin: 0;\n\tcursor: pointer;\n\tcolor: transparent;\n\tfont-size: 0;\n\twidth: 19px;\n\theight: 25px;\n\toutline: none;\n\tposition: relative;\n\tvertical-align: middle;\n}\n\n.mytheme td[class*=\"year\"] button:before, .mytheme td[class*=\"month\"] button:before {\n\tcolor: #a0a0a0;\n\tfont-size: 21px;\n\tline-height: 24px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n}\n\n.mytheme td[class*=\"year\"] button:hover:before, .mytheme td[class*=\"month\"] button:hover:before {\n\tcolor: #197de1;\n}\n\n.mytheme td[class*=\"year\"] button.outside-range, .mytheme td[class*=\"month\"] button.outside-range {\n\tcursor: default;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n}\n\n.mytheme td[class*=\"year\"] button.outside-range:hover:before, .mytheme td[class*=\"month\"] button.outside-range:hover:before {\n\tcolor: #a0a0a0;\n}\n\n.mytheme .v-button-prevyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f100\";\n}\n\n.mytheme .v-button-prevmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f104\";\n}\n\n.mytheme .v-button-nextyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f101\";\n}\n\n.mytheme .v-button-nextmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f105\";\n}\n\n.mytheme td.v-datefield-calendarpanel-month {\n\twidth: 148px;\n\tcolor: #197de1;\n}\n\n.mytheme .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month {\n\twidth: 74px;\n}\n\n.mytheme .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child {\n\twidth: 30px;\n\tcolor: rgba(133, 133, 133, 0.85);\n\tfont-size: 14px;\n\tdisplay: inline-block;\n\ttext-align: left;\n}\n\n.mytheme .v-datefield-calendarpanel-weeknumber {\n\tposition: relative;\n}\n\n.mytheme .v-datefield-calendarpanel-weeknumbers .v-first:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 38px;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 34px;\n\tborder-top: 1px solid #eaeaea;\n\tborder-right: 1px solid #eaeaea;\n\tborder-top-right-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\tbackground: #fafafa;\n}\n\n.mytheme td.v-datefield-calendarpanel-time {\n\twidth: 100%;\n\tfont-size: 14px;\n}\n\n.mytheme td.v-datefield-calendarpanel-time .v-label {\n\tdisplay: inline;\n\tmargin: 0 0.1em;\n\tfont-weight: 400;\n}\n\n.mytheme .v-datefield-borderless .v-datefield-textfield {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: inherit;\n}\n\n.mytheme .v-datefield-borderless .v-datefield-textfield:focus {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield-borderless .v-datefield-textfield[class*=\"prompt\"] {\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-borderless .v-datefield-button {\n\tborder: none;\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-align-right input {\n\ttext-align: right;\n}\n\n.mytheme .v-datefield-align-center input {\n\ttext-align: center;\n}\n\n.mytheme .v-datefield-tiny {\n\theight: 28px;\n\tborder-radius: 4px;\n\tfont-size: 12px;\n}\n\n.mytheme .v-datefield-tiny [class*=\"textfield\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 28px;\n\tborder-radius: 4px;\n\tpadding: 3px 7px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tpadding-left: 33.6px;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-tiny [class*=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\twidth: 28px;\n\tline-height: 28px;\n\ttext-align: center;\n\tfont: inherit;\n\toutline: none;\n\tmargin: 0;\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-datefield-tiny [class*=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f073\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-datefield-tiny [class*=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-tiny.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-tiny.v-disabled [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-tiny.v-disabled [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-tiny.v-readonly [class*=\"textfield\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield-tiny.v-readonly [class*=\"textfield\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-datefield-tiny.v-readonly [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-tiny.v-readonly [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-compact, .mytheme .v-datefield-small {\n\theight: 31px;\n\tborder-radius: 4px;\n}\n\n.mytheme .v-datefield-compact [class*=\"textfield\"], .mytheme .v-datefield-small [class*=\"textfield\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 31px;\n\tborder-radius: 4px;\n\tpadding: 3px 8px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tpadding-left: 37.2px;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-compact [class*=\"button\"], .mytheme .v-datefield-small [class*=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\twidth: 31px;\n\tline-height: 31px;\n\ttext-align: center;\n\tfont: inherit;\n\toutline: none;\n\tmargin: 0;\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-datefield-compact [class*=\"button\"]:before, .mytheme .v-datefield-small [class*=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f073\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-datefield-compact [class*=\"button\"]:active:after, .mytheme .v-datefield-small [class*=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-compact.v-disabled, .mytheme .v-datefield-small.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-compact.v-disabled [class*=\"button\"], .mytheme .v-datefield-small.v-disabled [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-compact.v-disabled [class*=\"button\"]:active:after, .mytheme .v-datefield-small.v-disabled [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-compact.v-readonly [class*=\"textfield\"], .mytheme .v-datefield-small.v-readonly [class*=\"textfield\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield-compact.v-readonly [class*=\"textfield\"]:focus, .mytheme .v-datefield-small.v-readonly [class*=\"textfield\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-datefield-compact.v-readonly [class*=\"button\"], .mytheme .v-datefield-small.v-readonly [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-compact.v-readonly [class*=\"button\"]:active:after, .mytheme .v-datefield-small.v-readonly [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-datefield-large {\n\theight: 44px;\n\tborder-radius: 4px;\n\tfont-size: 20px;\n}\n\n.mytheme .v-datefield-large [class*=\"textfield\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 44px;\n\tborder-radius: 4px;\n\tpadding: 5px 10px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tpadding-left: 52.8px;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-large [class*=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\twidth: 44px;\n\tline-height: 44px;\n\ttext-align: center;\n\tfont: inherit;\n\toutline: none;\n\tmargin: 0;\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-datefield-large [class*=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f073\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-datefield-large [class*=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-large.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-large.v-disabled [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-large.v-disabled [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-large.v-readonly [class*=\"textfield\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield-large.v-readonly [class*=\"textfield\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-datefield-large.v-readonly [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-large.v-readonly [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-huge {\n\theight: 59px;\n\tborder-radius: 4px;\n\tfont-size: 26px;\n}\n\n.mytheme .v-datefield-huge [class*=\"textfield\"] {\n\tbox-sizing: border-box;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 59px;\n\tborder-radius: 4px;\n\tpadding: 7px 12px;\n\t\n\t\n\t\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\tpadding-left: 70.8px;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-huge [class*=\"button\"] {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\t-webkit-appearance: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tposition: absolute;\n\tz-index: 10;\n\twidth: 59px;\n\tline-height: 59px;\n\ttext-align: center;\n\tfont: inherit;\n\toutline: none;\n\tmargin: 0;\n\tborder-radius: 4px 0 0 4px;\n}\n\n.mytheme .v-datefield-huge [class*=\"button\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f073\";\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-datefield-huge [class*=\"button\"]:active:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-datefield-huge.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-datefield-huge.v-disabled [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-huge.v-disabled [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-datefield-huge.v-readonly [class*=\"textfield\"] {\n\tbackground: #fafafa;\n\tcolor: #464646;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-datefield-huge.v-readonly [class*=\"textfield\"]:focus {\n\tbox-shadow: none;\n\tborder-color: #c5c5c5;\n}\n\n.mytheme .v-datefield-huge.v-readonly [class*=\"button\"] {\n\tcursor: default;\n\tpointer-events: none;\n}\n\n.mytheme .v-datefield-huge.v-readonly [class*=\"button\"]:active:after {\n\tdisplay: none;\n}\n\n.mytheme .v-inline-datefield-calendarpanel {\n\tfont-size: 16px;\n\ttext-align: center;\n}\n\n.mytheme .v-inline-datefield-calendarpanel:focus {\n\toutline: none;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day {\n\tbox-sizing: border-box;\n\twidth: 30px;\n\theight: 26px;\n\tborder: 1px solid transparent;\n\tline-height: 26px;\n\ttext-align: center;\n\tfont-size: 14px;\n\tbackground: #fafafa;\n\tborder-radius: 2px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day-offmonth {\n\tcolor: #a0a0a0;\n\tbackground: transparent;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day-today {\n\tcolor: #191919;\n\tfont-weight: 600;\n\tborder-color: #afafaf;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected:hover {\n\tcolor: #c8dbed;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tborder: none;\n\tfont-weight: 600;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tposition: relative;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range:hover {\n\tcolor: #a0a0a0;\n\tcursor: not-allowed;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-weekdays {\n\theight: 26px;\n\tcolor: rgba(133, 133, 133, 0.85);\n}\n\n.mytheme .v-inline-datefield-calendarpanel-weekdays strong {\n\tfont: inherit;\n\tfont-size: 14px;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-header {\n\twhite-space: nowrap;\n}\n\n.mytheme td[class*=\"year\"] button, .mytheme td[class*=\"month\"] button {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tmargin: 0;\n\tcursor: pointer;\n\tcolor: transparent;\n\tfont-size: 0;\n\twidth: 19px;\n\theight: 25px;\n\toutline: none;\n\tposition: relative;\n\tvertical-align: middle;\n}\n\n.mytheme td[class*=\"year\"] button:before, .mytheme td[class*=\"month\"] button:before {\n\tcolor: #a0a0a0;\n\tfont-size: 21px;\n\tline-height: 24px;\n\t-webkit-transition: color 200ms;\n\t-moz-transition: color 200ms;\n\ttransition: color 200ms;\n}\n\n.mytheme td[class*=\"year\"] button:hover:before, .mytheme td[class*=\"month\"] button:hover:before {\n\tcolor: #197de1;\n}\n\n.mytheme td[class*=\"year\"] button.outside-range, .mytheme td[class*=\"month\"] button.outside-range {\n\tcursor: default;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n}\n\n.mytheme td[class*=\"year\"] button.outside-range:hover:before, .mytheme td[class*=\"month\"] button.outside-range:hover:before {\n\tcolor: #a0a0a0;\n}\n\n.mytheme .v-button-prevyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f100\";\n}\n\n.mytheme .v-button-prevmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f104\";\n}\n\n.mytheme .v-button-nextyear:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f101\";\n}\n\n.mytheme .v-button-nextmonth:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f105\";\n}\n\n.mytheme td.v-inline-datefield-calendarpanel-month {\n\twidth: 148px;\n\tcolor: #197de1;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-year td.v-inline-datefield-calendarpanel-month {\n\twidth: 74px;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-weeknumber, .mytheme .v-inline-datefield-calendarpanel-weekdays.v-inline-datefield-calendarpanel-weeknumbers td:first-child {\n\twidth: 30px;\n\tcolor: rgba(133, 133, 133, 0.85);\n\tfont-size: 14px;\n\tdisplay: inline-block;\n\ttext-align: left;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-weeknumber {\n\tposition: relative;\n}\n\n.mytheme .v-inline-datefield-calendarpanel-weeknumbers .v-first:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 38px;\n\tbottom: 0;\n\tleft: 0;\n\twidth: 34px;\n\tborder-top: 1px solid #eaeaea;\n\tborder-right: 1px solid #eaeaea;\n\tborder-top-right-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\tbackground: #fafafa;\n}\n\n.mytheme td.v-inline-datefield-calendarpanel-time {\n\twidth: 100%;\n\tfont-size: 14px;\n}\n\n.mytheme td.v-inline-datefield-calendarpanel-time .v-label {\n\tdisplay: inline;\n\tmargin: 0 0.1em;\n\tfont-weight: 400;\n}\n\n.mytheme .v-inline-datefield-calendarpanel {\n\tposition: relative;\n\tbackground: white;\n\tpadding: 6px;\n}\n\n.mytheme .v-gridlayout-margin-top {\n\tpadding-top: 37px;\n}\n\n.mytheme .v-gridlayout-margin-bottom {\n\tpadding-bottom: 37px;\n}\n\n.mytheme .v-gridlayout-margin-left {\n\tpadding-left: 37px;\n}\n\n.mytheme .v-gridlayout-margin-right {\n\tpadding-right: 37px;\n}\n\n.mytheme .v-gridlayout-spacing-on {\n\tpadding-left: 12px;\n\tpadding-top: 12px;\n}\n\n.mytheme .v-menubar {\n\tposition: relative;\n\ttext-align: center;\n\twhite-space: nowrap;\n\toutline: none;\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\tcursor: default;\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\ttext-align: left;\n\tline-height: 35px;\n}\n\n.mytheme .v-menubar:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n}\n\n.mytheme .v-menubar:focus:after {\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n}\n\n.mytheme .v-menubar.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-menubar.v-disabled:after {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-menubar:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem {\n\tpadding: 0 14px;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem[class*=\"-icon-only\"] {\n\twidth: 37px;\n}\n\n.mytheme .v-menubar:active:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\theight: 37px;\n\tpadding: 0 15px;\n\tcolor: inherit;\n\tfont-weight: 400;\n\t\n\tcursor: pointer;\n\tborder-radius: 0;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-width: 0 1px 0 0;\n\tborder-color: inherit;\n\theight: 100%;\n\tline-height: inherit;\n\tvertical-align: top;\n\ttext-align: center;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:first-child {\n\tborder-left-width: 0;\n\tborder-radius: 3px 0 0 3px;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:last-child {\n\tborder-radius: 0 3px 3px 0;\n\tborder-right-width: 0;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:first-child:last-child {\n\tborder-radius: 3px;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:hover {\n\tzoom: 1;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:hover:before {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n\tborder: none;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem:active:before {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem .v-icon {\n\tmargin: 0 4px 0 -4px;\n\tcursor: inherit;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem[class*=\"-icon-only\"] {\n\twidth: 37px;\n\tpadding: 0;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem[class*=\"-icon-only\"] .v-icon {\n\tmargin: 0;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem-checked {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground-color: #ededed;\n\tbackground-image: -webkit-linear-gradient(bottom, #ededed 2%, #e9e9e9 98%);\n\tbackground-image: linear-gradient(to top,#ededed 2%, #e9e9e9 98%);\n\tcolor: #181818;\n}\n\n.mytheme .v-disabled > .v-menubar-menuitem, .mytheme .v-menubar > .v-menubar-menuitem-disabled {\n\tcursor: default;\n}\n\n.mytheme .v-disabled > .v-menubar-menuitem:before, .mytheme .v-menubar > .v-menubar-menuitem-disabled:before {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar-menuitem-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem-selected {\n\tcolor: #ecf2f8;\n\t\n\t\n\t\n\tborder-radius: 0;\n\tborder: 1px solid #1362b1;\n\tborder-top-color: #156ab3;\n\tborder-bottom-color: #1156a8;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\t-webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca;\n\tbox-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tborder-top-width: 0;\n\tborder-left-width: 0;\n\tborder-bottom-width: 0;\n\tz-index: 2;\n}\n\n.mytheme .v-menubar > .v-menubar-menuitem-selected:hover:before {\n\tbackground: none;\n}\n\n.mytheme .v-menubar .v-menubar-submenu-indicator {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f078\";\n\tfont-size: 0.7em;\n\tvertical-align: 0.15em;\n\tmargin: 0 -0.2em 0 0.5em;\n\topacity: 0.5;\n}\n\n.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:empty:after {\n\tmargin-left: -0.2em;\n}\n\n.mytheme .v-menubar-popup {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\tpadding: 4px 4px;\n\tmargin: 5px 0 0 1px !important;\n}\n\n.mytheme .v-menubar-popup[class*=\"animate-in\"] {\n\t-webkit-animation: valo-overlay-animate-in 120ms;\n\t-moz-animation: valo-overlay-animate-in 120ms;\n\tanimation: valo-overlay-animate-in 120ms;\n}\n\n.mytheme .v-menubar-popup[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-fade 120ms;\n\t-moz-animation: valo-animate-out-fade 120ms;\n\tanimation: valo-animate-out-fade 120ms;\n}\n\n.mytheme .v-menubar-popup .v-menubar-submenu {\n\toutline: none;\n}\n\n.mytheme .v-menubar-popup .v-menubar-menuitem {\n\tdisplay: block;\n\tcursor: pointer;\n\tline-height: 27px;\n\tpadding: 0 20px 0 10px;\n\tborder-radius: 3px;\n\tfont-weight: 400;\n\twhite-space: nowrap;\n\tposition: relative;\n\tpadding-left: 32px;\n\tpadding-right: 37px;\n\tposition: relative;\n}\n\n.mytheme .v-menubar-popup .v-menubar-menuitem:active:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tbackground: #0957a6;\n\topacity: 0.15;\n\tfilter: alpha(opacity=15.0) ;\n\tpointer-events: none;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-menubar-popup .v-menubar-menuitem .v-icon {\n\tmax-height: 27px;\n\tmargin-right: 5px;\n\tmin-width: 1em;\n}\n\n.mytheme .v-menubar-popup .v-menubar-submenu-indicator {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar-popup .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after {\n\tposition: absolute;\n\tright: 10px;\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f054\";\n\tline-height: 29px;\n}\n\n.mytheme .v-menubar-popup .v-menubar-menuitem-selected {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-menubar-popup .v-menubar-separator {\n\tdisplay: block;\n\tmargin: 4px 0;\n\theight: 0;\n\toverflow: hidden;\n\tborder-bottom: 1px solid #e4e4e4;\n}\n\n.mytheme .v-menubar-popup [class*=\"checked\"] .v-menubar-menuitem-caption:before {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tposition: absolute;\n\tleft: 10px;\n}\n\n.mytheme .v-menubar-popup [class*=\"unchecked\"] .v-menubar-menuitem-caption:before {\n\tcontent: \"\";\n}\n\n.mytheme .v-menubar-popup [class*=\"disabled\"] {\n\tcursor: default;\n}\n\n.mytheme .v-menubar-small {\n\theight: 31px;\n\tpadding: 0 14px;\n\t\n\tfont-weight: 400;\n\t\n\tcursor: default;\n\tborder-radius: 4px;\n\tpadding: 0;\n\ttext-align: left;\n\tline-height: 29px;\n\tfont-size: 14px;\n}\n\n.mytheme .v-menubar-small:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-menubar-small > .v-menubar-menuitem {\n\tpadding: 0 12px;\n}\n\n.mytheme .v-menubar-small > .v-menubar-menuitem[class*=\"-icon-only\"] {\n\twidth: 31px;\n}\n\n.mytheme .v-menubar-borderless {\n\tborder: none;\n\tborder-radius: 0;\n\tpadding: 1px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: none;\n\tbackground: transparent;\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-borderless:focus:after {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder: none;\n\tmargin-right: 1px;\n\tborder-radius: 4px;\n\tcolor: #197de1;\n\tpadding: 0 12px;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem:first-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:last-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:first-child:last-child {\n\tborder-radius: 4px;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem:before {\n\tcontent: none;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem:active {\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem-checked, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child {\n\tborder: 1px solid #c5c5c5;\n\tcolor: #197de1;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption {\n\tposition: relative;\n\ttop: -1px;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem-selected {\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem-selected:hover {\n\tcolor: #ecf2f8;\n}\n\n.mytheme .v-menubar-borderless .v-menubar-menuitem-disabled, .mytheme .v-menubar-borderless .v-menubar-menuitem-disabled:hover {\n\tcolor: inherit;\n}\n\n.mytheme .v-radiobutton {\n\tposition: relative;\n\tline-height: 19px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-radiobutton.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-radiobutton {\n\tpadding-left: 25px;\n}\n\n:root .mytheme .v-radiobutton label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-radiobutton > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-radiobutton > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 19px;\n\theight: 19px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 13px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-radiobutton > input ~ label:before {\n\theight: 18.5px;\n\tpadding: 0 9px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 19px;\n}\n\n:root .mytheme .v-radiobutton > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-radiobutton > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-radiobutton > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-radiobutton > .v-icon, .mytheme .v-radiobutton > label .v-icon {\n\tmargin: 0 6px 0 3px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-radiobutton.v-disabled > label, .mytheme .v-radiobutton.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-radiobutton.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-radiobutton.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-radiobutton.v-readonly > label, .mytheme .v-radiobutton.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-radiobutton.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-radiobutton.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-radiobutton.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n:root .mytheme .v-radiobutton > input:checked ~ label:after {\n\twidth: 7px;\n\theight: 7px;\n\ttop: 6px;\n\tleft: 6px;\n\tbackground: #197de1;\n}\n\n:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after {\n\tborder-radius: 50%;\n\tcontent: \"\";\n}\n\n.mytheme .v-select-optiongroup .v-radiobutton, .mytheme .v-select-optiongroup .v-checkbox {\n\tdisplay: block;\n\tmargin: 9px 16px 0 0;\n}\n\n.mytheme .v-select-optiongroup .v-radiobutton:first-child, .mytheme .v-select-optiongroup .v-checkbox:first-child {\n\tmargin-top: 6px;\n}\n\n.mytheme .v-select-optiongroup .v-radiobutton:last-child, .mytheme .v-select-optiongroup .v-checkbox:last-child {\n\tmargin-bottom: 6px;\n}\n\n.mytheme .v-select-optiongroup.v-has-width label {\n\twhite-space: normal;\n}\n\n.mytheme .v-select-optiongroup-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox {\n\tposition: relative;\n\tline-height: 16px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox {\n\tpadding-left: 21px;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 16px;\n\theight: 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 11px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before {\n\theight: 15.5px;\n\tpadding: 0 7px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 16px;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-small .v-checkbox > label .v-icon {\n\tmargin: 0 5px 0 3px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton {\n\tposition: relative;\n\tline-height: 16px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton {\n\tpadding-left: 21px;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 16px;\n\theight: 16px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 11px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before {\n\theight: 15.5px;\n\tpadding: 0 7px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 16px;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-small .v-radiobutton > label .v-icon {\n\tmargin: 0 5px 0 3px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after {\n\twidth: 6px;\n\theight: 6px;\n\ttop: 5px;\n\tleft: 5px;\n\tbackground: #197de1;\n}\n\n:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after {\n\tborder-radius: 50%;\n\tcontent: \"\";\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton, .mytheme .v-select-optiongroup-small .v-checkbox {\n\tdisplay: block;\n\tmargin: 8px 16px 0 0;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton:first-child, .mytheme .v-select-optiongroup-small .v-checkbox:first-child {\n\tmargin-top: 5px;\n}\n\n.mytheme .v-select-optiongroup-small .v-radiobutton:last-child, .mytheme .v-select-optiongroup-small .v-checkbox:last-child {\n\tmargin-bottom: 5px;\n}\n\n.mytheme .v-select-optiongroup-small.v-has-width label {\n\twhite-space: normal;\n}\n\n.mytheme .v-select-optiongroup-large {\n\tfont-size: 20px;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox {\n\tposition: relative;\n\tline-height: 22px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox {\n\tpadding-left: 29px;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 22px;\n\theight: 22px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 15px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before {\n\theight: 22px;\n\tpadding: 0 10px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 22px;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-large .v-checkbox > label .v-icon {\n\tmargin: 0 7px 0 4px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton {\n\tposition: relative;\n\tline-height: 22px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton.v-has-width label {\n\twhite-space: normal;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton {\n\tpadding-left: 29px;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton label {\n\t-webkit-tap-highlight-color: transparent;\n\t-webkit-touch-callout: none;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input {\n\tposition: absolute;\n\tclip: rect(0, 0, 0, 0);\n\tleft: 0.2em;\n\ttop: 0.2em;\n\tz-index: 0;\n\tmargin: 0;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:focus ~ label:before {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\twidth: 22px;\n\theight: 22px;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tborder-radius: 4px;\n\tfont-size: 15px;\n\ttext-align: center;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before {\n\theight: 22px;\n\tpadding: 0 10px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tpadding: 0;\n\theight: 22px;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tcolor: transparent;\n\t-webkit-transition: color 100ms;\n\t-moz-transition: color 100ms;\n\ttransition: color 100ms;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:active ~ label:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after {\n\tcolor: #197de1;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-large .v-radiobutton > label .v-icon {\n\tmargin: 0 7px 0 4px;\n\tmin-width: 1em;\n\tcursor: pointer;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > .v-icon {\n\tcursor: default;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > .v-icon {\n\tcursor: default;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label > .v-icon {\n\tcursor: default;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input:active ~ label:after {\n\tbackground: transparent;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input ~ label:after {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after {\n\twidth: 8px;\n\theight: 8px;\n\ttop: 7px;\n\tleft: 7px;\n\tbackground: #197de1;\n}\n\n:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after {\n\tborder-radius: 50%;\n\tcontent: \"\";\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton, .mytheme .v-select-optiongroup-large .v-checkbox {\n\tdisplay: block;\n\tmargin: 11px 16px 0 0;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton:first-child, .mytheme .v-select-optiongroup-large .v-checkbox:first-child {\n\tmargin-top: 7px;\n}\n\n.mytheme .v-select-optiongroup-large .v-radiobutton:last-child, .mytheme .v-select-optiongroup-large .v-checkbox:last-child {\n\tmargin-bottom: 7px;\n}\n\n.mytheme .v-select-optiongroup-large.v-has-width label {\n\twhite-space: normal;\n}\n\n.mytheme .v-select-optiongroup-horizontal {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-select-optiongroup-horizontal .v-radiobutton, .mytheme .v-select-optiongroup-horizontal .v-checkbox {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-select-optiongroup-horizontal.v-has-width {\n\twhite-space: normal;\n}\n\n.mytheme .v-select-optiongroup-horizontal.v-has-width label {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-link {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-link:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-link.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-link a {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tcursor: inherit;\n\tcolor: inherit;\n\ttext-decoration: inherit;\n\t-webkit-transition: inherit;\n\t-moz-transition: inherit;\n\ttransition: inherit;\n}\n\n.mytheme .v-link a:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-link a.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-link .v-icon {\n\tcursor: inherit;\n}\n\n.mytheme .v-link-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-link-large {\n\tfont-size: 20px;\n}\n\n.mytheme .v-window {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\t-webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tpadding: 0;\n\tmin-width: 148px !important;\n\tmin-height: 37px !important;\n\twhite-space: nowrap;\n\toverflow: hidden !important;\n\t-webkit-transition: width 200ms, height 200ms, top 200ms, left 200ms;\n\t-moz-transition: width 200ms, height 200ms, top 200ms, left 200ms;\n\ttransition: width 200ms, height 200ms, top 200ms, left 200ms;\n}\n\n.mytheme .v-window[class*=\"animate-in\"] {\n\t-webkit-animation: valo-animate-in-fade 140ms;\n\t-moz-animation: valo-animate-in-fade 140ms;\n\tanimation: valo-animate-in-fade 140ms;\n}\n\n.mytheme .v-window[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-scale-down-fade 100ms;\n\t-moz-animation: valo-animate-out-scale-down-fade 100ms;\n\tanimation: valo-animate-out-scale-down-fade 100ms;\n}\n\n.mytheme .v-window.v-window-animate-in {\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n}\n\n.mytheme .v-window-modalitycurtain {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tbackground-color: #222;\n\tbackground-image: -webkit-radial-gradient(50% 50%, circle, #222, #0e0e0e);\n\tbackground-image: radial-gradient( circle at 50% 50%, #222, #0e0e0e);\n\topacity: 0.72;\n\tfilter: alpha(opacity=72) ;\n\t-webkit-animation: valo-animate-in-fade 400ms 100ms backwards;\n\t-moz-animation: valo-animate-in-fade 400ms 100ms backwards;\n\tanimation: valo-animate-in-fade 400ms 100ms backwards;\n}\n\n.v-op12 .mytheme .v-window-modalitycurtain {\n\t-webkit-animation: none;\n\t-moz-animation: none;\n\tanimation: none;\n}\n\n.mytheme .v-window-draggingCurtain {\n\tposition: fixed !important;\n}\n\n.mytheme .v-window-resizingCurtain + .v-window, .mytheme .v-window-draggingCurtain + .v-window {\n\t-webkit-transition: none;\n\t-moz-transition: none;\n\ttransition: none;\n}\n\n.mytheme .v-window-outerheader {\n\tcursor: move;\n\tposition: absolute;\n\tz-index: 2;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\t-webkit-transform: translatez(0);\n\t-moz-transform: translatez(0);\n\t-ms-transform: translatez(0);\n\t-o-transform: translatez(0);\n\ttransform: translatez(0);\n}\n\n.mytheme .v-window-outerheader:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tbottom: -1px;\n\tright: 0;\n\tleft: 0;\n\theight: 0;\n\tborder-top: 1px solid #dfdfdf;\n\tborder-color: rgba(197, 197, 197, 0.5);\n}\n\n.mytheme .v-window-header {\n\tline-height: 36px;\n\tpadding-left: 12px;\n\tmargin-right: 74px;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcolor: #7e7e7e;\n}\n\n.mytheme .v-window-restorebox-disabled ~ .v-window-closebox ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox ~ .v-window-header {\n\tmargin-right: 37px;\n}\n\n.mytheme .v-window-restorebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header {\n\tmargin-right: 12px;\n}\n\n.mytheme .v-window-closebox, .mytheme .v-window-maximizebox, .mytheme .v-window-restorebox {\n\tposition: absolute;\n\tz-index: 3;\n\ttop: 0;\n\tright: 0;\n\tbox-sizing: border-box;\n\twidth: 33px;\n\theight: 36px;\n\tbackground-color: white;\n\tline-height: 34px;\n\ttext-align: center;\n\tcursor: pointer;\n\tfont-size: 21px;\n\tcolor: #999999;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-window-closebox:focus, .mytheme .v-window-maximizebox:focus, .mytheme .v-window-restorebox:focus {\n\toutline: none;\n}\n\n.mytheme .v-window-closebox:hover, .mytheme .v-window-maximizebox:hover, .mytheme .v-window-restorebox:hover {\n\topacity: 1;\n\tfilter: none ;\n\tcolor: #197de1;\n}\n\n.mytheme .v-window-closebox:active, .mytheme .v-window-maximizebox:active, .mytheme .v-window-restorebox:active {\n\tcolor: inherit;\n}\n\n.mytheme .v-window-closebox:focus::after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 6px;\n\tright: 6px;\n\tbottom: 6px;\n\tleft: 2px;\n\tborder-radius: 4px;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-window-maximizebox:focus::after, .mytheme .v-window-restorebox:focus::after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 6px;\n\tright: 2px;\n\tbottom: 6px;\n\tleft: 6px;\n\tborder-radius: 4px;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-window-closebox {\n\tpadding-right: 4px;\n\tborder-radius: 0 4px 0 4px;\n}\n\n.mytheme .v-window-closebox:before {\n\tcontent: \"\\00d7\";\n}\n\n.mytheme .v-window-maximizebox, .mytheme .v-window-restorebox {\n\tright: 33px;\n\tpadding-left: 4px;\n\tborder-radius: 0 0 0 4px;\n}\n\n.mytheme .v-window-maximizebox + .v-window-closebox, .mytheme .v-window-restorebox + .v-window-closebox {\n\tborder-bottom-left-radius: 0;\n}\n\n.mytheme .v-window-closebox-disabled, .mytheme .v-window-resizebox-disabled, .mytheme .v-window-restorebox-disabled, .mytheme .v-window-maximizebox-disabled {\n\tdisplay: none;\n}\n\n.mytheme .v-window-closebox-disabled + .v-window-closebox, .mytheme .v-window-resizebox-disabled + .v-window-closebox, .mytheme .v-window-restorebox-disabled + .v-window-closebox, .mytheme .v-window-maximizebox-disabled + .v-window-closebox {\n\twidth: 37px;\n\tpadding-right: 0;\n\tborder-bottom-left-radius: 4px;\n}\n\n.mytheme .v-window-closebox-disabled + .v-window-closebox:focus::after, .mytheme .v-window-resizebox-disabled + .v-window-closebox:focus::after, .mytheme .v-window-restorebox-disabled + .v-window-closebox:focus::after, .mytheme .v-window-maximizebox-disabled + .v-window-closebox:focus::after {\n\tleft: 6px;\n}\n\n.mytheme .v-window-maximizebox:before {\n\tcontent: \"+\";\n}\n\n.mytheme .v-window-restorebox:before {\n\tcontent: \"\\2013\";\n}\n\n.mytheme .v-window > .popupContent, .mytheme .v-window-wrap, .mytheme .v-window-contents, .mytheme .v-window-contents > .v-scrollable {\n\theight: 100%;\n}\n\n.mytheme .v-window-contents {\n\tbox-sizing: border-box;\n\tborder-radius: 4px;\n\tmargin-top: 0 !important;\n}\n\n.mytheme .v-window-contents > .v-scrollable {\n\tposition: relative;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-top\"] > tbody > [class*=\"firstrow\"] > td {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-bottom\"] > tbody > [class*=\"lastrow\"] > td {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"captioncell\"] {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-left\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tleft: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*=\"margin-right\"] > tbody > [class*=\"row\"] > [class*=\"contentcell\"] > .v-label-h4 {\n\tright: 12px;\n}\n\n.mytheme .v-window-contents > .v-scrollable:focus {\n\toutline: none;\n}\n\n.mytheme .v-window-contents > .v-scrollable:before {\n\tcontent: \"\";\n\tposition: absolute;\n\tz-index: 2;\n\ttop: 0;\n\theight: 0;\n\tborder-top: 1px solid white;\n\tleft: 0;\n\tright: 0;\n}\n\n.mytheme .v-window-contents > .v-scrollable .v-panel-captionwrap:after {\n\tborder-color: #dfdfdf;\n}\n\n.mytheme .v-window-contents > .v-scrollable .v-panel-content:before {\n\tborder-color: white;\n}\n\n.mytheme .v-window-footer {\n\theight: 0;\n}\n\n.mytheme .v-window-resizebox {\n\tposition: absolute;\n\tz-index: 1000;\n\tright: 0;\n\tbottom: 0;\n\twidth: 19px;\n\theight: 19px;\n\tcursor: nwse-resize;\n}\n\n.mytheme .v-window-modalitycurtain:active ~ .v-window {\n\t-webkit-animation: none;\n\t-moz-animation: none;\n\tanimation: none;\n}\n\n.mytheme .v-window-top-toolbar > .v-widget, .mytheme .v-window-bottom-toolbar > .v-widget {\n\tvertical-align: top;\n}\n\n.mytheme .v-window-top-toolbar .v-label, .mytheme .v-window-bottom-toolbar .v-label {\n\tline-height: 36px;\n}\n\n.mytheme .v-window-top-toolbar .v-spacing, .mytheme .v-window-bottom-toolbar .v-spacing {\n\twidth: 6px;\n}\n\n.mytheme .v-window-top-toolbar.v-layout {\n\tpadding: 7px 12px;\n\tposition: relative;\n\tz-index: 2;\n\tborder-top: 1px solid #dfdfdf;\n\tborder-bottom: 1px solid #dfdfdf;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-window-top-toolbar.v-menubar {\n\tmargin: 12px 12px 6px;\n}\n\n.mytheme .v-window-top-toolbar.v-menubar-borderless {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n\tmargin: 5px 0;\n}\n\n.mytheme .v-window-bottom-toolbar.v-layout {\n\tpadding: 7px 12px;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #f0f0f0 0, #fafafa 4px);\n\tbackground-image: linear-gradient(to bottom,#f0f0f0 0, #fafafa 4px);\n\tborder-top: 1px solid #dfdfdf;\n\tborder-radius: 0 0 4px 4px;\n}\n\n.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-layout {\n\tbox-sizing: content-box;\n\tmargin: -12px -12px 0;\n}\n\n.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar {\n\tmargin: 0;\n}\n\n.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar-borderless {\n\tmargin: -6px -6px 0;\n\tpadding: 0;\n}\n\n.mytheme .v-margin-left.v-margin-right.v-margin-bottom .v-window-bottom-toolbar.v-layout {\n\tbox-sizing: content-box;\n\tmargin: 0 -12px -12px;\n}\n\n.mytheme .v-tree {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-tree:focus {\n\toutline: none;\n}\n\n.mytheme .v-tree-node:before {\n\tcontent: \"\";\n\tposition: absolute;\n\tdisplay: inline-block;\n\tz-index: 3;\n\twidth: 1.9em;\n\theight: 28px;\n\tcursor: pointer;\n\tbackground: red;\n\topacity: 0;\n}\n\n.mytheme .v-tree-node-caption {\n\theight: 28px;\n\tline-height: 27px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tvertical-align: top;\n}\n\n.mytheme .v-tree-node-caption > div {\n\tdisplay: inline-block;\n\twidth: 100%;\n\tposition: relative;\n\tz-index: 2;\n}\n\n.mytheme .v-tree-node-caption > div:before {\n\tcontent: \"\\f0da\";\n\tfont-family: ThemeIcons;\n\tdisplay: inline-block;\n\twidth: 0.5em;\n\ttext-align: center;\n\tmargin: 0 0.6em 0 0.8em;\n\t-webkit-transition: all 100ms;\n\t-moz-transition: all 100ms;\n\ttransition: all 100ms;\n}\n\n.mytheme .v-tree-node-caption span {\n\tpadding-right: 28px;\n\tcursor: pointer;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\n.v-ie .mytheme .v-tree-node-caption span {\n\twidth: auto;\n}\n\n.mytheme .v-tree-node-caption .v-icon {\n\tpadding-right: 0;\n\twidth: auto;\n\tmin-width: 1em;\n}\n\n.mytheme .v-tree-node-caption:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tvertical-align: top;\n\tposition: absolute;\n\tz-index: 1;\n\tleft: 0;\n\tmargin-top: -28px;\n\twidth: 100%;\n\theight: 28px;\n\tborder-radius: 4px;\n\topacity: 0;\n\t-webkit-transition: opacity 120ms;\n\t-moz-transition: opacity 120ms;\n\ttransition: opacity 120ms;\n}\n\n.mytheme .v-tree-node-expanded > .v-tree-node-caption > div:before {\n\t-webkit-transform: rotate(90deg);\n\t-moz-transform: rotate(90deg);\n\t-ms-transform: rotate(90deg);\n\t-o-transform: rotate(90deg);\n\ttransform: rotate(90deg);\n\tcontent: \"\\f0da\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-tree-node-leaf:before, .mytheme .v-tree-node-leaf > .v-tree-node-caption > div:before {\n\tvisibility: hidden;\n}\n\n.mytheme .v-tree-node-focused:after {\n\topacity: 1;\n\tborder: 1px solid #197de1;\n}\n\n.mytheme .v-tree-node-selected {\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-tree-node-selected:after {\n\topacity: 1;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tborder: none;\n}\n\n.mytheme .v-tree-node-children {\n\tpadding-left: 19px;\n}\n\n.mytheme .v-tree-node-drag-top:before, .mytheme .v-tree-node-drag-bottom:after, .mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded > .v-tree-node-children:before {\n\tcontent: \"\\2022\";\n\tdisplay: block;\n\tposition: absolute;\n\theight: 2px;\n\twidth: 100%;\n\tbackground: #197de1;\n\tfont-size: 32px;\n\tline-height: 2px;\n\tcolor: #197de1;\n\ttext-indent: -4px;\n\ttext-shadow: 0 0 1px #fafafa, 0 0 1px #fafafa;\n\topacity: 1;\n\tvisibility: visible;\n}\n\n.mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded:after {\n\tcontent: none;\n}\n\n.mytheme .v-tree-node-caption-drag-center {\n\t-webkit-box-shadow: 0 0 0 2px #197de1;\n\tbox-shadow: 0 0 0 2px #197de1;\n\tposition: relative;\n\tborder-radius: 4px;\n}\n\n.v-ff .mytheme .v-tree-node-drag-top:before, .v-ff .mytheme .v-tree-node-drag-bottom:after {\n\tline-height: 1px;\n}\n\n.mytheme .v-tree8 {\n\tposition: relative;\n}\n\n.mytheme .v-tree8-scroller {\n\tposition: absolute;\n\tz-index: 1;\n\toutline: none;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-tree8-scroller-horizontal {\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow-y: hidden;\n\t-ms-overflow-y: hidden;\n}\n\n.mytheme .v-tree8-scroller-vertical {\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\toverflow-x: hidden;\n\t-ms-overflow-x: hidden;\n}\n\n.mytheme .v-tree8-tablewrapper {\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n\tz-index: 5;\n}\n\n.mytheme .v-tree8-tablewrapper > table {\n\tborder-spacing: 0;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-tree8-header-deco, .mytheme .v-tree8-footer-deco {\n\tposition: absolute;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-tree8-horizontal-scrollbar-deco {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-tree8-header, .mytheme .v-tree8-body, .mytheme .v-tree8-footer {\n\tposition: absolute;\n\tleft: 0;\n\twidth: inherit;\n\tz-index: 10;\n}\n\n.mytheme .v-tree8-header, .mytheme .v-tree8-header-deco {\n\ttop: 0;\n}\n\n.mytheme .v-tree8-footer, .mytheme .v-tree8-footer-deco {\n\tbottom: 0;\n}\n\n.mytheme .v-tree8-body {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n\tz-index: 0;\n\ttop: 0;\n}\n\n.mytheme .v-tree8-body .v-tree8-row {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.mytheme .v-tree8-row {\n\tdisplay: block;\n}\n\n.mytheme .v-tree8-row > td, .mytheme .v-tree8-row > th {\n\tbackground-color: white;\n}\n\n.mytheme .v-tree8-row {\n\twidth: inherit;\n}\n\n.mytheme .v-tree8-cell {\n\tdisplay: block;\n\tfloat: left;\n\tpadding: 2px;\n\twhite-space: nowrap;\n\tbox-sizing: border-box;\n\toverflow: hidden;\n\tfont-size: 16px;\n}\n\n.mytheme .v-tree8-cell.frozen {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.mytheme .v-tree8-spacer {\n\tposition: absolute;\n\tdisplay: block;\n\tbackground-color: white;\n}\n\n.mytheme .v-tree8-spacer > td {\n\twidth: 100%;\n\theight: 100%;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-tree8 {\n\toutline: none;\n}\n\n.mytheme .v-tree8-scroller-vertical, .mytheme .v-tree8-scroller-horizontal {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8-scroller-vertical {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-scroller-horizontal {\n\tborder-top: none;\n}\n\n.mytheme .v-tree8-tablewrapper {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8 .header-drag-table {\n\tborder-spacing: 0;\n\tposition: relative;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-tree8 .header-drag-table .v-tree8-header {\n\tposition: absolute;\n}\n\n.mytheme .v-tree8 .header-drag-table .v-tree8-header > .v-tree8-cell {\n\tborder: 1px solid #d4d4d4;\n\tmargin-top: -10px;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90);\n\tz-index: 30000;\n}\n\n.mytheme .v-tree8 .header-drag-table .v-tree8-header > .v-tree8-drop-marker {\n\tbackground-color: #197de1;\n\tposition: absolute;\n\twidth: 3px;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-radius: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tpadding: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.v-tree8-sidebar-popup {\n\tright: auto;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-button {\n\tbackground: transparent;\n\tborder: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\toutline: none;\n\tpadding: 0 4px;\n\ttext-align: right;\n\tline-height: 1;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-button[disabled] {\n\tcursor: default;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-button::-moz-focus-inner {\n\tborder: 0;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tdisplay: block;\n\tfont-family: ThemeIcons, sans-serif;\n\tfont-size: 14px;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.closed {\n\tborder-radius: 0;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.open .v-tree8-sidebar-button {\n\twidth: 100%;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.open .v-tree8-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tfont-size: 14px;\n\tline-height: 1;\n}\n\n.v-ie .mytheme .v-tree8-sidebar.v-contextmenu.open .v-tree8-sidebar-button {\n\tvertical-align: middle;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-content {\n\tpadding: 4px 0;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu .v-tree8-sidebar-content .gwt-MenuBar .gwt-MenuItem .column-hiding-toggle {\n\ttext-shadow: none;\n}\n\n.mytheme .v-tree8-cell {\n\tbackground-color: white;\n\tpadding: 0 18px;\n\tline-height: 37px;\n\ttext-overflow: ellipsis;\n}\n\n.mytheme .v-tree8-cell > * {\n\tline-height: 1.55;\n\tvertical-align: middle;\n}\n\n.mytheme .v-tree8-cell > div {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-tree8-cell.frozen {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tposition: relative;\n\tz-index: 11;\n}\n\n.mytheme .v-tree8-cell.frozen + th, .mytheme .v-tree8-cell.frozen + td {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-cell div.component-wrap {\n\twidth: 100%;\n}\n\n.mytheme .v-tree8-row > td, .mytheme .v-tree8-editor-cells > div {\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8-row > td:first-child, .mytheme .v-tree8-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-editor-cells.frozen > div {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-row-stripe > td {\n\tbackground-color: #f5f5f5;\n}\n\n.mytheme .v-tree8-row-selected > td {\n\tbackground: #197de1;\n}\n\n.mytheme .v-tree8-row-focused > td {\n\t\n}\n\n.mytheme .v-tree8-header th {\n\tposition: relative;\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n\t\n\ttext-align: left;\n}\n\n.mytheme .v-tree8-header th:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-header .sort-asc, .mytheme .v-tree8-header .sort-desc {\n\tpadding-right: 35px;\n}\n\n.mytheme .v-tree8-header .sort-asc:after, .mytheme .v-tree8-header .sort-desc:after {\n\tfont-family: ThemeIcons, sans-serif;\n\tcontent: \"\\f0de\" \" \" attr(sort-order);\n\tposition: absolute;\n\tright: 18px;\n\tfont-size: 12px;\n}\n\n.mytheme .v-tree8-header .sort-desc:after {\n\tcontent: \"\\f0dd\" \" \" attr(sort-order);\n}\n\n.mytheme .v-tree8-column-resize-handle {\n\tposition: absolute;\n\twidth: 36px;\n\tright: -18px;\n\ttop: 0px;\n\tbottom: 0px;\n\tcursor: col-resize;\n\tz-index: 10;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-tree8-column-resize-simple-indicator {\n\tposition: absolute;\n\twidth: 3px;\n\ttop: 0px;\n\tleft: 18px;\n\tz-index: 9001;\n\tbackground: #fff;\n\tbox-shadow: 0px 0px 5px #000;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-tree8-footer td {\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-top: 1px solid #d4d4d4;\n\tborder-bottom: none;\n\t\n}\n\n.mytheme .v-tree8-footer td:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-header .v-tree8-cell, .mytheme .v-tree8-footer .v-tree8-cell {\n\toverflow: visible;\n}\n\n.mytheme .v-tree8-column-header-content, .mytheme .v-tree8-column-footer-content {\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\tvertical-align: baseline;\n}\n\n.mytheme .v-tree8-header-deco {\n\tborder-top: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-tree8-footer-deco {\n\tborder-bottom: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-tree8-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tborder-top: none;\n}\n\n.mytheme .v-tree8-cell-focused {\n\tposition: relative;\n}\n\n.mytheme .v-tree8-cell-focused:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder: 2px solid #197de1;\n\tdisplay: none;\n\tpointer-events: none;\n}\n\n.mytheme .v-tree8:focus .v-tree8-cell-focused:before {\n\tdisplay: block;\n}\n\n.mytheme .v-tree8.v-disabled:focus .v-tree8-cell-focused:before {\n\tdisplay: none;\n}\n\n.mytheme .v-tree8-editor {\n\tposition: absolute;\n\tz-index: 20;\n\toverflow: hidden;\n\tleft: 0;\n\tright: 0;\n\tborder: 1px solid #d4d4d4;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tmargin-top: -1px;\n\t-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n}\n\n.mytheme .v-tree8-editor.unbuffered .v-tree8-editor-footer {\n\twidth: 100%;\n}\n\n.mytheme .v-tree8-editor-cells {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-tree8-editor-cells.frozen {\n\tz-index: 2;\n}\n\n.mytheme .v-tree8-editor-cells > div {\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tvertical-align: middle;\n\tbackground: white;\n}\n\n.mytheme .v-tree8-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-tree8-editor-cells > div > * {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-filterselect {\n\tpadding-left: 0;\n}\n\n.mytheme .v-tree8-editor-cells > div input[type=\"text\"], .mytheme .v-tree8-editor-cells > div input[type=\"text\"].v-filterselect-input, .mytheme .v-tree8-editor-cells > div input[type=\"password\"] {\n\tpadding-left: 18px;\n}\n\n.mytheme .v-tree8-editor-cells > div input[type=\"text\"]:not(.v-filterselect-input), .mytheme .v-tree8-editor-cells > div input[type=\"password\"] {\n\tpadding-right: 9px;\n}\n\n.mytheme .v-tree8-editor-cells > div input[type=\"checkbox\"] {\n\tmargin-left: 18px;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-textfield, .mytheme .v-tree8-editor-cells > div .v-datefield, .mytheme .v-tree8-editor-cells > div .v-filterselect {\n\tmin-width: 100%;\n\tmax-width: 100%;\n\tmin-height: 100%;\n\tmax-height: 100%;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-select, .mytheme .v-tree8-editor-cells > div .v-select-select {\n\tmin-width: 100%;\n\tmax-width: 100%;\n}\n\n.mytheme .v-tree8-editor-cells > div.not-editable.v-tree8-cell {\n\tfloat: none;\n}\n\n.mytheme .v-tree8-editor-cells .error::before {\n\tposition: absolute;\n\tdisplay: block;\n\theight: 0;\n\twidth: 0;\n\tcontent: \"\";\n\tborder-top: 5px solid red;\n\tborder-right: 5px solid transparent;\n}\n\n.mytheme .v-tree8-editor-cells .error, .mytheme .v-tree8-editor-cells .error > input {\n\tbackground-color: #fee;\n}\n\n.mytheme .v-tree8-editor-footer {\n\tdisplay: table;\n\theight: 37px;\n\tborder-top: 1px solid #d4d4d4;\n\tmargin-top: -1px;\n\tbackground: white;\n\tpadding: 0 5px;\n}\n\n.mytheme .v-tree8-editor-footer + .v-tree8-editor-cells > div {\n\tborder-bottom: none;\n\tborder-top: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8-editor-footer:first-child {\n\tborder-top: none;\n\tmargin-top: 0;\n\tborder-bottom: 1px solid #d4d4d4;\n\tmargin-bottom: -1px;\n}\n\n.mytheme .v-tree8-editor-message, .mytheme .v-tree8-editor-buttons {\n\tdisplay: table-cell;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n.mytheme .v-tree8-editor-message {\n\twidth: 100%;\n\tposition: relative;\n}\n\n.mytheme .v-tree8-editor-message > div {\n\tposition: absolute;\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\ttop: 0;\n}\n\n.mytheme .v-tree8-editor-save {\n\tmargin-right: 4px;\n}\n\n.mytheme .v-tree8-spacer {\n\tpadding-left: 1px;\n}\n\n.mytheme .v-tree8-spacer > td {\n\tdisplay: block;\n\tpadding: 0;\n\tbackground-color: white;\n\tborder-top: 1px solid #eeeeee;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8-spacer.stripe > td {\n\tbackground-color: #f5f5f5;\n\tborder-top: 1px solid #e5e5e5;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-tree8-spacer-deco-container {\n\tborder-top: 1px solid transparent;\n\tposition: relative;\n\ttop: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-tree8-spacer-deco {\n\ttop: 0;\n\tleft: 0;\n\twidth: 2px;\n\tbackground-color: #197de1;\n\tposition: absolute;\n\theight: 100%;\n\tpointer-events: none;\n}\n\n.mytheme .v-tree8-cell > .v-progressbar {\n\twidth: 100%;\n}\n\n.mytheme .v-tree8 {\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-tree8.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-tree8-header .v-tree8-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-tree8-header .v-tree8-cell.dragged {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\t-webkit-transition: opacity 0.3s ease-in-out;\n\t-moz-transition: opacity 0.3s ease-in-out;\n\ttransition: opacity 0.3s ease-in-out;\n}\n\n.mytheme .v-tree8-header .v-tree8-cell.dragged-column-header {\n\tmargin-top: -19px;\n}\n\n.mytheme .v-tree8-footer .v-tree8-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-tree8-header-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-tree8-footer-deco, .mytheme .v-tree8-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-tree8-row-selected > .v-tree8-cell {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #c8dbed;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tborder-color: #1d69b4;\n}\n\n.mytheme .v-tree8-row-selected > .v-tree8-cell-focused:before {\n\tborder-color: #71b0ef;\n}\n\n.mytheme .v-tree8-editor {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tborder-color: #197de1;\n}\n\n.mytheme .v-tree8-editor-footer {\n\tfont-size: 14px;\n\tpadding: 0 6px;\n\tbackground: #fafafa;\n\t-webkit-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n}\n\n.mytheme .v-tree8-editor-footer:first-child {\n\t-webkit-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n}\n\n.mytheme .v-tree8-editor-cells {\n\tz-index: 1;\n}\n\n.mytheme .v-tree8-editor-cells > div:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\theight: 100%;\n\tvertical-align: middle;\n}\n\n.mytheme .v-tree8-editor-cells > div.not-editable.v-tree8-cell {\n\tfloat: none;\n}\n\n.mytheme .v-tree8-editor-cells > div .error::before {\n\tborder-top: 9px solid #ed473b;\n\tborder-right: 9px solid transparent;\n}\n\n.mytheme .v-tree8-editor-cells > div .error, .mytheme .v-tree8-editor-cells > div .error > input {\n\tbackground-color: #fffbfb;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-textfield, .mytheme .v-tree8-editor-cells > div .v-textfield-focus, .mytheme .v-tree8-editor-cells > div .v-datefield, .mytheme .v-tree8-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-tree8-editor-cells > div .v-filterselect-input, .mytheme .v-tree8-editor-cells > div .v-filterselect-input:focus {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 1px 0 #f2f2f2;\n\tbox-shadow: inset 0 1px 0 #f2f2f2;\n}\n\n.mytheme .v-tree8-editor-cells > div input[type=\"text\"].v-datefield-textfield {\n\tpadding-left: 44.4px;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-textfield-focus, .mytheme .v-tree8-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-tree8-editor-cells > div .v-filterselect-input:focus {\n\tposition: relative;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-select {\n\tpadding-left: 9px;\n\tpadding-right: 9px;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-checkbox {\n\tmargin: 0 9px 0 18px;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-checkbox > input[type=\"checkbox\"] {\n\tmargin-left: 0;\n}\n\n.mytheme .v-tree8-editor-cells > div .v-checkbox > label {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-tree8-editor-message > div:before {\n\tdisplay: inline-block;\n\tcolor: #ed473b;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n\tcontent: \"!\";\n}\n\n.mytheme .v-tree8-editor-save, .mytheme .v-tree8-editor-cancel {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tfont-weight: 400;\n\ttext-decoration: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 6px 6px;\n\tmargin: 0;\n\toutline: none;\n}\n\n.mytheme .v-tree8-editor-save:hover, .mytheme .v-tree8-editor-cancel:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-tree8-editor-save.v-disabled, .mytheme .v-tree8-editor-cancel.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-tree8-spacer {\n\tmargin-top: -1px;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.open .v-tree8-sidebar-content {\n\tmargin: 0 0 2px;\n\tpadding: 4px 4px 2px;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-tree8-sidebar.v-contextmenu.closed {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-tree8-scroller::-webkit-scrollbar {\n\tborder: none;\n}\n\n.mytheme .v-tree8-scroller::-webkit-scrollbar-thumb {\n\tborder-radius: 10px;\n\tborder: 4px solid transparent;\n\tbackground: rgba(0, 0, 0, 0.3);\n\t-webkit-background-clip: content-box;\n\tbackground-clip: content-box;\n}\n\n.mytheme .v-tree8-scroller-vertical::-webkit-scrollbar-thumb {\n\tmin-height: 30px;\n}\n\n.mytheme .v-tree8-scroller-horizontal::-webkit-scrollbar-thumb {\n\tmin-width: 30px;\n}\n\n.mytheme .v-tree8-row-drag-badge {\n\tbackground-color: red;\n\tcolor: white;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 30px;\n\tborder-radius: 10px;\n\tline-height: 30px;\n\ttext-align: center;\n\tfloat: left;\n}\n\n.mytheme .v-tree8-row-drag-top, .mytheme .v-tree8-row-drag-bottom {\n\tz-index: 100;\n}\n\n.mytheme .v-tree8-row-drag-top:before, .mytheme .v-tree8-row-drag-bottom:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\theight: 2px;\n\twidth: 100%;\n\tbackground: #197de1;\n\tpointer-events: none;\n\tborder: none;\n}\n\n.mytheme .v-tree8-row-drag-bottom:after {\n\tbottom: -1px;\n}\n\n.mytheme .v-tree8-row-drag-top:before {\n\ttop: -1px;\n}\n\n.mytheme .v-tree8-row-drag-top:first-child:before {\n\ttop: 0;\n}\n\n.mytheme .v-tree8-row-drag-center:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 2px;\n\tborder: 2px solid #197de1;\n\tpointer-events: none;\n}\n\n.mytheme .v-tree8-row-selected.v-tree8-row-drag-center:after {\n\tborder-color: #1463b3;\n}\n\n.mytheme .v-tree8-row-selected.v-tree8-row-drag-top:before, .mytheme .v-tree8-row-selected.v-tree8-row-drag-bottom:after {\n\tbackground: #1463b3;\n}\n\n.mytheme .v-tree8-body-drag-top:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tpointer-events: none;\n\tborder: 2px solid #197de1;\n\tz-index: 100;\n}\n\n.mytheme .v-tree8-expander {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.mytheme .v-tree8-expander::before {\n\tdisplay: inline-block;\n\twidth: 1.5em;\n\ttext-align: center;\n\tcontent: \"\";\n}\n\n.mytheme .v-tree8-expander.expanded::before {\n\tcontent: \"\\f0d7\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-tree8-expander.collapsed::before {\n\tcontent: \"\\f0da\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-tree8-expander.collapse-disabled::before {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\tcursor: default;\n}\n\n.mytheme .v-tree8-node.depth-0 {\n\tpadding-left: 0em;\n}\n\n.mytheme .v-tree8-node.depth-1 {\n\tpadding-left: 1em;\n}\n\n.mytheme .v-tree8-node.depth-2 {\n\tpadding-left: 2em;\n}\n\n.mytheme .v-tree8-node.depth-3 {\n\tpadding-left: 3em;\n}\n\n.mytheme .v-tree8-node.depth-4 {\n\tpadding-left: 4em;\n}\n\n.mytheme .v-tree8-node.depth-5 {\n\tpadding-left: 5em;\n}\n\n.mytheme .v-tree8-node.depth-6 {\n\tpadding-left: 6em;\n}\n\n.mytheme .v-tree8-node.depth-7 {\n\tpadding-left: 7em;\n}\n\n.mytheme .v-tree8-node.depth-8 {\n\tpadding-left: 8em;\n}\n\n.mytheme .v-tree8-node.depth-9 {\n\tpadding-left: 9em;\n}\n\n.mytheme .v-tree8-node.depth-10 {\n\tpadding-left: 10em;\n}\n\n.mytheme .v-tree8-node.depth-11 {\n\tpadding-left: 11em;\n}\n\n.mytheme .v-tree8-node.depth-12 {\n\tpadding-left: 12em;\n}\n\n.mytheme .v-tree8-node.depth-13 {\n\tpadding-left: 13em;\n}\n\n.mytheme .v-tree8-node.depth-14 {\n\tpadding-left: 14em;\n}\n\n.mytheme .v-tree8-node.depth-15 {\n\tpadding-left: 15em;\n}\n\n.mytheme .v-tree8-cell-content {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.mytheme .v-tree8-row-focused::before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder: 2px solid #197de1;\n\tdisplay: none;\n\tpointer-events: none;\n}\n\n.mytheme .v-tree8-cell-focused {\n\tposition: static;\n}\n\n.mytheme .v-tree8-cell-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-tree8:focus .v-tree8-row-focused::before {\n\tdisplay: block;\n}\n\n.mytheme .v-tree8.v-disabled:focus .v-tree8-row-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-tree8:focus .v-tree8-cell-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-tree8 {\n\tbackground-color: transparent;\n}\n\n.mytheme .v-tree8-row > td {\n\tbackground-color: transparent;\n\tborder: 0;\n\tline-height: 28px;\n}\n\n.mytheme .v-tree8-row > td > * {\n\tvertical-align: baseline;\n}\n\n.mytheme .v-tree8-tablewrapper {\n\tbackground-color: transparent;\n\tborder: none;\n}\n\n.mytheme .v-tree8-row::before {\n\tcontent: \"\";\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbox-sizing: border-box;\n\twidth: 100%;\n\theight: 100%;\n\tborder-radius: 4px;\n\tpointer-events: none;\n\tborder-width: 1px;\n}\n\n.mytheme .v-tree8-cell {\n\tposition: relative;\n}\n\n.mytheme .v-tree8-row-selected > .v-tree8-cell {\n\tbackground: transparent;\n}\n\n.mytheme .v-tree8-row-selected::before {\n\tdisplay: block;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n}\n\n.mytheme .v-tree8:focus .v-tree8-row-selected.v-tree8-row-focused::before {\n\tborder-color: transparent;\n\tbox-shadow: inset 0 0 0 1px #c8dbed;\n}\n\n.mytheme .v-tree8-scroller-vertical {\n\tborder: none;\n}\n\n.mytheme .v-tree8-scroller-horizontal {\n\tborder: none;\n}\n\n.mytheme .v-tree8-header-deco, .mytheme .v-tree8-footer-deco, .mytheme .v-tree8-horizontal-scrollbar-deco {\n\tborder: none;\n\tbackground: transparent;\n}\n\n.mytheme .v-treegrid {\n\tposition: relative;\n}\n\n.mytheme .v-treegrid-scroller {\n\tposition: absolute;\n\tz-index: 1;\n\toutline: none;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-treegrid-scroller-horizontal {\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow-y: hidden;\n\t-ms-overflow-y: hidden;\n}\n\n.mytheme .v-treegrid-scroller-vertical {\n\tright: 0;\n\ttop: 0;\n\tbottom: 0;\n\toverflow-x: hidden;\n\t-ms-overflow-x: hidden;\n}\n\n.mytheme .v-treegrid-tablewrapper {\n\tposition: absolute;\n\toverflow: hidden;\n\tbox-sizing: border-box;\n\tz-index: 5;\n}\n\n.mytheme .v-treegrid-tablewrapper > table {\n\tborder-spacing: 0;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-treegrid-header-deco, .mytheme .v-treegrid-footer-deco {\n\tposition: absolute;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-treegrid-horizontal-scrollbar-deco {\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-treegrid-header, .mytheme .v-treegrid-body, .mytheme .v-treegrid-footer {\n\tposition: absolute;\n\tleft: 0;\n\twidth: inherit;\n\tz-index: 10;\n}\n\n.mytheme .v-treegrid-header, .mytheme .v-treegrid-header-deco {\n\ttop: 0;\n}\n\n.mytheme .v-treegrid-footer, .mytheme .v-treegrid-footer-deco {\n\tbottom: 0;\n}\n\n.mytheme .v-treegrid-body {\n\t-ms-touch-action: none;\n\ttouch-action: none;\n\tz-index: 0;\n\ttop: 0;\n}\n\n.mytheme .v-treegrid-body .v-treegrid-row {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n}\n\n.mytheme .v-treegrid-row {\n\tdisplay: block;\n}\n\n.mytheme .v-treegrid-row > td, .mytheme .v-treegrid-row > th {\n\tbackground-color: white;\n}\n\n.mytheme .v-treegrid-row {\n\twidth: inherit;\n}\n\n.mytheme .v-treegrid-cell {\n\tdisplay: block;\n\tfloat: left;\n\tpadding: 2px;\n\twhite-space: nowrap;\n\tbox-sizing: border-box;\n\toverflow: hidden;\n\tfont-size: 16px;\n}\n\n.mytheme .v-treegrid-cell.frozen {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.mytheme .v-treegrid-spacer {\n\tposition: absolute;\n\tdisplay: block;\n\tbackground-color: white;\n}\n\n.mytheme .v-treegrid-spacer > td {\n\twidth: 100%;\n\theight: 100%;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-treegrid {\n\toutline: none;\n}\n\n.mytheme .v-treegrid-scroller-vertical, .mytheme .v-treegrid-scroller-horizontal {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid-scroller-vertical {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-scroller-horizontal {\n\tborder-top: none;\n}\n\n.mytheme .v-treegrid-tablewrapper {\n\tborder: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid .header-drag-table {\n\tborder-spacing: 0;\n\tposition: relative;\n\ttable-layout: fixed;\n\twidth: inherit;\n}\n\n.mytheme .v-treegrid .header-drag-table .v-treegrid-header {\n\tposition: absolute;\n}\n\n.mytheme .v-treegrid .header-drag-table .v-treegrid-header > .v-treegrid-cell {\n\tborder: 1px solid #d4d4d4;\n\tmargin-top: -10px;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90);\n\tz-index: 30000;\n}\n\n.mytheme .v-treegrid .header-drag-table .v-treegrid-header > .v-treegrid-drop-marker {\n\tbackground-color: #197de1;\n\tposition: absolute;\n\twidth: 3px;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder-radius: 0;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tpadding: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.v-treegrid-sidebar-popup {\n\tright: auto;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-button {\n\tbackground: transparent;\n\tborder: none;\n\tcolor: inherit;\n\tcursor: pointer;\n\toutline: none;\n\tpadding: 0 4px;\n\ttext-align: right;\n\tline-height: 1;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-button[disabled] {\n\tcursor: default;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-button::-moz-focus-inner {\n\tborder: 0;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tdisplay: block;\n\tfont-family: ThemeIcons, sans-serif;\n\tfont-size: 14px;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.closed {\n\tborder-radius: 0;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.open .v-treegrid-sidebar-button {\n\twidth: 100%;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.open .v-treegrid-sidebar-button:after {\n\tcontent: \"\\f0c9\";\n\tfont-size: 14px;\n\tline-height: 1;\n}\n\n.v-ie .mytheme .v-treegrid-sidebar.v-contextmenu.open .v-treegrid-sidebar-button {\n\tvertical-align: middle;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-content {\n\tpadding: 4px 0;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu .v-treegrid-sidebar-content .gwt-MenuBar .gwt-MenuItem .column-hiding-toggle {\n\ttext-shadow: none;\n}\n\n.mytheme .v-treegrid-cell {\n\tbackground-color: white;\n\tpadding: 0 18px;\n\tline-height: 37px;\n\ttext-overflow: ellipsis;\n}\n\n.mytheme .v-treegrid-cell > * {\n\tline-height: 1.55;\n\tvertical-align: middle;\n}\n\n.mytheme .v-treegrid-cell > div {\n\tdisplay: inline-block;\n}\n\n.mytheme .v-treegrid-cell.frozen {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tposition: relative;\n\tz-index: 11;\n}\n\n.mytheme .v-treegrid-cell.frozen + th, .mytheme .v-treegrid-cell.frozen + td {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-cell div.component-wrap {\n\twidth: 100%;\n}\n\n.mytheme .v-treegrid-row > td, .mytheme .v-treegrid-editor-cells > div {\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid-row > td:first-child, .mytheme .v-treegrid-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-editor-cells.frozen > div {\n\t-webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tbox-shadow: 1px 0 2px rgba(0, 0, 0, 0.1);\n\tborder-right: 1px solid #d4d4d4;\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-row-stripe > td {\n\tbackground-color: #f5f5f5;\n}\n\n.mytheme .v-treegrid-row-selected > td {\n\tbackground: #197de1;\n}\n\n.mytheme .v-treegrid-row-focused > td {\n\t\n}\n\n.mytheme .v-treegrid-header th {\n\tposition: relative;\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-bottom: 1px solid #d4d4d4;\n\t\n\ttext-align: left;\n}\n\n.mytheme .v-treegrid-header th:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-header .sort-asc, .mytheme .v-treegrid-header .sort-desc {\n\tpadding-right: 35px;\n}\n\n.mytheme .v-treegrid-header .sort-asc:after, .mytheme .v-treegrid-header .sort-desc:after {\n\tfont-family: ThemeIcons, sans-serif;\n\tcontent: \"\\f0de\" \" \" attr(sort-order);\n\tposition: absolute;\n\tright: 18px;\n\tfont-size: 12px;\n}\n\n.mytheme .v-treegrid-header .sort-desc:after {\n\tcontent: \"\\f0dd\" \" \" attr(sort-order);\n}\n\n.mytheme .v-treegrid-column-resize-handle {\n\tposition: absolute;\n\twidth: 36px;\n\tright: -18px;\n\ttop: 0px;\n\tbottom: 0px;\n\tcursor: col-resize;\n\tz-index: 10;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-treegrid-column-resize-simple-indicator {\n\tposition: absolute;\n\twidth: 3px;\n\ttop: 0px;\n\tleft: 18px;\n\tz-index: 9001;\n\tbackground: #fff;\n\tbox-shadow: 0px 0px 5px #000;\n\t-webkit-user-select: none;\n\t-khtml-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n}\n\n.mytheme .v-treegrid-footer td {\n\tbackground-color: #fafafa;\n\tfont-size: 14px;\n\tfont-weight: inherit;\n\tborder-left: 1px solid #d4d4d4;\n\tborder-top: 1px solid #d4d4d4;\n\tborder-bottom: none;\n\t\n}\n\n.mytheme .v-treegrid-footer td:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-header .v-treegrid-cell, .mytheme .v-treegrid-footer .v-treegrid-cell {\n\toverflow: visible;\n}\n\n.mytheme .v-treegrid-column-header-content, .mytheme .v-treegrid-column-footer-content {\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\tvertical-align: baseline;\n}\n\n.mytheme .v-treegrid-header-deco {\n\tborder-top: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-treegrid-footer-deco {\n\tborder-bottom: 1px solid #d4d4d4;\n\tborder-right: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-treegrid-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tborder: 1px solid #d4d4d4;\n\tborder-top: none;\n}\n\n.mytheme .v-treegrid-cell-focused {\n\tposition: relative;\n}\n\n.mytheme .v-treegrid-cell-focused:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder: 2px solid #197de1;\n\tdisplay: none;\n\tpointer-events: none;\n}\n\n.mytheme .v-treegrid:focus .v-treegrid-cell-focused:before {\n\tdisplay: block;\n}\n\n.mytheme .v-treegrid.v-disabled:focus .v-treegrid-cell-focused:before {\n\tdisplay: none;\n}\n\n.mytheme .v-treegrid-editor {\n\tposition: absolute;\n\tz-index: 20;\n\toverflow: hidden;\n\tleft: 0;\n\tright: 0;\n\tborder: 1px solid #d4d4d4;\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\tmargin-top: -1px;\n\t-webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 0 9px rgba(0, 0, 0, 0.2);\n}\n\n.mytheme .v-treegrid-editor.unbuffered .v-treegrid-editor-footer {\n\twidth: 100%;\n}\n\n.mytheme .v-treegrid-editor-cells {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-treegrid-editor-cells.frozen {\n\tz-index: 2;\n}\n\n.mytheme .v-treegrid-editor-cells > div {\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tvertical-align: middle;\n\tbackground: white;\n}\n\n.mytheme .v-treegrid-editor-cells > div:first-child {\n\tborder-left: none;\n}\n\n.mytheme .v-treegrid-editor-cells > div > * {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-filterselect {\n\tpadding-left: 0;\n}\n\n.mytheme .v-treegrid-editor-cells > div input[type=\"text\"], .mytheme .v-treegrid-editor-cells > div input[type=\"text\"].v-filterselect-input, .mytheme .v-treegrid-editor-cells > div input[type=\"password\"] {\n\tpadding-left: 18px;\n}\n\n.mytheme .v-treegrid-editor-cells > div input[type=\"text\"]:not(.v-filterselect-input), .mytheme .v-treegrid-editor-cells > div input[type=\"password\"] {\n\tpadding-right: 9px;\n}\n\n.mytheme .v-treegrid-editor-cells > div input[type=\"checkbox\"] {\n\tmargin-left: 18px;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-textfield, .mytheme .v-treegrid-editor-cells > div .v-datefield, .mytheme .v-treegrid-editor-cells > div .v-filterselect {\n\tmin-width: 100%;\n\tmax-width: 100%;\n\tmin-height: 100%;\n\tmax-height: 100%;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-select, .mytheme .v-treegrid-editor-cells > div .v-select-select {\n\tmin-width: 100%;\n\tmax-width: 100%;\n}\n\n.mytheme .v-treegrid-editor-cells > div.not-editable.v-treegrid-cell {\n\tfloat: none;\n}\n\n.mytheme .v-treegrid-editor-cells .error::before {\n\tposition: absolute;\n\tdisplay: block;\n\theight: 0;\n\twidth: 0;\n\tcontent: \"\";\n\tborder-top: 5px solid red;\n\tborder-right: 5px solid transparent;\n}\n\n.mytheme .v-treegrid-editor-cells .error, .mytheme .v-treegrid-editor-cells .error > input {\n\tbackground-color: #fee;\n}\n\n.mytheme .v-treegrid-editor-footer {\n\tdisplay: table;\n\theight: 37px;\n\tborder-top: 1px solid #d4d4d4;\n\tmargin-top: -1px;\n\tbackground: white;\n\tpadding: 0 5px;\n}\n\n.mytheme .v-treegrid-editor-footer + .v-treegrid-editor-cells > div {\n\tborder-bottom: none;\n\tborder-top: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid-editor-footer:first-child {\n\tborder-top: none;\n\tmargin-top: 0;\n\tborder-bottom: 1px solid #d4d4d4;\n\tmargin-bottom: -1px;\n}\n\n.mytheme .v-treegrid-editor-message, .mytheme .v-treegrid-editor-buttons {\n\tdisplay: table-cell;\n\twhite-space: nowrap;\n\tvertical-align: middle;\n}\n\n.mytheme .v-treegrid-editor-message {\n\twidth: 100%;\n\tposition: relative;\n}\n\n.mytheme .v-treegrid-editor-message > div {\n\tposition: absolute;\n\twidth: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tline-height: 37px;\n\ttop: 0;\n}\n\n.mytheme .v-treegrid-editor-save {\n\tmargin-right: 4px;\n}\n\n.mytheme .v-treegrid-spacer {\n\tpadding-left: 1px;\n}\n\n.mytheme .v-treegrid-spacer > td {\n\tdisplay: block;\n\tpadding: 0;\n\tbackground-color: white;\n\tborder-top: 1px solid #eeeeee;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid-spacer.stripe > td {\n\tbackground-color: #f5f5f5;\n\tborder-top: 1px solid #e5e5e5;\n\tborder-bottom: 1px solid #d4d4d4;\n}\n\n.mytheme .v-treegrid-spacer-deco-container {\n\tborder-top: 1px solid transparent;\n\tposition: relative;\n\ttop: 0;\n\tz-index: 5;\n}\n\n.mytheme .v-treegrid-spacer-deco {\n\ttop: 0;\n\tleft: 0;\n\twidth: 2px;\n\tbackground-color: #197de1;\n\tposition: absolute;\n\theight: 100%;\n\tpointer-events: none;\n}\n\n.mytheme .v-treegrid-cell > .v-progressbar {\n\twidth: 100%;\n}\n\n.mytheme .v-treegrid {\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-treegrid.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-treegrid-header .v-treegrid-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-treegrid-header .v-treegrid-cell.dragged {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\t-webkit-transition: opacity 0.3s ease-in-out;\n\t-moz-transition: opacity 0.3s ease-in-out;\n\ttransition: opacity 0.3s ease-in-out;\n}\n\n.mytheme .v-treegrid-header .v-treegrid-cell.dragged-column-header {\n\tmargin-top: -19px;\n}\n\n.mytheme .v-treegrid-footer .v-treegrid-cell {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-treegrid-header-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-treegrid-footer-deco, .mytheme .v-treegrid-horizontal-scrollbar-deco {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-treegrid-row-selected > .v-treegrid-cell {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #c8dbed;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tborder-color: #1d69b4;\n}\n\n.mytheme .v-treegrid-row-selected > .v-treegrid-cell-focused:before {\n\tborder-color: #71b0ef;\n}\n\n.mytheme .v-treegrid-editor {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tborder-color: #197de1;\n}\n\n.mytheme .v-treegrid-editor-footer {\n\tfont-size: 14px;\n\tpadding: 0 6px;\n\tbackground: #fafafa;\n\t-webkit-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in 200ms 120ms backwards;\n}\n\n.mytheme .v-treegrid-editor-footer:first-child {\n\t-webkit-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\t-moz-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n\tanimation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards;\n}\n\n.mytheme .v-treegrid-editor-cells {\n\tz-index: 1;\n}\n\n.mytheme .v-treegrid-editor-cells > div:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\theight: 100%;\n\tvertical-align: middle;\n}\n\n.mytheme .v-treegrid-editor-cells > div.not-editable.v-treegrid-cell {\n\tfloat: none;\n}\n\n.mytheme .v-treegrid-editor-cells > div .error::before {\n\tborder-top: 9px solid #ed473b;\n\tborder-right: 9px solid transparent;\n}\n\n.mytheme .v-treegrid-editor-cells > div .error, .mytheme .v-treegrid-editor-cells > div .error > input {\n\tbackground-color: #fffbfb;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-textfield, .mytheme .v-treegrid-editor-cells > div .v-textfield-focus, .mytheme .v-treegrid-editor-cells > div .v-datefield, .mytheme .v-treegrid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-treegrid-editor-cells > div .v-filterselect-input, .mytheme .v-treegrid-editor-cells > div .v-filterselect-input:focus {\n\tborder: none;\n\tborder-radius: 0;\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 1px 0 #f2f2f2;\n\tbox-shadow: inset 0 1px 0 #f2f2f2;\n}\n\n.mytheme .v-treegrid-editor-cells > div input[type=\"text\"].v-datefield-textfield {\n\tpadding-left: 44.4px;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-textfield-focus, .mytheme .v-treegrid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-treegrid-editor-cells > div .v-filterselect-input:focus {\n\tposition: relative;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-select {\n\tpadding-left: 9px;\n\tpadding-right: 9px;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-checkbox {\n\tmargin: 0 9px 0 18px;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-checkbox > input[type=\"checkbox\"] {\n\tmargin-left: 0;\n}\n\n.mytheme .v-treegrid-editor-cells > div .v-checkbox > label {\n\twhite-space: nowrap;\n}\n\n.mytheme .v-treegrid-editor-message > div:before {\n\tdisplay: inline-block;\n\tcolor: #ed473b;\n\tfont-weight: 600;\n\twidth: 19px;\n\ttext-align: center;\n\tcontent: \"!\";\n}\n\n.mytheme .v-treegrid-editor-save, .mytheme .v-treegrid-editor-cancel {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n\tfont-weight: 400;\n\ttext-decoration: none;\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 6px 6px;\n\tmargin: 0;\n\toutline: none;\n}\n\n.mytheme .v-treegrid-editor-save:hover, .mytheme .v-treegrid-editor-cancel:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-treegrid-editor-save.v-disabled, .mytheme .v-treegrid-editor-cancel.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-treegrid-spacer {\n\tmargin-top: -1px;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.open .v-treegrid-sidebar-content {\n\tmargin: 0 0 2px;\n\tpadding: 4px 4px 2px;\n\toverflow-y: auto;\n\toverflow-x: hidden;\n}\n\n.mytheme .v-treegrid-sidebar.v-contextmenu.closed {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-treegrid-scroller::-webkit-scrollbar {\n\tborder: none;\n}\n\n.mytheme .v-treegrid-scroller::-webkit-scrollbar-thumb {\n\tborder-radius: 10px;\n\tborder: 4px solid transparent;\n\tbackground: rgba(0, 0, 0, 0.3);\n\t-webkit-background-clip: content-box;\n\tbackground-clip: content-box;\n}\n\n.mytheme .v-treegrid-scroller-vertical::-webkit-scrollbar-thumb {\n\tmin-height: 30px;\n}\n\n.mytheme .v-treegrid-scroller-horizontal::-webkit-scrollbar-thumb {\n\tmin-width: 30px;\n}\n\n.mytheme .v-treegrid-row-drag-badge {\n\tbackground-color: red;\n\tcolor: white;\n\tdisplay: block;\n\twidth: 30px;\n\theight: 30px;\n\tborder-radius: 10px;\n\tline-height: 30px;\n\ttext-align: center;\n\tfloat: left;\n}\n\n.mytheme .v-treegrid-row-drag-top, .mytheme .v-treegrid-row-drag-bottom {\n\tz-index: 100;\n}\n\n.mytheme .v-treegrid-row-drag-top:before, .mytheme .v-treegrid-row-drag-bottom:after {\n\tcontent: \"\";\n\tdisplay: block;\n\tposition: absolute;\n\theight: 2px;\n\twidth: 100%;\n\tbackground: #197de1;\n\tpointer-events: none;\n\tborder: none;\n}\n\n.mytheme .v-treegrid-row-drag-bottom:after {\n\tbottom: -1px;\n}\n\n.mytheme .v-treegrid-row-drag-top:before {\n\ttop: -1px;\n}\n\n.mytheme .v-treegrid-row-drag-top:first-child:before {\n\ttop: 0;\n}\n\n.mytheme .v-treegrid-row-drag-center:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tbottom: 0;\n\tright: 2px;\n\tborder: 2px solid #197de1;\n\tpointer-events: none;\n}\n\n.mytheme .v-treegrid-row-selected.v-treegrid-row-drag-center:after {\n\tborder-color: #1463b3;\n}\n\n.mytheme .v-treegrid-row-selected.v-treegrid-row-drag-top:before, .mytheme .v-treegrid-row-selected.v-treegrid-row-drag-bottom:after {\n\tbackground: #1463b3;\n}\n\n.mytheme .v-treegrid-body-drag-top:after {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tpointer-events: none;\n\tborder: 2px solid #197de1;\n\tz-index: 100;\n}\n\n.mytheme .v-treegrid-expander {\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.mytheme .v-treegrid-expander::before {\n\tdisplay: inline-block;\n\twidth: 1.5em;\n\ttext-align: center;\n\tcontent: \"\";\n}\n\n.mytheme .v-treegrid-expander.expanded::before {\n\tcontent: \"\\f0d7\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-treegrid-expander.collapsed::before {\n\tcontent: \"\\f0da\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-treegrid-expander.collapse-disabled::before {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\tcursor: default;\n}\n\n.mytheme .v-treegrid-node.depth-0 {\n\tpadding-left: 0em;\n}\n\n.mytheme .v-treegrid-node.depth-1 {\n\tpadding-left: 1em;\n}\n\n.mytheme .v-treegrid-node.depth-2 {\n\tpadding-left: 2em;\n}\n\n.mytheme .v-treegrid-node.depth-3 {\n\tpadding-left: 3em;\n}\n\n.mytheme .v-treegrid-node.depth-4 {\n\tpadding-left: 4em;\n}\n\n.mytheme .v-treegrid-node.depth-5 {\n\tpadding-left: 5em;\n}\n\n.mytheme .v-treegrid-node.depth-6 {\n\tpadding-left: 6em;\n}\n\n.mytheme .v-treegrid-node.depth-7 {\n\tpadding-left: 7em;\n}\n\n.mytheme .v-treegrid-node.depth-8 {\n\tpadding-left: 8em;\n}\n\n.mytheme .v-treegrid-node.depth-9 {\n\tpadding-left: 9em;\n}\n\n.mytheme .v-treegrid-node.depth-10 {\n\tpadding-left: 10em;\n}\n\n.mytheme .v-treegrid-node.depth-11 {\n\tpadding-left: 11em;\n}\n\n.mytheme .v-treegrid-node.depth-12 {\n\tpadding-left: 12em;\n}\n\n.mytheme .v-treegrid-node.depth-13 {\n\tpadding-left: 13em;\n}\n\n.mytheme .v-treegrid-node.depth-14 {\n\tpadding-left: 14em;\n}\n\n.mytheme .v-treegrid-node.depth-15 {\n\tpadding-left: 15em;\n}\n\n.mytheme .v-treegrid-cell-content {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.mytheme .v-treegrid-row-focused::before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder: 2px solid #197de1;\n\tdisplay: none;\n\tpointer-events: none;\n}\n\n.mytheme .v-treegrid-cell-focused {\n\tposition: static;\n}\n\n.mytheme .v-treegrid-cell-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-treegrid:focus .v-treegrid-row-focused::before {\n\tdisplay: block;\n}\n\n.mytheme .v-treegrid.v-disabled:focus .v-treegrid-row-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-treegrid:focus .v-treegrid-cell-focused::before {\n\tdisplay: none;\n}\n\n.mytheme .v-table {\n\tposition: relative;\n\tbackground: #fafafa;\n\tcolor: #464646;\n\toverflow: hidden;\n}\n\n.mytheme .v-table-header table, .mytheme .v-table-footer table, .mytheme .v-table-table {\n\t-webkit-box-shadow: 0 0 0 1px #d4d4d4;\n\tbox-shadow: 0 0 0 1px #d4d4d4;\n}\n\n.mytheme .v-table-header-wrap, .mytheme .v-table-footer-wrap, .mytheme .v-table-header-drag {\n\tborder: 1px solid #d4d4d4;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\twhite-space: nowrap;\n\tfont-size: 14px;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-table-header-wrap {\n\tposition: relative;\n\tborder-bottom: none;\n}\n\n.mytheme .v-table-footer-wrap {\n\tborder-top: none;\n}\n\n.mytheme .v-table-footer td {\n\tborder-left: 1px solid #d4d4d4;\n}\n\n.mytheme .v-table-footer-container, .mytheme .v-table-caption-container {\n\toverflow: hidden;\n\tline-height: 1;\n\tmin-height: 37px;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-table-footer-container {\n\tpadding: 11px 12px 12px;\n\tfloat: right;\n}\n\n.mytheme [class^=\"v-table-header-cell\"] {\n\tposition: relative;\n}\n\n.mytheme .v-table-caption-container, .mytheme .v-table-header-drag {\n\tpadding: 12px 12px 11px;\n\tborder-left: 1px solid #d4d4d4;\n}\n\n.mytheme .v-table-caption-container-align-right {\n\tpadding-right: 4px;\n}\n\n.mytheme .v-table-resizer {\n\theight: 37px;\n\twidth: 8px;\n\tcursor: e-resize;\n\tcursor: col-resize;\n\tposition: relative;\n\tright: -4px;\n\tz-index: 1;\n\tmargin-left: -8px;\n}\n\n.mytheme .v-table-cell-content {\n\tborder-left: 1px solid #d4d4d4;\n\toverflow: hidden;\n\theight: 37px;\n\tvertical-align: middle;\n}\n\n.mytheme .v-table-cell-content:first-child {\n\tborder-left: none;\n\tpadding-left: 1px;\n}\n\n.mytheme .v-table-header td:first-child .v-table-caption-container, .mytheme .v-table-footer td:first-child {\n\tborder-left-color: transparent;\n}\n\n.mytheme .v-table-cell-wrapper {\n\tline-height: 1;\n\tpadding: 0 12px;\n\tbox-sizing: border-box;\n\tmargin-right: 0 !important;\n}\n\n.mytheme .v-table-cell-wrapper > .v-widget {\n\tmargin: 3px -6px;\n}\n\n.mytheme .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-cell-wrapper > .v-widget.v-select-optiongroup {\n\tmargin: 0;\n}\n\n.mytheme .v-table-cell-wrapper > .v-widget.v-progressbar {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n.mytheme .v-table-body {\n\tborder: 1px solid #d4d4d4;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\n.mytheme .v-table-table {\n\tbackground-color: white;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-table-table td {\n\tborder-top: 1px solid #d4d4d4;\n}\n\n.mytheme .v-table-table tr:first-child > td {\n\tborder-top: none;\n}\n\n.mytheme .v-table-row {\n\tbackground-color: white;\n\tcursor: pointer;\n}\n\n.mytheme .v-table-row-odd {\n\tbackground-color: #f5f5f5;\n\tcursor: pointer;\n}\n\n.mytheme .v-table-body-noselection .v-table-row, .mytheme .v-table-body-noselection .v-table-row-odd {\n\tcursor: default;\n}\n\n.mytheme .v-table [class*=\"-row\"].v-selected {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tbackground-origin: border-box;\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-table [class*=\"-row\"].v-selected + .v-selected {\n\tbackground: #166ed5;\n}\n\n.mytheme .v-table [class*=\"-row\"].v-selected + .v-selected td {\n\tborder-top-color: #166ed5;\n}\n\n.mytheme .v-table [class*=\"-row\"].v-selected .v-table-cell-content {\n\tborder-color: transparent;\n\tborder-left-color: #1d69b4;\n}\n\n.mytheme .v-table [class*=\"-row\"].v-selected .v-table-cell-content:first-child {\n\tborder-left-color: transparent;\n}\n\n.mytheme .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-header-cell-desc .v-table-sort-indicator {\n\tbackground: transparent;\n\twidth: 19px;\n\theight: 37px;\n\tline-height: 37px;\n\tmargin-left: -19px;\n}\n\n.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before, .mytheme .v-table-header-cell-desc .v-table-sort-indicator:before {\n\tfont-style: normal;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n}\n\n.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before {\n\tcontent: \"\\f0de\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-table-header-cell-desc .v-table-sort-indicator:before {\n\tcontent: \"\\f0dd\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme [class*=\"rowheader\"] span.v-icon {\n\tmin-width: 1em;\n}\n\n.mytheme .v-table-focus {\n\toutline: 1px solid #197de1;\n\toutline-offset: -1px;\n}\n\n.mytheme .v-drag-element.v-table-focus, .mytheme .v-drag-element .v-table-focus {\n\toutline: none;\n}\n\n.mytheme .v-table-header-drag {\n\tposition: absolute;\n\topacity: 0.9;\n\tfilter: alpha(opacity=90) ;\n\tmargin-top: -19px;\n\tz-index: 30000;\n\tline-height: 1;\n}\n\n.mytheme .v-table-focus-slot-right {\n\tborder-right: 3px solid #197de1;\n\tright: -2px;\n\tmargin-left: -11px !important;\n}\n\n.mytheme .v-table-focus-slot-left {\n\tfloat: left;\n\tborder-left: 3px solid #197de1;\n\tleft: -1px;\n\tright: auto;\n\tmargin-left: 0 !important;\n\tmargin-right: -11px;\n}\n\n.mytheme .v-table-column-selector {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tposition: absolute;\n\tz-index: 2;\n\ttop: 0;\n\tright: 0;\n\twidth: 19px;\n\theight: 19px;\n\tline-height: 19px;\n\tpadding: 0;\n\tborder-top-width: 0;\n\tborder-right-width: 0;\n\tborder-radius: 0 0 0 4px;\n\tcursor: pointer;\n\ttext-align: center;\n\topacity: 0;\n\tfilter: alpha(opacity=0) ;\n\t-webkit-transition: opacity 200ms 2s;\n\t-moz-transition: opacity 200ms 2s;\n\ttransition: opacity 200ms 2s;\n}\n\n.mytheme .v-table-column-selector:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-table-column-selector:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-table-column-selector:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-table-column-selector:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-table-column-selector:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tborder: none;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.mytheme .v-table-column-selector:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-table-column-selector:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f013\";\n}\n\n.mytheme .v-table-header-wrap:hover .v-table-column-selector {\n\topacity: 1;\n\tfilter: none ;\n\t-webkit-transition-delay: 200ms;\n\t-moz-transition-delay: 200ms;\n\ttransition-delay: 200ms;\n}\n\n.mytheme .v-on:before, .mytheme .v-off:before {\n\tcontent: \"\\f00c\";\n\tfont-family: ThemeIcons;\n\tfont-size: 0.9em;\n\tmargin-right: 6px;\n}\n\n.mytheme .v-on div, .mytheme .v-off div {\n\tdisplay: inline;\n}\n\n.mytheme .v-on.v-disabled, .mytheme .v-off.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-off:before {\n\tvisibility: hidden;\n}\n\n.mytheme tbody.v-drag-element {\n\tdisplay: block;\n\toverflow: visible;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tbackground: transparent;\n\topacity: 1;\n\tfilter: none ;\n}\n\n.mytheme tbody.v-drag-element tr {\n\tdisplay: block;\n\t\n\t\n\t-webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);\n\tborder-radius: 4px;\n\toverflow: hidden;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\tbackground: white;\n}\n\n.mytheme .v-table-body {\n\tposition: relative;\n\tz-index: 1;\n}\n\n.mytheme .v-table-scrollposition {\n\tposition: absolute;\n\ttop: 50%;\n\twidth: 100%;\n\theight: 37px;\n\tline-height: 37px;\n\tmargin: -19px 0 0 !important;\n\ttext-align: center;\n}\n\n.mytheme .v-table-drag {\n\toverflow: visible;\n}\n\n.mytheme .v-table-drag .v-table-body {\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tborder-color: #197de1;\n}\n\n.mytheme .v-table-drag .v-table-body .v-table-focus {\n\toutline: none;\n}\n\n.mytheme .v-table-row-drag-middle .v-table-cell-content {\n\tbackground-color: #d1e5f9;\n\tcolor: #214060;\n}\n\n.mytheme .v-table-row-drag-bottom td.v-table-cell-content {\n\tborder-bottom: 2px solid #197de1;\n\theight: 35px;\n}\n\n.mytheme .v-table-row-drag-bottom .v-table-cell-wrapper {\n\tmargin-bottom: -2px;\n}\n\n.mytheme .v-table-row-drag-top td.v-table-cell-content {\n\tborder-top: 2px solid #197de1;\n\theight: 36px;\n}\n\n.mytheme .v-table-row-drag-top .v-table-cell-wrapper {\n\tmargin-top: -1px;\n}\n\n.mytheme .v-table-no-stripes .v-table-row, .mytheme .v-table-no-stripes .v-table-row-odd {\n\tbackground: transparent;\n}\n\n.mytheme .v-table-no-vertical-lines .v-table-cell-content {\n\tborder-left: none;\n\tpadding-left: 1px;\n}\n\n.mytheme .v-table-no-vertical-lines.v-treetable .v-table-cell-content {\n\tpadding-left: 13px;\n}\n\n.mytheme .v-table-no-horizontal-lines .v-table-cell-content {\n\tborder-top: none;\n\tborder-bottom: none;\n}\n\n.mytheme .v-table-no-horizontal-lines .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-no-horizontal-lines .v-table-row-drag-bottom .v-table-cell-content {\n\theight: 36px;\n}\n\n.mytheme .v-table-no-header .v-table-header-wrap {\n\tdisplay: none;\n}\n\n.mytheme .v-table-borderless .v-table-header-wrap, .mytheme .v-table-borderless .v-table-footer-wrap, .mytheme .v-table-borderless .v-table-header-drag, .mytheme .v-table-borderless .v-table-body {\n\tborder: none;\n}\n\n.mytheme .v-table-borderless .v-table-header-wrap {\n\tborder-bottom: 1px solid #d9d9d9;\n}\n\n.mytheme .v-table-borderless .v-table-footer-wrap {\n\tborder-top: 1px solid #d9d9d9;\n}\n\n.mytheme .v-table-compact .v-table-header-wrap, .mytheme .v-table-compact .v-table-footer-wrap, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-wrap, .mytheme .v-table-small .v-table-footer-wrap, .mytheme .v-table-small .v-table-header-drag {\n\tfont-size: 14px;\n}\n\n.mytheme .v-table-compact .v-table-footer-container, .mytheme .v-table-small .v-table-footer-container {\n\tpadding: 8px 7px 9px;\n}\n\n.mytheme .v-table-compact .v-table-caption-container, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-caption-container, .mytheme .v-table-small .v-table-header-drag {\n\tpadding-top: 9px;\n\tpadding-bottom: 8px;\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.mytheme .v-table-compact .v-table-caption-container-align-right, .mytheme .v-table-small .v-table-caption-container-align-right {\n\tpadding-right: 0;\n}\n\n.mytheme .v-table-compact .v-table-resizer, .mytheme .v-table-small .v-table-resizer {\n\theight: 31px;\n}\n\n.mytheme .v-table-compact .v-table-cell-content, .mytheme .v-table-small .v-table-cell-content {\n\theight: 31px;\n}\n\n.mytheme .v-table-compact .v-table-cell-wrapper, .mytheme .v-table-small .v-table-cell-wrapper {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget {\n\tmargin: 2px -3px;\n}\n\n.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-select-optiongroup, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-select-optiongroup {\n\tmargin: 0;\n}\n\n.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-progressbar, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-progressbar {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n.mytheme .v-table-compact .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-compact .v-table-header-cell-desc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-desc .v-table-sort-indicator {\n\theight: 31px;\n\tline-height: 31px;\n}\n\n.mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-drag {\n\tmargin-top: -16px;\n}\n\n.mytheme .v-table-compact.v-treetable .v-table-cell-wrapper, .mytheme .v-table-small.v-treetable .v-table-cell-wrapper {\n\tpadding-left: 0;\n\tpadding-right: 0;\n\tmin-height: 16px;\n}\n\n.mytheme .v-table-compact.v-treetable .v-table-cell-content, .mytheme .v-table-small.v-treetable .v-table-cell-content {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.mytheme .v-table-compact.v-treetable .v-table-cell-content:first-child, .mytheme .v-table-small.v-treetable .v-table-cell-content:first-child {\n\tpadding-left: 7px;\n}\n\n.mytheme .v-table-compact.v-treetable .v-table-footer-container, .mytheme .v-table-small.v-treetable .v-table-footer-container {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.mytheme .v-table-compact .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-compact .v-table-row-drag-bottom .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-bottom .v-table-cell-content {\n\theight: 30px;\n}\n\n.mytheme .v-table-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-table-small.v-treetable .v-table-cell-wrapper {\n\tmin-height: 14px;\n}\n\n.mytheme .v-treetable [class*=\"caption-container\"], .mytheme .v-treetable [class*=\"footer-container\"], .mytheme .v-treetable [class*=\"cell-wrapper\"] {\n\tbox-sizing: content-box;\n\tpadding-left: 0;\n\tpadding-right: 0;\n}\n\n.mytheme .v-treetable [class*=\"caption-container\"], .mytheme .v-treetable [class*=\"footer-container\"] {\n\tmin-height: 14px;\n}\n\n.mytheme .v-treetable [class*=\"cell-wrapper\"] {\n\tmin-height: 16px;\n}\n\n.mytheme .v-treetable [class*=\"caption-container\"] {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-treetable [class*=\"caption-container-align-right\"] {\n\tpadding-left: 20px;\n}\n\n.mytheme .v-treetable [class*=\"footer-container\"] {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-treetable [class*=\"cell-content\"] {\n\tpadding-left: 12px;\n\tpadding-right: 12px;\n}\n\n.mytheme .v-treetable [class*=\"cell-content\"]:first-child {\n\tpadding-left: 13px;\n}\n\n.mytheme .v-treetable-treespacer {\n\tdisplay: inline-block;\n\tposition: absolute;\n\twidth: 19px !important;\n\tmargin-left: -25px;\n\ttext-align: center;\n\tcursor: pointer;\n}\n\n.mytheme .v-treetable-node-closed:before {\n\tcontent: \"\\f0da\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-treetable-node-open:before {\n\tcontent: \"\\f0d7\";\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter {\n\twidth: 1px;\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter:after {\n\tleft: -6px;\n\tright: -6px;\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\theight: auto;\n\tpadding: 0;\n\tborder-radius: 0;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to right,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-second-container {\n\tmargin-left: 1px;\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter {\n\theight: 1px;\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter:after {\n\ttop: -6px;\n\tbottom: -6px;\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\theight: auto;\n\tpadding: 0;\n\tborder-radius: 0;\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter {\n\twidth: 12px;\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter:after {\n\tleft: 0px;\n\tright: 0px;\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\theight: auto;\n\tpadding: 0;\n\tborder-radius: 0;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to right,#fafafa 2%, #efefef 98%);\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:after {\n\tcontent: \"\";\n\tborder: 1px solid #dadada;\n\tborder-top-color: #bababa;\n\tborder-left-color: #bababa;\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\twidth: 0;\n\theight: 37px;\n\tmargin-left: -1px;\n\tmargin-top: -19px;\n}\n\n.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-second-container {\n\tmargin-left: 12px;\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter {\n\theight: 12px;\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter:after {\n\ttop: 0px;\n\tbottom: 0px;\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\theight: auto;\n\tpadding: 0;\n\tborder-radius: 0;\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:after {\n\tcontent: \"\";\n\tborder: 1px solid #dadada;\n\tborder-top-color: #bababa;\n\tborder-left-color: #bababa;\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\twidth: 37px;\n\theight: 0;\n\tmargin-left: -19px;\n\tmargin-top: -1px;\n}\n\n.mytheme .v-progressbar-wrapper {\n\tborder-radius: 4px;\n\theight: 9px;\n\tbackground-color: #d4d4d4;\n\tbackground-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%);\n\tbackground-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%);\n\tbox-sizing: border-box;\n\tmin-width: 74px;\n}\n\n.mytheme .v-progressbar-indicator {\n\tborder-radius: 4px;\n\theight: inherit;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\t\n\t\n\tborder: 1px solid #1362b1;\n\tbox-sizing: border-box;\n\tmax-width: 100%;\n\tmin-width: 8px;\n\t-webkit-transition: width 160ms;\n\t-moz-transition: width 160ms;\n\ttransition: width 160ms;\n}\n\n.mytheme .v-progressbar-point .v-progressbar-indicator {\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder: none;\n\ttext-align: right;\n\toverflow: hidden;\n}\n\n.mytheme .v-progressbar-point .v-progressbar-indicator:before {\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tborder-radius: 4px;\n\theight: inherit;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\t\n\t\n\tborder: 1px solid #1362b1;\n\tbox-sizing: border-box;\n\tmax-width: 100%;\n\twidth: 9px;\n\tvertical-align: top;\n}\n\n.mytheme .v-progressbar-indeterminate {\n\theight: 24px !important;\n\twidth: 24px !important;\n\tbox-sizing: border-box;\n\tborder: 2px solid rgba(25, 125, 225, 0.2);\n\tborder-top-color: #197de1;\n\tborder-right-color: #197de1;\n\tborder-radius: 100%;\n\t-webkit-animation: v-rotate-360 500ms infinite linear;\n\t-moz-animation: v-rotate-360 500ms infinite linear;\n\tanimation: v-rotate-360 500ms infinite linear;\n\tpointer-events: none;\n}\n\n.mytheme .v-progressbar-indeterminate .v-progressbar-wrapper {\n\tdisplay: none;\n}\n\n.mytheme .v-slider {\n\tposition: relative;\n}\n\n.mytheme .v-slider:focus {\n\toutline: none;\n}\n\n.mytheme .v-slider:focus .v-slider-handle:after {\n\topacity: 1;\n}\n\n.mytheme .v-slider.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-slider-base {\n\tborder-radius: 4px;\n\theight: 9px;\n\tbackground-color: #d4d4d4;\n\tbackground-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%);\n\tbackground-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%);\n\tbox-sizing: border-box;\n\tmin-width: 74px;\n\theight: 6px;\n\tmargin: 16px 11px;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\t\n}\n\n.mytheme .v-slider-base:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 16px;\n\tbottom: 16px;\n\tleft: 11px;\n\twidth: 8px;\n\tborder-radius: 4px;\n\tborder-left: 1px solid #1362b1;\n}\n\n.mytheme .v-slider-base:after {\n\tborder-radius: 4px;\n\theight: inherit;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\t\n\t\n\tborder: 1px solid #1362b1;\n\tbox-sizing: border-box;\n\tmax-width: 100%;\n\tcontent: \"\";\n\tdisplay: inline-block;\n\tmargin-left: -100%;\n\twidth: 100%;\n\tvertical-align: top;\n}\n\n.mytheme .v-has-width > .v-slider-base {\n\tmin-width: 0;\n}\n\n.mytheme .v-slider-handle {\n\tmargin-top: -16px;\n\twidth: 0.1px;\n\tdisplay: inline-block;\n\tvertical-align: top;\n}\n\n.mytheme .v-slider-handle:before {\n\theight: 37px;\n\tpadding: 0 16px;\n\tcolor: #191919;\n\tfont-weight: 400;\n\t\n\t\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n\tborder-top-color: #c5c5c5;\n\tborder-bottom-color: #bcbcbc;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n}\n\n.mytheme .v-slider-handle:before:after {\n\tborder: inherit;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n}\n\n.mytheme .v-slider-handle:before:hover:after {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n}\n\n.mytheme .v-slider-handle:before:focus:after {\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-slider-handle:before:active:after {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-slider-handle:after {\n\tborder: 1px solid #c5c5c5;\n\tborder-color: #197de1;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\topacity: 0;\n\t-webkit-transition: opacity 200ms;\n\t-moz-transition: opacity 200ms;\n\ttransition: opacity 200ms;\n}\n\n.mytheme .v-slider-handle:before, .mytheme .v-slider-handle:after {\n\tcontent: \"\";\n\tbox-sizing: border-box;\n\tpadding: 0;\n\twidth: 22px;\n\theight: 22px;\n\tborder-radius: 11px;\n\tposition: absolute;\n\tz-index: 1;\n\tmargin-top: 8px;\n\tmargin-left: -11px;\n}\n\n.mytheme .v-slider-feedback {\n\tbackground-color: rgba(50, 50, 50, 0.9);\n\t-webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);\n\tcolor: white;\n\tpadding: 5px 9px;\n\tborder-radius: 3px;\n\tmax-width: 35em;\n\toverflow: hidden !important;\n\tfont-size: 14px;\n}\n\n.mytheme .v-slider-vertical {\n\tpadding: 11px 0;\n\theight: 96px;\n}\n\n.mytheme .v-slider-vertical .v-slider-base {\n\tbackground-color: #d4d4d4;\n\tbackground-image: -webkit-linear-gradient(right, #d7d7d7 2%, #c7c7c7 98%);\n\tbackground-image: linear-gradient(to left,#d7d7d7 2%, #c7c7c7 98%);\n\twidth: 6px;\n\theight: 100% !important;\n\tmin-width: 0;\n\tmargin: 0 16px;\n}\n\n.mytheme .v-slider-vertical .v-slider-base:before {\n\ttop: auto;\n\tbottom: 11px;\n\tleft: 16px;\n\tright: 16px;\n\twidth: auto;\n\theight: 8px;\n\tborder-left: none;\n\tborder-bottom: 1px solid #1362b1;\n}\n\n.mytheme .v-slider-vertical .v-slider-base:after {\n\theight: 101%;\n\tmargin-left: 0;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(left, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to right,#1b87e3 2%, #166ed5 98%);\n}\n\n.mytheme .v-slider-vertical .v-slider-handle {\n\twidth: 0;\n\theight: 0.1px;\n\twidth: 37px;\n\tdisplay: block;\n}\n\n.mytheme .v-slider-vertical .v-slider-handle:before, .mytheme .v-slider-vertical .v-slider-handle:after {\n\twidth: 22px;\n\theight: 22px;\n\tmargin-top: -11px;\n\tmargin-left: -8px;\n}\n\n.mytheme .v-slider-no-indicator .v-slider-base:before, .mytheme .v-slider-no-indicator .v-slider-base:after {\n\tdisplay: none;\n}\n\n.mytheme .v-tabsheet:not(.v-has-width) {\n\twidth: auto !important;\n}\n\n.mytheme .v-tabsheet-spacertd {\n\tdisplay: none !important;\n}\n\n.mytheme .v-tabsheet-tabcontainer {\n\tposition: relative;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-tabsheet-tabcontainer:before {\n\tcontent: \"\";\n\tposition: absolute;\n\theight: 0;\n\tborder-top: 1px solid #dfdfdf;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n}\n\n.mytheme .v-tabsheet-tabcontainer .v-tabsheet-tabs {\n\tposition: relative;\n}\n\n.mytheme .v-tabsheet-tabitemcell {\n\tvertical-align: bottom;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem {\n\tline-height: 0;\n\toverflow: hidden;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption {\n\tmargin-left: 19px;\n\tpadding: 0 4px;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n\ttext-align: center;\n\tline-height: 37px;\n\tfont-size: 15px;\n\tfont-weight: 300;\n\tcolor: #696969;\n\twidth: auto !important;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\tborder-bottom: 2px solid transparent;\n\tposition: relative;\n\t-webkit-transition: border-bottom 200ms, color 200ms;\n\t-moz-transition: border-bottom 200ms, color 200ms;\n\ttransition: border-bottom 200ms, color 200ms;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption .v-captiontext {\n\tdisplay: inline;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption .v-icon + .v-captiontext {\n\tmargin-left: 9px;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\tcursor: default;\n\tcolor: inherit !important;\n}\n\n.mytheme .v-tabsheet-tabitemcell:first-child .v-caption, .mytheme .v-tabsheet-tabitemcell[aria-hidden=\"true\"] + td .v-caption {\n\tmargin-left: 0;\n}\n\n.mytheme .v-tabsheet-tabitemcell:focus {\n\toutline: none;\n}\n\n.mytheme .v-tabsheet-tabitemcell:focus .v-caption {\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem-selected .v-caption.v-caption {\n\tborder-bottom-color: #197de1;\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-caption-closable {\n\tpadding-right: 22px;\n}\n\n.mytheme .v-tabsheet-tabitemcell.icons-on-top .v-caption-closable {\n\tpadding-right: 4px;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close {\n\tposition: absolute;\n\tright: 0;\n\ttop: 50%;\n\tmargin: -8px 0 0;\n\tfont-size: 18px;\n\tline-height: 18px;\n\twidth: 18px;\n\ttext-align: center;\n\tborder-radius: 2px;\n\tcolor: #969696;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:hover {\n\tbackground: rgba(0, 0, 0, 0.03);\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:active {\n\tbackground: #197de1;\n\tcolor: #c8dbed;\n}\n\n.mytheme .v-tabsheet-scroller {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tpadding-left: 19px;\n\tbackground-color: transparent;\n\tbackground-image: -webkit-linear-gradient(right, #fafafa 70%, rgba(250, 250, 250, 0) 100%);\n\tbackground-image: linear-gradient(to left,#fafafa 70%, rgba(250, 250, 250, 0) 100%);\n\tpointer-events: none;\n}\n\n.mytheme .v-tabsheet-scroller:after {\n\tcontent: \"\";\n\theight: 1px;\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tdisplay: block;\n\tbackground-color: transparent;\n\tbackground-image: -webkit-linear-gradient(right, #dfdfdf 70%, rgba(223, 223, 223, 0) 100%);\n\tbackground-image: linear-gradient(to left,#dfdfdf 70%, rgba(223, 223, 223, 0) 100%);\n}\n\n.mytheme .v-tabsheet-scroller button {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\tborder: none;\n\tbackground: transparent;\n\tfont: inherit;\n\tcolor: inherit;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0 9px;\n\toutline: none;\n\tcursor: pointer;\n\tpointer-events: auto;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-tabsheet-scroller button:hover {\n\topacity: 1;\n\tfilter: none ;\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-scroller button:active {\n\topacity: 0.7;\n\tfilter: alpha(opacity=70) ;\n\tcolor: #197de1;\n}\n\n.mytheme .v-tabsheet-scroller button::-moz-focus-inner {\n\tpadding: 0;\n\tborder: 0;\n}\n\n.mytheme .v-tabsheet-scroller [class*=\"Next\"] {\n\tpadding-left: 5px;\n}\n\n.mytheme .v-tabsheet-scroller [class*=\"Next\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f054\";\n}\n\n.mytheme .v-tabsheet-scroller [class*=\"Prev\"] {\n\tpadding-right: 5px;\n}\n\n.mytheme .v-tabsheet-scroller [class*=\"Prev\"]:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f053\";\n}\n\n.mytheme .v-tabsheet-scroller [class*=\"disabled\"] {\n\tcursor: default;\n\tcolor: inherit !important;\n\topacity: 0.1 !important;\n\tfilter: alpha(opacity=10) !important;\n}\n\n.mytheme .v-tabsheet-tabsheetpanel > .v-scrollable > .v-widget {\n\t-webkit-animation: valo-animate-in-fade 300ms backwards;\n\t-moz-animation: valo-animate-in-fade 300ms backwards;\n\tanimation: valo-animate-in-fade 300ms backwards;\n}\n\n.mytheme .v-tabsheet-deco {\n\theight: 20px !important;\n\twidth: 20px !important;\n\tbox-sizing: border-box;\n\tborder: 2px solid rgba(25, 125, 225, 0.2);\n\tborder-top-color: #197de1;\n\tborder-right-color: #197de1;\n\tborder-radius: 100%;\n\t-webkit-animation: v-rotate-360 500ms infinite linear;\n\t-moz-animation: v-rotate-360 500ms infinite linear;\n\tanimation: v-rotate-360 500ms infinite linear;\n\tpointer-events: none;\n\tdisplay: none;\n\tposition: absolute;\n\tz-index: 1;\n\tbottom: 50%;\n\tmargin-bottom: -29px;\n\tleft: 50%;\n\tmargin-left: -10px;\n}\n\n.mytheme .v-tabsheet-loading .v-tabsheet-deco {\n\tdisplay: block;\n}\n\n.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer table, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tbody, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr {\n\twidth: 100%;\n}\n\n.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr {\n\tdisplay: table;\n\ttable-layout: fixed;\n}\n\n.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer td {\n\tdisplay: table-cell;\n}\n\n.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer .v-caption {\n\tmargin: 0;\n\tdisplay: block;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption {\n\tmargin-left: 4px;\n\tpadding: 0 12px;\n\tbackground-color: #fafafa;\n\tborder: 1px solid transparent;\n\tline-height: 36px;\n\tborder-radius: 4px 4px 0 0;\n\tfont-weight: 400;\n\t-webkit-transition: background-color 160ms;\n\t-moz-transition: background-color 160ms;\n\ttransition: background-color 160ms;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption:hover {\n\tbackground-color: #f2f2f2;\n\tborder-bottom-color: #dfdfdf;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption.v-disabled:hover {\n\tbackground-color: #fafafa;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption-closable {\n\tpadding-right: 30px;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-caption-close {\n\ttop: 4px;\n\tright: 4px;\n\tmargin-top: 0;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer td:first-child .v-caption, .mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer [aria-hidden=\"true\"] + td .v-caption {\n\tmargin-left: 0;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem .v-caption {\n\tborder-color: #dfdfdf;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption {\n\tbackground: white;\n\tborder-color: #dfdfdf;\n\tborder-bottom: none;\n\tpadding-bottom: 1px;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-content {\n\tborder: 1px solid #dfdfdf;\n\tborder-top: none;\n}\n\n.mytheme .v-tabsheet-framed > .v-tabsheet-content > div {\n\tbackground: white;\n}\n\n.mytheme .v-tabsheet-framed.padded-tabbar > .v-tabsheet-tabcontainer {\n\tborder: 1px solid #dfdfdf;\n\tborder-bottom: none;\n\tbackground: #fafafa;\n\tpadding-top: 6px;\n}\n\n.mytheme .v-tabsheet-framed.icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption {\n\tpadding-bottom: 7px;\n}\n\n.mytheme .v-tabsheet-centered-tabs > .v-tabsheet-tabcontainer {\n\ttext-align: center;\n}\n\n.mytheme .v-tabsheet-right-aligned-tabs > .v-tabsheet-tabcontainer {\n\ttext-align: right;\n}\n\n.mytheme .v-tabsheet-padded-tabbar > .v-tabsheet-tabcontainer .v-tabsheet-tabs {\n\tpadding: 0 9px;\n}\n\n.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption {\n\tpadding-top: 6px;\n\tpadding-bottom: 6px;\n\tline-height: 1.2;\n}\n\n.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon {\n\tdisplay: block;\n}\n\n.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon + .v-captiontext.v-captiontext {\n\tmargin-left: 0;\n}\n\n.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption-closable {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-caption-close {\n\ttop: 4px;\n\tmargin-top: 0;\n}\n\n.mytheme .v-tabsheet-compact-tabbar > .v-tabsheet-tabcontainer-compact-tabbar .v-caption {\n\tline-height: 1.8;\n}\n\n.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-caption-close {\n\tvisibility: hidden;\n}\n\n.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-tabsheet-caption-close {\n\tvisibility: visible;\n}\n\n.mytheme .v-colorpicker-popup.v-window {\n\tmin-width: 220px !important;\n}\n\n.mytheme .v-colorpicker-popup .v-tabsheet-tabs {\n\tpadding: 0 9px;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] {\n\tpadding: 12px;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] .v-widget {\n\twidth: 100% !important;\n\tvertical-align: middle;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] .v-has-caption {\n\twhite-space: nowrap;\n\tpadding-left: 48px;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] .v-caption {\n\tdisplay: inline-block;\n\tmargin-left: -48px;\n\twidth: 48px;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] .v-slot-hue-slider + .v-slot .v-has-caption {\n\tpadding-left: 80px;\n}\n\n.mytheme .v-colorpicker-popup [class$=\"sliders\"] .v-slot-hue-slider + .v-slot .v-caption {\n\tmargin-left: -80px;\n\twidth: 80px;\n}\n\n.mytheme .v-colorpicker-popup .v-slider-red .v-slider-base:after {\n\tbackground: red;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-colorpicker-popup .v-slider-green .v-slider-base:after {\n\tbackground: green;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-colorpicker-popup .v-slider-blue .v-slider-base:after {\n\tbackground: blue;\n\tborder: none;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-colorpicker-popup .v-margin-bottom {\n\tpadding-bottom: 0;\n}\n\n.mytheme .v-colorpicker-popup .resize-button {\n\twidth: 100% !important;\n\theight: auto !important;\n\ttext-align: center;\n\toutline: none;\n}\n\n.mytheme .v-colorpicker-popup .resize-button:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f141\";\n}\n\n.mytheme .v-colorpicker-popup .resize-button-caption {\n\tdisplay: none;\n}\n\n.mytheme .v-colorpicker-popup .v-horizontallayout {\n\theight: auto !important;\n\tpadding: 9px 0;\n\tbackground-color: #fafafa;\n\tborder-top: 1px solid #ededed;\n}\n\n.mytheme .v-colorpicker-popup .v-horizontallayout .v-expand {\n\toverflow: visible;\n}\n\n.mytheme .v-colorpicker-popup .v-horizontallayout .v-button {\n\twidth: 80% !important;\n}\n\n.mytheme .v-colorpicker-preview {\n\twidth: 100% !important;\n\theight: auto !important;\n\tpadding: 9px;\n\tdisplay: inline-flex;\n}\n\n.mytheme .v-colorpicker-preview-textfield {\n\theight: auto !important;\n\ttext-align: center;\n\tborder: none;\n}\n\n.mytheme .v-colorpicker {\n\twidth: auto;\n}\n\n.mytheme .v-colorpicker-button-color {\n\tposition: absolute;\n\ttop: 6px;\n\tright: 6px;\n\tbottom: 6px;\n\tleft: 6px;\n\tborder-radius: 3px;\n\tborder: 1px solid rgba(0, 0, 0, 0.5);\n\tmax-width: 23px;\n}\n\n.mytheme .v-colorpicker-button-color + .v-button-caption:not(:empty) {\n\tmargin-left: 19px;\n}\n\n.mytheme .v-panel {\n\tbackground: white;\n\tcolor: #474747;\n\tborder-radius: 4px;\n\tborder: 1px solid #d5d5d5;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\toverflow: visible !important;\n}\n\n.mytheme .v-panel-caption {\n\tbox-sizing: border-box;\n\tpadding: 0 12px;\n\tline-height: 36px;\n\tborder-bottom: 1px solid #d5d5d5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%);\n\tcolor: #464646;\n\tfont-weight: 400;\n\tfont-size: 14px;\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tborder-radius: 3px 3px 0 0;\n}\n\n.mytheme .v-panel-content {\n\tbox-sizing: border-box;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.mytheme .v-panel-content > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-panel-content > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-panel-content > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-panel-content > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-panel-borderless {\n\tbackground: transparent;\n\tcolor: inherit;\n\tborder: none;\n\tborder-radius: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-panel-borderless > div > [class*=\"-caption\"] {\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tcolor: inherit;\n\tpadding: 0;\n\tmargin: 0 12px;\n\tborder-bottom: none;\n}\n\n.mytheme .v-panel-well {\n\tbackground: #f5f5f5;\n\tcolor: #454545;\n\t-webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tborder-radius: 4px;\n\tborder: 1px solid #c5c5c5;\n}\n\n.mytheme .v-panel-well > div > [class*=\"-caption\"] {\n\tbackground: transparent;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-panel-scroll-divider > [class*=\"-captionwrap\"] {\n\tposition: relative;\n\tz-index: 2;\n}\n\n.mytheme .v-panel-scroll-divider > [class*=\"-captionwrap\"]:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tbottom: -1px;\n\tright: 0;\n\tleft: 0;\n\theight: 0;\n\tborder-top: 1px solid #dfdfdf;\n\tborder-color: rgba(197, 197, 197, 0.5);\n}\n\n.mytheme .v-panel-scroll-divider > [class*=\"-content\"]:before {\n\tcontent: \"\";\n\tposition: absolute;\n\tz-index: 2;\n\ttop: 0;\n\theight: 0;\n\tborder-top: 1px solid #fafafa;\n\tleft: 0;\n\tright: 0;\n}\n\n.mytheme .v-panel-caption.v-horizontallayout {\n\theight: auto !important;\n\tline-height: 0;\n}\n\n.mytheme .v-panel-caption.v-horizontallayout .v-slot {\n\tvertical-align: middle;\n}\n\n.mytheme .v-panel-caption.v-horizontallayout .v-label {\n\tline-height: 37px;\n}\n\n.mytheme .v-accordion {\n\tbackground: white;\n\tcolor: #474747;\n\tborder-radius: 4px;\n\tborder: 1px solid #d5d5d5;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #f4f4f4 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #f4f4f4 98%);\n\toverflow: hidden;\n}\n\n.mytheme .v-accordion-item {\n\tposition: relative;\n}\n\n.mytheme .v-accordion-item:first-child {\n\tborder-top-left-radius: 3px;\n\tborder-top-right-radius: 3px;\n}\n\n.mytheme .v-accordion-item:last-child {\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.mytheme .v-accordion-item:last-child [class*=\"item-content\"] {\n\tborder-radius: inherit;\n}\n\n.mytheme .v-accordion-item[class*=\"item-open\"]:last-child > div > .v-caption {\n\tborder-radius: 0;\n}\n\n.mytheme .v-accordion-item:not([class*=\"item-open\"]):last-child > div > .v-caption {\n\tborder-bottom: none;\n\tmargin-bottom: 0;\n}\n\n.mytheme .v-accordion-item[class*=\"item-open\"] + [class*=\"item\"] {\n\tborder-top: 1px solid #d9d9d9;\n}\n\n.mytheme .v-accordion-item-caption {\n\tborder-radius: inherit;\n}\n\n.mytheme .v-accordion-item-caption > .v-caption {\n\tbox-sizing: border-box;\n\tpadding: 0 12px;\n\tline-height: 36px;\n\tborder-bottom: 1px solid #d5d5d5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%);\n\tcolor: #464646;\n\tfont-weight: 400;\n\tfont-size: 14px;\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.05);\n\tdisplay: block;\n\tbackground: transparent;\n\tborder-bottom-color: #c9c9c9;\n\tborder-radius: inherit;\n\tcursor: pointer;\n\tposition: relative;\n}\n\n.mytheme .v-accordion-item-caption > .v-caption:hover:before, .mytheme .v-accordion-item-caption > .v-caption:active:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tborder-radius: inherit;\n}\n\n.mytheme .v-accordion-item-caption > .v-caption:hover:before {\n\tbackground-color: rgba(186, 186, 186, 0.1);\n\tborder: none;\n}\n\n.mytheme .v-accordion-item-caption > .v-caption:active:before {\n\tbackground-color: rgba(125, 125, 125, 0.2);\n}\n\n.mytheme .v-accordion-item-content {\n\t-webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbackground-color: white;\n\tbox-sizing: border-box;\n}\n\n.mytheme .v-accordion-item-content > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-accordion-item-content > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-accordion-item-content > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-accordion-item-content > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-accordion-borderless {\n\tborder: none;\n\tborder-radius: 0;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n}\n\n.mytheme .v-accordion-borderless > .v-accordion-item, .mytheme .v-accordion-borderless > .v-accordion-item > div > .v-caption, .mytheme .v-accordion-borderless > .v-accordion-item > .v-accordion-item-content {\n\tborder-radius: 0;\n}\n\n.mytheme .v-select-twincol {\n\twhite-space: normal;\n}\n\n.mytheme .v-select-twincol select {\n\tborder: 1px solid #c5c5c5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\tcolor: #464646;\n}\n\n.mytheme .v-select-twincol select:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-select-twincol .v-textfield, .mytheme .v-select-twincol .v-nativebutton {\n\twidth: auto !important;\n\tmargin-top: 9px;\n}\n\n.mytheme .v-select-twincol .v-nativebutton {\n\tmargin-left: 9px;\n}\n\n.mytheme .v-select-twincol-caption-left, .mytheme .v-select-twincol-caption-right {\n\tfont-size: 14px;\n\tfont-weight: 400;\n\tpadding-bottom: 0.3em;\n\tpadding-left: 1px;\n}\n\n.mytheme .v-select-twincol-buttons {\n\twhite-space: nowrap;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tposition: relative;\n\tmin-width: 3.5em;\n}\n\n.mytheme .v-select-twincol-buttons .v-button {\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: left;\n\twhite-space: normal;\n\tposition: absolute;\n\tleft: 9px;\n\tright: 9px;\n\ttop: 36px;\n\tpadding: 0;\n\ttext-align: center;\n}\n\n.mytheme .v-select-twincol-buttons .v-button:first-child {\n\ttop: 0;\n}\n\n.mytheme .v-select-twincol-buttons .v-button-caption {\n\tdisplay: none;\n}\n\n.mytheme .v-select-twincol-buttons .v-button:focus {\n\tz-index: 1;\n}\n\n.mytheme .v-select-twincol-buttons .v-button:first-child {\n\tborder-radius: 4px 4px 0 0;\n}\n\n.mytheme .v-select-twincol-buttons .v-button:last-child {\n\tborder-radius: 0 0 4px 4px;\n}\n\n.mytheme .v-select-twincol-buttons .v-button-wrap:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f053\";\n}\n\n.mytheme .v-select-twincol-buttons .v-button:first-child .v-button-wrap:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f054\";\n}\n\n.mytheme .v-select-twincol-error .v-select-twincol-options, .mytheme .v-select-twincol-error .v-select-twincol-selections {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-select-twincol-error-info .v-select-twincol-options, .mytheme .v-select-twincol-error-info .v-select-twincol-selections {\n\tborder-color: #00a7f5 !important;\n\tbackground: #fafdff;\n\tcolor: #195774;\n}\n\n.mytheme .v-select-twincol-error-warning .v-select-twincol-options, .mytheme .v-select-twincol-error-warning .v-select-twincol-selections {\n\tborder-color: #fc9c00 !important;\n\tbackground: #fffdfa;\n\tcolor: #745119;\n}\n\n.mytheme .v-select-twincol-error-error .v-select-twincol-options, .mytheme .v-select-twincol-error-error .v-select-twincol-selections {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-select-twincol-error-critical .v-select-twincol-options, .mytheme .v-select-twincol-error-critical .v-select-twincol-selections {\n\tborder-color: #fa007d !important;\n\tbackground: #fffafc;\n\tcolor: #741947;\n}\n\n.mytheme .v-select-twincol-error-system .v-select-twincol-options, .mytheme .v-select-twincol-error-system .v-select-twincol-selections {\n\tborder-color: #bb00ff !important;\n\tbackground: #fefaff;\n\tcolor: #5c1974;\n}\n\n.mytheme .v-select select {\n\tborder: 1px solid #c5c5c5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\tcolor: #464646;\n}\n\n.mytheme .v-select select:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-select-select {\n\tdisplay: block;\n}\n\n.mytheme .v-select-select + .v-textfield {\n\twidth: auto !important;\n\tmargin-top: 9px;\n}\n\n.mytheme .v-select-select + .v-textfield + .v-nativebutton {\n\tmargin-top: 9px;\n\tmargin-left: 9px;\n}\n\n.mytheme .v-select-error .v-select-select {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-calendar-header-day {\n\tfont-weight: 400;\n\ttext-align: center;\n\tpadding: 7px 0;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-back, .mytheme .v-calendar-header-week .v-calendar-next {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\tbackground: transparent;\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n\tcursor: pointer;\n\toutline: none;\n\tcolor: inherit;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-back:focus, .mytheme .v-calendar-header-week .v-calendar-next:focus {\n\toutline: none;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-back:hover, .mytheme .v-calendar-header-week .v-calendar-next:hover {\n\topacity: 1;\n\tfilter: none ;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-back:active, .mytheme .v-calendar-header-week .v-calendar-next:active {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-back:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f053\";\n}\n\n.mytheme .v-calendar-header-week .v-calendar-next:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f054\";\n}\n\n.mytheme .v-calendar-month {\n\toutline: none;\n\toverflow: hidden;\n}\n\n.mytheme .v-calendar-month td {\n\tvertical-align: top;\n}\n\n.mytheme .v-calendar-week-number {\n\tcursor: pointer;\n\twidth: 20px;\n\ttext-align: center;\n\tfont-size: 0.8em;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-calendar-week-number:hover {\n\topacity: 1;\n\tfilter: none ;\n}\n\n.mytheme .v-calendar-month-day {\n\toutline: none;\n\tbox-sizing: border-box;\n\tline-height: 1.2;\n}\n\n.mytheme .v-calendar-bottom-spacer, .mytheme .v-calendar-spacer, .mytheme .v-calendar-bottom-spacer-empty {\n\theight: 19px;\n\tmargin-bottom: 3px;\n}\n\n.mytheme .v-calendar-bottom-spacer {\n\tfont-size: 0.8em;\n\tpadding: 0 5px;\n\tcursor: pointer;\n}\n\n.mytheme .v-calendar-bottom-spacer:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-calendar-day-number {\n\tline-height: 25px;\n\tfont-size: 16px;\n\ttext-align: right;\n\tmargin: 0 5px;\n\twhite-space: nowrap;\n\tborder-top: 1px solid #f2f2f2;\n\tcursor: pointer;\n}\n\n.mytheme .v-calendar-day-number:hover {\n\tcolor: #197de1;\n}\n\n.mytheme .v-calendar-month-day-today {\n\tbackground: #eef3f8;\n}\n\n.mytheme .v-calendar-month-day-today .v-calendar-day-number {\n\tfont-weight: 400;\n\tcolor: #197de1;\n\tborder-top: 2px solid #197de1;\n\tline-height: 24px;\n\tmargin: 0;\n\tpadding: 0 5px;\n}\n\n.mytheme .v-calendar-month-day-selected {\n\tbackground-color: #e3edf7;\n}\n\n.mytheme .v-calendar-month-day-dragemphasis {\n\tbackground-color: #a8a8a8;\n}\n\n.mytheme .v-calendar-month-day-scrollable {\n\toverflow-y: scroll;\n}\n\n.mytheme .v-calendar-weekly-longevents {\n\tmargin-left: 50px;\n\tborder-bottom: 3px solid #e0e0e0;\n}\n\n.mytheme .v-calendar-weekly-longevents .v-calendar-event-all-day {\n\theight: 22px;\n\tline-height: 1.6;\n\tmargin-bottom: 3px;\n}\n\n.mytheme .v-calendar-header-week td {\n\tvertical-align: middle !important;\n}\n\n.mytheme .v-calendar-header-week .v-calendar-header-day {\n\tcursor: pointer;\n}\n\n.mytheme .v-calendar-times {\n\twidth: 50px;\n\tfont-size: 0.77em;\n\tline-height: 1;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-calendar-time {\n\ttext-align: right;\n\tpadding-right: 9px;\n\tmargin-top: -6px;\n\tpadding-bottom: 6px;\n}\n\n.mytheme .v-calendar-day-times, .mytheme .v-calendar-day-times-today {\n\toutline: none;\n\tborder-right: 1px solid transparent;\n}\n\n.mytheme .v-calendar-day-times:focus, .mytheme .v-calendar-day-times-today:focus {\n\toutline: none;\n}\n\n.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even {\n\tborder-top: 1px solid #dfdfdf;\n}\n\n.mytheme .v-calendar .v-datecellslot:first-child, .mytheme .v-calendar .v-datecellslot-even:first-child {\n\tborder-top-color: transparent;\n}\n\n.mytheme .v-calendar .v-datecellslot {\n\tborder-top-style: dotted;\n}\n\n.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even {\n\tmargin-right: 5px;\n}\n\n.mytheme .v-calendar-current-time {\n\tbackground: #197de1;\n\tline-height: 1px;\n\tpointer-events: none;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-calendar-current-time:before {\n\tcontent: \"\\2022\";\n\tcolor: #197de1;\n\tfont-size: 22px;\n\tmargin-left: -0.07em;\n}\n\n.mytheme .v-calendar .v-daterange {\n\tposition: relative;\n}\n\n.mytheme .v-calendar .v-daterange:before {\n\tcontent: \"\";\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tbottom: -1px;\n\tleft: 0;\n\tbackground: #197de1;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\tborder-radius: 4px 4px 0 0;\n}\n\n.mytheme .v-calendar .v-daterange + .v-daterange {\n\tborder-color: transparent;\n}\n\n.mytheme .v-calendar .v-daterange + .v-daterange:before {\n\tborder-radius: 0;\n}\n\n.mytheme .v-calendar-event {\n\tfont-size: 0.85em;\n\toverflow: hidden;\n\tcursor: pointer;\n\toutline: none;\n\tborder-radius: 4px;\n}\n\n.mytheme .v-calendar-event:focus {\n\toutline: none;\n}\n\n.mytheme .v-calendar-event-month {\n\tpadding: 0 5px;\n\tbox-sizing: border-box;\n\tmargin-bottom: 3px;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\theight: 19px;\n\tline-height: 19px;\n}\n\n.mytheme .v-calendar-event-month .v-calendar-event-time {\n\tfloat: right;\n\tfont-size: 0.9em;\n\tline-height: 19px;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-calendar-event-month:before {\n\tcontent: \"\\25cf\";\n\tmargin-right: 0.2em;\n}\n\n.mytheme .v-calendar-event-all-day {\n\tpadding: 0 5px;\n\tbox-sizing: border-box;\n\theight: 19px;\n\tline-height: 19px;\n\tborder-radius: 0;\n\tmargin-left: -1px;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-calendar-event-all-day:before {\n\tcontent: \"\";\n}\n\n.mytheme .v-calendar-event-start {\n\toverflow: visible;\n\tmargin-left: 0;\n}\n\n.mytheme .v-calendar-event-start.v-calendar-event-continued-to, .mytheme .v-calendar-event-start.v-calendar-event-end {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.mytheme .v-calendar-event-start {\n\tborder-top-left-radius: 4px;\n\tborder-bottom-left-radius: 4px;\n\tmargin-left: 5px;\n}\n\n.mytheme .v-calendar-event-end {\n\tborder-top-right-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\tmargin-right: 5px;\n}\n\n.mytheme .v-calendar-event-caption {\n\tfont-weight: 500;\n\tline-height: 1.2;\n\tpadding: 5px 0;\n\tposition: absolute;\n\toverflow: hidden;\n\tright: 9px;\n\tleft: 5px;\n\tbottom: 0;\n\ttop: 0;\n}\n\n.mytheme .v-calendar-event-caption span {\n\tfont-weight: 300;\n\twhite-space: nowrap;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event {\n\toverflow: visible;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event-content {\n\tmargin-top: -1px;\n\tborder-radius: 5px;\n\tborder: 1px solid #fafafa;\n\tpadding-top: 3px;\n\tmargin-right: 5px;\n}\n\n.mytheme .v-calendar-event-month:before {\n\tcolor: #00ace0;\n}\n\n.mytheme .v-calendar-event-all-day {\n\tbackground-color: #c8eaf4;\n\tbackground-color: rgba(200, 234, 244, 0.8);\n\tcolor: #00ace0;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event {\n\tcolor: #00ace0;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event .v-calendar-event-content {\n\tbackground-color: #c8eaf4;\n\tbackground-color: rgba(200, 234, 244, 0.8);\n}\n\n.mytheme .v-calendar-event-month[class*=\"color2\"]:before {\n\tcolor: #2d9f19;\n}\n\n.mytheme .v-calendar-event-all-day[class*=\"color2\"] {\n\tbackground-color: #d1e7cd;\n\tbackground-color: rgba(209, 231, 205, 0.8);\n\tcolor: #2d9f19;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color2\"] {\n\tcolor: #2d9f19;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color2\"] .v-calendar-event-content {\n\tbackground-color: #d1e7cd;\n\tbackground-color: rgba(209, 231, 205, 0.8);\n}\n\n.mytheme .v-calendar-event-month[class*=\"color3\"]:before {\n\tcolor: #d18100;\n}\n\n.mytheme .v-calendar-event-all-day[class*=\"color3\"] {\n\tbackground-color: #f1e1c8;\n\tbackground-color: rgba(241, 225, 200, 0.8);\n\tcolor: #d18100;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color3\"] {\n\tcolor: #d18100;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color3\"] .v-calendar-event-content {\n\tbackground-color: #f1e1c8;\n\tbackground-color: rgba(241, 225, 200, 0.8);\n}\n\n.mytheme .v-calendar-event-month[class*=\"color4\"]:before {\n\tcolor: #ce3812;\n}\n\n.mytheme .v-calendar-event-all-day[class*=\"color4\"] {\n\tbackground-color: #f1d3cb;\n\tbackground-color: rgba(241, 211, 203, 0.8);\n\tcolor: #ce3812;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color4\"] {\n\tcolor: #ce3812;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color4\"] .v-calendar-event-content {\n\tbackground-color: #f1d3cb;\n\tbackground-color: rgba(241, 211, 203, 0.8);\n}\n\n.mytheme .v-calendar-event-month[class*=\"color5\"]:before {\n\tcolor: #2d55cd;\n}\n\n.mytheme .v-calendar-event-all-day[class*=\"color5\"] {\n\tbackground-color: #d1d9f1;\n\tbackground-color: rgba(209, 217, 241, 0.8);\n\tcolor: #2d55cd;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color5\"] {\n\tcolor: #2d55cd;\n}\n\n.mytheme .v-calendar-week-wrapper .v-calendar-event[class*=\"color5\"] .v-calendar-event-content {\n\tbackground-color: #d1d9f1;\n\tbackground-color: rgba(209, 217, 241, 0.8);\n}\n\n.mytheme .v-calendar.v-disabled * {\n\tcursor: default;\n}\n\n.mytheme .v-label {\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n}\n\n.mytheme .v-label.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-label-undef-w {\n\twhite-space: nowrap;\n}\n\n.mytheme h1, .mytheme .v-label-h1, .mytheme h2, .mytheme .v-label-h2, .mytheme h3, .mytheme .v-label-h3 {\n\tline-height: 1.1;\n\tfont-weight: 200;\n\tcolor: #141414;\n}\n\n.mytheme h1, .mytheme .v-label-h1 {\n\tfont-size: 2.4em;\n\tmargin-top: 1.4em;\n\tmargin-bottom: 1em;\n\t\n\tletter-spacing: -0.03em;\n}\n\n.mytheme h2, .mytheme .v-label-h2 {\n\tfont-size: 1.6em;\n\t\n\tmargin-top: 1.6em;\n\tmargin-bottom: 0.77em;\n\tletter-spacing: -0.02em;\n}\n\n.mytheme h3, .mytheme .v-label-h3 {\n\tfont-size: 1.2em;\n\t\n\tmargin-top: 1.8em;\n\tmargin-bottom: 0.77em;\n\tletter-spacing: 0;\n}\n\n.mytheme h4, .mytheme .v-label-h4 {\n\tline-height: 1.1;\n\tfont-weight: 500;\n\tfont-size: 14px;\n\tcolor: #414141;\n\ttext-transform: uppercase;\n\tletter-spacing: 0;\n\tmargin-top: 2.4em;\n\tmargin-bottom: 0.8em;\n}\n\n.mytheme .v-csslayout > h1:first-child, .mytheme .v-csslayout > h2:first-child, .mytheme .v-csslayout > h3:first-child, .mytheme .v-csslayout > h4 > .v-label-h1:first-child, .mytheme .v-csslayout > .v-label-h2:first-child, .mytheme .v-csslayout > .v-label-h3:first-child, .mytheme .v-csslayout > .v-label-h4:first-child {\n\tmargin-top: 16px;\n}\n\n.mytheme .v-verticallayout > .v-slot:first-child h1, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child h2, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child h3, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child h4, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h4 {\n\tmargin-top: 16px;\n}\n\n.mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h4 {\n\tmargin-top: -0.5em;\n}\n\n.mytheme h1.no-margin, .mytheme .v-label-h1.no-margin, .mytheme h2.no-margin, .mytheme .v-label-h2.no-margin, .mytheme h3.no-margin, .mytheme .v-label-h3.no-margin, .mytheme h4.no-margin, .mytheme .v-label-h4.no-margin {\n\tmargin: 0 !important;\n}\n\n.mytheme .v-label-colored {\n\tcolor: #197de1;\n}\n\n.mytheme .v-label-large {\n\tfont-size: 20px;\n}\n\n.mytheme .v-label-small {\n\tfont-size: 14px;\n}\n\n.mytheme .v-label-tiny {\n\tfont-size: 12px;\n}\n\n.mytheme .v-label-huge {\n\tfont-size: 26px;\n}\n\n.mytheme .v-label-bold {\n\tfont-weight: 500;\n}\n\n.mytheme .v-label-light {\n\tfont-weight: 200;\n\tcolor: #7d7d7d;\n}\n\n.mytheme .v-label-align-right {\n\ttext-align: right;\n}\n\n.mytheme .v-label-align-center {\n\ttext-align: center;\n}\n\n.mytheme .v-label-spinner {\n\theight: 24px !important;\n\twidth: 24px !important;\n\tbox-sizing: border-box;\n\tborder: 2px solid rgba(25, 125, 225, 0.2);\n\tborder-top-color: #197de1;\n\tborder-right-color: #197de1;\n\tborder-radius: 100%;\n\t-webkit-animation: v-rotate-360 500ms infinite linear;\n\t-moz-animation: v-rotate-360 500ms infinite linear;\n\tanimation: v-rotate-360 500ms infinite linear;\n\tpointer-events: none;\n}\n\n.mytheme .v-label-success, .mytheme .v-label-failure {\n\tbackground: white;\n\tcolor: #474747;\n\tborder: 2px solid #2c9720;\n\tborder-radius: 4px;\n\tpadding: 7px 19px 7px 37px;\n\tfont-weight: 400;\n\tfont-size: 15px;\n}\n\n.mytheme .v-label-success:before, .mytheme .v-label-failure:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f00c\";\n\tmargin-right: 0.5em;\n\tmargin-left: -19px;\n\tcolor: #2c9720;\n}\n\n.mytheme .v-label-failure {\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-label-failure:before {\n\tcontent: \"\\f05e\";\n\tcolor: #ed473b;\n}\n\n.mytheme [draggable=true] {\n\t-khtml-user-drag: element;\n\t-webkit-user-drag: element;\n}\n\n.mytheme .v-ddwrapper {\n\tposition: relative;\n}\n\n.mytheme .v-ddwrapper-over:before, .mytheme .v-ddwrapper-over:after {\n\tcontent: \"\";\n\tposition: absolute;\n\tz-index: 10;\n\ttop: -1px;\n\tright: -1px;\n\tbottom: -1px;\n\tleft: -1px;\n\tborder: 0 solid #197de1;\n}\n\n.mytheme .v-ddwrapper-over-top:before {\n\tborder-top-width: 2px;\n}\n\n.mytheme .v-ddwrapper-over-right:before {\n\tborder-right-width: 2px;\n}\n\n.mytheme .v-ddwrapper-over-bottom:before {\n\tborder-bottom-width: 2px;\n}\n\n.mytheme .v-ddwrapper-over-left:before {\n\tborder-left-width: 2px;\n}\n\n.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:before {\n\tborder-top-width: 0;\n}\n\n.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:after {\n\tborder-width: 2px;\n\tborder-radius: 4px;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\tbackground: #8abef2;\n}\n\n.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:before {\n\tborder-bottom-width: 0;\n}\n\n.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:after {\n\tborder-width: 2px;\n\tborder-radius: 4px;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\tbackground: #8abef2;\n}\n\n.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:before {\n\tborder-left-width: 0;\n}\n\n.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:after {\n\tborder-width: 2px;\n\tborder-radius: 4px;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\tbackground: #8abef2;\n}\n\n.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:before {\n\tborder-right-width: 0;\n}\n\n.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:after {\n\tborder-width: 2px;\n\tborder-radius: 4px;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\tbackground: #8abef2;\n}\n\n.mytheme .v-ddwrapper-over-middle:after, .mytheme .v-ddwrapper-over-center:after {\n\tborder-width: 2px;\n\tborder-radius: 4px;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\tbackground: #8abef2;\n}\n\n.mytheme .no-box-drag-hints.v-ddwrapper:after, .mytheme .no-box-drag-hints .v-ddwrapper:after {\n\tdisplay: none !important;\n\tcontent: none;\n}\n\n.mytheme button {\n\tfont: inherit;\n\tfont-weight: 400;\n\tline-height: 1.55;\n}\n\n.mytheme .v-nativebutton {\n\t-webkit-touch-callout: none;\n}\n\n.mytheme .v-select select {\n\tborder: 1px solid #c5c5c5;\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\tcolor: #464646;\n}\n\n.mytheme .v-select select:focus {\n\toutline: none;\n\t-webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n\tbox-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5);\n}\n\n.mytheme .v-select-select {\n\tdisplay: block;\n}\n\n.mytheme .v-select-select + .v-textfield {\n\twidth: auto !important;\n\tmargin-top: 9px;\n}\n\n.mytheme .v-select-select + .v-textfield + .v-nativebutton {\n\tmargin-top: 9px;\n\tmargin-left: 9px;\n}\n\n.mytheme .v-select-error .v-select-select {\n\tborder-color: #ed473b !important;\n\tbackground: #fffbfb;\n\tcolor: #6c2621;\n}\n\n.mytheme .v-popupview {\n\tcursor: pointer;\n\tcolor: #197de1;\n\ttext-decoration: underline;\n\tfont-weight: inherit;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-popupview:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-popupview.v-disabled {\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n}\n\n.mytheme .v-popupview-popup {\n\tpadding: 4px 4px;\n\tborder-radius: 4px;\n\tbackground-color: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\tbox-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098);\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n}\n\n.mytheme .v-popupview-popup[class*=\"animate-in\"] {\n\t-webkit-animation: v-popupview-animate-in 120ms;\n\t-moz-animation: v-popupview-animate-in 120ms;\n\tanimation: v-popupview-animate-in 120ms;\n}\n\n.mytheme .v-popupview-popup[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-fade 120ms;\n\t-moz-animation: valo-animate-out-fade 120ms;\n\tanimation: valo-animate-out-fade 120ms;\n}\n\n.mytheme .v-popupview-popup .popupContent > .v-margin-top {\n\tpadding-top: 12px;\n}\n\n.mytheme .v-popupview-popup .popupContent > .v-margin-right {\n\tpadding-right: 12px;\n}\n\n.mytheme .v-popupview-popup .popupContent > .v-margin-bottom {\n\tpadding-bottom: 12px;\n}\n\n.mytheme .v-popupview-popup .popupContent > .v-margin-left {\n\tpadding-left: 12px;\n}\n\n.mytheme .v-popupview-loading {\n\tmargin: 12px 12px;\n\theight: 24px !important;\n\twidth: 24px !important;\n\tbox-sizing: border-box;\n\tborder: 2px solid rgba(25, 125, 225, 0.2);\n\tborder-top-color: #197de1;\n\tborder-right-color: #197de1;\n\tborder-radius: 100%;\n\t-webkit-animation: v-rotate-360 500ms infinite linear;\n\t-moz-animation: v-rotate-360 500ms infinite linear;\n\tanimation: v-rotate-360 500ms infinite linear;\n\tpointer-events: none;\n}\n\n.mytheme .v-richtextarea {\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t-ms-appearance: none;\n\t-o-appearance: none;\n\tappearance: none;\n\t-webkit-user-select: text;\n\t-moz-user-select: text;\n\t-ms-user-select: text;\n\tuser-select: text;\n\tmargin: 0;\n\tfont: inherit;\n\t\n\tfont-weight: 400;\n\tline-height: normal;\n\theight: 37px;\n\tborder-radius: 4px;\n\tpadding: 0;\n\tborder: 1px solid #c5c5c5;\n\tbackground: white;\n\tcolor: #474747;\n\t-webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\tbox-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1);\n\t-webkit-transition: box-shadow 180ms, border 180ms;\n\t-moz-transition: box-shadow 180ms, border 180ms;\n\ttransition: box-shadow 180ms, border 180ms;\n\theight: auto;\n\toverflow: hidden;\n}\n\n.mytheme .v-richtextarea[class*=\"prompt\"] {\n\tcolor: #a3a3a3;\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar {\n\tbackground-color: #fafafa;\n\tbackground-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%);\n\tbackground-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%);\n\t-webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\tbox-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7;\n\tborder-bottom: 1px solid #c5c5c5;\n\tcolor: #464646;\n}\n\n.mytheme .v-richtextarea .gwt-ToggleButton, .mytheme .v-richtextarea .gwt-PushButton {\n\tdisplay: inline-block;\n\tline-height: 37px;\n\twidth: 37px;\n\ttext-align: center;\n\toutline: none;\n}\n\n.mytheme .v-richtextarea .gwt-ToggleButton:hover, .mytheme .v-richtextarea .gwt-PushButton:hover {\n\tcolor: black;\n}\n\n.mytheme .v-richtextarea .gwt-ToggleButton-down, .mytheme .v-richtextarea .gwt-ToggleButton-down-hovering {\n\tbackground-color: #e0e0e0;\n\tbackground-image: -webkit-linear-gradient(bottom, #e0e0e0 2%, #dcdcdc 98%);\n\tbackground-image: linear-gradient(to top,#e0e0e0 2%, #dcdcdc 98%);\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top img {\n\tdisplay: none;\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div:before {\n\tfont-family: ThemeIcons;\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Bold\"]:before {\n\tcontent: \"\\f032\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Italic\"]:before {\n\tcontent: \"\\f033\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Underline\"]:before {\n\tcontent: \"\\f0cd\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Subscript\"]:before {\n\tcontent: \"\\f12c\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Superscript\"]:before {\n\tcontent: \"\\f12b\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Left Justify\"]:before {\n\tcontent: \"\\f036\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Center\"]:before {\n\tcontent: \"\\f037\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Right Justify\"]:before {\n\tcontent: \"\\f038\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Toggle Strikethrough\"]:before {\n\tcontent: \"\\f0cc\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Indent Right\"]:before {\n\tcontent: \"\\f03c\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Indent Left\"]:before {\n\tcontent: \"\\f03b\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Insert Horizontal Rule\"]:before {\n\tcontent: \"\\2014\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Insert Ordered List\"]:before {\n\tcontent: \"\\f0cb\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Insert Unordered List\"]:before {\n\tcontent: \"\\f0ca\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Insert Image\"]:before {\n\tcontent: \"\\f03e\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Create Link\"]:before {\n\tcontent: \"\\f0c1\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Remove Link\"]:before {\n\tcontent: \"\\f127\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title=\"Remove Formatting\"]:before {\n\tcontent: \"\\f12d\";\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom {\n\tfont-size: 13px;\n\tpadding: 0 9px 9px 0;\n}\n\n.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom select {\n\tmargin: 9px 0 0 9px;\n}\n\n.mytheme .v-richtextarea .gwt-RichTextArea {\n\tbackground: #fff;\n\tborder: none;\n\tdisplay: block;\n}\n\n.mytheme .v-richtextarea-readonly {\n\tpadding: 5px 7px;\n\tbackground: transparent;\n}\n\n.mytheme .v-upload .v-button {\n\tbox-sizing: border-box;\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: left;\n\twhite-space: normal;\n}\n\n.mytheme .v-upload-immediate .v-button {\n\twidth: 100%;\n}\n\n.mytheme .v-upload-immediate input[type=\"file\"] {\n\topacity: 0;\n\tfilter: alpha(opacity=0) ;\n\tz-index: -1;\n\tposition: absolute;\n\tright: 0;\n\theight: 37px;\n\ttext-align: right;\n\tborder: none;\n\tbackground: transparent;\n}\n\n.mytheme .v-Notification.v-position-top {\n\ttop: 12px;\n}\n\n.mytheme .v-Notification.v-position-right {\n\tright: 12px;\n}\n\n.mytheme .v-Notification.v-position-bottom {\n\tbottom: 12px;\n}\n\n.mytheme .v-Notification.v-position-left {\n\tleft: 12px;\n}\n\n.mytheme .v-Notification.v-position-assistive {\n\ttop: -9999px;\n\tleft: -9999px;\n}\n\n.mytheme .v-Notification-animate-in {\n\t-webkit-animation: valo-animate-in-fade 180ms 10ms backwards;\n\t-moz-animation: valo-animate-in-fade 180ms 10ms backwards;\n\tanimation: valo-animate-in-fade 180ms 10ms backwards;\n}\n\n.mytheme .v-Notification-animate-in.v-position-top {\n\t-webkit-animation: valo-animate-in-slide-down 400ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-down 400ms 10ms backwards;\n\tanimation: valo-animate-in-slide-down 400ms 10ms backwards;\n}\n\n.mytheme .v-Notification-animate-in.v-position-bottom {\n\t-webkit-animation: valo-animate-in-slide-up 400ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-up 400ms 10ms backwards;\n\tanimation: valo-animate-in-slide-up 400ms 10ms backwards;\n}\n\n.mytheme .v-Notification-animate-out {\n\t-webkit-animation: valo-animate-out-fade 150ms;\n\t-moz-animation: valo-animate-out-fade 150ms;\n\tanimation: valo-animate-out-fade 150ms;\n}\n\n.mytheme .v-Notification-animate-out.v-position-top, .mytheme .v-Notification-animate-out.v-position-bottom {\n\t-webkit-animation: valo-animate-out-slide-down-fade 200ms;\n\t-moz-animation: valo-animate-out-slide-down-fade 200ms;\n\tanimation: valo-animate-out-slide-down-fade 200ms;\n}\n\n.mytheme .v-Notification {\n\tborder-radius: 4px;\n\ttext-align: center;\n\tposition: fixed !important;\n\t-webkit-backface-visibility: hidden;\n\t-moz-backface-visibility: hidden;\n\t-ms-backface-visibility: hidden;\n\tbackface-visibility: hidden;\n\tbackground: white;\n\t-webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15);\n\tbox-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15);\n\tpadding: 19px 22px;\n}\n\n.mytheme .v-Notification .v-Notification-caption {\n\tcolor: #197de1;\n\tfont-size: 19px;\n\tline-height: 1;\n}\n\n.mytheme .v-Notification .v-Notification-description {\n\tline-height: 1.4;\n}\n\n.mytheme .v-Notification-caption {\n\tmargin: 0;\n\tdisplay: inline-block;\n\ttext-align: left;\n\tfont-weight: inherit;\n\tline-height: inherit;\n\twhite-space: nowrap;\n\tletter-spacing: 0;\n}\n\n.mytheme .v-Notification-description, .mytheme .v-Notification-details {\n\tmargin: 0;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tmax-width: 30em;\n\ttext-align: left;\n\tmax-height: 20em;\n\toverflow: auto;\n}\n\n.mytheme .v-Notification-caption ~ .v-Notification-description, .mytheme .v-Notification-caption ~ .v-Notification-details {\n\tmargin-left: 24px;\n}\n\n.mytheme .v-icon + .v-Notification-caption {\n\tmargin-left: 16px;\n}\n\n.mytheme .v-Notification-system {\n\tleft: 0 !important;\n\tright: 0;\n\tmax-width: 100%;\n\tmargin: 0 !important;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tbox-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tpadding: 12px 15px;\n\tbackground-color: #444;\n\tbackground-color: rgba(68, 68, 68, 0.9);\n\tfont-weight: 400;\n\tline-height: 22px;\n}\n\n.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details {\n\tmax-width: 50em;\n}\n\n.mytheme .v-Notification-system.v-position-top {\n\ttop: 0;\n}\n\n.mytheme .v-Notification-system.v-position-top[class*=\"animate-in\"] {\n\t-webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-down 300ms 10ms backwards;\n\tanimation: valo-animate-in-slide-down 300ms 10ms backwards;\n}\n\n.mytheme .v-Notification-system.v-position-top[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-slide-up 200ms;\n\t-moz-animation: valo-animate-out-slide-up 200ms;\n\tanimation: valo-animate-out-slide-up 200ms;\n}\n\n.mytheme .v-Notification-system.v-position-bottom {\n\tbottom: 0;\n}\n\n.mytheme .v-Notification-system.v-position-bottom[class*=\"animate-in\"] {\n\t-webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-up 300ms 10ms backwards;\n\tanimation: valo-animate-in-slide-up 300ms 10ms backwards;\n}\n\n.mytheme .v-Notification-system.v-position-bottom[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-slide-down 200ms;\n\t-moz-animation: valo-animate-out-slide-down 200ms;\n\tanimation: valo-animate-out-slide-down 200ms;\n}\n\n.mytheme .v-Notification-system .v-Notification-caption {\n\tcolor: #fff;\n\tvertical-align: middle;\n}\n\n.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details {\n\tcolor: #e6e6e6;\n}\n\n.mytheme .v-Notification-system u {\n\ttext-decoration: none;\n}\n\n.mytheme .v-Notification.tray {\n\ttext-align: left;\n}\n\n.mytheme .v-Notification.tray .v-Notification-caption + .v-Notification-description {\n\tdisplay: block;\n\tmargin: 0.5em 0 0;\n}\n\n.mytheme .v-Notification.warning {\n\tbackground: #FFF3D2;\n}\n\n.mytheme .v-Notification.warning .v-Notification-caption {\n\tcolor: #AC7C00;\n}\n\n.mytheme .v-Notification.warning .v-Notification-description {\n\tcolor: #9D874D;\n}\n\n.mytheme .v-Notification.error {\n\tbackground: #ed473b;\n\tfont-weight: 400;\n\t-webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25);\n\tbox-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25);\n\tpadding-right: 59px;\n\toverflow: hidden !important;\n\tcursor: pointer;\n}\n\n.mytheme .v-Notification.error .v-Notification-caption {\n\tcolor: white;\n}\n\n.mytheme .v-Notification.error .v-Notification-description {\n\tcolor: #f4e0df;\n}\n\n.mytheme .v-Notification.error:after {\n\tcontent: \"\\00d7\";\n\tfont-size: 1.5em;\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -12px;\n\tright: 12px;\n\twidth: 25px;\n\theight: 25px;\n\tline-height: 24px;\n\tcursor: pointer;\n\tcolor: #000;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\ttext-align: center;\n\tborder: 1px solid #000;\n\tborder-color: rgba(0, 0, 0, 0.3);\n\tborder-radius: 50%;\n\t-webkit-transition: opacity 200ms;\n\t-moz-transition: opacity 200ms;\n\ttransition: opacity 200ms;\n}\n\n.mytheme .v-Notification.error:hover:after {\n\topacity: 1;\n\tfilter: none ;\n}\n\n.mytheme .v-Notification.error:active:after {\n\tbackground-color: #000;\n\tcolor: #fff;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\t-webkit-transition: none 200ms;\n\t-moz-transition: none 200ms;\n\ttransition: none 200ms;\n}\n\n.mytheme .v-Notification.error:after {\n\tcolor: #fff;\n\tborder-color: #fff;\n\tborder-color: rgba(255, 255, 255, 0.3);\n}\n\n.mytheme .v-Notification.error:active:after {\n\tbackground-color: #fff;\n\tcolor: #000;\n}\n\n.mytheme .v-Notification.dark {\n\tbackground-color: #444;\n\tbackground-color: rgba(68, 68, 68, 0.9);\n\tfont-weight: 400;\n\tline-height: 22px;\n}\n\n.mytheme .v-Notification.dark .v-Notification-caption {\n\tcolor: #fff;\n\tvertical-align: middle;\n}\n\n.mytheme .v-Notification.dark .v-Notification-description, .mytheme .v-Notification.dark .v-Notification-details {\n\tcolor: #e6e6e6;\n}\n\n.mytheme .v-Notification.bar {\n\tleft: 0 !important;\n\tright: 0;\n\tmax-width: 100%;\n\tmargin: 0 !important;\n\tborder-radius: 0;\n\t-webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tbox-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25);\n\tpadding: 12px 15px;\n}\n\n.mytheme .v-Notification.bar .v-Notification-description, .mytheme .v-Notification.bar .v-Notification-details {\n\tmax-width: 50em;\n}\n\n.mytheme .v-Notification.bar.v-position-top {\n\ttop: 0;\n}\n\n.mytheme .v-Notification.bar.v-position-top[class*=\"animate-in\"] {\n\t-webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-down 300ms 10ms backwards;\n\tanimation: valo-animate-in-slide-down 300ms 10ms backwards;\n}\n\n.mytheme .v-Notification.bar.v-position-top[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-slide-up 200ms;\n\t-moz-animation: valo-animate-out-slide-up 200ms;\n\tanimation: valo-animate-out-slide-up 200ms;\n}\n\n.mytheme .v-Notification.bar.v-position-bottom {\n\tbottom: 0;\n}\n\n.mytheme .v-Notification.bar.v-position-bottom[class*=\"animate-in\"] {\n\t-webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards;\n\t-moz-animation: valo-animate-in-slide-up 300ms 10ms backwards;\n\tanimation: valo-animate-in-slide-up 300ms 10ms backwards;\n}\n\n.mytheme .v-Notification.bar.v-position-bottom[class*=\"animate-out\"] {\n\t-webkit-animation: valo-animate-out-slide-down 200ms;\n\t-moz-animation: valo-animate-out-slide-down 200ms;\n\tanimation: valo-animate-out-slide-down 200ms;\n}\n\n.mytheme .v-Notification.small {\n\tpadding: 11px 13px;\n}\n\n.mytheme .v-Notification.small .v-Notification-caption {\n\tfont-size: 16px;\n}\n\n.mytheme .v-Notification.small .v-Notification-description {\n\tfont-size: 14px;\n}\n\n.mytheme .v-Notification.critical-error {\n\tbackground: #ed473b;\n\tfont-weight: 400;\n\t-webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25);\n\tbox-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25);\n}\n\n.mytheme .v-Notification.critical-error .v-Notification-caption {\n\tcolor: white;\n}\n\n.mytheme .v-Notification.critical-error .v-Notification-description {\n\tcolor: #f4e0df;\n}\n\n.mytheme .v-Notification.closable {\n\tpadding-right: 59px;\n\toverflow: hidden !important;\n\tcursor: pointer;\n}\n\n.mytheme .v-Notification.closable:after {\n\tcontent: \"\\00d7\";\n\tfont-size: 1.5em;\n\tposition: absolute;\n\ttop: 50%;\n\tmargin-top: -12px;\n\tright: 12px;\n\twidth: 25px;\n\theight: 25px;\n\tline-height: 24px;\n\tcursor: pointer;\n\tcolor: #000;\n\topacity: 0.5;\n\tfilter: alpha(opacity=50) ;\n\ttext-align: center;\n\tborder: 1px solid #000;\n\tborder-color: rgba(0, 0, 0, 0.3);\n\tborder-radius: 50%;\n\t-webkit-transition: opacity 200ms;\n\t-moz-transition: opacity 200ms;\n\ttransition: opacity 200ms;\n}\n\n.mytheme .v-Notification.closable:hover:after {\n\topacity: 1;\n\tfilter: none ;\n}\n\n.mytheme .v-Notification.closable:active:after {\n\tbackground-color: #000;\n\tcolor: #fff;\n\topacity: 0.3;\n\tfilter: alpha(opacity=30.0) ;\n\t-webkit-transition: none 200ms;\n\t-moz-transition: none 200ms;\n\ttransition: none 200ms;\n}\n\n.mytheme .v-Notification.closable.dark:after, .mytheme .v-Notification.closable.critical-error:after, .mytheme .v-Notification.closable.system:after {\n\tcolor: #fff;\n\tborder-color: #fff;\n\tborder-color: rgba(255, 255, 255, 0.3);\n}\n\n.mytheme .v-Notification.closable.dark:active:after, .mytheme .v-Notification.closable.critical-error:active:after, .mytheme .v-Notification.closable.system:active:after {\n\tbackground-color: #fff;\n\tcolor: #000;\n}\n\n.mytheme .v-Notification.closable.tray:after {\n\ttop: 16px;\n\tmargin-top: 0;\n}\n\n.mytheme .v-Notification.success, .mytheme .v-Notification.failure {\n\tbackground: #fff;\n\tcolor: #555;\n\tborder: 2px solid #2c9720;\n}\n\n.mytheme .v-Notification.success .v-Notification-caption, .mytheme .v-Notification.failure .v-Notification-caption {\n\tcolor: #2c9720;\n\tfont-weight: 400;\n}\n\n.mytheme .v-Notification.success .v-Notification-caption:before, .mytheme .v-Notification.failure .v-Notification-caption:before {\n\tfont-family: ThemeIcons;\n\tcontent: \"\\f00c\";\n\tmargin-right: 0.5em;\n}\n\n.mytheme .v-Notification.success.bar, .mytheme .v-Notification.failure.bar {\n\tmargin: -2px !important;\n}\n\n.mytheme .v-Notification.failure {\n\tborder-color: #ed473b;\n}\n\n.mytheme .v-Notification.failure .v-Notification-caption {\n\tcolor: #ed473b;\n}\n\n.mytheme .v-Notification.failure .v-Notification-caption:before {\n\tcontent: \"\\f05e\";\n}\n\n.mytheme .valo-menu {\n\theight: 100%;\n\tbackground-color: #4b4b4b;\n\tbackground-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px);\n\tbackground-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px);\n\tcolor: #a5a5a5;\n\tfont-size: 14px;\n\tline-height: 30px;\n\tborder-right: 1px solid #3b3b3b;\n\twhite-space: nowrap;\n}\n\n.mytheme .valo-menu-toggle {\n\tdisplay: none;\n\tposition: fixed;\n\tz-index: 200;\n\ttop: 3px;\n\tleft: 3px;\n\tmin-width: 0;\n}\n\n.mytheme .valo-menu-part {\n\tborder-left: 1px solid #414141;\n\theight: 100%;\n\tpadding-bottom: 37px;\n\toverflow: auto;\n}\n\n.mytheme .valo-menu-part:first-child {\n\tborder-left: none;\n}\n\n.mytheme .valo-menu-title, .mytheme .valo-menu-subtitle, .mytheme .valo-menu-item {\n\tdisplay: block;\n\tline-height: inherit;\n\twhite-space: nowrap;\n\tposition: relative;\n}\n\n.mytheme .valo-menu-title .valo-menu-badge, .mytheme .valo-menu-subtitle .valo-menu-badge, .mytheme .valo-menu-item .valo-menu-badge {\n\tposition: absolute;\n\tright: 19px;\n}\n\n.mytheme .valo-menu-title {\n\tline-height: 1.2;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: white;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n\tpadding: 12px 19px;\n\tfont-size: 14px;\n\tborder-bottom: 1px solid #1362b1;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\ttext-align: center;\n}\n\n.mytheme .valo-menu-title .v-menubar.v-menubar {\n\tbackground: transparent;\n\tborder-color: #1362b1;\n\tcolor: inherit;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: inherit;\n}\n\n.mytheme .valo-menu-title .v-menubar-menuitem {\n\tbackground: transparent;\n\t-webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca;\n\tbox-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca;\n\ttext-shadow: inherit;\n\tfont-size: 16px;\n\tborder-color: inherit;\n}\n\n.mytheme .valo-menu-title h1, .mytheme .valo-menu-title .v-label-h1, .mytheme .valo-menu-title h2, .mytheme .valo-menu-title .v-label-h2, .mytheme .valo-menu-title h3, .mytheme .valo-menu-title .v-label-h3, .mytheme .valo-menu-title h4, .mytheme .valo-menu-title .v-label-h4 {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-user-menu {\n\tborder: none;\n\tborder-radius: 0;\n\tpadding: 1px;\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\ttext-shadow: none;\n\tbackground: transparent;\n\tcolor: inherit;\n\tmargin: 19px 7px;\n\tdisplay: block;\n\toverflow: hidden;\n\ttext-align: center;\n\theight: auto;\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-user-menu:focus:after {\n\tdisplay: none;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem {\n\t-webkit-box-shadow: none;\n\tbox-shadow: none;\n\tborder: none;\n\tmargin-right: 1px;\n\tborder-radius: 4px;\n\tcolor: #197de1;\n\tpadding: 0 12px;\n\t-webkit-transition: color 140ms;\n\t-moz-transition: color 140ms;\n\ttransition: color 140ms;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:last-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child:last-child {\n\tborder-radius: 4px;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem:before {\n\tcontent: none;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem:hover {\n\tcolor: #4396ea;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem:active {\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child {\n\tborder: 1px solid #c5c5c5;\n\tcolor: #197de1;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption {\n\tposition: relative;\n\ttop: -1px;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected {\n\tcolor: #ecf2f8;\n\ttext-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected:hover {\n\tcolor: #ecf2f8;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled, .mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled:hover {\n\tcolor: inherit;\n}\n\n.mytheme .v-menubar-user-menu > .v-menubar-menuitem {\n\tcolor: inherit;\n\twhite-space: normal;\n\tline-height: 1.4;\n\tmargin: 0;\n}\n\n.mytheme .v-menubar-user-menu > .v-menubar-menuitem img.v-icon {\n\twidth: 56px;\n\theight: 56px;\n\tborder-radius: 29px;\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tdisplay: block;\n\tmargin: 0 auto 0.3em;\n\tborder: 1px solid #c5c5c5;\n}\n\n.mytheme .v-menubar-user-menu > .v-menubar-menuitem:after {\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n}\n\n.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected {\n\tbackground: transparent;\n}\n\n.mytheme .valo-menu-subtitle {\n\tcolor: #868686;\n\tmargin: 7px 0 7px 19px;\n\tborder-bottom: 1px solid #666666;\n}\n\n.mytheme .valo-menu-subtitle [class*=\"badge\"] {\n\tcolor: #73a5d7;\n}\n\n.mytheme .valo-menuitems {\n\tdisplay: block;\n}\n\n.mytheme .valo-menu-item {\n\toutline: none;\n\tfont-weight: 400;\n\tpadding: 0 37px 0 19px;\n\tcursor: pointer;\n\tposition: relative;\n\toverflow: hidden;\n\ttext-shadow: 0 2px 0 rgba(0, 0, 0, 0.05);\n\t-webkit-transition: background-color 300ms, color 60ms;\n\t-moz-transition: background-color 300ms, color 60ms;\n\ttransition: background-color 300ms, color 60ms;\n}\n\n.mytheme .valo-menu-item [class*=\"caption\"] {\n\tvertical-align: middle;\n\tdisplay: inline-block;\n\twidth: 90%;\n\tmax-width: 15em;\n\tpadding-right: 19px;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n}\n\n.mytheme .valo-menu-item [class*=\"badge\"] {\n\tcolor: #73a5d7;\n}\n\n.mytheme .valo-menu-item.selected {\n\tbackground: #434343;\n}\n\n.mytheme .valo-menu-item.selected .v-icon {\n\tcolor: #197de1;\n}\n\n.mytheme .valo-menu-item.selected [class*=\"badge\"] {\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: #c8dbed;\n}\n\n.mytheme .valo-menu-item:focus, .mytheme .valo-menu-item:hover, .mytheme .valo-menu-item.selected {\n\tcolor: white;\n}\n\n.mytheme .valo-menu-item span.v-icon {\n\tmin-width: 1em;\n\tmargin-right: 19px;\n\ttext-align: center;\n\tvertical-align: middle;\n\t-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(black), to(rgba(0, 0, 0, 0.75)));\n}\n\n.mytheme .valo-menu-item span.v-icon + span {\n\tmargin-left: 0;\n}\n\n.mytheme .valo-menu-item [class*=\"badge\"] {\n\tbackground-color: #585858;\n\t-webkit-transition: background-color 300ms;\n\t-moz-transition: background-color 300ms;\n\ttransition: background-color 300ms;\n\tline-height: 1;\n\tpadding: 4px 6px;\n\tmin-width: 11px;\n\ttext-align: center;\n\ttop: 4px;\n\tborder-radius: 4px;\n}\n\n.mytheme .valo-menu-part.large-icons {\n\tbackground-color: #4b4b4b;\n\tmin-width: 74px;\n\tmax-width: 111px;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-title {\n\tfont-size: 12px;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-title .v-label-undef-w {\n\twhite-space: normal;\n}\n\n.mytheme .valo-menu-part.large-icons .v-menubar-user-menu {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-size: 11px;\n}\n\n.mytheme .valo-menu-part.large-icons .v-menubar-user-menu img.v-icon {\n\twidth: 28px;\n\theight: 28px;\n}\n\n.mytheme .valo-menu-part.large-icons [class*=\"subtitle\"] {\n\tmargin: 9px 0 0;\n\tpadding: 7px 25px 7px 9px;\n\tline-height: 1;\n\tborder: none;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tbackground: #3c3c3c;\n\tfont-size: 13px;\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .valo-menu-part.large-icons [class*=\"subtitle\"] [class*=\"badge\"] {\n\tright: 9px;\n}\n\n.mytheme .valo-menu-part.large-icons [class*=\"subtitle\"] + .valo-menu-item {\n\tborder-top: none;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item {\n\tdisplay: block;\n\tfont-size: 26px;\n\tline-height: 1;\n\tpadding: 12px;\n\ttext-align: center;\n\tborder-top: 1px solid #555555;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item:first-child {\n\tborder-top: none;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item [class*=\"caption\"] {\n\tdisplay: block;\n\twidth: auto;\n\tmargin: 0.3em 0 0;\n\tpadding: 0;\n\tfont-size: 11px;\n\tline-height: 1.3;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item .v-icon {\n\tmargin: 0;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item span.v-icon {\n\topacity: 0.8;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item.selected {\n\tbackground: #434343;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item.selected .v-icon {\n\topacity: 1;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item.selected [class*=\"badge\"] {\n\tborder-color: #434343;\n}\n\n.mytheme .valo-menu-part.large-icons .valo-menu-item [class*=\"badge\"] {\n\tpadding-left: 4px;\n\tpadding-right: 4px;\n\ttop: 7px;\n\tright: 7px;\n\tborder: 2px solid #4b4b4b;\n}\n\n.mytheme .valo-menu-logo {\n\tdisplay: block;\n\toverflow: hidden;\n\twidth: 44px !important;\n\theight: 44px;\n\tborder-radius: 4px;\n\ttext-align: center;\n\tbackground-color: #197de1;\n\tbackground-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%);\n\tbackground-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%);\n\tcolor: white;\n\tfont-size: 25px;\n\tline-height: 44px;\n\tmargin: 19px auto;\n\t-webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .valo-menu-logo:focus {\n\toutline: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part {\n\tbackground-color: #4b4b4b;\n\tmin-width: 74px;\n\tmax-width: 111px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-title {\n\tfont-size: 12px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-title .v-label-undef-w {\n\twhite-space: normal;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .v-menubar-user-menu {\n\tmargin-left: 0;\n\tmargin-right: 0;\n\tfont-size: 11px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .v-menubar-user-menu img.v-icon {\n\twidth: 28px;\n\theight: 28px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part [class*=\"subtitle\"] {\n\tmargin: 9px 0 0;\n\tpadding: 7px 25px 7px 9px;\n\tline-height: 1;\n\tborder: none;\n\ttext-overflow: ellipsis;\n\toverflow: hidden;\n\tbackground: #3c3c3c;\n\tfont-size: 13px;\n\tbox-shadow: 0 2px 3px rgba(0, 0, 0, 0.05);\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part [class*=\"subtitle\"] [class*=\"badge\"] {\n\tright: 9px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part [class*=\"subtitle\"] + .valo-menu-item {\n\tborder-top: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item {\n\tdisplay: block;\n\tfont-size: 26px;\n\tline-height: 1;\n\tpadding: 12px;\n\ttext-align: center;\n\tborder-top: 1px solid #555555;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item:first-child {\n\tborder-top: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item [class*=\"caption\"] {\n\tdisplay: block;\n\twidth: auto;\n\tmargin: 0.3em 0 0;\n\tpadding: 0;\n\tfont-size: 11px;\n\tline-height: 1.3;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item .v-icon {\n\tmargin: 0;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item span.v-icon {\n\topacity: 0.8;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item.selected {\n\tbackground: #434343;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item.selected .v-icon {\n\topacity: 1;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item.selected [class*=\"badge\"] {\n\tborder-color: #434343;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"801px-1100px\"] .valo-menu-part .valo-menu-item [class*=\"badge\"] {\n\tpadding-left: 4px;\n\tpadding-right: 4px;\n\ttop: 7px;\n\tright: 7px;\n\tborder: 2px solid #4b4b4b;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] {\n\tpadding-top: 37px;\n\t-webkit-box-sizing: border-box;\n\tbox-sizing: border-box;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .v-loading-indicator {\n\ttop: 37px;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] > .v-widget {\n\tposition: relative !important;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu {\n\tborder-right: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu-part {\n\toverflow: visible;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu-toggle {\n\tdisplay: inline-block;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu-title {\n\tposition: fixed;\n\tz-index: 100;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 37px !important;\n\tpadding-top: 0;\n\tpadding-bottom: 0;\n\t-webkit-backface-visibility: hidden;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu .v-menubar-user-menu {\n\tposition: fixed;\n\tz-index: 100;\n\ttop: 0;\n\tright: 0;\n\tmargin: 0;\n\tpadding: 0;\n\theight: 37px;\n\tcolor: #97bee5;\n\tmax-width: 30%;\n\t-webkit-backface-visibility: hidden;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem {\n\tline-height: 36px;\n\twhite-space: nowrap;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu .v-menubar-user-menu img.v-icon {\n\tdisplay: inline-block;\n\tmargin: 0 6px 0 0;\n\twidth: 19px;\n\theight: 19px;\n\tborder-radius: 10px;\n\tborder: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menuitems {\n\theight: 100%;\n\tbackground-color: #4b4b4b;\n\tbackground-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px);\n\tbackground-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px);\n\tcolor: #a5a5a5;\n\tfont-size: 14px;\n\tline-height: 30px;\n\tborder-right: 1px solid #3b3b3b;\n\twhite-space: nowrap;\n\tposition: fixed;\n\tz-index: 9000;\n\ttop: 37px;\n\tbottom: 0;\n\theight: auto;\n\tmax-width: 100%;\n\toverflow: auto;\n\tpadding: 19px 0;\n\t-webkit-transform: translatex(-100%);\n\t-moz-transform: translatex(-100%);\n\t-ms-transform: translatex(-100%);\n\t-o-transform: translatex(-100%);\n\ttransform: translatex(-100%);\n\t-webkit-transition: all 300ms;\n\t-moz-transition: all 300ms;\n\ttransition: all 300ms;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu-visible .valo-menuitems, .mytheme .valo-menu-responsive[width-range~=\"0-800px\"] .valo-menu-hover:hover .valo-menuitems {\n\t-webkit-transform: translatex(0%);\n\t-moz-transform: translatex(0%);\n\t-ms-transform: translatex(0%);\n\t-o-transform: translatex(0%);\n\ttransform: translatex(0%);\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-500px\"] .valo-menu-toggle .v-button-caption {\n\tdisplay: none;\n}\n\n.mytheme .valo-menu-responsive[width-range~=\"0-500px\"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem-caption {\n\tdisplay: inline-block;\n\twidth: 19px;\n\toverflow: hidden;\n}\n\n.mytheme .smallgrid .v-grid-body .v-grid-cell {\n\tline-height: 18px;\n\tfont-size: 12px;\n}\n\n.mytheme .csslayout {\n\tpadding-left: 10px;\n\tpadding-right: 10px;\n}\n\n.mytheme .leftPosition {\n\tfloat: left;\n}\n\n.mytheme .rightPosition {\n\tfloat: right;\n}\n\n.mytheme .v-csslayout-margin {\n\tpadding-left: 10px;\n\tpadding-right: 10px;\n\tpadding-bottom: 10px;\n}\n\n.mytheme .v-textfield-my-text {\n\ttext-align: right !important;\n}"} \ No newline at end of file diff --git a/local.properties b/local.properties new file mode 100644 index 0000000..92cde6b --- /dev/null +++ b/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Wed Nov 18 18:19:17 CET 2020 +sdk.dir=C\:\\Users\\Fibrillator\\AppData\\Local\\Android\\Sdk diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..0cc7282 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,41 @@ +rootProject.name = "ksdtoolkit" + +include("ksdtoolkit-core") +include("ksdtoolkit-mobapp") +include("ksdtoolkit-webapp") + + +pluginManagement { + + repositories { + google() + gradlePluginPortal() + jcenter() + mavenLocal() + } + + val kotlinVersion = "1.4.20" + val androidGradlePluginVersion = "4.0.2" + + plugins { + id("org.jetbrains.kotlin.jvm") version kotlinVersion apply false + id("org.jetbrains.kotlin.android") version kotlinVersion apply false + id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply false + + id("com.android.application") version androidGradlePluginVersion apply false + } + + resolutionStrategy { + eachPlugin { + if (requested.id.namespace == "com.android") { + useModule("com.android.tools.build:gradle:${androidGradlePluginVersion}") + } + if (requested.id.namespace == "com.google.gms") { + useModule("com.google.gms:${requested.id.name}:${requested.version}") + } + if (requested.id.id.startsWith("org.jetbrains.kotlin")) { + useVersion("${kotlinVersion}") + } + } + } +} \ No newline at end of file