From c317121978c6dba43895ed02102b15f4a587a19f Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Thu, 19 May 2022 21:06:35 -0500 Subject: [PATCH] Sorry that the README is not complete --- .gitignore | 133 + .vs/ProjectSettings.json | 3 + .vs/TimelapseNow/DesignTimeBuild/.dtbcache.v2 | Bin 0 -> 145123 bytes .vs/TimelapseNow/v17/.futdcache.v1 | Bin 0 -> 126 bytes .vs/TimelapseNow/v17/workspaceFileList.bin | Bin 0 -> 166946 bytes .vs/VSWorkspaceState.json | 9 + .vs/slnx.sqlite | Bin 0 -> 458752 bytes .vscode/launch.json | 24 + .vscode/tasks.json | 41 + INSTALL.md | 65 + LICENSE.md | 675 + NOTICES.md | 10 + README.md | 8 + Timelapse.Linux/Program.cs | 10 + Timelapse.Linux/Timelapse.Linux.csproj | 24 + Timelapse.Pack/Program.cs | 266 + Timelapse.Pack/Timelapse.Pack.csproj | 17 + .../Timelapse.ProjectTemplates.csproj | 32 + .../C#/.template.config/template.json | 30 + .../templates/C#/Extension.cs | 10 + .../C#/TimelapseExtension0001.csproj | 15 + .../templates/C#/extension_info.json | 6 + .../F#/.template.config/template.json | 30 + .../templates/F#/Extension.fs | 10 + .../F#/TimelapseExtension0001.fsproj | 15 + .../templates/F#/extension_info.json | 6 + .../VB/.template.config/template.json | 30 + .../templates/VB/Extension.vb | 17 + .../VB/TimelapseExtension0001.vbproj | 8 + .../templates/VB/extension_info.json | 6 + Timelapse.Windows/Program.cs | 13 + Timelapse.Windows/Timelapse.Windows.csproj | 24 + Timelapse.Windows/favicon.ico | Bin 0 -> 4286 bytes Timelapse/ExportWindow.cs | 131 + Timelapse/NewFrameEventArgs.cs | 14 + Timelapse/PictureBox.cs | 80 + Timelapse/Program.cs | 433 + Timelapse/ProjectSettings.cs | 128 + Timelapse/SelectCamera.cs | 116 + Timelapse/ServerFiles/LICENSE | 21 + Timelapse/ServerFiles/css/materialize.css | 9067 +++++++++++ Timelapse/ServerFiles/css/materialize.min.css | 13 + Timelapse/ServerFiles/css/timelapse.css | 39 + Timelapse/ServerFiles/favicon.ico | Bin 0 -> 4286 bytes Timelapse/ServerFiles/index.html | 115 + Timelapse/ServerFiles/js/jquery.min.js | 2 + Timelapse/ServerFiles/js/materialize.js | 12374 ++++++++++++++++ Timelapse/ServerFiles/js/materialize.min.js | 6 + Timelapse/Timelapse.csproj | 29 + Timelapse/TimelapseCamera.cs | 24 + Timelapse/WebServer.cs | 268 + TimelapseApi/Api.cs | 259 + TimelapseApi/ClassExtensions.cs | 31 + TimelapseApi/ExportForm.cs | 82 + TimelapseApi/ExtensionFeatures.cs | 81 + TimelapseApi/ExtensionInfo.cs | 25 + TimelapseApi/ExtensionLoader.cs | 101 + TimelapseApi/LockObj.cs | 25 + TimelapseApi/TimelapseApi.csproj | 30 + TimelapseApi/TimelapseExtension.cs | 65 + TimelapseApi/TimelapseFileSystem.cs | 417 + TimelapseApi/TimelapseProject.cs | 166 + TimelapseApi/TimelapseSettings.cs | 247 + TimelapseApi/TimelapseSettingsModel.cs | 23 + TimelapseApi/VideoFileCreator.cs | 107 + timelapse.png | Bin 0 -> 857 bytes 66 files changed, 26056 insertions(+) create mode 100644 .gitignore create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/TimelapseNow/DesignTimeBuild/.dtbcache.v2 create mode 100644 .vs/TimelapseNow/v17/.futdcache.v1 create mode 100644 .vs/TimelapseNow/v17/workspaceFileList.bin create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/slnx.sqlite create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 INSTALL.md create mode 100644 LICENSE.md create mode 100644 NOTICES.md create mode 100644 README.md create mode 100644 Timelapse.Linux/Program.cs create mode 100644 Timelapse.Linux/Timelapse.Linux.csproj create mode 100644 Timelapse.Pack/Program.cs create mode 100644 Timelapse.Pack/Timelapse.Pack.csproj create mode 100644 Timelapse.ProjectTemplates/Timelapse.ProjectTemplates.csproj create mode 100644 Timelapse.ProjectTemplates/templates/C#/.template.config/template.json create mode 100644 Timelapse.ProjectTemplates/templates/C#/Extension.cs create mode 100644 Timelapse.ProjectTemplates/templates/C#/TimelapseExtension0001.csproj create mode 100644 Timelapse.ProjectTemplates/templates/C#/extension_info.json create mode 100644 Timelapse.ProjectTemplates/templates/F#/.template.config/template.json create mode 100644 Timelapse.ProjectTemplates/templates/F#/Extension.fs create mode 100644 Timelapse.ProjectTemplates/templates/F#/TimelapseExtension0001.fsproj create mode 100644 Timelapse.ProjectTemplates/templates/F#/extension_info.json create mode 100644 Timelapse.ProjectTemplates/templates/VB/.template.config/template.json create mode 100644 Timelapse.ProjectTemplates/templates/VB/Extension.vb create mode 100644 Timelapse.ProjectTemplates/templates/VB/TimelapseExtension0001.vbproj create mode 100644 Timelapse.ProjectTemplates/templates/VB/extension_info.json create mode 100644 Timelapse.Windows/Program.cs create mode 100644 Timelapse.Windows/Timelapse.Windows.csproj create mode 100644 Timelapse.Windows/favicon.ico create mode 100644 Timelapse/ExportWindow.cs create mode 100644 Timelapse/NewFrameEventArgs.cs create mode 100644 Timelapse/PictureBox.cs create mode 100644 Timelapse/Program.cs create mode 100644 Timelapse/ProjectSettings.cs create mode 100644 Timelapse/SelectCamera.cs create mode 100644 Timelapse/ServerFiles/LICENSE create mode 100644 Timelapse/ServerFiles/css/materialize.css create mode 100644 Timelapse/ServerFiles/css/materialize.min.css create mode 100644 Timelapse/ServerFiles/css/timelapse.css create mode 100644 Timelapse/ServerFiles/favicon.ico create mode 100644 Timelapse/ServerFiles/index.html create mode 100644 Timelapse/ServerFiles/js/jquery.min.js create mode 100644 Timelapse/ServerFiles/js/materialize.js create mode 100644 Timelapse/ServerFiles/js/materialize.min.js create mode 100644 Timelapse/Timelapse.csproj create mode 100644 Timelapse/TimelapseCamera.cs create mode 100644 Timelapse/WebServer.cs create mode 100644 TimelapseApi/Api.cs create mode 100644 TimelapseApi/ClassExtensions.cs create mode 100644 TimelapseApi/ExportForm.cs create mode 100644 TimelapseApi/ExtensionFeatures.cs create mode 100644 TimelapseApi/ExtensionInfo.cs create mode 100644 TimelapseApi/ExtensionLoader.cs create mode 100644 TimelapseApi/LockObj.cs create mode 100644 TimelapseApi/TimelapseApi.csproj create mode 100644 TimelapseApi/TimelapseExtension.cs create mode 100644 TimelapseApi/TimelapseFileSystem.cs create mode 100644 TimelapseApi/TimelapseProject.cs create mode 100644 TimelapseApi/TimelapseSettings.cs create mode 100644 TimelapseApi/TimelapseSettingsModel.cs create mode 100644 TimelapseApi/VideoFileCreator.cs create mode 100644 timelapse.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c7f0e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,133 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml +*.azurePubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +packages/ +## TODO: If the tool you use requires repositories.config, also uncomment the next line +!packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +![Ss]tyle[Cc]op.targets +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml + +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +_NCrunch* diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..866f1e1 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/TimelapseNow/DesignTimeBuild/.dtbcache.v2 b/.vs/TimelapseNow/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..9461e7942f47a38bf83ca8fad7ce49e28ffe1e77 GIT binary patch literal 145123 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 QOz-Jdf`EK_iy$%mKRN*?6#xJL literal 0 HcmV?d00001 diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..dab5d4e --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,9 @@ +{ + "ExpandedNodes": [ + "", + "\\Timelapse", + "\\TimelapseApi" + ], + "SelectedNode": "\\Timelapse\\Timelapse.csproj", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..52788bf40c617964ca43c2e5a37140265fc75f6a GIT binary patch literal 458752 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 CiAbOT literal 0 HcmV?d00001 diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7730518 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,24 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + "program": "${workspaceFolder}/Timelapse.Desktop/bin/Debug/net6.0/Timelapse.Desktop.dll", + "args": [], + "cwd": "${workspaceFolder}/Timelapse.Desktop", + "console": "internalConsole", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..e2907ed --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/Timelapse.Desktop/Timelapse.Desktop.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/Timelapse.Desktop/Timelapse.Desktop.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/Timelapse.Desktop/Timelapse.Desktop.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..cb180af --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,65 @@ +# How to install this app +except for dotnet (depending on how you install it even dotnet) everything wont need root/Administrator to install +# Linux Users (x86_64) + +You will need [Dotnet 6](https://dotnet.microsoft.com/en-us/download) + + cd Timelapse.Linux + mkdir $HOME/timelapsenow + dotnet publish -c Release --self-contained -r linux-x64 -o $HOME/timelapsenow + cp ../timelapse.png $HOME/timelapsenow/ + echo "[DesktopEntry]" > $HOME/.local/share/applications/timelapsenow.desktop + echo "Version=1.0" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Type=Application" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Name=Timelapse Now" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Icon=$HOME/timelapsenow/timelapse.png" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Exec=$HOME/timelapsenow/Timelapse.Linux" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Terminal=false" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Categories=AudioVideo;Recorder" >> $HOME/.local/share/applications/timelapsenow.desktop; + +# Linux Users (arm) + +You will need [Dotnet 6](https://dotnet.microsoft.com/en-us/download) + + cd Timelapse.Linux + mkdir $HOME/timelapsenow + dotnet publish -c Release --self-contained -r linux-arm -o $HOME/timelapsenow + cp ../timelapse.png $HOME/timelapsenow/ + echo "[DesktopEntry]" > $HOME/.local/share/applications/timelapsenow.desktop + echo "Version=1.0" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Type=Application" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Name=Timelapse Now" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Icon=$HOME/timelapsenow/timelapse.png" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Exec=$HOME/timelapsenow/Timelapse.Linux" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Terminal=false" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Categories=AudioVideo;Recorder" >> $HOME/.local/share/applications/timelapsenow.desktop; +# Linux Users (arm64) + +You will need [Dotnet 6](https://dotnet.microsoft.com/en-us/download) + + cd Timelapse.Linux + mkdir $HOME/timelapsenow + dotnet publish -c Release --self-contained -r linux-arm64 -o $HOME/timelapsenow + cp ../timelapse.png $HOME/timelapsenow/ + echo "[DesktopEntry]" > $HOME/.local/share/applications/timelapsenow.desktop + echo "Version=1.0" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Type=Application" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Name=Timelapse Now" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Icon=$HOME/timelapsenow/timelapse.png" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Exec=$HOME/timelapsenow/Timelapse.Linux" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Terminal=false" >> $HOME/.local/share/applications/timelapsenow.desktop + echo "Categories=AudioVideo;Recorder" >> $HOME/.local/share/applications/timelapsenow.desktop; + +# Windows +You will need [Dotnet 6](https://dotnet.microsoft.com/en-us/download)
+I mainly use linux but I understand some people use windows +## Using PowerShell/Command Prompt + Please make a folder for timelapse and replace \path\to\timelapse\ with the path + + if you have 32 bit windows or arm replace win-x64 with win-x86, win-arm or win-arm + + cd Timelapse.Windows + dotnet publish -c Release -r win-x64 --self-contained -o "\path\to\timelapse\" + + navigate to "\path\to\timelapse\" in file explorer if you haven't already + Right click "Timelapse.Windows.exe" and Select SendTo->Desktop (Create Shortcut) and maybe pin to Taskbar, Startmenu diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..2fb2e74 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,675 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/NOTICES.md b/NOTICES.md new file mode 100644 index 0000000..421eead --- /dev/null +++ b/NOTICES.md @@ -0,0 +1,10 @@ +# Notices + +[FlashCap (Apache 2.0 License)](https://github.com/kekyo/FlashCap)
+[Eto.Forms (BSD 3)](https://github.com/picoe/Eto)
+[SixLabors.ImageSharp (Apache 2.0 License)](https://github.com/SixLabors/ImageSharp)
+[Newtonsoft.Json (MIT)](https://github.com/JamesNK/Newtonsoft.Json)
+[System.IO.Compression.ZipFile (Dont know license, but is part of runtime)](https://www.nuget.org/packages/System.IO.Compression.ZipFile/)
+ +# My library (But I will include it anyway (it used some modified source from https://github.com/dajuric/simple-http/)) +[Tesses.WebServer (MIT)](https://gitlab.tesses.net/tesses50/tesses.webserver) diff --git a/README.md b/README.md new file mode 100644 index 0000000..0623a12 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# Timelapse Now + +## Sorry the README is a work in progress +To learn how to install click [here](INSTALL.md) +
+To see notices click [here](NOTICES.md) +
+To see license click [here](LICENSE.md) \ No newline at end of file diff --git a/Timelapse.Linux/Program.cs b/Timelapse.Linux/Program.cs new file mode 100644 index 0000000..fb4a42e --- /dev/null +++ b/Timelapse.Linux/Program.cs @@ -0,0 +1,10 @@ +namespace Timelapse; +using Eto.Forms; +public class Program +{ + public static void Main(string[] args) + { + + new Application().Run(new MainForm(args) { Width = 640, Height = 480, Title = "Timelapse Now" }); + } +} \ No newline at end of file diff --git a/Timelapse.Linux/Timelapse.Linux.csproj b/Timelapse.Linux/Timelapse.Linux.csproj new file mode 100644 index 0000000..77617cc --- /dev/null +++ b/Timelapse.Linux/Timelapse.Linux.csproj @@ -0,0 +1,24 @@ + + + + + Exe + net6.0 + enable + enable + linux-x64 + true + + + + + + + + + + + + + + diff --git a/Timelapse.Pack/Program.cs b/Timelapse.Pack/Program.cs new file mode 100644 index 0000000..c9b7e22 --- /dev/null +++ b/Timelapse.Pack/Program.cs @@ -0,0 +1,266 @@ +using TimelapseApi; +using System.Diagnostics; +using System.IO; +using System; +using System.IO.Compression; +/* +using System.Xml; +using System.Xml.Linq; +*/ + +public class TimelapsePack +{ + public static string? BuildProject() + { + /* + + + Library*/ + string curDirName=Path.GetFileName(Environment.CurrentDirectory); + + string fname = File.Exists($"{curDirName}.csproj") ? $"{curDirName}.csproj" : (File.Exists($"{curDirName}.vbproj") ? $"{curDirName}.vbproj" : $"{curDirName}.fsproj"); + + string? outType=""; + bool containsRef=false; + /* + XmlReader reader = XmlReader.Create(fname); + XElement el = XElement.Load(reader); + reader.Close(); + + + foreach(var item in el.Descendants()) + { + if(item.Name=="PropertyGroup") + { + + foreach(var desend in item.Descendants()) + { + if(desend.Name== "OutputType") + { + outType=desend.Value; + } + } + } + if(item.Name == "ItemGroup") + { + foreach (var desend in item.Descendants()) + { + if (desend.Name == "ProjectReference") + { + foreach (var a in desend.Attributes()) + { + if (a.Name == "Include") + { + if (a.Value.Contains("TimelapseApi")) + { + containsRef = true; + } + + } + } + } + if (desend.Name == "PackageReference") + { + foreach (var a in desend.Attributes()) + { + if (a.Name == "Include") + { + if (a.Value.Contains("Tesses.TimelapseApi")) + { + containsRef = true; + } + + } + } + } + } + } + + } + */ + if(!string.IsNullOrWhiteSpace(outType) && outType == "Library" && containsRef) + { + //build the library + Process p = new Process(); + p.StartInfo = new ProcessStartInfo("dotnet","build --configuration release"); + p.StartInfo.UseShellExecute=false; + if(p.Start()) + { + p.WaitForExit(); + return Path.Combine(Environment.CurrentDirectory,"bin","Release","net6.0",$"{curDirName}.dll"); + }else{ + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("ERROR: process not started"); + + } + }else{ + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine("ERROR: Project is not a library"); + + } + return null; + } + public static void DirCopy(string src,string dest,Func copyItem) + { + foreach(var f in Directory.GetDirectories(src)) + { + if(copyItem != null && copyItem(f) == false) + { + continue; + } + string fname =Path.GetFileName(f); + DirCopy(f,fname,copyItem); + } + + foreach(var f in Directory.GetFiles(src)) + { + if(copyItem != null && copyItem(f) == false) + { + continue; + } + string fname =Path.GetFileName(f); + File.Copy(f,fname); + } + } + public static string? Pack(string? outname) + { + string[] _hasDeps=new string[] { + "AtkSharp.dll", + "TimelapseApi.dll", + "Eto.dll", + "Newtonsoft.Json.dll", + "FlashCap.dll", + "CarioSharp.dll", + "GtkSharp.dll", + "GdkSharp.dll", + "GLibSharp.dll", + "SixLabors.ImageSharp.dll" + }; + var outPut=BuildProject(); + if(!string.IsNullOrWhiteSpace(outPut)) + { + Directory.CreateDirectory("_build/extension"); + File.Copy("extension_info.json","_build/extension_info.json"); + + DirCopy(Path.GetDirectoryName(outPut),"_build/extension",(e)=>{ + if(e==outPut) + { + return false; + } + string cF = Path.GetFileName(e); + + return !_hasDeps.Contains(cF); + }); + string fname = $"{Path.GetFileNameWithoutExtension(outPut)}.zip"; + File.Copy(outPut,"_build/extension/extension.dll"); + + if(!string.IsNullOrWhiteSpace(outname)) + { + fname=outname; + } + if(File.Exists(fname)) + { + File.Delete(fname); + } + ZipFile.CreateFromDirectory ("_build",fname,CompressionLevel.SmallestSize, false); + Directory.Delete("_build"); + return fname; + } + return null; + } + public static void Uninstall(string name) + { + string dir= Api.GetInternalFile("ExtensionBinaries",name); + if(Directory.Exists(dir)) + { + + Console.Write($"Are you sure you want to delete {name} (Yes/No): "); + j: + var read=Console.ReadLine().ToLower(); + if(read == "yes") + { + Console.WriteLine("I asked ya, you said yes so deleting"); + Directory.Delete(dir,true); + } else if (read == "no") + { + Console.WriteLine("Not deleting"); + } + else { + Console.Write("Please type yes or no: "); + goto j; + } + }else{ + Console.WriteLine($"No such extension {name}"); + } + } + public static void ListExtensions(bool load) + { + if(load) + { + + foreach(var item in ExtensionLoader.GetTimelapseExtensions()) + { + Console.WriteLine($"Name=\"{item.Name}\", Id=\"{item.Id}\""); + } + }else{ + string dirtoitterateon= Api.GetInternalFile("ExtensionBinaries"); + if(Directory.Exists(dirtoitterateon)) + { + foreach(var dir in Directory.GetDirectories(dirtoitterateon)) + { + Console.WriteLine(Path.GetFileName(dir)); + } + } + } + } + public static void Install(string? file) + { + if(!string.IsNullOrWhiteSpace(file)) + { + TimelapseApi.ExtensionLoader.InstallExtension(file).Wait(); + return; + } + string? outPut=Pack(null); + if(!string.IsNullOrWhiteSpace(outPut)) + { + TimelapseApi.ExtensionLoader.InstallExtension(outPut).Wait(); + File.Delete(outPut); + } + } + public static void Main(string[] args) + { + Console.WriteLine("Timelapse Extension Packager"); + if(args.Length < 1) + { + Console.WriteLine("Usage: args..."); + Console.WriteLine(); + Console.WriteLine("Commands:"); + Console.WriteLine(" pack [optional-filename]"); + Console.WriteLine(" install [optional-filename]"); + Console.WriteLine(" list [--get-id (requires loading extensions partially)]"); + Console.WriteLine(" uninstall "); + return; + } + Console.WriteLine(); + switch(args[0]) + { + case "pack": + string? fname = ""; + if(args.Length >= 2) fname=args[1]; + Pack(fname); + break; + case "install": + string? fname = ""; + if(args.Length >= 2) fname=args[1]; + Install(fname); + break; + case "list": + + ListExtensions(args.Length >= 2 && args[1] == "--get-id"); + break; + case "uninstall": + if(args.Length >= 2) Uninstall(args[1]); + break; + } + } +} \ No newline at end of file diff --git a/Timelapse.Pack/Timelapse.Pack.csproj b/Timelapse.Pack/Timelapse.Pack.csproj new file mode 100644 index 0000000..0721b25 --- /dev/null +++ b/Timelapse.Pack/Timelapse.Pack.csproj @@ -0,0 +1,17 @@ + + + + + + + + + + + Exe + net6.0 + enable + enable + + + diff --git a/Timelapse.ProjectTemplates/Timelapse.ProjectTemplates.csproj b/Timelapse.ProjectTemplates/Timelapse.ProjectTemplates.csproj new file mode 100644 index 0000000..b582d25 --- /dev/null +++ b/Timelapse.ProjectTemplates/Timelapse.ProjectTemplates.csproj @@ -0,0 +1,32 @@ + + + + Template + true + Tesses.TimelapseExtension + Mike Nolan + Tesses + 1.0.0 + 1.0.0 + 1.0.0 + Extension templates for TimelapseNow + GPL-3.0-only + true + Camera, Timelapse, Record + https://gitlab.tesses.net/tesses50/timelapsenow + + net6.0 + + true + false + content + $(NoWarn);NU5128 + true + + + + + + + + diff --git a/Timelapse.ProjectTemplates/templates/C#/.template.config/template.json b/Timelapse.ProjectTemplates/templates/C#/.template.config/template.json new file mode 100644 index 0000000..83983ce --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/C#/.template.config/template.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/template", + "sourceName": "TimelapseExtension0001", + "defaultName": "TimelapseExtension", + "author": "Tesses", + "classifications": [ "Common", "Library","Desktop" ], + "identity": "Timelapse.ExtensionLibrary", + "name": "Timelapse templates: Extension", + "shortName": "timelapseext", + "tags": { + "language": "C#", + "type": "project" + }, + "description": "Extension for TimelapseNow", + "symbols": { + "Framework": { + "type": "parameter", + "description": "The target framework for the project.", + "datatype": "choice", + "choices": [ + { + "choice": "net6.0", + "description": "Target net6.0" + } + ], + "replaces": "net6.0", + "defaultValue": "net6.0" + } + } + } \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/C#/Extension.cs b/Timelapse.ProjectTemplates/templates/C#/Extension.cs new file mode 100644 index 0000000..846c5da --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/C#/Extension.cs @@ -0,0 +1,10 @@ +using TimelapseApi; +using System; +namespace TimelapseExtension0001 +{ + public class TimelapseExtension0001 : TimelapseExtension + { + public override string Name => "TimelapseExtension0001"; + public override Guid Id => Guid.Parse("{1cb8b576-e2e8-44d5-a8e1-e25a47eb0564}"); //https://duckduckgo.com/?q=guid&t=ffab&ia=answer + } +} \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/C#/TimelapseExtension0001.csproj b/Timelapse.ProjectTemplates/templates/C#/TimelapseExtension0001.csproj new file mode 100644 index 0000000..f2aabd6 --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/C#/TimelapseExtension0001.csproj @@ -0,0 +1,15 @@ + + + + Library + net6.0 + enable + enable + + + + + + + + diff --git a/Timelapse.ProjectTemplates/templates/C#/extension_info.json b/Timelapse.ProjectTemplates/templates/C#/extension_info.json new file mode 100644 index 0000000..37d4a4f --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/C#/extension_info.json @@ -0,0 +1,6 @@ +{ + "name": "TimelapseExtension0001", + "author": "YourNameOrCompanyName", + "version": "1.0.0", + "description": "Some Description" +} \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/F#/.template.config/template.json b/Timelapse.ProjectTemplates/templates/F#/.template.config/template.json new file mode 100644 index 0000000..40402a2 --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/F#/.template.config/template.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/template", + "sourceName": "TimelapseExtension0001", + "defaultName": "TimelapseExtension", + "author": "Tesses", + "classifications": [ "Common", "Library","Desktop" ], + "identity": "Timelapse.ExtensionLibrary", + "name": "Timelapse templates: Extension", + "shortName": "timelapseext", + "tags": { + "language": "F#", + "type": "project" + }, + "description": "Extension for TimelapseNow", + "symbols": { + "Framework": { + "type": "parameter", + "description": "The target framework for the project.", + "datatype": "choice", + "choices": [ + { + "choice": "net6.0", + "description": "Target net6.0" + } + ], + "replaces": "net6.0", + "defaultValue": "net6.0" + } + } + } \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/F#/Extension.fs b/Timelapse.ProjectTemplates/templates/F#/Extension.fs new file mode 100644 index 0000000..ea38dc9 --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/F#/Extension.fs @@ -0,0 +1,10 @@ +namespace TimelapseExtension0001 +open TimelapseApi +open System + +type TimelapseExtension0001() = inherit TimelapseExtension() +override this.Name + with get () = "TimelapseExtension0001" + +override this.Id + with get () = Guid.Parse("{1cb8b576-e2e8-44d5-a8e1-e25a47eb0564}") //https://duckduckgo.com/?q=guid&t=ffab&ia=answer diff --git a/Timelapse.ProjectTemplates/templates/F#/TimelapseExtension0001.fsproj b/Timelapse.ProjectTemplates/templates/F#/TimelapseExtension0001.fsproj new file mode 100644 index 0000000..38f2ae4 --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/F#/TimelapseExtension0001.fsproj @@ -0,0 +1,15 @@ + + + + net6.0 + TimelapseExtension0001 + true + + + + + + + + + diff --git a/Timelapse.ProjectTemplates/templates/F#/extension_info.json b/Timelapse.ProjectTemplates/templates/F#/extension_info.json new file mode 100644 index 0000000..37d4a4f --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/F#/extension_info.json @@ -0,0 +1,6 @@ +{ + "name": "TimelapseExtension0001", + "author": "YourNameOrCompanyName", + "version": "1.0.0", + "description": "Some Description" +} \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/VB/.template.config/template.json b/Timelapse.ProjectTemplates/templates/VB/.template.config/template.json new file mode 100644 index 0000000..d73dede --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/VB/.template.config/template.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/template", + "sourceName": "TimelapseExtension0001", + "defaultName": "TimelapseExtension", + "author": "Tesses", + "classifications": [ "Common", "Library","Desktop" ], + "identity": "Timelapse.ExtensionLibrary", + "name": "Timelapse templates: Extension", + "shortName": "timelapseext", + "tags": { + "language": "VB", + "type": "project" + }, + "description": "Extension for TimelapseNow", + "symbols": { + "Framework": { + "type": "parameter", + "description": "The target framework for the project.", + "datatype": "choice", + "choices": [ + { + "choice": "net6.0", + "description": "Target net6.0" + } + ], + "replaces": "net6.0", + "defaultValue": "net6.0" + } + } + } \ No newline at end of file diff --git a/Timelapse.ProjectTemplates/templates/VB/Extension.vb b/Timelapse.ProjectTemplates/templates/VB/Extension.vb new file mode 100644 index 0000000..2e2b025 --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/VB/Extension.vb @@ -0,0 +1,17 @@ +Imports TimelapseApi +Imports System + Public Class TimelapseExtension0001 + Inherits TimelapseExtension + + Public Overrides ReadOnly Property Name As String + Get + Return "TimelapseExtension0001" + End Get + End Property + + Public Overrides ReadOnly Property Id As Guid + Get + Return Guid.Parse("{1cb8b576-e2e8-44d5-a8e1-e25a47eb0564}") + End Get + End Property + End Class diff --git a/Timelapse.ProjectTemplates/templates/VB/TimelapseExtension0001.vbproj b/Timelapse.ProjectTemplates/templates/VB/TimelapseExtension0001.vbproj new file mode 100644 index 0000000..3cea71b --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/VB/TimelapseExtension0001.vbproj @@ -0,0 +1,8 @@ + + + + TimelapseExtension0001 + net6.0 + + + diff --git a/Timelapse.ProjectTemplates/templates/VB/extension_info.json b/Timelapse.ProjectTemplates/templates/VB/extension_info.json new file mode 100644 index 0000000..37d4a4f --- /dev/null +++ b/Timelapse.ProjectTemplates/templates/VB/extension_info.json @@ -0,0 +1,6 @@ +{ + "name": "TimelapseExtension0001", + "author": "YourNameOrCompanyName", + "version": "1.0.0", + "description": "Some Description" +} \ No newline at end of file diff --git a/Timelapse.Windows/Program.cs b/Timelapse.Windows/Program.cs new file mode 100644 index 0000000..bd812df --- /dev/null +++ b/Timelapse.Windows/Program.cs @@ -0,0 +1,13 @@ +namespace Timelapse; +using Eto.Forms; +using System; + +public class Program +{ + [STAThread] + public static void Main(string[] args) + { + + new Application().Run(new MainForm(args) {Width=640,Height=480, Title="Timelapse Now"}); + } +} \ No newline at end of file diff --git a/Timelapse.Windows/Timelapse.Windows.csproj b/Timelapse.Windows/Timelapse.Windows.csproj new file mode 100644 index 0000000..1cab64e --- /dev/null +++ b/Timelapse.Windows/Timelapse.Windows.csproj @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + WinExe + net6.0-windows + enable + true + favicon.ico + + + + diff --git a/Timelapse.Windows/favicon.ico b/Timelapse.Windows/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..aaece233eb5fcf15fff8e0b0092fc1ffd38406a2 GIT binary patch literal 4286 zcmcgwYiv|i5I%RiL63=v2~f0>9sjFBQg>Ko_+iAANnwiE$HkWyCLQlLxG zLTR*ug(?aaQb8m@#P}e_7zzHdLJ?5`ACcm=v=FxJetvWAJ-xTP-Q6mQ+f3&?X1;G` z&YZiqRm$Seh!IMDtDUzfHApEnhQcNFAVt>ohkMDNIFu3r0P3*sMPik)RHuXrv>psuSZ}8 z+;i7A^|&{27@G+Est`A+Ao^4HR}0Wj=GGhx^gWD$RtN*MWOKX>H~W@xe}0#(?Gw}( zN=2Ob47Sld#T(*DG zd~G>ux7Q#z>2)knf1rYPrH+sIj#G=7dusmVvvT?GV$I8m@ro~oVs#Z$Zmq&c2lpTx z4rA!;!!Ty_7z`ac3{xiu@b&S}ke^+GLgrk?7*?rH?JF4R_|xTY_{;rZeVdS<7eu7B z1$}SmM@-dC_BHND_JG ze)RG8(c`@z?!(UA?_iRuMOf$GJAS+V-hTAf-{xPV^Zy=mXBMKRfKe^s+FG?&HzvE2*oBEeB{}wSawYRh$G++q6 zIrbGwiq>I`3PibF>mQBtu2t1FAKvTP}K zAE-yTvI_c=jPaGi98q|GM|ToP*1Mx3vfx$SdbBQrQQ*+ZXW2kPvdmmLm7g zGE5s?jz{lUhUcu$QOUfeSLM7!i|;+w^Ta%v;{JQj-JF9w^EtLoW0ZQ9clr!_uNiYG z(t|-hkLIxs`RX)gQ$)|9O@aD_HYc^6ZQHDUN2zCs^`ni++`8v$IK6R@-;(vS7&-iY z%$hbId6R>fIc2_1ZjMj+MqD||Lj>|am z$*0(|Wh3hAYf$(0Cha4>mYP5uVrfiopBYZCHv6Ve<@;Kgquhvb@GkWUD z0QZY1?^52PY@vuRF*J9k+$9e0`zgotlfD(P`{y_cg3IwiLoIWx#`bNSQCGJayLMJ% z{C&mrkMViz`iP%>mwLnPt%Dg$Jvu4!E*o{QzT{Z`Hrq-udDd`z&e@lDPvaxn)YM>J zkLI&cYQpSA>IJQHI`oXhu)#Ff16-U~Z!`F@i8 show) + { + ShowDialog = show; + Text = text; + } + public Func ShowDialog {get;set;} + public string Text {get;set;} + public override string ToString() + { + return Text.ToString(); + } + } + public ExportWindow(Form main,Api instance,GuiData guiData,bool share) + { + Title=share ? "Export and Share" : "Export"; + DynamicLayout lyt=new DynamicLayout(); + lyt.BeginHorizontal(); + lyt.BeginVertical(); + Button acceptBtn =new Button() + { + Text=share ? "Export and Share" : "Export", + Enabled=false + }; + ObservableCollection shares=new ObservableCollection(); + + List exports=new List(); + DropDown export = new DropDown(); + lyt.Add(export,true); + DropDown shareDD = new DropDown() {Enabled=false,DataStore=shares}; + if(share) + { + lyt.EndBeginHorizontal(); + lyt.Add(shareDD); + } + lyt.EndHorizontal(); + + lyt.EndBeginVertical(); + lyt.AddSpace(true,true); + lyt.BeginHorizontal(); + lyt.AddSpace(true); + lyt.Add(acceptBtn); + lyt.EndHorizontal(); + lyt.EndVertical(); + + this.Content=lyt; + + + if(guiData.Export != null) + { + foreach(var item in guiData.Export) + { + exports.Add(new Export(item.Text)); + } + export.DataStore=exports; + export.SelectedIndexChanged += (sender,e)=>{ + int index=export.SelectedIndex; + if(index > -1 && exports.Count > 0) + { + if(share) + { + acceptBtn.Enabled=false; + shareDD.Enabled=true; + shares.Clear(); + if(guiData.Share != null) + { + + + foreach(var item in guiData.Share) + { + var j=new Share(item.Text,item.ShareActionAsync); + shares.Add(j); + } + } + + }else{ + acceptBtn.Enabled=true; + } + } else { + acceptBtn.Enabled=false; + shareDD.Enabled=false; + } + }; + + + shareDD.SelectedIndexChanged+=(sender,e)=>{ + int index=shareDD.SelectedIndex; + + acceptBtn.Enabled=index > -1 && shares.Count > 0; + + }; + + acceptBtn.Click += async (sender,e)=>{ + int pos = export.SelectedIndex; + + Func? dlg=null; + if(share) + dlg=shares[shareDD.SelectedIndex].ShowDialog; + + var filename= await instance.Export(main,pos); + + if(share && dlg != null && !string.IsNullOrWhiteSpace(filename) && File.Exists(filename)) + { + await dlg(main,filename); + } + }; + } + } +} \ No newline at end of file diff --git a/Timelapse/NewFrameEventArgs.cs b/Timelapse/NewFrameEventArgs.cs new file mode 100644 index 0000000..6ccd45c --- /dev/null +++ b/Timelapse/NewFrameEventArgs.cs @@ -0,0 +1,14 @@ +namespace Timelapse.Desktop; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +public class NewFrameEventArgs : EventArgs +{ + public NewFrameEventArgs(Image img) + { + Image=img; + + } + + public Image Image {get;internal set;} + +} \ No newline at end of file diff --git a/Timelapse/PictureBox.cs b/Timelapse/PictureBox.cs new file mode 100644 index 0000000..19dbb32 --- /dev/null +++ b/Timelapse/PictureBox.cs @@ -0,0 +1,80 @@ +using Eto.Drawing; +using Eto.Forms; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; +using TimelapseApi; + +namespace Timelapse.Desktop; + + +public class PictureBox : Panel +{ + LockObj lockObj=LockObj.Create(); + ImageView view =new ImageView(); + public PictureBox() + { + this.Content=view; + this.SizeChanged+=(sender,e)=>{ + Resize(); + + }; + } + private void SetImage(Stream strm) + { + if(view.Image != null && !view.Image.IsDisposed) + { + view.Image.Dispose(); + } + view.Image = new Bitmap(strm); + } + private Image? img=null; + public Image? Image {get {return img;} set{ if(value !=null){SetImage(value);}}} + + public void SetImage(Image image) + { + lockObj.Lock(()=>{ + img=image; + if(img !=null) + { + using(var img2=img.Clone()) + { + img2.Mutate((e)=>{ + e.Resize(Width <= 0 ? 640 : Width,Height <= 0 ? 480 : Height,false); + }); + MemoryStream strm=new MemoryStream(); + img2.SaveAsBmp(strm); + strm.Position=0; + SetImage(strm); + } + } + }); + + + } + + + public void Resize() + { + lockObj.Lock(()=>{ + try{ + if(img !=null) + { + using(var img2=img.Clone()) + { + img2.Mutate((e)=>{ + e.Resize(Width <= 0 ? 640 : Width,Height <= 0 ? 480 : Height,false); + }); + MemoryStream strm=new MemoryStream(); + img2.SaveAsBmp(strm); + strm.Position=0; + SetImage(strm); + } + } + }catch(Exception ex) + { + _=ex; + } + }); + } +} \ No newline at end of file diff --git a/Timelapse/Program.cs b/Timelapse/Program.cs new file mode 100644 index 0000000..cc2d041 --- /dev/null +++ b/Timelapse/Program.cs @@ -0,0 +1,433 @@ +using System.Net; +using System.Net.Sockets; +using Eto.Drawing; +using Eto.Forms; +using FlashCap; +using FlashCap.Utilities; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Timelapse.Desktop; +using TimelapseApi; +using Image = SixLabors.ImageSharp.Image; +using System.Reflection; + +public class MainForm : Form +{ + TimelapseWebServer? svr; + string[] args; + public GuiData Gui {get;set;} + public Api Instance {get;set;} + + public SynchronizationContext? synchContext; + + // Constructed capture device. + private CaptureDevice? captureDevice; + private PictureBox d; + private CheckCommand record; + private CheckCommand oneX; + public MainForm(string[] args) + { + var asm=Assembly.GetExecutingAssembly(); + + var strm=asm.GetManifestResourceStream("Timelapse.ServerFiles.favicon.ico"); + if(strm != null) + { + this.Icon = new Icon(strm); + } + + record=new CheckCommand{ + MenuText="&Record", + ToolBarText="Record" + }; + + oneX = new CheckCommand{ + MenuText="&Real Time", + ToolBarText="Real Time" + }; + this.args=args; + Gui=new GuiData(); + + + + Instance=new Api(Gui); + Gui.Instance=Instance; + Gui.CurrentFSIndex=0; + Gui.Set().Wait(); + d=new PictureBox(); + } + + public void CreateMenu() + { + Command close = new Command((sender,e)=>{Environment.Exit(0);}); + close.MenuText="&Exit"; + + Instance.RealTimeChanged += RealTime_Changed; + Instance.RecordingChanged += Recording_Changed; + Instance.ProjectOpened += ProjectOpened; + Instance.ProjectClosed += ProjectClosed; + record.CheckedChanged += Record_CheckedChanged; + oneX.CheckedChanged += RealTime_CheckedChanged; + NewFrame += NewFrameEvent; + Command export=new Command(async(sender,e)=>{ + using(ExportWindow window = new ExportWindow(this,Instance,Gui,false)) + { + await window.ShowModalAsync(this); + } + }){ + MenuText="&Export Project", + ToolBarText="Export" + }; + Command share = new Command(async(sender,e)=>{ + using(ExportWindow window = new ExportWindow(this,Instance,Gui,true)) + { + await window.ShowModalAsync(this); + } + }){ + MenuText="&Share Project", + ToolBarText="Share" + }; + Command changeProjectSettings = new Command(async(sender,e)=>{ + var p = Instance.Project; + if(p != null) + { + Instance.Project=null; + using(TimelapseProjectSettings settings=new TimelapseProjectSettings(p)) + await settings.ShowModalAsync(this); + + p.Save(); + Instance.Project=p; + } + }){ + MenuText="&Project Settings", + ToolBarText="Project" + + }; + + + Command newProject=new Command(async(sender,e)=>{ + + var cfs=Gui.CurrentFileSystem; + if(cfs != null) + { + string? path=cfs.ShowSaveDialog(this,new FileFilter[]{new FileFilter("Timelapse Project",".tlnp")}); + if(!string.IsNullOrWhiteSpace(path)) + { + string? changed=Path.ChangeExtension(path,""); + if(!string.IsNullOrWhiteSpace(changed)) + { + var ss= cfs+changed.Substring(0,changed.Length-1); + if(ss != null) + { + + var proj=new TimelapseProject(); + + proj.ProjectLocation=ss; + using(TimelapseProjectSettings settings=new TimelapseProjectSettings(proj)) + await settings.ShowModalAsync(this); + proj.Save(); + Instance.Project = proj; + + } + } + + } + } + + + }){ + MenuText="&New Project", + ToolBarText="New" + }; + + Command openProject=new Command((sender,e)=>{ + var cfs=Gui.CurrentFileSystem; + if(cfs != null) + { + string? path=cfs.ShowOpenDialog(this,new FileFilter[]{new FileFilter("Timelapse Project",".tlnp")}); + if(!string.IsNullOrWhiteSpace(path)) + { + if(cfs.FileExists(path)) + { + + string? changed=Path.ChangeExtension(path,""); + if(!string.IsNullOrWhiteSpace(changed)) + { + var ss= cfs+changed.Substring(0,changed.Length-1); + if(ss != null) + { + Instance.Project = TimelapseProject.Open(ss); + } + } + } + } + } + }){ + MenuText="&Open Project", + ToolBarText="Open" + }; + + + + var FsItem = new ButtonMenuItem { + Text="File System", + }; + var gfs = Gui.FileSystems; + if(gfs != null){ + int i=0; + foreach(var fs in gfs) + { + int j=i++; + var rb =new RadioMenuItem(); + rb.Text=fs.Text; + rb.CheckedChanged+=(sender,e)=>{ + if(rb.Checked) + { + Gui.CurrentFSIndex=j; + Gui.FSChanged(); + } + }; + FsItem.Items.Add(rb); + } + } + var ExtSettings = new ButtonMenuItem { + Text="Extension Settings" + }; + var exts = Gui.ExtensionSettings; + Dictionary> extBtns=new Dictionary>(); + if(exts != null) + { + foreach(var item in exts) + { + if(!extBtns.ContainsKey(item.Extension)) + { + extBtns.Add(item.Extension,new List()); + } + var btn=new ButtonMenuItem{Text=item.Text}; + btn.Click += async(sender,e)=>{ + try{ + using(var dlg = item.Dialog()) + { + await dlg.ShowModalAsync(this); + } + }catch(Exception ex) + { + _=ex; + } + }; + extBtns[item.Extension].Add(btn); + } + foreach(var item in extBtns) + { + var btn = new ButtonMenuItem() {Text=item.Key.Name}; + foreach(var item2 in item.Value) + { + btn.Items.Add(item2); + } + ExtSettings.Items.Add(btn); + } + } + ToolBar = new ToolBar{ + Items = { + new ButtonToolItem(newProject), + new ButtonToolItem(openProject), + new SeparatorToolItem(), + new ButtonToolItem(export), + new ButtonToolItem(share), + new SeparatorToolItem(), + new ButtonToolItem(changeProjectSettings), + new CheckToolItem(record), + new CheckToolItem(oneX) + } + }; + + + Menu = new MenuBar { + QuitItem=new ButtonMenuItem(close), + ApplicationItems={ + new ButtonMenuItem(newProject), + new ButtonMenuItem(openProject), + new SeparatorMenuItem(), + new ButtonMenuItem(export), + new ButtonMenuItem(share), + + }, + Items={ + + new ButtonMenuItem { + Text="&Project", + Items={ + + new CheckMenuItem(record), + new CheckMenuItem(oneX), + new ButtonMenuItem(changeProjectSettings) + } + }, + new ButtonMenuItem + { + Text="&Options", + Items={ + FsItem, + ExtSettings + } + } + } + }; + } + + private void NewFrameEvent(object? sender, NewFrameEventArgs e) + { + if(synchContext != null) + synchContext.Post(_ => + { + // HACK: on .NET Core, will be leaked (or delayed GC?) + // So we could release manually before updates. + this.d.Image=e.Image; + d.Image.Dispose(); + }, null); + } + + protected override async void OnShown(EventArgs e) + { this.synchContext = SynchronizationContext.Current; + await SetCamera(); + CreateMenu(); + + + + + this.Content=d; + + + this.SizeChanged+=(sender,e)=>{ + d.Height = ClientSize.Height- d.Location.Y; + d.Width = ClientSize.Width-d.Location.X; + }; + } + public event EventHandler? NewFrame; + public async Task FrameChanged(Image image) + { + await Instance.SendFrame(image); + + NewFrame?.Invoke(this,new NewFrameEventArgs(image)); + + + } + public async Task SetCamera() + { + + TimelapseCamera? c=null; + using(SelectCamera camera=new SelectCamera()) + { + c=await camera.ShowModalAsync(this); + } + svr=new TimelapseWebServer(this); + Thread t = new Thread(()=>{ + svr.Listen(); + }); + t.Start(); + + if(c == null) + { + MessageBox.Show("You will need to restart app to record"); + return; + } + + //////////////////////////////////////////////// + // Initialize and start capture device + + // Enumerate capture devices: + + + // Use first device. + var descriptor0 =c.DeviceDescriptor; + if (descriptor0 != null) + { + var characteristics = c.VideoCharacteristics; + // Show status. + + // Open capture device: + if(characteristics != null){ + + this.captureDevice = await descriptor0.OpenAsync( + characteristics, + this.OnPixelBufferArrived); + + // Start capturing. + this.captureDevice.Start(); + } + } + } + private async void OnPixelBufferArrived(PixelBufferScope bufferScope) + { + + //////////////////////////////////////////////// + // Pixel buffer has arrived. + // NOTE: Perhaps this thread context is NOT UI thread. + + // Or, refer image data binary directly. + // (Advanced manipulation, see README.) + ArraySegment image = bufferScope.Buffer.ReferImage(); + + // Convert to Stream (using FlashCap.Utilities) + using (var stream = image.AsStream()) + { + // Decode image data to a bitmap: + + Image img = Image.Load(stream); + await FrameChanged(img); + + // `bitmap` is copied, so we can release pixel buffer now. + bufferScope.ReleaseNow(); + + // Switch to UI thread. + // HACK: Here is using `SynchronizationContext.Post()` instead of `Control.Invoke()`. + // Because in sensitive states when the form is closing, + // `Control.Invoke()` can fail with exception. + + } + } + + + private void Record_CheckedChanged(object? sender,EventArgs args) + { + Instance.RecordingChanged -= Recording_Changed; + Instance.Recording = record.Checked; + Instance.RecordingChanged += Recording_Changed; + } + private void RealTime_CheckedChanged(object? sender,EventArgs args) + { + Instance.RealTimeChanged -= RealTime_Changed; + Instance.RealTime = oneX.Checked; + Instance.RealTimeChanged += RealTime_Changed; + } + + private void Recording_Changed(object? sender,EventArgs args) + { + + record.CheckedChanged -= Record_CheckedChanged; + record.Checked = Instance.Recording; + record.CheckedChanged += Record_CheckedChanged; + } + private void RealTime_Changed(object? sender,EventArgs args) + { + oneX.CheckedChanged -= RealTime_CheckedChanged; + oneX.Checked = Instance.RealTime; + oneX.CheckedChanged += RealTime_CheckedChanged; + } + + public void ProjectClosed(object? sender,EventArgs args) + { + + + } + public void ProjectOpened(object? sender,EventArgs args) + { + + if(Instance.Project != null) + { + Instance.Recording=false; + + + } + } + +} \ No newline at end of file diff --git a/Timelapse/ProjectSettings.cs b/Timelapse/ProjectSettings.cs new file mode 100644 index 0000000..1d378c3 --- /dev/null +++ b/Timelapse/ProjectSettings.cs @@ -0,0 +1,128 @@ +using FlashCap.Devices; +using FlashCap.Utilities; +using FlashCap; +using Eto.Forms; +using TimelapseApi; +using System.Collections.ObjectModel; + +namespace Timelapse.Desktop +{ + public class TimeSpanControl : StackLayout + { + private NumericStepper[] steppers=new NumericStepper[] { + new NumericStepper {MinValue=0,MaxValue=int.MaxValue}, + new NumericStepper {MinValue=0,MaxValue=23}, + new NumericStepper {MinValue=0,MaxValue=60}, + new NumericStepper {MinValue=0,MaxValue=60} + }; + private Label[] lbls=new Label[] { + new Label {Text="Days: "}, + new Label {Text="Hours: "}, + new Label {Text="Minutes: "}, + new Label {Text="Seconds: " } + }; + public TimeSpanControl() + { + foreach(var stepper in steppers) + { + stepper.ValueChanged += (sender,e)=>{ + ValueChanged?.Invoke(this,EventArgs.Empty); + }; + } + Orientation=Orientation.Vertical; + StackLayout lyt=new StackLayout {Orientation = Orientation.Horizontal}; + lyt.Items.Add(lbls[0]); + lyt.Items.Add(steppers[0]); + lyt.Items.Add(lbls[1]); + lyt.Items.Add(steppers[1]); + Items.Add(lyt); + lyt=new StackLayout {Orientation=Orientation.Horizontal}; + lyt.Items.Add(lbls[2]); + lyt.Items.Add(steppers[2]); + lyt.Items.Add(lbls[3]); + lyt.Items.Add(steppers[3]); + Items.Add(lyt); + } + public event EventHandler? ValueChanged; + public TimeSpan Value {get {return new TimeSpan((int)steppers[0].Value,(int)steppers[1].Value,(int)steppers[2].Value,(int)steppers[3].Value);} set { steppers[0].Value=value.Days; steppers[1].Value = value.Hours; steppers[2].Value=value.Minutes; steppers[3].Value = value.Seconds; }} + } + + public class TimelapseProjectSettings : Dialog + { + public TimelapseProjectSettings(TimelapseProject proj) + { + + Title="Project Settings"; + Button saveBtn=new Button {Text="Save"}; + ComboBox cbox=new ComboBox(); + + + if(proj.ProjectLocation!= null && proj.ProjectLocation.DirectoryExists("Sections")) + + foreach(var f in proj.ProjectLocation.GetDirectories("Sections")) + { + cbox.Items.Add(f); + } + + cbox.Text = proj.SectionName; + cbox.TextChanged += (sender,e)=>{ + proj.SectionName =cbox.Text; + }; + + + DynamicLayout lyt=new DynamicLayout(); + lyt.BeginVertical(); + lyt.BeginHorizontal(); + lyt.Add(new Label {Text="Section name:"}); + lyt.EndBeginHorizontal(); + lyt.Add(cbox,true); + lyt.EndBeginHorizontal(); + + TabControl control = new TabControl(); + + TimeSpanControl ctl=new TimeSpanControl(); + ctl.Value = proj.Interval; + ctl.ValueChanged += (sender,e)=>{ + proj.Interval = ctl.Value; + }; + StackLayout lyt0=new StackLayout(); + lyt0.Orientation = Orientation.Vertical; + lyt0.Items.Add(new Label {Text="Estimated Project Length:"}); + TimeSpanControl estProjLen = new TimeSpanControl(); + estProjLen.Value=proj.Interval.EstimatedProjectLength; + estProjLen.ValueChanged += (sender,e)=>{ + proj.Interval.EstimatedProjectLength = estProjLen.Value; + }; + lyt0.Items.Add(estProjLen); + lyt0.Items.Add(new Label {Text="Estimated Video Length:"}); + TimeSpanControl estVidLen = new TimeSpanControl(); + estVidLen.Value=proj.Interval.EstimatedVideoLength; + estVidLen.ValueChanged += (sender,e)=>{ + proj.Interval.EstimatedVideoLength = estVidLen.Value; + }; + lyt0.Items.Add(estVidLen); + + control.Pages.Add(new TabPage {Content=lyt0,Text="Estimated"}); + control.Pages.Add(new TabPage {Content=ctl,Text="Interval"}); + control.SelectedIndex = proj.Interval.UseEstimated ? 0 : 1; + control.SelectedIndexChanged += (sender,e)=>{ + proj.Interval.UseEstimated = control.SelectedIndex == 1; + }; + lyt.Add(control,true); + lyt.EndHorizontal(); + lyt.EndBeginVertical(); + lyt.BeginHorizontal(); + + lyt.AddSpace(true); + lyt.Add(saveBtn); + lyt.EndHorizontal(); + lyt.EndVertical(); + + saveBtn.Click += (sender,e)=>{ + this.Close(); + }; + Content=lyt; + Resizable=true; + } + } +} \ No newline at end of file diff --git a/Timelapse/SelectCamera.cs b/Timelapse/SelectCamera.cs new file mode 100644 index 0000000..690bbb9 --- /dev/null +++ b/Timelapse/SelectCamera.cs @@ -0,0 +1,116 @@ +using FlashCap.Devices; +using FlashCap.Utilities; +using FlashCap; +using Eto.Forms; +using TimelapseApi; +using System.Collections.ObjectModel; + +namespace Timelapse.Desktop +{ + public class SelectCamera : Dialog + { + public class CameraObject + { + public CameraObject(CaptureDeviceDescriptor desc) + { + Descriptor=desc; + } + public CaptureDeviceDescriptor Descriptor {get;set;} + + + + public override string ToString() + { + + return Descriptor.Name; + + } + + } + public class CharacteristicsObject + { + public CharacteristicsObject(VideoCharacteristics chr) + { + Characteristics=chr; + } + public VideoCharacteristics Characteristics {get;set;} + public override string ToString() + { + + return Characteristics.ToString(); + } + } + public SelectCamera() + { + + this.Title="Select Camera"; + + Button accept=new Button(){Text="Select",Enabled=false}; + DropDown cameraSelector = new DropDown(); + + DropDown characteristicsSelector=new DropDown(); + var devices = new CaptureDevices(); + + List cobj=new List(); + ObservableCollection chrobj=new ObservableCollection(); + foreach (var descriptor in devices.EnumerateDescriptors()) + { + if(descriptor.Characteristics.Length >0) + { + cobj.Add(new CameraObject(descriptor)); + } + } + + cameraSelector.DataStore=cobj; + characteristicsSelector.DataStore=chrobj; + characteristicsSelector.Enabled=false; + characteristicsSelector.SelectedIndexChanged+=(sender,e)=> + { + accept.Enabled=characteristicsSelector.SelectedIndex > -1; + }; + cameraSelector.SelectedIndexChanged += (sender,e)=>{ + if(cameraSelector.SelectedIndex > -1) + { + + characteristicsSelector.Enabled=true; + chrobj.Clear(); + foreach(var item in cobj[cameraSelector.SelectedIndex].Descriptor.Characteristics) + { + chrobj.Add(new CharacteristicsObject(item)); + } + } + }; + bool close=false; + accept.Click +=(sender,e)=>{ + int cSI=cameraSelector.SelectedIndex; + int charSI = characteristicsSelector.SelectedIndex; + if(cSI > -1 && cobj.Count > 0 && charSI > -1 && chrobj.Count > 0) + { + Result=new TimelapseCamera(cobj[cSI].Descriptor,chrobj[charSI].Characteristics); + + close=true; + Close(); + } + }; + Closing += (sender,e)=>{ + if(!close) + { + Result=null; + + } + }; + DynamicLayout lyt=new DynamicLayout(); + lyt.BeginVertical(); + lyt.BeginHorizontal(); + lyt.Add(cameraSelector,true); + lyt.EndBeginHorizontal(); + lyt.Add(characteristicsSelector); + lyt.EndBeginHorizontal(); + lyt.Add(accept); + lyt.EndHorizontal(); + lyt.EndVertical(); + + this.Content=lyt; + } + } +} \ No newline at end of file diff --git a/Timelapse/ServerFiles/LICENSE b/Timelapse/ServerFiles/LICENSE new file mode 100644 index 0000000..fcff17e --- /dev/null +++ b/Timelapse/ServerFiles/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2018 Materialize + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Timelapse/ServerFiles/css/materialize.css b/Timelapse/ServerFiles/css/materialize.css new file mode 100644 index 0000000..bc6c1fe --- /dev/null +++ b/Timelapse/ServerFiles/css/materialize.css @@ -0,0 +1,9067 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red { + background-color: #e51c23 !important; +} + +.materialize-red-text { + color: #e51c23 !important; +} + +.materialize-red.lighten-5 { + background-color: #fdeaeb !important; +} + +.materialize-red-text.text-lighten-5 { + color: #fdeaeb !important; +} + +.materialize-red.lighten-4 { + background-color: #f8c1c3 !important; +} + +.materialize-red-text.text-lighten-4 { + color: #f8c1c3 !important; +} + +.materialize-red.lighten-3 { + background-color: #f3989b !important; +} + +.materialize-red-text.text-lighten-3 { + color: #f3989b !important; +} + +.materialize-red.lighten-2 { + background-color: #ee6e73 !important; +} + +.materialize-red-text.text-lighten-2 { + color: #ee6e73 !important; +} + +.materialize-red.lighten-1 { + background-color: #ea454b !important; +} + +.materialize-red-text.text-lighten-1 { + color: #ea454b !important; +} + +.materialize-red.darken-1 { + background-color: #d0181e !important; +} + +.materialize-red-text.text-darken-1 { + color: #d0181e !important; +} + +.materialize-red.darken-2 { + background-color: #b9151b !important; +} + +.materialize-red-text.text-darken-2 { + color: #b9151b !important; +} + +.materialize-red.darken-3 { + background-color: #a21318 !important; +} + +.materialize-red-text.text-darken-3 { + color: #a21318 !important; +} + +.materialize-red.darken-4 { + background-color: #8b1014 !important; +} + +.materialize-red-text.text-darken-4 { + color: #8b1014 !important; +} + +.red { + background-color: #F44336 !important; +} + +.red-text { + color: #F44336 !important; +} + +.red.lighten-5 { + background-color: #FFEBEE !important; +} + +.red-text.text-lighten-5 { + color: #FFEBEE !important; +} + +.red.lighten-4 { + background-color: #FFCDD2 !important; +} + +.red-text.text-lighten-4 { + color: #FFCDD2 !important; +} + +.red.lighten-3 { + background-color: #EF9A9A !important; +} + +.red-text.text-lighten-3 { + color: #EF9A9A !important; +} + +.red.lighten-2 { + background-color: #E57373 !important; +} + +.red-text.text-lighten-2 { + color: #E57373 !important; +} + +.red.lighten-1 { + background-color: #EF5350 !important; +} + +.red-text.text-lighten-1 { + color: #EF5350 !important; +} + +.red.darken-1 { + background-color: #E53935 !important; +} + +.red-text.text-darken-1 { + color: #E53935 !important; +} + +.red.darken-2 { + background-color: #D32F2F !important; +} + +.red-text.text-darken-2 { + color: #D32F2F !important; +} + +.red.darken-3 { + background-color: #C62828 !important; +} + +.red-text.text-darken-3 { + color: #C62828 !important; +} + +.red.darken-4 { + background-color: #B71C1C !important; +} + +.red-text.text-darken-4 { + color: #B71C1C !important; +} + +.red.accent-1 { + background-color: #FF8A80 !important; +} + +.red-text.text-accent-1 { + color: #FF8A80 !important; +} + +.red.accent-2 { + background-color: #FF5252 !important; +} + +.red-text.text-accent-2 { + color: #FF5252 !important; +} + +.red.accent-3 { + background-color: #FF1744 !important; +} + +.red-text.text-accent-3 { + color: #FF1744 !important; +} + +.red.accent-4 { + background-color: #D50000 !important; +} + +.red-text.text-accent-4 { + color: #D50000 !important; +} + +.pink { + background-color: #e91e63 !important; +} + +.pink-text { + color: #e91e63 !important; +} + +.pink.lighten-5 { + background-color: #fce4ec !important; +} + +.pink-text.text-lighten-5 { + color: #fce4ec !important; +} + +.pink.lighten-4 { + background-color: #f8bbd0 !important; +} + +.pink-text.text-lighten-4 { + color: #f8bbd0 !important; +} + +.pink.lighten-3 { + background-color: #f48fb1 !important; +} + +.pink-text.text-lighten-3 { + color: #f48fb1 !important; +} + +.pink.lighten-2 { + background-color: #f06292 !important; +} + +.pink-text.text-lighten-2 { + color: #f06292 !important; +} + +.pink.lighten-1 { + background-color: #ec407a !important; +} + +.pink-text.text-lighten-1 { + color: #ec407a !important; +} + +.pink.darken-1 { + background-color: #d81b60 !important; +} + +.pink-text.text-darken-1 { + color: #d81b60 !important; +} + +.pink.darken-2 { + background-color: #c2185b !important; +} + +.pink-text.text-darken-2 { + color: #c2185b !important; +} + +.pink.darken-3 { + background-color: #ad1457 !important; +} + +.pink-text.text-darken-3 { + color: #ad1457 !important; +} + +.pink.darken-4 { + background-color: #880e4f !important; +} + +.pink-text.text-darken-4 { + color: #880e4f !important; +} + +.pink.accent-1 { + background-color: #ff80ab !important; +} + +.pink-text.text-accent-1 { + color: #ff80ab !important; +} + +.pink.accent-2 { + background-color: #ff4081 !important; +} + +.pink-text.text-accent-2 { + color: #ff4081 !important; +} + +.pink.accent-3 { + background-color: #f50057 !important; +} + +.pink-text.text-accent-3 { + color: #f50057 !important; +} + +.pink.accent-4 { + background-color: #c51162 !important; +} + +.pink-text.text-accent-4 { + color: #c51162 !important; +} + +.purple { + background-color: #9c27b0 !important; +} + +.purple-text { + color: #9c27b0 !important; +} + +.purple.lighten-5 { + background-color: #f3e5f5 !important; +} + +.purple-text.text-lighten-5 { + color: #f3e5f5 !important; +} + +.purple.lighten-4 { + background-color: #e1bee7 !important; +} + +.purple-text.text-lighten-4 { + color: #e1bee7 !important; +} + +.purple.lighten-3 { + background-color: #ce93d8 !important; +} + +.purple-text.text-lighten-3 { + color: #ce93d8 !important; +} + +.purple.lighten-2 { + background-color: #ba68c8 !important; +} + +.purple-text.text-lighten-2 { + color: #ba68c8 !important; +} + +.purple.lighten-1 { + background-color: #ab47bc !important; +} + +.purple-text.text-lighten-1 { + color: #ab47bc !important; +} + +.purple.darken-1 { + background-color: #8e24aa !important; +} + +.purple-text.text-darken-1 { + color: #8e24aa !important; +} + +.purple.darken-2 { + background-color: #7b1fa2 !important; +} + +.purple-text.text-darken-2 { + color: #7b1fa2 !important; +} + +.purple.darken-3 { + background-color: #6a1b9a !important; +} + +.purple-text.text-darken-3 { + color: #6a1b9a !important; +} + +.purple.darken-4 { + background-color: #4a148c !important; +} + +.purple-text.text-darken-4 { + color: #4a148c !important; +} + +.purple.accent-1 { + background-color: #ea80fc !important; +} + +.purple-text.text-accent-1 { + color: #ea80fc !important; +} + +.purple.accent-2 { + background-color: #e040fb !important; +} + +.purple-text.text-accent-2 { + color: #e040fb !important; +} + +.purple.accent-3 { + background-color: #d500f9 !important; +} + +.purple-text.text-accent-3 { + color: #d500f9 !important; +} + +.purple.accent-4 { + background-color: #aa00ff !important; +} + +.purple-text.text-accent-4 { + color: #aa00ff !important; +} + +.deep-purple { + background-color: #673ab7 !important; +} + +.deep-purple-text { + color: #673ab7 !important; +} + +.deep-purple.lighten-5 { + background-color: #ede7f6 !important; +} + +.deep-purple-text.text-lighten-5 { + color: #ede7f6 !important; +} + +.deep-purple.lighten-4 { + background-color: #d1c4e9 !important; +} + +.deep-purple-text.text-lighten-4 { + color: #d1c4e9 !important; +} + +.deep-purple.lighten-3 { + background-color: #b39ddb !important; +} + +.deep-purple-text.text-lighten-3 { + color: #b39ddb !important; +} + +.deep-purple.lighten-2 { + background-color: #9575cd !important; +} + +.deep-purple-text.text-lighten-2 { + color: #9575cd !important; +} + +.deep-purple.lighten-1 { + background-color: #7e57c2 !important; +} + +.deep-purple-text.text-lighten-1 { + color: #7e57c2 !important; +} + +.deep-purple.darken-1 { + background-color: #5e35b1 !important; +} + +.deep-purple-text.text-darken-1 { + color: #5e35b1 !important; +} + +.deep-purple.darken-2 { + background-color: #512da8 !important; +} + +.deep-purple-text.text-darken-2 { + color: #512da8 !important; +} + +.deep-purple.darken-3 { + background-color: #4527a0 !important; +} + +.deep-purple-text.text-darken-3 { + color: #4527a0 !important; +} + +.deep-purple.darken-4 { + background-color: #311b92 !important; +} + +.deep-purple-text.text-darken-4 { + color: #311b92 !important; +} + +.deep-purple.accent-1 { + background-color: #b388ff !important; +} + +.deep-purple-text.text-accent-1 { + color: #b388ff !important; +} + +.deep-purple.accent-2 { + background-color: #7c4dff !important; +} + +.deep-purple-text.text-accent-2 { + color: #7c4dff !important; +} + +.deep-purple.accent-3 { + background-color: #651fff !important; +} + +.deep-purple-text.text-accent-3 { + color: #651fff !important; +} + +.deep-purple.accent-4 { + background-color: #6200ea !important; +} + +.deep-purple-text.text-accent-4 { + color: #6200ea !important; +} + +.indigo { + background-color: #3f51b5 !important; +} + +.indigo-text { + color: #3f51b5 !important; +} + +.indigo.lighten-5 { + background-color: #e8eaf6 !important; +} + +.indigo-text.text-lighten-5 { + color: #e8eaf6 !important; +} + +.indigo.lighten-4 { + background-color: #c5cae9 !important; +} + +.indigo-text.text-lighten-4 { + color: #c5cae9 !important; +} + +.indigo.lighten-3 { + background-color: #9fa8da !important; +} + +.indigo-text.text-lighten-3 { + color: #9fa8da !important; +} + +.indigo.lighten-2 { + background-color: #7986cb !important; +} + +.indigo-text.text-lighten-2 { + color: #7986cb !important; +} + +.indigo.lighten-1 { + background-color: #5c6bc0 !important; +} + +.indigo-text.text-lighten-1 { + color: #5c6bc0 !important; +} + +.indigo.darken-1 { + background-color: #3949ab !important; +} + +.indigo-text.text-darken-1 { + color: #3949ab !important; +} + +.indigo.darken-2 { + background-color: #303f9f !important; +} + +.indigo-text.text-darken-2 { + color: #303f9f !important; +} + +.indigo.darken-3 { + background-color: #283593 !important; +} + +.indigo-text.text-darken-3 { + color: #283593 !important; +} + +.indigo.darken-4 { + background-color: #1a237e !important; +} + +.indigo-text.text-darken-4 { + color: #1a237e !important; +} + +.indigo.accent-1 { + background-color: #8c9eff !important; +} + +.indigo-text.text-accent-1 { + color: #8c9eff !important; +} + +.indigo.accent-2 { + background-color: #536dfe !important; +} + +.indigo-text.text-accent-2 { + color: #536dfe !important; +} + +.indigo.accent-3 { + background-color: #3d5afe !important; +} + +.indigo-text.text-accent-3 { + color: #3d5afe !important; +} + +.indigo.accent-4 { + background-color: #304ffe !important; +} + +.indigo-text.text-accent-4 { + color: #304ffe !important; +} + +.blue { + background-color: #2196F3 !important; +} + +.blue-text { + color: #2196F3 !important; +} + +.blue.lighten-5 { + background-color: #E3F2FD !important; +} + +.blue-text.text-lighten-5 { + color: #E3F2FD !important; +} + +.blue.lighten-4 { + background-color: #BBDEFB !important; +} + +.blue-text.text-lighten-4 { + color: #BBDEFB !important; +} + +.blue.lighten-3 { + background-color: #90CAF9 !important; +} + +.blue-text.text-lighten-3 { + color: #90CAF9 !important; +} + +.blue.lighten-2 { + background-color: #64B5F6 !important; +} + +.blue-text.text-lighten-2 { + color: #64B5F6 !important; +} + +.blue.lighten-1 { + background-color: #42A5F5 !important; +} + +.blue-text.text-lighten-1 { + color: #42A5F5 !important; +} + +.blue.darken-1 { + background-color: #1E88E5 !important; +} + +.blue-text.text-darken-1 { + color: #1E88E5 !important; +} + +.blue.darken-2 { + background-color: #1976D2 !important; +} + +.blue-text.text-darken-2 { + color: #1976D2 !important; +} + +.blue.darken-3 { + background-color: #1565C0 !important; +} + +.blue-text.text-darken-3 { + color: #1565C0 !important; +} + +.blue.darken-4 { + background-color: #0D47A1 !important; +} + +.blue-text.text-darken-4 { + color: #0D47A1 !important; +} + +.blue.accent-1 { + background-color: #82B1FF !important; +} + +.blue-text.text-accent-1 { + color: #82B1FF !important; +} + +.blue.accent-2 { + background-color: #448AFF !important; +} + +.blue-text.text-accent-2 { + color: #448AFF !important; +} + +.blue.accent-3 { + background-color: #2979FF !important; +} + +.blue-text.text-accent-3 { + color: #2979FF !important; +} + +.blue.accent-4 { + background-color: #2962FF !important; +} + +.blue-text.text-accent-4 { + color: #2962FF !important; +} + +.light-blue { + background-color: #03a9f4 !important; +} + +.light-blue-text { + color: #03a9f4 !important; +} + +.light-blue.lighten-5 { + background-color: #e1f5fe !important; +} + +.light-blue-text.text-lighten-5 { + color: #e1f5fe !important; +} + +.light-blue.lighten-4 { + background-color: #b3e5fc !important; +} + +.light-blue-text.text-lighten-4 { + color: #b3e5fc !important; +} + +.light-blue.lighten-3 { + background-color: #81d4fa !important; +} + +.light-blue-text.text-lighten-3 { + color: #81d4fa !important; +} + +.light-blue.lighten-2 { + background-color: #4fc3f7 !important; +} + +.light-blue-text.text-lighten-2 { + color: #4fc3f7 !important; +} + +.light-blue.lighten-1 { + background-color: #29b6f6 !important; +} + +.light-blue-text.text-lighten-1 { + color: #29b6f6 !important; +} + +.light-blue.darken-1 { + background-color: #039be5 !important; +} + +.light-blue-text.text-darken-1 { + color: #039be5 !important; +} + +.light-blue.darken-2 { + background-color: #0288d1 !important; +} + +.light-blue-text.text-darken-2 { + color: #0288d1 !important; +} + +.light-blue.darken-3 { + background-color: #0277bd !important; +} + +.light-blue-text.text-darken-3 { + color: #0277bd !important; +} + +.light-blue.darken-4 { + background-color: #01579b !important; +} + +.light-blue-text.text-darken-4 { + color: #01579b !important; +} + +.light-blue.accent-1 { + background-color: #80d8ff !important; +} + +.light-blue-text.text-accent-1 { + color: #80d8ff !important; +} + +.light-blue.accent-2 { + background-color: #40c4ff !important; +} + +.light-blue-text.text-accent-2 { + color: #40c4ff !important; +} + +.light-blue.accent-3 { + background-color: #00b0ff !important; +} + +.light-blue-text.text-accent-3 { + color: #00b0ff !important; +} + +.light-blue.accent-4 { + background-color: #0091ea !important; +} + +.light-blue-text.text-accent-4 { + color: #0091ea !important; +} + +.cyan { + background-color: #00bcd4 !important; +} + +.cyan-text { + color: #00bcd4 !important; +} + +.cyan.lighten-5 { + background-color: #e0f7fa !important; +} + +.cyan-text.text-lighten-5 { + color: #e0f7fa !important; +} + +.cyan.lighten-4 { + background-color: #b2ebf2 !important; +} + +.cyan-text.text-lighten-4 { + color: #b2ebf2 !important; +} + +.cyan.lighten-3 { + background-color: #80deea !important; +} + +.cyan-text.text-lighten-3 { + color: #80deea !important; +} + +.cyan.lighten-2 { + background-color: #4dd0e1 !important; +} + +.cyan-text.text-lighten-2 { + color: #4dd0e1 !important; +} + +.cyan.lighten-1 { + background-color: #26c6da !important; +} + +.cyan-text.text-lighten-1 { + color: #26c6da !important; +} + +.cyan.darken-1 { + background-color: #00acc1 !important; +} + +.cyan-text.text-darken-1 { + color: #00acc1 !important; +} + +.cyan.darken-2 { + background-color: #0097a7 !important; +} + +.cyan-text.text-darken-2 { + color: #0097a7 !important; +} + +.cyan.darken-3 { + background-color: #00838f !important; +} + +.cyan-text.text-darken-3 { + color: #00838f !important; +} + +.cyan.darken-4 { + background-color: #006064 !important; +} + +.cyan-text.text-darken-4 { + color: #006064 !important; +} + +.cyan.accent-1 { + background-color: #84ffff !important; +} + +.cyan-text.text-accent-1 { + color: #84ffff !important; +} + +.cyan.accent-2 { + background-color: #18ffff !important; +} + +.cyan-text.text-accent-2 { + color: #18ffff !important; +} + +.cyan.accent-3 { + background-color: #00e5ff !important; +} + +.cyan-text.text-accent-3 { + color: #00e5ff !important; +} + +.cyan.accent-4 { + background-color: #00b8d4 !important; +} + +.cyan-text.text-accent-4 { + color: #00b8d4 !important; +} + +.teal { + background-color: #009688 !important; +} + +.teal-text { + color: #009688 !important; +} + +.teal.lighten-5 { + background-color: #e0f2f1 !important; +} + +.teal-text.text-lighten-5 { + color: #e0f2f1 !important; +} + +.teal.lighten-4 { + background-color: #b2dfdb !important; +} + +.teal-text.text-lighten-4 { + color: #b2dfdb !important; +} + +.teal.lighten-3 { + background-color: #80cbc4 !important; +} + +.teal-text.text-lighten-3 { + color: #80cbc4 !important; +} + +.teal.lighten-2 { + background-color: #4db6ac !important; +} + +.teal-text.text-lighten-2 { + color: #4db6ac !important; +} + +.teal.lighten-1 { + background-color: #26a69a !important; +} + +.teal-text.text-lighten-1 { + color: #26a69a !important; +} + +.teal.darken-1 { + background-color: #00897b !important; +} + +.teal-text.text-darken-1 { + color: #00897b !important; +} + +.teal.darken-2 { + background-color: #00796b !important; +} + +.teal-text.text-darken-2 { + color: #00796b !important; +} + +.teal.darken-3 { + background-color: #00695c !important; +} + +.teal-text.text-darken-3 { + color: #00695c !important; +} + +.teal.darken-4 { + background-color: #004d40 !important; +} + +.teal-text.text-darken-4 { + color: #004d40 !important; +} + +.teal.accent-1 { + background-color: #a7ffeb !important; +} + +.teal-text.text-accent-1 { + color: #a7ffeb !important; +} + +.teal.accent-2 { + background-color: #64ffda !important; +} + +.teal-text.text-accent-2 { + color: #64ffda !important; +} + +.teal.accent-3 { + background-color: #1de9b6 !important; +} + +.teal-text.text-accent-3 { + color: #1de9b6 !important; +} + +.teal.accent-4 { + background-color: #00bfa5 !important; +} + +.teal-text.text-accent-4 { + color: #00bfa5 !important; +} + +.green { + background-color: #4CAF50 !important; +} + +.green-text { + color: #4CAF50 !important; +} + +.green.lighten-5 { + background-color: #E8F5E9 !important; +} + +.green-text.text-lighten-5 { + color: #E8F5E9 !important; +} + +.green.lighten-4 { + background-color: #C8E6C9 !important; +} + +.green-text.text-lighten-4 { + color: #C8E6C9 !important; +} + +.green.lighten-3 { + background-color: #A5D6A7 !important; +} + +.green-text.text-lighten-3 { + color: #A5D6A7 !important; +} + +.green.lighten-2 { + background-color: #81C784 !important; +} + +.green-text.text-lighten-2 { + color: #81C784 !important; +} + +.green.lighten-1 { + background-color: #66BB6A !important; +} + +.green-text.text-lighten-1 { + color: #66BB6A !important; +} + +.green.darken-1 { + background-color: #43A047 !important; +} + +.green-text.text-darken-1 { + color: #43A047 !important; +} + +.green.darken-2 { + background-color: #388E3C !important; +} + +.green-text.text-darken-2 { + color: #388E3C !important; +} + +.green.darken-3 { + background-color: #2E7D32 !important; +} + +.green-text.text-darken-3 { + color: #2E7D32 !important; +} + +.green.darken-4 { + background-color: #1B5E20 !important; +} + +.green-text.text-darken-4 { + color: #1B5E20 !important; +} + +.green.accent-1 { + background-color: #B9F6CA !important; +} + +.green-text.text-accent-1 { + color: #B9F6CA !important; +} + +.green.accent-2 { + background-color: #69F0AE !important; +} + +.green-text.text-accent-2 { + color: #69F0AE !important; +} + +.green.accent-3 { + background-color: #00E676 !important; +} + +.green-text.text-accent-3 { + color: #00E676 !important; +} + +.green.accent-4 { + background-color: #00C853 !important; +} + +.green-text.text-accent-4 { + color: #00C853 !important; +} + +.light-green { + background-color: #8bc34a !important; +} + +.light-green-text { + color: #8bc34a !important; +} + +.light-green.lighten-5 { + background-color: #f1f8e9 !important; +} + +.light-green-text.text-lighten-5 { + color: #f1f8e9 !important; +} + +.light-green.lighten-4 { + background-color: #dcedc8 !important; +} + +.light-green-text.text-lighten-4 { + color: #dcedc8 !important; +} + +.light-green.lighten-3 { + background-color: #c5e1a5 !important; +} + +.light-green-text.text-lighten-3 { + color: #c5e1a5 !important; +} + +.light-green.lighten-2 { + background-color: #aed581 !important; +} + +.light-green-text.text-lighten-2 { + color: #aed581 !important; +} + +.light-green.lighten-1 { + background-color: #9ccc65 !important; +} + +.light-green-text.text-lighten-1 { + color: #9ccc65 !important; +} + +.light-green.darken-1 { + background-color: #7cb342 !important; +} + +.light-green-text.text-darken-1 { + color: #7cb342 !important; +} + +.light-green.darken-2 { + background-color: #689f38 !important; +} + +.light-green-text.text-darken-2 { + color: #689f38 !important; +} + +.light-green.darken-3 { + background-color: #558b2f !important; +} + +.light-green-text.text-darken-3 { + color: #558b2f !important; +} + +.light-green.darken-4 { + background-color: #33691e !important; +} + +.light-green-text.text-darken-4 { + color: #33691e !important; +} + +.light-green.accent-1 { + background-color: #ccff90 !important; +} + +.light-green-text.text-accent-1 { + color: #ccff90 !important; +} + +.light-green.accent-2 { + background-color: #b2ff59 !important; +} + +.light-green-text.text-accent-2 { + color: #b2ff59 !important; +} + +.light-green.accent-3 { + background-color: #76ff03 !important; +} + +.light-green-text.text-accent-3 { + color: #76ff03 !important; +} + +.light-green.accent-4 { + background-color: #64dd17 !important; +} + +.light-green-text.text-accent-4 { + color: #64dd17 !important; +} + +.lime { + background-color: #cddc39 !important; +} + +.lime-text { + color: #cddc39 !important; +} + +.lime.lighten-5 { + background-color: #f9fbe7 !important; +} + +.lime-text.text-lighten-5 { + color: #f9fbe7 !important; +} + +.lime.lighten-4 { + background-color: #f0f4c3 !important; +} + +.lime-text.text-lighten-4 { + color: #f0f4c3 !important; +} + +.lime.lighten-3 { + background-color: #e6ee9c !important; +} + +.lime-text.text-lighten-3 { + color: #e6ee9c !important; +} + +.lime.lighten-2 { + background-color: #dce775 !important; +} + +.lime-text.text-lighten-2 { + color: #dce775 !important; +} + +.lime.lighten-1 { + background-color: #d4e157 !important; +} + +.lime-text.text-lighten-1 { + color: #d4e157 !important; +} + +.lime.darken-1 { + background-color: #c0ca33 !important; +} + +.lime-text.text-darken-1 { + color: #c0ca33 !important; +} + +.lime.darken-2 { + background-color: #afb42b !important; +} + +.lime-text.text-darken-2 { + color: #afb42b !important; +} + +.lime.darken-3 { + background-color: #9e9d24 !important; +} + +.lime-text.text-darken-3 { + color: #9e9d24 !important; +} + +.lime.darken-4 { + background-color: #827717 !important; +} + +.lime-text.text-darken-4 { + color: #827717 !important; +} + +.lime.accent-1 { + background-color: #f4ff81 !important; +} + +.lime-text.text-accent-1 { + color: #f4ff81 !important; +} + +.lime.accent-2 { + background-color: #eeff41 !important; +} + +.lime-text.text-accent-2 { + color: #eeff41 !important; +} + +.lime.accent-3 { + background-color: #c6ff00 !important; +} + +.lime-text.text-accent-3 { + color: #c6ff00 !important; +} + +.lime.accent-4 { + background-color: #aeea00 !important; +} + +.lime-text.text-accent-4 { + color: #aeea00 !important; +} + +.yellow { + background-color: #ffeb3b !important; +} + +.yellow-text { + color: #ffeb3b !important; +} + +.yellow.lighten-5 { + background-color: #fffde7 !important; +} + +.yellow-text.text-lighten-5 { + color: #fffde7 !important; +} + +.yellow.lighten-4 { + background-color: #fff9c4 !important; +} + +.yellow-text.text-lighten-4 { + color: #fff9c4 !important; +} + +.yellow.lighten-3 { + background-color: #fff59d !important; +} + +.yellow-text.text-lighten-3 { + color: #fff59d !important; +} + +.yellow.lighten-2 { + background-color: #fff176 !important; +} + +.yellow-text.text-lighten-2 { + color: #fff176 !important; +} + +.yellow.lighten-1 { + background-color: #ffee58 !important; +} + +.yellow-text.text-lighten-1 { + color: #ffee58 !important; +} + +.yellow.darken-1 { + background-color: #fdd835 !important; +} + +.yellow-text.text-darken-1 { + color: #fdd835 !important; +} + +.yellow.darken-2 { + background-color: #fbc02d !important; +} + +.yellow-text.text-darken-2 { + color: #fbc02d !important; +} + +.yellow.darken-3 { + background-color: #f9a825 !important; +} + +.yellow-text.text-darken-3 { + color: #f9a825 !important; +} + +.yellow.darken-4 { + background-color: #f57f17 !important; +} + +.yellow-text.text-darken-4 { + color: #f57f17 !important; +} + +.yellow.accent-1 { + background-color: #ffff8d !important; +} + +.yellow-text.text-accent-1 { + color: #ffff8d !important; +} + +.yellow.accent-2 { + background-color: #ffff00 !important; +} + +.yellow-text.text-accent-2 { + color: #ffff00 !important; +} + +.yellow.accent-3 { + background-color: #ffea00 !important; +} + +.yellow-text.text-accent-3 { + color: #ffea00 !important; +} + +.yellow.accent-4 { + background-color: #ffd600 !important; +} + +.yellow-text.text-accent-4 { + color: #ffd600 !important; +} + +.amber { + background-color: #ffc107 !important; +} + +.amber-text { + color: #ffc107 !important; +} + +.amber.lighten-5 { + background-color: #fff8e1 !important; +} + +.amber-text.text-lighten-5 { + color: #fff8e1 !important; +} + +.amber.lighten-4 { + background-color: #ffecb3 !important; +} + +.amber-text.text-lighten-4 { + color: #ffecb3 !important; +} + +.amber.lighten-3 { + background-color: #ffe082 !important; +} + +.amber-text.text-lighten-3 { + color: #ffe082 !important; +} + +.amber.lighten-2 { + background-color: #ffd54f !important; +} + +.amber-text.text-lighten-2 { + color: #ffd54f !important; +} + +.amber.lighten-1 { + background-color: #ffca28 !important; +} + +.amber-text.text-lighten-1 { + color: #ffca28 !important; +} + +.amber.darken-1 { + background-color: #ffb300 !important; +} + +.amber-text.text-darken-1 { + color: #ffb300 !important; +} + +.amber.darken-2 { + background-color: #ffa000 !important; +} + +.amber-text.text-darken-2 { + color: #ffa000 !important; +} + +.amber.darken-3 { + background-color: #ff8f00 !important; +} + +.amber-text.text-darken-3 { + color: #ff8f00 !important; +} + +.amber.darken-4 { + background-color: #ff6f00 !important; +} + +.amber-text.text-darken-4 { + color: #ff6f00 !important; +} + +.amber.accent-1 { + background-color: #ffe57f !important; +} + +.amber-text.text-accent-1 { + color: #ffe57f !important; +} + +.amber.accent-2 { + background-color: #ffd740 !important; +} + +.amber-text.text-accent-2 { + color: #ffd740 !important; +} + +.amber.accent-3 { + background-color: #ffc400 !important; +} + +.amber-text.text-accent-3 { + color: #ffc400 !important; +} + +.amber.accent-4 { + background-color: #ffab00 !important; +} + +.amber-text.text-accent-4 { + color: #ffab00 !important; +} + +.orange { + background-color: #ff9800 !important; +} + +.orange-text { + color: #ff9800 !important; +} + +.orange.lighten-5 { + background-color: #fff3e0 !important; +} + +.orange-text.text-lighten-5 { + color: #fff3e0 !important; +} + +.orange.lighten-4 { + background-color: #ffe0b2 !important; +} + +.orange-text.text-lighten-4 { + color: #ffe0b2 !important; +} + +.orange.lighten-3 { + background-color: #ffcc80 !important; +} + +.orange-text.text-lighten-3 { + color: #ffcc80 !important; +} + +.orange.lighten-2 { + background-color: #ffb74d !important; +} + +.orange-text.text-lighten-2 { + color: #ffb74d !important; +} + +.orange.lighten-1 { + background-color: #ffa726 !important; +} + +.orange-text.text-lighten-1 { + color: #ffa726 !important; +} + +.orange.darken-1 { + background-color: #fb8c00 !important; +} + +.orange-text.text-darken-1 { + color: #fb8c00 !important; +} + +.orange.darken-2 { + background-color: #f57c00 !important; +} + +.orange-text.text-darken-2 { + color: #f57c00 !important; +} + +.orange.darken-3 { + background-color: #ef6c00 !important; +} + +.orange-text.text-darken-3 { + color: #ef6c00 !important; +} + +.orange.darken-4 { + background-color: #e65100 !important; +} + +.orange-text.text-darken-4 { + color: #e65100 !important; +} + +.orange.accent-1 { + background-color: #ffd180 !important; +} + +.orange-text.text-accent-1 { + color: #ffd180 !important; +} + +.orange.accent-2 { + background-color: #ffab40 !important; +} + +.orange-text.text-accent-2 { + color: #ffab40 !important; +} + +.orange.accent-3 { + background-color: #ff9100 !important; +} + +.orange-text.text-accent-3 { + color: #ff9100 !important; +} + +.orange.accent-4 { + background-color: #ff6d00 !important; +} + +.orange-text.text-accent-4 { + color: #ff6d00 !important; +} + +.deep-orange { + background-color: #ff5722 !important; +} + +.deep-orange-text { + color: #ff5722 !important; +} + +.deep-orange.lighten-5 { + background-color: #fbe9e7 !important; +} + +.deep-orange-text.text-lighten-5 { + color: #fbe9e7 !important; +} + +.deep-orange.lighten-4 { + background-color: #ffccbc !important; +} + +.deep-orange-text.text-lighten-4 { + color: #ffccbc !important; +} + +.deep-orange.lighten-3 { + background-color: #ffab91 !important; +} + +.deep-orange-text.text-lighten-3 { + color: #ffab91 !important; +} + +.deep-orange.lighten-2 { + background-color: #ff8a65 !important; +} + +.deep-orange-text.text-lighten-2 { + color: #ff8a65 !important; +} + +.deep-orange.lighten-1 { + background-color: #ff7043 !important; +} + +.deep-orange-text.text-lighten-1 { + color: #ff7043 !important; +} + +.deep-orange.darken-1 { + background-color: #f4511e !important; +} + +.deep-orange-text.text-darken-1 { + color: #f4511e !important; +} + +.deep-orange.darken-2 { + background-color: #e64a19 !important; +} + +.deep-orange-text.text-darken-2 { + color: #e64a19 !important; +} + +.deep-orange.darken-3 { + background-color: #d84315 !important; +} + +.deep-orange-text.text-darken-3 { + color: #d84315 !important; +} + +.deep-orange.darken-4 { + background-color: #bf360c !important; +} + +.deep-orange-text.text-darken-4 { + color: #bf360c !important; +} + +.deep-orange.accent-1 { + background-color: #ff9e80 !important; +} + +.deep-orange-text.text-accent-1 { + color: #ff9e80 !important; +} + +.deep-orange.accent-2 { + background-color: #ff6e40 !important; +} + +.deep-orange-text.text-accent-2 { + color: #ff6e40 !important; +} + +.deep-orange.accent-3 { + background-color: #ff3d00 !important; +} + +.deep-orange-text.text-accent-3 { + color: #ff3d00 !important; +} + +.deep-orange.accent-4 { + background-color: #dd2c00 !important; +} + +.deep-orange-text.text-accent-4 { + color: #dd2c00 !important; +} + +.brown { + background-color: #795548 !important; +} + +.brown-text { + color: #795548 !important; +} + +.brown.lighten-5 { + background-color: #efebe9 !important; +} + +.brown-text.text-lighten-5 { + color: #efebe9 !important; +} + +.brown.lighten-4 { + background-color: #d7ccc8 !important; +} + +.brown-text.text-lighten-4 { + color: #d7ccc8 !important; +} + +.brown.lighten-3 { + background-color: #bcaaa4 !important; +} + +.brown-text.text-lighten-3 { + color: #bcaaa4 !important; +} + +.brown.lighten-2 { + background-color: #a1887f !important; +} + +.brown-text.text-lighten-2 { + color: #a1887f !important; +} + +.brown.lighten-1 { + background-color: #8d6e63 !important; +} + +.brown-text.text-lighten-1 { + color: #8d6e63 !important; +} + +.brown.darken-1 { + background-color: #6d4c41 !important; +} + +.brown-text.text-darken-1 { + color: #6d4c41 !important; +} + +.brown.darken-2 { + background-color: #5d4037 !important; +} + +.brown-text.text-darken-2 { + color: #5d4037 !important; +} + +.brown.darken-3 { + background-color: #4e342e !important; +} + +.brown-text.text-darken-3 { + color: #4e342e !important; +} + +.brown.darken-4 { + background-color: #3e2723 !important; +} + +.brown-text.text-darken-4 { + color: #3e2723 !important; +} + +.blue-grey { + background-color: #607d8b !important; +} + +.blue-grey-text { + color: #607d8b !important; +} + +.blue-grey.lighten-5 { + background-color: #eceff1 !important; +} + +.blue-grey-text.text-lighten-5 { + color: #eceff1 !important; +} + +.blue-grey.lighten-4 { + background-color: #cfd8dc !important; +} + +.blue-grey-text.text-lighten-4 { + color: #cfd8dc !important; +} + +.blue-grey.lighten-3 { + background-color: #b0bec5 !important; +} + +.blue-grey-text.text-lighten-3 { + color: #b0bec5 !important; +} + +.blue-grey.lighten-2 { + background-color: #90a4ae !important; +} + +.blue-grey-text.text-lighten-2 { + color: #90a4ae !important; +} + +.blue-grey.lighten-1 { + background-color: #78909c !important; +} + +.blue-grey-text.text-lighten-1 { + color: #78909c !important; +} + +.blue-grey.darken-1 { + background-color: #546e7a !important; +} + +.blue-grey-text.text-darken-1 { + color: #546e7a !important; +} + +.blue-grey.darken-2 { + background-color: #455a64 !important; +} + +.blue-grey-text.text-darken-2 { + color: #455a64 !important; +} + +.blue-grey.darken-3 { + background-color: #37474f !important; +} + +.blue-grey-text.text-darken-3 { + color: #37474f !important; +} + +.blue-grey.darken-4 { + background-color: #263238 !important; +} + +.blue-grey-text.text-darken-4 { + color: #263238 !important; +} + +.grey { + background-color: #9e9e9e !important; +} + +.grey-text { + color: #9e9e9e !important; +} + +.grey.lighten-5 { + background-color: #fafafa !important; +} + +.grey-text.text-lighten-5 { + color: #fafafa !important; +} + +.grey.lighten-4 { + background-color: #f5f5f5 !important; +} + +.grey-text.text-lighten-4 { + color: #f5f5f5 !important; +} + +.grey.lighten-3 { + background-color: #eeeeee !important; +} + +.grey-text.text-lighten-3 { + color: #eeeeee !important; +} + +.grey.lighten-2 { + background-color: #e0e0e0 !important; +} + +.grey-text.text-lighten-2 { + color: #e0e0e0 !important; +} + +.grey.lighten-1 { + background-color: #bdbdbd !important; +} + +.grey-text.text-lighten-1 { + color: #bdbdbd !important; +} + +.grey.darken-1 { + background-color: #757575 !important; +} + +.grey-text.text-darken-1 { + color: #757575 !important; +} + +.grey.darken-2 { + background-color: #616161 !important; +} + +.grey-text.text-darken-2 { + color: #616161 !important; +} + +.grey.darken-3 { + background-color: #424242 !important; +} + +.grey-text.text-darken-3 { + color: #424242 !important; +} + +.grey.darken-4 { + background-color: #212121 !important; +} + +.grey-text.text-darken-4 { + color: #212121 !important; +} + +.black { + background-color: #000000 !important; +} + +.black-text { + color: #000000 !important; +} + +.white { + background-color: #FFFFFF !important; +} + +.white-text { + color: #FFFFFF !important; +} + +.transparent { + background-color: transparent !important; +} + +.transparent-text { + color: transparent !important; +} + +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in + * IE on Windows Phone and in iOS. + */ +html { + line-height: 1.15; + /* 1 */ + -ms-text-size-adjust: 100%; + /* 2 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers (opinionated). + */ +body { + margin: 0; +} + +/** + * Add the correct display in IE 9-. + */ +article, +aside, +footer, +header, +nav, +section { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in IE. + */ +figcaption, +figure, +main { + /* 1 */ + display: block; +} + +/** + * Add the correct margin in IE 8. + */ +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ +a { + background-color: transparent; + /* 1 */ + -webkit-text-decoration-skip: objects; + /* 2 */ +} + +/** + * 1. Remove the bottom border in Chrome 57- and Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + -webkit-text-decoration: underline dotted; + -moz-text-decoration: underline dotted; + text-decoration: underline dotted; + /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** + * Add the correct font style in Android 4.3-. + */ +dfn { + font-style: italic; +} + +/** + * Add the correct background and color in IE 9-. + */ +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +audio, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Remove the border on images inside links in IE 10-. + */ +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ +svg:not(:root) { + overflow: hidden; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: sans-serif; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; + /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** + * 1. Add the correct display in IE 9-. + * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + display: inline-block; + /* 1 */ + vertical-align: baseline; + /* 2 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. + */ +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + */ +details, +menu { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Scripting + ========================================================================== */ +/** + * Add the correct display in IE 9-. + */ +canvas { + display: inline-block; +} + +/** + * Add the correct display in IE. + */ +template { + display: none; +} + +/* Hidden + ========================================================================== */ +/** + * Add the correct display in IE 10-. + */ +[hidden] { + display: none; +} + +html { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +*, *:before, *:after { + -webkit-box-sizing: inherit; + box-sizing: inherit; +} + +button, +input, +optgroup, +select, +textarea { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +ul:not(.browser-default) { + padding-left: 0; + list-style-type: none; +} + +ul:not(.browser-default) > li { + list-style-type: none; +} + +a { + color: #039be5; + text-decoration: none; + -webkit-tap-highlight-color: transparent; +} + +.valign-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} + +.clearfix { + clear: both; +} + +.z-depth-0 { + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +/* 2dp elevation modified*/ +.z-depth-1, nav, .card-panel, .card, .toast, .btn, .btn-large, .btn-small, .btn-floating, .dropdown-content, .collapsible, .sidenav { + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2); +} + +.z-depth-1-half, .btn:hover, .btn-large:hover, .btn-small:hover, .btn-floating:hover { + -webkit-box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); +} + +/* 6dp elevation modified*/ +.z-depth-2 { + -webkit-box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); + box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); +} + +/* 12dp elevation modified*/ +.z-depth-3 { + -webkit-box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); + box-shadow: 0 8px 17px 2px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); +} + +/* 16dp elevation */ +.z-depth-4 { + -webkit-box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2); + box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -7px rgba(0, 0, 0, 0.2); +} + +/* 24dp elevation */ +.z-depth-5, .modal { + -webkit-box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); + box-shadow: 0 24px 38px 3px rgba(0, 0, 0, 0.14), 0 9px 46px 8px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.2); +} + +.hoverable { + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; +} + +.hoverable:hover { + -webkit-box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.divider { + height: 1px; + overflow: hidden; + background-color: #e0e0e0; +} + +blockquote { + margin: 20px 0; + padding-left: 1.5rem; + border-left: 5px solid #ee6e73; +} + +i { + line-height: inherit; +} + +i.left { + float: left; + margin-right: 15px; +} + +i.right { + float: right; + margin-left: 15px; +} + +i.tiny { + font-size: 1rem; +} + +i.small { + font-size: 2rem; +} + +i.medium { + font-size: 4rem; +} + +i.large { + font-size: 6rem; +} + +img.responsive-img, +video.responsive-video { + max-width: 100%; + height: auto; +} + +.pagination li { + display: inline-block; + border-radius: 2px; + text-align: center; + vertical-align: top; + height: 30px; +} + +.pagination li a { + color: #444; + display: inline-block; + font-size: 1.2rem; + padding: 0 10px; + line-height: 30px; +} + +.pagination li.active a { + color: #fff; +} + +.pagination li.active { + background-color: #ee6e73; +} + +.pagination li.disabled a { + cursor: default; + color: #999; +} + +.pagination li i { + font-size: 2rem; +} + +.pagination li.pages ul li { + display: inline-block; + float: none; +} + +@media only screen and (max-width: 992px) { + .pagination { + width: 100%; + } + .pagination li.prev, + .pagination li.next { + width: 10%; + } + .pagination li.pages { + width: 80%; + overflow: hidden; + white-space: nowrap; + } +} + +.breadcrumb { + font-size: 18px; + color: rgba(255, 255, 255, 0.7); +} + +.breadcrumb i, +.breadcrumb [class^="mdi-"], .breadcrumb [class*="mdi-"], +.breadcrumb i.material-icons { + display: inline-block; + float: left; + font-size: 24px; +} + +.breadcrumb:before { + content: '\E5CC'; + color: rgba(255, 255, 255, 0.7); + vertical-align: top; + display: inline-block; + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 25px; + margin: 0 10px 0 8px; + -webkit-font-smoothing: antialiased; +} + +.breadcrumb:first-child:before { + display: none; +} + +.breadcrumb:last-child { + color: #fff; +} + +.parallax-container { + position: relative; + overflow: hidden; + height: 500px; +} + +.parallax-container .parallax { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; +} + +.parallax-container .parallax img { + opacity: 0; + position: absolute; + left: 50%; + bottom: 0; + min-width: 100%; + min-height: 100%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +.pin-top, .pin-bottom { + position: relative; +} + +.pinned { + position: fixed !important; +} + +/********************* + Transition Classes +**********************/ +ul.staggered-list li { + opacity: 0; +} + +.fade-in { + opacity: 0; + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; +} + +/********************* + Media Query Classes +**********************/ +@media only screen and (max-width: 600px) { + .hide-on-small-only, .hide-on-small-and-down { + display: none !important; + } +} + +@media only screen and (max-width: 992px) { + .hide-on-med-and-down { + display: none !important; + } +} + +@media only screen and (min-width: 601px) { + .hide-on-med-and-up { + display: none !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .hide-on-med-only { + display: none !important; + } +} + +@media only screen and (min-width: 993px) { + .hide-on-large-only { + display: none !important; + } +} + +@media only screen and (min-width: 1201px) { + .hide-on-extra-large-only { + display: none !important; + } +} + +@media only screen and (min-width: 1201px) { + .show-on-extra-large { + display: block !important; + } +} + +@media only screen and (min-width: 993px) { + .show-on-large { + display: block !important; + } +} + +@media only screen and (min-width: 600px) and (max-width: 992px) { + .show-on-medium { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .show-on-small { + display: block !important; + } +} + +@media only screen and (min-width: 601px) { + .show-on-medium-and-up { + display: block !important; + } +} + +@media only screen and (max-width: 992px) { + .show-on-medium-and-down { + display: block !important; + } +} + +@media only screen and (max-width: 600px) { + .center-on-small-only { + text-align: center; + } +} + +.page-footer { + padding-top: 20px; + color: #fff; + background-color: #ee6e73; +} + +.page-footer .footer-copyright { + overflow: hidden; + min-height: 50px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 10px 0px; + color: rgba(255, 255, 255, 0.8); + background-color: rgba(51, 51, 51, 0.08); +} + +table, th, td { + border: none; +} + +table { + width: 100%; + display: table; + border-collapse: collapse; + border-spacing: 0; +} + +table.striped tr { + border-bottom: none; +} + +table.striped > tbody > tr:nth-child(odd) { + background-color: rgba(242, 242, 242, 0.5); +} + +table.striped > tbody > tr > td { + border-radius: 0; +} + +table.highlight > tbody > tr { + -webkit-transition: background-color .25s ease; + transition: background-color .25s ease; +} + +table.highlight > tbody > tr:hover { + background-color: rgba(242, 242, 242, 0.5); +} + +table.centered thead tr th, table.centered tbody tr td { + text-align: center; +} + +tr { + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} + +td, th { + padding: 15px 5px; + display: table-cell; + text-align: left; + vertical-align: middle; + border-radius: 2px; +} + +@media only screen and (max-width: 992px) { + table.responsive-table { + width: 100%; + border-collapse: collapse; + border-spacing: 0; + display: block; + position: relative; + /* sort out borders */ + } + table.responsive-table td:empty:before { + content: '\00a0'; + } + table.responsive-table th, + table.responsive-table td { + margin: 0; + vertical-align: top; + } + table.responsive-table th { + text-align: left; + } + table.responsive-table thead { + display: block; + float: left; + } + table.responsive-table thead tr { + display: block; + padding: 0 10px 0 0; + } + table.responsive-table thead tr th::before { + content: "\00a0"; + } + table.responsive-table tbody { + display: block; + width: auto; + position: relative; + overflow-x: auto; + white-space: nowrap; + } + table.responsive-table tbody tr { + display: inline-block; + vertical-align: top; + } + table.responsive-table th { + display: block; + text-align: right; + } + table.responsive-table td { + display: block; + min-height: 1.25em; + text-align: left; + } + table.responsive-table tr { + border-bottom: none; + padding: 0 10px; + } + table.responsive-table thead { + border: 0; + border-right: 1px solid rgba(0, 0, 0, 0.12); + } +} + +.collection { + margin: 0.5rem 0 1rem 0; + border: 1px solid #e0e0e0; + border-radius: 2px; + overflow: hidden; + position: relative; +} + +.collection .collection-item { + background-color: #fff; + line-height: 1.5rem; + padding: 10px 20px; + margin: 0; + border-bottom: 1px solid #e0e0e0; +} + +.collection .collection-item.avatar { + min-height: 84px; + padding-left: 72px; + position: relative; +} + +.collection .collection-item.avatar:not(.circle-clipper) > .circle, +.collection .collection-item.avatar :not(.circle-clipper) > .circle { + position: absolute; + width: 42px; + height: 42px; + overflow: hidden; + left: 15px; + display: inline-block; + vertical-align: middle; +} + +.collection .collection-item.avatar i.circle { + font-size: 18px; + line-height: 42px; + color: #fff; + background-color: #999; + text-align: center; +} + +.collection .collection-item.avatar .title { + font-size: 16px; +} + +.collection .collection-item.avatar p { + margin: 0; +} + +.collection .collection-item.avatar .secondary-content { + position: absolute; + top: 16px; + right: 16px; +} + +.collection .collection-item:last-child { + border-bottom: none; +} + +.collection .collection-item.active { + background-color: #26a69a; + color: #eafaf9; +} + +.collection .collection-item.active .secondary-content { + color: #fff; +} + +.collection a.collection-item { + display: block; + -webkit-transition: .25s; + transition: .25s; + color: #26a69a; +} + +.collection a.collection-item:not(.active):hover { + background-color: #ddd; +} + +.collection.with-header .collection-header { + background-color: #fff; + border-bottom: 1px solid #e0e0e0; + padding: 10px 20px; +} + +.collection.with-header .collection-item { + padding-left: 30px; +} + +.collection.with-header .collection-item.avatar { + padding-left: 72px; +} + +.secondary-content { + float: right; + color: #26a69a; +} + +.collapsible .collection { + margin: 0; + border: none; +} + +.video-container { + position: relative; + padding-bottom: 56.25%; + height: 0; + overflow: hidden; +} + +.video-container iframe, .video-container object, .video-container embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.progress { + position: relative; + height: 4px; + display: block; + width: 100%; + background-color: #acece6; + border-radius: 2px; + margin: 0.5rem 0 1rem 0; + overflow: hidden; +} + +.progress .determinate { + position: absolute; + top: 0; + left: 0; + bottom: 0; + background-color: #26a69a; + -webkit-transition: width .3s linear; + transition: width .3s linear; +} + +.progress .indeterminate { + background-color: #26a69a; +} + +.progress .indeterminate:before { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; + animation: indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite; +} + +.progress .indeterminate:after { + content: ''; + position: absolute; + background-color: inherit; + top: 0; + left: 0; + bottom: 0; + will-change: left, right; + -webkit-animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite; + -webkit-animation-delay: 1.15s; + animation-delay: 1.15s; +} + +@-webkit-keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@keyframes indeterminate { + 0% { + left: -35%; + right: 100%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: 100%; + right: -90%; + } +} + +@-webkit-keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +@keyframes indeterminate-short { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} + +/******************* + Utility Classes +*******************/ +.hide { + display: none !important; +} + +.left-align { + text-align: left; +} + +.right-align { + text-align: right; +} + +.center, .center-align { + text-align: center; +} + +.left { + float: left !important; +} + +.right { + float: right !important; +} + +.no-select, input[type=range], +input[type=range] + .thumb { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.circle { + border-radius: 50%; +} + +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} + +.truncate { + display: block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.no-padding { + padding: 0 !important; +} + +span.badge { + min-width: 3rem; + padding: 0 6px; + margin-left: 14px; + text-align: center; + font-size: 1rem; + line-height: 22px; + height: 22px; + color: #757575; + float: right; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +span.badge.new { + font-weight: 300; + font-size: 0.8rem; + color: #fff; + background-color: #26a69a; + border-radius: 2px; +} + +span.badge.new:after { + content: " new"; +} + +span.badge[data-badge-caption]::after { + content: " " attr(data-badge-caption); +} + +nav ul a span.badge { + display: inline-block; + float: none; + margin-left: 4px; + line-height: 22px; + height: 22px; + -webkit-font-smoothing: auto; +} + +.collection-item span.badge { + margin-top: calc(0.75rem - 11px); +} + +.collapsible span.badge { + margin-left: auto; +} + +.sidenav span.badge { + margin-top: calc(24px - 11px); +} + +table span.badge { + display: inline-block; + float: none; + margin-left: auto; +} + +/* This is needed for some mobile phones to display the Google Icon font properly */ +.material-icons { + text-rendering: optimizeLegibility; + -webkit-font-feature-settings: 'liga'; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; +} + +.container { + margin: 0 auto; + max-width: 1280px; + width: 90%; +} + +@media only screen and (min-width: 601px) { + .container { + width: 85%; + } +} + +@media only screen and (min-width: 993px) { + .container { + width: 70%; + } +} + +.col .row { + margin-left: -0.75rem; + margin-right: -0.75rem; +} + +.section { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.section.no-pad { + padding: 0; +} + +.section.no-pad-bot { + padding-bottom: 0; +} + +.section.no-pad-top { + padding-top: 0; +} + +.row { + margin-left: auto; + margin-right: auto; + margin-bottom: 20px; +} + +.row:after { + content: ""; + display: table; + clear: both; +} + +.row .col { + float: left; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0 0.75rem; + min-height: 1px; +} + +.row .col[class*="push-"], .row .col[class*="pull-"] { + position: relative; +} + +.row .col.s1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.s12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; +} + +.row .col.offset-s1 { + margin-left: 8.3333333333%; +} + +.row .col.pull-s1 { + right: 8.3333333333%; +} + +.row .col.push-s1 { + left: 8.3333333333%; +} + +.row .col.offset-s2 { + margin-left: 16.6666666667%; +} + +.row .col.pull-s2 { + right: 16.6666666667%; +} + +.row .col.push-s2 { + left: 16.6666666667%; +} + +.row .col.offset-s3 { + margin-left: 25%; +} + +.row .col.pull-s3 { + right: 25%; +} + +.row .col.push-s3 { + left: 25%; +} + +.row .col.offset-s4 { + margin-left: 33.3333333333%; +} + +.row .col.pull-s4 { + right: 33.3333333333%; +} + +.row .col.push-s4 { + left: 33.3333333333%; +} + +.row .col.offset-s5 { + margin-left: 41.6666666667%; +} + +.row .col.pull-s5 { + right: 41.6666666667%; +} + +.row .col.push-s5 { + left: 41.6666666667%; +} + +.row .col.offset-s6 { + margin-left: 50%; +} + +.row .col.pull-s6 { + right: 50%; +} + +.row .col.push-s6 { + left: 50%; +} + +.row .col.offset-s7 { + margin-left: 58.3333333333%; +} + +.row .col.pull-s7 { + right: 58.3333333333%; +} + +.row .col.push-s7 { + left: 58.3333333333%; +} + +.row .col.offset-s8 { + margin-left: 66.6666666667%; +} + +.row .col.pull-s8 { + right: 66.6666666667%; +} + +.row .col.push-s8 { + left: 66.6666666667%; +} + +.row .col.offset-s9 { + margin-left: 75%; +} + +.row .col.pull-s9 { + right: 75%; +} + +.row .col.push-s9 { + left: 75%; +} + +.row .col.offset-s10 { + margin-left: 83.3333333333%; +} + +.row .col.pull-s10 { + right: 83.3333333333%; +} + +.row .col.push-s10 { + left: 83.3333333333%; +} + +.row .col.offset-s11 { + margin-left: 91.6666666667%; +} + +.row .col.pull-s11 { + right: 91.6666666667%; +} + +.row .col.push-s11 { + left: 91.6666666667%; +} + +.row .col.offset-s12 { + margin-left: 100%; +} + +.row .col.pull-s12 { + right: 100%; +} + +.row .col.push-s12 { + left: 100%; +} + +@media only screen and (min-width: 601px) { + .row .col.m1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.m12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-m1 { + margin-left: 8.3333333333%; + } + .row .col.pull-m1 { + right: 8.3333333333%; + } + .row .col.push-m1 { + left: 8.3333333333%; + } + .row .col.offset-m2 { + margin-left: 16.6666666667%; + } + .row .col.pull-m2 { + right: 16.6666666667%; + } + .row .col.push-m2 { + left: 16.6666666667%; + } + .row .col.offset-m3 { + margin-left: 25%; + } + .row .col.pull-m3 { + right: 25%; + } + .row .col.push-m3 { + left: 25%; + } + .row .col.offset-m4 { + margin-left: 33.3333333333%; + } + .row .col.pull-m4 { + right: 33.3333333333%; + } + .row .col.push-m4 { + left: 33.3333333333%; + } + .row .col.offset-m5 { + margin-left: 41.6666666667%; + } + .row .col.pull-m5 { + right: 41.6666666667%; + } + .row .col.push-m5 { + left: 41.6666666667%; + } + .row .col.offset-m6 { + margin-left: 50%; + } + .row .col.pull-m6 { + right: 50%; + } + .row .col.push-m6 { + left: 50%; + } + .row .col.offset-m7 { + margin-left: 58.3333333333%; + } + .row .col.pull-m7 { + right: 58.3333333333%; + } + .row .col.push-m7 { + left: 58.3333333333%; + } + .row .col.offset-m8 { + margin-left: 66.6666666667%; + } + .row .col.pull-m8 { + right: 66.6666666667%; + } + .row .col.push-m8 { + left: 66.6666666667%; + } + .row .col.offset-m9 { + margin-left: 75%; + } + .row .col.pull-m9 { + right: 75%; + } + .row .col.push-m9 { + left: 75%; + } + .row .col.offset-m10 { + margin-left: 83.3333333333%; + } + .row .col.pull-m10 { + right: 83.3333333333%; + } + .row .col.push-m10 { + left: 83.3333333333%; + } + .row .col.offset-m11 { + margin-left: 91.6666666667%; + } + .row .col.pull-m11 { + right: 91.6666666667%; + } + .row .col.push-m11 { + left: 91.6666666667%; + } + .row .col.offset-m12 { + margin-left: 100%; + } + .row .col.pull-m12 { + right: 100%; + } + .row .col.push-m12 { + left: 100%; + } +} + +@media only screen and (min-width: 993px) { + .row .col.l1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.l12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-l1 { + margin-left: 8.3333333333%; + } + .row .col.pull-l1 { + right: 8.3333333333%; + } + .row .col.push-l1 { + left: 8.3333333333%; + } + .row .col.offset-l2 { + margin-left: 16.6666666667%; + } + .row .col.pull-l2 { + right: 16.6666666667%; + } + .row .col.push-l2 { + left: 16.6666666667%; + } + .row .col.offset-l3 { + margin-left: 25%; + } + .row .col.pull-l3 { + right: 25%; + } + .row .col.push-l3 { + left: 25%; + } + .row .col.offset-l4 { + margin-left: 33.3333333333%; + } + .row .col.pull-l4 { + right: 33.3333333333%; + } + .row .col.push-l4 { + left: 33.3333333333%; + } + .row .col.offset-l5 { + margin-left: 41.6666666667%; + } + .row .col.pull-l5 { + right: 41.6666666667%; + } + .row .col.push-l5 { + left: 41.6666666667%; + } + .row .col.offset-l6 { + margin-left: 50%; + } + .row .col.pull-l6 { + right: 50%; + } + .row .col.push-l6 { + left: 50%; + } + .row .col.offset-l7 { + margin-left: 58.3333333333%; + } + .row .col.pull-l7 { + right: 58.3333333333%; + } + .row .col.push-l7 { + left: 58.3333333333%; + } + .row .col.offset-l8 { + margin-left: 66.6666666667%; + } + .row .col.pull-l8 { + right: 66.6666666667%; + } + .row .col.push-l8 { + left: 66.6666666667%; + } + .row .col.offset-l9 { + margin-left: 75%; + } + .row .col.pull-l9 { + right: 75%; + } + .row .col.push-l9 { + left: 75%; + } + .row .col.offset-l10 { + margin-left: 83.3333333333%; + } + .row .col.pull-l10 { + right: 83.3333333333%; + } + .row .col.push-l10 { + left: 83.3333333333%; + } + .row .col.offset-l11 { + margin-left: 91.6666666667%; + } + .row .col.pull-l11 { + right: 91.6666666667%; + } + .row .col.push-l11 { + left: 91.6666666667%; + } + .row .col.offset-l12 { + margin-left: 100%; + } + .row .col.pull-l12 { + right: 100%; + } + .row .col.push-l12 { + left: 100%; + } +} + +@media only screen and (min-width: 1201px) { + .row .col.xl1 { + width: 8.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl2 { + width: 16.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl3 { + width: 25%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl4 { + width: 33.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl5 { + width: 41.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl6 { + width: 50%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl7 { + width: 58.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl8 { + width: 66.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl9 { + width: 75%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl10 { + width: 83.3333333333%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl11 { + width: 91.6666666667%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.xl12 { + width: 100%; + margin-left: auto; + left: auto; + right: auto; + } + .row .col.offset-xl1 { + margin-left: 8.3333333333%; + } + .row .col.pull-xl1 { + right: 8.3333333333%; + } + .row .col.push-xl1 { + left: 8.3333333333%; + } + .row .col.offset-xl2 { + margin-left: 16.6666666667%; + } + .row .col.pull-xl2 { + right: 16.6666666667%; + } + .row .col.push-xl2 { + left: 16.6666666667%; + } + .row .col.offset-xl3 { + margin-left: 25%; + } + .row .col.pull-xl3 { + right: 25%; + } + .row .col.push-xl3 { + left: 25%; + } + .row .col.offset-xl4 { + margin-left: 33.3333333333%; + } + .row .col.pull-xl4 { + right: 33.3333333333%; + } + .row .col.push-xl4 { + left: 33.3333333333%; + } + .row .col.offset-xl5 { + margin-left: 41.6666666667%; + } + .row .col.pull-xl5 { + right: 41.6666666667%; + } + .row .col.push-xl5 { + left: 41.6666666667%; + } + .row .col.offset-xl6 { + margin-left: 50%; + } + .row .col.pull-xl6 { + right: 50%; + } + .row .col.push-xl6 { + left: 50%; + } + .row .col.offset-xl7 { + margin-left: 58.3333333333%; + } + .row .col.pull-xl7 { + right: 58.3333333333%; + } + .row .col.push-xl7 { + left: 58.3333333333%; + } + .row .col.offset-xl8 { + margin-left: 66.6666666667%; + } + .row .col.pull-xl8 { + right: 66.6666666667%; + } + .row .col.push-xl8 { + left: 66.6666666667%; + } + .row .col.offset-xl9 { + margin-left: 75%; + } + .row .col.pull-xl9 { + right: 75%; + } + .row .col.push-xl9 { + left: 75%; + } + .row .col.offset-xl10 { + margin-left: 83.3333333333%; + } + .row .col.pull-xl10 { + right: 83.3333333333%; + } + .row .col.push-xl10 { + left: 83.3333333333%; + } + .row .col.offset-xl11 { + margin-left: 91.6666666667%; + } + .row .col.pull-xl11 { + right: 91.6666666667%; + } + .row .col.push-xl11 { + left: 91.6666666667%; + } + .row .col.offset-xl12 { + margin-left: 100%; + } + .row .col.pull-xl12 { + right: 100%; + } + .row .col.push-xl12 { + left: 100%; + } +} + +nav { + color: #fff; + background-color: #ee6e73; + width: 100%; + height: 56px; + line-height: 56px; +} + +nav.nav-extended { + height: auto; +} + +nav.nav-extended .nav-wrapper { + min-height: 56px; + height: auto; +} + +nav.nav-extended .nav-content { + position: relative; + line-height: normal; +} + +nav a { + color: #fff; +} + +nav i, +nav [class^="mdi-"], nav [class*="mdi-"], +nav i.material-icons { + display: block; + font-size: 24px; + height: 56px; + line-height: 56px; +} + +nav .nav-wrapper { + position: relative; + height: 100%; +} + +@media only screen and (min-width: 993px) { + nav a.sidenav-trigger { + display: none; + } +} + +nav .sidenav-trigger { + float: left; + position: relative; + z-index: 1; + height: 56px; + margin: 0 18px; +} + +nav .sidenav-trigger i { + height: 56px; + line-height: 56px; +} + +nav .brand-logo { + position: absolute; + color: #fff; + display: inline-block; + font-size: 2.1rem; + padding: 0; +} + +nav .brand-logo.center { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); +} + +@media only screen and (max-width: 992px) { + nav .brand-logo { + left: 50%; + -webkit-transform: translateX(-50%); + transform: translateX(-50%); + } + nav .brand-logo.left, nav .brand-logo.right { + padding: 0; + -webkit-transform: none; + transform: none; + } + nav .brand-logo.left { + left: 0.5rem; + } + nav .brand-logo.right { + right: 0.5rem; + left: auto; + } +} + +nav .brand-logo.right { + right: 0.5rem; + padding: 0; +} + +nav .brand-logo i, +nav .brand-logo [class^="mdi-"], nav .brand-logo [class*="mdi-"], +nav .brand-logo i.material-icons { + float: left; + margin-right: 15px; +} + +nav .nav-title { + display: inline-block; + font-size: 32px; + padding: 28px 0; +} + +nav ul { + margin: 0; +} + +nav ul li { + -webkit-transition: background-color .3s; + transition: background-color .3s; + float: left; + padding: 0; +} + +nav ul li.active { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul a { + -webkit-transition: background-color .3s; + transition: background-color .3s; + font-size: 1rem; + color: #fff; + display: block; + padding: 0 15px; + cursor: pointer; +} + +nav ul a.btn, nav ul a.btn-large, nav ul a.btn-small, nav ul a.btn-large, nav ul a.btn-flat, nav ul a.btn-floating { + margin-top: -2px; + margin-left: 15px; + margin-right: 15px; +} + +nav ul a.btn > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-small > .material-icons, nav ul a.btn-large > .material-icons, nav ul a.btn-flat > .material-icons, nav ul a.btn-floating > .material-icons { + height: inherit; + line-height: inherit; +} + +nav ul a:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +nav ul.left { + float: left; +} + +nav form { + height: 100%; +} + +nav .input-field { + margin: 0; + height: 100%; +} + +nav .input-field input { + height: 100%; + font-size: 1.2rem; + border: none; + padding-left: 2rem; +} + +nav .input-field input:focus, nav .input-field input[type=text]:valid, nav .input-field input[type=password]:valid, nav .input-field input[type=email]:valid, nav .input-field input[type=url]:valid, nav .input-field input[type=date]:valid { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +nav .input-field label { + top: 0; + left: 0; +} + +nav .input-field label i { + color: rgba(255, 255, 255, 0.7); + -webkit-transition: color .3s; + transition: color .3s; +} + +nav .input-field label.active i { + color: #fff; +} + +.navbar-fixed { + position: relative; + height: 56px; + z-index: 997; +} + +.navbar-fixed nav { + position: fixed; +} + +@media only screen and (min-width: 601px) { + nav.nav-extended .nav-wrapper { + min-height: 64px; + } + nav, nav .nav-wrapper i, nav a.sidenav-trigger, nav a.sidenav-trigger i { + height: 64px; + line-height: 64px; + } + .navbar-fixed { + height: 64px; + } +} + +a { + text-decoration: none; +} + +html { + line-height: 1.5; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; + font-weight: normal; + color: rgba(0, 0, 0, 0.87); +} + +@media only screen and (min-width: 0) { + html { + font-size: 14px; + } +} + +@media only screen and (min-width: 992px) { + html { + font-size: 14.5px; + } +} + +@media only screen and (min-width: 1200px) { + html { + font-size: 15px; + } +} + +h1, h2, h3, h4, h5, h6 { + font-weight: 400; + line-height: 1.3; +} + +h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { + font-weight: inherit; +} + +h1 { + font-size: 4.2rem; + line-height: 110%; + margin: 2.8rem 0 1.68rem 0; +} + +h2 { + font-size: 3.56rem; + line-height: 110%; + margin: 2.3733333333rem 0 1.424rem 0; +} + +h3 { + font-size: 2.92rem; + line-height: 110%; + margin: 1.9466666667rem 0 1.168rem 0; +} + +h4 { + font-size: 2.28rem; + line-height: 110%; + margin: 1.52rem 0 0.912rem 0; +} + +h5 { + font-size: 1.64rem; + line-height: 110%; + margin: 1.0933333333rem 0 0.656rem 0; +} + +h6 { + font-size: 1.15rem; + line-height: 110%; + margin: 0.7666666667rem 0 0.46rem 0; +} + +em { + font-style: italic; +} + +strong { + font-weight: 500; +} + +small { + font-size: 75%; +} + +.light { + font-weight: 300; +} + +.thin { + font-weight: 200; +} + +@media only screen and (min-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +@media only screen and (min-width: 390px) { + .flow-text { + font-size: 1.224rem; + } +} + +@media only screen and (min-width: 420px) { + .flow-text { + font-size: 1.248rem; + } +} + +@media only screen and (min-width: 450px) { + .flow-text { + font-size: 1.272rem; + } +} + +@media only screen and (min-width: 480px) { + .flow-text { + font-size: 1.296rem; + } +} + +@media only screen and (min-width: 510px) { + .flow-text { + font-size: 1.32rem; + } +} + +@media only screen and (min-width: 540px) { + .flow-text { + font-size: 1.344rem; + } +} + +@media only screen and (min-width: 570px) { + .flow-text { + font-size: 1.368rem; + } +} + +@media only screen and (min-width: 600px) { + .flow-text { + font-size: 1.392rem; + } +} + +@media only screen and (min-width: 630px) { + .flow-text { + font-size: 1.416rem; + } +} + +@media only screen and (min-width: 660px) { + .flow-text { + font-size: 1.44rem; + } +} + +@media only screen and (min-width: 690px) { + .flow-text { + font-size: 1.464rem; + } +} + +@media only screen and (min-width: 720px) { + .flow-text { + font-size: 1.488rem; + } +} + +@media only screen and (min-width: 750px) { + .flow-text { + font-size: 1.512rem; + } +} + +@media only screen and (min-width: 780px) { + .flow-text { + font-size: 1.536rem; + } +} + +@media only screen and (min-width: 810px) { + .flow-text { + font-size: 1.56rem; + } +} + +@media only screen and (min-width: 840px) { + .flow-text { + font-size: 1.584rem; + } +} + +@media only screen and (min-width: 870px) { + .flow-text { + font-size: 1.608rem; + } +} + +@media only screen and (min-width: 900px) { + .flow-text { + font-size: 1.632rem; + } +} + +@media only screen and (min-width: 930px) { + .flow-text { + font-size: 1.656rem; + } +} + +@media only screen and (min-width: 960px) { + .flow-text { + font-size: 1.68rem; + } +} + +@media only screen and (max-width: 360px) { + .flow-text { + font-size: 1.2rem; + } +} + +.scale-transition { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; + transition: transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; +} + +.scale-transition.scale-out { + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: -webkit-transform .2s !important; + transition: -webkit-transform .2s !important; + transition: transform .2s !important; + transition: transform .2s, -webkit-transform .2s !important; +} + +.scale-transition.scale-in { + -webkit-transform: scale(1); + transform: scale(1); +} + +.card-panel { + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; + padding: 24px; + margin: 0.5rem 0 1rem 0; + border-radius: 2px; + background-color: #fff; +} + +.card { + position: relative; + margin: 0.5rem 0 1rem 0; + background-color: #fff; + -webkit-transition: -webkit-box-shadow .25s; + transition: -webkit-box-shadow .25s; + transition: box-shadow .25s; + transition: box-shadow .25s, -webkit-box-shadow .25s; + border-radius: 2px; +} + +.card .card-title { + font-size: 24px; + font-weight: 300; +} + +.card .card-title.activator { + cursor: pointer; +} + +.card.small, .card.medium, .card.large { + position: relative; +} + +.card.small .card-image, .card.medium .card-image, .card.large .card-image { + max-height: 60%; + overflow: hidden; +} + +.card.small .card-image + .card-content, .card.medium .card-image + .card-content, .card.large .card-image + .card-content { + max-height: 40%; +} + +.card.small .card-content, .card.medium .card-content, .card.large .card-content { + max-height: 100%; + overflow: hidden; +} + +.card.small .card-action, .card.medium .card-action, .card.large .card-action { + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.card.small { + height: 300px; +} + +.card.medium { + height: 400px; +} + +.card.large { + height: 500px; +} + +.card.horizontal { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.card.horizontal.small .card-image, .card.horizontal.medium .card-image, .card.horizontal.large .card-image { + height: 100%; + max-height: none; + overflow: visible; +} + +.card.horizontal.small .card-image img, .card.horizontal.medium .card-image img, .card.horizontal.large .card-image img { + height: 100%; +} + +.card.horizontal .card-image { + max-width: 50%; +} + +.card.horizontal .card-image img { + border-radius: 2px 0 0 2px; + max-width: 100%; + width: auto; +} + +.card.horizontal .card-stacked { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + position: relative; +} + +.card.horizontal .card-stacked .card-content { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.card.sticky-action .card-action { + z-index: 2; +} + +.card.sticky-action .card-reveal { + z-index: 1; + padding-bottom: 64px; +} + +.card .card-image { + position: relative; +} + +.card .card-image img { + display: block; + border-radius: 2px 2px 0 0; + position: relative; + left: 0; + right: 0; + top: 0; + bottom: 0; + width: 100%; +} + +.card .card-image .card-title { + color: #fff; + position: absolute; + bottom: 0; + left: 0; + max-width: 100%; + padding: 24px; +} + +.card .card-content { + padding: 24px; + border-radius: 0 0 2px 2px; +} + +.card .card-content p { + margin: 0; +} + +.card .card-content .card-title { + display: block; + line-height: 32px; + margin-bottom: 8px; +} + +.card .card-content .card-title i { + line-height: 32px; +} + +.card .card-action { + background-color: inherit; + border-top: 1px solid rgba(160, 160, 160, 0.2); + position: relative; + padding: 16px 24px; +} + +.card .card-action:last-child { + border-radius: 0 0 2px 2px; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating) { + color: #ffab40; + margin-right: 24px; + -webkit-transition: color .3s ease; + transition: color .3s ease; + text-transform: uppercase; +} + +.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover { + color: #ffd8a6; +} + +.card .card-reveal { + padding: 24px; + position: absolute; + background-color: #fff; + width: 100%; + overflow-y: auto; + left: 0; + top: 100%; + height: 100%; + z-index: 3; + display: none; +} + +.card .card-reveal .card-title { + cursor: pointer; + display: block; +} + +#toast-container { + display: block; + position: fixed; + z-index: 10000; +} + +@media only screen and (max-width: 600px) { + #toast-container { + min-width: 100%; + bottom: 0%; + } +} + +@media only screen and (min-width: 601px) and (max-width: 992px) { + #toast-container { + left: 5%; + bottom: 7%; + max-width: 90%; + } +} + +@media only screen and (min-width: 993px) { + #toast-container { + top: 10%; + right: 7%; + max-width: 86%; + } +} + +.toast { + border-radius: 2px; + top: 35px; + width: auto; + margin-top: 10px; + position: relative; + max-width: 100%; + height: auto; + min-height: 48px; + line-height: 1.5em; + background-color: #323232; + padding: 10px 25px; + font-size: 1.1rem; + font-weight: 300; + color: #fff; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + cursor: default; +} + +.toast .toast-action { + color: #eeff41; + font-weight: 500; + margin-right: -25px; + margin-left: 3rem; +} + +.toast.rounded { + border-radius: 24px; +} + +@media only screen and (max-width: 600px) { + .toast { + width: 100%; + border-radius: 0; + } +} + +.tabs { + position: relative; + overflow-x: auto; + overflow-y: hidden; + height: 48px; + width: 100%; + background-color: #fff; + margin: 0 auto; + white-space: nowrap; +} + +.tabs.tabs-transparent { + background-color: transparent; +} + +.tabs.tabs-transparent .tab a, +.tabs.tabs-transparent .tab.disabled a, +.tabs.tabs-transparent .tab.disabled a:hover { + color: rgba(255, 255, 255, 0.7); +} + +.tabs.tabs-transparent .tab a:hover, +.tabs.tabs-transparent .tab a.active { + color: #fff; +} + +.tabs.tabs-transparent .indicator { + background-color: #fff; +} + +.tabs.tabs-fixed-width { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.tabs.tabs-fixed-width .tab { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.tabs .tab { + display: inline-block; + text-align: center; + line-height: 48px; + height: 48px; + padding: 0; + margin: 0; + text-transform: uppercase; +} + +.tabs .tab a { + color: rgba(238, 110, 115, 0.7); + display: block; + width: 100%; + height: 100%; + padding: 0 24px; + font-size: 14px; + text-overflow: ellipsis; + overflow: hidden; + -webkit-transition: color .28s ease, background-color .28s ease; + transition: color .28s ease, background-color .28s ease; +} + +.tabs .tab a:focus, .tabs .tab a:focus.active { + background-color: rgba(246, 178, 181, 0.2); + outline: none; +} + +.tabs .tab a:hover, .tabs .tab a.active { + background-color: transparent; + color: #ee6e73; +} + +.tabs .tab.disabled a, +.tabs .tab.disabled a:hover { + color: rgba(238, 110, 115, 0.4); + cursor: default; +} + +.tabs .indicator { + position: absolute; + bottom: 0; + height: 2px; + background-color: #f6b2b5; + will-change: left, right; +} + +@media only screen and (max-width: 992px) { + .tabs { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + .tabs .tab { + -webkit-box-flex: 1; + -webkit-flex-grow: 1; + -ms-flex-positive: 1; + flex-grow: 1; + } + .tabs .tab a { + padding: 0 12px; + } +} + +.material-tooltip { + padding: 10px 8px; + font-size: 1rem; + z-index: 2000; + background-color: transparent; + border-radius: 2px; + color: #fff; + min-height: 36px; + line-height: 120%; + opacity: 0; + position: absolute; + text-align: center; + max-width: calc(100% - 4px); + overflow: hidden; + left: 0; + top: 0; + pointer-events: none; + visibility: hidden; + background-color: #323232; +} + +.backdrop { + position: absolute; + opacity: 0; + height: 7px; + width: 14px; + border-radius: 0 0 50% 50%; + background-color: #323232; + z-index: -1; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + visibility: hidden; +} + +.btn, .btn-large, .btn-small, +.btn-flat { + border: none; + border-radius: 2px; + display: inline-block; + height: 36px; + line-height: 36px; + padding: 0 16px; + text-transform: uppercase; + vertical-align: middle; + -webkit-tap-highlight-color: transparent; +} + +.btn.disabled, .disabled.btn-large, .disabled.btn-small, +.btn-floating.disabled, +.btn-large.disabled, +.btn-small.disabled, +.btn-flat.disabled, +.btn:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-floating:disabled, +.btn-large:disabled, +.btn-small:disabled, +.btn-flat:disabled, +.btn[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-floating[disabled], +.btn-large[disabled], +.btn-small[disabled], +.btn-flat[disabled] { + pointer-events: none; + background-color: #DFDFDF !important; + -webkit-box-shadow: none; + box-shadow: none; + color: #9F9F9F !important; + cursor: default; +} + +.btn.disabled:hover, .disabled.btn-large:hover, .disabled.btn-small:hover, +.btn-floating.disabled:hover, +.btn-large.disabled:hover, +.btn-small.disabled:hover, +.btn-flat.disabled:hover, +.btn:disabled:hover, +.btn-large:disabled:hover, +.btn-small:disabled:hover, +.btn-floating:disabled:hover, +.btn-large:disabled:hover, +.btn-small:disabled:hover, +.btn-flat:disabled:hover, +.btn[disabled]:hover, +.btn-large[disabled]:hover, +.btn-small[disabled]:hover, +.btn-floating[disabled]:hover, +.btn-large[disabled]:hover, +.btn-small[disabled]:hover, +.btn-flat[disabled]:hover { + background-color: #DFDFDF !important; + color: #9F9F9F !important; +} + +.btn, .btn-large, .btn-small, +.btn-floating, +.btn-large, +.btn-small, +.btn-flat { + font-size: 14px; + outline: 0; +} + +.btn i, .btn-large i, .btn-small i, +.btn-floating i, +.btn-large i, +.btn-small i, +.btn-flat i { + font-size: 1.3rem; + line-height: inherit; +} + +.btn:focus, .btn-large:focus, .btn-small:focus, +.btn-floating:focus { + background-color: #1d7d74; +} + +.btn, .btn-large, .btn-small { + text-decoration: none; + color: #fff; + background-color: #26a69a; + text-align: center; + letter-spacing: .5px; + -webkit-transition: background-color .2s ease-out; + transition: background-color .2s ease-out; + cursor: pointer; +} + +.btn:hover, .btn-large:hover, .btn-small:hover { + background-color: #2bbbad; +} + +.btn-floating { + display: inline-block; + color: #fff; + position: relative; + overflow: hidden; + z-index: 1; + width: 40px; + height: 40px; + line-height: 40px; + padding: 0; + background-color: #26a69a; + border-radius: 50%; + -webkit-transition: background-color .3s; + transition: background-color .3s; + cursor: pointer; + vertical-align: middle; +} + +.btn-floating:hover { + background-color: #26a69a; +} + +.btn-floating:before { + border-radius: 0; +} + +.btn-floating.btn-large { + width: 56px; + height: 56px; + padding: 0; +} + +.btn-floating.btn-large.halfway-fab { + bottom: -28px; +} + +.btn-floating.btn-large i { + line-height: 56px; +} + +.btn-floating.btn-small { + width: 32.4px; + height: 32.4px; +} + +.btn-floating.btn-small.halfway-fab { + bottom: -16.2px; +} + +.btn-floating.btn-small i { + line-height: 32.4px; +} + +.btn-floating.halfway-fab { + position: absolute; + right: 24px; + bottom: -20px; +} + +.btn-floating.halfway-fab.left { + right: auto; + left: 24px; +} + +.btn-floating i { + width: inherit; + display: inline-block; + text-align: center; + color: #fff; + font-size: 1.6rem; + line-height: 40px; +} + +button.btn-floating { + border: none; +} + +.fixed-action-btn { + position: fixed; + right: 23px; + bottom: 23px; + padding-top: 15px; + margin-bottom: 0; + z-index: 997; +} + +.fixed-action-btn.active ul { + visibility: visible; +} + +.fixed-action-btn.direction-left, .fixed-action-btn.direction-right { + padding: 0 0 0 15px; +} + +.fixed-action-btn.direction-left ul, .fixed-action-btn.direction-right ul { + text-align: right; + right: 64px; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); + height: 100%; + left: auto; + /*width 100% only goes to width of button container */ + width: 500px; +} + +.fixed-action-btn.direction-left ul li, .fixed-action-btn.direction-right ul li { + display: inline-block; + margin: 7.5px 15px 0 0; +} + +.fixed-action-btn.direction-right { + padding: 0 15px 0 0; +} + +.fixed-action-btn.direction-right ul { + text-align: left; + direction: rtl; + left: 64px; + right: auto; +} + +.fixed-action-btn.direction-right ul li { + margin: 7.5px 0 0 15px; +} + +.fixed-action-btn.direction-bottom { + padding: 0 0 15px 0; +} + +.fixed-action-btn.direction-bottom ul { + top: 64px; + bottom: auto; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -webkit-flex-direction: column-reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; +} + +.fixed-action-btn.direction-bottom ul li { + margin: 15px 0 0 0; +} + +.fixed-action-btn.toolbar { + padding: 0; + height: 56px; +} + +.fixed-action-btn.toolbar.active > a i { + opacity: 0; +} + +.fixed-action-btn.toolbar ul { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + top: 0; + bottom: 0; + z-index: 1; +} + +.fixed-action-btn.toolbar ul li { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + display: inline-block; + margin: 0; + height: 100%; + -webkit-transition: none; + transition: none; +} + +.fixed-action-btn.toolbar ul li a { + display: block; + overflow: hidden; + position: relative; + width: 100%; + height: 100%; + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: #fff; + line-height: 56px; + z-index: 1; +} + +.fixed-action-btn.toolbar ul li a i { + line-height: inherit; +} + +.fixed-action-btn ul { + left: 0; + right: 0; + text-align: center; + position: absolute; + bottom: 64px; + margin: 0; + visibility: hidden; +} + +.fixed-action-btn ul li { + margin-bottom: 15px; +} + +.fixed-action-btn ul a.btn-floating { + opacity: 0; +} + +.fixed-action-btn .fab-backdrop { + position: absolute; + top: 0; + left: 0; + z-index: -1; + width: 40px; + height: 40px; + background-color: #26a69a; + border-radius: 50%; + -webkit-transform: scale(0); + transform: scale(0); +} + +.btn-flat { + -webkit-box-shadow: none; + box-shadow: none; + background-color: transparent; + color: #343434; + cursor: pointer; + -webkit-transition: background-color .2s; + transition: background-color .2s; +} + +.btn-flat:focus, .btn-flat:hover { + -webkit-box-shadow: none; + box-shadow: none; +} + +.btn-flat:focus { + background-color: rgba(0, 0, 0, 0.1); +} + +.btn-flat.disabled, .btn-flat.btn-flat[disabled] { + background-color: transparent !important; + color: #b3b2b2 !important; + cursor: default; +} + +.btn-large { + height: 54px; + line-height: 54px; + font-size: 15px; + padding: 0 28px; +} + +.btn-large i { + font-size: 1.6rem; +} + +.btn-small { + height: 32.4px; + line-height: 32.4px; + font-size: 13px; +} + +.btn-small i { + font-size: 1.2rem; +} + +.btn-block { + display: block; +} + +.dropdown-content { + background-color: #fff; + margin: 0; + display: none; + min-width: 100px; + overflow-y: auto; + opacity: 0; + position: absolute; + left: 0; + top: 0; + z-index: 9999; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.dropdown-content:focus { + outline: 0; +} + +.dropdown-content li { + clear: both; + color: rgba(0, 0, 0, 0.87); + cursor: pointer; + min-height: 50px; + line-height: 1.5rem; + width: 100%; + text-align: left; +} + +.dropdown-content li:hover, .dropdown-content li.active { + background-color: #eee; +} + +.dropdown-content li:focus { + outline: none; +} + +.dropdown-content li.divider { + min-height: 0; + height: 1px; +} + +.dropdown-content li > a, .dropdown-content li > span { + font-size: 16px; + color: #26a69a; + display: block; + line-height: 22px; + padding: 14px 16px; +} + +.dropdown-content li > span > label { + top: 1px; + left: 0; + height: 18px; +} + +.dropdown-content li > a > i { + height: inherit; + line-height: inherit; + float: left; + margin: 0 24px 0 0; + width: 24px; +} + +body.keyboard-focused .dropdown-content li:focus { + background-color: #dadada; +} + +.input-field.col .dropdown-content [type="checkbox"] + label { + top: 1px; + left: 0; + height: 18px; + -webkit-transform: none; + transform: none; +} + +.dropdown-trigger { + cursor: pointer; +} + +/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */ +.waves-effect { + position: relative; + cursor: pointer; + display: inline-block; + overflow: hidden; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-tap-highlight-color: transparent; + vertical-align: middle; + z-index: 1; + -webkit-transition: .3s ease-out; + transition: .3s ease-out; +} + +.waves-effect .waves-ripple { + position: absolute; + border-radius: 50%; + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + opacity: 0; + background: rgba(0, 0, 0, 0.2); + -webkit-transition: all 0.7s ease-out; + transition: all 0.7s ease-out; + -webkit-transition-property: opacity, -webkit-transform; + transition-property: opacity, -webkit-transform; + transition-property: transform, opacity; + transition-property: transform, opacity, -webkit-transform; + -webkit-transform: scale(0); + transform: scale(0); + pointer-events: none; +} + +.waves-effect.waves-light .waves-ripple { + background-color: rgba(255, 255, 255, 0.45); +} + +.waves-effect.waves-red .waves-ripple { + background-color: rgba(244, 67, 54, 0.7); +} + +.waves-effect.waves-yellow .waves-ripple { + background-color: rgba(255, 235, 59, 0.7); +} + +.waves-effect.waves-orange .waves-ripple { + background-color: rgba(255, 152, 0, 0.7); +} + +.waves-effect.waves-purple .waves-ripple { + background-color: rgba(156, 39, 176, 0.7); +} + +.waves-effect.waves-green .waves-ripple { + background-color: rgba(76, 175, 80, 0.7); +} + +.waves-effect.waves-teal .waves-ripple { + background-color: rgba(0, 150, 136, 0.7); +} + +.waves-effect input[type="button"], .waves-effect input[type="reset"], .waves-effect input[type="submit"] { + border: 0; + font-style: normal; + font-size: inherit; + text-transform: inherit; + background: none; +} + +.waves-effect img { + position: relative; + z-index: -1; +} + +.waves-notransition { + -webkit-transition: none !important; + transition: none !important; +} + +.waves-circle { + -webkit-transform: translateZ(0); + transform: translateZ(0); + -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); +} + +.waves-input-wrapper { + border-radius: 0.2em; + vertical-align: bottom; +} + +.waves-input-wrapper .waves-button-input { + position: relative; + top: 0; + left: 0; + z-index: 1; +} + +.waves-circle { + text-align: center; + width: 2.5em; + height: 2.5em; + line-height: 2.5em; + border-radius: 50%; + -webkit-mask-image: none; +} + +.waves-block { + display: block; +} + +/* Firefox Bug: link not triggered */ +.waves-effect .waves-ripple { + z-index: -1; +} + +.modal { + display: none; + position: fixed; + left: 0; + right: 0; + background-color: #fafafa; + padding: 0; + max-height: 70%; + width: 55%; + margin: auto; + overflow-y: auto; + border-radius: 2px; + will-change: top, opacity; +} + +.modal:focus { + outline: none; +} + +@media only screen and (max-width: 992px) { + .modal { + width: 80%; + } +} + +.modal h1, .modal h2, .modal h3, .modal h4 { + margin-top: 0; +} + +.modal .modal-content { + padding: 24px; +} + +.modal .modal-close { + cursor: pointer; +} + +.modal .modal-footer { + border-radius: 0 0 2px 2px; + background-color: #fafafa; + padding: 4px 6px; + height: 56px; + width: 100%; + text-align: right; +} + +.modal .modal-footer .btn, .modal .modal-footer .btn-large, .modal .modal-footer .btn-small, .modal .modal-footer .btn-flat { + margin: 6px 0; +} + +.modal-overlay { + position: fixed; + z-index: 999; + top: -25%; + left: 0; + bottom: 0; + right: 0; + height: 125%; + width: 100%; + background: #000; + display: none; + will-change: opacity; +} + +.modal.modal-fixed-footer { + padding: 0; + height: 70%; +} + +.modal.modal-fixed-footer .modal-content { + position: absolute; + height: calc(100% - 56px); + max-height: 100%; + width: 100%; + overflow-y: auto; +} + +.modal.modal-fixed-footer .modal-footer { + border-top: 1px solid rgba(0, 0, 0, 0.1); + position: absolute; + bottom: 0; +} + +.modal.bottom-sheet { + top: auto; + bottom: -100%; + margin: 0; + width: 100%; + max-height: 45%; + border-radius: 0; + will-change: bottom, opacity; +} + +.collapsible { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; + border-left: 1px solid #ddd; + margin: 0.5rem 0 1rem 0; +} + +.collapsible-header { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + cursor: pointer; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + padding: 1rem; + background-color: #fff; + border-bottom: 1px solid #ddd; +} + +.collapsible-header:focus { + outline: 0; +} + +.collapsible-header i { + width: 2rem; + font-size: 1.6rem; + display: inline-block; + text-align: center; + margin-right: 1rem; +} + +.keyboard-focused .collapsible-header:focus { + background-color: #eee; +} + +.collapsible-body { + display: none; + border-bottom: 1px solid #ddd; + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 2rem; +} + +.sidenav .collapsible, +.sidenav.fixed .collapsible { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.sidenav .collapsible li, +.sidenav.fixed .collapsible li { + padding: 0; +} + +.sidenav .collapsible-header, +.sidenav.fixed .collapsible-header { + background-color: transparent; + border: none; + line-height: inherit; + height: inherit; + padding: 0 16px; +} + +.sidenav .collapsible-header:hover, +.sidenav.fixed .collapsible-header:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav .collapsible-header i, +.sidenav.fixed .collapsible-header i { + line-height: inherit; +} + +.sidenav .collapsible-body, +.sidenav.fixed .collapsible-body { + border: 0; + background-color: #fff; +} + +.sidenav .collapsible-body li a, +.sidenav.fixed .collapsible-body li a { + padding: 0 23.5px 0 31px; +} + +.collapsible.popout { + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.collapsible.popout > li { + -webkit-box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + margin: 0 24px; + -webkit-transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); + transition: margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94); +} + +.collapsible.popout > li.active { + -webkit-box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); + margin: 16px 0; +} + +.chip { + display: inline-block; + height: 32px; + font-size: 13px; + font-weight: 500; + color: rgba(0, 0, 0, 0.6); + line-height: 32px; + padding: 0 12px; + border-radius: 16px; + background-color: #e4e4e4; + margin-bottom: 5px; + margin-right: 5px; +} + +.chip:focus { + outline: none; + background-color: #26a69a; + color: #fff; +} + +.chip > img { + float: left; + margin: 0 8px 0 -12px; + height: 32px; + width: 32px; + border-radius: 50%; +} + +.chip .close { + cursor: pointer; + float: right; + font-size: 16px; + line-height: 32px; + padding-left: 8px; +} + +.chips { + border: none; + border-bottom: 1px solid #9e9e9e; + -webkit-box-shadow: none; + box-shadow: none; + margin: 0 0 8px 0; + min-height: 45px; + outline: none; + -webkit-transition: all .3s; + transition: all .3s; +} + +.chips.focus { + border-bottom: 1px solid #26a69a; + -webkit-box-shadow: 0 1px 0 0 #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +.chips:hover { + cursor: text; +} + +.chips .input { + background: none; + border: 0; + color: rgba(0, 0, 0, 0.6); + display: inline-block; + font-size: 16px; + height: 3rem; + line-height: 32px; + outline: 0; + margin: 0; + padding: 0 !important; + width: 120px !important; +} + +.chips .input:focus { + border: 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} + +.chips .autocomplete-content { + margin-top: 0; + margin-bottom: 0; +} + +.prefix ~ .chips { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.chips:empty ~ label { + font-size: 0.8rem; + -webkit-transform: translateY(-140%); + transform: translateY(-140%); +} + +.materialboxed { + display: block; + cursor: -webkit-zoom-in; + cursor: zoom-in; + position: relative; + -webkit-transition: opacity .4s; + transition: opacity .4s; + -webkit-backface-visibility: hidden; +} + +.materialboxed:hover:not(.active) { + opacity: .8; +} + +.materialboxed.active { + cursor: -webkit-zoom-out; + cursor: zoom-out; +} + +#materialbox-overlay { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #292929; + z-index: 1000; + will-change: opacity; +} + +.materialbox-caption { + position: fixed; + display: none; + color: #fff; + line-height: 50px; + bottom: 0; + left: 0; + width: 100%; + text-align: center; + padding: 0% 15%; + height: 50px; + z-index: 1000; + -webkit-font-smoothing: antialiased; +} + +select:focus { + outline: 1px solid #c9f3ef; +} + +button:focus { + outline: none; + background-color: #2ab7a9; +} + +label { + font-size: 0.8rem; + color: #9e9e9e; +} + +/* Text Inputs + Textarea + ========================================================================== */ +/* Style Placeholders */ +::-webkit-input-placeholder { + color: #d1d1d1; +} +::-moz-placeholder { + color: #d1d1d1; +} +:-ms-input-placeholder { + color: #d1d1d1; +} +::-ms-input-placeholder { + color: #d1d1d1; +} +::placeholder { + color: #d1d1d1; +} + +/* Text inputs */ +input:not([type]), +input[type=text]:not(.browser-default), +input[type=password]:not(.browser-default), +input[type=email]:not(.browser-default), +input[type=url]:not(.browser-default), +input[type=time]:not(.browser-default), +input[type=date]:not(.browser-default), +input[type=datetime]:not(.browser-default), +input[type=datetime-local]:not(.browser-default), +input[type=tel]:not(.browser-default), +input[type=number]:not(.browser-default), +input[type=search]:not(.browser-default), +textarea.materialize-textarea { + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + border-radius: 0; + outline: none; + height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-box-sizing: content-box; + box-sizing: content-box; + -webkit-transition: border .3s, -webkit-box-shadow .3s; + transition: border .3s, -webkit-box-shadow .3s; + transition: box-shadow .3s, border .3s; + transition: box-shadow .3s, border .3s, -webkit-box-shadow .3s; +} + +input:not([type]):disabled, input:not([type])[readonly="readonly"], +input[type=text]:not(.browser-default):disabled, +input[type=text]:not(.browser-default)[readonly="readonly"], +input[type=password]:not(.browser-default):disabled, +input[type=password]:not(.browser-default)[readonly="readonly"], +input[type=email]:not(.browser-default):disabled, +input[type=email]:not(.browser-default)[readonly="readonly"], +input[type=url]:not(.browser-default):disabled, +input[type=url]:not(.browser-default)[readonly="readonly"], +input[type=time]:not(.browser-default):disabled, +input[type=time]:not(.browser-default)[readonly="readonly"], +input[type=date]:not(.browser-default):disabled, +input[type=date]:not(.browser-default)[readonly="readonly"], +input[type=datetime]:not(.browser-default):disabled, +input[type=datetime]:not(.browser-default)[readonly="readonly"], +input[type=datetime-local]:not(.browser-default):disabled, +input[type=datetime-local]:not(.browser-default)[readonly="readonly"], +input[type=tel]:not(.browser-default):disabled, +input[type=tel]:not(.browser-default)[readonly="readonly"], +input[type=number]:not(.browser-default):disabled, +input[type=number]:not(.browser-default)[readonly="readonly"], +input[type=search]:not(.browser-default):disabled, +input[type=search]:not(.browser-default)[readonly="readonly"], +textarea.materialize-textarea:disabled, +textarea.materialize-textarea[readonly="readonly"] { + color: rgba(0, 0, 0, 0.42); + border-bottom: 1px dotted rgba(0, 0, 0, 0.42); +} + +input:not([type]):disabled + label, +input:not([type])[readonly="readonly"] + label, +input[type=text]:not(.browser-default):disabled + label, +input[type=text]:not(.browser-default)[readonly="readonly"] + label, +input[type=password]:not(.browser-default):disabled + label, +input[type=password]:not(.browser-default)[readonly="readonly"] + label, +input[type=email]:not(.browser-default):disabled + label, +input[type=email]:not(.browser-default)[readonly="readonly"] + label, +input[type=url]:not(.browser-default):disabled + label, +input[type=url]:not(.browser-default)[readonly="readonly"] + label, +input[type=time]:not(.browser-default):disabled + label, +input[type=time]:not(.browser-default)[readonly="readonly"] + label, +input[type=date]:not(.browser-default):disabled + label, +input[type=date]:not(.browser-default)[readonly="readonly"] + label, +input[type=datetime]:not(.browser-default):disabled + label, +input[type=datetime]:not(.browser-default)[readonly="readonly"] + label, +input[type=datetime-local]:not(.browser-default):disabled + label, +input[type=datetime-local]:not(.browser-default)[readonly="readonly"] + label, +input[type=tel]:not(.browser-default):disabled + label, +input[type=tel]:not(.browser-default)[readonly="readonly"] + label, +input[type=number]:not(.browser-default):disabled + label, +input[type=number]:not(.browser-default)[readonly="readonly"] + label, +input[type=search]:not(.browser-default):disabled + label, +input[type=search]:not(.browser-default)[readonly="readonly"] + label, +textarea.materialize-textarea:disabled + label, +textarea.materialize-textarea[readonly="readonly"] + label { + color: rgba(0, 0, 0, 0.42); +} + +input:not([type]):focus:not([readonly]), +input[type=text]:not(.browser-default):focus:not([readonly]), +input[type=password]:not(.browser-default):focus:not([readonly]), +input[type=email]:not(.browser-default):focus:not([readonly]), +input[type=url]:not(.browser-default):focus:not([readonly]), +input[type=time]:not(.browser-default):focus:not([readonly]), +input[type=date]:not(.browser-default):focus:not([readonly]), +input[type=datetime]:not(.browser-default):focus:not([readonly]), +input[type=datetime-local]:not(.browser-default):focus:not([readonly]), +input[type=tel]:not(.browser-default):focus:not([readonly]), +input[type=number]:not(.browser-default):focus:not([readonly]), +input[type=search]:not(.browser-default):focus:not([readonly]), +textarea.materialize-textarea:focus:not([readonly]) { + border-bottom: 1px solid #26a69a; + -webkit-box-shadow: 0 1px 0 0 #26a69a; + box-shadow: 0 1px 0 0 #26a69a; +} + +input:not([type]):focus:not([readonly]) + label, +input[type=text]:not(.browser-default):focus:not([readonly]) + label, +input[type=password]:not(.browser-default):focus:not([readonly]) + label, +input[type=email]:not(.browser-default):focus:not([readonly]) + label, +input[type=url]:not(.browser-default):focus:not([readonly]) + label, +input[type=time]:not(.browser-default):focus:not([readonly]) + label, +input[type=date]:not(.browser-default):focus:not([readonly]) + label, +input[type=datetime]:not(.browser-default):focus:not([readonly]) + label, +input[type=datetime-local]:not(.browser-default):focus:not([readonly]) + label, +input[type=tel]:not(.browser-default):focus:not([readonly]) + label, +input[type=number]:not(.browser-default):focus:not([readonly]) + label, +input[type=search]:not(.browser-default):focus:not([readonly]) + label, +textarea.materialize-textarea:focus:not([readonly]) + label { + color: #26a69a; +} + +input:not([type]):focus.valid ~ label, +input[type=text]:not(.browser-default):focus.valid ~ label, +input[type=password]:not(.browser-default):focus.valid ~ label, +input[type=email]:not(.browser-default):focus.valid ~ label, +input[type=url]:not(.browser-default):focus.valid ~ label, +input[type=time]:not(.browser-default):focus.valid ~ label, +input[type=date]:not(.browser-default):focus.valid ~ label, +input[type=datetime]:not(.browser-default):focus.valid ~ label, +input[type=datetime-local]:not(.browser-default):focus.valid ~ label, +input[type=tel]:not(.browser-default):focus.valid ~ label, +input[type=number]:not(.browser-default):focus.valid ~ label, +input[type=search]:not(.browser-default):focus.valid ~ label, +textarea.materialize-textarea:focus.valid ~ label { + color: #4CAF50; +} + +input:not([type]):focus.invalid ~ label, +input[type=text]:not(.browser-default):focus.invalid ~ label, +input[type=password]:not(.browser-default):focus.invalid ~ label, +input[type=email]:not(.browser-default):focus.invalid ~ label, +input[type=url]:not(.browser-default):focus.invalid ~ label, +input[type=time]:not(.browser-default):focus.invalid ~ label, +input[type=date]:not(.browser-default):focus.invalid ~ label, +input[type=datetime]:not(.browser-default):focus.invalid ~ label, +input[type=datetime-local]:not(.browser-default):focus.invalid ~ label, +input[type=tel]:not(.browser-default):focus.invalid ~ label, +input[type=number]:not(.browser-default):focus.invalid ~ label, +input[type=search]:not(.browser-default):focus.invalid ~ label, +textarea.materialize-textarea:focus.invalid ~ label { + color: #F44336; +} + +input:not([type]).validate + label, +input[type=text]:not(.browser-default).validate + label, +input[type=password]:not(.browser-default).validate + label, +input[type=email]:not(.browser-default).validate + label, +input[type=url]:not(.browser-default).validate + label, +input[type=time]:not(.browser-default).validate + label, +input[type=date]:not(.browser-default).validate + label, +input[type=datetime]:not(.browser-default).validate + label, +input[type=datetime-local]:not(.browser-default).validate + label, +input[type=tel]:not(.browser-default).validate + label, +input[type=number]:not(.browser-default).validate + label, +input[type=search]:not(.browser-default).validate + label, +textarea.materialize-textarea.validate + label { + width: 100%; +} + +/* Validation Sass Placeholders */ +input.valid:not([type]), input.valid:not([type]):focus, +input.valid[type=text]:not(.browser-default), +input.valid[type=text]:not(.browser-default):focus, +input.valid[type=password]:not(.browser-default), +input.valid[type=password]:not(.browser-default):focus, +input.valid[type=email]:not(.browser-default), +input.valid[type=email]:not(.browser-default):focus, +input.valid[type=url]:not(.browser-default), +input.valid[type=url]:not(.browser-default):focus, +input.valid[type=time]:not(.browser-default), +input.valid[type=time]:not(.browser-default):focus, +input.valid[type=date]:not(.browser-default), +input.valid[type=date]:not(.browser-default):focus, +input.valid[type=datetime]:not(.browser-default), +input.valid[type=datetime]:not(.browser-default):focus, +input.valid[type=datetime-local]:not(.browser-default), +input.valid[type=datetime-local]:not(.browser-default):focus, +input.valid[type=tel]:not(.browser-default), +input.valid[type=tel]:not(.browser-default):focus, +input.valid[type=number]:not(.browser-default), +input.valid[type=number]:not(.browser-default):focus, +input.valid[type=search]:not(.browser-default), +input.valid[type=search]:not(.browser-default):focus, +textarea.materialize-textarea.valid, +textarea.materialize-textarea.valid:focus, .select-wrapper.valid > input.select-dropdown { + border-bottom: 1px solid #4CAF50; + -webkit-box-shadow: 0 1px 0 0 #4CAF50; + box-shadow: 0 1px 0 0 #4CAF50; +} + +input.invalid:not([type]), input.invalid:not([type]):focus, +input.invalid[type=text]:not(.browser-default), +input.invalid[type=text]:not(.browser-default):focus, +input.invalid[type=password]:not(.browser-default), +input.invalid[type=password]:not(.browser-default):focus, +input.invalid[type=email]:not(.browser-default), +input.invalid[type=email]:not(.browser-default):focus, +input.invalid[type=url]:not(.browser-default), +input.invalid[type=url]:not(.browser-default):focus, +input.invalid[type=time]:not(.browser-default), +input.invalid[type=time]:not(.browser-default):focus, +input.invalid[type=date]:not(.browser-default), +input.invalid[type=date]:not(.browser-default):focus, +input.invalid[type=datetime]:not(.browser-default), +input.invalid[type=datetime]:not(.browser-default):focus, +input.invalid[type=datetime-local]:not(.browser-default), +input.invalid[type=datetime-local]:not(.browser-default):focus, +input.invalid[type=tel]:not(.browser-default), +input.invalid[type=tel]:not(.browser-default):focus, +input.invalid[type=number]:not(.browser-default), +input.invalid[type=number]:not(.browser-default):focus, +input.invalid[type=search]:not(.browser-default), +input.invalid[type=search]:not(.browser-default):focus, +textarea.materialize-textarea.invalid, +textarea.materialize-textarea.invalid:focus, .select-wrapper.invalid > input.select-dropdown, +.select-wrapper.invalid > input.select-dropdown:focus { + border-bottom: 1px solid #F44336; + -webkit-box-shadow: 0 1px 0 0 #F44336; + box-shadow: 0 1px 0 0 #F44336; +} + +input:not([type]).valid ~ .helper-text[data-success], +input:not([type]):focus.valid ~ .helper-text[data-success], +input:not([type]).invalid ~ .helper-text[data-error], +input:not([type]):focus.invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default).valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success], +input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error], +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error], +textarea.materialize-textarea.valid ~ .helper-text[data-success], +textarea.materialize-textarea:focus.valid ~ .helper-text[data-success], +textarea.materialize-textarea.invalid ~ .helper-text[data-error], +textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error], .select-wrapper.valid .helper-text[data-success], +.select-wrapper.invalid ~ .helper-text[data-error] { + color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; +} + +input:not([type]).valid ~ .helper-text:after, +input:not([type]):focus.valid ~ .helper-text:after, +input[type=text]:not(.browser-default).valid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=password]:not(.browser-default).valid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=email]:not(.browser-default).valid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=url]:not(.browser-default).valid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=time]:not(.browser-default).valid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=date]:not(.browser-default).valid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=tel]:not(.browser-default).valid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=number]:not(.browser-default).valid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after, +input[type=search]:not(.browser-default).valid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after, +textarea.materialize-textarea.valid ~ .helper-text:after, +textarea.materialize-textarea:focus.valid ~ .helper-text:after, .select-wrapper.valid ~ .helper-text:after { + content: attr(data-success); + color: #4CAF50; +} + +input:not([type]).invalid ~ .helper-text:after, +input:not([type]):focus.invalid ~ .helper-text:after, +input[type=text]:not(.browser-default).invalid ~ .helper-text:after, +input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=password]:not(.browser-default).invalid ~ .helper-text:after, +input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=email]:not(.browser-default).invalid ~ .helper-text:after, +input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=url]:not(.browser-default).invalid ~ .helper-text:after, +input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=time]:not(.browser-default).invalid ~ .helper-text:after, +input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=date]:not(.browser-default).invalid ~ .helper-text:after, +input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after, +input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default).invalid ~ .helper-text:after, +input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=number]:not(.browser-default).invalid ~ .helper-text:after, +input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after, +input[type=search]:not(.browser-default).invalid ~ .helper-text:after, +input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after, +textarea.materialize-textarea.invalid ~ .helper-text:after, +textarea.materialize-textarea:focus.invalid ~ .helper-text:after, .select-wrapper.invalid ~ .helper-text:after { + content: attr(data-error); + color: #F44336; +} + +input:not([type]) + label:after, +input[type=text]:not(.browser-default) + label:after, +input[type=password]:not(.browser-default) + label:after, +input[type=email]:not(.browser-default) + label:after, +input[type=url]:not(.browser-default) + label:after, +input[type=time]:not(.browser-default) + label:after, +input[type=date]:not(.browser-default) + label:after, +input[type=datetime]:not(.browser-default) + label:after, +input[type=datetime-local]:not(.browser-default) + label:after, +input[type=tel]:not(.browser-default) + label:after, +input[type=number]:not(.browser-default) + label:after, +input[type=search]:not(.browser-default) + label:after, +textarea.materialize-textarea + label:after, .select-wrapper + label:after { + display: block; + content: ""; + position: absolute; + top: 100%; + left: 0; + opacity: 0; + -webkit-transition: .2s opacity ease-out, .2s color ease-out; + transition: .2s opacity ease-out, .2s color ease-out; +} + +.input-field { + position: relative; + margin-top: 1rem; + margin-bottom: 1rem; +} + +.input-field.inline { + display: inline-block; + vertical-align: middle; + margin-left: 5px; +} + +.input-field.inline input, +.input-field.inline .select-dropdown { + margin-bottom: 1rem; +} + +.input-field.col label { + left: 0.75rem; +} + +.input-field.col .prefix ~ label, +.input-field.col .prefix ~ .validate ~ label { + width: calc(100% - 3rem - 1.5rem); +} + +.input-field > label { + color: #9e9e9e; + position: absolute; + top: 0; + left: 0; + font-size: 1rem; + cursor: text; + -webkit-transition: color .2s ease-out, -webkit-transform .2s ease-out; + transition: color .2s ease-out, -webkit-transform .2s ease-out; + transition: transform .2s ease-out, color .2s ease-out; + transition: transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out; + -webkit-transform-origin: 0% 100%; + transform-origin: 0% 100%; + text-align: initial; + -webkit-transform: translateY(12px); + transform: translateY(12px); +} + +.input-field > label:not(.label-icon).active { + -webkit-transform: translateY(-14px) scale(0.8); + transform: translateY(-14px) scale(0.8); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.input-field > input[type]:-webkit-autofill:not(.browser-default):not([type="search"]) + label, +.input-field > input[type=date]:not(.browser-default) + label, +.input-field > input[type=time]:not(.browser-default) + label { + -webkit-transform: translateY(-14px) scale(0.8); + transform: translateY(-14px) scale(0.8); + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} + +.input-field .helper-text { + position: relative; + min-height: 18px; + display: block; + font-size: 12px; + color: rgba(0, 0, 0, 0.54); +} + +.input-field .helper-text::after { + opacity: 1; + position: absolute; + top: 0; + left: 0; +} + +.input-field .prefix { + position: absolute; + width: 3rem; + font-size: 2rem; + -webkit-transition: color .2s; + transition: color .2s; + top: 0.5rem; +} + +.input-field .prefix.active { + color: #26a69a; +} + +.input-field .prefix ~ input, +.input-field .prefix ~ textarea, +.input-field .prefix ~ label, +.input-field .prefix ~ .validate ~ label, +.input-field .prefix ~ .helper-text, +.input-field .prefix ~ .autocomplete-content { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.input-field .prefix ~ label { + margin-left: 3rem; +} + +@media only screen and (max-width: 992px) { + .input-field .prefix ~ input { + width: 86%; + width: calc(100% - 3rem); + } +} + +@media only screen and (max-width: 600px) { + .input-field .prefix ~ input { + width: 80%; + width: calc(100% - 3rem); + } +} + +/* Search Field */ +.input-field input[type=search] { + display: block; + line-height: inherit; + -webkit-transition: .3s background-color; + transition: .3s background-color; +} + +.nav-wrapper .input-field input[type=search] { + height: inherit; + padding-left: 4rem; + width: calc(100% - 4rem); + border: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.input-field input[type=search]:focus:not(.browser-default) { + background-color: #fff; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + color: #444; +} + +.input-field input[type=search]:focus:not(.browser-default) + label i, +.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close, +.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons { + color: #444; +} + +.input-field input[type=search] + .label-icon { + -webkit-transform: none; + transform: none; + left: 1rem; +} + +.input-field input[type=search] ~ .mdi-navigation-close, +.input-field input[type=search] ~ .material-icons { + position: absolute; + top: 0; + right: 1rem; + color: transparent; + cursor: pointer; + font-size: 2rem; + -webkit-transition: .3s color; + transition: .3s color; +} + +/* Textarea */ +textarea { + width: 100%; + height: 3rem; + background-color: transparent; +} + +textarea.materialize-textarea { + line-height: normal; + overflow-y: hidden; + /* prevents scroll bar flash */ + padding: .8rem 0 .8rem 0; + /* prevents text jump on Enter keypress */ + resize: none; + min-height: 3rem; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.hiddendiv { + visibility: hidden; + white-space: pre-wrap; + word-wrap: break-word; + overflow-wrap: break-word; + /* future version of deprecated 'word-wrap' */ + padding-top: 1.2rem; + /* prevents text jump on Enter keypress */ + position: absolute; + top: 0; + z-index: -1; +} + +/* Autocomplete */ +.autocomplete-content li .highlight { + color: #444; +} + +.autocomplete-content li img { + height: 40px; + width: 40px; + margin: 5px 15px; +} + +/* Character Counter */ +.character-counter { + min-height: 18px; +} + +/* Radio Buttons + ========================================================================== */ +[type="radio"]:not(:checked), +[type="radio"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type="radio"]:not(:checked) + span, +[type="radio"]:checked + span { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + -webkit-transition: .28s ease; + transition: .28s ease; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type="radio"] + span:before, +[type="radio"] + span:after { + content: ''; + position: absolute; + left: 0; + top: 0; + margin: 4px; + width: 16px; + height: 16px; + z-index: 0; + -webkit-transition: .28s ease; + transition: .28s ease; +} + +/* Unchecked styles */ +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after, +[type="radio"]:checked + span:before, +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border-radius: 50%; +} + +[type="radio"]:not(:checked) + span:before, +[type="radio"]:not(:checked) + span:after { + border: 2px solid #5a5a5a; +} + +[type="radio"]:not(:checked) + span:after { + -webkit-transform: scale(0); + transform: scale(0); +} + +/* Checked styles */ +[type="radio"]:checked + span:before { + border: 2px solid transparent; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:before, +[type="radio"].with-gap:checked + span:after { + border: 2px solid #26a69a; +} + +[type="radio"]:checked + span:after, +[type="radio"].with-gap:checked + span:after { + background-color: #26a69a; +} + +[type="radio"]:checked + span:after { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} + +/* Radio With gap */ +[type="radio"].with-gap:checked + span:after { + -webkit-transform: scale(0.5); + transform: scale(0.5); +} + +/* Focused styles */ +[type="radio"].tabbed:focus + span:before { + -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); +} + +/* Disabled Radio With gap */ +[type="radio"].with-gap:disabled:checked + span:before { + border: 2px solid rgba(0, 0, 0, 0.42); +} + +[type="radio"].with-gap:disabled:checked + span:after { + border: none; + background-color: rgba(0, 0, 0, 0.42); +} + +/* Disabled style */ +[type="radio"]:disabled:not(:checked) + span:before, +[type="radio"]:disabled:checked + span:before { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled + span { + color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled:not(:checked) + span:before { + border-color: rgba(0, 0, 0, 0.42); +} + +[type="radio"]:disabled:checked + span:after { + background-color: rgba(0, 0, 0, 0.42); + border-color: #949494; +} + +/* Checkboxes + ========================================================================== */ +/* Remove default checkbox */ +[type="checkbox"]:not(:checked), +[type="checkbox"]:checked { + position: absolute; + opacity: 0; + pointer-events: none; +} + +[type="checkbox"] { + /* checkbox aspect */ +} + +[type="checkbox"] + span:not(.lever) { + position: relative; + padding-left: 35px; + cursor: pointer; + display: inline-block; + height: 25px; + line-height: 25px; + font-size: 1rem; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +[type="checkbox"] + span:not(.lever):before, +[type="checkbox"]:not(.filled-in) + span:not(.lever):after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 18px; + height: 18px; + z-index: 0; + border: 2px solid #5a5a5a; + border-radius: 1px; + margin-top: 3px; + -webkit-transition: .2s; + transition: .2s; +} + +[type="checkbox"]:not(.filled-in) + span:not(.lever):after { + border: 0; + -webkit-transform: scale(0); + transform: scale(0); +} + +[type="checkbox"]:not(:checked):disabled + span:not(.lever):before { + border: none; + background-color: rgba(0, 0, 0, 0.42); +} + +[type="checkbox"].tabbed:focus + span:not(.lever):after { + -webkit-transform: scale(1); + transform: scale(1); + border: 0; + border-radius: 50%; + -webkit-box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"]:checked + span:not(.lever):before { + top: -4px; + left: -5px; + width: 12px; + height: 22px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #26a69a; + border-bottom: 2px solid #26a69a; + -webkit-transform: rotate(40deg); + transform: rotate(40deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:checked:disabled + span:before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + border-bottom: 2px solid rgba(0, 0, 0, 0.42); +} + +/* Indeterminate checkbox */ +[type="checkbox"]:indeterminate + span:not(.lever):before { + top: -11px; + left: -12px; + width: 10px; + height: 22px; + border-top: none; + border-left: none; + border-right: 2px solid #26a69a; + border-bottom: none; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"]:indeterminate:disabled + span:not(.lever):before { + border-right: 2px solid rgba(0, 0, 0, 0.42); + background-color: transparent; +} + +[type="checkbox"].filled-in + span:not(.lever):after { + border-radius: 2px; +} + +[type="checkbox"].filled-in + span:not(.lever):before, +[type="checkbox"].filled-in + span:not(.lever):after { + content: ''; + left: 0; + position: absolute; + /* .1s delay is for check animation */ + -webkit-transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; + z-index: 1; +} + +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):before { + width: 0; + height: 0; + border: 3px solid transparent; + left: 6px; + top: 10px; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:not(:checked) + span:not(.lever):after { + height: 20px; + width: 20px; + background-color: transparent; + border: 2px solid #5a5a5a; + top: 0px; + z-index: 0; +} + +[type="checkbox"].filled-in:checked + span:not(.lever):before { + top: 0; + left: 1px; + width: 8px; + height: 13px; + border-top: 2px solid transparent; + border-left: 2px solid transparent; + border-right: 2px solid #fff; + border-bottom: 2px solid #fff; + -webkit-transform: rotateZ(37deg); + transform: rotateZ(37deg); + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} + +[type="checkbox"].filled-in:checked + span:not(.lever):after { + top: 0; + width: 20px; + height: 20px; + border: 2px solid #26a69a; + background-color: #26a69a; + z-index: 0; +} + +[type="checkbox"].filled-in.tabbed:focus + span:not(.lever):after { + border-radius: 2px; + border-color: #5a5a5a; + background-color: rgba(0, 0, 0, 0.1); +} + +[type="checkbox"].filled-in.tabbed:checked:focus + span:not(.lever):after { + border-radius: 2px; + background-color: #26a69a; + border-color: #26a69a; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):before { + background-color: transparent; + border: 2px solid transparent; +} + +[type="checkbox"].filled-in:disabled:not(:checked) + span:not(.lever):after { + border-color: transparent; + background-color: #949494; +} + +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):before { + background-color: transparent; +} + +[type="checkbox"].filled-in:disabled:checked + span:not(.lever):after { + background-color: #949494; + border-color: #949494; +} + +/* Switch + ========================================================================== */ +.switch, +.switch * { + -webkit-tap-highlight-color: transparent; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.switch label { + cursor: pointer; +} + +.switch label input[type=checkbox] { + opacity: 0; + width: 0; + height: 0; +} + +.switch label input[type=checkbox]:checked + .lever { + background-color: #84c7c1; +} + +.switch label input[type=checkbox]:checked + .lever:before, .switch label input[type=checkbox]:checked + .lever:after { + left: 18px; +} + +.switch label input[type=checkbox]:checked + .lever:after { + background-color: #26a69a; +} + +.switch label .lever { + content: ""; + display: inline-block; + position: relative; + width: 36px; + height: 14px; + background-color: rgba(0, 0, 0, 0.38); + border-radius: 15px; + margin-right: 10px; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; + vertical-align: middle; + margin: 0 16px; +} + +.switch label .lever:before, .switch label .lever:after { + content: ""; + position: absolute; + display: inline-block; + width: 20px; + height: 20px; + border-radius: 50%; + left: 0; + top: -3px; + -webkit-transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; + transition: left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; + transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease; +} + +.switch label .lever:before { + background-color: rgba(38, 166, 154, 0.15); +} + +.switch label .lever:after { + background-color: #F1F1F1; + -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} + +input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, +input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { + -webkit-transform: scale(2.4); + transform: scale(2.4); + background-color: rgba(38, 166, 154, 0.15); +} + +input[type=checkbox]:not(:disabled) ~ .lever:active:before, +input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { + -webkit-transform: scale(2.4); + transform: scale(2.4); + background-color: rgba(0, 0, 0, 0.08); +} + +.switch input[type=checkbox][disabled] + .lever { + cursor: default; + background-color: rgba(0, 0, 0, 0.12); +} + +.switch label input[type=checkbox][disabled] + .lever:after, +.switch label input[type=checkbox][disabled]:checked + .lever:after { + background-color: #949494; +} + +/* Select Field + ========================================================================== */ +select { + display: none; +} + +select.browser-default { + display: block; +} + +select { + background-color: rgba(255, 255, 255, 0.9); + width: 100%; + padding: 5px; + border: 1px solid #f2f2f2; + border-radius: 2px; + height: 3rem; +} + +.select-label { + position: absolute; +} + +.select-wrapper { + position: relative; +} + +.select-wrapper.valid + label, +.select-wrapper.invalid + label { + width: 100%; + pointer-events: none; +} + +.select-wrapper input.select-dropdown { + position: relative; + cursor: pointer; + background-color: transparent; + border: none; + border-bottom: 1px solid #9e9e9e; + outline: none; + height: 3rem; + line-height: 3rem; + width: 100%; + font-size: 16px; + margin: 0 0 8px 0; + padding: 0; + display: block; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 1; +} + +.select-wrapper input.select-dropdown:focus { + border-bottom: 1px solid #26a69a; +} + +.select-wrapper .caret { + position: absolute; + right: 0; + top: 0; + bottom: 0; + margin: auto 0; + z-index: 0; + fill: rgba(0, 0, 0, 0.87); +} + +.select-wrapper + label { + position: absolute; + top: -26px; + font-size: 0.8rem; +} + +select:disabled { + color: rgba(0, 0, 0, 0.42); +} + +.select-wrapper.disabled + label { + color: rgba(0, 0, 0, 0.42); +} + +.select-wrapper.disabled .caret { + fill: rgba(0, 0, 0, 0.42); +} + +.select-wrapper input.select-dropdown:disabled { + color: rgba(0, 0, 0, 0.42); + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.select-wrapper i { + color: rgba(0, 0, 0, 0.3); +} + +.select-dropdown li.disabled, +.select-dropdown li.disabled > span, +.select-dropdown li.optgroup { + color: rgba(0, 0, 0, 0.3); + background-color: transparent; +} + +body.keyboard-focused .select-dropdown.dropdown-content li:focus { + background-color: rgba(0, 0, 0, 0.08); +} + +.select-dropdown.dropdown-content li:hover { + background-color: rgba(0, 0, 0, 0.08); +} + +.select-dropdown.dropdown-content li.selected { + background-color: rgba(0, 0, 0, 0.03); +} + +.prefix ~ .select-wrapper { + margin-left: 3rem; + width: 92%; + width: calc(100% - 3rem); +} + +.prefix ~ label { + margin-left: 3rem; +} + +.select-dropdown li img { + height: 40px; + width: 40px; + margin: 5px 15px; + float: right; +} + +.select-dropdown li.optgroup { + border-top: 1px solid #eee; +} + +.select-dropdown li.optgroup.selected > span { + color: rgba(0, 0, 0, 0.7); +} + +.select-dropdown li.optgroup > span { + color: rgba(0, 0, 0, 0.4); +} + +.select-dropdown li.optgroup ~ li.optgroup-option { + padding-left: 1rem; +} + +/* File Input + ========================================================================== */ +.file-field { + position: relative; +} + +.file-field .file-path-wrapper { + overflow: hidden; + padding-left: 10px; +} + +.file-field input.file-path { + width: 100%; +} + +.file-field .btn, .file-field .btn-large, .file-field .btn-small { + float: left; + height: 3rem; + line-height: 3rem; +} + +.file-field span { + cursor: pointer; +} + +.file-field input[type=file] { + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + width: 100%; + margin: 0; + padding: 0; + font-size: 20px; + cursor: pointer; + opacity: 0; + filter: alpha(opacity=0); +} + +.file-field input[type=file]::-webkit-file-upload-button { + display: none; +} + +/* Range + ========================================================================== */ +.range-field { + position: relative; +} + +input[type=range], +input[type=range] + .thumb { + cursor: pointer; +} + +input[type=range] { + position: relative; + background-color: transparent; + border: none; + outline: none; + width: 100%; + margin: 15px 0; + padding: 0; +} + +input[type=range]:focus { + outline: none; +} + +input[type=range] + .thumb { + position: absolute; + top: 10px; + left: 0; + border: none; + height: 0; + width: 0; + border-radius: 50%; + background-color: #26a69a; + margin-left: 7px; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); +} + +input[type=range] + .thumb .value { + display: block; + width: 30px; + text-align: center; + color: #26a69a; + font-size: 0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} + +input[type=range] + .thumb.active { + border-radius: 50% 50% 50% 0; +} + +input[type=range] + .thumb.active .value { + color: #fff; + margin-left: -1px; + margin-top: 8px; + font-size: 10px; +} + +input[type=range] { + -webkit-appearance: none; +} + +input[type=range]::-webkit-slider-runnable-track { + height: 3px; + background: #c2c0c2; + border: none; +} + +input[type=range]::-webkit-slider-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; + -webkit-appearance: none; + background-color: #26a69a; + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + margin: -5px 0 0 0; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb { + -webkit-box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +input[type=range] { + /* fix for FF unable to apply focus style bug */ + border: 1px solid white; + /*required for proper track sizing in FF*/ +} + +input[type=range]::-moz-range-track { + height: 3px; + background: #c2c0c2; + border: none; +} + +input[type=range]::-moz-focus-inner { + border: 0; +} + +input[type=range]::-moz-range-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; + margin-top: -5px; +} + +input[type=range]:-moz-focusring { + outline: 1px solid #fff; + outline-offset: -1px; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb { + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +input[type=range]::-ms-track { + height: 3px; + background: transparent; + border-color: transparent; + border-width: 6px 0; + /*remove default tick marks*/ + color: transparent; +} + +input[type=range]::-ms-fill-lower { + background: #777; +} + +input[type=range]::-ms-fill-upper { + background: #ddd; +} + +input[type=range]::-ms-thumb { + border: none; + height: 14px; + width: 14px; + border-radius: 50%; + background: #26a69a; + -webkit-transition: -webkit-box-shadow .3s; + transition: -webkit-box-shadow .3s; + transition: box-shadow .3s; + transition: box-shadow .3s, -webkit-box-shadow .3s; +} + +.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb { + box-shadow: 0 0 0 10px rgba(38, 166, 154, 0.26); +} + +/*************** + Nav List +***************/ +.table-of-contents.fixed { + position: fixed; +} + +.table-of-contents li { + padding: 2px 0; +} + +.table-of-contents a { + display: inline-block; + font-weight: 300; + color: #757575; + padding-left: 16px; + height: 1.5rem; + line-height: 1.5rem; + letter-spacing: .4; + display: inline-block; +} + +.table-of-contents a:hover { + color: #a8a8a8; + padding-left: 15px; + border-left: 1px solid #ee6e73; +} + +.table-of-contents a.active { + font-weight: 500; + padding-left: 14px; + border-left: 2px solid #ee6e73; +} + +.sidenav { + position: fixed; + width: 300px; + left: 0; + top: 0; + margin: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + height: 100%; + height: calc(100% + 60px); + height: -moz-calc(100%); + padding-bottom: 60px; + background-color: #fff; + z-index: 999; + overflow-y: auto; + will-change: transform; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform: translateX(-105%); + transform: translateX(-105%); +} + +.sidenav.right-aligned { + right: 0; + -webkit-transform: translateX(105%); + transform: translateX(105%); + left: auto; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} + +.sidenav .collapsible { + margin: 0; +} + +.sidenav li { + float: none; + line-height: 48px; +} + +.sidenav li.active { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav li > a { + color: rgba(0, 0, 0, 0.87); + display: block; + font-size: 14px; + font-weight: 500; + height: 48px; + line-height: 48px; + padding: 0 32px; +} + +.sidenav li > a:hover { + background-color: rgba(0, 0, 0, 0.05); +} + +.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-flat, .sidenav li > a.btn-floating { + margin: 10px 15px; +} + +.sidenav li > a.btn, .sidenav li > a.btn-large, .sidenav li > a.btn-small, .sidenav li > a.btn-large, .sidenav li > a.btn-floating { + color: #fff; +} + +.sidenav li > a.btn-flat { + color: #343434; +} + +.sidenav li > a.btn:hover, .sidenav li > a.btn-large:hover, .sidenav li > a.btn-small:hover, .sidenav li > a.btn-large:hover { + background-color: #2bbbad; +} + +.sidenav li > a.btn-floating:hover { + background-color: #26a69a; +} + +.sidenav li > a > i, +.sidenav li > a > [class^="mdi-"], .sidenav li > a li > a > [class*="mdi-"], +.sidenav li > a > i.material-icons { + float: left; + height: 48px; + line-height: 48px; + margin: 0 32px 0 0; + width: 24px; + color: rgba(0, 0, 0, 0.54); +} + +.sidenav .divider { + margin: 8px 0 0 0; +} + +.sidenav .subheader { + cursor: initial; + pointer-events: none; + color: rgba(0, 0, 0, 0.54); + font-size: 14px; + font-weight: 500; + line-height: 48px; +} + +.sidenav .subheader:hover { + background-color: transparent; +} + +.sidenav .user-view { + position: relative; + padding: 32px 32px 0; + margin-bottom: 8px; +} + +.sidenav .user-view > a { + height: auto; + padding: 0; +} + +.sidenav .user-view > a:hover { + background-color: transparent; +} + +.sidenav .user-view .background { + overflow: hidden; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: -1; +} + +.sidenav .user-view .circle, .sidenav .user-view .name, .sidenav .user-view .email { + display: block; +} + +.sidenav .user-view .circle { + height: 64px; + width: 64px; +} + +.sidenav .user-view .name, +.sidenav .user-view .email { + font-size: 14px; + line-height: 24px; +} + +.sidenav .user-view .name { + margin-top: 16px; + font-weight: 500; +} + +.sidenav .user-view .email { + padding-bottom: 16px; + font-weight: 400; +} + +.drag-target { + height: 100%; + width: 10px; + position: fixed; + top: 0; + z-index: 998; +} + +.drag-target.right-aligned { + right: 0; +} + +.sidenav.sidenav-fixed { + left: 0; + -webkit-transform: translateX(0); + transform: translateX(0); + position: fixed; +} + +.sidenav.sidenav-fixed.right-aligned { + right: 0; + left: auto; +} + +@media only screen and (max-width: 992px) { + .sidenav.sidenav-fixed { + -webkit-transform: translateX(-105%); + transform: translateX(-105%); + } + .sidenav.sidenav-fixed.right-aligned { + -webkit-transform: translateX(105%); + transform: translateX(105%); + } + .sidenav > a { + padding: 0 16px; + } + .sidenav .user-view { + padding: 16px 16px 0; + } +} + +.sidenav .collapsible-body > ul:not(.collapsible) > li.active, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active { + background-color: #ee6e73; +} + +.sidenav .collapsible-body > ul:not(.collapsible) > li.active a, +.sidenav.sidenav-fixed .collapsible-body > ul:not(.collapsible) > li.active a { + color: #fff; +} + +.sidenav .collapsible-body { + padding: 0; +} + +.sidenav-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + opacity: 0; + height: 120vh; + background-color: rgba(0, 0, 0, 0.5); + z-index: 997; + display: none; +} + +/* + @license + Copyright (c) 2014 The Polymer Project Authors. All rights reserved. + This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt + The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt + The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt + Code distributed by Google as part of the polymer project is also + subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt + */ +/**************************/ +/* STYLES FOR THE SPINNER */ +/**************************/ +/* + * Constants: + * STROKEWIDTH = 3px + * ARCSIZE = 270 degrees (amount of circle the arc takes up) + * ARCTIME = 1333ms (time it takes to expand and contract arc) + * ARCSTARTROT = 216 degrees (how much the start location of the arc + * should rotate each time, 216 gives us a + * 5 pointed star shape (it's 360/5 * 3). + * For a 7 pointed star, we might do + * 360/7 * 3 = 154.286) + * CONTAINERWIDTH = 28px + * SHRINK_TIME = 400ms + */ +.preloader-wrapper { + display: inline-block; + position: relative; + width: 50px; + height: 50px; +} + +.preloader-wrapper.small { + width: 36px; + height: 36px; +} + +.preloader-wrapper.big { + width: 64px; + height: 64px; +} + +.preloader-wrapper.active { + /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ + -webkit-animation: container-rotate 1568ms linear infinite; + animation: container-rotate 1568ms linear infinite; +} + +@-webkit-keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + } +} + +@keyframes container-rotate { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +.spinner-layer { + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + border-color: #26a69a; +} + +.spinner-blue, +.spinner-blue-only { + border-color: #4285f4; +} + +.spinner-red, +.spinner-red-only { + border-color: #db4437; +} + +.spinner-yellow, +.spinner-yellow-only { + border-color: #f4b400; +} + +.spinner-green, +.spinner-green-only { + border-color: #0f9d58; +} + +/** + * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): + * + * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't + * guarantee that the animation will start _exactly_ after that value. So we avoid using + * animation-delay and instead set custom keyframes for each color (as redundant as it + * seems). + * + * We write out each animation in full (instead of separating animation-name, + * animation-duration, etc.) because under the polyfill, Safari does not recognize those + * specific properties properly, treats them as -webkit-animation, and overrides the + * other animation rules. See https://github.com/Polymer/platform/issues/53. + */ +.active .spinner-layer.spinner-blue { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-red { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-yellow { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer.spinner-green { + /* durations: 4 * ARCTIME */ + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .spinner-layer, +.active .spinner-layer.spinner-blue-only, +.active .spinner-layer.spinner-red-only, +.active .spinner-layer.spinner-yellow-only, +.active .spinner-layer.spinner-green-only { + /* durations: 4 * ARCTIME */ + opacity: 1; + -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@keyframes fill-unfill-rotate { + 12.5% { + -webkit-transform: rotate(135deg); + transform: rotate(135deg); + } + /* 0.5 * ARCSIZE */ + 25% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + /* 1 * ARCSIZE */ + 37.5% { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } + /* 1.5 * ARCSIZE */ + 50% { + -webkit-transform: rotate(540deg); + transform: rotate(540deg); + } + /* 2 * ARCSIZE */ + 62.5% { + -webkit-transform: rotate(675deg); + transform: rotate(675deg); + } + /* 2.5 * ARCSIZE */ + 75% { + -webkit-transform: rotate(810deg); + transform: rotate(810deg); + } + /* 3 * ARCSIZE */ + 87.5% { + -webkit-transform: rotate(945deg); + transform: rotate(945deg); + } + /* 3.5 * ARCSIZE */ + to { + -webkit-transform: rotate(1080deg); + transform: rotate(1080deg); + } + /* 4 * ARCSIZE */ +} + +@-webkit-keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@keyframes blue-fade-in-out { + from { + opacity: 1; + } + 25% { + opacity: 1; + } + 26% { + opacity: 0; + } + 89% { + opacity: 0; + } + 90% { + opacity: 1; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@keyframes red-fade-in-out { + from { + opacity: 0; + } + 15% { + opacity: 0; + } + 25% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } +} + +@-webkit-keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@keyframes yellow-fade-in-out { + from { + opacity: 0; + } + 40% { + opacity: 0; + } + 50% { + opacity: 1; + } + 75% { + opacity: 1; + } + 76% { + opacity: 0; + } +} + +@-webkit-keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +@keyframes green-fade-in-out { + from { + opacity: 0; + } + 65% { + opacity: 0; + } + 75% { + opacity: 1; + } + 90% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +/** + * Patch the gap that appear between the two adjacent div.circle-clipper while the + * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). + */ +.gap-patch { + position: absolute; + top: 0; + left: 45%; + width: 10%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.gap-patch .circle { + width: 1000%; + left: -450%; +} + +.circle-clipper { + display: inline-block; + position: relative; + width: 50%; + height: 100%; + overflow: hidden; + border-color: inherit; +} + +.circle-clipper .circle { + width: 200%; + height: 100%; + border-width: 3px; + /* STROKEWIDTH */ + border-style: solid; + border-color: inherit; + border-bottom-color: transparent !important; + border-radius: 50%; + -webkit-animation: none; + animation: none; + position: absolute; + top: 0; + right: 0; + bottom: 0; +} + +.circle-clipper.left .circle { + left: 0; + border-right-color: transparent !important; + -webkit-transform: rotate(129deg); + transform: rotate(129deg); +} + +.circle-clipper.right .circle { + left: -100%; + border-left-color: transparent !important; + -webkit-transform: rotate(-129deg); + transform: rotate(-129deg); +} + +.active .circle-clipper.left .circle { + /* duration: ARCTIME */ + -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +.active .circle-clipper.right .circle { + /* duration: ARCTIME */ + -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; + animation: right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; +} + +@-webkit-keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + } +} + +@keyframes left-spin { + from { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } + 50% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + to { + -webkit-transform: rotate(130deg); + transform: rotate(130deg); + } +} + +@-webkit-keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + } +} + +@keyframes right-spin { + from { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } + 50% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + to { + -webkit-transform: rotate(-130deg); + transform: rotate(-130deg); + } +} + +#spinnerContainer.cooldown { + /* duration: SHRINK_TIME */ + -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); + animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1); +} + +@-webkit-keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +@keyframes fade-out { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.slider { + position: relative; + height: 400px; + width: 100%; +} + +.slider.fullscreen { + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.slider.fullscreen ul.slides { + height: 100%; +} + +.slider.fullscreen ul.indicators { + z-index: 2; + bottom: 30px; +} + +.slider .slides { + background-color: #9e9e9e; + margin: 0; + height: 400px; +} + +.slider .slides li { + opacity: 0; + position: absolute; + top: 0; + left: 0; + z-index: 1; + width: 100%; + height: inherit; + overflow: hidden; +} + +.slider .slides li img { + height: 100%; + width: 100%; + background-size: cover; + background-position: center; +} + +.slider .slides li .caption { + color: #fff; + position: absolute; + top: 15%; + left: 15%; + width: 70%; + opacity: 0; +} + +.slider .slides li .caption p { + color: #e0e0e0; +} + +.slider .slides li.active { + z-index: 2; +} + +.slider .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.slider .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 16px; + width: 16px; + margin: 0 12px; + background-color: #e0e0e0; + -webkit-transition: background-color .3s; + transition: background-color .3s; + border-radius: 50%; +} + +.slider .indicators .indicator-item.active { + background-color: #4CAF50; +} + +.carousel { + overflow: hidden; + position: relative; + width: 100%; + height: 400px; + -webkit-perspective: 500px; + perspective: 500px; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; +} + +.carousel.carousel-slider { + top: 0; + left: 0; +} + +.carousel.carousel-slider .carousel-fixed-item { + position: absolute; + left: 0; + right: 0; + bottom: 20px; + z-index: 1; +} + +.carousel.carousel-slider .carousel-fixed-item.with-indicators { + bottom: 68px; +} + +.carousel.carousel-slider .carousel-item { + width: 100%; + height: 100%; + min-height: 400px; + position: absolute; + top: 0; + left: 0; +} + +.carousel.carousel-slider .carousel-item h2 { + font-size: 24px; + font-weight: 500; + line-height: 32px; +} + +.carousel.carousel-slider .carousel-item p { + font-size: 15px; +} + +.carousel .carousel-item { + visibility: hidden; + width: 200px; + height: 200px; + position: absolute; + top: 0; + left: 0; +} + +.carousel .carousel-item > img { + width: 100%; +} + +.carousel .indicators { + position: absolute; + text-align: center; + left: 0; + right: 0; + bottom: 0; + margin: 0; +} + +.carousel .indicators .indicator-item { + display: inline-block; + position: relative; + cursor: pointer; + height: 8px; + width: 8px; + margin: 24px 4px; + background-color: rgba(255, 255, 255, 0.5); + -webkit-transition: background-color .3s; + transition: background-color .3s; + border-radius: 50%; +} + +.carousel .indicators .indicator-item.active { + background-color: #fff; +} + +.carousel.scrolling .carousel-item .materialboxed, +.carousel .carousel-item:not(.active) .materialboxed { + pointer-events: none; +} + +.tap-target-wrapper { + width: 800px; + height: 800px; + position: fixed; + z-index: 1000; + visibility: hidden; + -webkit-transition: visibility 0s .3s; + transition: visibility 0s .3s; +} + +.tap-target-wrapper.open { + visibility: visible; + -webkit-transition: visibility 0s; + transition: visibility 0s; +} + +.tap-target-wrapper.open .tap-target { + -webkit-transform: scale(1); + transform: scale(1); + opacity: .95; + -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-wrapper.open .tap-target-wave::before { + -webkit-transform: scale(1); + transform: scale(1); +} + +.tap-target-wrapper.open .tap-target-wave::after { + visibility: visible; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + -webkit-transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; + transition: opacity .3s, visibility 0s 1s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s 1s; + transition: opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s; +} + +.tap-target { + position: absolute; + font-size: 1rem; + border-radius: 50%; + background-color: #ee6e73; + -webkit-box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + box-shadow: 0 20px 20px 0 rgba(0, 0, 0, 0.14), 0 10px 50px 0 rgba(0, 0, 0, 0.12), 0 30px 10px -20px rgba(0, 0, 0, 0.2); + width: 100%; + height: 100%; + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1); + transition: transform 0.3s cubic-bezier(0.42, 0, 0.58, 1), opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1), -webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1); +} + +.tap-target-content { + position: relative; + display: table-cell; +} + +.tap-target-wave { + position: absolute; + border-radius: 50%; + z-index: 10001; +} + +.tap-target-wave::before, .tap-target-wave::after { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #ffffff; +} + +.tap-target-wave::before { + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} + +.tap-target-wave::after { + visibility: hidden; + -webkit-transition: opacity .3s, visibility 0s, -webkit-transform .3s; + transition: opacity .3s, visibility 0s, -webkit-transform .3s; + transition: opacity .3s, transform .3s, visibility 0s; + transition: opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s; + z-index: -1; +} + +.tap-target-origin { + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 10002; + position: absolute !important; +} + +.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small), .tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover { + background: none; +} + +@media only screen and (max-width: 600px) { + .tap-target, .tap-target-wrapper { + width: 600px; + height: 600px; + } +} + +.pulse { + overflow: visible; + position: relative; +} + +.pulse::before { + content: ''; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: inherit; + border-radius: inherit; + -webkit-transition: opacity .3s, -webkit-transform .3s; + transition: opacity .3s, -webkit-transform .3s; + transition: opacity .3s, transform .3s; + transition: opacity .3s, transform .3s, -webkit-transform .3s; + -webkit-animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; + z-index: -1; +} + +@-webkit-keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +@keyframes pulse-animation { + 0% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } + 50% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } + 100% { + opacity: 0; + -webkit-transform: scale(1.5); + transform: scale(1.5); + } +} + +/* Modal */ +.datepicker-modal { + max-width: 325px; + min-width: 300px; + max-height: none; +} + +.datepicker-container.modal-content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding: 0; +} + +.datepicker-controls { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + width: 280px; + margin: 0 auto; +} + +.datepicker-controls .selects-container { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} + +.datepicker-controls .select-wrapper input { + border-bottom: none; + text-align: center; + margin: 0; +} + +.datepicker-controls .select-wrapper input:focus { + border-bottom: none; +} + +.datepicker-controls .select-wrapper .caret { + display: none; +} + +.datepicker-controls .select-year input { + width: 50px; +} + +.datepicker-controls .select-month input { + width: 70px; +} + +.month-prev, .month-next { + margin-top: 4px; + cursor: pointer; + background-color: transparent; + border: none; +} + +/* Date Display */ +.datepicker-date-display { + -webkit-box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + background-color: #26a69a; + color: #fff; + padding: 20px 22px; + font-weight: 500; +} + +.datepicker-date-display .year-text { + display: block; + font-size: 1.5rem; + line-height: 25px; + color: rgba(255, 255, 255, 0.7); +} + +.datepicker-date-display .date-text { + display: block; + font-size: 2.8rem; + line-height: 47px; + font-weight: 500; +} + +/* Calendar */ +.datepicker-calendar-container { + -webkit-box-flex: 2.5; + -webkit-flex: 2.5 auto; + -ms-flex: 2.5 auto; + flex: 2.5 auto; +} + +.datepicker-table { + width: 280px; + font-size: 1rem; + margin: 0 auto; +} + +.datepicker-table thead { + border-bottom: none; +} + +.datepicker-table th { + padding: 10px 5px; + text-align: center; +} + +.datepicker-table tr { + border: none; +} + +.datepicker-table abbr { + text-decoration: none; + color: #999; +} + +.datepicker-table td { + border-radius: 50%; + padding: 0; +} + +.datepicker-table td.is-today { + color: #26a69a; +} + +.datepicker-table td.is-selected { + background-color: #26a69a; + color: #fff; +} + +.datepicker-table td.is-outside-current-month, .datepicker-table td.is-disabled { + color: rgba(0, 0, 0, 0.3); + pointer-events: none; +} + +.datepicker-day-button { + background-color: transparent; + border: none; + line-height: 38px; + display: block; + width: 100%; + border-radius: 50%; + padding: 0 5px; + cursor: pointer; + color: inherit; +} + +.datepicker-day-button:focus { + background-color: rgba(43, 161, 150, 0.25); +} + +/* Footer */ +.datepicker-footer { + width: 280px; + margin: 0 auto; + padding-bottom: 5px; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.datepicker-cancel, +.datepicker-clear, +.datepicker-today, +.datepicker-done { + color: #26a69a; + padding: 0 1rem; +} + +.datepicker-clear { + color: #F44336; +} + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .datepicker-modal { + max-width: 625px; + } + .datepicker-container.modal-content { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .datepicker-date-display { + -webkit-box-flex: 0; + -webkit-flex: 0 1 270px; + -ms-flex: 0 1 270px; + flex: 0 1 270px; + } + .datepicker-controls, + .datepicker-table, + .datepicker-footer { + width: 320px; + } + .datepicker-day-button { + line-height: 44px; + } +} + +/* Timepicker Containers */ +.timepicker-modal { + max-width: 325px; + max-height: none; +} + +.timepicker-container.modal-content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + padding: 0; +} + +.text-primary { + color: white; +} + +/* Clock Digital Display */ +.timepicker-digital-display { + -webkit-box-flex: 1; + -webkit-flex: 1 auto; + -ms-flex: 1 auto; + flex: 1 auto; + background-color: #26a69a; + padding: 10px; + font-weight: 300; +} + +.timepicker-text-container { + font-size: 4rem; + font-weight: bold; + text-align: center; + color: rgba(255, 255, 255, 0.6); + font-weight: 400; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.timepicker-span-hours, +.timepicker-span-minutes, +.timepicker-span-am-pm div { + cursor: pointer; +} + +.timepicker-span-hours { + margin-right: 3px; +} + +.timepicker-span-minutes { + margin-left: 3px; +} + +.timepicker-display-am-pm { + font-size: 1.3rem; + position: absolute; + right: 1rem; + bottom: 1rem; + font-weight: 400; +} + +/* Analog Clock Display */ +.timepicker-analog-display { + -webkit-box-flex: 2.5; + -webkit-flex: 2.5 auto; + -ms-flex: 2.5 auto; + flex: 2.5 auto; +} + +.timepicker-plate { + background-color: #eee; + border-radius: 50%; + width: 270px; + height: 270px; + overflow: visible; + position: relative; + margin: auto; + margin-top: 25px; + margin-bottom: 5px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.timepicker-canvas, +.timepicker-dial { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +.timepicker-minutes { + visibility: hidden; +} + +.timepicker-tick { + border-radius: 50%; + color: rgba(0, 0, 0, 0.87); + line-height: 40px; + text-align: center; + width: 40px; + height: 40px; + position: absolute; + cursor: pointer; + font-size: 15px; +} + +.timepicker-tick.active, +.timepicker-tick:hover { + background-color: rgba(38, 166, 154, 0.25); +} + +.timepicker-dial { + -webkit-transition: opacity 350ms, -webkit-transform 350ms; + transition: opacity 350ms, -webkit-transform 350ms; + transition: transform 350ms, opacity 350ms; + transition: transform 350ms, opacity 350ms, -webkit-transform 350ms; +} + +.timepicker-dial-out { + opacity: 0; +} + +.timepicker-dial-out.timepicker-hours { + -webkit-transform: scale(1.1, 1.1); + transform: scale(1.1, 1.1); +} + +.timepicker-dial-out.timepicker-minutes { + -webkit-transform: scale(0.8, 0.8); + transform: scale(0.8, 0.8); +} + +.timepicker-canvas { + -webkit-transition: opacity 175ms; + transition: opacity 175ms; +} + +.timepicker-canvas line { + stroke: #26a69a; + stroke-width: 4; + stroke-linecap: round; +} + +.timepicker-canvas-out { + opacity: 0.25; +} + +.timepicker-canvas-bearing { + stroke: none; + fill: #26a69a; +} + +.timepicker-canvas-bg { + stroke: none; + fill: #26a69a; +} + +/* Footer */ +.timepicker-footer { + margin: 0 auto; + padding: 5px 1rem; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} + +.timepicker-clear { + color: #F44336; +} + +.timepicker-close { + color: #26a69a; +} + +.timepicker-clear, +.timepicker-close { + padding: 0 20px; +} + +/* Media Queries */ +@media only screen and (min-width: 601px) { + .timepicker-modal { + max-width: 600px; + } + .timepicker-container.modal-content { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + } + .timepicker-text-container { + top: 32%; + } + .timepicker-display-am-pm { + position: relative; + right: auto; + bottom: auto; + text-align: center; + margin-top: 1.2rem; + } +} diff --git a/Timelapse/ServerFiles/css/materialize.min.css b/Timelapse/ServerFiles/css/materialize.min.css new file mode 100644 index 0000000..74b1741 --- /dev/null +++ b/Timelapse/ServerFiles/css/materialize.min.css @@ -0,0 +1,13 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darken-4{color:#4a148c !important}.purple.accent-1{background-color:#ea80fc !important}.purple-text.text-accent-1{color:#ea80fc !important}.purple.accent-2{background-color:#e040fb !important}.purple-text.text-accent-2{color:#e040fb !important}.purple.accent-3{background-color:#d500f9 !important}.purple-text.text-accent-3{color:#d500f9 !important}.purple.accent-4{background-color:#a0f !important}.purple-text.text-accent-4{color:#a0f !important}.deep-purple{background-color:#673ab7 !important}.deep-purple-text{color:#673ab7 !important}.deep-purple.lighten-5{background-color:#ede7f6 !important}.deep-purple-text.text-lighten-5{color:#ede7f6 !important}.deep-purple.lighten-4{background-color:#d1c4e9 !important}.deep-purple-text.text-lighten-4{color:#d1c4e9 !important}.deep-purple.lighten-3{background-color:#b39ddb !important}.deep-purple-text.text-lighten-3{color:#b39ddb !important}.deep-purple.lighten-2{background-color:#9575cd !important}.deep-purple-text.text-lighten-2{color:#9575cd !important}.deep-purple.lighten-1{background-color:#7e57c2 !important}.deep-purple-text.text-lighten-1{color:#7e57c2 !important}.deep-purple.darken-1{background-color:#5e35b1 !important}.deep-purple-text.text-darken-1{color:#5e35b1 !important}.deep-purple.darken-2{background-color:#512da8 !important}.deep-purple-text.text-darken-2{color:#512da8 !important}.deep-purple.darken-3{background-color:#4527a0 !important}.deep-purple-text.text-darken-3{color:#4527a0 !important}.deep-purple.darken-4{background-color:#311b92 !important}.deep-purple-text.text-darken-4{color:#311b92 !important}.deep-purple.accent-1{background-color:#b388ff !important}.deep-purple-text.text-accent-1{color:#b388ff !important}.deep-purple.accent-2{background-color:#7c4dff !important}.deep-purple-text.text-accent-2{color:#7c4dff !important}.deep-purple.accent-3{background-color:#651fff !important}.deep-purple-text.text-accent-3{color:#651fff !important}.deep-purple.accent-4{background-color:#6200ea !important}.deep-purple-text.text-accent-4{color:#6200ea !important}.indigo{background-color:#3f51b5 !important}.indigo-text{color:#3f51b5 !important}.indigo.lighten-5{background-color:#e8eaf6 !important}.indigo-text.text-lighten-5{color:#e8eaf6 !important}.indigo.lighten-4{background-color:#c5cae9 !important}.indigo-text.text-lighten-4{color:#c5cae9 !important}.indigo.lighten-3{background-color:#9fa8da !important}.indigo-text.text-lighten-3{color:#9fa8da !important}.indigo.lighten-2{background-color:#7986cb !important}.indigo-text.text-lighten-2{color:#7986cb !important}.indigo.lighten-1{background-color:#5c6bc0 !important}.indigo-text.text-lighten-1{color:#5c6bc0 !important}.indigo.darken-1{background-color:#3949ab !important}.indigo-text.text-darken-1{color:#3949ab !important}.indigo.darken-2{background-color:#303f9f !important}.indigo-text.text-darken-2{color:#303f9f !important}.indigo.darken-3{background-color:#283593 !important}.indigo-text.text-darken-3{color:#283593 !important}.indigo.darken-4{background-color:#1a237e !important}.indigo-text.text-darken-4{color:#1a237e !important}.indigo.accent-1{background-color:#8c9eff !important}.indigo-text.text-accent-1{color:#8c9eff !important}.indigo.accent-2{background-color:#536dfe !important}.indigo-text.text-accent-2{color:#536dfe !important}.indigo.accent-3{background-color:#3d5afe !important}.indigo-text.text-accent-3{color:#3d5afe !important}.indigo.accent-4{background-color:#304ffe !important}.indigo-text.text-accent-4{color:#304ffe !important}.blue{background-color:#2196F3 !important}.blue-text{color:#2196F3 !important}.blue.lighten-5{background-color:#E3F2FD !important}.blue-text.text-lighten-5{color:#E3F2FD !important}.blue.lighten-4{background-color:#BBDEFB !important}.blue-text.text-lighten-4{color:#BBDEFB !important}.blue.lighten-3{background-color:#90CAF9 !important}.blue-text.text-lighten-3{color:#90CAF9 !important}.blue.lighten-2{background-color:#64B5F6 !important}.blue-text.text-lighten-2{color:#64B5F6 !important}.blue.lighten-1{background-color:#42A5F5 !important}.blue-text.text-lighten-1{color:#42A5F5 !important}.blue.darken-1{background-color:#1E88E5 !important}.blue-text.text-darken-1{color:#1E88E5 !important}.blue.darken-2{background-color:#1976D2 !important}.blue-text.text-darken-2{color:#1976D2 !important}.blue.darken-3{background-color:#1565C0 !important}.blue-text.text-darken-3{color:#1565C0 !important}.blue.darken-4{background-color:#0D47A1 !important}.blue-text.text-darken-4{color:#0D47A1 !important}.blue.accent-1{background-color:#82B1FF !important}.blue-text.text-accent-1{color:#82B1FF !important}.blue.accent-2{background-color:#448AFF !important}.blue-text.text-accent-2{color:#448AFF !important}.blue.accent-3{background-color:#2979FF !important}.blue-text.text-accent-3{color:#2979FF !important}.blue.accent-4{background-color:#2962FF !important}.blue-text.text-accent-4{color:#2962FF !important}.light-blue{background-color:#03a9f4 !important}.light-blue-text{color:#03a9f4 !important}.light-blue.lighten-5{background-color:#e1f5fe !important}.light-blue-text.text-lighten-5{color:#e1f5fe !important}.light-blue.lighten-4{background-color:#b3e5fc !important}.light-blue-text.text-lighten-4{color:#b3e5fc !important}.light-blue.lighten-3{background-color:#81d4fa !important}.light-blue-text.text-lighten-3{color:#81d4fa !important}.light-blue.lighten-2{background-color:#4fc3f7 !important}.light-blue-text.text-lighten-2{color:#4fc3f7 !important}.light-blue.lighten-1{background-color:#29b6f6 !important}.light-blue-text.text-lighten-1{color:#29b6f6 !important}.light-blue.darken-1{background-color:#039be5 !important}.light-blue-text.text-darken-1{color:#039be5 !important}.light-blue.darken-2{background-color:#0288d1 !important}.light-blue-text.text-darken-2{color:#0288d1 !important}.light-blue.darken-3{background-color:#0277bd !important}.light-blue-text.text-darken-3{color:#0277bd !important}.light-blue.darken-4{background-color:#01579b !important}.light-blue-text.text-darken-4{color:#01579b !important}.light-blue.accent-1{background-color:#80d8ff !important}.light-blue-text.text-accent-1{color:#80d8ff !important}.light-blue.accent-2{background-color:#40c4ff !important}.light-blue-text.text-accent-2{color:#40c4ff !important}.light-blue.accent-3{background-color:#00b0ff !important}.light-blue-text.text-accent-3{color:#00b0ff !important}.light-blue.accent-4{background-color:#0091ea !important}.light-blue-text.text-accent-4{color:#0091ea !important}.cyan{background-color:#00bcd4 !important}.cyan-text{color:#00bcd4 !important}.cyan.lighten-5{background-color:#e0f7fa !important}.cyan-text.text-lighten-5{color:#e0f7fa !important}.cyan.lighten-4{background-color:#b2ebf2 !important}.cyan-text.text-lighten-4{color:#b2ebf2 !important}.cyan.lighten-3{background-color:#80deea !important}.cyan-text.text-lighten-3{color:#80deea !important}.cyan.lighten-2{background-color:#4dd0e1 !important}.cyan-text.text-lighten-2{color:#4dd0e1 !important}.cyan.lighten-1{background-color:#26c6da !important}.cyan-text.text-lighten-1{color:#26c6da !important}.cyan.darken-1{background-color:#00acc1 !important}.cyan-text.text-darken-1{color:#00acc1 !important}.cyan.darken-2{background-color:#0097a7 !important}.cyan-text.text-darken-2{color:#0097a7 !important}.cyan.darken-3{background-color:#00838f !important}.cyan-text.text-darken-3{color:#00838f !important}.cyan.darken-4{background-color:#006064 !important}.cyan-text.text-darken-4{color:#006064 !important}.cyan.accent-1{background-color:#84ffff !important}.cyan-text.text-accent-1{color:#84ffff !important}.cyan.accent-2{background-color:#18ffff !important}.cyan-text.text-accent-2{color:#18ffff !important}.cyan.accent-3{background-color:#00e5ff !important}.cyan-text.text-accent-3{color:#00e5ff !important}.cyan.accent-4{background-color:#00b8d4 !important}.cyan-text.text-accent-4{color:#00b8d4 !important}.teal{background-color:#009688 !important}.teal-text{color:#009688 !important}.teal.lighten-5{background-color:#e0f2f1 !important}.teal-text.text-lighten-5{color:#e0f2f1 !important}.teal.lighten-4{background-color:#b2dfdb !important}.teal-text.text-lighten-4{color:#b2dfdb !important}.teal.lighten-3{background-color:#80cbc4 !important}.teal-text.text-lighten-3{color:#80cbc4 !important}.teal.lighten-2{background-color:#4db6ac !important}.teal-text.text-lighten-2{color:#4db6ac !important}.teal.lighten-1{background-color:#26a69a !important}.teal-text.text-lighten-1{color:#26a69a !important}.teal.darken-1{background-color:#00897b !important}.teal-text.text-darken-1{color:#00897b !important}.teal.darken-2{background-color:#00796b !important}.teal-text.text-darken-2{color:#00796b !important}.teal.darken-3{background-color:#00695c !important}.teal-text.text-darken-3{color:#00695c !important}.teal.darken-4{background-color:#004d40 !important}.teal-text.text-darken-4{color:#004d40 !important}.teal.accent-1{background-color:#a7ffeb !important}.teal-text.text-accent-1{color:#a7ffeb !important}.teal.accent-2{background-color:#64ffda !important}.teal-text.text-accent-2{color:#64ffda !important}.teal.accent-3{background-color:#1de9b6 !important}.teal-text.text-accent-3{color:#1de9b6 !important}.teal.accent-4{background-color:#00bfa5 !important}.teal-text.text-accent-4{color:#00bfa5 !important}.green{background-color:#4CAF50 !important}.green-text{color:#4CAF50 !important}.green.lighten-5{background-color:#E8F5E9 !important}.green-text.text-lighten-5{color:#E8F5E9 !important}.green.lighten-4{background-color:#C8E6C9 !important}.green-text.text-lighten-4{color:#C8E6C9 !important}.green.lighten-3{background-color:#A5D6A7 !important}.green-text.text-lighten-3{color:#A5D6A7 !important}.green.lighten-2{background-color:#81C784 !important}.green-text.text-lighten-2{color:#81C784 !important}.green.lighten-1{background-color:#66BB6A !important}.green-text.text-lighten-1{color:#66BB6A !important}.green.darken-1{background-color:#43A047 !important}.green-text.text-darken-1{color:#43A047 !important}.green.darken-2{background-color:#388E3C !important}.green-text.text-darken-2{color:#388E3C !important}.green.darken-3{background-color:#2E7D32 !important}.green-text.text-darken-3{color:#2E7D32 !important}.green.darken-4{background-color:#1B5E20 !important}.green-text.text-darken-4{color:#1B5E20 !important}.green.accent-1{background-color:#B9F6CA !important}.green-text.text-accent-1{color:#B9F6CA !important}.green.accent-2{background-color:#69F0AE !important}.green-text.text-accent-2{color:#69F0AE !important}.green.accent-3{background-color:#00E676 !important}.green-text.text-accent-3{color:#00E676 !important}.green.accent-4{background-color:#00C853 !important}.green-text.text-accent-4{color:#00C853 !important}.light-green{background-color:#8bc34a !important}.light-green-text{color:#8bc34a !important}.light-green.lighten-5{background-color:#f1f8e9 !important}.light-green-text.text-lighten-5{color:#f1f8e9 !important}.light-green.lighten-4{background-color:#dcedc8 !important}.light-green-text.text-lighten-4{color:#dcedc8 !important}.light-green.lighten-3{background-color:#c5e1a5 !important}.light-green-text.text-lighten-3{color:#c5e1a5 !important}.light-green.lighten-2{background-color:#aed581 !important}.light-green-text.text-lighten-2{color:#aed581 !important}.light-green.lighten-1{background-color:#9ccc65 !important}.light-green-text.text-lighten-1{color:#9ccc65 !important}.light-green.darken-1{background-color:#7cb342 !important}.light-green-text.text-darken-1{color:#7cb342 !important}.light-green.darken-2{background-color:#689f38 !important}.light-green-text.text-darken-2{color:#689f38 !important}.light-green.darken-3{background-color:#558b2f !important}.light-green-text.text-darken-3{color:#558b2f !important}.light-green.darken-4{background-color:#33691e !important}.light-green-text.text-darken-4{color:#33691e !important}.light-green.accent-1{background-color:#ccff90 !important}.light-green-text.text-accent-1{color:#ccff90 !important}.light-green.accent-2{background-color:#b2ff59 !important}.light-green-text.text-accent-2{color:#b2ff59 !important}.light-green.accent-3{background-color:#76ff03 !important}.light-green-text.text-accent-3{color:#76ff03 !important}.light-green.accent-4{background-color:#64dd17 !important}.light-green-text.text-accent-4{color:#64dd17 !important}.lime{background-color:#cddc39 !important}.lime-text{color:#cddc39 !important}.lime.lighten-5{background-color:#f9fbe7 !important}.lime-text.text-lighten-5{color:#f9fbe7 !important}.lime.lighten-4{background-color:#f0f4c3 !important}.lime-text.text-lighten-4{color:#f0f4c3 !important}.lime.lighten-3{background-color:#e6ee9c !important}.lime-text.text-lighten-3{color:#e6ee9c !important}.lime.lighten-2{background-color:#dce775 !important}.lime-text.text-lighten-2{color:#dce775 !important}.lime.lighten-1{background-color:#d4e157 !important}.lime-text.text-lighten-1{color:#d4e157 !important}.lime.darken-1{background-color:#c0ca33 !important}.lime-text.text-darken-1{color:#c0ca33 !important}.lime.darken-2{background-color:#afb42b !important}.lime-text.text-darken-2{color:#afb42b !important}.lime.darken-3{background-color:#9e9d24 !important}.lime-text.text-darken-3{color:#9e9d24 !important}.lime.darken-4{background-color:#827717 !important}.lime-text.text-darken-4{color:#827717 !important}.lime.accent-1{background-color:#f4ff81 !important}.lime-text.text-accent-1{color:#f4ff81 !important}.lime.accent-2{background-color:#eeff41 !important}.lime-text.text-accent-2{color:#eeff41 !important}.lime.accent-3{background-color:#c6ff00 !important}.lime-text.text-accent-3{color:#c6ff00 !important}.lime.accent-4{background-color:#aeea00 !important}.lime-text.text-accent-4{color:#aeea00 !important}.yellow{background-color:#ffeb3b !important}.yellow-text{color:#ffeb3b !important}.yellow.lighten-5{background-color:#fffde7 !important}.yellow-text.text-lighten-5{color:#fffde7 !important}.yellow.lighten-4{background-color:#fff9c4 !important}.yellow-text.text-lighten-4{color:#fff9c4 !important}.yellow.lighten-3{background-color:#fff59d !important}.yellow-text.text-lighten-3{color:#fff59d !important}.yellow.lighten-2{background-color:#fff176 !important}.yellow-text.text-lighten-2{color:#fff176 !important}.yellow.lighten-1{background-color:#ffee58 !important}.yellow-text.text-lighten-1{color:#ffee58 !important}.yellow.darken-1{background-color:#fdd835 !important}.yellow-text.text-darken-1{color:#fdd835 !important}.yellow.darken-2{background-color:#fbc02d !important}.yellow-text.text-darken-2{color:#fbc02d !important}.yellow.darken-3{background-color:#f9a825 !important}.yellow-text.text-darken-3{color:#f9a825 !important}.yellow.darken-4{background-color:#f57f17 !important}.yellow-text.text-darken-4{color:#f57f17 !important}.yellow.accent-1{background-color:#ffff8d !important}.yellow-text.text-accent-1{color:#ffff8d !important}.yellow.accent-2{background-color:#ff0 !important}.yellow-text.text-accent-2{color:#ff0 !important}.yellow.accent-3{background-color:#ffea00 !important}.yellow-text.text-accent-3{color:#ffea00 !important}.yellow.accent-4{background-color:#ffd600 !important}.yellow-text.text-accent-4{color:#ffd600 !important}.amber{background-color:#ffc107 !important}.amber-text{color:#ffc107 !important}.amber.lighten-5{background-color:#fff8e1 !important}.amber-text.text-lighten-5{color:#fff8e1 !important}.amber.lighten-4{background-color:#ffecb3 !important}.amber-text.text-lighten-4{color:#ffecb3 !important}.amber.lighten-3{background-color:#ffe082 !important}.amber-text.text-lighten-3{color:#ffe082 !important}.amber.lighten-2{background-color:#ffd54f !important}.amber-text.text-lighten-2{color:#ffd54f !important}.amber.lighten-1{background-color:#ffca28 !important}.amber-text.text-lighten-1{color:#ffca28 !important}.amber.darken-1{background-color:#ffb300 !important}.amber-text.text-darken-1{color:#ffb300 !important}.amber.darken-2{background-color:#ffa000 !important}.amber-text.text-darken-2{color:#ffa000 !important}.amber.darken-3{background-color:#ff8f00 !important}.amber-text.text-darken-3{color:#ff8f00 !important}.amber.darken-4{background-color:#ff6f00 !important}.amber-text.text-darken-4{color:#ff6f00 !important}.amber.accent-1{background-color:#ffe57f !important}.amber-text.text-accent-1{color:#ffe57f !important}.amber.accent-2{background-color:#ffd740 !important}.amber-text.text-accent-2{color:#ffd740 !important}.amber.accent-3{background-color:#ffc400 !important}.amber-text.text-accent-3{color:#ffc400 !important}.amber.accent-4{background-color:#ffab00 !important}.amber-text.text-accent-4{color:#ffab00 !important}.orange{background-color:#ff9800 !important}.orange-text{color:#ff9800 !important}.orange.lighten-5{background-color:#fff3e0 !important}.orange-text.text-lighten-5{color:#fff3e0 !important}.orange.lighten-4{background-color:#ffe0b2 !important}.orange-text.text-lighten-4{color:#ffe0b2 !important}.orange.lighten-3{background-color:#ffcc80 !important}.orange-text.text-lighten-3{color:#ffcc80 !important}.orange.lighten-2{background-color:#ffb74d !important}.orange-text.text-lighten-2{color:#ffb74d !important}.orange.lighten-1{background-color:#ffa726 !important}.orange-text.text-lighten-1{color:#ffa726 !important}.orange.darken-1{background-color:#fb8c00 !important}.orange-text.text-darken-1{color:#fb8c00 !important}.orange.darken-2{background-color:#f57c00 !important}.orange-text.text-darken-2{color:#f57c00 !important}.orange.darken-3{background-color:#ef6c00 !important}.orange-text.text-darken-3{color:#ef6c00 !important}.orange.darken-4{background-color:#e65100 !important}.orange-text.text-darken-4{color:#e65100 !important}.orange.accent-1{background-color:#ffd180 !important}.orange-text.text-accent-1{color:#ffd180 !important}.orange.accent-2{background-color:#ffab40 !important}.orange-text.text-accent-2{color:#ffab40 !important}.orange.accent-3{background-color:#ff9100 !important}.orange-text.text-accent-3{color:#ff9100 !important}.orange.accent-4{background-color:#ff6d00 !important}.orange-text.text-accent-4{color:#ff6d00 !important}.deep-orange{background-color:#ff5722 !important}.deep-orange-text{color:#ff5722 !important}.deep-orange.lighten-5{background-color:#fbe9e7 !important}.deep-orange-text.text-lighten-5{color:#fbe9e7 !important}.deep-orange.lighten-4{background-color:#ffccbc !important}.deep-orange-text.text-lighten-4{color:#ffccbc !important}.deep-orange.lighten-3{background-color:#ffab91 !important}.deep-orange-text.text-lighten-3{color:#ffab91 !important}.deep-orange.lighten-2{background-color:#ff8a65 !important}.deep-orange-text.text-lighten-2{color:#ff8a65 !important}.deep-orange.lighten-1{background-color:#ff7043 !important}.deep-orange-text.text-lighten-1{color:#ff7043 !important}.deep-orange.darken-1{background-color:#f4511e !important}.deep-orange-text.text-darken-1{color:#f4511e !important}.deep-orange.darken-2{background-color:#e64a19 !important}.deep-orange-text.text-darken-2{color:#e64a19 !important}.deep-orange.darken-3{background-color:#d84315 !important}.deep-orange-text.text-darken-3{color:#d84315 !important}.deep-orange.darken-4{background-color:#bf360c !important}.deep-orange-text.text-darken-4{color:#bf360c !important}.deep-orange.accent-1{background-color:#ff9e80 !important}.deep-orange-text.text-accent-1{color:#ff9e80 !important}.deep-orange.accent-2{background-color:#ff6e40 !important}.deep-orange-text.text-accent-2{color:#ff6e40 !important}.deep-orange.accent-3{background-color:#ff3d00 !important}.deep-orange-text.text-accent-3{color:#ff3d00 !important}.deep-orange.accent-4{background-color:#dd2c00 !important}.deep-orange-text.text-accent-4{color:#dd2c00 !important}.brown{background-color:#795548 !important}.brown-text{color:#795548 !important}.brown.lighten-5{background-color:#efebe9 !important}.brown-text.text-lighten-5{color:#efebe9 !important}.brown.lighten-4{background-color:#d7ccc8 !important}.brown-text.text-lighten-4{color:#d7ccc8 !important}.brown.lighten-3{background-color:#bcaaa4 !important}.brown-text.text-lighten-3{color:#bcaaa4 !important}.brown.lighten-2{background-color:#a1887f !important}.brown-text.text-lighten-2{color:#a1887f !important}.brown.lighten-1{background-color:#8d6e63 !important}.brown-text.text-lighten-1{color:#8d6e63 !important}.brown.darken-1{background-color:#6d4c41 !important}.brown-text.text-darken-1{color:#6d4c41 !important}.brown.darken-2{background-color:#5d4037 !important}.brown-text.text-darken-2{color:#5d4037 !important}.brown.darken-3{background-color:#4e342e !important}.brown-text.text-darken-3{color:#4e342e !important}.brown.darken-4{background-color:#3e2723 !important}.brown-text.text-darken-4{color:#3e2723 !important}.blue-grey{background-color:#607d8b !important}.blue-grey-text{color:#607d8b !important}.blue-grey.lighten-5{background-color:#eceff1 !important}.blue-grey-text.text-lighten-5{color:#eceff1 !important}.blue-grey.lighten-4{background-color:#cfd8dc !important}.blue-grey-text.text-lighten-4{color:#cfd8dc !important}.blue-grey.lighten-3{background-color:#b0bec5 !important}.blue-grey-text.text-lighten-3{color:#b0bec5 !important}.blue-grey.lighten-2{background-color:#90a4ae !important}.blue-grey-text.text-lighten-2{color:#90a4ae !important}.blue-grey.lighten-1{background-color:#78909c !important}.blue-grey-text.text-lighten-1{color:#78909c !important}.blue-grey.darken-1{background-color:#546e7a !important}.blue-grey-text.text-darken-1{color:#546e7a !important}.blue-grey.darken-2{background-color:#455a64 !important}.blue-grey-text.text-darken-2{color:#455a64 !important}.blue-grey.darken-3{background-color:#37474f !important}.blue-grey-text.text-darken-3{color:#37474f !important}.blue-grey.darken-4{background-color:#263238 !important}.blue-grey-text.text-darken-4{color:#263238 !important}.grey{background-color:#9e9e9e !important}.grey-text{color:#9e9e9e !important}.grey.lighten-5{background-color:#fafafa !important}.grey-text.text-lighten-5{color:#fafafa !important}.grey.lighten-4{background-color:#f5f5f5 !important}.grey-text.text-lighten-4{color:#f5f5f5 !important}.grey.lighten-3{background-color:#eee !important}.grey-text.text-lighten-3{color:#eee !important}.grey.lighten-2{background-color:#e0e0e0 !important}.grey-text.text-lighten-2{color:#e0e0e0 !important}.grey.lighten-1{background-color:#bdbdbd !important}.grey-text.text-lighten-1{color:#bdbdbd !important}.grey.darken-1{background-color:#757575 !important}.grey-text.text-darken-1{color:#757575 !important}.grey.darken-2{background-color:#616161 !important}.grey-text.text-darken-2{color:#616161 !important}.grey.darken-3{background-color:#424242 !important}.grey-text.text-darken-3{color:#424242 !important}.grey.darken-4{background-color:#212121 !important}.grey-text.text-darken-4{color:#212121 !important}.black{background-color:#000 !important}.black-text{color:#000 !important}.white{background-color:#fff !important}.white-text{color:#fff !important}.transparent{background-color:rgba(0,0,0,0) !important}.transparent-text{color:rgba(0,0,0,0) !important}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:0.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace, monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace, monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,*:before,*:after{-webkit-box-sizing:inherit;box-sizing:inherit}button,input,optgroup,select,textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default)>li{list-style-type:none}a{color:#039be5;text-decoration:none;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{-webkit-box-shadow:none !important;box-shadow:none !important}.z-depth-1,nav,.card-panel,.card,.toast,.btn,.btn-large,.btn-small,.btn-floating,.dropdown-content,.collapsible,.sidenav{-webkit-box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2);box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}.z-depth-1-half,.btn:hover,.btn-large:hover,.btn-small:hover,.btn-floating:hover{-webkit-box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2);box-shadow:0 3px 3px 0 rgba(0,0,0,0.14),0 1px 7px 0 rgba(0,0,0,0.12),0 3px 1px -1px rgba(0,0,0,0.2)}.z-depth-2{-webkit-box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3);box-shadow:0 4px 5px 0 rgba(0,0,0,0.14),0 1px 10px 0 rgba(0,0,0,0.12),0 2px 4px -1px rgba(0,0,0,0.3)}.z-depth-3{-webkit-box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2);box-shadow:0 8px 17px 2px rgba(0,0,0,0.14),0 3px 14px 2px rgba(0,0,0,0.12),0 5px 5px -3px rgba(0,0,0,0.2)}.z-depth-4{-webkit-box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2);box-shadow:0 16px 24px 2px rgba(0,0,0,0.14),0 6px 30px 5px rgba(0,0,0,0.12),0 8px 10px -7px rgba(0,0,0,0.2)}.z-depth-5,.modal{-webkit-box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2);box-shadow:0 24px 38px 3px rgba(0,0,0,0.14),0 9px 46px 8px rgba(0,0,0,0.12),0 11px 15px -7px rgba(0,0,0,0.2)}.hoverable{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s}.hoverable:hover{-webkit-box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19);box-shadow:0 8px 17px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width: 992px){.pagination{width:100%}.pagination li.prev,.pagination li.next{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:rgba(255,255,255,0.7)}.breadcrumb i,.breadcrumb [class^="mdi-"],.breadcrumb [class*="mdi-"],.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:'\E5CC';color:rgba(255,255,255,0.7);vertical-align:top;display:inline-block;font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax-container .parallax{position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1}.parallax-container .parallax img{opacity:0;position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-top,.pin-bottom{position:relative}.pinned{position:fixed !important}ul.staggered-list li{opacity:0}.fade-in{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width: 600px){.hide-on-small-only,.hide-on-small-and-down{display:none !important}}@media only screen and (max-width: 992px){.hide-on-med-and-down{display:none !important}}@media only screen and (min-width: 601px){.hide-on-med-and-up{display:none !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.hide-on-med-only{display:none !important}}@media only screen and (min-width: 993px){.hide-on-large-only{display:none !important}}@media only screen and (min-width: 1201px){.hide-on-extra-large-only{display:none !important}}@media only screen and (min-width: 1201px){.show-on-extra-large{display:block !important}}@media only screen and (min-width: 993px){.show-on-large{display:block !important}}@media only screen and (min-width: 600px) and (max-width: 992px){.show-on-medium{display:block !important}}@media only screen and (max-width: 600px){.show-on-small{display:block !important}}@media only screen and (min-width: 601px){.show-on-medium-and-up{display:block !important}}@media only screen and (max-width: 992px){.show-on-medium-and-down{display:block !important}}@media only screen and (max-width: 600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;color:#fff;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:10px 0px;color:rgba(255,255,255,0.8);background-color:rgba(51,51,51,0.08)}table,th,td{border:none}table{width:100%;display:table;border-collapse:collapse;border-spacing:0}table.striped tr{border-bottom:none}table.striped>tbody>tr:nth-child(odd){background-color:rgba(242,242,242,0.5)}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:rgba(242,242,242,0.5)}table.centered thead tr th,table.centered tbody tr td{text-align:center}tr{border-bottom:1px solid rgba(0,0,0,0.12)}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width: 992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:'\00a0'}table.responsive-table th,table.responsive-table td{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th::before{content:"\00a0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{border-bottom:none;padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid rgba(0,0,0,0.12)}}.collection{margin:.5rem 0 1rem 0;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar:not(.circle-clipper)>.circle,.collection .collection-item.avatar :not(.circle-clipper)>.circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;-webkit-transition:.25s;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container iframe,.video-container object,.video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem 0;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;background-color:#26a69a;-webkit-transition:width .3s linear;transition:width .3s linear}.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite;animation:indeterminate 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite}.progress .indeterminate:after{content:'';position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left, right;-webkit-animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;animation:indeterminate-short 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}100%{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}100%{left:107%;right:-8%}}.hide{display:none !important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left !important}.right{float:right !important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0 !important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;-webkit-box-sizing:border-box;box-sizing:border-box}span.badge.new{font-weight:300;font-size:0.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]::after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px;-webkit-font-smoothing:auto}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-left:auto}.sidenav span.badge{margin-top:calc(24px - 11px)}table span.badge{display:inline-block;float:none;margin-left:auto}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:'liga';-moz-font-feature-settings:'liga';font-feature-settings:'liga'}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width: 601px){.container{width:85%}}@media only screen and (min-width: 993px){.container{width:70%}}.col .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*="push-"],.row .col[class*="pull-"]{position:relative}.row .col.s1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.s7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.s11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width: 601px){.row .col.m1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.m7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.m11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width: 993px){.row .col.l1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.l7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.l11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width: 1201px){.row .col.xl1{width:8.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl3{width:25%;margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl5{width:41.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%;margin-left:auto;left:auto;right:auto}.row .col.xl7{width:58.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl9{width:75%;margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%;margin-left:auto;left:auto;right:auto}.row .col.xl11{width:91.6666666667%;margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%;margin-left:auto;left:auto;right:auto}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav i,nav [class^="mdi-"],nav [class*="mdi-"],nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width: 993px){nav a.sidenav-trigger{display:none}}nav .sidenav-trigger{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .sidenav-trigger i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width: 992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:0.5rem}nav .brand-logo.right{right:0.5rem;left:auto}}nav .brand-logo.right{right:0.5rem;padding:0}nav .brand-logo i,nav .brand-logo [class^="mdi-"],nav .brand-logo [class*="mdi-"],nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{-webkit-transition:background-color .3s;transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,0.1)}nav ul a{-webkit-transition:background-color .3s;transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-large,nav ul a.btn-small,nav ul a.btn-large,nav ul a.btn-flat,nav ul a.btn-floating{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-small>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,0.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=text]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=url]:valid,nav .input-field input[type=date]:valid{border:none;-webkit-box-shadow:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:rgba(255,255,255,0.7);-webkit-transition:color .3s;transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width: 601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.sidenav-trigger,nav a.sidenav-trigger i{height:64px;line-height:64px}.navbar-fixed{height:64px}}a{text-decoration:none}html{line-height:1.5;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-weight:normal;color:rgba(0,0,0,0.87)}@media only screen and (min-width: 0){html{font-size:14px}}@media only screen and (min-width: 992px){html{font-size:14.5px}}@media only screen and (min-width: 1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.3}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;line-height:110%;margin:2.8rem 0 1.68rem 0}h2{font-size:3.56rem;line-height:110%;margin:2.3733333333rem 0 1.424rem 0}h3{font-size:2.92rem;line-height:110%;margin:1.9466666667rem 0 1.168rem 0}h4{font-size:2.28rem;line-height:110%;margin:1.52rem 0 .912rem 0}h5{font-size:1.64rem;line-height:110%;margin:1.0933333333rem 0 .656rem 0}h6{font-size:1.15rem;line-height:110%;margin:.7666666667rem 0 .46rem 0}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light{font-weight:300}.thin{font-weight:200}@media only screen and (min-width: 360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width: 390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width: 420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width: 450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width: 480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width: 510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width: 540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width: 570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width: 600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width: 630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width: 660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width: 690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width: 720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width: 750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width: 780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width: 810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width: 840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width: 870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width: 900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width: 930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width: 960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width: 360px){.flow-text{font-size:1.2rem}}.scale-transition{-webkit-transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:-webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important;transition:transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63), -webkit-transform 0.3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .2s !important;transition:-webkit-transform .2s !important;transition:transform .2s !important;transition:transform .2s, -webkit-transform .2s !important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;padding:24px;margin:.5rem 0 1rem 0;border-radius:2px;background-color:#fff}.card{position:relative;margin:.5rem 0 1rem 0;background-color:#fff;-webkit-transition:-webkit-box-shadow .25s;transition:-webkit-box-shadow .25s;transition:box-shadow .25s;transition:box-shadow .25s, -webkit-box-shadow .25s;border-radius:2px}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.small,.card.medium,.card.large{position:relative}.card.small .card-image,.card.medium .card-image,.card.large .card-image{max-height:60%;overflow:hidden}.card.small .card-image+.card-content,.card.medium .card-image+.card-content,.card.large .card-image+.card-content{max-height:40%}.card.small .card-content,.card.medium .card-content,.card.large .card-content{max-height:100%;overflow:hidden}.card.small .card-action,.card.medium .card-action,.card.large .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.small .card-image,.card.horizontal.medium .card-image,.card.horizontal.large .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.small .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.large .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{background-color:inherit;border-top:1px solid rgba(160,160,160,0.2);position:relative;padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;-webkit-transition:color .3s ease;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-small):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width: 600px){#toast-container{min-width:100%;bottom:0%}}@media only screen and (min-width: 601px) and (max-width: 992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width: 993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;cursor:default}.toast .toast-action{color:#eeff41;font-weight:500;margin-right:-25px;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width: 600px){.toast{width:100%;border-radius:0}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab a,.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover{color:rgba(255,255,255,0.7)}.tabs.tabs-transparent .tab a:hover,.tabs.tabs-transparent .tab a.active{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,0.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;-webkit-transition:color .28s ease, background-color .28s ease;transition:color .28s ease, background-color .28s ease}.tabs .tab a:focus,.tabs .tab a:focus.active{background-color:rgba(246,178,181,0.2);outline:none}.tabs .tab a:hover,.tabs .tab a.active{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,0.4);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left, right}@media only screen and (max-width: 992px){.tabs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;opacity:0;position:absolute;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none;visibility:hidden;background-color:#323232}.backdrop{position:absolute;opacity:0;height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;visibility:hidden}.btn,.btn-large,.btn-small,.btn-flat{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 16px;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn.disabled,.disabled.btn-large,.disabled.btn-small,.btn-floating.disabled,.btn-large.disabled,.btn-small.disabled,.btn-flat.disabled,.btn:disabled,.btn-large:disabled,.btn-small:disabled,.btn-floating:disabled,.btn-large:disabled,.btn-small:disabled,.btn-flat:disabled,.btn[disabled],.btn-large[disabled],.btn-small[disabled],.btn-floating[disabled],.btn-large[disabled],.btn-small[disabled],.btn-flat[disabled]{pointer-events:none;background-color:#DFDFDF !important;-webkit-box-shadow:none;box-shadow:none;color:#9F9F9F !important;cursor:default}.btn.disabled:hover,.disabled.btn-large:hover,.disabled.btn-small:hover,.btn-floating.disabled:hover,.btn-large.disabled:hover,.btn-small.disabled:hover,.btn-flat.disabled:hover,.btn:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-floating:disabled:hover,.btn-large:disabled:hover,.btn-small:disabled:hover,.btn-flat:disabled:hover,.btn[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-floating[disabled]:hover,.btn-large[disabled]:hover,.btn-small[disabled]:hover,.btn-flat[disabled]:hover{background-color:#DFDFDF !important;color:#9F9F9F !important}.btn,.btn-large,.btn-small,.btn-floating,.btn-large,.btn-small,.btn-flat{font-size:14px;outline:0}.btn i,.btn-large i,.btn-small i,.btn-floating i,.btn-large i,.btn-small i,.btn-flat i{font-size:1.3rem;line-height:inherit}.btn:focus,.btn-large:focus,.btn-small:focus,.btn-floating:focus{background-color:#1d7d74}.btn,.btn-large,.btn-small{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;-webkit-transition:background-color .2s ease-out;transition:background-color .2s ease-out;cursor:pointer}.btn:hover,.btn-large:hover,.btn-small:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;background-color:#26a69a;border-radius:50%;-webkit-transition:background-color .3s;transition:background-color .3s;cursor:pointer;vertical-align:middle}.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px;padding:0}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.btn-small{width:32.4px;height:32.4px}.btn-floating.btn-small.halfway-fab{bottom:-16.2px}.btn-floating.btn-small i{line-height:32.4px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:997}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.direction-left,.fixed-action-btn.direction-right{padding:0 0 0 15px}.fixed-action-btn.direction-left ul,.fixed-action-btn.direction-right ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.direction-left ul li,.fixed-action-btn.direction-right ul li{display:inline-block;margin:7.5px 15px 0 0}.fixed-action-btn.direction-right{padding:0 15px 0 0}.fixed-action-btn.direction-right ul{text-align:left;direction:rtl;left:64px;right:auto}.fixed-action-btn.direction-right ul li{margin:7.5px 0 0 15px}.fixed-action-btn.direction-bottom{padding:0 0 15px 0}.fixed-action-btn.direction-bottom ul{top:64px;bottom:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.fixed-action-btn.direction-bottom ul li{margin:15px 0 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0;z-index:1}.fixed-action-btn.toolbar ul li{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;-webkit-transition:none;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{-webkit-box-shadow:none;box-shadow:none;background-color:transparent;color:#343434;cursor:pointer;-webkit-transition:background-color .2s;transition:background-color .2s}.btn-flat:focus,.btn-flat:hover{-webkit-box-shadow:none;box-shadow:none}.btn-flat:focus{background-color:rgba(0,0,0,0.1)}.btn-flat.disabled,.btn-flat.btn-flat[disabled]{background-color:transparent !important;color:#b3b2b2 !important;cursor:default}.btn-large{height:54px;line-height:54px;font-size:15px;padding:0 28px}.btn-large i{font-size:1.6rem}.btn-small{height:32.4px;line-height:32.4px;font-size:13px}.btn-small i{font-size:1.2rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;overflow-y:auto;opacity:0;position:absolute;left:0;top:0;z-index:9999;-webkit-transform-origin:0 0;transform-origin:0 0}.dropdown-content:focus{outline:0}.dropdown-content li{clear:both;color:rgba(0,0,0,0.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left}.dropdown-content li:hover,.dropdown-content li.active{background-color:#eee}.dropdown-content li:focus{outline:none}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}body.keyboard-focused .dropdown-content li:focus{background-color:#dadada}.input-field.col .dropdown-content [type="checkbox"]+label{top:1px;left:0;height:18px;-webkit-transform:none;transform:none}.dropdown-trigger{cursor:pointer}/*! + * Waves v0.6.0 + * http://fian.my.id/Waves + * + * Copyright 2014 Alfiana E. Sibuea and other contributors + * Released under the MIT license + * https://github.com/fians/Waves/blob/master/LICENSE + */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;-webkit-transition:.3s ease-out;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, -webkit-transform;transition-property:transform, opacity;transition-property:transform, opacity, -webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{-webkit-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;-webkit-transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);transition:margin 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94)}.collapsible.popout>li.active{-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,0.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip:focus{outline:none;background-color:#26a69a;color:#fff}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;-webkit-box-shadow:none;box-shadow:none;margin:0 0 8px 0;min-height:45px;outline:none;-webkit-transition:all .3s;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .input{background:none;border:0;color:rgba(0,0,0,0.6);display:inline-block;font-size:16px;height:3rem;line-height:32px;outline:0;margin:0;padding:0 !important;width:120px !important}.chips .input:focus{border:0 !important;-webkit-box-shadow:none !important;box-shadow:none !important}.chips .autocomplete-content{margin-top:0;margin-bottom:0}.prefix ~ .chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty ~ label{font-size:0.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;-webkit-transition:opacity .4s;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#292929;z-index:1000;will-change:opacity}.materialbox-caption{position:fixed;display:none;color:#fff;line-height:50px;bottom:0;left:0;width:100%;text-align:center;padding:0% 15%;height:50px;z-index:1000;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}::-ms-input-placeholder{color:#d1d1d1}::placeholder{color:#d1d1d1}input:not([type]),input[type=text]:not(.browser-default),input[type=password]:not(.browser-default),input[type=email]:not(.browser-default),input[type=url]:not(.browser-default),input[type=time]:not(.browser-default),input[type=date]:not(.browser-default),input[type=datetime]:not(.browser-default),input[type=datetime-local]:not(.browser-default),input[type=tel]:not(.browser-default),input[type=number]:not(.browser-default),input[type=search]:not(.browser-default),textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:border .3s, -webkit-box-shadow .3s;transition:border .3s, -webkit-box-shadow .3s;transition:box-shadow .3s, border .3s;transition:box-shadow .3s, border .3s, -webkit-box-shadow .3s}input:not([type]):disabled,input:not([type])[readonly="readonly"],input[type=text]:not(.browser-default):disabled,input[type=text]:not(.browser-default)[readonly="readonly"],input[type=password]:not(.browser-default):disabled,input[type=password]:not(.browser-default)[readonly="readonly"],input[type=email]:not(.browser-default):disabled,input[type=email]:not(.browser-default)[readonly="readonly"],input[type=url]:not(.browser-default):disabled,input[type=url]:not(.browser-default)[readonly="readonly"],input[type=time]:not(.browser-default):disabled,input[type=time]:not(.browser-default)[readonly="readonly"],input[type=date]:not(.browser-default):disabled,input[type=date]:not(.browser-default)[readonly="readonly"],input[type=datetime]:not(.browser-default):disabled,input[type=datetime]:not(.browser-default)[readonly="readonly"],input[type=datetime-local]:not(.browser-default):disabled,input[type=datetime-local]:not(.browser-default)[readonly="readonly"],input[type=tel]:not(.browser-default):disabled,input[type=tel]:not(.browser-default)[readonly="readonly"],input[type=number]:not(.browser-default):disabled,input[type=number]:not(.browser-default)[readonly="readonly"],input[type=search]:not(.browser-default):disabled,input[type=search]:not(.browser-default)[readonly="readonly"],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly="readonly"]{color:rgba(0,0,0,0.42);border-bottom:1px dotted rgba(0,0,0,0.42)}input:not([type]):disabled+label,input:not([type])[readonly="readonly"]+label,input[type=text]:not(.browser-default):disabled+label,input[type=text]:not(.browser-default)[readonly="readonly"]+label,input[type=password]:not(.browser-default):disabled+label,input[type=password]:not(.browser-default)[readonly="readonly"]+label,input[type=email]:not(.browser-default):disabled+label,input[type=email]:not(.browser-default)[readonly="readonly"]+label,input[type=url]:not(.browser-default):disabled+label,input[type=url]:not(.browser-default)[readonly="readonly"]+label,input[type=time]:not(.browser-default):disabled+label,input[type=time]:not(.browser-default)[readonly="readonly"]+label,input[type=date]:not(.browser-default):disabled+label,input[type=date]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime]:not(.browser-default):disabled+label,input[type=datetime]:not(.browser-default)[readonly="readonly"]+label,input[type=datetime-local]:not(.browser-default):disabled+label,input[type=datetime-local]:not(.browser-default)[readonly="readonly"]+label,input[type=tel]:not(.browser-default):disabled+label,input[type=tel]:not(.browser-default)[readonly="readonly"]+label,input[type=number]:not(.browser-default):disabled+label,input[type=number]:not(.browser-default)[readonly="readonly"]+label,input[type=search]:not(.browser-default):disabled+label,input[type=search]:not(.browser-default)[readonly="readonly"]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly="readonly"]+label{color:rgba(0,0,0,0.42)}input:not([type]):focus:not([readonly]),input[type=text]:not(.browser-default):focus:not([readonly]),input[type=password]:not(.browser-default):focus:not([readonly]),input[type=email]:not(.browser-default):focus:not([readonly]),input[type=url]:not(.browser-default):focus:not([readonly]),input[type=time]:not(.browser-default):focus:not([readonly]),input[type=date]:not(.browser-default):focus:not([readonly]),input[type=datetime]:not(.browser-default):focus:not([readonly]),input[type=datetime-local]:not(.browser-default):focus:not([readonly]),input[type=tel]:not(.browser-default):focus:not([readonly]),input[type=number]:not(.browser-default):focus:not([readonly]),input[type=search]:not(.browser-default):focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;-webkit-box-shadow:0 1px 0 0 #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=text]:not(.browser-default):focus:not([readonly])+label,input[type=password]:not(.browser-default):focus:not([readonly])+label,input[type=email]:not(.browser-default):focus:not([readonly])+label,input[type=url]:not(.browser-default):focus:not([readonly])+label,input[type=time]:not(.browser-default):focus:not([readonly])+label,input[type=date]:not(.browser-default):focus:not([readonly])+label,input[type=datetime]:not(.browser-default):focus:not([readonly])+label,input[type=datetime-local]:not(.browser-default):focus:not([readonly])+label,input[type=tel]:not(.browser-default):focus:not([readonly])+label,input[type=number]:not(.browser-default):focus:not([readonly])+label,input[type=search]:not(.browser-default):focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]):focus.valid ~ label,input[type=text]:not(.browser-default):focus.valid ~ label,input[type=password]:not(.browser-default):focus.valid ~ label,input[type=email]:not(.browser-default):focus.valid ~ label,input[type=url]:not(.browser-default):focus.valid ~ label,input[type=time]:not(.browser-default):focus.valid ~ label,input[type=date]:not(.browser-default):focus.valid ~ label,input[type=datetime]:not(.browser-default):focus.valid ~ label,input[type=datetime-local]:not(.browser-default):focus.valid ~ label,input[type=tel]:not(.browser-default):focus.valid ~ label,input[type=number]:not(.browser-default):focus.valid ~ label,input[type=search]:not(.browser-default):focus.valid ~ label,textarea.materialize-textarea:focus.valid ~ label{color:#4CAF50}input:not([type]):focus.invalid ~ label,input[type=text]:not(.browser-default):focus.invalid ~ label,input[type=password]:not(.browser-default):focus.invalid ~ label,input[type=email]:not(.browser-default):focus.invalid ~ label,input[type=url]:not(.browser-default):focus.invalid ~ label,input[type=time]:not(.browser-default):focus.invalid ~ label,input[type=date]:not(.browser-default):focus.invalid ~ label,input[type=datetime]:not(.browser-default):focus.invalid ~ label,input[type=datetime-local]:not(.browser-default):focus.invalid ~ label,input[type=tel]:not(.browser-default):focus.invalid ~ label,input[type=number]:not(.browser-default):focus.invalid ~ label,input[type=search]:not(.browser-default):focus.invalid ~ label,textarea.materialize-textarea:focus.invalid ~ label{color:#F44336}input:not([type]).validate+label,input[type=text]:not(.browser-default).validate+label,input[type=password]:not(.browser-default).validate+label,input[type=email]:not(.browser-default).validate+label,input[type=url]:not(.browser-default).validate+label,input[type=time]:not(.browser-default).validate+label,input[type=date]:not(.browser-default).validate+label,input[type=datetime]:not(.browser-default).validate+label,input[type=datetime-local]:not(.browser-default).validate+label,input[type=tel]:not(.browser-default).validate+label,input[type=number]:not(.browser-default).validate+label,input[type=search]:not(.browser-default).validate+label,textarea.materialize-textarea.validate+label{width:100%}input.valid:not([type]),input.valid:not([type]):focus,input.valid[type=text]:not(.browser-default),input.valid[type=text]:not(.browser-default):focus,input.valid[type=password]:not(.browser-default),input.valid[type=password]:not(.browser-default):focus,input.valid[type=email]:not(.browser-default),input.valid[type=email]:not(.browser-default):focus,input.valid[type=url]:not(.browser-default),input.valid[type=url]:not(.browser-default):focus,input.valid[type=time]:not(.browser-default),input.valid[type=time]:not(.browser-default):focus,input.valid[type=date]:not(.browser-default),input.valid[type=date]:not(.browser-default):focus,input.valid[type=datetime]:not(.browser-default),input.valid[type=datetime]:not(.browser-default):focus,input.valid[type=datetime-local]:not(.browser-default),input.valid[type=datetime-local]:not(.browser-default):focus,input.valid[type=tel]:not(.browser-default),input.valid[type=tel]:not(.browser-default):focus,input.valid[type=number]:not(.browser-default),input.valid[type=number]:not(.browser-default):focus,input.valid[type=search]:not(.browser-default),input.valid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.valid,textarea.materialize-textarea.valid:focus,.select-wrapper.valid>input.select-dropdown{border-bottom:1px solid #4CAF50;-webkit-box-shadow:0 1px 0 0 #4CAF50;box-shadow:0 1px 0 0 #4CAF50}input.invalid:not([type]),input.invalid:not([type]):focus,input.invalid[type=text]:not(.browser-default),input.invalid[type=text]:not(.browser-default):focus,input.invalid[type=password]:not(.browser-default),input.invalid[type=password]:not(.browser-default):focus,input.invalid[type=email]:not(.browser-default),input.invalid[type=email]:not(.browser-default):focus,input.invalid[type=url]:not(.browser-default),input.invalid[type=url]:not(.browser-default):focus,input.invalid[type=time]:not(.browser-default),input.invalid[type=time]:not(.browser-default):focus,input.invalid[type=date]:not(.browser-default),input.invalid[type=date]:not(.browser-default):focus,input.invalid[type=datetime]:not(.browser-default),input.invalid[type=datetime]:not(.browser-default):focus,input.invalid[type=datetime-local]:not(.browser-default),input.invalid[type=datetime-local]:not(.browser-default):focus,input.invalid[type=tel]:not(.browser-default),input.invalid[type=tel]:not(.browser-default):focus,input.invalid[type=number]:not(.browser-default),input.invalid[type=number]:not(.browser-default):focus,input.invalid[type=search]:not(.browser-default),input.invalid[type=search]:not(.browser-default):focus,textarea.materialize-textarea.invalid,textarea.materialize-textarea.invalid:focus,.select-wrapper.invalid>input.select-dropdown,.select-wrapper.invalid>input.select-dropdown:focus{border-bottom:1px solid #F44336;-webkit-box-shadow:0 1px 0 0 #F44336;box-shadow:0 1px 0 0 #F44336}input:not([type]).valid ~ .helper-text[data-success],input:not([type]):focus.valid ~ .helper-text[data-success],input:not([type]).invalid ~ .helper-text[data-error],input:not([type]):focus.invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default).valid ~ .helper-text[data-success],input[type=text]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=text]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=text]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default).valid ~ .helper-text[data-success],input[type=password]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=password]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=password]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default).valid ~ .helper-text[data-success],input[type=email]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=email]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=email]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default).valid ~ .helper-text[data-success],input[type=url]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=url]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=url]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default).valid ~ .helper-text[data-success],input[type=time]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=time]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=time]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default).valid ~ .helper-text[data-success],input[type=date]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=date]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=date]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default).valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default).valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=tel]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default).valid ~ .helper-text[data-success],input[type=number]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=number]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=number]:not(.browser-default):focus.invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default).valid ~ .helper-text[data-success],input[type=search]:not(.browser-default):focus.valid ~ .helper-text[data-success],input[type=search]:not(.browser-default).invalid ~ .helper-text[data-error],input[type=search]:not(.browser-default):focus.invalid ~ .helper-text[data-error],textarea.materialize-textarea.valid ~ .helper-text[data-success],textarea.materialize-textarea:focus.valid ~ .helper-text[data-success],textarea.materialize-textarea.invalid ~ .helper-text[data-error],textarea.materialize-textarea:focus.invalid ~ .helper-text[data-error],.select-wrapper.valid .helper-text[data-success],.select-wrapper.invalid ~ .helper-text[data-error]{color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}input:not([type]).valid ~ .helper-text:after,input:not([type]):focus.valid ~ .helper-text:after,input[type=text]:not(.browser-default).valid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=password]:not(.browser-default).valid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=email]:not(.browser-default).valid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=url]:not(.browser-default).valid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=time]:not(.browser-default).valid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=date]:not(.browser-default).valid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).valid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=tel]:not(.browser-default).valid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=number]:not(.browser-default).valid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.valid ~ .helper-text:after,input[type=search]:not(.browser-default).valid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.valid ~ .helper-text:after,textarea.materialize-textarea.valid ~ .helper-text:after,textarea.materialize-textarea:focus.valid ~ .helper-text:after,.select-wrapper.valid ~ .helper-text:after{content:attr(data-success);color:#4CAF50}input:not([type]).invalid ~ .helper-text:after,input:not([type]):focus.invalid ~ .helper-text:after,input[type=text]:not(.browser-default).invalid ~ .helper-text:after,input[type=text]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=password]:not(.browser-default).invalid ~ .helper-text:after,input[type=password]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=email]:not(.browser-default).invalid ~ .helper-text:after,input[type=email]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=url]:not(.browser-default).invalid ~ .helper-text:after,input[type=url]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=time]:not(.browser-default).invalid ~ .helper-text:after,input[type=time]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=date]:not(.browser-default).invalid ~ .helper-text:after,input[type=date]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default).invalid ~ .helper-text:after,input[type=datetime-local]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=tel]:not(.browser-default).invalid ~ .helper-text:after,input[type=tel]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=number]:not(.browser-default).invalid ~ .helper-text:after,input[type=number]:not(.browser-default):focus.invalid ~ .helper-text:after,input[type=search]:not(.browser-default).invalid ~ .helper-text:after,input[type=search]:not(.browser-default):focus.invalid ~ .helper-text:after,textarea.materialize-textarea.invalid ~ .helper-text:after,textarea.materialize-textarea:focus.invalid ~ .helper-text:after,.select-wrapper.invalid ~ .helper-text:after{content:attr(data-error);color:#F44336}input:not([type])+label:after,input[type=text]:not(.browser-default)+label:after,input[type=password]:not(.browser-default)+label:after,input[type=email]:not(.browser-default)+label:after,input[type=url]:not(.browser-default)+label:after,input[type=time]:not(.browser-default)+label:after,input[type=date]:not(.browser-default)+label:after,input[type=datetime]:not(.browser-default)+label:after,input[type=datetime-local]:not(.browser-default)+label:after,input[type=tel]:not(.browser-default)+label:after,input[type=number]:not(.browser-default)+label:after,input[type=search]:not(.browser-default)+label:after,textarea.materialize-textarea+label:after,.select-wrapper+label:after{display:block;content:"";position:absolute;top:100%;left:0;opacity:0;-webkit-transition:.2s opacity ease-out, .2s color ease-out;transition:.2s opacity ease-out, .2s color ease-out}.input-field{position:relative;margin-top:1rem;margin-bottom:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline input,.input-field.inline .select-dropdown{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix ~ label,.input-field.col .prefix ~ .validate ~ label{width:calc(100% - 3rem - 1.5rem)}.input-field>label{color:#9e9e9e;position:absolute;top:0;left:0;font-size:1rem;cursor:text;-webkit-transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:color .2s ease-out, -webkit-transform .2s ease-out;transition:transform .2s ease-out, color .2s ease-out;transition:transform .2s ease-out, color .2s ease-out, -webkit-transform .2s ease-out;-webkit-transform-origin:0% 100%;transform-origin:0% 100%;text-align:initial;-webkit-transform:translateY(12px);transform:translateY(12px)}.input-field>label:not(.label-icon).active{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field>input[type]:-webkit-autofill:not(.browser-default):not([type="search"])+label,.input-field>input[type=date]:not(.browser-default)+label,.input-field>input[type=time]:not(.browser-default)+label{-webkit-transform:translateY(-14px) scale(0.8);transform:translateY(-14px) scale(0.8);-webkit-transform-origin:0 0;transform-origin:0 0}.input-field .helper-text{position:relative;min-height:18px;display:block;font-size:12px;color:rgba(0,0,0,0.54)}.input-field .helper-text::after{opacity:1;position:absolute;top:0;left:0}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;-webkit-transition:color .2s;transition:color .2s;top:.5rem}.input-field .prefix.active{color:#26a69a}.input-field .prefix ~ input,.input-field .prefix ~ textarea,.input-field .prefix ~ label,.input-field .prefix ~ .validate ~ label,.input-field .prefix ~ .helper-text,.input-field .prefix ~ .autocomplete-content{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix ~ label{margin-left:3rem}@media only screen and (max-width: 992px){.input-field .prefix ~ input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width: 600px){.input-field .prefix ~ input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;-webkit-transition:.3s background-color;transition:.3s background-color}.nav-wrapper .input-field input[type=search]{height:inherit;padding-left:4rem;width:calc(100% - 4rem);border:0;-webkit-box-shadow:none;box-shadow:none}.input-field input[type=search]:focus:not(.browser-default){background-color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;color:#444}.input-field input[type=search]:focus:not(.browser-default)+label i,.input-field input[type=search]:focus:not(.browser-default) ~ .mdi-navigation-close,.input-field input[type=search]:focus:not(.browser-default) ~ .material-icons{color:#444}.input-field input[type=search]+.label-icon{-webkit-transform:none;transform:none;left:1rem}.input-field input[type=search] ~ .mdi-navigation-close,.input-field input[type=search] ~ .material-icons{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;-webkit-transition:.3s color;transition:.3s color}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{line-height:normal;overflow-y:hidden;padding:.8rem 0 .8rem 0;resize:none;min-height:3rem;-webkit-box-sizing:border-box;box-sizing:border-box}.hiddendiv{visibility:hidden;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0;z-index:-1}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}.character-counter{min-height:18px}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;opacity:0;pointer-events:none}[type="radio"]:not(:checked)+span,[type="radio"]:checked+span{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-transition:.28s ease;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="radio"]+span:before,[type="radio"]+span:after{content:'';position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;-webkit-transition:.28s ease;transition:.28s ease}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after,[type="radio"]:checked+span:before,[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border-radius:50%}[type="radio"]:not(:checked)+span:before,[type="radio"]:not(:checked)+span:after{border:2px solid #5a5a5a}[type="radio"]:not(:checked)+span:after{-webkit-transform:scale(0);transform:scale(0)}[type="radio"]:checked+span:before{border:2px solid transparent}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:before,[type="radio"].with-gap:checked+span:after{border:2px solid #26a69a}[type="radio"]:checked+span:after,[type="radio"].with-gap:checked+span:after{background-color:#26a69a}[type="radio"]:checked+span:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type="radio"].with-gap:checked+span:after{-webkit-transform:scale(0.5);transform:scale(0.5)}[type="radio"].tabbed:focus+span:before{-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1)}[type="radio"].with-gap:disabled:checked+span:before{border:2px solid rgba(0,0,0,0.42)}[type="radio"].with-gap:disabled:checked+span:after{border:none;background-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before,[type="radio"]:disabled:checked+span:before{background-color:transparent;border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled+span{color:rgba(0,0,0,0.42)}[type="radio"]:disabled:not(:checked)+span:before{border-color:rgba(0,0,0,0.42)}[type="radio"]:disabled:checked+span:after{background-color:rgba(0,0,0,0.42);border-color:#949494}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;opacity:0;pointer-events:none}[type="checkbox"]+span:not(.lever){position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type="checkbox"]+span:not(.lever):before,[type="checkbox"]:not(.filled-in)+span:not(.lever):after{content:'';position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:3px;-webkit-transition:.2s;transition:.2s}[type="checkbox"]:not(.filled-in)+span:not(.lever):after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type="checkbox"]:not(:checked):disabled+span:not(.lever):before{border:none;background-color:rgba(0,0,0,0.42)}[type="checkbox"].tabbed:focus+span:not(.lever):after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;-webkit-box-shadow:0 0 0 10px rgba(0,0,0,0.1);box-shadow:0 0 0 10px rgba(0,0,0,0.1);background-color:rgba(0,0,0,0.1)}[type="checkbox"]:checked+span:not(.lever):before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:checked:disabled+span:before{border-right:2px solid rgba(0,0,0,0.42);border-bottom:2px solid rgba(0,0,0,0.42)}[type="checkbox"]:indeterminate+span:not(.lever):before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"]:indeterminate:disabled+span:not(.lever):before{border-right:2px solid rgba(0,0,0,0.42);background-color:transparent}[type="checkbox"].filled-in+span:not(.lever):after{border-radius:2px}[type="checkbox"].filled-in+span:not(.lever):before,[type="checkbox"].filled-in+span:not(.lever):after{content:'';left:0;position:absolute;-webkit-transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;transition:border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s;z-index:1}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:not(:checked)+span:not(.lever):after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0px;z-index:0}[type="checkbox"].filled-in:checked+span:not(.lever):before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotateZ(37deg);transform:rotateZ(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type="checkbox"].filled-in:checked+span:not(.lever):after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type="checkbox"].filled-in.tabbed:focus+span:not(.lever):after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,0.1)}[type="checkbox"].filled-in.tabbed:checked:focus+span:not(.lever):after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):before{background-color:transparent;border:2px solid transparent}[type="checkbox"].filled-in:disabled:not(:checked)+span:not(.lever):after{border-color:transparent;background-color:#949494}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):before{background-color:transparent}[type="checkbox"].filled-in:disabled:checked+span:not(.lever):after{background-color:#949494;border-color:#949494}.switch,.switch *{-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:before,.switch label input[type=checkbox]:checked+.lever:after{left:18px}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a}.switch label .lever{content:"";display:inline-block;position:relative;width:36px;height:14px;background-color:rgba(0,0,0,0.38);border-radius:15px;margin-right:10px;-webkit-transition:background 0.3s ease;transition:background 0.3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:before,.switch label .lever:after{content:"";position:absolute;display:inline-block;width:20px;height:20px;border-radius:50%;left:0;top:-3px;-webkit-transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease;transition:left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease, -webkit-box-shadow 0.1s ease, -webkit-transform .1s ease}.switch label .lever:before{background-color:rgba(38,166,154,0.15)}.switch label .lever:after{background-color:#F1F1F1;-webkit-box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12);box-shadow:0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)}input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before,input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(38,166,154,0.15)}input[type=checkbox]:not(:disabled) ~ .lever:active:before,input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before{-webkit-transform:scale(2.4);transform:scale(2.4);background-color:rgba(0,0,0,0.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default;background-color:rgba(0,0,0,0.12)}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#949494}select{display:none}select.browser-default{display:block}select{background-color:rgba(255,255,255,0.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper.valid+label,.select-wrapper.invalid+label{width:100%;pointer-events:none}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:16px;margin:0 0 8px 0;padding:0;display:block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:1}.select-wrapper input.select-dropdown:focus{border-bottom:1px solid #26a69a}.select-wrapper .caret{position:absolute;right:0;top:0;bottom:0;margin:auto 0;z-index:0;fill:rgba(0,0,0,0.87)}.select-wrapper+label{position:absolute;top:-26px;font-size:.8rem}select:disabled{color:rgba(0,0,0,0.42)}.select-wrapper.disabled+label{color:rgba(0,0,0,0.42)}.select-wrapper.disabled .caret{fill:rgba(0,0,0,0.42)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,0.42);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-wrapper i{color:rgba(0,0,0,0.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,0.3);background-color:transparent}body.keyboard-focused .select-dropdown.dropdown-content li:focus{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li:hover{background-color:rgba(0,0,0,0.08)}.select-dropdown.dropdown-content li.selected{background-color:rgba(0,0,0,0.03)}.prefix ~ .select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix ~ label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,0.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,0.4)}.select-dropdown li.optgroup ~ li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large,.file-field .btn-small{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.file-field input[type=file]::-webkit-file-upload-button{display:none}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;-webkit-appearance:none;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0 0}.keyboard-focused input[type=range]:focus:not(.active)::-webkit-slider-thumb{-webkit-box-shadow:0 0 0 10px rgba(38,166,154,0.26);box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]{border:1px solid white}input[type=range]::-moz-range-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-moz-focus-inner{border:0}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}.keyboard-focused input[type=range]:focus:not(.active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;-webkit-transition:-webkit-box-shadow .3s;transition:-webkit-box-shadow .3s;transition:box-shadow .3s;transition:box-shadow .3s, -webkit-box-shadow .3s}.keyboard-focused input[type=range]:focus:not(.active)::-ms-thumb{box-shadow:0 0 0 10px rgba(38,166,154,0.26)}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{display:inline-block;font-weight:300;color:#757575;padding-left:16px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:15px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:14px;border-left:2px solid #ee6e73}.sidenav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:100%;height:calc(100% + 60px);height:-moz-calc(100%);padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.sidenav .collapsible{margin:0}.sidenav li{float:none;line-height:48px}.sidenav li.active{background-color:rgba(0,0,0,0.05)}.sidenav li>a{color:rgba(0,0,0,0.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.sidenav li>a:hover{background-color:rgba(0,0,0,0.05)}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-flat,.sidenav li>a.btn-floating{margin:10px 15px}.sidenav li>a.btn,.sidenav li>a.btn-large,.sidenav li>a.btn-small,.sidenav li>a.btn-large,.sidenav li>a.btn-floating{color:#fff}.sidenav li>a.btn-flat{color:#343434}.sidenav li>a.btn:hover,.sidenav li>a.btn-large:hover,.sidenav li>a.btn-small:hover,.sidenav li>a.btn-large:hover{background-color:#2bbbad}.sidenav li>a.btn-floating:hover{background-color:#26a69a}.sidenav li>a>i,.sidenav li>a>[class^="mdi-"],.sidenav li>a li>a>[class*="mdi-"],.sidenav li>a>i.material-icons{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,0.54)}.sidenav .divider{margin:8px 0 0 0}.sidenav .subheader{cursor:initial;pointer-events:none;color:rgba(0,0,0,0.54);font-size:14px;font-weight:500;line-height:48px}.sidenav .subheader:hover{background-color:transparent}.sidenav .user-view{position:relative;padding:32px 32px 0;margin-bottom:8px}.sidenav .user-view>a{height:auto;padding:0}.sidenav .user-view>a:hover{background-color:transparent}.sidenav .user-view .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.sidenav .user-view .circle,.sidenav .user-view .name,.sidenav .user-view .email{display:block}.sidenav .user-view .circle{height:64px;width:64px}.sidenav .user-view .name,.sidenav .user-view .email{font-size:14px;line-height:24px}.sidenav .user-view .name{margin-top:16px;font-weight:500}.sidenav .user-view .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.drag-target.right-aligned{right:0}.sidenav.sidenav-fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.sidenav.sidenav-fixed.right-aligned{right:0;left:auto}@media only screen and (max-width: 992px){.sidenav.sidenav-fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.sidenav.sidenav-fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.sidenav>a{padding:0 16px}.sidenav .user-view{padding:16px 16px 0}}.sidenav .collapsible-body>ul:not(.collapsible)>li.active,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.sidenav .collapsible-body>ul:not(.collapsible)>li.active a,.sidenav.sidenav-fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.sidenav .collapsible-body{padding:0}.sidenav-overlay{position:fixed;top:0;left:0;right:0;opacity:0;height:120vh;background-color:rgba(0,0,0,0.5);z-index:997;display:none}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(360deg)}}@keyframes container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,blue-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,red-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both,green-fade-in-out 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only,.active .spinner-layer.spinner-green-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@keyframes blue-fade-in-out{from{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}100%{opacity:1}}@-webkit-keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{from{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{from{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}@keyframes green-fade-in-out{from{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}100%{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent !important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent !important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent !important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both;animation:right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@-webkit-keyframes left-spin{from{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{from{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{from{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{from{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1);animation:container-rotate 1568ms linear infinite,fade-out 400ms cubic-bezier(0.4, 0, 0.2, 1)}@-webkit-keyframes fade-out{from{opacity:1}to{opacity:0}}@keyframes fade-out{from{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:center}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4CAF50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0% 50%;transform-origin:0% 50%}.carousel.carousel-slider{top:0;left:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{visibility:hidden;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:rgba(255,255,255,0.5);-webkit-transition:background-color .3s;transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel.scrolling .carousel-item .materialboxed,.carousel .carousel-item:not(.active) .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;-webkit-transition:visibility 0s .3s;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;-webkit-transition:visibility 0s;transition:visibility 0s}.tap-target-wrapper.open .tap-target{-webkit-transform:scale(1);transform:scale(1);opacity:.95;-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-wrapper.open .tap-target-wave::before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave::after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;-webkit-transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, visibility 0s 1s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s 1s;transition:opacity .3s, transform .3s, visibility 0s 1s, -webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;-webkit-box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);box-shadow:0 20px 20px 0 rgba(0,0,0,0.14),0 10px 50px 0 rgba(0,0,0,0.12),0 30px 10px -20px rgba(0,0,0,0.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);-webkit-transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1);transition:transform 0.3s cubic-bezier(0.42, 0, 0.58, 1),opacity 0.3s cubic-bezier(0.42, 0, 0.58, 1),-webkit-transform 0.3s cubic-bezier(0.42, 0, 0.58, 1)}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave::before,.tap-target-wave::after{content:'';display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#ffffff}.tap-target-wave::before{-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s, -webkit-transform .3s}.tap-target-wave::after{visibility:hidden;-webkit-transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, visibility 0s, -webkit-transform .3s;transition:opacity .3s, transform .3s, visibility 0s;transition:opacity .3s, transform .3s, visibility 0s, -webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:10002;position:absolute !important}.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small),.tap-target-origin:not(.btn):not(.btn-large):not(.btn-small):hover{background:none}@media only screen and (max-width: 600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:visible;position:relative}.pulse::before{content:'';display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;-webkit-transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, -webkit-transform .3s;transition:opacity .3s, transform .3s;transition:opacity .3s, transform .3s, -webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;animation:pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}100%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.datepicker-modal{max-width:325px;min-width:300px;max-height:none}.datepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.datepicker-controls{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;width:280px;margin:0 auto}.datepicker-controls .selects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.datepicker-controls .select-wrapper input{border-bottom:none;text-align:center;margin:0}.datepicker-controls .select-wrapper input:focus{border-bottom:none}.datepicker-controls .select-wrapper .caret{display:none}.datepicker-controls .select-year input{width:50px}.datepicker-controls .select-month input{width:70px}.month-prev,.month-next{margin-top:4px;cursor:pointer;background-color:transparent;border:none}.datepicker-date-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;color:#fff;padding:20px 22px;font-weight:500}.datepicker-date-display .year-text{display:block;font-size:1.5rem;line-height:25px;color:rgba(255,255,255,0.7)}.datepicker-date-display .date-text{display:block;font-size:2.8rem;line-height:47px;font-weight:500}.datepicker-calendar-container{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.datepicker-table{width:280px;font-size:1rem;margin:0 auto}.datepicker-table thead{border-bottom:none}.datepicker-table th{padding:10px 5px;text-align:center}.datepicker-table tr{border:none}.datepicker-table abbr{text-decoration:none;color:#999}.datepicker-table td{border-radius:50%;padding:0}.datepicker-table td.is-today{color:#26a69a}.datepicker-table td.is-selected{background-color:#26a69a;color:#fff}.datepicker-table td.is-outside-current-month,.datepicker-table td.is-disabled{color:rgba(0,0,0,0.3);pointer-events:none}.datepicker-day-button{background-color:transparent;border:none;line-height:38px;display:block;width:100%;border-radius:50%;padding:0 5px;cursor:pointer;color:inherit}.datepicker-day-button:focus{background-color:rgba(43,161,150,0.25)}.datepicker-footer{width:280px;margin:0 auto;padding-bottom:5px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.datepicker-cancel,.datepicker-clear,.datepicker-today,.datepicker-done{color:#26a69a;padding:0 1rem}.datepicker-clear{color:#F44336}@media only screen and (min-width: 601px){.datepicker-modal{max-width:625px}.datepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.datepicker-date-display{-webkit-box-flex:0;-webkit-flex:0 1 270px;-ms-flex:0 1 270px;flex:0 1 270px}.datepicker-controls,.datepicker-table,.datepicker-footer{width:320px}.datepicker-day-button{line-height:44px}}.timepicker-modal{max-width:325px;max-height:none}.timepicker-container.modal-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:0}.text-primary{color:#fff}.timepicker-digital-display{-webkit-box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;background-color:#26a69a;padding:10px;font-weight:300}.timepicker-text-container{font-size:4rem;font-weight:bold;text-align:center;color:rgba(255,255,255,0.6);font-weight:400;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-span-hours,.timepicker-span-minutes,.timepicker-span-am-pm div{cursor:pointer}.timepicker-span-hours{margin-right:3px}.timepicker-span-minutes{margin-left:3px}.timepicker-display-am-pm{font-size:1.3rem;position:absolute;right:1rem;bottom:1rem;font-weight:400}.timepicker-analog-display{-webkit-box-flex:2.5;-webkit-flex:2.5 auto;-ms-flex:2.5 auto;flex:2.5 auto}.timepicker-plate{background-color:#eee;border-radius:50%;width:270px;height:270px;overflow:visible;position:relative;margin:auto;margin-top:25px;margin-bottom:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.timepicker-canvas,.timepicker-dial{position:absolute;left:0;right:0;top:0;bottom:0}.timepicker-minutes{visibility:hidden}.timepicker-tick{border-radius:50%;color:rgba(0,0,0,0.87);line-height:40px;text-align:center;width:40px;height:40px;position:absolute;cursor:pointer;font-size:15px}.timepicker-tick.active,.timepicker-tick:hover{background-color:rgba(38,166,154,0.25)}.timepicker-dial{-webkit-transition:opacity 350ms, -webkit-transform 350ms;transition:opacity 350ms, -webkit-transform 350ms;transition:transform 350ms, opacity 350ms;transition:transform 350ms, opacity 350ms, -webkit-transform 350ms}.timepicker-dial-out{opacity:0}.timepicker-dial-out.timepicker-hours{-webkit-transform:scale(1.1, 1.1);transform:scale(1.1, 1.1)}.timepicker-dial-out.timepicker-minutes{-webkit-transform:scale(0.8, 0.8);transform:scale(0.8, 0.8)}.timepicker-canvas{-webkit-transition:opacity 175ms;transition:opacity 175ms}.timepicker-canvas line{stroke:#26a69a;stroke-width:4;stroke-linecap:round}.timepicker-canvas-out{opacity:0.25}.timepicker-canvas-bearing{stroke:none;fill:#26a69a}.timepicker-canvas-bg{stroke:none;fill:#26a69a}.timepicker-footer{margin:0 auto;padding:5px 1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.timepicker-clear{color:#F44336}.timepicker-close{color:#26a69a}.timepicker-clear,.timepicker-close{padding:0 20px}@media only screen and (min-width: 601px){.timepicker-modal{max-width:600px}.timepicker-container.modal-content{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.timepicker-text-container{top:32%}.timepicker-display-am-pm{position:relative;right:auto;bottom:auto;text-align:center;margin-top:1.2rem}} diff --git a/Timelapse/ServerFiles/css/timelapse.css b/Timelapse/ServerFiles/css/timelapse.css new file mode 100644 index 0000000..dab78c1 --- /dev/null +++ b/Timelapse/ServerFiles/css/timelapse.css @@ -0,0 +1,39 @@ + +.img-container +{ + background-image: url('../api/stream.jpg'); + background-size: contain; + width: 100vw; + height: 100vh; + background-repeat: no-repeat; + background-position: center center; + ; +} +.drop2 +{ + width: 25%; +} +.timelapse-state +{ + + position: absolute; + right: 5%; + top: 10px; +} +.timelapse-state .rec +{ + color: greenyellow; +} +.timelapse-state .real-time +{ + color: lightblue; +} +.form0 +{ + height: 100vh; +} +.bott +{ + + bottom: 0px; +} \ No newline at end of file diff --git a/Timelapse/ServerFiles/favicon.ico b/Timelapse/ServerFiles/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..aaece233eb5fcf15fff8e0b0092fc1ffd38406a2 GIT binary patch literal 4286 zcmcgwYiv|i5I%RiL63=v2~f0>9sjFBQg>Ko_+iAANnwiE$HkWyCLQlLxG zLTR*ug(?aaQb8m@#P}e_7zzHdLJ?5`ACcm=v=FxJetvWAJ-xTP-Q6mQ+f3&?X1;G` z&YZiqRm$Seh!IMDtDUzfHApEnhQcNFAVt>ohkMDNIFu3r0P3*sMPik)RHuXrv>psuSZ}8 z+;i7A^|&{27@G+Est`A+Ao^4HR}0Wj=GGhx^gWD$RtN*MWOKX>H~W@xe}0#(?Gw}( zN=2Ob47Sld#T(*DG zd~G>ux7Q#z>2)knf1rYPrH+sIj#G=7dusmVvvT?GV$I8m@ro~oVs#Z$Zmq&c2lpTx z4rA!;!!Ty_7z`ac3{xiu@b&S}ke^+GLgrk?7*?rH?JF4R_|xTY_{;rZeVdS<7eu7B z1$}SmM@-dC_BHND_JG ze)RG8(c`@z?!(UA?_iRuMOf$GJAS+V-hTAf-{xPV^Zy=mXBMKRfKe^s+FG?&HzvE2*oBEeB{}wSawYRh$G++q6 zIrbGwiq>I`3PibF>mQBtu2t1FAKvTP}K zAE-yTvI_c=jPaGi98q|GM|ToP*1Mx3vfx$SdbBQrQQ*+ZXW2kPvdmmLm7g zGE5s?jz{lUhUcu$QOUfeSLM7!i|;+w^Ta%v;{JQj-JF9w^EtLoW0ZQ9clr!_uNiYG z(t|-hkLIxs`RX)gQ$)|9O@aD_HYc^6ZQHDUN2zCs^`ni++`8v$IK6R@-;(vS7&-iY z%$hbId6R>fIc2_1ZjMj+MqD||Lj>|am z$*0(|Wh3hAYf$(0Cha4>mYP5uVrfiopBYZCHv6Ve<@;Kgquhvb@GkWUD z0QZY1?^52PY@vuRF*J9k+$9e0`zgotlfD(P`{y_cg3IwiLoIWx#`bNSQCGJayLMJ% z{C&mrkMViz`iP%>mwLnPt%Dg$Jvu4!E*o{QzT{Z`Hrq-udDd`z&e@lDPvaxn)YM>J zkLI&cYQpSA>IJQHI`oXhu)#Ff16-U~Z!`F@i8 + + + + + + + Timelapse Now WebServer + + + + + + +
+ + + + + + +
+ +
+ + +
+
Stopped
+
Interval

+
+ + + + + + + \ No newline at end of file diff --git a/Timelapse/ServerFiles/js/jquery.min.js b/Timelapse/ServerFiles/js/jquery.min.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/Timelapse/ServerFiles/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0/, + singlet = /^\w+$/; + + function find(selector, context) { + context = context || doc; + var elems = classMatch.test(selector) ? context.getElementsByClassName(selector.slice(1)) : singlet.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector); + return elems; + } + + var frag; + function parseHTML(str) { + if (!frag) { + frag = doc.implementation.createHTMLDocument(null); + var base = frag.createElement("base"); + base.href = doc.location.href; + frag.head.appendChild(base); + } + + frag.body.innerHTML = str; + + return frag.body.childNodes; + } + + function onReady(fn) { + if (doc.readyState !== "loading") { + fn(); + } else { + doc.addEventListener("DOMContentLoaded", fn); + } + } + + function Init(selector, context) { + if (!selector) { + return this; + } + + // If already a cash collection, don't do any further processing + if (selector.cash && selector !== win) { + return selector; + } + + var elems = selector, + i = 0, + length; + + if (isString(selector)) { + elems = idMatch.test(selector) ? + // If an ID use the faster getElementById check + doc.getElementById(selector.slice(1)) : htmlMatch.test(selector) ? + // If HTML, parse it into real elements + parseHTML(selector) : + // else use `find` + find(selector, context); + + // If function, use as shortcut for DOM ready + } else if (isFunction(selector)) { + onReady(selector);return this; + } + + if (!elems) { + return this; + } + + // If a single DOM element is passed in or received via ID, return the single element + if (elems.nodeType || elems === win) { + this[0] = elems; + this.length = 1; + } else { + // Treat like an array and loop through each item. + length = this.length = elems.length; + for (; i < length; i++) { + this[i] = elems[i]; + } + } + + return this; + } + + function cash(selector, context) { + return new Init(selector, context); + } + + var fn = cash.fn = cash.prototype = Init.prototype = { // jshint ignore:line + cash: true, + length: 0, + push: push, + splice: ArrayProto.splice, + map: ArrayProto.map, + init: Init + }; + + Object.defineProperty(fn, "constructor", { value: cash }); + + cash.parseHTML = parseHTML; + cash.noop = noop; + cash.isFunction = isFunction; + cash.isString = isString; + + cash.extend = fn.extend = function (target) { + target = target || {}; + + var args = slice.call(arguments), + length = args.length, + i = 1; + + if (args.length === 1) { + target = this; + i = 0; + } + + for (; i < length; i++) { + if (!args[i]) { + continue; + } + for (var key in args[i]) { + if (args[i].hasOwnProperty(key)) { + target[key] = args[i][key]; + } + } + } + + return target; + }; + + function each(collection, callback) { + var l = collection.length, + i = 0; + + for (; i < l; i++) { + if (callback.call(collection[i], collection[i], i, collection) === false) { + break; + } + } + } + + function matches(el, selector) { + var m = el && (el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector || el.oMatchesSelector); + return !!m && m.call(el, selector); + } + + function getCompareFunction(selector) { + return ( + /* Use browser's `matches` function if string */ + isString(selector) ? matches : + /* Match a cash element */ + selector.cash ? function (el) { + return selector.is(el); + } : + /* Direct comparison */ + function (el, selector) { + return el === selector; + } + ); + } + + function unique(collection) { + return cash(slice.call(collection).filter(function (item, index, self) { + return self.indexOf(item) === index; + })); + } + + cash.extend({ + merge: function (first, second) { + var len = +second.length, + i = first.length, + j = 0; + + for (; j < len; i++, j++) { + first[i] = second[j]; + } + + first.length = i; + return first; + }, + + each: each, + matches: matches, + unique: unique, + isArray: Array.isArray, + isNumeric: function (n) { + return !isNaN(parseFloat(n)) && isFinite(n); + } + + }); + + var uid = cash.uid = "_cash" + Date.now(); + + function getDataCache(node) { + return node[uid] = node[uid] || {}; + } + + function setData(node, key, value) { + return getDataCache(node)[key] = value; + } + + function getData(node, key) { + var c = getDataCache(node); + if (c[key] === undefined) { + c[key] = node.dataset ? node.dataset[key] : cash(node).attr("data-" + key); + } + return c[key]; + } + + function removeData(node, key) { + var c = getDataCache(node); + if (c) { + delete c[key]; + } else if (node.dataset) { + delete node.dataset[key]; + } else { + cash(node).removeAttr("data-" + name); + } + } + + fn.extend({ + data: function (name, value) { + if (isString(name)) { + return value === undefined ? getData(this[0], name) : this.each(function (v) { + return setData(v, name, value); + }); + } + + for (var key in name) { + this.data(key, name[key]); + } + + return this; + }, + + removeData: function (key) { + return this.each(function (v) { + return removeData(v, key); + }); + } + + }); + + var notWhiteMatch = /\S+/g; + + function getClasses(c) { + return isString(c) && c.match(notWhiteMatch); + } + + function hasClass(v, c) { + return v.classList ? v.classList.contains(c) : new RegExp("(^| )" + c + "( |$)", "gi").test(v.className); + } + + function addClass(v, c, spacedName) { + if (v.classList) { + v.classList.add(c); + } else if (spacedName.indexOf(" " + c + " ")) { + v.className += " " + c; + } + } + + function removeClass(v, c) { + if (v.classList) { + v.classList.remove(c); + } else { + v.className = v.className.replace(c, ""); + } + } + + fn.extend({ + addClass: function (c) { + var classes = getClasses(c); + + return classes ? this.each(function (v) { + var spacedName = " " + v.className + " "; + each(classes, function (c) { + addClass(v, c, spacedName); + }); + }) : this; + }, + + attr: function (name, value) { + if (!name) { + return undefined; + } + + if (isString(name)) { + if (value === undefined) { + return this[0] ? this[0].getAttribute ? this[0].getAttribute(name) : this[0][name] : undefined; + } + + return this.each(function (v) { + if (v.setAttribute) { + v.setAttribute(name, value); + } else { + v[name] = value; + } + }); + } + + for (var key in name) { + this.attr(key, name[key]); + } + + return this; + }, + + hasClass: function (c) { + var check = false, + classes = getClasses(c); + if (classes && classes.length) { + this.each(function (v) { + check = hasClass(v, classes[0]); + return !check; + }); + } + return check; + }, + + prop: function (name, value) { + if (isString(name)) { + return value === undefined ? this[0][name] : this.each(function (v) { + v[name] = value; + }); + } + + for (var key in name) { + this.prop(key, name[key]); + } + + return this; + }, + + removeAttr: function (name) { + return this.each(function (v) { + if (v.removeAttribute) { + v.removeAttribute(name); + } else { + delete v[name]; + } + }); + }, + + removeClass: function (c) { + if (!arguments.length) { + return this.attr("class", ""); + } + var classes = getClasses(c); + return classes ? this.each(function (v) { + each(classes, function (c) { + removeClass(v, c); + }); + }) : this; + }, + + removeProp: function (name) { + return this.each(function (v) { + delete v[name]; + }); + }, + + toggleClass: function (c, state) { + if (state !== undefined) { + return this[state ? "addClass" : "removeClass"](c); + } + var classes = getClasses(c); + return classes ? this.each(function (v) { + var spacedName = " " + v.className + " "; + each(classes, function (c) { + if (hasClass(v, c)) { + removeClass(v, c); + } else { + addClass(v, c, spacedName); + } + }); + }) : this; + } }); + + fn.extend({ + add: function (selector, context) { + return unique(cash.merge(this, cash(selector, context))); + }, + + each: function (callback) { + each(this, callback); + return this; + }, + + eq: function (index) { + return cash(this.get(index)); + }, + + filter: function (selector) { + if (!selector) { + return this; + } + + var comparator = isFunction(selector) ? selector : getCompareFunction(selector); + + return cash(filter.call(this, function (e) { + return comparator(e, selector); + })); + }, + + first: function () { + return this.eq(0); + }, + + get: function (index) { + if (index === undefined) { + return slice.call(this); + } + return index < 0 ? this[index + this.length] : this[index]; + }, + + index: function (elem) { + var child = elem ? cash(elem)[0] : this[0], + collection = elem ? this : cash(child).parent().children(); + return slice.call(collection).indexOf(child); + }, + + last: function () { + return this.eq(-1); + } + + }); + + var camelCase = function () { + var camelRegex = /(?:^\w|[A-Z]|\b\w)/g, + whiteSpace = /[\s-_]+/g; + return function (str) { + return str.replace(camelRegex, function (letter, index) { + return letter[index === 0 ? "toLowerCase" : "toUpperCase"](); + }).replace(whiteSpace, ""); + }; + }(); + + var getPrefixedProp = function () { + var cache = {}, + doc = document, + div = doc.createElement("div"), + style = div.style; + + return function (prop) { + prop = camelCase(prop); + if (cache[prop]) { + return cache[prop]; + } + + var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), + prefixes = ["webkit", "moz", "ms", "o"], + props = (prop + " " + prefixes.join(ucProp + " ") + ucProp).split(" "); + + each(props, function (p) { + if (p in style) { + cache[p] = prop = cache[prop] = p; + return false; + } + }); + + return cache[prop]; + }; + }(); + + cash.prefixedProp = getPrefixedProp; + cash.camelCase = camelCase; + + fn.extend({ + css: function (prop, value) { + if (isString(prop)) { + prop = getPrefixedProp(prop); + return arguments.length > 1 ? this.each(function (v) { + return v.style[prop] = value; + }) : win.getComputedStyle(this[0])[prop]; + } + + for (var key in prop) { + this.css(key, prop[key]); + } + + return this; + } + + }); + + function compute(el, prop) { + return parseInt(win.getComputedStyle(el[0], null)[prop], 10) || 0; + } + + each(["Width", "Height"], function (v) { + var lower = v.toLowerCase(); + + fn[lower] = function () { + return this[0].getBoundingClientRect()[lower]; + }; + + fn["inner" + v] = function () { + return this[0]["client" + v]; + }; + + fn["outer" + v] = function (margins) { + return this[0]["offset" + v] + (margins ? compute(this, "margin" + (v === "Width" ? "Left" : "Top")) + compute(this, "margin" + (v === "Width" ? "Right" : "Bottom")) : 0); + }; + }); + + function registerEvent(node, eventName, callback) { + var eventCache = getData(node, "_cashEvents") || setData(node, "_cashEvents", {}); + eventCache[eventName] = eventCache[eventName] || []; + eventCache[eventName].push(callback); + node.addEventListener(eventName, callback); + } + + function removeEvent(node, eventName, callback) { + var events = getData(node, "_cashEvents"), + eventCache = events && events[eventName], + index; + + if (!eventCache) { + return; + } + + if (callback) { + node.removeEventListener(eventName, callback); + index = eventCache.indexOf(callback); + if (index >= 0) { + eventCache.splice(index, 1); + } + } else { + each(eventCache, function (event) { + node.removeEventListener(eventName, event); + }); + eventCache = []; + } + } + + fn.extend({ + off: function (eventName, callback) { + return this.each(function (v) { + return removeEvent(v, eventName, callback); + }); + }, + + on: function (eventName, delegate, callback, runOnce) { + // jshint ignore:line + var originalCallback; + if (!isString(eventName)) { + for (var key in eventName) { + this.on(key, delegate, eventName[key]); + } + return this; + } + + if (isFunction(delegate)) { + callback = delegate; + delegate = null; + } + + if (eventName === "ready") { + onReady(callback); + return this; + } + + if (delegate) { + originalCallback = callback; + callback = function (e) { + var t = e.target; + while (!matches(t, delegate)) { + if (t === this || t === null) { + return t = false; + } + + t = t.parentNode; + } + + if (t) { + originalCallback.call(t, e); + } + }; + } + + return this.each(function (v) { + var finalCallback = callback; + if (runOnce) { + finalCallback = function () { + callback.apply(this, arguments); + removeEvent(v, eventName, finalCallback); + }; + } + registerEvent(v, eventName, finalCallback); + }); + }, + + one: function (eventName, delegate, callback) { + return this.on(eventName, delegate, callback, true); + }, + + ready: onReady, + + /** + * Modified + * Triggers browser event + * @param String eventName + * @param Object data - Add properties to event object + */ + trigger: function (eventName, data) { + if (document.createEvent) { + var evt = document.createEvent('HTMLEvents'); + evt.initEvent(eventName, true, false); + evt = this.extend(evt, data); + return this.each(function (v) { + return v.dispatchEvent(evt); + }); + } + } + + }); + + function encode(name, value) { + return "&" + encodeURIComponent(name) + "=" + encodeURIComponent(value).replace(/%20/g, "+"); + } + + function getSelectMultiple_(el) { + var values = []; + each(el.options, function (o) { + if (o.selected) { + values.push(o.value); + } + }); + return values.length ? values : null; + } + + function getSelectSingle_(el) { + var selectedIndex = el.selectedIndex; + return selectedIndex >= 0 ? el.options[selectedIndex].value : null; + } + + function getValue(el) { + var type = el.type; + if (!type) { + return null; + } + switch (type.toLowerCase()) { + case "select-one": + return getSelectSingle_(el); + case "select-multiple": + return getSelectMultiple_(el); + case "radio": + return el.checked ? el.value : null; + case "checkbox": + return el.checked ? el.value : null; + default: + return el.value ? el.value : null; + } + } + + fn.extend({ + serialize: function () { + var query = ""; + + each(this[0].elements || this, function (el) { + if (el.disabled || el.tagName === "FIELDSET") { + return; + } + var name = el.name; + switch (el.type.toLowerCase()) { + case "file": + case "reset": + case "submit": + case "button": + break; + case "select-multiple": + var values = getValue(el); + if (values !== null) { + each(values, function (value) { + query += encode(name, value); + }); + } + break; + default: + var value = getValue(el); + if (value !== null) { + query += encode(name, value); + } + } + }); + + return query.substr(1); + }, + + val: function (value) { + if (value === undefined) { + return getValue(this[0]); + } + + return this.each(function (v) { + return v.value = value; + }); + } + + }); + + function insertElement(el, child, prepend) { + if (prepend) { + var first = el.childNodes[0]; + el.insertBefore(child, first); + } else { + el.appendChild(child); + } + } + + function insertContent(parent, child, prepend) { + var str = isString(child); + + if (!str && child.length) { + each(child, function (v) { + return insertContent(parent, v, prepend); + }); + return; + } + + each(parent, str ? function (v) { + return v.insertAdjacentHTML(prepend ? "afterbegin" : "beforeend", child); + } : function (v, i) { + return insertElement(v, i === 0 ? child : child.cloneNode(true), prepend); + }); + } + + fn.extend({ + after: function (selector) { + cash(selector).insertAfter(this); + return this; + }, + + append: function (content) { + insertContent(this, content); + return this; + }, + + appendTo: function (parent) { + insertContent(cash(parent), this); + return this; + }, + + before: function (selector) { + cash(selector).insertBefore(this); + return this; + }, + + clone: function () { + return cash(this.map(function (v) { + return v.cloneNode(true); + })); + }, + + empty: function () { + this.html(""); + return this; + }, + + html: function (content) { + if (content === undefined) { + return this[0].innerHTML; + } + var source = content.nodeType ? content[0].outerHTML : content; + return this.each(function (v) { + return v.innerHTML = source; + }); + }, + + insertAfter: function (selector) { + var _this = this; + + cash(selector).each(function (el, i) { + var parent = el.parentNode, + sibling = el.nextSibling; + _this.each(function (v) { + parent.insertBefore(i === 0 ? v : v.cloneNode(true), sibling); + }); + }); + + return this; + }, + + insertBefore: function (selector) { + var _this2 = this; + cash(selector).each(function (el, i) { + var parent = el.parentNode; + _this2.each(function (v) { + parent.insertBefore(i === 0 ? v : v.cloneNode(true), el); + }); + }); + return this; + }, + + prepend: function (content) { + insertContent(this, content, true); + return this; + }, + + prependTo: function (parent) { + insertContent(cash(parent), this, true); + return this; + }, + + remove: function () { + return this.each(function (v) { + if (!!v.parentNode) { + return v.parentNode.removeChild(v); + } + }); + }, + + text: function (content) { + if (content === undefined) { + return this[0].textContent; + } + return this.each(function (v) { + return v.textContent = content; + }); + } + + }); + + var docEl = doc.documentElement; + + fn.extend({ + position: function () { + var el = this[0]; + return { + left: el.offsetLeft, + top: el.offsetTop + }; + }, + + offset: function () { + var rect = this[0].getBoundingClientRect(); + return { + top: rect.top + win.pageYOffset - docEl.clientTop, + left: rect.left + win.pageXOffset - docEl.clientLeft + }; + }, + + offsetParent: function () { + return cash(this[0].offsetParent); + } + + }); + + fn.extend({ + children: function (selector) { + var elems = []; + this.each(function (el) { + push.apply(elems, el.children); + }); + elems = unique(elems); + + return !selector ? elems : elems.filter(function (v) { + return matches(v, selector); + }); + }, + + closest: function (selector) { + if (!selector || this.length < 1) { + return cash(); + } + if (this.is(selector)) { + return this.filter(selector); + } + return this.parent().closest(selector); + }, + + is: function (selector) { + if (!selector) { + return false; + } + + var match = false, + comparator = getCompareFunction(selector); + + this.each(function (el) { + match = comparator(el, selector); + return !match; + }); + + return match; + }, + + find: function (selector) { + if (!selector || selector.nodeType) { + return cash(selector && this.has(selector).length ? selector : null); + } + + var elems = []; + this.each(function (el) { + push.apply(elems, find(selector, el)); + }); + + return unique(elems); + }, + + has: function (selector) { + var comparator = isString(selector) ? function (el) { + return find(selector, el).length !== 0; + } : function (el) { + return el.contains(selector); + }; + + return this.filter(comparator); + }, + + next: function () { + return cash(this[0].nextElementSibling); + }, + + not: function (selector) { + if (!selector) { + return this; + } + + var comparator = getCompareFunction(selector); + + return this.filter(function (el) { + return !comparator(el, selector); + }); + }, + + parent: function () { + var result = []; + + this.each(function (item) { + if (item && item.parentNode) { + result.push(item.parentNode); + } + }); + + return unique(result); + }, + + parents: function (selector) { + var last, + result = []; + + this.each(function (item) { + last = item; + + while (last && last.parentNode && last !== doc.body.parentNode) { + last = last.parentNode; + + if (!selector || selector && matches(last, selector)) { + result.push(last); + } + } + }); + + return unique(result); + }, + + prev: function () { + return cash(this[0].previousElementSibling); + }, + + siblings: function (selector) { + var collection = this.parent().children(selector), + el = this[0]; + + return collection.filter(function (i) { + return i !== el; + }); + } + + }); + + return cash; +}); +; +var Component = function () { + /** + * Generic constructor for all components + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Component(classDef, el, options) { + _classCallCheck(this, Component); + + // Display error if el is valid HTML Element + if (!(el instanceof Element)) { + console.error(Error(el + ' is not an HTML Element')); + } + + // If exists, destroy and reinitialize in child + var ins = classDef.getInstance(el); + if (!!ins) { + ins.destroy(); + } + + this.el = el; + this.$el = cash(el); + } + + /** + * Initializes components + * @param {class} classDef + * @param {Element | NodeList | jQuery} els + * @param {Object} options + */ + + + _createClass(Component, null, [{ + key: "init", + value: function init(classDef, els, options) { + var instances = null; + if (els instanceof Element) { + instances = new classDef(els, options); + } else if (!!els && (els.jquery || els.cash || els instanceof NodeList)) { + var instancesArr = []; + for (var i = 0; i < els.length; i++) { + instancesArr.push(new classDef(els[i], options)); + } + instances = instancesArr; + } + + return instances; + } + }]); + + return Component; +}(); + +; // Required for Meteor package, the use of window prevents export by Meteor +(function (window) { + if (window.Package) { + M = {}; + } else { + window.M = {}; + } + + // Check for jQuery + M.jQueryLoaded = !!window.jQuery; +})(window); + +// AMD +if (typeof define === 'function' && define.amd) { + define('M', [], function () { + return M; + }); + + // Common JS +} else if (typeof exports !== 'undefined' && !exports.nodeType) { + if (typeof module !== 'undefined' && !module.nodeType && module.exports) { + exports = module.exports = M; + } + exports.default = M; +} + +M.version = '1.0.0'; + +M.keys = { + TAB: 9, + ENTER: 13, + ESC: 27, + ARROW_UP: 38, + ARROW_DOWN: 40 +}; + +/** + * TabPress Keydown handler + */ +M.tabPressed = false; +M.keyDown = false; +var docHandleKeydown = function (e) { + M.keyDown = true; + if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) { + M.tabPressed = true; + } +}; +var docHandleKeyup = function (e) { + M.keyDown = false; + if (e.which === M.keys.TAB || e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) { + M.tabPressed = false; + } +}; +var docHandleFocus = function (e) { + if (M.keyDown) { + document.body.classList.add('keyboard-focused'); + } +}; +var docHandleBlur = function (e) { + document.body.classList.remove('keyboard-focused'); +}; +document.addEventListener('keydown', docHandleKeydown, true); +document.addEventListener('keyup', docHandleKeyup, true); +document.addEventListener('focus', docHandleFocus, true); +document.addEventListener('blur', docHandleBlur, true); + +/** + * Initialize jQuery wrapper for plugin + * @param {Class} plugin javascript class + * @param {string} pluginName jQuery plugin name + * @param {string} classRef Class reference name + */ +M.initializeJqueryWrapper = function (plugin, pluginName, classRef) { + jQuery.fn[pluginName] = function (methodOrOptions) { + // Call plugin method if valid method name is passed in + if (plugin.prototype[methodOrOptions]) { + var params = Array.prototype.slice.call(arguments, 1); + + // Getter methods + if (methodOrOptions.slice(0, 3) === 'get') { + var instance = this.first()[0][classRef]; + return instance[methodOrOptions].apply(instance, params); + } + + // Void methods + return this.each(function () { + var instance = this[classRef]; + instance[methodOrOptions].apply(instance, params); + }); + + // Initialize plugin if options or no argument is passed in + } else if (typeof methodOrOptions === 'object' || !methodOrOptions) { + plugin.init(this, arguments[0]); + return this; + } + + // Return error if an unrecognized method name is passed in + jQuery.error("Method " + methodOrOptions + " does not exist on jQuery." + pluginName); + }; +}; + +/** + * Automatically initialize components + * @param {Element} context DOM Element to search within for components + */ +M.AutoInit = function (context) { + // Use document.body if no context is given + var root = !!context ? context : document.body; + + var registry = { + Autocomplete: root.querySelectorAll('.autocomplete:not(.no-autoinit)'), + Carousel: root.querySelectorAll('.carousel:not(.no-autoinit)'), + Chips: root.querySelectorAll('.chips:not(.no-autoinit)'), + Collapsible: root.querySelectorAll('.collapsible:not(.no-autoinit)'), + Datepicker: root.querySelectorAll('.datepicker:not(.no-autoinit)'), + Dropdown: root.querySelectorAll('.dropdown-trigger:not(.no-autoinit)'), + Materialbox: root.querySelectorAll('.materialboxed:not(.no-autoinit)'), + Modal: root.querySelectorAll('.modal:not(.no-autoinit)'), + Parallax: root.querySelectorAll('.parallax:not(.no-autoinit)'), + Pushpin: root.querySelectorAll('.pushpin:not(.no-autoinit)'), + ScrollSpy: root.querySelectorAll('.scrollspy:not(.no-autoinit)'), + FormSelect: root.querySelectorAll('select:not(.no-autoinit)'), + Sidenav: root.querySelectorAll('.sidenav:not(.no-autoinit)'), + Tabs: root.querySelectorAll('.tabs:not(.no-autoinit)'), + TapTarget: root.querySelectorAll('.tap-target:not(.no-autoinit)'), + Timepicker: root.querySelectorAll('.timepicker:not(.no-autoinit)'), + Tooltip: root.querySelectorAll('.tooltipped:not(.no-autoinit)'), + FloatingActionButton: root.querySelectorAll('.fixed-action-btn:not(.no-autoinit)') + }; + + for (var pluginName in registry) { + var plugin = M[pluginName]; + plugin.init(registry[pluginName]); + } +}; + +/** + * Generate approximated selector string for a jQuery object + * @param {jQuery} obj jQuery object to be parsed + * @returns {string} + */ +M.objectSelectorString = function (obj) { + var tagStr = obj.prop('tagName') || ''; + var idStr = obj.attr('id') || ''; + var classStr = obj.attr('class') || ''; + return (tagStr + idStr + classStr).replace(/\s/g, ''); +}; + +// Unique Random ID +M.guid = function () { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + } + return function () { + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + }; +}(); + +/** + * Escapes hash from special characters + * @param {string} hash String returned from this.hash + * @returns {string} + */ +M.escapeHash = function (hash) { + return hash.replace(/(:|\.|\[|\]|,|=|\/)/g, '\\$1'); +}; + +M.elementOrParentIsFixed = function (element) { + var $element = $(element); + var $checkElements = $element.add($element.parents()); + var isFixed = false; + $checkElements.each(function () { + if ($(this).css('position') === 'fixed') { + isFixed = true; + return false; + } + }); + return isFixed; +}; + +/** + * @typedef {Object} Edges + * @property {Boolean} top If the top edge was exceeded + * @property {Boolean} right If the right edge was exceeded + * @property {Boolean} bottom If the bottom edge was exceeded + * @property {Boolean} left If the left edge was exceeded + */ + +/** + * @typedef {Object} Bounding + * @property {Number} left left offset coordinate + * @property {Number} top top offset coordinate + * @property {Number} width + * @property {Number} height + */ + +/** + * Escapes hash from special characters + * @param {Element} container Container element that acts as the boundary + * @param {Bounding} bounding element bounding that is being checked + * @param {Number} offset offset from edge that counts as exceeding + * @returns {Edges} + */ +M.checkWithinContainer = function (container, bounding, offset) { + var edges = { + top: false, + right: false, + bottom: false, + left: false + }; + + var containerRect = container.getBoundingClientRect(); + // If body element is smaller than viewport, use viewport height instead. + var containerBottom = container === document.body ? Math.max(containerRect.bottom, window.innerHeight) : containerRect.bottom; + + var scrollLeft = container.scrollLeft; + var scrollTop = container.scrollTop; + + var scrolledX = bounding.left - scrollLeft; + var scrolledY = bounding.top - scrollTop; + + // Check for container and viewport for each edge + if (scrolledX < containerRect.left + offset || scrolledX < offset) { + edges.left = true; + } + + if (scrolledX + bounding.width > containerRect.right - offset || scrolledX + bounding.width > window.innerWidth - offset) { + edges.right = true; + } + + if (scrolledY < containerRect.top + offset || scrolledY < offset) { + edges.top = true; + } + + if (scrolledY + bounding.height > containerBottom - offset || scrolledY + bounding.height > window.innerHeight - offset) { + edges.bottom = true; + } + + return edges; +}; + +M.checkPossibleAlignments = function (el, container, bounding, offset) { + var canAlign = { + top: true, + right: true, + bottom: true, + left: true, + spaceOnTop: null, + spaceOnRight: null, + spaceOnBottom: null, + spaceOnLeft: null + }; + + var containerAllowsOverflow = getComputedStyle(container).overflow === 'visible'; + var containerRect = container.getBoundingClientRect(); + var containerHeight = Math.min(containerRect.height, window.innerHeight); + var containerWidth = Math.min(containerRect.width, window.innerWidth); + var elOffsetRect = el.getBoundingClientRect(); + + var scrollLeft = container.scrollLeft; + var scrollTop = container.scrollTop; + + var scrolledX = bounding.left - scrollLeft; + var scrolledYTopEdge = bounding.top - scrollTop; + var scrolledYBottomEdge = bounding.top + elOffsetRect.height - scrollTop; + + // Check for container and viewport for left + canAlign.spaceOnRight = !containerAllowsOverflow ? containerWidth - (scrolledX + bounding.width) : window.innerWidth - (elOffsetRect.left + bounding.width); + if (canAlign.spaceOnRight < 0) { + canAlign.left = false; + } + + // Check for container and viewport for Right + canAlign.spaceOnLeft = !containerAllowsOverflow ? scrolledX - bounding.width + elOffsetRect.width : elOffsetRect.right - bounding.width; + if (canAlign.spaceOnLeft < 0) { + canAlign.right = false; + } + + // Check for container and viewport for Top + canAlign.spaceOnBottom = !containerAllowsOverflow ? containerHeight - (scrolledYTopEdge + bounding.height + offset) : window.innerHeight - (elOffsetRect.top + bounding.height + offset); + if (canAlign.spaceOnBottom < 0) { + canAlign.top = false; + } + + // Check for container and viewport for Bottom + canAlign.spaceOnTop = !containerAllowsOverflow ? scrolledYBottomEdge - (bounding.height - offset) : elOffsetRect.bottom - (bounding.height + offset); + if (canAlign.spaceOnTop < 0) { + canAlign.bottom = false; + } + + return canAlign; +}; + +M.getOverflowParent = function (element) { + if (element == null) { + return null; + } + + if (element === document.body || getComputedStyle(element).overflow !== 'visible') { + return element; + } + + return M.getOverflowParent(element.parentElement); +}; + +/** + * Gets id of component from a trigger + * @param {Element} trigger trigger + * @returns {string} + */ +M.getIdFromTrigger = function (trigger) { + var id = trigger.getAttribute('data-target'); + if (!id) { + id = trigger.getAttribute('href'); + if (id) { + id = id.slice(1); + } else { + id = ''; + } + } + return id; +}; + +/** + * Multi browser support for document scroll top + * @returns {Number} + */ +M.getDocumentScrollTop = function () { + return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; +}; + +/** + * Multi browser support for document scroll left + * @returns {Number} + */ +M.getDocumentScrollLeft = function () { + return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; +}; + +/** + * @typedef {Object} Edges + * @property {Boolean} top If the top edge was exceeded + * @property {Boolean} right If the right edge was exceeded + * @property {Boolean} bottom If the bottom edge was exceeded + * @property {Boolean} left If the left edge was exceeded + */ + +/** + * @typedef {Object} Bounding + * @property {Number} left left offset coordinate + * @property {Number} top top offset coordinate + * @property {Number} width + * @property {Number} height + */ + +/** + * Get time in ms + * @license https://raw.github.com/jashkenas/underscore/master/LICENSE + * @type {function} + * @return {number} + */ +var getTime = Date.now || function () { + return new Date().getTime(); +}; + +/** + * Returns a function, that, when invoked, will only be triggered at most once + * during a given window of time. Normally, the throttled function will run + * as much as it can, without ever going more than once per `wait` duration; + * but if you'd like to disable the execution on the leading edge, pass + * `{leading: false}`. To disable execution on the trailing edge, ditto. + * @license https://raw.github.com/jashkenas/underscore/master/LICENSE + * @param {function} func + * @param {number} wait + * @param {Object=} options + * @returns {Function} + */ +M.throttle = function (func, wait, options) { + var context = void 0, + args = void 0, + result = void 0; + var timeout = null; + var previous = 0; + options || (options = {}); + var later = function () { + previous = options.leading === false ? 0 : getTime(); + timeout = null; + result = func.apply(context, args); + context = args = null; + }; + return function () { + var now = getTime(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; +}; +; /* + v2.2.0 + 2017 Julian Garnier + Released under the MIT license + */ +var $jscomp = { scope: {} };$jscomp.defineProperty = "function" == typeof Object.defineProperties ? Object.defineProperty : function (e, r, p) { + if (p.get || p.set) throw new TypeError("ES3 does not support getters and setters.");e != Array.prototype && e != Object.prototype && (e[r] = p.value); +};$jscomp.getGlobal = function (e) { + return "undefined" != typeof window && window === e ? e : "undefined" != typeof global && null != global ? global : e; +};$jscomp.global = $jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX = "jscomp_symbol_"; +$jscomp.initSymbol = function () { + $jscomp.initSymbol = function () {};$jscomp.global.Symbol || ($jscomp.global.Symbol = $jscomp.Symbol); +};$jscomp.symbolCounter_ = 0;$jscomp.Symbol = function (e) { + return $jscomp.SYMBOL_PREFIX + (e || "") + $jscomp.symbolCounter_++; +}; +$jscomp.initSymbolIterator = function () { + $jscomp.initSymbol();var e = $jscomp.global.Symbol.iterator;e || (e = $jscomp.global.Symbol.iterator = $jscomp.global.Symbol("iterator"));"function" != typeof Array.prototype[e] && $jscomp.defineProperty(Array.prototype, e, { configurable: !0, writable: !0, value: function () { + return $jscomp.arrayIterator(this); + } });$jscomp.initSymbolIterator = function () {}; +};$jscomp.arrayIterator = function (e) { + var r = 0;return $jscomp.iteratorPrototype(function () { + return r < e.length ? { done: !1, value: e[r++] } : { done: !0 }; + }); +}; +$jscomp.iteratorPrototype = function (e) { + $jscomp.initSymbolIterator();e = { next: e };e[$jscomp.global.Symbol.iterator] = function () { + return this; + };return e; +};$jscomp.array = $jscomp.array || {};$jscomp.iteratorFromArray = function (e, r) { + $jscomp.initSymbolIterator();e instanceof String && (e += "");var p = 0, + m = { next: function () { + if (p < e.length) { + var u = p++;return { value: r(u, e[u]), done: !1 }; + }m.next = function () { + return { done: !0, value: void 0 }; + };return m.next(); + } };m[Symbol.iterator] = function () { + return m; + };return m; +}; +$jscomp.polyfill = function (e, r, p, m) { + if (r) { + p = $jscomp.global;e = e.split(".");for (m = 0; m < e.length - 1; m++) { + var u = e[m];u in p || (p[u] = {});p = p[u]; + }e = e[e.length - 1];m = p[e];r = r(m);r != m && null != r && $jscomp.defineProperty(p, e, { configurable: !0, writable: !0, value: r }); + } +};$jscomp.polyfill("Array.prototype.keys", function (e) { + return e ? e : function () { + return $jscomp.iteratorFromArray(this, function (e) { + return e; + }); + }; +}, "es6-impl", "es3");var $jscomp$this = this; +(function (r) { + M.anime = r(); +})(function () { + function e(a) { + if (!h.col(a)) try { + return document.querySelectorAll(a); + } catch (c) {} + }function r(a, c) { + for (var d = a.length, b = 2 <= arguments.length ? arguments[1] : void 0, f = [], n = 0; n < d; n++) { + if (n in a) { + var k = a[n];c.call(b, k, n, a) && f.push(k); + } + }return f; + }function p(a) { + return a.reduce(function (a, d) { + return a.concat(h.arr(d) ? p(d) : d); + }, []); + }function m(a) { + if (h.arr(a)) return a; + h.str(a) && (a = e(a) || a);return a instanceof NodeList || a instanceof HTMLCollection ? [].slice.call(a) : [a]; + }function u(a, c) { + return a.some(function (a) { + return a === c; + }); + }function C(a) { + var c = {}, + d;for (d in a) { + c[d] = a[d]; + }return c; + }function D(a, c) { + var d = C(a), + b;for (b in a) { + d[b] = c.hasOwnProperty(b) ? c[b] : a[b]; + }return d; + }function z(a, c) { + var d = C(a), + b;for (b in c) { + d[b] = h.und(a[b]) ? c[b] : a[b]; + }return d; + }function T(a) { + a = a.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, function (a, c, d, k) { + return c + c + d + d + k + k; + });var c = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(a); + a = parseInt(c[1], 16);var d = parseInt(c[2], 16), + c = parseInt(c[3], 16);return "rgba(" + a + "," + d + "," + c + ",1)"; + }function U(a) { + function c(a, c, b) { + 0 > b && (b += 1);1 < b && --b;return b < 1 / 6 ? a + 6 * (c - a) * b : .5 > b ? c : b < 2 / 3 ? a + (c - a) * (2 / 3 - b) * 6 : a; + }var d = /hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(a) || /hsla\((\d+),\s*([\d.]+)%,\s*([\d.]+)%,\s*([\d.]+)\)/g.exec(a);a = parseInt(d[1]) / 360;var b = parseInt(d[2]) / 100, + f = parseInt(d[3]) / 100, + d = d[4] || 1;if (0 == b) f = b = a = f;else { + var n = .5 > f ? f * (1 + b) : f + b - f * b, + k = 2 * f - n, + f = c(k, n, a + 1 / 3), + b = c(k, n, a);a = c(k, n, a - 1 / 3); + }return "rgba(" + 255 * f + "," + 255 * b + "," + 255 * a + "," + d + ")"; + }function y(a) { + if (a = /([\+\-]?[0-9#\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a)) return a[2]; + }function V(a) { + if (-1 < a.indexOf("translate") || "perspective" === a) return "px";if (-1 < a.indexOf("rotate") || -1 < a.indexOf("skew")) return "deg"; + }function I(a, c) { + return h.fnc(a) ? a(c.target, c.id, c.total) : a; + }function E(a, c) { + if (c in a.style) return getComputedStyle(a).getPropertyValue(c.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()) || "0"; + }function J(a, c) { + if (h.dom(a) && u(W, c)) return "transform";if (h.dom(a) && (a.getAttribute(c) || h.svg(a) && a[c])) return "attribute";if (h.dom(a) && "transform" !== c && E(a, c)) return "css";if (null != a[c]) return "object"; + }function X(a, c) { + var d = V(c), + d = -1 < c.indexOf("scale") ? 1 : 0 + d;a = a.style.transform;if (!a) return d;for (var b = [], f = [], n = [], k = /(\w+)\((.+?)\)/g; b = k.exec(a);) { + f.push(b[1]), n.push(b[2]); + }a = r(n, function (a, b) { + return f[b] === c; + });return a.length ? a[0] : d; + }function K(a, c) { + switch (J(a, c)) {case "transform": + return X(a, c);case "css": + return E(a, c);case "attribute": + return a.getAttribute(c);}return a[c] || 0; + }function L(a, c) { + var d = /^(\*=|\+=|-=)/.exec(a);if (!d) return a;var b = y(a) || 0;c = parseFloat(c);a = parseFloat(a.replace(d[0], ""));switch (d[0][0]) {case "+": + return c + a + b;case "-": + return c - a + b;case "*": + return c * a + b;} + }function F(a, c) { + return Math.sqrt(Math.pow(c.x - a.x, 2) + Math.pow(c.y - a.y, 2)); + }function M(a) { + a = a.points;for (var c = 0, d, b = 0; b < a.numberOfItems; b++) { + var f = a.getItem(b);0 < b && (c += F(d, f));d = f; + }return c; + }function N(a) { + if (a.getTotalLength) return a.getTotalLength();switch (a.tagName.toLowerCase()) {case "circle": + return 2 * Math.PI * a.getAttribute("r");case "rect": + return 2 * a.getAttribute("width") + 2 * a.getAttribute("height");case "line": + return F({ x: a.getAttribute("x1"), y: a.getAttribute("y1") }, { x: a.getAttribute("x2"), y: a.getAttribute("y2") });case "polyline": + return M(a);case "polygon": + var c = a.points;return M(a) + F(c.getItem(c.numberOfItems - 1), c.getItem(0));} + }function Y(a, c) { + function d(b) { + b = void 0 === b ? 0 : b;return a.el.getPointAtLength(1 <= c + b ? c + b : 0); + }var b = d(), + f = d(-1), + n = d(1);switch (a.property) {case "x": + return b.x;case "y": + return b.y; + case "angle": + return 180 * Math.atan2(n.y - f.y, n.x - f.x) / Math.PI;} + }function O(a, c) { + var d = /-?\d*\.?\d+/g, + b;b = h.pth(a) ? a.totalLength : a;if (h.col(b)) { + if (h.rgb(b)) { + var f = /rgb\((\d+,\s*[\d]+,\s*[\d]+)\)/g.exec(b);b = f ? "rgba(" + f[1] + ",1)" : b; + } else b = h.hex(b) ? T(b) : h.hsl(b) ? U(b) : void 0; + } else f = (f = y(b)) ? b.substr(0, b.length - f.length) : b, b = c && !/\s/g.test(b) ? f + c : f;b += "";return { original: b, numbers: b.match(d) ? b.match(d).map(Number) : [0], strings: h.str(a) || c ? b.split(d) : [] }; + }function P(a) { + a = a ? p(h.arr(a) ? a.map(m) : m(a)) : [];return r(a, function (a, d, b) { + return b.indexOf(a) === d; + }); + }function Z(a) { + var c = P(a);return c.map(function (a, b) { + return { target: a, id: b, total: c.length }; + }); + }function aa(a, c) { + var d = C(c);if (h.arr(a)) { + var b = a.length;2 !== b || h.obj(a[0]) ? h.fnc(c.duration) || (d.duration = c.duration / b) : a = { value: a }; + }return m(a).map(function (a, b) { + b = b ? 0 : c.delay;a = h.obj(a) && !h.pth(a) ? a : { value: a };h.und(a.delay) && (a.delay = b);return a; + }).map(function (a) { + return z(a, d); + }); + }function ba(a, c) { + var d = {}, + b;for (b in a) { + var f = I(a[b], c);h.arr(f) && (f = f.map(function (a) { + return I(a, c); + }), 1 === f.length && (f = f[0]));d[b] = f; + }d.duration = parseFloat(d.duration);d.delay = parseFloat(d.delay);return d; + }function ca(a) { + return h.arr(a) ? A.apply(this, a) : Q[a]; + }function da(a, c) { + var d;return a.tweens.map(function (b) { + b = ba(b, c);var f = b.value, + e = K(c.target, a.name), + k = d ? d.to.original : e, + k = h.arr(f) ? f[0] : k, + w = L(h.arr(f) ? f[1] : f, k), + e = y(w) || y(k) || y(e);b.from = O(k, e);b.to = O(w, e);b.start = d ? d.end : a.offset;b.end = b.start + b.delay + b.duration;b.easing = ca(b.easing);b.elasticity = (1E3 - Math.min(Math.max(b.elasticity, 1), 999)) / 1E3;b.isPath = h.pth(f);b.isColor = h.col(b.from.original);b.isColor && (b.round = 1);return d = b; + }); + }function ea(a, c) { + return r(p(a.map(function (a) { + return c.map(function (b) { + var c = J(a.target, b.name);if (c) { + var d = da(b, a);b = { type: c, property: b.name, animatable: a, tweens: d, duration: d[d.length - 1].end, delay: d[0].delay }; + } else b = void 0;return b; + }); + })), function (a) { + return !h.und(a); + }); + }function R(a, c, d, b) { + var f = "delay" === a;return c.length ? (f ? Math.min : Math.max).apply(Math, c.map(function (b) { + return b[a]; + })) : f ? b.delay : d.offset + b.delay + b.duration; + }function fa(a) { + var c = D(ga, a), + d = D(S, a), + b = Z(a.targets), + f = [], + e = z(c, d), + k;for (k in a) { + e.hasOwnProperty(k) || "targets" === k || f.push({ name: k, offset: e.offset, tweens: aa(a[k], d) }); + }a = ea(b, f);return z(c, { children: [], animatables: b, animations: a, duration: R("duration", a, c, d), delay: R("delay", a, c, d) }); + }function q(a) { + function c() { + return window.Promise && new Promise(function (a) { + return p = a; + }); + }function d(a) { + return g.reversed ? g.duration - a : a; + }function b(a) { + for (var b = 0, c = {}, d = g.animations, f = d.length; b < f;) { + var e = d[b], + k = e.animatable, + h = e.tweens, + n = h.length - 1, + l = h[n];n && (l = r(h, function (b) { + return a < b.end; + })[0] || l);for (var h = Math.min(Math.max(a - l.start - l.delay, 0), l.duration) / l.duration, w = isNaN(h) ? 1 : l.easing(h, l.elasticity), h = l.to.strings, p = l.round, n = [], m = void 0, m = l.to.numbers.length, t = 0; t < m; t++) { + var x = void 0, + x = l.to.numbers[t], + q = l.from.numbers[t], + x = l.isPath ? Y(l.value, w * x) : q + w * (x - q);p && (l.isColor && 2 < t || (x = Math.round(x * p) / p));n.push(x); + }if (l = h.length) for (m = h[0], w = 0; w < l; w++) { + p = h[w + 1], t = n[w], isNaN(t) || (m = p ? m + (t + p) : m + (t + " ")); + } else m = n[0];ha[e.type](k.target, e.property, m, c, k.id);e.currentValue = m;b++; + }if (b = Object.keys(c).length) for (d = 0; d < b; d++) { + H || (H = E(document.body, "transform") ? "transform" : "-webkit-transform"), g.animatables[d].target.style[H] = c[d].join(" "); + }g.currentTime = a;g.progress = a / g.duration * 100; + }function f(a) { + if (g[a]) g[a](g); + }function e() { + g.remaining && !0 !== g.remaining && g.remaining--; + }function k(a) { + var k = g.duration, + n = g.offset, + w = n + g.delay, + r = g.currentTime, + x = g.reversed, + q = d(a);if (g.children.length) { + var u = g.children, + v = u.length; + if (q >= g.currentTime) for (var G = 0; G < v; G++) { + u[G].seek(q); + } else for (; v--;) { + u[v].seek(q); + } + }if (q >= w || !k) g.began || (g.began = !0, f("begin")), f("run");if (q > n && q < k) b(q);else if (q <= n && 0 !== r && (b(0), x && e()), q >= k && r !== k || !k) b(k), x || e();f("update");a >= k && (g.remaining ? (t = h, "alternate" === g.direction && (g.reversed = !g.reversed)) : (g.pause(), g.completed || (g.completed = !0, f("complete"), "Promise" in window && (p(), m = c()))), l = 0); + }a = void 0 === a ? {} : a;var h, + t, + l = 0, + p = null, + m = c(), + g = fa(a);g.reset = function () { + var a = g.direction, + c = g.loop;g.currentTime = 0;g.progress = 0;g.paused = !0;g.began = !1;g.completed = !1;g.reversed = "reverse" === a;g.remaining = "alternate" === a && 1 === c ? 2 : c;b(0);for (a = g.children.length; a--;) { + g.children[a].reset(); + } + };g.tick = function (a) { + h = a;t || (t = h);k((l + h - t) * q.speed); + };g.seek = function (a) { + k(d(a)); + };g.pause = function () { + var a = v.indexOf(g);-1 < a && v.splice(a, 1);g.paused = !0; + };g.play = function () { + g.paused && (g.paused = !1, t = 0, l = d(g.currentTime), v.push(g), B || ia()); + };g.reverse = function () { + g.reversed = !g.reversed;t = 0;l = d(g.currentTime); + };g.restart = function () { + g.pause(); + g.reset();g.play(); + };g.finished = m;g.reset();g.autoplay && g.play();return g; + }var ga = { update: void 0, begin: void 0, run: void 0, complete: void 0, loop: 1, direction: "normal", autoplay: !0, offset: 0 }, + S = { duration: 1E3, delay: 0, easing: "easeOutElastic", elasticity: 500, round: 0 }, + W = "translateX translateY translateZ rotate rotateX rotateY rotateZ scale scaleX scaleY scaleZ skewX skewY perspective".split(" "), + H, + h = { arr: function (a) { + return Array.isArray(a); + }, obj: function (a) { + return -1 < Object.prototype.toString.call(a).indexOf("Object"); + }, + pth: function (a) { + return h.obj(a) && a.hasOwnProperty("totalLength"); + }, svg: function (a) { + return a instanceof SVGElement; + }, dom: function (a) { + return a.nodeType || h.svg(a); + }, str: function (a) { + return "string" === typeof a; + }, fnc: function (a) { + return "function" === typeof a; + }, und: function (a) { + return "undefined" === typeof a; + }, hex: function (a) { + return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(a) + ); + }, rgb: function (a) { + return (/^rgb/.test(a) + ); + }, hsl: function (a) { + return (/^hsl/.test(a) + ); + }, col: function (a) { + return h.hex(a) || h.rgb(a) || h.hsl(a); + } }, + A = function () { + function a(a, d, b) { + return (((1 - 3 * b + 3 * d) * a + (3 * b - 6 * d)) * a + 3 * d) * a; + }return function (c, d, b, f) { + if (0 <= c && 1 >= c && 0 <= b && 1 >= b) { + var e = new Float32Array(11);if (c !== d || b !== f) for (var k = 0; 11 > k; ++k) { + e[k] = a(.1 * k, c, b); + }return function (k) { + if (c === d && b === f) return k;if (0 === k) return 0;if (1 === k) return 1;for (var h = 0, l = 1; 10 !== l && e[l] <= k; ++l) { + h += .1; + }--l;var l = h + (k - e[l]) / (e[l + 1] - e[l]) * .1, + n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (.001 <= n) { + for (h = 0; 4 > h; ++h) { + n = 3 * (1 - 3 * b + 3 * c) * l * l + 2 * (3 * b - 6 * c) * l + 3 * c;if (0 === n) break;var m = a(l, c, b) - k, + l = l - m / n; + }k = l; + } else if (0 === n) k = l;else { + var l = h, + h = h + .1, + g = 0;do { + m = l + (h - l) / 2, n = a(m, c, b) - k, 0 < n ? h = m : l = m; + } while (1e-7 < Math.abs(n) && 10 > ++g);k = m; + }return a(k, d, f); + }; + } + }; + }(), + Q = function () { + function a(a, b) { + return 0 === a || 1 === a ? a : -Math.pow(2, 10 * (a - 1)) * Math.sin(2 * (a - 1 - b / (2 * Math.PI) * Math.asin(1)) * Math.PI / b); + }var c = "Quad Cubic Quart Quint Sine Expo Circ Back Elastic".split(" "), + d = { In: [[.55, .085, .68, .53], [.55, .055, .675, .19], [.895, .03, .685, .22], [.755, .05, .855, .06], [.47, 0, .745, .715], [.95, .05, .795, .035], [.6, .04, .98, .335], [.6, -.28, .735, .045], a], Out: [[.25, .46, .45, .94], [.215, .61, .355, 1], [.165, .84, .44, 1], [.23, 1, .32, 1], [.39, .575, .565, 1], [.19, 1, .22, 1], [.075, .82, .165, 1], [.175, .885, .32, 1.275], function (b, c) { + return 1 - a(1 - b, c); + }], InOut: [[.455, .03, .515, .955], [.645, .045, .355, 1], [.77, 0, .175, 1], [.86, 0, .07, 1], [.445, .05, .55, .95], [1, 0, 0, 1], [.785, .135, .15, .86], [.68, -.55, .265, 1.55], function (b, c) { + return .5 > b ? a(2 * b, c) / 2 : 1 - a(-2 * b + 2, c) / 2; + }] }, + b = { linear: A(.25, .25, .75, .75) }, + f = {}, + e;for (e in d) { + f.type = e, d[f.type].forEach(function (a) { + return function (d, f) { + b["ease" + a.type + c[f]] = h.fnc(d) ? d : A.apply($jscomp$this, d); + }; + }(f)), f = { type: f.type }; + }return b; + }(), + ha = { css: function (a, c, d) { + return a.style[c] = d; + }, attribute: function (a, c, d) { + return a.setAttribute(c, d); + }, object: function (a, c, d) { + return a[c] = d; + }, transform: function (a, c, d, b, f) { + b[f] || (b[f] = []);b[f].push(c + "(" + d + ")"); + } }, + v = [], + B = 0, + ia = function () { + function a() { + B = requestAnimationFrame(c); + }function c(c) { + var b = v.length;if (b) { + for (var d = 0; d < b;) { + v[d] && v[d].tick(c), d++; + }a(); + } else cancelAnimationFrame(B), B = 0; + }return a; + }();q.version = "2.2.0";q.speed = 1;q.running = v;q.remove = function (a) { + a = P(a);for (var c = v.length; c--;) { + for (var d = v[c], b = d.animations, f = b.length; f--;) { + u(a, b[f].animatable.target) && (b.splice(f, 1), b.length || d.pause()); + } + } + };q.getValue = K;q.path = function (a, c) { + var d = h.str(a) ? e(a)[0] : a, + b = c || 100;return function (a) { + return { el: d, property: a, totalLength: N(d) * (b / 100) }; + }; + };q.setDashoffset = function (a) { + var c = N(a);a.setAttribute("stroke-dasharray", c);return c; + };q.bezier = A;q.easings = Q;q.timeline = function (a) { + var c = q(a);c.pause();c.duration = 0;c.add = function (d) { + c.children.forEach(function (a) { + a.began = !0;a.completed = !0; + });m(d).forEach(function (b) { + var d = z(b, D(S, a || {}));d.targets = d.targets || a.targets;b = c.duration;var e = d.offset;d.autoplay = !1;d.direction = c.direction;d.offset = h.und(e) ? b : L(e, b);c.began = !0;c.completed = !0;c.seek(d.offset);d = q(d);d.began = !0;d.completed = !0;d.duration > b && (c.duration = d.duration);c.children.push(d); + });c.seek(0);c.reset();c.autoplay && c.restart();return c; + };return c; + };q.random = function (a, c) { + return Math.floor(Math.random() * (c - a + 1)) + a; + };return q; +}); +;(function ($, anim) { + 'use strict'; + + var _defaults = { + accordion: true, + onOpenStart: undefined, + onOpenEnd: undefined, + onCloseStart: undefined, + onCloseEnd: undefined, + inDuration: 300, + outDuration: 300 + }; + + /** + * @class + * + */ + + var Collapsible = function (_Component) { + _inherits(Collapsible, _Component); + + /** + * Construct Collapsible instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Collapsible(el, options) { + _classCallCheck(this, Collapsible); + + var _this3 = _possibleConstructorReturn(this, (Collapsible.__proto__ || Object.getPrototypeOf(Collapsible)).call(this, Collapsible, el, options)); + + _this3.el.M_Collapsible = _this3; + + /** + * Options for the collapsible + * @member Collapsible#options + * @prop {Boolean} [accordion=false] - Type of the collapsible + * @prop {Function} onOpenStart - Callback function called before collapsible is opened + * @prop {Function} onOpenEnd - Callback function called after collapsible is opened + * @prop {Function} onCloseStart - Callback function called before collapsible is closed + * @prop {Function} onCloseEnd - Callback function called after collapsible is closed + * @prop {Number} inDuration - Transition in duration in milliseconds. + * @prop {Number} outDuration - Transition duration in milliseconds. + */ + _this3.options = $.extend({}, Collapsible.defaults, options); + + // Setup tab indices + _this3.$headers = _this3.$el.children('li').children('.collapsible-header'); + _this3.$headers.attr('tabindex', 0); + + _this3._setupEventHandlers(); + + // Open first active + var $activeBodies = _this3.$el.children('li.active').children('.collapsible-body'); + if (_this3.options.accordion) { + // Handle Accordion + $activeBodies.first().css('display', 'block'); + } else { + // Handle Expandables + $activeBodies.css('display', 'block'); + } + return _this3; + } + + _createClass(Collapsible, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.M_Collapsible = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + var _this4 = this; + + this._handleCollapsibleClickBound = this._handleCollapsibleClick.bind(this); + this._handleCollapsibleKeydownBound = this._handleCollapsibleKeydown.bind(this); + this.el.addEventListener('click', this._handleCollapsibleClickBound); + this.$headers.each(function (header) { + header.addEventListener('keydown', _this4._handleCollapsibleKeydownBound); + }); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + var _this5 = this; + + this.el.removeEventListener('click', this._handleCollapsibleClickBound); + this.$headers.each(function (header) { + header.removeEventListener('keydown', _this5._handleCollapsibleKeydownBound); + }); + } + + /** + * Handle Collapsible Click + * @param {Event} e + */ + + }, { + key: "_handleCollapsibleClick", + value: function _handleCollapsibleClick(e) { + var $header = $(e.target).closest('.collapsible-header'); + if (e.target && $header.length) { + var $collapsible = $header.closest('.collapsible'); + if ($collapsible[0] === this.el) { + var $collapsibleLi = $header.closest('li'); + var $collapsibleLis = $collapsible.children('li'); + var isActive = $collapsibleLi[0].classList.contains('active'); + var index = $collapsibleLis.index($collapsibleLi); + + if (isActive) { + this.close(index); + } else { + this.open(index); + } + } + } + } + + /** + * Handle Collapsible Keydown + * @param {Event} e + */ + + }, { + key: "_handleCollapsibleKeydown", + value: function _handleCollapsibleKeydown(e) { + if (e.keyCode === 13) { + this._handleCollapsibleClickBound(e); + } + } + + /** + * Animate in collapsible slide + * @param {Number} index - 0th index of slide + */ + + }, { + key: "_animateIn", + value: function _animateIn(index) { + var _this6 = this; + + var $collapsibleLi = this.$el.children('li').eq(index); + if ($collapsibleLi.length) { + var $body = $collapsibleLi.children('.collapsible-body'); + + anim.remove($body[0]); + $body.css({ + display: 'block', + overflow: 'hidden', + height: 0, + paddingTop: '', + paddingBottom: '' + }); + + var pTop = $body.css('padding-top'); + var pBottom = $body.css('padding-bottom'); + var finalHeight = $body[0].scrollHeight; + $body.css({ + paddingTop: 0, + paddingBottom: 0 + }); + + anim({ + targets: $body[0], + height: finalHeight, + paddingTop: pTop, + paddingBottom: pBottom, + duration: this.options.inDuration, + easing: 'easeInOutCubic', + complete: function (anim) { + $body.css({ + overflow: '', + paddingTop: '', + paddingBottom: '', + height: '' + }); + + // onOpenEnd callback + if (typeof _this6.options.onOpenEnd === 'function') { + _this6.options.onOpenEnd.call(_this6, $collapsibleLi[0]); + } + } + }); + } + } + + /** + * Animate out collapsible slide + * @param {Number} index - 0th index of slide to open + */ + + }, { + key: "_animateOut", + value: function _animateOut(index) { + var _this7 = this; + + var $collapsibleLi = this.$el.children('li').eq(index); + if ($collapsibleLi.length) { + var $body = $collapsibleLi.children('.collapsible-body'); + anim.remove($body[0]); + $body.css('overflow', 'hidden'); + anim({ + targets: $body[0], + height: 0, + paddingTop: 0, + paddingBottom: 0, + duration: this.options.outDuration, + easing: 'easeInOutCubic', + complete: function () { + $body.css({ + height: '', + overflow: '', + padding: '', + display: '' + }); + + // onCloseEnd callback + if (typeof _this7.options.onCloseEnd === 'function') { + _this7.options.onCloseEnd.call(_this7, $collapsibleLi[0]); + } + } + }); + } + } + + /** + * Open Collapsible + * @param {Number} index - 0th index of slide + */ + + }, { + key: "open", + value: function open(index) { + var _this8 = this; + + var $collapsibleLi = this.$el.children('li').eq(index); + if ($collapsibleLi.length && !$collapsibleLi[0].classList.contains('active')) { + // onOpenStart callback + if (typeof this.options.onOpenStart === 'function') { + this.options.onOpenStart.call(this, $collapsibleLi[0]); + } + + // Handle accordion behavior + if (this.options.accordion) { + var $collapsibleLis = this.$el.children('li'); + var $activeLis = this.$el.children('li.active'); + $activeLis.each(function (el) { + var index = $collapsibleLis.index($(el)); + _this8.close(index); + }); + } + + // Animate in + $collapsibleLi[0].classList.add('active'); + this._animateIn(index); + } + } + + /** + * Close Collapsible + * @param {Number} index - 0th index of slide + */ + + }, { + key: "close", + value: function close(index) { + var $collapsibleLi = this.$el.children('li').eq(index); + if ($collapsibleLi.length && $collapsibleLi[0].classList.contains('active')) { + // onCloseStart callback + if (typeof this.options.onCloseStart === 'function') { + this.options.onCloseStart.call(this, $collapsibleLi[0]); + } + + // Animate out + $collapsibleLi[0].classList.remove('active'); + this._animateOut(index); + } + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Collapsible.__proto__ || Object.getPrototypeOf(Collapsible), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Collapsible; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Collapsible; + }(Component); + + M.Collapsible = Collapsible; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Collapsible, 'collapsible', 'M_Collapsible'); + } +})(cash, M.anime); +;(function ($, anim) { + 'use strict'; + + var _defaults = { + alignment: 'left', + autoFocus: true, + constrainWidth: true, + container: null, + coverTrigger: true, + closeOnClick: true, + hover: false, + inDuration: 150, + outDuration: 250, + onOpenStart: null, + onOpenEnd: null, + onCloseStart: null, + onCloseEnd: null, + onItemClick: null + }; + + /** + * @class + */ + + var Dropdown = function (_Component2) { + _inherits(Dropdown, _Component2); + + function Dropdown(el, options) { + _classCallCheck(this, Dropdown); + + var _this9 = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this, Dropdown, el, options)); + + _this9.el.M_Dropdown = _this9; + Dropdown._dropdowns.push(_this9); + + _this9.id = M.getIdFromTrigger(el); + _this9.dropdownEl = document.getElementById(_this9.id); + _this9.$dropdownEl = $(_this9.dropdownEl); + + /** + * Options for the dropdown + * @member Dropdown#options + * @prop {String} [alignment='left'] - Edge which the dropdown is aligned to + * @prop {Boolean} [autoFocus=true] - Automatically focus dropdown el for keyboard + * @prop {Boolean} [constrainWidth=true] - Constrain width to width of the button + * @prop {Element} container - Container element to attach dropdown to (optional) + * @prop {Boolean} [coverTrigger=true] - Place dropdown over trigger + * @prop {Boolean} [closeOnClick=true] - Close on click of dropdown item + * @prop {Boolean} [hover=false] - Open dropdown on hover + * @prop {Number} [inDuration=150] - Duration of open animation in ms + * @prop {Number} [outDuration=250] - Duration of close animation in ms + * @prop {Function} onOpenStart - Function called when dropdown starts opening + * @prop {Function} onOpenEnd - Function called when dropdown finishes opening + * @prop {Function} onCloseStart - Function called when dropdown starts closing + * @prop {Function} onCloseEnd - Function called when dropdown finishes closing + */ + _this9.options = $.extend({}, Dropdown.defaults, options); + + /** + * Describes open/close state of dropdown + * @type {Boolean} + */ + _this9.isOpen = false; + + /** + * Describes if dropdown content is scrollable + * @type {Boolean} + */ + _this9.isScrollable = false; + + /** + * Describes if touch moving on dropdown content + * @type {Boolean} + */ + _this9.isTouchMoving = false; + + _this9.focusedIndex = -1; + _this9.filterQuery = []; + + // Move dropdown-content after dropdown-trigger + if (!!_this9.options.container) { + $(_this9.options.container).append(_this9.dropdownEl); + } else { + _this9.$el.after(_this9.dropdownEl); + } + + _this9._makeDropdownFocusable(); + _this9._resetFilterQueryBound = _this9._resetFilterQuery.bind(_this9); + _this9._handleDocumentClickBound = _this9._handleDocumentClick.bind(_this9); + _this9._handleDocumentTouchmoveBound = _this9._handleDocumentTouchmove.bind(_this9); + _this9._handleDropdownClickBound = _this9._handleDropdownClick.bind(_this9); + _this9._handleDropdownKeydownBound = _this9._handleDropdownKeydown.bind(_this9); + _this9._handleTriggerKeydownBound = _this9._handleTriggerKeydown.bind(_this9); + _this9._setupEventHandlers(); + return _this9; + } + + _createClass(Dropdown, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._resetDropdownStyles(); + this._removeEventHandlers(); + Dropdown._dropdowns.splice(Dropdown._dropdowns.indexOf(this), 1); + this.el.M_Dropdown = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + // Trigger keydown handler + this.el.addEventListener('keydown', this._handleTriggerKeydownBound); + + // Item click handler + this.dropdownEl.addEventListener('click', this._handleDropdownClickBound); + + // Hover event handlers + if (this.options.hover) { + this._handleMouseEnterBound = this._handleMouseEnter.bind(this); + this.el.addEventListener('mouseenter', this._handleMouseEnterBound); + this._handleMouseLeaveBound = this._handleMouseLeave.bind(this); + this.el.addEventListener('mouseleave', this._handleMouseLeaveBound); + this.dropdownEl.addEventListener('mouseleave', this._handleMouseLeaveBound); + + // Click event handlers + } else { + this._handleClickBound = this._handleClick.bind(this); + this.el.addEventListener('click', this._handleClickBound); + } + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('keydown', this._handleTriggerKeydownBound); + this.dropdownEl.removeEventListener('click', this._handleDropdownClickBound); + + if (this.options.hover) { + this.el.removeEventListener('mouseenter', this._handleMouseEnterBound); + this.el.removeEventListener('mouseleave', this._handleMouseLeaveBound); + this.dropdownEl.removeEventListener('mouseleave', this._handleMouseLeaveBound); + } else { + this.el.removeEventListener('click', this._handleClickBound); + } + } + }, { + key: "_setupTemporaryEventHandlers", + value: function _setupTemporaryEventHandlers() { + // Use capture phase event handler to prevent click + document.body.addEventListener('click', this._handleDocumentClickBound, true); + document.body.addEventListener('touchend', this._handleDocumentClickBound); + document.body.addEventListener('touchmove', this._handleDocumentTouchmoveBound); + this.dropdownEl.addEventListener('keydown', this._handleDropdownKeydownBound); + } + }, { + key: "_removeTemporaryEventHandlers", + value: function _removeTemporaryEventHandlers() { + // Use capture phase event handler to prevent click + document.body.removeEventListener('click', this._handleDocumentClickBound, true); + document.body.removeEventListener('touchend', this._handleDocumentClickBound); + document.body.removeEventListener('touchmove', this._handleDocumentTouchmoveBound); + this.dropdownEl.removeEventListener('keydown', this._handleDropdownKeydownBound); + } + }, { + key: "_handleClick", + value: function _handleClick(e) { + e.preventDefault(); + this.open(); + } + }, { + key: "_handleMouseEnter", + value: function _handleMouseEnter() { + this.open(); + } + }, { + key: "_handleMouseLeave", + value: function _handleMouseLeave(e) { + var toEl = e.toElement || e.relatedTarget; + var leaveToDropdownContent = !!$(toEl).closest('.dropdown-content').length; + var leaveToActiveDropdownTrigger = false; + + var $closestTrigger = $(toEl).closest('.dropdown-trigger'); + if ($closestTrigger.length && !!$closestTrigger[0].M_Dropdown && $closestTrigger[0].M_Dropdown.isOpen) { + leaveToActiveDropdownTrigger = true; + } + + // Close hover dropdown if mouse did not leave to either active dropdown-trigger or dropdown-content + if (!leaveToActiveDropdownTrigger && !leaveToDropdownContent) { + this.close(); + } + } + }, { + key: "_handleDocumentClick", + value: function _handleDocumentClick(e) { + var _this10 = this; + + var $target = $(e.target); + if (this.options.closeOnClick && $target.closest('.dropdown-content').length && !this.isTouchMoving) { + // isTouchMoving to check if scrolling on mobile. + setTimeout(function () { + _this10.close(); + }, 0); + } else if ($target.closest('.dropdown-trigger').length || !$target.closest('.dropdown-content').length) { + setTimeout(function () { + _this10.close(); + }, 0); + } + this.isTouchMoving = false; + } + }, { + key: "_handleTriggerKeydown", + value: function _handleTriggerKeydown(e) { + // ARROW DOWN OR ENTER WHEN SELECT IS CLOSED - open Dropdown + if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ENTER) && !this.isOpen) { + e.preventDefault(); + this.open(); + } + } + + /** + * Handle Document Touchmove + * @param {Event} e + */ + + }, { + key: "_handleDocumentTouchmove", + value: function _handleDocumentTouchmove(e) { + var $target = $(e.target); + if ($target.closest('.dropdown-content').length) { + this.isTouchMoving = true; + } + } + + /** + * Handle Dropdown Click + * @param {Event} e + */ + + }, { + key: "_handleDropdownClick", + value: function _handleDropdownClick(e) { + // onItemClick callback + if (typeof this.options.onItemClick === 'function') { + var itemEl = $(e.target).closest('li')[0]; + this.options.onItemClick.call(this, itemEl); + } + } + + /** + * Handle Dropdown Keydown + * @param {Event} e + */ + + }, { + key: "_handleDropdownKeydown", + value: function _handleDropdownKeydown(e) { + if (e.which === M.keys.TAB) { + e.preventDefault(); + this.close(); + + // Navigate down dropdown list + } else if ((e.which === M.keys.ARROW_DOWN || e.which === M.keys.ARROW_UP) && this.isOpen) { + e.preventDefault(); + var direction = e.which === M.keys.ARROW_DOWN ? 1 : -1; + var newFocusedIndex = this.focusedIndex; + var foundNewIndex = false; + do { + newFocusedIndex = newFocusedIndex + direction; + + if (!!this.dropdownEl.children[newFocusedIndex] && this.dropdownEl.children[newFocusedIndex].tabIndex !== -1) { + foundNewIndex = true; + break; + } + } while (newFocusedIndex < this.dropdownEl.children.length && newFocusedIndex >= 0); + + if (foundNewIndex) { + this.focusedIndex = newFocusedIndex; + this._focusFocusedItem(); + } + + // ENTER selects choice on focused item + } else if (e.which === M.keys.ENTER && this.isOpen) { + // Search for and ") + ''; + } + }, { + key: "renderRow", + value: function renderRow(days, isRTL, isRowSelected) { + return '' + (isRTL ? days.reverse() : days).join('') + ''; + } + }, { + key: "renderTable", + value: function renderTable(opts, data, randId) { + return '
' + this.renderHead(opts) + this.renderBody(data) + '
'; + } + }, { + key: "renderHead", + value: function renderHead(opts) { + var i = void 0, + arr = []; + for (i = 0; i < 7; i++) { + arr.push("" + this.renderDayName(opts, i, true) + ""); + } + return '' + (opts.isRTL ? arr.reverse() : arr).join('') + ''; + } + }, { + key: "renderBody", + value: function renderBody(rows) { + return '' + rows.join('') + ''; + } + }, { + key: "renderTitle", + value: function renderTitle(instance, c, year, month, refYear, randId) { + var i = void 0, + j = void 0, + arr = void 0, + opts = this.options, + isMinYear = year === opts.minYear, + isMaxYear = year === opts.maxYear, + html = '
', + monthHtml = void 0, + yearHtml = void 0, + prev = true, + next = true; + + for (arr = [], i = 0; i < 12; i++) { + arr.push(''); + } + + monthHtml = ''; + + if ($.isArray(opts.yearRange)) { + i = opts.yearRange[0]; + j = opts.yearRange[1] + 1; + } else { + i = year - opts.yearRange; + j = 1 + year + opts.yearRange; + } + + for (arr = []; i < j && i <= opts.maxYear; i++) { + if (i >= opts.minYear) { + arr.push(""); + } + } + + yearHtml = ""; + + var leftArrow = ''; + html += ""; + + html += '
'; + if (opts.showMonthAfterYear) { + html += yearHtml + monthHtml; + } else { + html += monthHtml + yearHtml; + } + html += '
'; + + if (isMinYear && (month === 0 || opts.minMonth >= month)) { + prev = false; + } + + if (isMaxYear && (month === 11 || opts.maxMonth <= month)) { + next = false; + } + + var rightArrow = ''; + html += ""; + + return html += '
'; + } + + /** + * refresh the HTML + */ + + }, { + key: "draw", + value: function draw(force) { + if (!this.isOpen && !force) { + return; + } + var opts = this.options, + minYear = opts.minYear, + maxYear = opts.maxYear, + minMonth = opts.minMonth, + maxMonth = opts.maxMonth, + html = '', + randId = void 0; + + if (this._y <= minYear) { + this._y = minYear; + if (!isNaN(minMonth) && this._m < minMonth) { + this._m = minMonth; + } + } + if (this._y >= maxYear) { + this._y = maxYear; + if (!isNaN(maxMonth) && this._m > maxMonth) { + this._m = maxMonth; + } + } + + randId = 'datepicker-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2); + + for (var c = 0; c < 1; c++) { + this._renderDateDisplay(); + html += this.renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId); + } + + this.destroySelects(); + + this.calendarEl.innerHTML = html; + + // Init Materialize Select + var yearSelect = this.calendarEl.querySelector('.orig-select-year'); + var monthSelect = this.calendarEl.querySelector('.orig-select-month'); + M.FormSelect.init(yearSelect, { + classes: 'select-year', + dropdownOptions: { container: document.body, constrainWidth: false } + }); + M.FormSelect.init(monthSelect, { + classes: 'select-month', + dropdownOptions: { container: document.body, constrainWidth: false } + }); + + // Add change handlers for select + yearSelect.addEventListener('change', this._handleYearChange.bind(this)); + monthSelect.addEventListener('change', this._handleMonthChange.bind(this)); + + if (typeof this.options.onDraw === 'function') { + this.options.onDraw(this); + } + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleInputKeydownBound = this._handleInputKeydown.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + this._handleInputChangeBound = this._handleInputChange.bind(this); + this._handleCalendarClickBound = this._handleCalendarClick.bind(this); + this._finishSelectionBound = this._finishSelection.bind(this); + this._handleMonthChange = this._handleMonthChange.bind(this); + this._closeBound = this.close.bind(this); + + this.el.addEventListener('click', this._handleInputClickBound); + this.el.addEventListener('keydown', this._handleInputKeydownBound); + this.el.addEventListener('change', this._handleInputChangeBound); + this.calendarEl.addEventListener('click', this._handleCalendarClickBound); + this.doneBtn.addEventListener('click', this._finishSelectionBound); + this.cancelBtn.addEventListener('click', this._closeBound); + + if (this.options.showClearBtn) { + this._handleClearClickBound = this._handleClearClick.bind(this); + this.clearBtn.addEventListener('click', this._handleClearClickBound); + } + } + }, { + key: "_setupVariables", + value: function _setupVariables() { + var _this56 = this; + + this.$modalEl = $(Datepicker._template); + this.modalEl = this.$modalEl[0]; + + this.calendarEl = this.modalEl.querySelector('.datepicker-calendar'); + + this.yearTextEl = this.modalEl.querySelector('.year-text'); + this.dateTextEl = this.modalEl.querySelector('.date-text'); + if (this.options.showClearBtn) { + this.clearBtn = this.modalEl.querySelector('.datepicker-clear'); + } + this.doneBtn = this.modalEl.querySelector('.datepicker-done'); + this.cancelBtn = this.modalEl.querySelector('.datepicker-cancel'); + + this.formats = { + d: function () { + return _this56.date.getDate(); + }, + dd: function () { + var d = _this56.date.getDate(); + return (d < 10 ? '0' : '') + d; + }, + ddd: function () { + return _this56.options.i18n.weekdaysShort[_this56.date.getDay()]; + }, + dddd: function () { + return _this56.options.i18n.weekdays[_this56.date.getDay()]; + }, + m: function () { + return _this56.date.getMonth() + 1; + }, + mm: function () { + var m = _this56.date.getMonth() + 1; + return (m < 10 ? '0' : '') + m; + }, + mmm: function () { + return _this56.options.i18n.monthsShort[_this56.date.getMonth()]; + }, + mmmm: function () { + return _this56.options.i18n.months[_this56.date.getMonth()]; + }, + yy: function () { + return ('' + _this56.date.getFullYear()).slice(2); + }, + yyyy: function () { + return _this56.date.getFullYear(); + } + }; + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleInputClickBound); + this.el.removeEventListener('keydown', this._handleInputKeydownBound); + this.el.removeEventListener('change', this._handleInputChangeBound); + this.calendarEl.removeEventListener('click', this._handleCalendarClickBound); + } + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + this.open(); + } + }, { + key: "_handleInputKeydown", + value: function _handleInputKeydown(e) { + if (e.which === M.keys.ENTER) { + e.preventDefault(); + this.open(); + } + } + }, { + key: "_handleCalendarClick", + value: function _handleCalendarClick(e) { + if (!this.isOpen) { + return; + } + + var $target = $(e.target); + if (!$target.hasClass('is-disabled')) { + if ($target.hasClass('datepicker-day-button') && !$target.hasClass('is-empty') && !$target.parent().hasClass('is-disabled')) { + this.setDate(new Date(e.target.getAttribute('data-year'), e.target.getAttribute('data-month'), e.target.getAttribute('data-day'))); + if (this.options.autoClose) { + this._finishSelection(); + } + } else if ($target.closest('.month-prev').length) { + this.prevMonth(); + } else if ($target.closest('.month-next').length) { + this.nextMonth(); + } + } + } + }, { + key: "_handleClearClick", + value: function _handleClearClick() { + this.date = null; + this.setInputValue(); + this.close(); + } + }, { + key: "_handleMonthChange", + value: function _handleMonthChange(e) { + this.gotoMonth(e.target.value); + } + }, { + key: "_handleYearChange", + value: function _handleYearChange(e) { + this.gotoYear(e.target.value); + } + + /** + * change view to a specific month (zero-index, e.g. 0: January) + */ + + }, { + key: "gotoMonth", + value: function gotoMonth(month) { + if (!isNaN(month)) { + this.calendars[0].month = parseInt(month, 10); + this.adjustCalendars(); + } + } + + /** + * change view to a specific full year (e.g. "2012") + */ + + }, { + key: "gotoYear", + value: function gotoYear(year) { + if (!isNaN(year)) { + this.calendars[0].year = parseInt(year, 10); + this.adjustCalendars(); + } + } + }, { + key: "_handleInputChange", + value: function _handleInputChange(e) { + var date = void 0; + + // Prevent change event from being fired when triggered by the plugin + if (e.firedBy === this) { + return; + } + if (this.options.parse) { + date = this.options.parse(this.el.value, this.options.format); + } else { + date = new Date(Date.parse(this.el.value)); + } + + if (Datepicker._isDate(date)) { + this.setDate(date); + } + } + }, { + key: "renderDayName", + value: function renderDayName(opts, day, abbr) { + day += opts.firstDay; + while (day >= 7) { + day -= 7; + } + return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day]; + } + + /** + * Set input value to the selected date and close Datepicker + */ + + }, { + key: "_finishSelection", + value: function _finishSelection() { + this.setInputValue(); + this.close(); + } + + /** + * Open Datepicker + */ + + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + this.isOpen = true; + if (typeof this.options.onOpen === 'function') { + this.options.onOpen.call(this); + } + this.draw(); + this.modal.open(); + return this; + } + + /** + * Close Datepicker + */ + + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + this.isOpen = false; + if (typeof this.options.onClose === 'function') { + this.options.onClose.call(this); + } + this.modal.close(); + return this; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Datepicker.__proto__ || Object.getPrototypeOf(Datepicker), "init", this).call(this, this, els, options); + } + }, { + key: "_isDate", + value: function _isDate(obj) { + return (/Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime()) + ); + } + }, { + key: "_isWeekend", + value: function _isWeekend(date) { + var day = date.getDay(); + return day === 0 || day === 6; + } + }, { + key: "_setToStartOfDay", + value: function _setToStartOfDay(date) { + if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0); + } + }, { + key: "_getDaysInMonth", + value: function _getDaysInMonth(year, month) { + return [31, Datepicker._isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + } + }, { + key: "_isLeapYear", + value: function _isLeapYear(year) { + // solution by Matti Virkkunen: http://stackoverflow.com/a/4881951 + return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; + } + }, { + key: "_compareDates", + value: function _compareDates(a, b) { + // weak date comparison (use setToStartOfDay(date) to ensure correct result) + return a.getTime() === b.getTime(); + } + }, { + key: "_setToStartOfDay", + value: function _setToStartOfDay(date) { + if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Datepicker; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Datepicker; + }(Component); + + Datepicker._template = [''].join(''); + + M.Datepicker = Datepicker; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Datepicker, 'datepicker', 'M_Datepicker'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + dialRadius: 135, + outerRadius: 105, + innerRadius: 70, + tickRadius: 20, + duration: 350, + container: null, + defaultTime: 'now', // default time, 'now' or '13:14' e.g. + fromNow: 0, // Millisecond offset from the defaultTime + showClearBtn: false, + + // internationalization + i18n: { + cancel: 'Cancel', + clear: 'Clear', + done: 'Ok' + }, + + autoClose: false, // auto close when minute is selected + twelveHour: true, // change to 12 hour AM/PM clock from 24 hour + vibrate: true, // vibrate the device when dragging clock hand + + // Callbacks + onOpenStart: null, + onOpenEnd: null, + onCloseStart: null, + onCloseEnd: null, + onSelect: null + }; + + /** + * @class + * + */ + + var Timepicker = function (_Component16) { + _inherits(Timepicker, _Component16); + + function Timepicker(el, options) { + _classCallCheck(this, Timepicker); + + var _this57 = _possibleConstructorReturn(this, (Timepicker.__proto__ || Object.getPrototypeOf(Timepicker)).call(this, Timepicker, el, options)); + + _this57.el.M_Timepicker = _this57; + + _this57.options = $.extend({}, Timepicker.defaults, options); + + _this57.id = M.guid(); + _this57._insertHTMLIntoDOM(); + _this57._setupModal(); + _this57._setupVariables(); + _this57._setupEventHandlers(); + + _this57._clockSetup(); + _this57._pickerSetup(); + return _this57; + } + + _createClass(Timepicker, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.modal.destroy(); + $(this.modalEl).remove(); + this.el.M_Timepicker = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleInputKeydownBound = this._handleInputKeydown.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + this._handleClockClickStartBound = this._handleClockClickStart.bind(this); + this._handleDocumentClickMoveBound = this._handleDocumentClickMove.bind(this); + this._handleDocumentClickEndBound = this._handleDocumentClickEnd.bind(this); + + this.el.addEventListener('click', this._handleInputClickBound); + this.el.addEventListener('keydown', this._handleInputKeydownBound); + this.plate.addEventListener('mousedown', this._handleClockClickStartBound); + this.plate.addEventListener('touchstart', this._handleClockClickStartBound); + + $(this.spanHours).on('click', this.showView.bind(this, 'hours')); + $(this.spanMinutes).on('click', this.showView.bind(this, 'minutes')); + } + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleInputClickBound); + this.el.removeEventListener('keydown', this._handleInputKeydownBound); + } + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + this.open(); + } + }, { + key: "_handleInputKeydown", + value: function _handleInputKeydown(e) { + if (e.which === M.keys.ENTER) { + e.preventDefault(); + this.open(); + } + } + }, { + key: "_handleClockClickStart", + value: function _handleClockClickStart(e) { + e.preventDefault(); + var clockPlateBR = this.plate.getBoundingClientRect(); + var offset = { x: clockPlateBR.left, y: clockPlateBR.top }; + + this.x0 = offset.x + this.options.dialRadius; + this.y0 = offset.y + this.options.dialRadius; + this.moved = false; + var clickPos = Timepicker._Pos(e); + this.dx = clickPos.x - this.x0; + this.dy = clickPos.y - this.y0; + + // Set clock hands + this.setHand(this.dx, this.dy, false); + + // Mousemove on document + document.addEventListener('mousemove', this._handleDocumentClickMoveBound); + document.addEventListener('touchmove', this._handleDocumentClickMoveBound); + + // Mouseup on document + document.addEventListener('mouseup', this._handleDocumentClickEndBound); + document.addEventListener('touchend', this._handleDocumentClickEndBound); + } + }, { + key: "_handleDocumentClickMove", + value: function _handleDocumentClickMove(e) { + e.preventDefault(); + var clickPos = Timepicker._Pos(e); + var x = clickPos.x - this.x0; + var y = clickPos.y - this.y0; + this.moved = true; + this.setHand(x, y, false, true); + } + }, { + key: "_handleDocumentClickEnd", + value: function _handleDocumentClickEnd(e) { + var _this58 = this; + + e.preventDefault(); + document.removeEventListener('mouseup', this._handleDocumentClickEndBound); + document.removeEventListener('touchend', this._handleDocumentClickEndBound); + var clickPos = Timepicker._Pos(e); + var x = clickPos.x - this.x0; + var y = clickPos.y - this.y0; + if (this.moved && x === this.dx && y === this.dy) { + this.setHand(x, y); + } + + if (this.currentView === 'hours') { + this.showView('minutes', this.options.duration / 2); + } else if (this.options.autoClose) { + $(this.minutesView).addClass('timepicker-dial-out'); + setTimeout(function () { + _this58.done(); + }, this.options.duration / 2); + } + + if (typeof this.options.onSelect === 'function') { + this.options.onSelect.call(this, this.hours, this.minutes); + } + + // Unbind mousemove event + document.removeEventListener('mousemove', this._handleDocumentClickMoveBound); + document.removeEventListener('touchmove', this._handleDocumentClickMoveBound); + } + }, { + key: "_insertHTMLIntoDOM", + value: function _insertHTMLIntoDOM() { + this.$modalEl = $(Timepicker._template); + this.modalEl = this.$modalEl[0]; + this.modalEl.id = 'modal-' + this.id; + + // Append popover to input by default + var containerEl = document.querySelector(this.options.container); + if (this.options.container && !!containerEl) { + this.$modalEl.appendTo(containerEl); + } else { + this.$modalEl.insertBefore(this.el); + } + } + }, { + key: "_setupModal", + value: function _setupModal() { + var _this59 = this; + + this.modal = M.Modal.init(this.modalEl, { + onOpenStart: this.options.onOpenStart, + onOpenEnd: this.options.onOpenEnd, + onCloseStart: this.options.onCloseStart, + onCloseEnd: function () { + if (typeof _this59.options.onCloseEnd === 'function') { + _this59.options.onCloseEnd.call(_this59); + } + _this59.isOpen = false; + } + }); + } + }, { + key: "_setupVariables", + value: function _setupVariables() { + this.currentView = 'hours'; + this.vibrate = navigator.vibrate ? 'vibrate' : navigator.webkitVibrate ? 'webkitVibrate' : null; + + this._canvas = this.modalEl.querySelector('.timepicker-canvas'); + this.plate = this.modalEl.querySelector('.timepicker-plate'); + + this.hoursView = this.modalEl.querySelector('.timepicker-hours'); + this.minutesView = this.modalEl.querySelector('.timepicker-minutes'); + this.spanHours = this.modalEl.querySelector('.timepicker-span-hours'); + this.spanMinutes = this.modalEl.querySelector('.timepicker-span-minutes'); + this.spanAmPm = this.modalEl.querySelector('.timepicker-span-am-pm'); + this.footer = this.modalEl.querySelector('.timepicker-footer'); + this.amOrPm = 'PM'; + } + }, { + key: "_pickerSetup", + value: function _pickerSetup() { + var $clearBtn = $("").appendTo(this.footer).on('click', this.clear.bind(this)); + if (this.options.showClearBtn) { + $clearBtn.css({ visibility: '' }); + } + + var confirmationBtnsContainer = $('
'); + $('').appendTo(confirmationBtnsContainer).on('click', this.close.bind(this)); + $('').appendTo(confirmationBtnsContainer).on('click', this.done.bind(this)); + confirmationBtnsContainer.appendTo(this.footer); + } + }, { + key: "_clockSetup", + value: function _clockSetup() { + if (this.options.twelveHour) { + this.$amBtn = $('
AM
'); + this.$pmBtn = $('
PM
'); + this.$amBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm); + this.$pmBtn.on('click', this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm); + } + + this._buildHoursView(); + this._buildMinutesView(); + this._buildSVGClock(); + } + }, { + key: "_buildSVGClock", + value: function _buildSVGClock() { + // Draw clock hands and others + var dialRadius = this.options.dialRadius; + var tickRadius = this.options.tickRadius; + var diameter = dialRadius * 2; + + var svg = Timepicker._createSVGEl('svg'); + svg.setAttribute('class', 'timepicker-svg'); + svg.setAttribute('width', diameter); + svg.setAttribute('height', diameter); + var g = Timepicker._createSVGEl('g'); + g.setAttribute('transform', 'translate(' + dialRadius + ',' + dialRadius + ')'); + var bearing = Timepicker._createSVGEl('circle'); + bearing.setAttribute('class', 'timepicker-canvas-bearing'); + bearing.setAttribute('cx', 0); + bearing.setAttribute('cy', 0); + bearing.setAttribute('r', 4); + var hand = Timepicker._createSVGEl('line'); + hand.setAttribute('x1', 0); + hand.setAttribute('y1', 0); + var bg = Timepicker._createSVGEl('circle'); + bg.setAttribute('class', 'timepicker-canvas-bg'); + bg.setAttribute('r', tickRadius); + g.appendChild(hand); + g.appendChild(bg); + g.appendChild(bearing); + svg.appendChild(g); + this._canvas.appendChild(svg); + + this.hand = hand; + this.bg = bg; + this.bearing = bearing; + this.g = g; + } + }, { + key: "_buildHoursView", + value: function _buildHoursView() { + var $tick = $('
'); + // Hours view + if (this.options.twelveHour) { + for (var i = 1; i < 13; i += 1) { + var tick = $tick.clone(); + var radian = i / 6 * Math.PI; + var radius = this.options.outerRadius; + tick.css({ + left: this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px' + }); + tick.html(i === 0 ? '00' : i); + this.hoursView.appendChild(tick[0]); + // tick.on(mousedownEvent, mousedown); + } + } else { + for (var _i2 = 0; _i2 < 24; _i2 += 1) { + var _tick = $tick.clone(); + var _radian = _i2 / 6 * Math.PI; + var inner = _i2 > 0 && _i2 < 13; + var _radius = inner ? this.options.innerRadius : this.options.outerRadius; + _tick.css({ + left: this.options.dialRadius + Math.sin(_radian) * _radius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(_radian) * _radius - this.options.tickRadius + 'px' + }); + _tick.html(_i2 === 0 ? '00' : _i2); + this.hoursView.appendChild(_tick[0]); + // tick.on(mousedownEvent, mousedown); + } + } + } + }, { + key: "_buildMinutesView", + value: function _buildMinutesView() { + var $tick = $('
'); + // Minutes view + for (var i = 0; i < 60; i += 5) { + var tick = $tick.clone(); + var radian = i / 30 * Math.PI; + tick.css({ + left: this.options.dialRadius + Math.sin(radian) * this.options.outerRadius - this.options.tickRadius + 'px', + top: this.options.dialRadius - Math.cos(radian) * this.options.outerRadius - this.options.tickRadius + 'px' + }); + tick.html(Timepicker._addLeadingZero(i)); + this.minutesView.appendChild(tick[0]); + } + } + }, { + key: "_handleAmPmClick", + value: function _handleAmPmClick(e) { + var $btnClicked = $(e.target); + this.amOrPm = $btnClicked.hasClass('am-btn') ? 'AM' : 'PM'; + this._updateAmPmView(); + } + }, { + key: "_updateAmPmView", + value: function _updateAmPmView() { + if (this.options.twelveHour) { + this.$amBtn.toggleClass('text-primary', this.amOrPm === 'AM'); + this.$pmBtn.toggleClass('text-primary', this.amOrPm === 'PM'); + } + } + }, { + key: "_updateTimeFromInput", + value: function _updateTimeFromInput() { + // Get the time + var value = ((this.el.value || this.options.defaultTime || '') + '').split(':'); + if (this.options.twelveHour && !(typeof value[1] === 'undefined')) { + if (value[1].toUpperCase().indexOf('AM') > 0) { + this.amOrPm = 'AM'; + } else { + this.amOrPm = 'PM'; + } + value[1] = value[1].replace('AM', '').replace('PM', ''); + } + if (value[0] === 'now') { + var now = new Date(+new Date() + this.options.fromNow); + value = [now.getHours(), now.getMinutes()]; + if (this.options.twelveHour) { + this.amOrPm = value[0] >= 12 && value[0] < 24 ? 'PM' : 'AM'; + } + } + this.hours = +value[0] || 0; + this.minutes = +value[1] || 0; + this.spanHours.innerHTML = this.hours; + this.spanMinutes.innerHTML = Timepicker._addLeadingZero(this.minutes); + + this._updateAmPmView(); + } + }, { + key: "showView", + value: function showView(view, delay) { + if (view === 'minutes' && $(this.hoursView).css('visibility') === 'visible') { + // raiseCallback(this.options.beforeHourSelect); + } + var isHours = view === 'hours', + nextView = isHours ? this.hoursView : this.minutesView, + hideView = isHours ? this.minutesView : this.hoursView; + this.currentView = view; + + $(this.spanHours).toggleClass('text-primary', isHours); + $(this.spanMinutes).toggleClass('text-primary', !isHours); + + // Transition view + hideView.classList.add('timepicker-dial-out'); + $(nextView).css('visibility', 'visible').removeClass('timepicker-dial-out'); + + // Reset clock hand + this.resetClock(delay); + + // After transitions ended + clearTimeout(this.toggleViewTimer); + this.toggleViewTimer = setTimeout(function () { + $(hideView).css('visibility', 'hidden'); + }, this.options.duration); + } + }, { + key: "resetClock", + value: function resetClock(delay) { + var view = this.currentView, + value = this[view], + isHours = view === 'hours', + unit = Math.PI / (isHours ? 6 : 30), + radian = value * unit, + radius = isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius, + x = Math.sin(radian) * radius, + y = -Math.cos(radian) * radius, + self = this; + + if (delay) { + $(this.canvas).addClass('timepicker-canvas-out'); + setTimeout(function () { + $(self.canvas).removeClass('timepicker-canvas-out'); + self.setHand(x, y); + }, delay); + } else { + this.setHand(x, y); + } + } + }, { + key: "setHand", + value: function setHand(x, y, roundBy5) { + var _this60 = this; + + var radian = Math.atan2(x, -y), + isHours = this.currentView === 'hours', + unit = Math.PI / (isHours || roundBy5 ? 6 : 30), + z = Math.sqrt(x * x + y * y), + inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2, + radius = inner ? this.options.innerRadius : this.options.outerRadius; + + if (this.options.twelveHour) { + radius = this.options.outerRadius; + } + + // Radian should in range [0, 2PI] + if (radian < 0) { + radian = Math.PI * 2 + radian; + } + + // Get the round value + var value = Math.round(radian / unit); + + // Get the round radian + radian = value * unit; + + // Correct the hours or minutes + if (this.options.twelveHour) { + if (isHours) { + if (value === 0) value = 12; + } else { + if (roundBy5) value *= 5; + if (value === 60) value = 0; + } + } else { + if (isHours) { + if (value === 12) { + value = 0; + } + value = inner ? value === 0 ? 12 : value : value === 0 ? 0 : value + 12; + } else { + if (roundBy5) { + value *= 5; + } + if (value === 60) { + value = 0; + } + } + } + + // Once hours or minutes changed, vibrate the device + if (this[this.currentView] !== value) { + if (this.vibrate && this.options.vibrate) { + // Do not vibrate too frequently + if (!this.vibrateTimer) { + navigator[this.vibrate](10); + this.vibrateTimer = setTimeout(function () { + _this60.vibrateTimer = null; + }, 100); + } + } + } + + this[this.currentView] = value; + if (isHours) { + this['spanHours'].innerHTML = value; + } else { + this['spanMinutes'].innerHTML = Timepicker._addLeadingZero(value); + } + + // Set clock hand and others' position + var cx1 = Math.sin(radian) * (radius - this.options.tickRadius), + cy1 = -Math.cos(radian) * (radius - this.options.tickRadius), + cx2 = Math.sin(radian) * radius, + cy2 = -Math.cos(radian) * radius; + this.hand.setAttribute('x2', cx1); + this.hand.setAttribute('y2', cy1); + this.bg.setAttribute('cx', cx2); + this.bg.setAttribute('cy', cy2); + } + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + this.isOpen = true; + this._updateTimeFromInput(); + this.showView('hours'); + + this.modal.open(); + } + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + this.isOpen = false; + this.modal.close(); + } + + /** + * Finish timepicker selection. + */ + + }, { + key: "done", + value: function done(e, clearValue) { + // Set input value + var last = this.el.value; + var value = clearValue ? '' : Timepicker._addLeadingZero(this.hours) + ':' + Timepicker._addLeadingZero(this.minutes); + this.time = value; + if (!clearValue && this.options.twelveHour) { + value = value + " " + this.amOrPm; + } + this.el.value = value; + + // Trigger change event + if (value !== last) { + this.$el.trigger('change'); + } + + this.close(); + this.el.focus(); + } + }, { + key: "clear", + value: function clear() { + this.done(null, true); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Timepicker.__proto__ || Object.getPrototypeOf(Timepicker), "init", this).call(this, this, els, options); + } + }, { + key: "_addLeadingZero", + value: function _addLeadingZero(num) { + return (num < 10 ? '0' : '') + num; + } + }, { + key: "_createSVGEl", + value: function _createSVGEl(name) { + var svgNS = 'http://www.w3.org/2000/svg'; + return document.createElementNS(svgNS, name); + } + + /** + * @typedef {Object} Point + * @property {number} x The X Coordinate + * @property {number} y The Y Coordinate + */ + + /** + * Get x position of mouse or touch event + * @param {Event} e + * @return {Point} x and y location + */ + + }, { + key: "_Pos", + value: function _Pos(e) { + if (e.targetTouches && e.targetTouches.length >= 1) { + return { x: e.targetTouches[0].clientX, y: e.targetTouches[0].clientY }; + } + // mouse event + return { x: e.clientX, y: e.clientY }; + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Timepicker; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Timepicker; + }(Component); + + Timepicker._template = [''].join(''); + + M.Timepicker = Timepicker; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Timepicker, 'timepicker', 'M_Timepicker'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = {}; + + /** + * @class + * + */ + + var CharacterCounter = function (_Component17) { + _inherits(CharacterCounter, _Component17); + + /** + * Construct CharacterCounter instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function CharacterCounter(el, options) { + _classCallCheck(this, CharacterCounter); + + var _this61 = _possibleConstructorReturn(this, (CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter)).call(this, CharacterCounter, el, options)); + + _this61.el.M_CharacterCounter = _this61; + + /** + * Options for the character counter + */ + _this61.options = $.extend({}, CharacterCounter.defaults, options); + + _this61.isInvalid = false; + _this61.isValidLength = false; + _this61._setupCounter(); + _this61._setupEventHandlers(); + return _this61; + } + + _createClass(CharacterCounter, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.CharacterCounter = undefined; + this._removeCounter(); + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleUpdateCounterBound = this.updateCounter.bind(this); + + this.el.addEventListener('focus', this._handleUpdateCounterBound, true); + this.el.addEventListener('input', this._handleUpdateCounterBound, true); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('focus', this._handleUpdateCounterBound, true); + this.el.removeEventListener('input', this._handleUpdateCounterBound, true); + } + + /** + * Setup counter element + */ + + }, { + key: "_setupCounter", + value: function _setupCounter() { + this.counterEl = document.createElement('span'); + $(this.counterEl).addClass('character-counter').css({ + float: 'right', + 'font-size': '12px', + height: 1 + }); + + this.$el.parent().append(this.counterEl); + } + + /** + * Remove counter element + */ + + }, { + key: "_removeCounter", + value: function _removeCounter() { + $(this.counterEl).remove(); + } + + /** + * Update counter + */ + + }, { + key: "updateCounter", + value: function updateCounter() { + var maxLength = +this.$el.attr('data-length'), + actualLength = this.el.value.length; + this.isValidLength = actualLength <= maxLength; + var counterString = actualLength; + + if (maxLength) { + counterString += '/' + maxLength; + this._validateInput(); + } + + $(this.counterEl).html(counterString); + } + + /** + * Add validation classes + */ + + }, { + key: "_validateInput", + value: function _validateInput() { + if (this.isValidLength && this.isInvalid) { + this.isInvalid = false; + this.$el.removeClass('invalid'); + } else if (!this.isValidLength && !this.isInvalid) { + this.isInvalid = true; + this.$el.removeClass('valid'); + this.$el.addClass('invalid'); + } + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(CharacterCounter.__proto__ || Object.getPrototypeOf(CharacterCounter), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_CharacterCounter; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return CharacterCounter; + }(Component); + + M.CharacterCounter = CharacterCounter; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(CharacterCounter, 'characterCounter', 'M_CharacterCounter'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + duration: 200, // ms + dist: -100, // zoom scale TODO: make this more intuitive as an option + shift: 0, // spacing for center image + padding: 0, // Padding between non center items + numVisible: 5, // Number of visible items in carousel + fullWidth: false, // Change to full width styles + indicators: false, // Toggle indicators + noWrap: false, // Don't wrap around and cycle through items. + onCycleTo: null // Callback for when a new slide is cycled to. + }; + + /** + * @class + * + */ + + var Carousel = function (_Component18) { + _inherits(Carousel, _Component18); + + /** + * Construct Carousel instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Carousel(el, options) { + _classCallCheck(this, Carousel); + + var _this62 = _possibleConstructorReturn(this, (Carousel.__proto__ || Object.getPrototypeOf(Carousel)).call(this, Carousel, el, options)); + + _this62.el.M_Carousel = _this62; + + /** + * Options for the carousel + * @member Carousel#options + * @prop {Number} duration + * @prop {Number} dist + * @prop {Number} shift + * @prop {Number} padding + * @prop {Number} numVisible + * @prop {Boolean} fullWidth + * @prop {Boolean} indicators + * @prop {Boolean} noWrap + * @prop {Function} onCycleTo + */ + _this62.options = $.extend({}, Carousel.defaults, options); + + // Setup + _this62.hasMultipleSlides = _this62.$el.find('.carousel-item').length > 1; + _this62.showIndicators = _this62.options.indicators && _this62.hasMultipleSlides; + _this62.noWrap = _this62.options.noWrap || !_this62.hasMultipleSlides; + _this62.pressed = false; + _this62.dragged = false; + _this62.offset = _this62.target = 0; + _this62.images = []; + _this62.itemWidth = _this62.$el.find('.carousel-item').first().innerWidth(); + _this62.itemHeight = _this62.$el.find('.carousel-item').first().innerHeight(); + _this62.dim = _this62.itemWidth * 2 + _this62.options.padding || 1; // Make sure dim is non zero for divisions. + _this62._autoScrollBound = _this62._autoScroll.bind(_this62); + _this62._trackBound = _this62._track.bind(_this62); + + // Full Width carousel setup + if (_this62.options.fullWidth) { + _this62.options.dist = 0; + _this62._setCarouselHeight(); + + // Offset fixed items when indicators. + if (_this62.showIndicators) { + _this62.$el.find('.carousel-fixed-item').addClass('with-indicators'); + } + } + + // Iterate through slides + _this62.$indicators = $('
    '); + _this62.$el.find('.carousel-item').each(function (el, i) { + _this62.images.push(el); + if (_this62.showIndicators) { + var $indicator = $('
  • '); + + // Add active to first by default. + if (i === 0) { + $indicator[0].classList.add('active'); + } + + _this62.$indicators.append($indicator); + } + }); + if (_this62.showIndicators) { + _this62.$el.append(_this62.$indicators); + } + _this62.count = _this62.images.length; + + // Cap numVisible at count + _this62.options.numVisible = Math.min(_this62.count, _this62.options.numVisible); + + // Setup cross browser string + _this62.xform = 'transform'; + ['webkit', 'Moz', 'O', 'ms'].every(function (prefix) { + var e = prefix + 'Transform'; + if (typeof document.body.style[e] !== 'undefined') { + _this62.xform = e; + return false; + } + return true; + }); + + _this62._setupEventHandlers(); + _this62._scroll(_this62.offset); + return _this62; + } + + _createClass(Carousel, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.M_Carousel = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + var _this63 = this; + + this._handleCarouselTapBound = this._handleCarouselTap.bind(this); + this._handleCarouselDragBound = this._handleCarouselDrag.bind(this); + this._handleCarouselReleaseBound = this._handleCarouselRelease.bind(this); + this._handleCarouselClickBound = this._handleCarouselClick.bind(this); + + if (typeof window.ontouchstart !== 'undefined') { + this.el.addEventListener('touchstart', this._handleCarouselTapBound); + this.el.addEventListener('touchmove', this._handleCarouselDragBound); + this.el.addEventListener('touchend', this._handleCarouselReleaseBound); + } + + this.el.addEventListener('mousedown', this._handleCarouselTapBound); + this.el.addEventListener('mousemove', this._handleCarouselDragBound); + this.el.addEventListener('mouseup', this._handleCarouselReleaseBound); + this.el.addEventListener('mouseleave', this._handleCarouselReleaseBound); + this.el.addEventListener('click', this._handleCarouselClickBound); + + if (this.showIndicators && this.$indicators) { + this._handleIndicatorClickBound = this._handleIndicatorClick.bind(this); + this.$indicators.find('.indicator-item').each(function (el, i) { + el.addEventListener('click', _this63._handleIndicatorClickBound); + }); + } + + // Resize + var throttledResize = M.throttle(this._handleResize, 200); + this._handleThrottledResizeBound = throttledResize.bind(this); + + window.addEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + var _this64 = this; + + if (typeof window.ontouchstart !== 'undefined') { + this.el.removeEventListener('touchstart', this._handleCarouselTapBound); + this.el.removeEventListener('touchmove', this._handleCarouselDragBound); + this.el.removeEventListener('touchend', this._handleCarouselReleaseBound); + } + this.el.removeEventListener('mousedown', this._handleCarouselTapBound); + this.el.removeEventListener('mousemove', this._handleCarouselDragBound); + this.el.removeEventListener('mouseup', this._handleCarouselReleaseBound); + this.el.removeEventListener('mouseleave', this._handleCarouselReleaseBound); + this.el.removeEventListener('click', this._handleCarouselClickBound); + + if (this.showIndicators && this.$indicators) { + this.$indicators.find('.indicator-item').each(function (el, i) { + el.removeEventListener('click', _this64._handleIndicatorClickBound); + }); + } + + window.removeEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Handle Carousel Tap + * @param {Event} e + */ + + }, { + key: "_handleCarouselTap", + value: function _handleCarouselTap(e) { + // Fixes firefox draggable image bug + if (e.type === 'mousedown' && $(e.target).is('img')) { + e.preventDefault(); + } + this.pressed = true; + this.dragged = false; + this.verticalDragged = false; + this.reference = this._xpos(e); + this.referenceY = this._ypos(e); + + this.velocity = this.amplitude = 0; + this.frame = this.offset; + this.timestamp = Date.now(); + clearInterval(this.ticker); + this.ticker = setInterval(this._trackBound, 100); + } + + /** + * Handle Carousel Drag + * @param {Event} e + */ + + }, { + key: "_handleCarouselDrag", + value: function _handleCarouselDrag(e) { + var x = void 0, + y = void 0, + delta = void 0, + deltaY = void 0; + if (this.pressed) { + x = this._xpos(e); + y = this._ypos(e); + delta = this.reference - x; + deltaY = Math.abs(this.referenceY - y); + if (deltaY < 30 && !this.verticalDragged) { + // If vertical scrolling don't allow dragging. + if (delta > 2 || delta < -2) { + this.dragged = true; + this.reference = x; + this._scroll(this.offset + delta); + } + } else if (this.dragged) { + // If dragging don't allow vertical scroll. + e.preventDefault(); + e.stopPropagation(); + return false; + } else { + // Vertical scrolling. + this.verticalDragged = true; + } + } + + if (this.dragged) { + // If dragging don't allow vertical scroll. + e.preventDefault(); + e.stopPropagation(); + return false; + } + } + + /** + * Handle Carousel Release + * @param {Event} e + */ + + }, { + key: "_handleCarouselRelease", + value: function _handleCarouselRelease(e) { + if (this.pressed) { + this.pressed = false; + } else { + return; + } + + clearInterval(this.ticker); + this.target = this.offset; + if (this.velocity > 10 || this.velocity < -10) { + this.amplitude = 0.9 * this.velocity; + this.target = this.offset + this.amplitude; + } + this.target = Math.round(this.target / this.dim) * this.dim; + + // No wrap of items. + if (this.noWrap) { + if (this.target >= this.dim * (this.count - 1)) { + this.target = this.dim * (this.count - 1); + } else if (this.target < 0) { + this.target = 0; + } + } + this.amplitude = this.target - this.offset; + this.timestamp = Date.now(); + requestAnimationFrame(this._autoScrollBound); + + if (this.dragged) { + e.preventDefault(); + e.stopPropagation(); + } + return false; + } + + /** + * Handle Carousel CLick + * @param {Event} e + */ + + }, { + key: "_handleCarouselClick", + value: function _handleCarouselClick(e) { + // Disable clicks if carousel was dragged. + if (this.dragged) { + e.preventDefault(); + e.stopPropagation(); + return false; + } else if (!this.options.fullWidth) { + var clickedIndex = $(e.target).closest('.carousel-item').index(); + var diff = this._wrap(this.center) - clickedIndex; + + // Disable clicks if carousel was shifted by click + if (diff !== 0) { + e.preventDefault(); + e.stopPropagation(); + } + this._cycleTo(clickedIndex); + } + } + + /** + * Handle Indicator CLick + * @param {Event} e + */ + + }, { + key: "_handleIndicatorClick", + value: function _handleIndicatorClick(e) { + e.stopPropagation(); + + var indicator = $(e.target).closest('.indicator-item'); + if (indicator.length) { + this._cycleTo(indicator.index()); + } + } + + /** + * Handle Throttle Resize + * @param {Event} e + */ + + }, { + key: "_handleResize", + value: function _handleResize(e) { + if (this.options.fullWidth) { + this.itemWidth = this.$el.find('.carousel-item').first().innerWidth(); + this.imageHeight = this.$el.find('.carousel-item.active').height(); + this.dim = this.itemWidth * 2 + this.options.padding; + this.offset = this.center * 2 * this.itemWidth; + this.target = this.offset; + this._setCarouselHeight(true); + } else { + this._scroll(); + } + } + + /** + * Set carousel height based on first slide + * @param {Booleam} imageOnly - true for image slides + */ + + }, { + key: "_setCarouselHeight", + value: function _setCarouselHeight(imageOnly) { + var _this65 = this; + + var firstSlide = this.$el.find('.carousel-item.active').length ? this.$el.find('.carousel-item.active').first() : this.$el.find('.carousel-item').first(); + var firstImage = firstSlide.find('img').first(); + if (firstImage.length) { + if (firstImage[0].complete) { + // If image won't trigger the load event + var imageHeight = firstImage.height(); + if (imageHeight > 0) { + this.$el.css('height', imageHeight + 'px'); + } else { + // If image still has no height, use the natural dimensions to calculate + var naturalWidth = firstImage[0].naturalWidth; + var naturalHeight = firstImage[0].naturalHeight; + var adjustedHeight = this.$el.width() / naturalWidth * naturalHeight; + this.$el.css('height', adjustedHeight + 'px'); + } + } else { + // Get height when image is loaded normally + firstImage.one('load', function (el, i) { + _this65.$el.css('height', el.offsetHeight + 'px'); + }); + } + } else if (!imageOnly) { + var slideHeight = firstSlide.height(); + this.$el.css('height', slideHeight + 'px'); + } + } + + /** + * Get x position from event + * @param {Event} e + */ + + }, { + key: "_xpos", + value: function _xpos(e) { + // touch event + if (e.targetTouches && e.targetTouches.length >= 1) { + return e.targetTouches[0].clientX; + } + + // mouse event + return e.clientX; + } + + /** + * Get y position from event + * @param {Event} e + */ + + }, { + key: "_ypos", + value: function _ypos(e) { + // touch event + if (e.targetTouches && e.targetTouches.length >= 1) { + return e.targetTouches[0].clientY; + } + + // mouse event + return e.clientY; + } + + /** + * Wrap index + * @param {Number} x + */ + + }, { + key: "_wrap", + value: function _wrap(x) { + return x >= this.count ? x % this.count : x < 0 ? this._wrap(this.count + x % this.count) : x; + } + + /** + * Tracks scrolling information + */ + + }, { + key: "_track", + value: function _track() { + var now = void 0, + elapsed = void 0, + delta = void 0, + v = void 0; + + now = Date.now(); + elapsed = now - this.timestamp; + this.timestamp = now; + delta = this.offset - this.frame; + this.frame = this.offset; + + v = 1000 * delta / (1 + elapsed); + this.velocity = 0.8 * v + 0.2 * this.velocity; + } + + /** + * Auto scrolls to nearest carousel item. + */ + + }, { + key: "_autoScroll", + value: function _autoScroll() { + var elapsed = void 0, + delta = void 0; + + if (this.amplitude) { + elapsed = Date.now() - this.timestamp; + delta = this.amplitude * Math.exp(-elapsed / this.options.duration); + if (delta > 2 || delta < -2) { + this._scroll(this.target - delta); + requestAnimationFrame(this._autoScrollBound); + } else { + this._scroll(this.target); + } + } + } + + /** + * Scroll to target + * @param {Number} x + */ + + }, { + key: "_scroll", + value: function _scroll(x) { + var _this66 = this; + + // Track scrolling state + if (!this.$el.hasClass('scrolling')) { + this.el.classList.add('scrolling'); + } + if (this.scrollingTimeout != null) { + window.clearTimeout(this.scrollingTimeout); + } + this.scrollingTimeout = window.setTimeout(function () { + _this66.$el.removeClass('scrolling'); + }, this.options.duration); + + // Start actual scroll + var i = void 0, + half = void 0, + delta = void 0, + dir = void 0, + tween = void 0, + el = void 0, + alignment = void 0, + zTranslation = void 0, + tweenedOpacity = void 0, + centerTweenedOpacity = void 0; + var lastCenter = this.center; + var numVisibleOffset = 1 / this.options.numVisible; + + this.offset = typeof x === 'number' ? x : this.offset; + this.center = Math.floor((this.offset + this.dim / 2) / this.dim); + delta = this.offset - this.center * this.dim; + dir = delta < 0 ? 1 : -1; + tween = -dir * delta * 2 / this.dim; + half = this.count >> 1; + + if (this.options.fullWidth) { + alignment = 'translateX(0)'; + centerTweenedOpacity = 1; + } else { + alignment = 'translateX(' + (this.el.clientWidth - this.itemWidth) / 2 + 'px) '; + alignment += 'translateY(' + (this.el.clientHeight - this.itemHeight) / 2 + 'px)'; + centerTweenedOpacity = 1 - numVisibleOffset * tween; + } + + // Set indicator active + if (this.showIndicators) { + var diff = this.center % this.count; + var activeIndicator = this.$indicators.find('.indicator-item.active'); + if (activeIndicator.index() !== diff) { + activeIndicator.removeClass('active'); + this.$indicators.find('.indicator-item').eq(diff)[0].classList.add('active'); + } + } + + // center + // Don't show wrapped items. + if (!this.noWrap || this.center >= 0 && this.center < this.count) { + el = this.images[this._wrap(this.center)]; + + // Add active class to center item. + if (!$(el).hasClass('active')) { + this.$el.find('.carousel-item').removeClass('active'); + el.classList.add('active'); + } + var transformString = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween * i + "px) translateZ(" + this.options.dist * tween + "px)"; + this._updateItemStyle(el, centerTweenedOpacity, 0, transformString); + } + + for (i = 1; i <= half; ++i) { + // right side + if (this.options.fullWidth) { + zTranslation = this.options.dist; + tweenedOpacity = i === half && delta < 0 ? 1 - tween : 1; + } else { + zTranslation = this.options.dist * (i * 2 + tween * dir); + tweenedOpacity = 1 - numVisibleOffset * (i * 2 + tween * dir); + } + // Don't show wrapped items. + if (!this.noWrap || this.center + i < this.count) { + el = this.images[this._wrap(this.center + i)]; + var _transformString = alignment + " translateX(" + (this.options.shift + (this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)"; + this._updateItemStyle(el, tweenedOpacity, -i, _transformString); + } + + // left side + if (this.options.fullWidth) { + zTranslation = this.options.dist; + tweenedOpacity = i === half && delta > 0 ? 1 - tween : 1; + } else { + zTranslation = this.options.dist * (i * 2 - tween * dir); + tweenedOpacity = 1 - numVisibleOffset * (i * 2 - tween * dir); + } + // Don't show wrapped items. + if (!this.noWrap || this.center - i >= 0) { + el = this.images[this._wrap(this.center - i)]; + var _transformString2 = alignment + " translateX(" + (-this.options.shift + (-this.dim * i - delta) / 2) + "px) translateZ(" + zTranslation + "px)"; + this._updateItemStyle(el, tweenedOpacity, -i, _transformString2); + } + } + + // center + // Don't show wrapped items. + if (!this.noWrap || this.center >= 0 && this.center < this.count) { + el = this.images[this._wrap(this.center)]; + var _transformString3 = alignment + " translateX(" + -delta / 2 + "px) translateX(" + dir * this.options.shift * tween + "px) translateZ(" + this.options.dist * tween + "px)"; + this._updateItemStyle(el, centerTweenedOpacity, 0, _transformString3); + } + + // onCycleTo callback + var $currItem = this.$el.find('.carousel-item').eq(this._wrap(this.center)); + if (lastCenter !== this.center && typeof this.options.onCycleTo === 'function') { + this.options.onCycleTo.call(this, $currItem[0], this.dragged); + } + + // One time callback + if (typeof this.oneTimeCallback === 'function') { + this.oneTimeCallback.call(this, $currItem[0], this.dragged); + this.oneTimeCallback = null; + } + } + + /** + * Cycle to target + * @param {Element} el + * @param {Number} opacity + * @param {Number} zIndex + * @param {String} transform + */ + + }, { + key: "_updateItemStyle", + value: function _updateItemStyle(el, opacity, zIndex, transform) { + el.style[this.xform] = transform; + el.style.zIndex = zIndex; + el.style.opacity = opacity; + el.style.visibility = 'visible'; + } + + /** + * Cycle to target + * @param {Number} n + * @param {Function} callback + */ + + }, { + key: "_cycleTo", + value: function _cycleTo(n, callback) { + var diff = this.center % this.count - n; + + // Account for wraparound. + if (!this.noWrap) { + if (diff < 0) { + if (Math.abs(diff + this.count) < Math.abs(diff)) { + diff += this.count; + } + } else if (diff > 0) { + if (Math.abs(diff - this.count) < diff) { + diff -= this.count; + } + } + } + + this.target = this.dim * Math.round(this.offset / this.dim); + // Next + if (diff < 0) { + this.target += this.dim * Math.abs(diff); + + // Prev + } else if (diff > 0) { + this.target -= this.dim * diff; + } + + // Set one time callback + if (typeof callback === 'function') { + this.oneTimeCallback = callback; + } + + // Scroll + if (this.offset !== this.target) { + this.amplitude = this.target - this.offset; + this.timestamp = Date.now(); + requestAnimationFrame(this._autoScrollBound); + } + } + + /** + * Cycle to next item + * @param {Number} [n] + */ + + }, { + key: "next", + value: function next(n) { + if (n === undefined || isNaN(n)) { + n = 1; + } + + var index = this.center + n; + if (index >= this.count || index < 0) { + if (this.noWrap) { + return; + } + + index = this._wrap(index); + } + this._cycleTo(index); + } + + /** + * Cycle to previous item + * @param {Number} [n] + */ + + }, { + key: "prev", + value: function prev(n) { + if (n === undefined || isNaN(n)) { + n = 1; + } + + var index = this.center - n; + if (index >= this.count || index < 0) { + if (this.noWrap) { + return; + } + + index = this._wrap(index); + } + + this._cycleTo(index); + } + + /** + * Cycle to nth item + * @param {Number} [n] + * @param {Function} callback + */ + + }, { + key: "set", + value: function set(n, callback) { + if (n === undefined || isNaN(n)) { + n = 0; + } + + if (n > this.count || n < 0) { + if (this.noWrap) { + return; + } + + n = this._wrap(n); + } + + this._cycleTo(n, callback); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Carousel.__proto__ || Object.getPrototypeOf(Carousel), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Carousel; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Carousel; + }(Component); + + M.Carousel = Carousel; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Carousel, 'carousel', 'M_Carousel'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + onOpen: undefined, + onClose: undefined + }; + + /** + * @class + * + */ + + var TapTarget = function (_Component19) { + _inherits(TapTarget, _Component19); + + /** + * Construct TapTarget instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function TapTarget(el, options) { + _classCallCheck(this, TapTarget); + + var _this67 = _possibleConstructorReturn(this, (TapTarget.__proto__ || Object.getPrototypeOf(TapTarget)).call(this, TapTarget, el, options)); + + _this67.el.M_TapTarget = _this67; + + /** + * Options for the select + * @member TapTarget#options + * @prop {Function} onOpen - Callback function called when feature discovery is opened + * @prop {Function} onClose - Callback function called when feature discovery is closed + */ + _this67.options = $.extend({}, TapTarget.defaults, options); + + _this67.isOpen = false; + + // setup + _this67.$origin = $('#' + _this67.$el.attr('data-target')); + _this67._setup(); + + _this67._calculatePositioning(); + _this67._setupEventHandlers(); + return _this67; + } + + _createClass(TapTarget, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this.el.TapTarget = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleDocumentClickBound = this._handleDocumentClick.bind(this); + this._handleTargetClickBound = this._handleTargetClick.bind(this); + this._handleOriginClickBound = this._handleOriginClick.bind(this); + + this.el.addEventListener('click', this._handleTargetClickBound); + this.originEl.addEventListener('click', this._handleOriginClickBound); + + // Resize + var throttledResize = M.throttle(this._handleResize, 200); + this._handleThrottledResizeBound = throttledResize.bind(this); + + window.addEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('click', this._handleTargetClickBound); + this.originEl.removeEventListener('click', this._handleOriginClickBound); + window.removeEventListener('resize', this._handleThrottledResizeBound); + } + + /** + * Handle Target Click + * @param {Event} e + */ + + }, { + key: "_handleTargetClick", + value: function _handleTargetClick(e) { + this.open(); + } + + /** + * Handle Origin Click + * @param {Event} e + */ + + }, { + key: "_handleOriginClick", + value: function _handleOriginClick(e) { + this.close(); + } + + /** + * Handle Resize + * @param {Event} e + */ + + }, { + key: "_handleResize", + value: function _handleResize(e) { + this._calculatePositioning(); + } + + /** + * Handle Resize + * @param {Event} e + */ + + }, { + key: "_handleDocumentClick", + value: function _handleDocumentClick(e) { + if (!$(e.target).closest('.tap-target-wrapper').length) { + this.close(); + e.preventDefault(); + e.stopPropagation(); + } + } + + /** + * Setup Tap Target + */ + + }, { + key: "_setup", + value: function _setup() { + // Creating tap target + this.wrapper = this.$el.parent()[0]; + this.waveEl = $(this.wrapper).find('.tap-target-wave')[0]; + this.originEl = $(this.wrapper).find('.tap-target-origin')[0]; + this.contentEl = this.$el.find('.tap-target-content')[0]; + + // Creating wrapper + if (!$(this.wrapper).hasClass('.tap-target-wrapper')) { + this.wrapper = document.createElement('div'); + this.wrapper.classList.add('tap-target-wrapper'); + this.$el.before($(this.wrapper)); + this.wrapper.append(this.el); + } + + // Creating content + if (!this.contentEl) { + this.contentEl = document.createElement('div'); + this.contentEl.classList.add('tap-target-content'); + this.$el.append(this.contentEl); + } + + // Creating foreground wave + if (!this.waveEl) { + this.waveEl = document.createElement('div'); + this.waveEl.classList.add('tap-target-wave'); + + // Creating origin + if (!this.originEl) { + this.originEl = this.$origin.clone(true, true); + this.originEl.addClass('tap-target-origin'); + this.originEl.removeAttr('id'); + this.originEl.removeAttr('style'); + this.originEl = this.originEl[0]; + this.waveEl.append(this.originEl); + } + + this.wrapper.append(this.waveEl); + } + } + + /** + * Calculate positioning + */ + + }, { + key: "_calculatePositioning", + value: function _calculatePositioning() { + // Element or parent is fixed position? + var isFixed = this.$origin.css('position') === 'fixed'; + if (!isFixed) { + var parents = this.$origin.parents(); + for (var i = 0; i < parents.length; i++) { + isFixed = $(parents[i]).css('position') == 'fixed'; + if (isFixed) { + break; + } + } + } + + // Calculating origin + var originWidth = this.$origin.outerWidth(); + var originHeight = this.$origin.outerHeight(); + var originTop = isFixed ? this.$origin.offset().top - M.getDocumentScrollTop() : this.$origin.offset().top; + var originLeft = isFixed ? this.$origin.offset().left - M.getDocumentScrollLeft() : this.$origin.offset().left; + + // Calculating screen + var windowWidth = window.innerWidth; + var windowHeight = window.innerHeight; + var centerX = windowWidth / 2; + var centerY = windowHeight / 2; + var isLeft = originLeft <= centerX; + var isRight = originLeft > centerX; + var isTop = originTop <= centerY; + var isBottom = originTop > centerY; + var isCenterX = originLeft >= windowWidth * 0.25 && originLeft <= windowWidth * 0.75; + + // Calculating tap target + var tapTargetWidth = this.$el.outerWidth(); + var tapTargetHeight = this.$el.outerHeight(); + var tapTargetTop = originTop + originHeight / 2 - tapTargetHeight / 2; + var tapTargetLeft = originLeft + originWidth / 2 - tapTargetWidth / 2; + var tapTargetPosition = isFixed ? 'fixed' : 'absolute'; + + // Calculating content + var tapTargetTextWidth = isCenterX ? tapTargetWidth : tapTargetWidth / 2 + originWidth; + var tapTargetTextHeight = tapTargetHeight / 2; + var tapTargetTextTop = isTop ? tapTargetHeight / 2 : 0; + var tapTargetTextBottom = 0; + var tapTargetTextLeft = isLeft && !isCenterX ? tapTargetWidth / 2 - originWidth : 0; + var tapTargetTextRight = 0; + var tapTargetTextPadding = originWidth; + var tapTargetTextAlign = isBottom ? 'bottom' : 'top'; + + // Calculating wave + var tapTargetWaveWidth = originWidth > originHeight ? originWidth * 2 : originWidth * 2; + var tapTargetWaveHeight = tapTargetWaveWidth; + var tapTargetWaveTop = tapTargetHeight / 2 - tapTargetWaveHeight / 2; + var tapTargetWaveLeft = tapTargetWidth / 2 - tapTargetWaveWidth / 2; + + // Setting tap target + var tapTargetWrapperCssObj = {}; + tapTargetWrapperCssObj.top = isTop ? tapTargetTop + 'px' : ''; + tapTargetWrapperCssObj.right = isRight ? windowWidth - tapTargetLeft - tapTargetWidth + 'px' : ''; + tapTargetWrapperCssObj.bottom = isBottom ? windowHeight - tapTargetTop - tapTargetHeight + 'px' : ''; + tapTargetWrapperCssObj.left = isLeft ? tapTargetLeft + 'px' : ''; + tapTargetWrapperCssObj.position = tapTargetPosition; + $(this.wrapper).css(tapTargetWrapperCssObj); + + // Setting content + $(this.contentEl).css({ + width: tapTargetTextWidth + 'px', + height: tapTargetTextHeight + 'px', + top: tapTargetTextTop + 'px', + right: tapTargetTextRight + 'px', + bottom: tapTargetTextBottom + 'px', + left: tapTargetTextLeft + 'px', + padding: tapTargetTextPadding + 'px', + verticalAlign: tapTargetTextAlign + }); + + // Setting wave + $(this.waveEl).css({ + top: tapTargetWaveTop + 'px', + left: tapTargetWaveLeft + 'px', + width: tapTargetWaveWidth + 'px', + height: tapTargetWaveHeight + 'px' + }); + } + + /** + * Open TapTarget + */ + + }, { + key: "open", + value: function open() { + if (this.isOpen) { + return; + } + + // onOpen callback + if (typeof this.options.onOpen === 'function') { + this.options.onOpen.call(this, this.$origin[0]); + } + + this.isOpen = true; + this.wrapper.classList.add('open'); + + document.body.addEventListener('click', this._handleDocumentClickBound, true); + document.body.addEventListener('touchend', this._handleDocumentClickBound); + } + + /** + * Close Tap Target + */ + + }, { + key: "close", + value: function close() { + if (!this.isOpen) { + return; + } + + // onClose callback + if (typeof this.options.onClose === 'function') { + this.options.onClose.call(this, this.$origin[0]); + } + + this.isOpen = false; + this.wrapper.classList.remove('open'); + + document.body.removeEventListener('click', this._handleDocumentClickBound, true); + document.body.removeEventListener('touchend', this._handleDocumentClickBound); + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(TapTarget.__proto__ || Object.getPrototypeOf(TapTarget), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_TapTarget; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return TapTarget; + }(Component); + + M.TapTarget = TapTarget; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(TapTarget, 'tapTarget', 'M_TapTarget'); + } +})(cash); +;(function ($) { + 'use strict'; + + var _defaults = { + classes: '', + dropdownOptions: {} + }; + + /** + * @class + * + */ + + var FormSelect = function (_Component20) { + _inherits(FormSelect, _Component20); + + /** + * Construct FormSelect instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function FormSelect(el, options) { + _classCallCheck(this, FormSelect); + + // Don't init if browser default version + var _this68 = _possibleConstructorReturn(this, (FormSelect.__proto__ || Object.getPrototypeOf(FormSelect)).call(this, FormSelect, el, options)); + + if (_this68.$el.hasClass('browser-default')) { + return _possibleConstructorReturn(_this68); + } + + _this68.el.M_FormSelect = _this68; + + /** + * Options for the select + * @member FormSelect#options + */ + _this68.options = $.extend({}, FormSelect.defaults, options); + + _this68.isMultiple = _this68.$el.prop('multiple'); + + // Setup + _this68.el.tabIndex = -1; + _this68._keysSelected = {}; + _this68._valueDict = {}; // Maps key to original and generated option element. + _this68._setupDropdown(); + + _this68._setupEventHandlers(); + return _this68; + } + + _createClass(FormSelect, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this._removeDropdown(); + this.el.M_FormSelect = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + var _this69 = this; + + this._handleSelectChangeBound = this._handleSelectChange.bind(this); + this._handleOptionClickBound = this._handleOptionClick.bind(this); + this._handleInputClickBound = this._handleInputClick.bind(this); + + $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) { + el.addEventListener('click', _this69._handleOptionClickBound); + }); + this.el.addEventListener('change', this._handleSelectChangeBound); + this.input.addEventListener('click', this._handleInputClickBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + var _this70 = this; + + $(this.dropdownOptions).find('li:not(.optgroup)').each(function (el) { + el.removeEventListener('click', _this70._handleOptionClickBound); + }); + this.el.removeEventListener('change', this._handleSelectChangeBound); + this.input.removeEventListener('click', this._handleInputClickBound); + } + + /** + * Handle Select Change + * @param {Event} e + */ + + }, { + key: "_handleSelectChange", + value: function _handleSelectChange(e) { + this._setValueToInput(); + } + + /** + * Handle Option Click + * @param {Event} e + */ + + }, { + key: "_handleOptionClick", + value: function _handleOptionClick(e) { + e.preventDefault(); + var option = $(e.target).closest('li')[0]; + var key = option.id; + if (!$(option).hasClass('disabled') && !$(option).hasClass('optgroup') && key.length) { + var selected = true; + + if (this.isMultiple) { + // Deselect placeholder option if still selected. + var placeholderOption = $(this.dropdownOptions).find('li.disabled.selected'); + if (placeholderOption.length) { + placeholderOption.removeClass('selected'); + placeholderOption.find('input[type="checkbox"]').prop('checked', false); + this._toggleEntryFromArray(placeholderOption[0].id); + } + selected = this._toggleEntryFromArray(key); + } else { + $(this.dropdownOptions).find('li').removeClass('selected'); + $(option).toggleClass('selected', selected); + } + + // Set selected on original select option + // Only trigger if selected state changed + var prevSelected = $(this._valueDict[key].el).prop('selected'); + if (prevSelected !== selected) { + $(this._valueDict[key].el).prop('selected', selected); + this.$el.trigger('change'); + } + } + + e.stopPropagation(); + } + + /** + * Handle Input Click + */ + + }, { + key: "_handleInputClick", + value: function _handleInputClick() { + if (this.dropdown && this.dropdown.isOpen) { + this._setValueToInput(); + this._setSelectedStates(); + } + } + + /** + * Setup dropdown + */ + + }, { + key: "_setupDropdown", + value: function _setupDropdown() { + var _this71 = this; + + this.wrapper = document.createElement('div'); + $(this.wrapper).addClass('select-wrapper ' + this.options.classes); + this.$el.before($(this.wrapper)); + this.wrapper.appendChild(this.el); + + if (this.el.disabled) { + this.wrapper.classList.add('disabled'); + } + + // Create dropdown + this.$selectOptions = this.$el.children('option, optgroup'); + this.dropdownOptions = document.createElement('ul'); + this.dropdownOptions.id = "select-options-" + M.guid(); + $(this.dropdownOptions).addClass('dropdown-content select-dropdown ' + (this.isMultiple ? 'multiple-select-dropdown' : '')); + + // Create dropdown structure. + if (this.$selectOptions.length) { + this.$selectOptions.each(function (el) { + if ($(el).is('option')) { + // Direct descendant option. + var optionEl = void 0; + if (_this71.isMultiple) { + optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'multiple'); + } else { + optionEl = _this71._appendOptionWithIcon(_this71.$el, el); + } + + _this71._addOptionToValueDict(el, optionEl); + } else if ($(el).is('optgroup')) { + // Optgroup. + var selectOptions = $(el).children('option'); + $(_this71.dropdownOptions).append($('
  • ' + el.getAttribute('label') + '
  • ')[0]); + + selectOptions.each(function (el) { + var optionEl = _this71._appendOptionWithIcon(_this71.$el, el, 'optgroup-option'); + _this71._addOptionToValueDict(el, optionEl); + }); + } + }); + } + + this.$el.after(this.dropdownOptions); + + // Add input dropdown + this.input = document.createElement('input'); + $(this.input).addClass('select-dropdown dropdown-trigger'); + this.input.setAttribute('type', 'text'); + this.input.setAttribute('readonly', 'true'); + this.input.setAttribute('data-target', this.dropdownOptions.id); + if (this.el.disabled) { + $(this.input).prop('disabled', 'true'); + } + + this.$el.before(this.input); + this._setValueToInput(); + + // Add caret + var dropdownIcon = $(''); + this.$el.before(dropdownIcon[0]); + + // Initialize dropdown + if (!this.el.disabled) { + var dropdownOptions = $.extend({}, this.options.dropdownOptions); + + // Add callback for centering selected option when dropdown content is scrollable + dropdownOptions.onOpenEnd = function (el) { + var selectedOption = $(_this71.dropdownOptions).find('.selected').first(); + + if (selectedOption.length) { + // Focus selected option in dropdown + M.keyDown = true; + _this71.dropdown.focusedIndex = selectedOption.index(); + _this71.dropdown._focusFocusedItem(); + M.keyDown = false; + + // Handle scrolling to selected option + if (_this71.dropdown.isScrollable) { + var scrollOffset = selectedOption[0].getBoundingClientRect().top - _this71.dropdownOptions.getBoundingClientRect().top; // scroll to selected option + scrollOffset -= _this71.dropdownOptions.clientHeight / 2; // center in dropdown + _this71.dropdownOptions.scrollTop = scrollOffset; + } + } + }; + + if (this.isMultiple) { + dropdownOptions.closeOnClick = false; + } + this.dropdown = M.Dropdown.init(this.input, dropdownOptions); + } + + // Add initial selections + this._setSelectedStates(); + } + + /** + * Add option to value dict + * @param {Element} el original option element + * @param {Element} optionEl generated option element + */ + + }, { + key: "_addOptionToValueDict", + value: function _addOptionToValueDict(el, optionEl) { + var index = Object.keys(this._valueDict).length; + var key = this.dropdownOptions.id + index; + var obj = {}; + optionEl.id = key; + + obj.el = el; + obj.optionEl = optionEl; + this._valueDict[key] = obj; + } + + /** + * Remove dropdown + */ + + }, { + key: "_removeDropdown", + value: function _removeDropdown() { + $(this.wrapper).find('.caret').remove(); + $(this.input).remove(); + $(this.dropdownOptions).remove(); + $(this.wrapper).before(this.$el); + $(this.wrapper).remove(); + } + + /** + * Setup dropdown + * @param {Element} select select element + * @param {Element} option option element from select + * @param {String} type + * @return {Element} option element added + */ + + }, { + key: "_appendOptionWithIcon", + value: function _appendOptionWithIcon(select, option, type) { + // Add disabled attr if disabled + var disabledClass = option.disabled ? 'disabled ' : ''; + var optgroupClass = type === 'optgroup-option' ? 'optgroup-option ' : ''; + var multipleCheckbox = this.isMultiple ? "" : option.innerHTML; + var liEl = $('
  • '); + var spanEl = $(''); + spanEl.html(multipleCheckbox); + liEl.addClass(disabledClass + " " + optgroupClass); + liEl.append(spanEl); + + // add icons + var iconUrl = option.getAttribute('data-icon'); + if (!!iconUrl) { + var imgEl = $("\"\""); + liEl.prepend(imgEl); + } + + // Check for multiple type. + $(this.dropdownOptions).append(liEl[0]); + return liEl[0]; + } + + /** + * Toggle entry from option + * @param {String} key Option key + * @return {Boolean} if entry was added or removed + */ + + }, { + key: "_toggleEntryFromArray", + value: function _toggleEntryFromArray(key) { + var notAdded = !this._keysSelected.hasOwnProperty(key); + var $optionLi = $(this._valueDict[key].optionEl); + + if (notAdded) { + this._keysSelected[key] = true; + } else { + delete this._keysSelected[key]; + } + + $optionLi.toggleClass('selected', notAdded); + + // Set checkbox checked value + $optionLi.find('input[type="checkbox"]').prop('checked', notAdded); + + // use notAdded instead of true (to detect if the option is selected or not) + $optionLi.prop('selected', notAdded); + + return notAdded; + } + + /** + * Set text value to input + */ + + }, { + key: "_setValueToInput", + value: function _setValueToInput() { + var values = []; + var options = this.$el.find('option'); + + options.each(function (el) { + if ($(el).prop('selected')) { + var text = $(el).text(); + values.push(text); + } + }); + + if (!values.length) { + var firstDisabled = this.$el.find('option:disabled').eq(0); + if (firstDisabled.length && firstDisabled[0].value === '') { + values.push(firstDisabled.text()); + } + } + + this.input.value = values.join(', '); + } + + /** + * Set selected state of dropdown to match actual select element + */ + + }, { + key: "_setSelectedStates", + value: function _setSelectedStates() { + this._keysSelected = {}; + + for (var key in this._valueDict) { + var option = this._valueDict[key]; + var optionIsSelected = $(option.el).prop('selected'); + $(option.optionEl).find('input[type="checkbox"]').prop('checked', optionIsSelected); + if (optionIsSelected) { + this._activateOption($(this.dropdownOptions), $(option.optionEl)); + this._keysSelected[key] = true; + } else { + $(option.optionEl).removeClass('selected'); + } + } + } + + /** + * Make option as selected and scroll to selected position + * @param {jQuery} collection Select options jQuery element + * @param {Element} newOption element of the new option + */ + + }, { + key: "_activateOption", + value: function _activateOption(collection, newOption) { + if (newOption) { + if (!this.isMultiple) { + collection.find('li.selected').removeClass('selected'); + } + var option = $(newOption); + option.addClass('selected'); + } + } + + /** + * Get Selected Values + * @return {Array} Array of selected values + */ + + }, { + key: "getSelectedValues", + value: function getSelectedValues() { + var selectedValues = []; + for (var key in this._keysSelected) { + selectedValues.push(this._valueDict[key].el.value); + } + return selectedValues; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(FormSelect.__proto__ || Object.getPrototypeOf(FormSelect), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_FormSelect; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return FormSelect; + }(Component); + + M.FormSelect = FormSelect; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(FormSelect, 'formSelect', 'M_FormSelect'); + } +})(cash); +;(function ($, anim) { + 'use strict'; + + var _defaults = {}; + + /** + * @class + * + */ + + var Range = function (_Component21) { + _inherits(Range, _Component21); + + /** + * Construct Range instance + * @constructor + * @param {Element} el + * @param {Object} options + */ + function Range(el, options) { + _classCallCheck(this, Range); + + var _this72 = _possibleConstructorReturn(this, (Range.__proto__ || Object.getPrototypeOf(Range)).call(this, Range, el, options)); + + _this72.el.M_Range = _this72; + + /** + * Options for the range + * @member Range#options + */ + _this72.options = $.extend({}, Range.defaults, options); + + _this72._mousedown = false; + + // Setup + _this72._setupThumb(); + + _this72._setupEventHandlers(); + return _this72; + } + + _createClass(Range, [{ + key: "destroy", + + + /** + * Teardown component + */ + value: function destroy() { + this._removeEventHandlers(); + this._removeThumb(); + this.el.M_Range = undefined; + } + + /** + * Setup Event Handlers + */ + + }, { + key: "_setupEventHandlers", + value: function _setupEventHandlers() { + this._handleRangeChangeBound = this._handleRangeChange.bind(this); + this._handleRangeMousedownTouchstartBound = this._handleRangeMousedownTouchstart.bind(this); + this._handleRangeInputMousemoveTouchmoveBound = this._handleRangeInputMousemoveTouchmove.bind(this); + this._handleRangeMouseupTouchendBound = this._handleRangeMouseupTouchend.bind(this); + this._handleRangeBlurMouseoutTouchleaveBound = this._handleRangeBlurMouseoutTouchleave.bind(this); + + this.el.addEventListener('change', this._handleRangeChangeBound); + + this.el.addEventListener('mousedown', this._handleRangeMousedownTouchstartBound); + this.el.addEventListener('touchstart', this._handleRangeMousedownTouchstartBound); + + this.el.addEventListener('input', this._handleRangeInputMousemoveTouchmoveBound); + this.el.addEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound); + this.el.addEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound); + + this.el.addEventListener('mouseup', this._handleRangeMouseupTouchendBound); + this.el.addEventListener('touchend', this._handleRangeMouseupTouchendBound); + + this.el.addEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.addEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.addEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound); + } + + /** + * Remove Event Handlers + */ + + }, { + key: "_removeEventHandlers", + value: function _removeEventHandlers() { + this.el.removeEventListener('change', this._handleRangeChangeBound); + + this.el.removeEventListener('mousedown', this._handleRangeMousedownTouchstartBound); + this.el.removeEventListener('touchstart', this._handleRangeMousedownTouchstartBound); + + this.el.removeEventListener('input', this._handleRangeInputMousemoveTouchmoveBound); + this.el.removeEventListener('mousemove', this._handleRangeInputMousemoveTouchmoveBound); + this.el.removeEventListener('touchmove', this._handleRangeInputMousemoveTouchmoveBound); + + this.el.removeEventListener('mouseup', this._handleRangeMouseupTouchendBound); + this.el.removeEventListener('touchend', this._handleRangeMouseupTouchendBound); + + this.el.removeEventListener('blur', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.removeEventListener('mouseout', this._handleRangeBlurMouseoutTouchleaveBound); + this.el.removeEventListener('touchleave', this._handleRangeBlurMouseoutTouchleaveBound); + } + + /** + * Handle Range Change + * @param {Event} e + */ + + }, { + key: "_handleRangeChange", + value: function _handleRangeChange() { + $(this.value).html(this.$el.val()); + + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + } + + /** + * Handle Range Mousedown and Touchstart + * @param {Event} e + */ + + }, { + key: "_handleRangeMousedownTouchstart", + value: function _handleRangeMousedownTouchstart(e) { + // Set indicator value + $(this.value).html(this.$el.val()); + + this._mousedown = true; + this.$el.addClass('active'); + + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + if (e.type !== 'input') { + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + } + } + + /** + * Handle Range Input, Mousemove and Touchmove + */ + + }, { + key: "_handleRangeInputMousemoveTouchmove", + value: function _handleRangeInputMousemoveTouchmove() { + if (this._mousedown) { + if (!$(this.thumb).hasClass('active')) { + this._showRangeBubble(); + } + + var offsetLeft = this._calcRangeOffset(); + $(this.thumb).addClass('active').css('left', offsetLeft + 'px'); + $(this.value).html(this.$el.val()); + } + } + + /** + * Handle Range Mouseup and Touchend + */ + + }, { + key: "_handleRangeMouseupTouchend", + value: function _handleRangeMouseupTouchend() { + this._mousedown = false; + this.$el.removeClass('active'); + } + + /** + * Handle Range Blur, Mouseout and Touchleave + */ + + }, { + key: "_handleRangeBlurMouseoutTouchleave", + value: function _handleRangeBlurMouseoutTouchleave() { + if (!this._mousedown) { + var paddingLeft = parseInt(this.$el.css('padding-left')); + var marginLeft = 7 + paddingLeft + 'px'; + + if ($(this.thumb).hasClass('active')) { + anim.remove(this.thumb); + anim({ + targets: this.thumb, + height: 0, + width: 0, + top: 10, + easing: 'easeOutQuad', + marginLeft: marginLeft, + duration: 100 + }); + } + $(this.thumb).removeClass('active'); + } + } + + /** + * Setup dropdown + */ + + }, { + key: "_setupThumb", + value: function _setupThumb() { + this.thumb = document.createElement('span'); + this.value = document.createElement('span'); + $(this.thumb).addClass('thumb'); + $(this.value).addClass('value'); + $(this.thumb).append(this.value); + this.$el.after(this.thumb); + } + + /** + * Remove dropdown + */ + + }, { + key: "_removeThumb", + value: function _removeThumb() { + $(this.thumb).remove(); + } + + /** + * morph thumb into bubble + */ + + }, { + key: "_showRangeBubble", + value: function _showRangeBubble() { + var paddingLeft = parseInt($(this.thumb).parent().css('padding-left')); + var marginLeft = -7 + paddingLeft + 'px'; // TODO: fix magic number? + anim.remove(this.thumb); + anim({ + targets: this.thumb, + height: 30, + width: 30, + top: -30, + marginLeft: marginLeft, + duration: 300, + easing: 'easeOutQuint' + }); + } + + /** + * Calculate the offset of the thumb + * @return {Number} offset in pixels + */ + + }, { + key: "_calcRangeOffset", + value: function _calcRangeOffset() { + var width = this.$el.width() - 15; + var max = parseFloat(this.$el.attr('max')) || 100; // Range default max + var min = parseFloat(this.$el.attr('min')) || 0; // Range default min + var percent = (parseFloat(this.$el.val()) - min) / (max - min); + return percent * width; + } + }], [{ + key: "init", + value: function init(els, options) { + return _get(Range.__proto__ || Object.getPrototypeOf(Range), "init", this).call(this, this, els, options); + } + + /** + * Get Instance + */ + + }, { + key: "getInstance", + value: function getInstance(el) { + var domElem = !!el.jquery ? el[0] : el; + return domElem.M_Range; + } + }, { + key: "defaults", + get: function () { + return _defaults; + } + }]); + + return Range; + }(Component); + + M.Range = Range; + + if (M.jQueryLoaded) { + M.initializeJqueryWrapper(Range, 'range', 'M_Range'); + } + + Range.init($('input[type=range]')); +})(cash, M.anime); diff --git a/Timelapse/ServerFiles/js/materialize.min.js b/Timelapse/ServerFiles/js/materialize.min.js new file mode 100644 index 0000000..4ff077d --- /dev/null +++ b/Timelapse/ServerFiles/js/materialize.min.js @@ -0,0 +1,6 @@ +/*! + * Materialize v1.0.0 (http://materializecss.com) + * Copyright 2014-2017 Materialize + * MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE) + */ +var _get=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;return void 0!==a?a.call(n):void 0},_createClass=function(){function n(t,e){for(var i=0;i/,p=/^\w+$/;function v(t,e){e=e||o;var i=u.test(t)?e.getElementsByClassName(t.slice(1)):p.test(t)?e.getElementsByTagName(t):e.querySelectorAll(t);return i}function f(t){if(!i){var e=(i=o.implementation.createHTMLDocument(null)).createElement("base");e.href=o.location.href,i.head.appendChild(e)}return i.body.innerHTML=t,i.body.childNodes}function m(t){"loading"!==o.readyState?t():o.addEventListener("DOMContentLoaded",t)}function g(t,e){if(!t)return this;if(t.cash&&t!==a)return t;var i,n=t,s=0;if(d(t))n=l.test(t)?o.getElementById(t.slice(1)):c.test(t)?f(t):v(t,e);else if(h(t))return m(t),this;if(!n)return this;if(n.nodeType||n===a)this[0]=n,this.length=1;else for(i=this.length=n.length;ss.right-i||l+e.width>window.innerWidth-i)&&(n.right=!0),(ho-i||h+e.height>window.innerHeight-i)&&(n.bottom=!0),n},M.checkPossibleAlignments=function(t,e,i,n){var s={top:!0,right:!0,bottom:!0,left:!0,spaceOnTop:null,spaceOnRight:null,spaceOnBottom:null,spaceOnLeft:null},o="visible"===getComputedStyle(e).overflow,a=e.getBoundingClientRect(),r=Math.min(a.height,window.innerHeight),l=Math.min(a.width,window.innerWidth),h=t.getBoundingClientRect(),d=e.scrollLeft,u=e.scrollTop,c=i.left-d,p=i.top-u,v=i.top+h.height-u;return s.spaceOnRight=o?window.innerWidth-(h.left+i.width):l-(c+i.width),s.spaceOnRight<0&&(s.left=!1),s.spaceOnLeft=o?h.right-i.width:c-i.width+h.width,s.spaceOnLeft<0&&(s.right=!1),s.spaceOnBottom=o?window.innerHeight-(h.top+i.height+n):r-(p+i.height+n),s.spaceOnBottom<0&&(s.top=!1),s.spaceOnTop=o?h.bottom-(i.height+n):v-(i.height-n),s.spaceOnTop<0&&(s.bottom=!1),s},M.getOverflowParent=function(t){return null==t?null:t===document.body||"visible"!==getComputedStyle(t).overflow?t:M.getOverflowParent(t.parentElement)},M.getIdFromTrigger=function(t){var e=t.getAttribute("data-target");return e||(e=(e=t.getAttribute("href"))?e.slice(1):""),e},M.getDocumentScrollTop=function(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},M.getDocumentScrollLeft=function(){return window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0};var getTime=Date.now||function(){return(new Date).getTime()};M.throttle=function(i,n,s){var o=void 0,a=void 0,r=void 0,l=null,h=0;s||(s={});var d=function(){h=!1===s.leading?0:getTime(),l=null,r=i.apply(o,a),o=a=null};return function(){var t=getTime();h||!1!==s.leading||(h=t);var e=n-(t-h);return o=this,a=arguments,e<=0?(clearTimeout(l),l=null,h=t,r=i.apply(o,a),o=a=null):l||!1===s.trailing||(l=setTimeout(d,e)),r}};var $jscomp={scope:{}};$jscomp.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(t,e,i){if(i.get||i.set)throw new TypeError("ES3 does not support getters and setters.");t!=Array.prototype&&t!=Object.prototype&&(t[e]=i.value)},$jscomp.getGlobal=function(t){return"undefined"!=typeof window&&window===t?t:"undefined"!=typeof global&&null!=global?global:t},$jscomp.global=$jscomp.getGlobal(this),$jscomp.SYMBOL_PREFIX="jscomp_symbol_",$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){},$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)},$jscomp.symbolCounter_=0,$jscomp.Symbol=function(t){return $jscomp.SYMBOL_PREFIX+(t||"")+$jscomp.symbolCounter_++},$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var t=$jscomp.global.Symbol.iterator;t||(t=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("iterator")),"function"!=typeof Array.prototype[t]&&$jscomp.defineProperty(Array.prototype,t,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}}),$jscomp.initSymbolIterator=function(){}},$jscomp.arrayIterator=function(t){var e=0;return $jscomp.iteratorPrototype(function(){return e=k.currentTime)for(var h=0;ht&&(s.duration=e.duration),s.children.push(e)}),s.seek(0),s.reset(),s.autoplay&&s.restart(),s},s},O.random=function(t,e){return Math.floor(Math.random()*(e-t+1))+t},O}(),function(r,l){"use strict";var e={accordion:!0,onOpenStart:void 0,onOpenEnd:void 0,onCloseStart:void 0,onCloseEnd:void 0,inDuration:300,outDuration:300},t=function(t){function s(t,e){_classCallCheck(this,s);var i=_possibleConstructorReturn(this,(s.__proto__||Object.getPrototypeOf(s)).call(this,s,t,e));(i.el.M_Collapsible=i).options=r.extend({},s.defaults,e),i.$headers=i.$el.children("li").children(".collapsible-header"),i.$headers.attr("tabindex",0),i._setupEventHandlers();var n=i.$el.children("li.active").children(".collapsible-body");return i.options.accordion?n.first().css("display","block"):n.css("display","block"),i}return _inherits(s,Component),_createClass(s,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Collapsible=void 0}},{key:"_setupEventHandlers",value:function(){var e=this;this._handleCollapsibleClickBound=this._handleCollapsibleClick.bind(this),this._handleCollapsibleKeydownBound=this._handleCollapsibleKeydown.bind(this),this.el.addEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.addEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_removeEventHandlers",value:function(){var e=this;this.el.removeEventListener("click",this._handleCollapsibleClickBound),this.$headers.each(function(t){t.removeEventListener("keydown",e._handleCollapsibleKeydownBound)})}},{key:"_handleCollapsibleClick",value:function(t){var e=r(t.target).closest(".collapsible-header");if(t.target&&e.length){var i=e.closest(".collapsible");if(i[0]===this.el){var n=e.closest("li"),s=i.children("li"),o=n[0].classList.contains("active"),a=s.index(n);o?this.close(a):this.open(a)}}}},{key:"_handleCollapsibleKeydown",value:function(t){13===t.keyCode&&this._handleCollapsibleClickBound(t)}},{key:"_animateIn",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css({display:"block",overflow:"hidden",height:0,paddingTop:"",paddingBottom:""});var s=n.css("padding-top"),o=n.css("padding-bottom"),a=n[0].scrollHeight;n.css({paddingTop:0,paddingBottom:0}),l({targets:n[0],height:a,paddingTop:s,paddingBottom:o,duration:this.options.inDuration,easing:"easeInOutCubic",complete:function(t){n.css({overflow:"",paddingTop:"",paddingBottom:"",height:""}),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,i[0])}})}}},{key:"_animateOut",value:function(t){var e=this,i=this.$el.children("li").eq(t);if(i.length){var n=i.children(".collapsible-body");l.remove(n[0]),n.css("overflow","hidden"),l({targets:n[0],height:0,paddingTop:0,paddingBottom:0,duration:this.options.outDuration,easing:"easeInOutCubic",complete:function(){n.css({height:"",overflow:"",padding:"",display:""}),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,i[0])}})}}},{key:"open",value:function(t){var i=this,e=this.$el.children("li").eq(t);if(e.length&&!e[0].classList.contains("active")){if("function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,e[0]),this.options.accordion){var n=this.$el.children("li");this.$el.children("li.active").each(function(t){var e=n.index(r(t));i.close(e)})}e[0].classList.add("active"),this._animateIn(t)}}},{key:"close",value:function(t){var e=this.$el.children("li").eq(t);e.length&&e[0].classList.contains("active")&&("function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,e[0]),e[0].classList.remove("active"),this._animateOut(t))}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Collapsible}},{key:"defaults",get:function(){return e}}]),s}();M.Collapsible=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"collapsible","M_Collapsible")}(cash,M.anime),function(h,i){"use strict";var e={alignment:"left",autoFocus:!0,constrainWidth:!0,container:null,coverTrigger:!0,closeOnClick:!0,hover:!1,inDuration:150,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onItemClick:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return i.el.M_Dropdown=i,n._dropdowns.push(i),i.id=M.getIdFromTrigger(t),i.dropdownEl=document.getElementById(i.id),i.$dropdownEl=h(i.dropdownEl),i.options=h.extend({},n.defaults,e),i.isOpen=!1,i.isScrollable=!1,i.isTouchMoving=!1,i.focusedIndex=-1,i.filterQuery=[],i.options.container?h(i.options.container).append(i.dropdownEl):i.$el.after(i.dropdownEl),i._makeDropdownFocusable(),i._resetFilterQueryBound=i._resetFilterQuery.bind(i),i._handleDocumentClickBound=i._handleDocumentClick.bind(i),i._handleDocumentTouchmoveBound=i._handleDocumentTouchmove.bind(i),i._handleDropdownClickBound=i._handleDropdownClick.bind(i),i._handleDropdownKeydownBound=i._handleDropdownKeydown.bind(i),i._handleTriggerKeydownBound=i._handleTriggerKeydown.bind(i),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._resetDropdownStyles(),this._removeEventHandlers(),n._dropdowns.splice(n._dropdowns.indexOf(this),1),this.el.M_Dropdown=void 0}},{key:"_setupEventHandlers",value:function(){this.el.addEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.addEventListener("click",this._handleDropdownClickBound),this.options.hover?(this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.addEventListener("mouseleave",this._handleMouseLeaveBound)):(this._handleClickBound=this._handleClick.bind(this),this.el.addEventListener("click",this._handleClickBound))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("keydown",this._handleTriggerKeydownBound),this.dropdownEl.removeEventListener("click",this._handleDropdownClickBound),this.options.hover?(this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.dropdownEl.removeEventListener("mouseleave",this._handleMouseLeaveBound)):this.el.removeEventListener("click",this._handleClickBound)}},{key:"_setupTemporaryEventHandlers",value:function(){document.body.addEventListener("click",this._handleDocumentClickBound,!0),document.body.addEventListener("touchend",this._handleDocumentClickBound),document.body.addEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.addEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_removeTemporaryEventHandlers",value:function(){document.body.removeEventListener("click",this._handleDocumentClickBound,!0),document.body.removeEventListener("touchend",this._handleDocumentClickBound),document.body.removeEventListener("touchmove",this._handleDocumentTouchmoveBound),this.dropdownEl.removeEventListener("keydown",this._handleDropdownKeydownBound)}},{key:"_handleClick",value:function(t){t.preventDefault(),this.open()}},{key:"_handleMouseEnter",value:function(){this.open()}},{key:"_handleMouseLeave",value:function(t){var e=t.toElement||t.relatedTarget,i=!!h(e).closest(".dropdown-content").length,n=!1,s=h(e).closest(".dropdown-trigger");s.length&&s[0].M_Dropdown&&s[0].M_Dropdown.isOpen&&(n=!0),n||i||this.close()}},{key:"_handleDocumentClick",value:function(t){var e=this,i=h(t.target);this.options.closeOnClick&&i.closest(".dropdown-content").length&&!this.isTouchMoving?setTimeout(function(){e.close()},0):!i.closest(".dropdown-trigger").length&&i.closest(".dropdown-content").length||setTimeout(function(){e.close()},0),this.isTouchMoving=!1}},{key:"_handleTriggerKeydown",value:function(t){t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ENTER||this.isOpen||(t.preventDefault(),this.open())}},{key:"_handleDocumentTouchmove",value:function(t){h(t.target).closest(".dropdown-content").length&&(this.isTouchMoving=!0)}},{key:"_handleDropdownClick",value:function(t){if("function"==typeof this.options.onItemClick){var e=h(t.target).closest("li")[0];this.options.onItemClick.call(this,e)}}},{key:"_handleDropdownKeydown",value:function(t){if(t.which===M.keys.TAB)t.preventDefault(),this.close();else if(t.which!==M.keys.ARROW_DOWN&&t.which!==M.keys.ARROW_UP||!this.isOpen)if(t.which===M.keys.ENTER&&this.isOpen){var e=this.dropdownEl.children[this.focusedIndex],i=h(e).find("a, button").first();i.length?i[0].click():e&&e.click()}else t.which===M.keys.ESC&&this.isOpen&&(t.preventDefault(),this.close());else{t.preventDefault();var n=t.which===M.keys.ARROW_DOWN?1:-1,s=this.focusedIndex,o=!1;do{if(s+=n,this.dropdownEl.children[s]&&-1!==this.dropdownEl.children[s].tabIndex){o=!0;break}}while(sl.spaceOnBottom?(h="bottom",i+=l.spaceOnTop,o-=l.spaceOnTop):i+=l.spaceOnBottom)),!l[d]){var u="left"===d?"right":"left";l[u]?d=u:l.spaceOnLeft>l.spaceOnRight?(d="right",n+=l.spaceOnLeft,s-=l.spaceOnLeft):(d="left",n+=l.spaceOnRight)}return"bottom"===h&&(o=o-e.height+(this.options.coverTrigger?t.height:0)),"right"===d&&(s=s-e.width+t.width),{x:s,y:o,verticalAlignment:h,horizontalAlignment:d,height:i,width:n}}},{key:"_animateIn",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:[0,1],easing:"easeOutQuad"},scaleX:[.3,1],scaleY:[.3,1],duration:this.options.inDuration,easing:"easeOutQuint",complete:function(t){e.options.autoFocus&&e.dropdownEl.focus(),"function"==typeof e.options.onOpenEnd&&e.options.onOpenEnd.call(e,e.el)}})}},{key:"_animateOut",value:function(){var e=this;i.remove(this.dropdownEl),i({targets:this.dropdownEl,opacity:{value:0,easing:"easeOutQuint"},scaleX:.3,scaleY:.3,duration:this.options.outDuration,easing:"easeOutQuint",complete:function(t){e._resetDropdownStyles(),"function"==typeof e.options.onCloseEnd&&e.options.onCloseEnd.call(e,e.el)}})}},{key:"_placeDropdown",value:function(){var t=this.options.constrainWidth?this.el.getBoundingClientRect().width:this.dropdownEl.getBoundingClientRect().width;this.dropdownEl.style.width=t+"px";var e=this._getDropdownPosition();this.dropdownEl.style.left=e.x+"px",this.dropdownEl.style.top=e.y+"px",this.dropdownEl.style.height=e.height+"px",this.dropdownEl.style.width=e.width+"px",this.dropdownEl.style.transformOrigin=("left"===e.horizontalAlignment?"0":"100%")+" "+("top"===e.verticalAlignment?"0":"100%")}},{key:"open",value:function(){this.isOpen||(this.isOpen=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this._resetDropdownStyles(),this.dropdownEl.style.display="block",this._placeDropdown(),this._animateIn(),this._setupTemporaryEventHandlers())}},{key:"close",value:function(){this.isOpen&&(this.isOpen=!1,this.focusedIndex=-1,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this._animateOut(),this._removeTemporaryEventHandlers(),this.options.autoFocus&&this.el.focus())}},{key:"recalculateDimensions",value:function(){this.isOpen&&(this.$dropdownEl.css({width:"",height:"",left:"",top:"","transform-origin":""}),this._placeDropdown())}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Dropdown}},{key:"defaults",get:function(){return e}}]),n}();t._dropdowns=[],M.Dropdown=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"dropdown","M_Dropdown")}(cash,M.anime),function(s,i){"use strict";var e={opacity:.5,inDuration:250,outDuration:250,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,preventScrolling:!0,dismissible:!0,startingTop:"4%",endingTop:"10%"},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Modal=i).options=s.extend({},n.defaults,e),i.isOpen=!1,i.id=i.$el.attr("id"),i._openingTrigger=void 0,i.$overlay=s(''),i.el.tabIndex=0,i._nthModalOpened=0,n._count++,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._count--,this._removeEventHandlers(),this.el.removeAttribute("style"),this.$overlay.remove(),this.el.M_Modal=void 0}},{key:"_setupEventHandlers",value:function(){this._handleOverlayClickBound=this._handleOverlayClick.bind(this),this._handleModalCloseClickBound=this._handleModalCloseClick.bind(this),1===n._count&&document.body.addEventListener("click",this._handleTriggerClick),this.$overlay[0].addEventListener("click",this._handleOverlayClickBound),this.el.addEventListener("click",this._handleModalCloseClickBound)}},{key:"_removeEventHandlers",value:function(){0===n._count&&document.body.removeEventListener("click",this._handleTriggerClick),this.$overlay[0].removeEventListener("click",this._handleOverlayClickBound),this.el.removeEventListener("click",this._handleModalCloseClickBound)}},{key:"_handleTriggerClick",value:function(t){var e=s(t.target).closest(".modal-trigger");if(e.length){var i=M.getIdFromTrigger(e[0]),n=document.getElementById(i).M_Modal;n&&n.open(e),t.preventDefault()}}},{key:"_handleOverlayClick",value:function(){this.options.dismissible&&this.close()}},{key:"_handleModalCloseClick",value:function(t){s(t.target).closest(".modal-close").length&&this.close()}},{key:"_handleKeydown",value:function(t){27===t.keyCode&&this.options.dismissible&&this.close()}},{key:"_handleFocus",value:function(t){this.el.contains(t.target)||this._nthModalOpened!==n._modalsOpen||this.el.focus()}},{key:"_animateIn",value:function(){var t=this;s.extend(this.el.style,{display:"block",opacity:0}),s.extend(this.$overlay[0].style,{display:"block",opacity:0}),i({targets:this.$overlay[0],opacity:this.options.opacity,duration:this.options.inDuration,easing:"easeOutQuad"});var e={targets:this.el,duration:this.options.inDuration,easing:"easeOutCubic",complete:function(){"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el,t._openingTrigger)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:0,opacity:1}):s.extend(e,{top:[this.options.startingTop,this.options.endingTop],opacity:1,scaleX:[.8,1],scaleY:[.8,1]}),i(e)}},{key:"_animateOut",value:function(){var t=this;i({targets:this.$overlay[0],opacity:0,duration:this.options.outDuration,easing:"easeOutQuart"});var e={targets:this.el,duration:this.options.outDuration,easing:"easeOutCubic",complete:function(){t.el.style.display="none",t.$overlay.remove(),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};this.el.classList.contains("bottom-sheet")?s.extend(e,{bottom:"-100%",opacity:0}):s.extend(e,{top:[this.options.endingTop,this.options.startingTop],opacity:0,scaleX:.8,scaleY:.8}),i(e)}},{key:"open",value:function(t){if(!this.isOpen)return this.isOpen=!0,n._modalsOpen++,this._nthModalOpened=n._modalsOpen,this.$overlay[0].style.zIndex=1e3+2*n._modalsOpen,this.el.style.zIndex=1e3+2*n._modalsOpen+1,this._openingTrigger=t?t[0]:void 0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el,this._openingTrigger),this.options.preventScrolling&&(document.body.style.overflow="hidden"),this.el.classList.add("open"),this.el.insertAdjacentElement("afterend",this.$overlay[0]),this.options.dismissible&&(this._handleKeydownBound=this._handleKeydown.bind(this),this._handleFocusBound=this._handleFocus.bind(this),document.addEventListener("keydown",this._handleKeydownBound),document.addEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateIn(),this.el.focus(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,n._modalsOpen--,this._nthModalOpened=0,"function"==typeof this.options.onCloseStart&&this.options.onCloseStart.call(this,this.el),this.el.classList.remove("open"),0===n._modalsOpen&&(document.body.style.overflow=""),this.options.dismissible&&(document.removeEventListener("keydown",this._handleKeydownBound),document.removeEventListener("focus",this._handleFocusBound,!0)),i.remove(this.el),i.remove(this.$overlay[0]),this._animateOut(),this}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Modal}},{key:"defaults",get:function(){return e}}]),n}();t._modalsOpen=0,t._count=0,M.Modal=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"modal","M_Modal")}(cash,M.anime),function(o,a){"use strict";var e={inDuration:275,outDuration:200,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Materialbox=i).options=o.extend({},n.defaults,e),i.overlayActive=!1,i.doneAnimating=!0,i.placeholder=o("
    ").addClass("material-placeholder"),i.originalWidth=0,i.originalHeight=0,i.originInlineStyles=i.$el.attr("style"),i.caption=i.el.getAttribute("data-caption")||"",i.$el.before(i.placeholder),i.placeholder.append(i.$el),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Materialbox=void 0,o(this.placeholder).after(this.el).remove(),this.$el.removeAttr("style")}},{key:"_setupEventHandlers",value:function(){this._handleMaterialboxClickBound=this._handleMaterialboxClick.bind(this),this.el.addEventListener("click",this._handleMaterialboxClickBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleMaterialboxClickBound)}},{key:"_handleMaterialboxClick",value:function(t){!1===this.doneAnimating||this.overlayActive&&this.doneAnimating?this.close():this.open()}},{key:"_handleWindowScroll",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowResize",value:function(){this.overlayActive&&this.close()}},{key:"_handleWindowEscape",value:function(t){27===t.keyCode&&this.doneAnimating&&this.overlayActive&&this.close()}},{key:"_makeAncestorsOverflowVisible",value:function(){this.ancestorsChanged=o();for(var t=this.placeholder[0].parentNode;null!==t&&!o(t).is(document);){var e=o(t);"visible"!==e.css("overflow")&&(e.css("overflow","visible"),void 0===this.ancestorsChanged?this.ancestorsChanged=e:this.ancestorsChanged=this.ancestorsChanged.add(e)),t=t.parentNode}}},{key:"_animateImageIn",value:function(){var t=this,e={targets:this.el,height:[this.originalHeight,this.newHeight],width:[this.originalWidth,this.newWidth],left:M.getDocumentScrollLeft()+this.windowWidth/2-this.placeholder.offset().left-this.newWidth/2,top:M.getDocumentScrollTop()+this.windowHeight/2-this.placeholder.offset().top-this.newHeight/2,duration:this.options.inDuration,easing:"easeOutQuad",complete:function(){t.doneAnimating=!0,"function"==typeof t.options.onOpenEnd&&t.options.onOpenEnd.call(t,t.el)}};this.maxWidth=this.$el.css("max-width"),this.maxHeight=this.$el.css("max-height"),"none"!==this.maxWidth&&(e.maxWidth=this.newWidth),"none"!==this.maxHeight&&(e.maxHeight=this.newHeight),a(e)}},{key:"_animateImageOut",value:function(){var t=this,e={targets:this.el,width:this.originalWidth,height:this.originalHeight,left:0,top:0,duration:this.options.outDuration,easing:"easeOutQuad",complete:function(){t.placeholder.css({height:"",width:"",position:"",top:"",left:""}),t.attrWidth&&t.$el.attr("width",t.attrWidth),t.attrHeight&&t.$el.attr("height",t.attrHeight),t.$el.removeAttr("style"),t.originInlineStyles&&t.$el.attr("style",t.originInlineStyles),t.$el.removeClass("active"),t.doneAnimating=!0,t.ancestorsChanged.length&&t.ancestorsChanged.css("overflow",""),"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t,t.el)}};a(e)}},{key:"_updateVars",value:function(){this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight,this.caption=this.el.getAttribute("data-caption")||""}},{key:"open",value:function(){var t=this;this._updateVars(),this.originalWidth=this.el.getBoundingClientRect().width,this.originalHeight=this.el.getBoundingClientRect().height,this.doneAnimating=!1,this.$el.addClass("active"),this.overlayActive=!0,"function"==typeof this.options.onOpenStart&&this.options.onOpenStart.call(this,this.el),this.placeholder.css({width:this.placeholder[0].getBoundingClientRect().width+"px",height:this.placeholder[0].getBoundingClientRect().height+"px",position:"relative",top:0,left:0}),this._makeAncestorsOverflowVisible(),this.$el.css({position:"absolute","z-index":1e3,"will-change":"left, top, width, height"}),this.attrWidth=this.$el.attr("width"),this.attrHeight=this.$el.attr("height"),this.attrWidth&&(this.$el.css("width",this.attrWidth+"px"),this.$el.removeAttr("width")),this.attrHeight&&(this.$el.css("width",this.attrHeight+"px"),this.$el.removeAttr("height")),this.$overlay=o('
    ').css({opacity:0}).one("click",function(){t.doneAnimating&&t.close()}),this.$el.before(this.$overlay);var e=this.$overlay[0].getBoundingClientRect();this.$overlay.css({width:this.windowWidth+"px",height:this.windowHeight+"px",left:-1*e.left+"px",top:-1*e.top+"px"}),a.remove(this.el),a.remove(this.$overlay[0]),a({targets:this.$overlay[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}),""!==this.caption&&(this.$photocaption&&a.remove(this.$photoCaption[0]),this.$photoCaption=o('
    '),this.$photoCaption.text(this.caption),o("body").append(this.$photoCaption),this.$photoCaption.css({display:"inline"}),a({targets:this.$photoCaption[0],opacity:1,duration:this.options.inDuration,easing:"easeOutQuad"}));var i=0,n=this.originalWidth/this.windowWidth,s=this.originalHeight/this.windowHeight;this.newWidth=0,this.newHeight=0,si.options.responsiveThreshold,i.$img=i.$el.find("img").first(),i.$img.each(function(){this.complete&&s(this).trigger("load")}),i._updateParallax(),i._setupEventHandlers(),i._setupStyles(),n._parallaxes.push(i),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){n._parallaxes.splice(n._parallaxes.indexOf(this),1),this.$img[0].style.transform="",this._removeEventHandlers(),this.$el[0].M_Parallax=void 0}},{key:"_setupEventHandlers",value:function(){this._handleImageLoadBound=this._handleImageLoad.bind(this),this.$img[0].addEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(n._handleScrollThrottled=M.throttle(n._handleScroll,5),window.addEventListener("scroll",n._handleScrollThrottled),n._handleWindowResizeThrottled=M.throttle(n._handleWindowResize,5),window.addEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_removeEventHandlers",value:function(){this.$img[0].removeEventListener("load",this._handleImageLoadBound),0===n._parallaxes.length&&(window.removeEventListener("scroll",n._handleScrollThrottled),window.removeEventListener("resize",n._handleWindowResizeThrottled))}},{key:"_setupStyles",value:function(){this.$img[0].style.opacity=1}},{key:"_handleImageLoad",value:function(){this._updateParallax()}},{key:"_updateParallax",value:function(){var t=0e.options.responsiveThreshold}}},{key:"defaults",get:function(){return e}}]),n}();t._parallaxes=[],M.Parallax=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"parallax","M_Parallax")}(cash),function(a,s){"use strict";var e={duration:300,onShow:null,swipeable:!1,responsiveThreshold:1/0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tabs=i).options=a.extend({},n.defaults,e),i.$tabLinks=i.$el.children("li.tab").children("a"),i.index=0,i._setupActiveTabLink(),i.options.swipeable?i._setupSwipeableTabs():i._setupNormalTabs(),i._setTabsAndTabWidth(),i._createIndicator(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._indicator.parentNode.removeChild(this._indicator),this.options.swipeable?this._teardownSwipeableTabs():this._teardownNormalTabs(),this.$el[0].M_Tabs=void 0}},{key:"_setupEventHandlers",value:function(){this._handleWindowResizeBound=this._handleWindowResize.bind(this),window.addEventListener("resize",this._handleWindowResizeBound),this._handleTabClickBound=this._handleTabClick.bind(this),this.el.addEventListener("click",this._handleTabClickBound)}},{key:"_removeEventHandlers",value:function(){window.removeEventListener("resize",this._handleWindowResizeBound),this.el.removeEventListener("click",this._handleTabClickBound)}},{key:"_handleWindowResize",value:function(){this._setTabsAndTabWidth(),0!==this.tabWidth&&0!==this.tabsWidth&&(this._indicator.style.left=this._calcLeftPos(this.$activeTabLink)+"px",this._indicator.style.right=this._calcRightPos(this.$activeTabLink)+"px")}},{key:"_handleTabClick",value:function(t){var e=this,i=a(t.target).closest("li.tab"),n=a(t.target).closest("a");if(n.length&&n.parent().hasClass("tab"))if(i.hasClass("disabled"))t.preventDefault();else if(!n.attr("target")){this.$activeTabLink.removeClass("active");var s=this.$content;this.$activeTabLink=n,this.$content=a(M.escapeHash(n[0].hash)),this.$tabLinks=this.$el.children("li.tab").children("a"),this.$activeTabLink.addClass("active");var o=this.index;this.index=Math.max(this.$tabLinks.index(n),0),this.options.swipeable?this._tabsCarousel&&this._tabsCarousel.set(this.index,function(){"function"==typeof e.options.onShow&&e.options.onShow.call(e,e.$content[0])}):this.$content.length&&(this.$content[0].style.display="block",this.$content.addClass("active"),"function"==typeof this.options.onShow&&this.options.onShow.call(this,this.$content[0]),s.length&&!s.is(this.$content)&&(s[0].style.display="none",s.removeClass("active"))),this._setTabsAndTabWidth(),this._animateIndicator(o),t.preventDefault()}}},{key:"_createIndicator",value:function(){var t=this,e=document.createElement("li");e.classList.add("indicator"),this.el.appendChild(e),this._indicator=e,setTimeout(function(){t._indicator.style.left=t._calcLeftPos(t.$activeTabLink)+"px",t._indicator.style.right=t._calcRightPos(t.$activeTabLink)+"px"},0)}},{key:"_setupActiveTabLink",value:function(){this.$activeTabLink=a(this.$tabLinks.filter('[href="'+location.hash+'"]')),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a.active").first()),0===this.$activeTabLink.length&&(this.$activeTabLink=this.$el.children("li.tab").children("a").first()),this.$tabLinks.removeClass("active"),this.$activeTabLink[0].classList.add("active"),this.index=Math.max(this.$tabLinks.index(this.$activeTabLink),0),this.$activeTabLink.length&&(this.$content=a(M.escapeHash(this.$activeTabLink[0].hash)),this.$content.addClass("active"))}},{key:"_setupSwipeableTabs",value:function(){var i=this;window.innerWidth>this.options.responsiveThreshold&&(this.options.swipeable=!1);var n=a();this.$tabLinks.each(function(t){var e=a(M.escapeHash(t.hash));e.addClass("carousel-item"),n=n.add(e)});var t=a('');n.first().before(t),t.append(n),n[0].style.display="";var e=this.$activeTabLink.closest(".tab").index();this._tabsCarousel=M.Carousel.init(t[0],{fullWidth:!0,noWrap:!0,onCycleTo:function(t){var e=i.index;i.index=a(t).index(),i.$activeTabLink.removeClass("active"),i.$activeTabLink=i.$tabLinks.eq(i.index),i.$activeTabLink.addClass("active"),i._animateIndicator(e),"function"==typeof i.options.onShow&&i.options.onShow.call(i,i.$content[0])}}),this._tabsCarousel.set(e)}},{key:"_teardownSwipeableTabs",value:function(){var t=this._tabsCarousel.$el;this._tabsCarousel.destroy(),t.after(t.children()),t.remove()}},{key:"_setupNormalTabs",value:function(){this.$tabLinks.not(this.$activeTabLink).each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="none")}})}},{key:"_teardownNormalTabs",value:function(){this.$tabLinks.each(function(t){if(t.hash){var e=a(M.escapeHash(t.hash));e.length&&(e[0].style.display="")}})}},{key:"_setTabsAndTabWidth",value:function(){this.tabsWidth=this.$el.width(),this.tabWidth=Math.max(this.tabsWidth,this.el.scrollWidth)/this.$tabLinks.length}},{key:"_calcRightPos",value:function(t){return Math.ceil(this.tabsWidth-t.position().left-t[0].getBoundingClientRect().width)}},{key:"_calcLeftPos",value:function(t){return Math.floor(t.position().left)}},{key:"updateTabIndicator",value:function(){this._setTabsAndTabWidth(),this._animateIndicator(this.index)}},{key:"_animateIndicator",value:function(t){var e=0,i=0;0<=this.index-t?e=90:i=90;var n={targets:this._indicator,left:{value:this._calcLeftPos(this.$activeTabLink),delay:e},right:{value:this._calcRightPos(this.$activeTabLink),delay:i},duration:this.options.duration,easing:"easeOutQuad"};s.remove(this._indicator),s(n)}},{key:"select",value:function(t){var e=this.$tabLinks.filter('[href="#'+t+'"]');e.length&&e.trigger("click")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tabs}},{key:"defaults",get:function(){return e}}]),n}();M.Tabs=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tabs","M_Tabs")}(cash,M.anime),function(d,e){"use strict";var i={exitDelay:200,enterDelay:0,html:null,margin:5,inDuration:250,outDuration:200,position:"bottom",transitionMovement:10},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Tooltip=i).options=d.extend({},n.defaults,e),i.isOpen=!1,i.isHovered=!1,i.isFocused=!1,i._appendTooltipEl(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){d(this.tooltipEl).remove(),this._removeEventHandlers(),this.el.M_Tooltip=void 0}},{key:"_appendTooltipEl",value:function(){var t=document.createElement("div");t.classList.add("material-tooltip"),this.tooltipEl=t;var e=document.createElement("div");e.classList.add("tooltip-content"),e.innerHTML=this.options.html,t.appendChild(e),document.body.appendChild(t)}},{key:"_updateTooltipContent",value:function(){this.tooltipEl.querySelector(".tooltip-content").innerHTML=this.options.html}},{key:"_setupEventHandlers",value:function(){this._handleMouseEnterBound=this._handleMouseEnter.bind(this),this._handleMouseLeaveBound=this._handleMouseLeave.bind(this),this._handleFocusBound=this._handleFocus.bind(this),this._handleBlurBound=this._handleBlur.bind(this),this.el.addEventListener("mouseenter",this._handleMouseEnterBound),this.el.addEventListener("mouseleave",this._handleMouseLeaveBound),this.el.addEventListener("focus",this._handleFocusBound,!0),this.el.addEventListener("blur",this._handleBlurBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("mouseenter",this._handleMouseEnterBound),this.el.removeEventListener("mouseleave",this._handleMouseLeaveBound),this.el.removeEventListener("focus",this._handleFocusBound,!0),this.el.removeEventListener("blur",this._handleBlurBound,!0)}},{key:"open",value:function(t){this.isOpen||(t=void 0===t||void 0,this.isOpen=!0,this.options=d.extend({},this.options,this._getAttributeOptions()),this._updateTooltipContent(),this._setEnterDelayTimeout(t))}},{key:"close",value:function(){this.isOpen&&(this.isHovered=!1,this.isFocused=!1,this.isOpen=!1,this._setExitDelayTimeout())}},{key:"_setExitDelayTimeout",value:function(){var t=this;clearTimeout(this._exitDelayTimeout),this._exitDelayTimeout=setTimeout(function(){t.isHovered||t.isFocused||t._animateOut()},this.options.exitDelay)}},{key:"_setEnterDelayTimeout",value:function(t){var e=this;clearTimeout(this._enterDelayTimeout),this._enterDelayTimeout=setTimeout(function(){(e.isHovered||e.isFocused||t)&&e._animateIn()},this.options.enterDelay)}},{key:"_positionTooltip",value:function(){var t,e=this.el,i=this.tooltipEl,n=e.offsetHeight,s=e.offsetWidth,o=i.offsetHeight,a=i.offsetWidth,r=this.options.margin,l=void 0,h=void 0;this.xMovement=0,this.yMovement=0,l=e.getBoundingClientRect().top+M.getDocumentScrollTop(),h=e.getBoundingClientRect().left+M.getDocumentScrollLeft(),"top"===this.options.position?(l+=-o-r,h+=s/2-a/2,this.yMovement=-this.options.transitionMovement):"right"===this.options.position?(l+=n/2-o/2,h+=s+r,this.xMovement=this.options.transitionMovement):"left"===this.options.position?(l+=n/2-o/2,h+=-a-r,this.xMovement=-this.options.transitionMovement):(l+=n+r,h+=s/2-a/2,this.yMovement=this.options.transitionMovement),t=this._repositionWithinScreen(h,l,a,o),d(i).css({top:t.y+"px",left:t.x+"px"})}},{key:"_repositionWithinScreen",value:function(t,e,i,n){var s=M.getDocumentScrollLeft(),o=M.getDocumentScrollTop(),a=t-s,r=e-o,l={left:a,top:r,width:i,height:n},h=this.options.margin+this.options.transitionMovement,d=M.checkWithinContainer(document.body,l,h);return d.left?a=h:d.right&&(a-=a+i-window.innerWidth),d.top?r=h:d.bottom&&(r-=r+n-window.innerHeight),{x:a+s,y:r+o}}},{key:"_animateIn",value:function(){this._positionTooltip(),this.tooltipEl.style.visibility="visible",e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:1,translateX:this.xMovement,translateY:this.yMovement,duration:this.options.inDuration,easing:"easeOutCubic"})}},{key:"_animateOut",value:function(){e.remove(this.tooltipEl),e({targets:this.tooltipEl,opacity:0,translateX:0,translateY:0,duration:this.options.outDuration,easing:"easeOutCubic"})}},{key:"_handleMouseEnter",value:function(){this.isHovered=!0,this.isFocused=!1,this.open(!1)}},{key:"_handleMouseLeave",value:function(){this.isHovered=!1,this.isFocused=!1,this.close()}},{key:"_handleFocus",value:function(){M.tabPressed&&(this.isFocused=!0,this.open(!1))}},{key:"_handleBlur",value:function(){this.isFocused=!1,this.close()}},{key:"_getAttributeOptions",value:function(){var t={},e=this.el.getAttribute("data-tooltip"),i=this.el.getAttribute("data-position");return e&&(t.html=e),i&&(t.position=i),t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Tooltip}},{key:"defaults",get:function(){return i}}]),n}();M.Tooltip=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"tooltip","M_Tooltip")}(cash,M.anime),function(i){"use strict";var t=t||{},e=document.querySelectorAll.bind(document);function m(t){var e="";for(var i in t)t.hasOwnProperty(i)&&(e+=i+":"+t[i]+";");return e}var g={duration:750,show:function(t,e){if(2===t.button)return!1;var i=e||this,n=document.createElement("div");n.className="waves-ripple",i.appendChild(n);var s,o,a,r,l,h,d,u=(h={top:0,left:0},d=(s=i)&&s.ownerDocument,o=d.documentElement,void 0!==s.getBoundingClientRect&&(h=s.getBoundingClientRect()),a=null!==(l=r=d)&&l===l.window?r:9===r.nodeType&&r.defaultView,{top:h.top+a.pageYOffset-o.clientTop,left:h.left+a.pageXOffset-o.clientLeft}),c=t.pageY-u.top,p=t.pageX-u.left,v="scale("+i.clientWidth/100*10+")";"touches"in t&&(c=t.touches[0].pageY-u.top,p=t.touches[0].pageX-u.left),n.setAttribute("data-hold",Date.now()),n.setAttribute("data-scale",v),n.setAttribute("data-x",p),n.setAttribute("data-y",c);var f={top:c+"px",left:p+"px"};n.className=n.className+" waves-notransition",n.setAttribute("style",m(f)),n.className=n.className.replace("waves-notransition",""),f["-webkit-transform"]=v,f["-moz-transform"]=v,f["-ms-transform"]=v,f["-o-transform"]=v,f.transform=v,f.opacity="1",f["-webkit-transition-duration"]=g.duration+"ms",f["-moz-transition-duration"]=g.duration+"ms",f["-o-transition-duration"]=g.duration+"ms",f["transition-duration"]=g.duration+"ms",f["-webkit-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-moz-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["-o-transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",f["transition-timing-function"]="cubic-bezier(0.250, 0.460, 0.450, 0.940)",n.setAttribute("style",m(f))},hide:function(t){l.touchup(t);var e=this,i=(e.clientWidth,null),n=e.getElementsByClassName("waves-ripple");if(!(0i||1"+o+""+a+""+r+""),i.length&&e.prepend(i)}},{key:"_resetCurrentElement",value:function(){this.activeIndex=-1,this.$active.removeClass("active")}},{key:"_resetAutocomplete",value:function(){h(this.container).empty(),this._resetCurrentElement(),this.oldVal=null,this.isOpen=!1,this._mousedown=!1}},{key:"selectOption",value:function(t){var e=t.text().trim();this.el.value=e,this.$el.trigger("change"),this._resetAutocomplete(),this.close(),"function"==typeof this.options.onAutocomplete&&this.options.onAutocomplete.call(this,e)}},{key:"_renderDropdown",value:function(t,i){var n=this;this._resetAutocomplete();var e=[];for(var s in t)if(t.hasOwnProperty(s)&&-1!==s.toLowerCase().indexOf(i)){if(this.count>=this.options.limit)break;var o={data:t[s],key:s};e.push(o),this.count++}if(this.options.sortFunction){e.sort(function(t,e){return n.options.sortFunction(t.key.toLowerCase(),e.key.toLowerCase(),i.toLowerCase())})}for(var a=0;a");r.data?l.append(''+r.key+""):l.append(""+r.key+""),h(this.container).append(l),this._highlight(i,l)}}},{key:"open",value:function(){var t=this.el.value.toLowerCase();this._resetAutocomplete(),t.length>=this.options.minLength&&(this.isOpen=!0,this._renderDropdown(this.options.data,t)),this.dropdown.isOpen?this.dropdown.recalculateDimensions():this.dropdown.open()}},{key:"close",value:function(){this.dropdown.close()}},{key:"updateData",value:function(t){var e=this.el.value.toLowerCase();this.options.data=t,this.isOpen&&this._renderDropdown(t,e)}}],[{key:"init",value:function(t,e){return _get(s.__proto__||Object.getPrototypeOf(s),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Autocomplete}},{key:"defaults",get:function(){return e}}]),s}();t._keydown=!1,M.Autocomplete=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"autocomplete","M_Autocomplete")}(cash),function(d){M.updateTextFields=function(){d("input[type=text], input[type=password], input[type=email], input[type=url], input[type=tel], input[type=number], input[type=search], input[type=date], input[type=time], textarea").each(function(t,e){var i=d(this);0'),d("body").append(e));var i=t.css("font-family"),n=t.css("font-size"),s=t.css("line-height"),o=t.css("padding-top"),a=t.css("padding-right"),r=t.css("padding-bottom"),l=t.css("padding-left");n&&e.css("font-size",n),i&&e.css("font-family",i),s&&e.css("line-height",s),o&&e.css("padding-top",o),a&&e.css("padding-right",a),r&&e.css("padding-bottom",r),l&&e.css("padding-left",l),t.data("original-height")||t.data("original-height",t.height()),"off"===t.attr("wrap")&&e.css("overflow-wrap","normal").css("white-space","pre"),e.text(t[0].value+"\n");var h=e.html().replace(/\n/g,"
    ");e.html(h),0'),this.$slides.each(function(t,e){var i=s('
  • ');n.$indicators.append(i[0])}),this.$el.append(this.$indicators[0]),this.$indicators=this.$indicators.children("li.indicator-item"))}},{key:"_removeIndicators",value:function(){this.$el.find("ul.indicators").remove()}},{key:"set",value:function(t){var e=this;if(t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.activeIndex!=t){this.$active=this.$slides.eq(this.activeIndex);var i=this.$active.find(".caption");this.$active.removeClass("active"),o({targets:this.$active[0],opacity:0,duration:this.options.duration,easing:"easeOutQuad",complete:function(){e.$slides.not(".active").each(function(t){o({targets:t,opacity:0,translateX:0,translateY:0,duration:0,easing:"easeOutQuad"})})}}),this._animateCaptionIn(i[0],this.options.duration),this.options.indicators&&(this.$indicators.eq(this.activeIndex).removeClass("active"),this.$indicators.eq(t).addClass("active")),o({targets:this.$slides.eq(t)[0],opacity:1,duration:this.options.duration,easing:"easeOutQuad"}),o({targets:this.$slides.eq(t).find(".caption")[0],opacity:1,translateX:0,translateY:0,duration:this.options.duration,delay:this.options.duration,easing:"easeOutQuad"}),this.$slides.eq(t).addClass("active"),this.activeIndex=t,this.start()}}},{key:"pause",value:function(){clearInterval(this.interval)}},{key:"start",value:function(){clearInterval(this.interval),this.interval=setInterval(this._handleIntervalBound,this.options.duration+this.options.interval)}},{key:"next",value:function(){var t=this.activeIndex+1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}},{key:"prev",value:function(){var t=this.activeIndex-1;t>=this.$slides.length?t=0:t<0&&(t=this.$slides.length-1),this.set(t)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Slider}},{key:"defaults",get:function(){return e}}]),n}();M.Slider=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"slider","M_Slider")}(cash,M.anime),function(n,s){n(document).on("click",".card",function(t){if(n(this).children(".card-reveal").length){var i=n(t.target).closest(".card");void 0===i.data("initialOverflow")&&i.data("initialOverflow",void 0===i.css("overflow")?"":i.css("overflow"));var e=n(this).find(".card-reveal");n(t.target).is(n(".card-reveal .card-title"))||n(t.target).is(n(".card-reveal .card-title i"))?s({targets:e[0],translateY:0,duration:225,easing:"easeInOutQuad",complete:function(t){var e=t.animatables[0].target;n(e).css({display:"none"}),i.css("overflow",i.data("initialOverflow"))}}):(n(t.target).is(n(".card .activator"))||n(t.target).is(n(".card .activator i")))&&(i.css("overflow","hidden"),e.css({display:"block"}),s({targets:e[0],translateY:"-100%",duration:300,easing:"easeInOutQuad"}))}})}(cash,M.anime),function(h){"use strict";var e={data:[],placeholder:"",secondaryPlaceholder:"",autocompleteOptions:{},limit:1/0,onChipAdd:null,onChipSelect:null,onChipDelete:null},t=function(t){function l(t,e){_classCallCheck(this,l);var i=_possibleConstructorReturn(this,(l.__proto__||Object.getPrototypeOf(l)).call(this,l,t,e));return(i.el.M_Chips=i).options=h.extend({},l.defaults,e),i.$el.addClass("chips input-field"),i.chipsData=[],i.$chips=h(),i._setupInput(),i.hasAutocomplete=0"),this.$el.append(this.$input)),this.$input.addClass("input")}},{key:"_setupLabel",value:function(){this.$label=this.$el.find("label"),this.$label.length&&this.$label.setAttribute("for",this.$input.attr("id"))}},{key:"_setPlaceholder",value:function(){void 0!==this.chipsData&&!this.chipsData.length&&this.options.placeholder?h(this.$input).prop("placeholder",this.options.placeholder):(void 0===this.chipsData||this.chipsData.length)&&this.options.secondaryPlaceholder&&h(this.$input).prop("placeholder",this.options.secondaryPlaceholder)}},{key:"_isValid",value:function(t){if(t.hasOwnProperty("tag")&&""!==t.tag){for(var e=!1,i=0;i=this.options.limit)){var e=this._renderChip(t);this.$chips.add(e),this.chipsData.push(t),h(this.$input).before(e),this._setPlaceholder(),"function"==typeof this.options.onChipAdd&&this.options.onChipAdd.call(this,this.$el,e)}}},{key:"deleteChip",value:function(t){var e=this.$chips.eq(t);this.$chips.eq(t).remove(),this.$chips=this.$chips.filter(function(t){return 0<=h(t).index()}),this.chipsData.splice(t,1),this._setPlaceholder(),"function"==typeof this.options.onChipDelete&&this.options.onChipDelete.call(this,this.$el,e[0])}},{key:"selectChip",value:function(t){var e=this.$chips.eq(t);(this._selectedChip=e)[0].focus(),"function"==typeof this.options.onChipSelect&&this.options.onChipSelect.call(this,this.$el,e[0])}}],[{key:"init",value:function(t,e){return _get(l.__proto__||Object.getPrototypeOf(l),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Chips}},{key:"_handleChipsKeydown",value:function(t){l._keydown=!0;var e=h(t.target).closest(".chips"),i=t.target&&e.length;if(!h(t.target).is("input, textarea")&&i){var n=e[0].M_Chips;if(8===t.keyCode||46===t.keyCode){t.preventDefault();var s=n.chipsData.length;if(n._selectedChip){var o=n._selectedChip.index();n.deleteChip(o),n._selectedChip=null,s=Math.max(o-1,0)}n.chipsData.length&&n.selectChip(s)}else if(37===t.keyCode){if(n._selectedChip){var a=n._selectedChip.index()-1;if(a<0)return;n.selectChip(a)}}else if(39===t.keyCode&&n._selectedChip){var r=n._selectedChip.index()+1;r>=n.chipsData.length?n.$input[0].focus():n.selectChip(r)}}}},{key:"_handleChipsKeyup",value:function(t){l._keydown=!1}},{key:"_handleChipsBlur",value:function(t){l._keydown||(h(t.target).closest(".chips")[0].M_Chips._selectedChip=null)}},{key:"defaults",get:function(){return e}}]),l}();t._keydown=!1,M.Chips=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"chips","M_Chips"),h(document).ready(function(){h(document.body).on("click",".chip .close",function(){var t=h(this).closest(".chips");t.length&&t[0].M_Chips||h(this).closest(".chip").remove()})})}(cash),function(s){"use strict";var e={top:0,bottom:1/0,offset:0,onPositionChange:null},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Pushpin=i).options=s.extend({},n.defaults,e),i.originalOffset=i.el.offsetTop,n._pushpins.push(i),i._setupEventHandlers(),i._updatePosition(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this.el.style.top=null,this._removePinClasses(),this._removeEventHandlers();var t=n._pushpins.indexOf(this);n._pushpins.splice(t,1)}},{key:"_setupEventHandlers",value:function(){document.addEventListener("scroll",n._updateElements)}},{key:"_removeEventHandlers",value:function(){document.removeEventListener("scroll",n._updateElements)}},{key:"_updatePosition",value:function(){var t=M.getDocumentScrollTop()+this.options.offset;this.options.top<=t&&this.options.bottom>=t&&!this.el.classList.contains("pinned")&&(this._removePinClasses(),this.el.style.top=this.options.offset+"px",this.el.classList.add("pinned"),"function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pinned")),tthis.options.bottom&&!this.el.classList.contains("pin-bottom")&&(this._removePinClasses(),this.el.classList.add("pin-bottom"),this.el.style.top=this.options.bottom-this.originalOffset+"px","function"==typeof this.options.onPositionChange&&this.options.onPositionChange.call(this,"pin-bottom"))}},{key:"_removePinClasses",value:function(){this.el.classList.remove("pin-top"),this.el.classList.remove("pinned"),this.el.classList.remove("pin-bottom")}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Pushpin}},{key:"_updateElements",value:function(){for(var t in n._pushpins){n._pushpins[t]._updatePosition()}}},{key:"defaults",get:function(){return e}}]),n}();t._pushpins=[],M.Pushpin=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"pushpin","M_Pushpin")}(cash),function(r,s){"use strict";var e={direction:"top",hoverEnabled:!0,toolbarEnabled:!1};r.fn.reverse=[].reverse;var t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_FloatingActionButton=i).options=r.extend({},n.defaults,e),i.isOpen=!1,i.$anchor=i.$el.children("a").first(),i.$menu=i.$el.children("ul").first(),i.$floatingBtns=i.$el.find("ul .btn-floating"),i.$floatingBtnsReverse=i.$el.find("ul .btn-floating").reverse(),i.offsetY=0,i.offsetX=0,i.$el.addClass("direction-"+i.options.direction),"top"===i.options.direction?i.offsetY=40:"right"===i.options.direction?i.offsetX=-40:"bottom"===i.options.direction?i.offsetY=-40:i.offsetX=40,i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_FloatingActionButton=void 0}},{key:"_setupEventHandlers",value:function(){this._handleFABClickBound=this._handleFABClick.bind(this),this._handleOpenBound=this.open.bind(this),this._handleCloseBound=this.close.bind(this),this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.addEventListener("mouseenter",this._handleOpenBound),this.el.addEventListener("mouseleave",this._handleCloseBound)):this.el.addEventListener("click",this._handleFABClickBound)}},{key:"_removeEventHandlers",value:function(){this.options.hoverEnabled&&!this.options.toolbarEnabled?(this.el.removeEventListener("mouseenter",this._handleOpenBound),this.el.removeEventListener("mouseleave",this._handleCloseBound)):this.el.removeEventListener("click",this._handleFABClickBound)}},{key:"_handleFABClick",value:function(){this.isOpen?this.close():this.open()}},{key:"_handleDocumentClick",value:function(t){r(t.target).closest(this.$menu).length||this.close()}},{key:"open",value:function(){this.isOpen||(this.options.toolbarEnabled?this._animateInToolbar():this._animateInFAB(),this.isOpen=!0)}},{key:"close",value:function(){this.isOpen&&(this.options.toolbarEnabled?(window.removeEventListener("scroll",this._handleCloseBound,!0),document.body.removeEventListener("click",this._handleDocumentClickBound,!0),this._animateOutToolbar()):this._animateOutFAB(),this.isOpen=!1)}},{key:"_animateInFAB",value:function(){var e=this;this.$el.addClass("active");var i=0;this.$floatingBtnsReverse.each(function(t){s({targets:t,opacity:1,scale:[.4,1],translateY:[e.offsetY,0],translateX:[e.offsetX,0],duration:275,delay:i,easing:"easeInOutQuad"}),i+=40})}},{key:"_animateOutFAB",value:function(){var e=this;this.$floatingBtnsReverse.each(function(t){s.remove(t),s({targets:t,opacity:0,scale:.4,translateY:e.offsetY,translateX:e.offsetX,duration:175,easing:"easeOutQuad",complete:function(){e.$el.removeClass("active")}})})}},{key:"_animateInToolbar",value:function(){var t,e=this,i=window.innerWidth,n=window.innerHeight,s=this.el.getBoundingClientRect(),o=r('
    '),a=this.$anchor.css("background-color");this.$anchor.append(o),this.offsetX=s.left-i/2+s.width/2,this.offsetY=n-s.bottom,t=i/o[0].clientWidth,this.btnBottom=s.bottom,this.btnLeft=s.left,this.btnWidth=s.width,this.$el.addClass("active"),this.$el.css({"text-align":"center",width:"100%",bottom:0,left:0,transform:"translateX("+this.offsetX+"px)",transition:"none"}),this.$anchor.css({transform:"translateY("+-this.offsetY+"px)",transition:"none"}),o.css({"background-color":a}),setTimeout(function(){e.$el.css({transform:"",transition:"transform .2s cubic-bezier(0.550, 0.085, 0.680, 0.530), background-color 0s linear .2s"}),e.$anchor.css({overflow:"visible",transform:"",transition:"transform .2s"}),setTimeout(function(){e.$el.css({overflow:"hidden","background-color":a}),o.css({transform:"scale("+t+")",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"}),e.$menu.children("li").children("a").css({opacity:1}),e._handleDocumentClickBound=e._handleDocumentClick.bind(e),window.addEventListener("scroll",e._handleCloseBound,!0),document.body.addEventListener("click",e._handleDocumentClickBound,!0)},100)},0)}},{key:"_animateOutToolbar",value:function(){var t=this,e=window.innerWidth,i=window.innerHeight,n=this.$el.find(".fab-backdrop"),s=this.$anchor.css("background-color");this.offsetX=this.btnLeft-e/2+this.btnWidth/2,this.offsetY=i-this.btnBottom,this.$el.removeClass("active"),this.$el.css({"background-color":"transparent",transition:"none"}),this.$anchor.css({transition:"none"}),n.css({transform:"scale(0)","background-color":s}),this.$menu.children("li").children("a").css({opacity:""}),setTimeout(function(){n.remove(),t.$el.css({"text-align":"",width:"",bottom:"",left:"",overflow:"","background-color":"",transform:"translate3d("+-t.offsetX+"px,0,0)"}),t.$anchor.css({overflow:"",transform:"translate3d(0,"+t.offsetY+"px,0)"}),setTimeout(function(){t.$el.css({transform:"translate3d(0,0,0)",transition:"transform .2s"}),t.$anchor.css({transform:"translate3d(0,0,0)",transition:"transform .2s cubic-bezier(0.550, 0.055, 0.675, 0.190)"})},20)},200)}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FloatingActionButton}},{key:"defaults",get:function(){return e}}]),n}();M.FloatingActionButton=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"floatingActionButton","M_FloatingActionButton")}(cash,M.anime),function(g){"use strict";var e={autoClose:!1,format:"mmm dd, yyyy",parse:null,defaultDate:null,setDefaultDate:!1,disableWeekends:!1,disableDayFn:null,firstDay:0,minDate:null,maxDate:null,yearRange:10,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,container:null,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok",previousMonth:"‹",nextMonth:"›",months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],weekdaysAbbrev:["S","M","T","W","T","F","S"]},events:[],onSelect:null,onOpen:null,onClose:null,onDraw:null},t=function(t){function B(t,e){_classCallCheck(this,B);var i=_possibleConstructorReturn(this,(B.__proto__||Object.getPrototypeOf(B)).call(this,B,t,e));(i.el.M_Datepicker=i).options=g.extend({},B.defaults,e),e&&e.hasOwnProperty("i18n")&&"object"==typeof e.i18n&&(i.options.i18n=g.extend({},B.defaults.i18n,e.i18n)),i.options.minDate&&i.options.minDate.setHours(0,0,0,0),i.options.maxDate&&i.options.maxDate.setHours(0,0,0,0),i.id=M.guid(),i._setupVariables(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupEventHandlers(),i.options.defaultDate||(i.options.defaultDate=new Date(Date.parse(i.el.value)));var n=i.options.defaultDate;return B._isDate(n)?i.options.setDefaultDate?(i.setDate(n,!0),i.setInputValue()):i.gotoDate(n):i.gotoDate(new Date),i.isOpen=!1,i}return _inherits(B,Component),_createClass(B,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),g(this.modalEl).remove(),this.destroySelects(),this.el.M_Datepicker=void 0}},{key:"destroySelects",value:function(){var t=this.calendarEl.querySelector(".orig-select-year");t&&M.FormSelect.getInstance(t).destroy();var e=this.calendarEl.querySelector(".orig-select-month");e&&M.FormSelect.getInstance(e).destroy()}},{key:"_insertHTMLIntoDOM",value:function(){this.options.showClearBtn&&(g(this.clearBtn).css({visibility:""}),this.clearBtn.innerHTML=this.options.i18n.clear),this.doneBtn.innerHTML=this.options.i18n.done,this.cancelBtn.innerHTML=this.options.i18n.cancel,this.options.container?this.$modalEl.appendTo(this.options.container):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modalEl.id="modal-"+this.id,this.modal=M.Modal.init(this.modalEl,{onCloseEnd:function(){t.isOpen=!1}})}},{key:"toString",value:function(t){var e=this;return t=t||this.options.format,B._isDate(this.date)?t.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g).map(function(t){return e.formats[t]?e.formats[t]():t}).join(""):""}},{key:"setDate",value:function(t,e){if(!t)return this.date=null,this._renderDateDisplay(),this.draw();if("string"==typeof t&&(t=new Date(Date.parse(t))),B._isDate(t)){var i=this.options.minDate,n=this.options.maxDate;B._isDate(i)&&tn.maxDate||n.disableWeekends&&B._isWeekend(y)||n.disableDayFn&&n.disableDayFn(y),isEmpty:C,isStartRange:x,isEndRange:L,isInRange:T,showDaysInNextAndPreviousMonths:n.showDaysInNextAndPreviousMonths};l.push(this.renderDay($)),7==++_&&(r.push(this.renderRow(l,n.isRTL,m)),_=0,m=!(l=[]))}return this.renderTable(n,r,i)}},{key:"renderDay",value:function(t){var e=[],i="false";if(t.isEmpty){if(!t.showDaysInNextAndPreviousMonths)return'';e.push("is-outside-current-month"),e.push("is-selection-disabled")}return t.isDisabled&&e.push("is-disabled"),t.isToday&&e.push("is-today"),t.isSelected&&(e.push("is-selected"),i="true"),t.hasEvent&&e.push("has-event"),t.isInRange&&e.push("is-inrange"),t.isStartRange&&e.push("is-startrange"),t.isEndRange&&e.push("is-endrange"),'"}},{key:"renderRow",value:function(t,e,i){return''+(e?t.reverse():t).join("")+""}},{key:"renderTable",value:function(t,e,i){return'
    '+this.renderHead(t)+this.renderBody(e)+"
    "}},{key:"renderHead",value:function(t){var e=void 0,i=[];for(e=0;e<7;e++)i.push(''+this.renderDayName(t,e,!0)+"");return""+(t.isRTL?i.reverse():i).join("")+""}},{key:"renderBody",value:function(t){return""+t.join("")+""}},{key:"renderTitle",value:function(t,e,i,n,s,o){var a,r,l=void 0,h=void 0,d=void 0,u=this.options,c=i===u.minYear,p=i===u.maxYear,v='
    ',f=!0,m=!0;for(d=[],l=0;l<12;l++)d.push('");for(a='",g.isArray(u.yearRange)?(l=u.yearRange[0],h=u.yearRange[1]+1):(l=i-u.yearRange,h=1+i+u.yearRange),d=[];l=u.minYear&&d.push('");r='";v+='',v+='
    ',u.showMonthAfterYear?v+=r+a:v+=a+r,v+="
    ",c&&(0===n||u.minMonth>=n)&&(f=!1),p&&(11===n||u.maxMonth<=n)&&(m=!1);return(v+='')+"
    "}},{key:"draw",value:function(t){if(this.isOpen||t){var e,i=this.options,n=i.minYear,s=i.maxYear,o=i.minMonth,a=i.maxMonth,r="";this._y<=n&&(this._y=n,!isNaN(o)&&this._m=s&&(this._y=s,!isNaN(a)&&this._m>a&&(this._m=a)),e="datepicker-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var l=0;l<1;l++)this._renderDateDisplay(),r+=this.renderTitle(this,l,this.calendars[l].year,this.calendars[l].month,this.calendars[0].year,e)+this.render(this.calendars[l].year,this.calendars[l].month,e);this.destroySelects(),this.calendarEl.innerHTML=r;var h=this.calendarEl.querySelector(".orig-select-year"),d=this.calendarEl.querySelector(".orig-select-month");M.FormSelect.init(h,{classes:"select-year",dropdownOptions:{container:document.body,constrainWidth:!1}}),M.FormSelect.init(d,{classes:"select-month",dropdownOptions:{container:document.body,constrainWidth:!1}}),h.addEventListener("change",this._handleYearChange.bind(this)),d.addEventListener("change",this._handleMonthChange.bind(this)),"function"==typeof this.options.onDraw&&this.options.onDraw(this)}}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleInputChangeBound=this._handleInputChange.bind(this),this._handleCalendarClickBound=this._handleCalendarClick.bind(this),this._finishSelectionBound=this._finishSelection.bind(this),this._handleMonthChange=this._handleMonthChange.bind(this),this._closeBound=this.close.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.el.addEventListener("change",this._handleInputChangeBound),this.calendarEl.addEventListener("click",this._handleCalendarClickBound),this.doneBtn.addEventListener("click",this._finishSelectionBound),this.cancelBtn.addEventListener("click",this._closeBound),this.options.showClearBtn&&(this._handleClearClickBound=this._handleClearClick.bind(this),this.clearBtn.addEventListener("click",this._handleClearClickBound))}},{key:"_setupVariables",value:function(){var e=this;this.$modalEl=g(B._template),this.modalEl=this.$modalEl[0],this.calendarEl=this.modalEl.querySelector(".datepicker-calendar"),this.yearTextEl=this.modalEl.querySelector(".year-text"),this.dateTextEl=this.modalEl.querySelector(".date-text"),this.options.showClearBtn&&(this.clearBtn=this.modalEl.querySelector(".datepicker-clear")),this.doneBtn=this.modalEl.querySelector(".datepicker-done"),this.cancelBtn=this.modalEl.querySelector(".datepicker-cancel"),this.formats={d:function(){return e.date.getDate()},dd:function(){var t=e.date.getDate();return(t<10?"0":"")+t},ddd:function(){return e.options.i18n.weekdaysShort[e.date.getDay()]},dddd:function(){return e.options.i18n.weekdays[e.date.getDay()]},m:function(){return e.date.getMonth()+1},mm:function(){var t=e.date.getMonth()+1;return(t<10?"0":"")+t},mmm:function(){return e.options.i18n.monthsShort[e.date.getMonth()]},mmmm:function(){return e.options.i18n.months[e.date.getMonth()]},yy:function(){return(""+e.date.getFullYear()).slice(2)},yyyy:function(){return e.date.getFullYear()}}}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound),this.el.removeEventListener("change",this._handleInputChangeBound),this.calendarEl.removeEventListener("click",this._handleCalendarClickBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleCalendarClick",value:function(t){if(this.isOpen){var e=g(t.target);e.hasClass("is-disabled")||(!e.hasClass("datepicker-day-button")||e.hasClass("is-empty")||e.parent().hasClass("is-disabled")?e.closest(".month-prev").length?this.prevMonth():e.closest(".month-next").length&&this.nextMonth():(this.setDate(new Date(t.target.getAttribute("data-year"),t.target.getAttribute("data-month"),t.target.getAttribute("data-day"))),this.options.autoClose&&this._finishSelection()))}}},{key:"_handleClearClick",value:function(){this.date=null,this.setInputValue(),this.close()}},{key:"_handleMonthChange",value:function(t){this.gotoMonth(t.target.value)}},{key:"_handleYearChange",value:function(t){this.gotoYear(t.target.value)}},{key:"gotoMonth",value:function(t){isNaN(t)||(this.calendars[0].month=parseInt(t,10),this.adjustCalendars())}},{key:"gotoYear",value:function(t){isNaN(t)||(this.calendars[0].year=parseInt(t,10),this.adjustCalendars())}},{key:"_handleInputChange",value:function(t){var e=void 0;t.firedBy!==this&&(e=this.options.parse?this.options.parse(this.el.value,this.options.format):new Date(Date.parse(this.el.value)),B._isDate(e)&&this.setDate(e))}},{key:"renderDayName",value:function(t,e,i){for(e+=t.firstDay;7<=e;)e-=7;return i?t.i18n.weekdaysAbbrev[e]:t.i18n.weekdays[e]}},{key:"_finishSelection",value:function(){this.setInputValue(),this.close()}},{key:"open",value:function(){if(!this.isOpen)return this.isOpen=!0,"function"==typeof this.options.onOpen&&this.options.onOpen.call(this),this.draw(),this.modal.open(),this}},{key:"close",value:function(){if(this.isOpen)return this.isOpen=!1,"function"==typeof this.options.onClose&&this.options.onClose.call(this),this.modal.close(),this}}],[{key:"init",value:function(t,e){return _get(B.__proto__||Object.getPrototypeOf(B),"init",this).call(this,this,t,e)}},{key:"_isDate",value:function(t){return/Date/.test(Object.prototype.toString.call(t))&&!isNaN(t.getTime())}},{key:"_isWeekend",value:function(t){var e=t.getDay();return 0===e||6===e}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"_getDaysInMonth",value:function(t,e){return[31,B._isLeapYear(t)?29:28,31,30,31,30,31,31,30,31,30,31][e]}},{key:"_isLeapYear",value:function(t){return t%4==0&&t%100!=0||t%400==0}},{key:"_compareDates",value:function(t,e){return t.getTime()===e.getTime()}},{key:"_setToStartOfDay",value:function(t){B._isDate(t)&&t.setHours(0,0,0,0)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Datepicker}},{key:"defaults",get:function(){return e}}]),B}();t._template=['"].join(""),M.Datepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"datepicker","M_Datepicker")}(cash),function(h){"use strict";var e={dialRadius:135,outerRadius:105,innerRadius:70,tickRadius:20,duration:350,container:null,defaultTime:"now",fromNow:0,showClearBtn:!1,i18n:{cancel:"Cancel",clear:"Clear",done:"Ok"},autoClose:!1,twelveHour:!0,vibrate:!0,onOpenStart:null,onOpenEnd:null,onCloseStart:null,onCloseEnd:null,onSelect:null},t=function(t){function f(t,e){_classCallCheck(this,f);var i=_possibleConstructorReturn(this,(f.__proto__||Object.getPrototypeOf(f)).call(this,f,t,e));return(i.el.M_Timepicker=i).options=h.extend({},f.defaults,e),i.id=M.guid(),i._insertHTMLIntoDOM(),i._setupModal(),i._setupVariables(),i._setupEventHandlers(),i._clockSetup(),i._pickerSetup(),i}return _inherits(f,Component),_createClass(f,[{key:"destroy",value:function(){this._removeEventHandlers(),this.modal.destroy(),h(this.modalEl).remove(),this.el.M_Timepicker=void 0}},{key:"_setupEventHandlers",value:function(){this._handleInputKeydownBound=this._handleInputKeydown.bind(this),this._handleInputClickBound=this._handleInputClick.bind(this),this._handleClockClickStartBound=this._handleClockClickStart.bind(this),this._handleDocumentClickMoveBound=this._handleDocumentClickMove.bind(this),this._handleDocumentClickEndBound=this._handleDocumentClickEnd.bind(this),this.el.addEventListener("click",this._handleInputClickBound),this.el.addEventListener("keydown",this._handleInputKeydownBound),this.plate.addEventListener("mousedown",this._handleClockClickStartBound),this.plate.addEventListener("touchstart",this._handleClockClickStartBound),h(this.spanHours).on("click",this.showView.bind(this,"hours")),h(this.spanMinutes).on("click",this.showView.bind(this,"minutes"))}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleInputClickBound),this.el.removeEventListener("keydown",this._handleInputKeydownBound)}},{key:"_handleInputClick",value:function(){this.open()}},{key:"_handleInputKeydown",value:function(t){t.which===M.keys.ENTER&&(t.preventDefault(),this.open())}},{key:"_handleClockClickStart",value:function(t){t.preventDefault();var e=this.plate.getBoundingClientRect(),i=e.left,n=e.top;this.x0=i+this.options.dialRadius,this.y0=n+this.options.dialRadius,this.moved=!1;var s=f._Pos(t);this.dx=s.x-this.x0,this.dy=s.y-this.y0,this.setHand(this.dx,this.dy,!1),document.addEventListener("mousemove",this._handleDocumentClickMoveBound),document.addEventListener("touchmove",this._handleDocumentClickMoveBound),document.addEventListener("mouseup",this._handleDocumentClickEndBound),document.addEventListener("touchend",this._handleDocumentClickEndBound)}},{key:"_handleDocumentClickMove",value:function(t){t.preventDefault();var e=f._Pos(t),i=e.x-this.x0,n=e.y-this.y0;this.moved=!0,this.setHand(i,n,!1,!0)}},{key:"_handleDocumentClickEnd",value:function(t){var e=this;t.preventDefault(),document.removeEventListener("mouseup",this._handleDocumentClickEndBound),document.removeEventListener("touchend",this._handleDocumentClickEndBound);var i=f._Pos(t),n=i.x-this.x0,s=i.y-this.y0;this.moved&&n===this.dx&&s===this.dy&&this.setHand(n,s),"hours"===this.currentView?this.showView("minutes",this.options.duration/2):this.options.autoClose&&(h(this.minutesView).addClass("timepicker-dial-out"),setTimeout(function(){e.done()},this.options.duration/2)),"function"==typeof this.options.onSelect&&this.options.onSelect.call(this,this.hours,this.minutes),document.removeEventListener("mousemove",this._handleDocumentClickMoveBound),document.removeEventListener("touchmove",this._handleDocumentClickMoveBound)}},{key:"_insertHTMLIntoDOM",value:function(){this.$modalEl=h(f._template),this.modalEl=this.$modalEl[0],this.modalEl.id="modal-"+this.id;var t=document.querySelector(this.options.container);this.options.container&&t?this.$modalEl.appendTo(t):this.$modalEl.insertBefore(this.el)}},{key:"_setupModal",value:function(){var t=this;this.modal=M.Modal.init(this.modalEl,{onOpenStart:this.options.onOpenStart,onOpenEnd:this.options.onOpenEnd,onCloseStart:this.options.onCloseStart,onCloseEnd:function(){"function"==typeof t.options.onCloseEnd&&t.options.onCloseEnd.call(t),t.isOpen=!1}})}},{key:"_setupVariables",value:function(){this.currentView="hours",this.vibrate=navigator.vibrate?"vibrate":navigator.webkitVibrate?"webkitVibrate":null,this._canvas=this.modalEl.querySelector(".timepicker-canvas"),this.plate=this.modalEl.querySelector(".timepicker-plate"),this.hoursView=this.modalEl.querySelector(".timepicker-hours"),this.minutesView=this.modalEl.querySelector(".timepicker-minutes"),this.spanHours=this.modalEl.querySelector(".timepicker-span-hours"),this.spanMinutes=this.modalEl.querySelector(".timepicker-span-minutes"),this.spanAmPm=this.modalEl.querySelector(".timepicker-span-am-pm"),this.footer=this.modalEl.querySelector(".timepicker-footer"),this.amOrPm="PM"}},{key:"_pickerSetup",value:function(){var t=h('").appendTo(this.footer).on("click",this.clear.bind(this));this.options.showClearBtn&&t.css({visibility:""});var e=h('
    ');h('").appendTo(e).on("click",this.close.bind(this)),h('").appendTo(e).on("click",this.done.bind(this)),e.appendTo(this.footer)}},{key:"_clockSetup",value:function(){this.options.twelveHour&&(this.$amBtn=h('
    AM
    '),this.$pmBtn=h('
    PM
    '),this.$amBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm),this.$pmBtn.on("click",this._handleAmPmClick.bind(this)).appendTo(this.spanAmPm)),this._buildHoursView(),this._buildMinutesView(),this._buildSVGClock()}},{key:"_buildSVGClock",value:function(){var t=this.options.dialRadius,e=this.options.tickRadius,i=2*t,n=f._createSVGEl("svg");n.setAttribute("class","timepicker-svg"),n.setAttribute("width",i),n.setAttribute("height",i);var s=f._createSVGEl("g");s.setAttribute("transform","translate("+t+","+t+")");var o=f._createSVGEl("circle");o.setAttribute("class","timepicker-canvas-bearing"),o.setAttribute("cx",0),o.setAttribute("cy",0),o.setAttribute("r",4);var a=f._createSVGEl("line");a.setAttribute("x1",0),a.setAttribute("y1",0);var r=f._createSVGEl("circle");r.setAttribute("class","timepicker-canvas-bg"),r.setAttribute("r",e),s.appendChild(a),s.appendChild(r),s.appendChild(o),n.appendChild(s),this._canvas.appendChild(n),this.hand=a,this.bg=r,this.bearing=o,this.g=s}},{key:"_buildHoursView",value:function(){var t=h('
    ');if(this.options.twelveHour)for(var e=1;e<13;e+=1){var i=t.clone(),n=e/6*Math.PI,s=this.options.outerRadius;i.css({left:this.options.dialRadius+Math.sin(n)*s-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*s-this.options.tickRadius+"px"}),i.html(0===e?"00":e),this.hoursView.appendChild(i[0])}else for(var o=0;o<24;o+=1){var a=t.clone(),r=o/6*Math.PI,l=0'),e=0;e<60;e+=5){var i=t.clone(),n=e/30*Math.PI;i.css({left:this.options.dialRadius+Math.sin(n)*this.options.outerRadius-this.options.tickRadius+"px",top:this.options.dialRadius-Math.cos(n)*this.options.outerRadius-this.options.tickRadius+"px"}),i.html(f._addLeadingZero(e)),this.minutesView.appendChild(i[0])}}},{key:"_handleAmPmClick",value:function(t){var e=h(t.target);this.amOrPm=e.hasClass("am-btn")?"AM":"PM",this._updateAmPmView()}},{key:"_updateAmPmView",value:function(){this.options.twelveHour&&(this.$amBtn.toggleClass("text-primary","AM"===this.amOrPm),this.$pmBtn.toggleClass("text-primary","PM"===this.amOrPm))}},{key:"_updateTimeFromInput",value:function(){var t=((this.el.value||this.options.defaultTime||"")+"").split(":");if(this.options.twelveHour&&void 0!==t[1]&&(0','",""].join(""),M.Timepicker=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"timepicker","M_Timepicker")}(cash),function(s){"use strict";var e={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_CharacterCounter=i).options=s.extend({},n.defaults,e),i.isInvalid=!1,i.isValidLength=!1,i._setupCounter(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.CharacterCounter=void 0,this._removeCounter()}},{key:"_setupEventHandlers",value:function(){this._handleUpdateCounterBound=this.updateCounter.bind(this),this.el.addEventListener("focus",this._handleUpdateCounterBound,!0),this.el.addEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("focus",this._handleUpdateCounterBound,!0),this.el.removeEventListener("input",this._handleUpdateCounterBound,!0)}},{key:"_setupCounter",value:function(){this.counterEl=document.createElement("span"),s(this.counterEl).addClass("character-counter").css({float:"right","font-size":"12px",height:1}),this.$el.parent().append(this.counterEl)}},{key:"_removeCounter",value:function(){s(this.counterEl).remove()}},{key:"updateCounter",value:function(){var t=+this.$el.attr("data-length"),e=this.el.value.length;this.isValidLength=e<=t;var i=e;t&&(i+="/"+t,this._validateInput()),s(this.counterEl).html(i)}},{key:"_validateInput",value:function(){this.isValidLength&&this.isInvalid?(this.isInvalid=!1,this.$el.removeClass("invalid")):this.isValidLength||this.isInvalid||(this.isInvalid=!0,this.$el.removeClass("valid"),this.$el.addClass("invalid"))}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_CharacterCounter}},{key:"defaults",get:function(){return e}}]),n}();M.CharacterCounter=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"characterCounter","M_CharacterCounter")}(cash),function(b){"use strict";var e={duration:200,dist:-100,shift:0,padding:0,numVisible:5,fullWidth:!1,indicators:!1,noWrap:!1,onCycleTo:null},t=function(t){function i(t,e){_classCallCheck(this,i);var n=_possibleConstructorReturn(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,i,t,e));return(n.el.M_Carousel=n).options=b.extend({},i.defaults,e),n.hasMultipleSlides=1'),n.$el.find(".carousel-item").each(function(t,e){if(n.images.push(t),n.showIndicators){var i=b('
  • ');0===e&&i[0].classList.add("active"),n.$indicators.append(i)}}),n.showIndicators&&n.$el.append(n.$indicators),n.count=n.images.length,n.options.numVisible=Math.min(n.count,n.options.numVisible),n.xform="transform",["webkit","Moz","O","ms"].every(function(t){var e=t+"Transform";return void 0===document.body.style[e]||(n.xform=e,!1)}),n._setupEventHandlers(),n._scroll(n.offset),n}return _inherits(i,Component),_createClass(i,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.M_Carousel=void 0}},{key:"_setupEventHandlers",value:function(){var i=this;this._handleCarouselTapBound=this._handleCarouselTap.bind(this),this._handleCarouselDragBound=this._handleCarouselDrag.bind(this),this._handleCarouselReleaseBound=this._handleCarouselRelease.bind(this),this._handleCarouselClickBound=this._handleCarouselClick.bind(this),void 0!==window.ontouchstart&&(this.el.addEventListener("touchstart",this._handleCarouselTapBound),this.el.addEventListener("touchmove",this._handleCarouselDragBound),this.el.addEventListener("touchend",this._handleCarouselReleaseBound)),this.el.addEventListener("mousedown",this._handleCarouselTapBound),this.el.addEventListener("mousemove",this._handleCarouselDragBound),this.el.addEventListener("mouseup",this._handleCarouselReleaseBound),this.el.addEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.addEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&(this._handleIndicatorClickBound=this._handleIndicatorClick.bind(this),this.$indicators.find(".indicator-item").each(function(t,e){t.addEventListener("click",i._handleIndicatorClickBound)}));var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){var i=this;void 0!==window.ontouchstart&&(this.el.removeEventListener("touchstart",this._handleCarouselTapBound),this.el.removeEventListener("touchmove",this._handleCarouselDragBound),this.el.removeEventListener("touchend",this._handleCarouselReleaseBound)),this.el.removeEventListener("mousedown",this._handleCarouselTapBound),this.el.removeEventListener("mousemove",this._handleCarouselDragBound),this.el.removeEventListener("mouseup",this._handleCarouselReleaseBound),this.el.removeEventListener("mouseleave",this._handleCarouselReleaseBound),this.el.removeEventListener("click",this._handleCarouselClickBound),this.showIndicators&&this.$indicators&&this.$indicators.find(".indicator-item").each(function(t,e){t.removeEventListener("click",i._handleIndicatorClickBound)}),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleCarouselTap",value:function(t){"mousedown"===t.type&&b(t.target).is("img")&&t.preventDefault(),this.pressed=!0,this.dragged=!1,this.verticalDragged=!1,this.reference=this._xpos(t),this.referenceY=this._ypos(t),this.velocity=this.amplitude=0,this.frame=this.offset,this.timestamp=Date.now(),clearInterval(this.ticker),this.ticker=setInterval(this._trackBound,100)}},{key:"_handleCarouselDrag",value:function(t){var e=void 0,i=void 0,n=void 0;if(this.pressed)if(e=this._xpos(t),i=this._ypos(t),n=this.reference-e,Math.abs(this.referenceY-i)<30&&!this.verticalDragged)(2=this.dim*(this.count-1)?this.target=this.dim*(this.count-1):this.target<0&&(this.target=0)),this.amplitude=this.target-this.offset,this.timestamp=Date.now(),requestAnimationFrame(this._autoScrollBound),this.dragged&&(t.preventDefault(),t.stopPropagation()),!1}},{key:"_handleCarouselClick",value:function(t){if(this.dragged)return t.preventDefault(),t.stopPropagation(),!1;if(!this.options.fullWidth){var e=b(t.target).closest(".carousel-item").index();0!==this._wrap(this.center)-e&&(t.preventDefault(),t.stopPropagation()),this._cycleTo(e)}}},{key:"_handleIndicatorClick",value:function(t){t.stopPropagation();var e=b(t.target).closest(".indicator-item");e.length&&this._cycleTo(e.index())}},{key:"_handleResize",value:function(t){this.options.fullWidth?(this.itemWidth=this.$el.find(".carousel-item").first().innerWidth(),this.imageHeight=this.$el.find(".carousel-item.active").height(),this.dim=2*this.itemWidth+this.options.padding,this.offset=2*this.center*this.itemWidth,this.target=this.offset,this._setCarouselHeight(!0)):this._scroll()}},{key:"_setCarouselHeight",value:function(t){var i=this,e=this.$el.find(".carousel-item.active").length?this.$el.find(".carousel-item.active").first():this.$el.find(".carousel-item").first(),n=e.find("img").first();if(n.length)if(n[0].complete){var s=n.height();if(0=this.count?t%this.count:t<0?this._wrap(this.count+t%this.count):t}},{key:"_track",value:function(){var t,e,i,n;e=(t=Date.now())-this.timestamp,this.timestamp=t,i=this.offset-this.frame,this.frame=this.offset,n=1e3*i/(1+e),this.velocity=.8*n+.2*this.velocity}},{key:"_autoScroll",value:function(){var t=void 0,e=void 0;this.amplitude&&(t=Date.now()-this.timestamp,2<(e=this.amplitude*Math.exp(-t/this.options.duration))||e<-2?(this._scroll(this.target-e),requestAnimationFrame(this._autoScrollBound)):this._scroll(this.target))}},{key:"_scroll",value:function(t){var e=this;this.$el.hasClass("scrolling")||this.el.classList.add("scrolling"),null!=this.scrollingTimeout&&window.clearTimeout(this.scrollingTimeout),this.scrollingTimeout=window.setTimeout(function(){e.$el.removeClass("scrolling")},this.options.duration);var i,n,s,o,a=void 0,r=void 0,l=void 0,h=void 0,d=void 0,u=void 0,c=this.center,p=1/this.options.numVisible;if(this.offset="number"==typeof t?t:this.offset,this.center=Math.floor((this.offset+this.dim/2)/this.dim),o=-(s=(n=this.offset-this.center*this.dim)<0?1:-1)*n*2/this.dim,i=this.count>>1,this.options.fullWidth?(l="translateX(0)",u=1):(l="translateX("+(this.el.clientWidth-this.itemWidth)/2+"px) ",l+="translateY("+(this.el.clientHeight-this.itemHeight)/2+"px)",u=1-p*o),this.showIndicators){var v=this.center%this.count,f=this.$indicators.find(".indicator-item.active");f.index()!==v&&(f.removeClass("active"),this.$indicators.find(".indicator-item").eq(v)[0].classList.add("active"))}if(!this.noWrap||0<=this.center&&this.center=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"prev",value:function(t){(void 0===t||isNaN(t))&&(t=1);var e=this.center-t;if(e>=this.count||e<0){if(this.noWrap)return;e=this._wrap(e)}this._cycleTo(e)}},{key:"set",value:function(t,e){if((void 0===t||isNaN(t))&&(t=0),t>this.count||t<0){if(this.noWrap)return;t=this._wrap(t)}this._cycleTo(t,e)}}],[{key:"init",value:function(t,e){return _get(i.__proto__||Object.getPrototypeOf(i),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Carousel}},{key:"defaults",get:function(){return e}}]),i}();M.Carousel=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"carousel","M_Carousel")}(cash),function(S){"use strict";var e={onOpen:void 0,onClose:void 0},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_TapTarget=i).options=S.extend({},n.defaults,e),i.isOpen=!1,i.$origin=S("#"+i.$el.attr("data-target")),i._setup(),i._calculatePositioning(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this.el.TapTarget=void 0}},{key:"_setupEventHandlers",value:function(){this._handleDocumentClickBound=this._handleDocumentClick.bind(this),this._handleTargetClickBound=this._handleTargetClick.bind(this),this._handleOriginClickBound=this._handleOriginClick.bind(this),this.el.addEventListener("click",this._handleTargetClickBound),this.originEl.addEventListener("click",this._handleOriginClickBound);var t=M.throttle(this._handleResize,200);this._handleThrottledResizeBound=t.bind(this),window.addEventListener("resize",this._handleThrottledResizeBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("click",this._handleTargetClickBound),this.originEl.removeEventListener("click",this._handleOriginClickBound),window.removeEventListener("resize",this._handleThrottledResizeBound)}},{key:"_handleTargetClick",value:function(t){this.open()}},{key:"_handleOriginClick",value:function(t){this.close()}},{key:"_handleResize",value:function(t){this._calculatePositioning()}},{key:"_handleDocumentClick",value:function(t){S(t.target).closest(".tap-target-wrapper").length||(this.close(),t.preventDefault(),t.stopPropagation())}},{key:"_setup",value:function(){this.wrapper=this.$el.parent()[0],this.waveEl=S(this.wrapper).find(".tap-target-wave")[0],this.originEl=S(this.wrapper).find(".tap-target-origin")[0],this.contentEl=this.$el.find(".tap-target-content")[0],S(this.wrapper).hasClass(".tap-target-wrapper")||(this.wrapper=document.createElement("div"),this.wrapper.classList.add("tap-target-wrapper"),this.$el.before(S(this.wrapper)),this.wrapper.append(this.el)),this.contentEl||(this.contentEl=document.createElement("div"),this.contentEl.classList.add("tap-target-content"),this.$el.append(this.contentEl)),this.waveEl||(this.waveEl=document.createElement("div"),this.waveEl.classList.add("tap-target-wave"),this.originEl||(this.originEl=this.$origin.clone(!0,!0),this.originEl.addClass("tap-target-origin"),this.originEl.removeAttr("id"),this.originEl.removeAttr("style"),this.originEl=this.originEl[0],this.waveEl.append(this.originEl)),this.wrapper.append(this.waveEl))}},{key:"_calculatePositioning",value:function(){var t="fixed"===this.$origin.css("position");if(!t)for(var e=this.$origin.parents(),i=0;i'+t.getAttribute("label")+"")[0]),i.each(function(t){var e=n._appendOptionWithIcon(n.$el,t,"optgroup-option");n._addOptionToValueDict(t,e)})}}),this.$el.after(this.dropdownOptions),this.input=document.createElement("input"),d(this.input).addClass("select-dropdown dropdown-trigger"),this.input.setAttribute("type","text"),this.input.setAttribute("readonly","true"),this.input.setAttribute("data-target",this.dropdownOptions.id),this.el.disabled&&d(this.input).prop("disabled","true"),this.$el.before(this.input),this._setValueToInput();var t=d('');if(this.$el.before(t[0]),!this.el.disabled){var e=d.extend({},this.options.dropdownOptions);e.onOpenEnd=function(t){var e=d(n.dropdownOptions).find(".selected").first();if(e.length&&(M.keyDown=!0,n.dropdown.focusedIndex=e.index(),n.dropdown._focusFocusedItem(),M.keyDown=!1,n.dropdown.isScrollable)){var i=e[0].getBoundingClientRect().top-n.dropdownOptions.getBoundingClientRect().top;i-=n.dropdownOptions.clientHeight/2,n.dropdownOptions.scrollTop=i}},this.isMultiple&&(e.closeOnClick=!1),this.dropdown=M.Dropdown.init(this.input,e)}this._setSelectedStates()}},{key:"_addOptionToValueDict",value:function(t,e){var i=Object.keys(this._valueDict).length,n=this.dropdownOptions.id+i,s={};e.id=n,s.el=t,s.optionEl=e,this._valueDict[n]=s}},{key:"_removeDropdown",value:function(){d(this.wrapper).find(".caret").remove(),d(this.input).remove(),d(this.dropdownOptions).remove(),d(this.wrapper).before(this.$el),d(this.wrapper).remove()}},{key:"_appendOptionWithIcon",value:function(t,e,i){var n=e.disabled?"disabled ":"",s="optgroup-option"===i?"optgroup-option ":"",o=this.isMultiple?'":e.innerHTML,a=d("
  • "),r=d("");r.html(o),a.addClass(n+" "+s),a.append(r);var l=e.getAttribute("data-icon");if(l){var h=d('');a.prepend(h)}return d(this.dropdownOptions).append(a[0]),a[0]}},{key:"_toggleEntryFromArray",value:function(t){var e=!this._keysSelected.hasOwnProperty(t),i=d(this._valueDict[t].optionEl);return e?this._keysSelected[t]=!0:delete this._keysSelected[t],i.toggleClass("selected",e),i.find('input[type="checkbox"]').prop("checked",e),i.prop("selected",e),e}},{key:"_setValueToInput",value:function(){var i=[];if(this.$el.find("option").each(function(t){if(d(t).prop("selected")){var e=d(t).text();i.push(e)}}),!i.length){var t=this.$el.find("option:disabled").eq(0);t.length&&""===t[0].value&&i.push(t.text())}this.input.value=i.join(", ")}},{key:"_setSelectedStates",value:function(){for(var t in this._keysSelected={},this._valueDict){var e=this._valueDict[t],i=d(e.el).prop("selected");d(e.optionEl).find('input[type="checkbox"]').prop("checked",i),i?(this._activateOption(d(this.dropdownOptions),d(e.optionEl)),this._keysSelected[t]=!0):d(e.optionEl).removeClass("selected")}}},{key:"_activateOption",value:function(t,e){e&&(this.isMultiple||t.find("li.selected").removeClass("selected"),d(e).addClass("selected"))}},{key:"getSelectedValues",value:function(){var t=[];for(var e in this._keysSelected)t.push(this._valueDict[e].el.value);return t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_FormSelect}},{key:"defaults",get:function(){return e}}]),n}();M.FormSelect=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"formSelect","M_FormSelect")}(cash),function(s,e){"use strict";var i={},t=function(t){function n(t,e){_classCallCheck(this,n);var i=_possibleConstructorReturn(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,n,t,e));return(i.el.M_Range=i).options=s.extend({},n.defaults,e),i._mousedown=!1,i._setupThumb(),i._setupEventHandlers(),i}return _inherits(n,Component),_createClass(n,[{key:"destroy",value:function(){this._removeEventHandlers(),this._removeThumb(),this.el.M_Range=void 0}},{key:"_setupEventHandlers",value:function(){this._handleRangeChangeBound=this._handleRangeChange.bind(this),this._handleRangeMousedownTouchstartBound=this._handleRangeMousedownTouchstart.bind(this),this._handleRangeInputMousemoveTouchmoveBound=this._handleRangeInputMousemoveTouchmove.bind(this),this._handleRangeMouseupTouchendBound=this._handleRangeMouseupTouchend.bind(this),this._handleRangeBlurMouseoutTouchleaveBound=this._handleRangeBlurMouseoutTouchleave.bind(this),this.el.addEventListener("change",this._handleRangeChangeBound),this.el.addEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.addEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.addEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.addEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.addEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.addEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_removeEventHandlers",value:function(){this.el.removeEventListener("change",this._handleRangeChangeBound),this.el.removeEventListener("mousedown",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("touchstart",this._handleRangeMousedownTouchstartBound),this.el.removeEventListener("input",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mousemove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("touchmove",this._handleRangeInputMousemoveTouchmoveBound),this.el.removeEventListener("mouseup",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("touchend",this._handleRangeMouseupTouchendBound),this.el.removeEventListener("blur",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("mouseout",this._handleRangeBlurMouseoutTouchleaveBound),this.el.removeEventListener("touchleave",this._handleRangeBlurMouseoutTouchleaveBound)}},{key:"_handleRangeChange",value:function(){s(this.value).html(this.$el.val()),s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px")}},{key:"_handleRangeMousedownTouchstart",value:function(t){if(s(this.value).html(this.$el.val()),this._mousedown=!0,this.$el.addClass("active"),s(this.thumb).hasClass("active")||this._showRangeBubble(),"input"!==t.type){var e=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",e+"px")}}},{key:"_handleRangeInputMousemoveTouchmove",value:function(){if(this._mousedown){s(this.thumb).hasClass("active")||this._showRangeBubble();var t=this._calcRangeOffset();s(this.thumb).addClass("active").css("left",t+"px"),s(this.value).html(this.$el.val())}}},{key:"_handleRangeMouseupTouchend",value:function(){this._mousedown=!1,this.$el.removeClass("active")}},{key:"_handleRangeBlurMouseoutTouchleave",value:function(){if(!this._mousedown){var t=7+parseInt(this.$el.css("padding-left"))+"px";s(this.thumb).hasClass("active")&&(e.remove(this.thumb),e({targets:this.thumb,height:0,width:0,top:10,easing:"easeOutQuad",marginLeft:t,duration:100})),s(this.thumb).removeClass("active")}}},{key:"_setupThumb",value:function(){this.thumb=document.createElement("span"),this.value=document.createElement("span"),s(this.thumb).addClass("thumb"),s(this.value).addClass("value"),s(this.thumb).append(this.value),this.$el.after(this.thumb)}},{key:"_removeThumb",value:function(){s(this.thumb).remove()}},{key:"_showRangeBubble",value:function(){var t=-7+parseInt(s(this.thumb).parent().css("padding-left"))+"px";e.remove(this.thumb),e({targets:this.thumb,height:30,width:30,top:-30,marginLeft:t,duration:300,easing:"easeOutQuint"})}},{key:"_calcRangeOffset",value:function(){var t=this.$el.width()-15,e=parseFloat(this.$el.attr("max"))||100,i=parseFloat(this.$el.attr("min"))||0;return(parseFloat(this.$el.val())-i)/(e-i)*t}}],[{key:"init",value:function(t,e){return _get(n.__proto__||Object.getPrototypeOf(n),"init",this).call(this,this,t,e)}},{key:"getInstance",value:function(t){return(t.jquery?t[0]:t).M_Range}},{key:"defaults",get:function(){return i}}]),n}();M.Range=t,M.jQueryLoaded&&M.initializeJqueryWrapper(t,"range","M_Range"),t.init(s("input[type=range]"))}(cash,M.anime); \ No newline at end of file diff --git a/Timelapse/Timelapse.csproj b/Timelapse/Timelapse.csproj new file mode 100644 index 0000000..d550884 --- /dev/null +++ b/Timelapse/Timelapse.csproj @@ -0,0 +1,29 @@ + + + + Library + net6.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + diff --git a/Timelapse/TimelapseCamera.cs b/Timelapse/TimelapseCamera.cs new file mode 100644 index 0000000..1aed0b9 --- /dev/null +++ b/Timelapse/TimelapseCamera.cs @@ -0,0 +1,24 @@ +namespace Timelapse.Desktop; +using FlashCap; +using FlashCap.Devices; +using FlashCap.Utilities; + +public class TimelapseCamera +{ + + + public TimelapseCamera(CaptureDeviceDescriptor desc,VideoCharacteristics characteristics) + { + DeviceDescriptor=desc; + VideoCharacteristics = characteristics; + + } + + public CaptureDeviceDescriptor? DeviceDescriptor {get;set;} + + + public VideoCharacteristics? VideoCharacteristics {get;set;} + + + +} \ No newline at end of file diff --git a/Timelapse/WebServer.cs b/Timelapse/WebServer.cs new file mode 100644 index 0000000..9cc0fe5 --- /dev/null +++ b/Timelapse/WebServer.cs @@ -0,0 +1,268 @@ +namespace Timelapse.Desktop; + +using System; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Text; +using Eto.Forms; +using FlashCap; +using FlashCap.Devices; +using FlashCap.Utilities; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Tesses.WebServer; + +public class proxsvr : Tesses.WebServer.IServer +{ + public proxsvr(IServer svr) + { + dest=svr; + } + IServer dest; + public void AddCors(ServerContext ctx) + { + + dest.AddCors(ctx); + } + + public async Task BeforeAsync(ServerContext ctx) + { + return await dest.BeforeAsync(ctx); + } + + public async Task GetAsync(ServerContext ctx) + { + await dest.GetAsync(ctx); + if(ctx.RawUrl != "/api/stream.jpg") + { + await ctx.NetworkStream.DisposeAsync(); + } + } + + public async Task OptionsAsync(ServerContext ctx) + { + await dest.OptionsAsync(ctx); + await ctx.NetworkStream.DisposeAsync(); + } + + public async Task OtherAsync(ServerContext ctx) + { + await dest.OtherAsync(ctx); + await ctx.NetworkStream.DisposeAsync(); + } + + public async Task PostAsync(ServerContext ctx) + { + await dest.PostAsync(ctx); + await ctx.NetworkStream.DisposeAsync(); + } +} +public class EmbeadedServer : Server +{ + + public EmbeadedServer(string extname) + { + this.extname=extname; + } + string extname; + + public override async Task GetAsync(ServerContext ctx) + { + var asm=Assembly.GetExecutingAssembly(); + + if(asm != null) + { + string j=$"{extname}{ctx.UrlPath.Replace('/','.')}"; + var strm=asm.GetManifestResourceStream(j); + if(strm != null) + { + await ctx.SendStreamAsync(strm,HeyRed.Mime.MimeTypesMap.GetMimeType(ctx.UrlPath)); + return; + } + + j=j.TrimEnd('.') + ".index.html"; + strm=asm.GetManifestResourceStream(j); + if(strm != null) + { + await ctx.SendStreamAsync(strm,HeyRed.Mime.MimeTypesMap.GetMimeType("index.html")); + return; + } + } + await NotFoundServer.ServerNull.GetAsync(ctx); + } +} +public class TimelapseWebServer +{ + MainForm frm; + public TimelapseWebServer(MainForm frm) + { + this.frm=frm; + } + CancellationTokenSource? tokenSrc; + TcpListener? _listener; + + private async Task CommunicateHostAsync(HttpServerListener listener,TcpClient clt) + { + try{ + // HTTP/1.1\r\n + //HEADER1\r\n + //HEADER2\r\n + //...... + //HEADERN\r\n + //\r\n + //OPTIONAL REQUEST BODY + + //RESPONSE + + var strm = listener.GetStream(clt); + + + await listener.PushAsync(strm,clt.Client.LocalEndPoint,clt.Client.RemoteEndPoint); + + }catch(Exception ex) + { + _=ex; + } + + } + + public async Task ListenAsync(HttpServerListener svr,CancellationToken token,Action endpoint) + { + if(_listener == null) return; + _listener.Start(); + if(endpoint != null) + { + endpoint((IPEndPoint)_listener.LocalEndpoint); + } + using (var r = token.Register(() => _listener.Stop())) { + while (!token.IsCancellationRequested) + { + try{ + var socket=await _listener.AcceptTcpClientAsync(); + await CommunicateHostAsync(svr,socket).ConfigureAwait(false); + }catch(Exception ex) + { + _=ex; + } + } + } + } + public async void Listen() + { + if(tokenSrc != null) + { + tokenSrc.Cancel(); + tokenSrc.Dispose(); + + } + if(!frm.Instance.Model.enableWebServer) return; + tokenSrc=new CancellationTokenSource(); + //#if (!DEBUG) + EmbeadedServer esvr=new EmbeadedServer("Timelapse.ServerFiles"); + // #else + // StaticServer esvr=new StaticServer("ServerFiles"); + //#endif + RouteServer rs=new RouteServer(); + rs.Add("/stream.jpg",StreamImage); + rs.Add("/state.json",State); + rs.Add("/setstate.cgi",SetState); + MountableServer isvr=new MountableServer(esvr); + isvr.Mount("/api/",rs);var p=new System.Net.IPEndPoint(System.Net.IPAddress.Any,frm.Instance.Model.timelapsePort); + _listener=new TcpListener(p); + HttpServerListener svr=new HttpServerListener(p,new proxsvr(isvr)); + Console.WriteLine("Almost ready to listen"); + await ListenAsync(svr,tokenSrc.Token,(e)=>{ + int port=e.Port; + string dns=Dns.GetHostName(); + + var localIPs =string.Join('\n', Dns.GetHostAddresses(dns).Where(e=>{return !IPAddress.IsLoopback(e);}).Select(e=>{ + return $"http://{e.ToString()}:{port}/"; + })); + if(frm.synchContext != null) + frm.synchContext.Post((e)=>{ + + + MessageBox.Show($"Listening on:\n{localIPs}\nhttp://localhost:{port}\nhttp://{dns}:{port}/",MessageBoxButtons.OK); + },null); + }); + + } + + private async Task SetState(ServerContext ctx) + { + string rec; + if(ctx.QueryParams.TryGetFirst("rec",out rec)) + { + frm.Instance.Recording= rec != "false"; + } + string real; + if(ctx.QueryParams.TryGetFirst("real",out real)) + { + frm.Instance.RealTime= real != "false"; + } + await ctx.SendRedirectAsync("./state.json"); + + } + + private async Task State(ServerContext ctx) + { + await ctx.SendJsonAsync(new{Recording=frm.Instance.Recording,RealTime=frm.Instance.RealTime}); + } + + private byte[] GetBytes(Image img) + { + using(var ms=new MemoryStream()) + { + img.SaveAsJpeg(ms); + return ms.ToArray(); + } + } + private async Task StreamImage(ServerContext ctx) + { + ctx.ResponseHeaders.Add("Content-Type","multipart/x-mixed-replace; boundary=--boundary"); + await ctx.WriteHeadersAsync(); + frm.NewFrame += (sender,e)=>{ + try{ + var img=e.Image.Clone(); + Thread t =new Thread(()=>{ + + + try{ + lock(ctx){ + StringBuilder b = new StringBuilder(); + byte[] data = GetBytes(img); + img.Dispose(); + b.Append("\r\n"); + b.Append("--boundary\r\n"); + b.Append("Content-Type: image/jpeg\r\n"); + b.Append($"Content-Length: {data.Length}\r\n"); + b.Append("\r\n"); + + byte[] hdr= Encoding.ASCII.GetBytes(b.ToString()); + byte[] crlf = Encoding.ASCII.GetBytes("\r\n"); + ctx.NetworkStream.Write(hdr,0,hdr.Length); + ctx.NetworkStream.Write(data,0,data.Length); + ctx.NetworkStream.Write(crlf,0,crlf.Length); + ctx.NetworkStream.Flush(); + } + + }catch(Exception ex) + { + try{ + ctx.NetworkStream.Dispose(); + }catch(Exception ex2) + { + _=ex2; + } + _=ex; + } + }); + t.Start(); + }catch(Exception ex) + { + _=ex; + } + }; + } +} \ No newline at end of file diff --git a/TimelapseApi/Api.cs b/TimelapseApi/Api.cs new file mode 100644 index 0000000..0c69d5b --- /dev/null +++ b/TimelapseApi/Api.cs @@ -0,0 +1,259 @@ +namespace TimelapseApi; +using FlashCap; +using FlashCap.Utilities; +using FlashCap.Devices; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using Eto.Forms; +using TimelapseApi.ClassExtensions; +using Newtonsoft.Json; + +public class GuiData +{ + public async Task Set() + { + if(Instance ==null) return; + var s= Instance._extSettings; + ExtensionLoader.Data=this; + s.Add(( + ()=>{ + return new TimelapseSettings(Instance); + },"Settings",TimelapseExtension.Null + )); + foreach(var ext in ExtensionLoader.GetTimelapseExtensions()) + { + ext.Instance=Instance; + Instance.Extensions.Add(ext); + await ext._Create(); + } + } + public void FSChanged() + { + if(Instance != null) + { + if(Instance.Project != null) + { + Instance.Project=null; + } + } + } + public IEnumerable<(Func>,string,CancellationToken,Task> Export,string Text,TimelapseExtension Extension,FileFilter[] SaveDialogFilters)>? Export {get { + if(Instance == null) return null; + return Instance._export; + }} + + public IEnumerable<(Func Dialog,string Text,TimelapseExtension Extension)>? ExtensionSettings {get {if(Instance == null) return null; return Instance._extSettings;}} + public Api? Instance {get;set;} + + public List<(TimelapseFileSystem FileSystem,string Text,TimelapseExtension)>? FileSystems {get { if(Instance==null)return null; return Instance._fs;}} + public TimelapseFileSystem? CurrentFileSystem {get {var fs=FileSystems; if(fs==null) return null; return fs[CurrentFSIndex].FileSystem;} } + + public IEnumerable<(Func ShareActionAsync,string Text,TimelapseExtension extension)>? Share {get {if(Instance==null) return null;return Instance._share;}} + public int CurrentFSIndex {get;set;} +} +public class Api +{ + public TimelapseSettingsModel Model = LoadModel(); + internal static string ModelLocation = GetInternalFile("config.json"); + private static TimelapseSettingsModel LoadModel() + { + + Directory.CreateDirectory(GetInternalFile("ExtensionBinaries")); + Directory.CreateDirectory(GetInternalFile("ExtensionData")); + if(File.Exists(ModelLocation)) + { + TimelapseSettingsModel? model= JsonConvert.DeserializeObject(File.ReadAllText(ModelLocation)); + if(model != null) return model; + } + return new TimelapseSettingsModel(); + } + public void SaveModel() + { + Directory.CreateDirectory(GetInternalFile()); + + File.WriteAllText(ModelLocation, JsonConvert.SerializeObject(Model)); + + } + + private static string Get() + { + if(File.Exists("appdir.txt") ) + return File.ReadAllText("appdir.txt"); + else + return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"TimelapseNow"); + } + public static string GetInternalFile(params string[] paths) + { + if(paths.Length == 0) return Get(); + return Path.Combine(Get(),Path.Combine(paths)); + } + public event EventHandler? ProjectClosed; + + public event EventHandler? ProjectOpened; + public Api(GuiData data) + { + + Gui=data; + } + + private TimelapseProject? _proj=null; + public TimelapseProject? Project {get {return _proj;} set { + + if(value != null) + { + if(_proj != null) + { + ProjectClosed?.Invoke(this,EventArgs.Empty); + } + _proj=value; + ProjectOpened?.Invoke(this,EventArgs.Empty); + }else{ + ProjectClosed?.Invoke(this,EventArgs.Empty); + _proj=value; + } + + }} + public event EventHandler? RecordingChanged; + + public event EventHandler? RealTimeChanged; + + bool _rec,_real; + + public bool Recording {get { + if(Project == null) return false; + return _rec;} set { + _rec=value; + RecordingChanged?.Invoke(this,EventArgs.Empty); + }} + + public bool RealTime { get{if(Project == null) return false; return _real;} set{ + _real =value; + RealTimeChanged?.Invoke(this,EventArgs.Empty); + }} + + + public async Task RecordFrame(Image img) + { + + if(Project !=null && Recording) + { + var interval = RealTime ? TimeSpan.FromSeconds(1) : (TimeSpan)Project.Interval; + var now=DateTime.Now; + if((Project.LastFrameTaken + (interval/10)) <= now) + { + Project.LastFrameTaken=now; + await Project.Save(img); + } + } + + } + public async Task SendFrame(Image img) + { + bool canRecordFrame=true; + foreach(var item in _frameHandlers) + { + if(ExtensionAllowedToBeFrameHandler(item.Extension)) + { + if(item.Handler != null) + { + var res=await item.Handler(img); + if(!res && ExtensionsCanBlockFrames(item.Extension)) canRecordFrame=false; + } + } + } + if(canRecordFrame) + { + await RecordFrame(img); + } + } + internal bool ExtensionsCanBlockFrames(TimelapseExtension ext) + { + if(!Model.canBlockFrames) return false; + + return !Model.deniedBlockExtensions.Contains( ext.Id); + } + internal bool ExtensionAllowedToBeFrameHandler(TimelapseExtension ext) + { + if(!Model.canOverlayVideo) return false; + + return !Model.deniedOverlayExtensions.Contains( ext.Id); + + } + private GuiData Gui; + public int CurrentFileSystemIndex {get {return Gui.CurrentFSIndex;}} + + internal List<(TimelapseFileSystem FileSystem,string Text,TimelapseExtension Extension)> _fs = CreateFileSystemList(); + + internal List Extensions =new List(); + private static List<(TimelapseFileSystem FileSystem,string Text,TimelapseExtension Extension)> CreateFileSystemList() + { + List<(TimelapseFileSystem FileSystem,string Text,TimelapseExtension Extension)> fs=new List<(TimelapseFileSystem FileSystem,string Text,TimelapseExtension Extension)>(); + fs.Add((new NativeFileSystem(),"Native",TimelapseExtension.Null)); + return fs; + } + + internal List<(Func,Task> Handler,string HandlerName, TimelapseExtension Extension)> _frameHandlers=new List<(Func, Task> Handler,string HandlerName, TimelapseExtension Extension)>(); + + internal List<(Func Dialog,string Text,TimelapseExtension Extension)> _extSettings= new List<(Func Dialog,string Text,TimelapseExtension Extension)>(); + + + + + public async Task Export(Window w,int exportId) + { + if(Project == null) return null; + var e=_export[exportId]; + using(var sfd = new SaveFileDialog()) + { + foreach(var item in e.SaveDialogFilters) + { + sfd.Filters.Add(item); + } + if(sfd.ShowDialog(w) == DialogResult.Ok) + { + try{ + using(var cts=new CancellationTokenSource()) + { + using(ExportForm frm=new ExportForm(Project,cts)) + { + frm.Show(); + await e.Export(frm,sfd.FileName,cts.Token); + + } + } + return sfd.FileName; + }catch(Exception ex) + { + _=ex; + } + } + return null; + } + } + + internal List<(Func>,string,CancellationToken,Task> Export,string Text,TimelapseExtension Extension,FileFilter[] SaveDialogFilters)> _export=GetExports(); + + private static List<(Func>, string, CancellationToken, Task> Export, string Text, TimelapseExtension Extension, FileFilter[] SaveDialogFilters)> GetExports() + { + var exp=new List<(Func>,string,CancellationToken,Task> Export,string Text,TimelapseExtension Extension,FileFilter[] SaveDialogFilters)>(); + Func>,string,CancellationToken,Task> callback=async(images,fname,token)=>{ + using(var vfc=new VideoFileCreator(fname)) + { + foreach(var img in images) + { + await vfc.AddAsync(img); + if(token.IsCancellationRequested) + { + break; + } + } + } + }; + exp.Add((callback,"Export (FFmpeg)",TimelapseExtension.Null,new FileFilter[]{new FileFilter("MPEG-4",".mp4"),new FileFilter("MKV",".mkv")})); + return exp; + } + + internal List<(Func ShareActionAsync,string Text,TimelapseExtension Extension)> _share=new List<(Func ShareActionAsync, string Text,TimelapseExtension Extension)>(); + + +} diff --git a/TimelapseApi/ClassExtensions.cs b/TimelapseApi/ClassExtensions.cs new file mode 100644 index 0000000..8c06b0b --- /dev/null +++ b/TimelapseApi/ClassExtensions.cs @@ -0,0 +1,31 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace TimelapseApi.ClassExtensions; + +public static class Extensions +{ + public static async Task AddAsync(this VideoFileCreator video, Image img) + { + using(var ms = new MemoryStream()) + { + img.SaveAsPng(ms); + byte[] data =ms.ToArray(); + await video.AddAsync(data); + } + + + } + public static void Add(this VideoFileCreator video,Image img) + { + + using(var ms = new MemoryStream()) + { + img.SaveAsPng(ms); + byte[] data =ms.ToArray(); + video.Add(data); + } + + + } +} \ No newline at end of file diff --git a/TimelapseApi/ExportForm.cs b/TimelapseApi/ExportForm.cs new file mode 100644 index 0000000..073928a --- /dev/null +++ b/TimelapseApi/ExportForm.cs @@ -0,0 +1,82 @@ +using System.Collections; +using Eto.Forms; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +namespace TimelapseApi; + +internal class ExportForm :Form, IEnumerator> , IEnumerable> +{ + + int _i=-1; + int i {get {return _i;} set{bar.Value=value+1; bar.Invalidate(); _i=value; }} + int count; + ProgressBar bar; + Button cancel; + CancellationTokenSource src; + TimelapseProject _proj; + public ExportForm(TimelapseProject proj,CancellationTokenSource token) + { + Width=258; Height=73; + + Title="Exporting"; + _proj=proj; + src=token; + bar=new ProgressBar {MaxValue=proj.FrameCount,MinValue=0}; + cancel=new Button {Text = "Cancel"}; + count=proj.FrameCount; + + + DynamicLayout lyt=new DynamicLayout(); + lyt.BeginVertical(); + lyt.BeginHorizontal(); + lyt.Add(bar,true); + lyt.EndHorizontal(); + lyt.EndBeginVertical(); + lyt.AddSpace(true,true); + lyt.BeginHorizontal(); + lyt.AddSpace(true); + lyt.Add(cancel); + lyt.EndHorizontal(); + lyt.EndVertical(); + Content=lyt; + + + } + private Image GetImage() + { + if(_proj.ProjectLocation==null) + { + return new Image(1280,720); + } + using(var s=_proj.ProjectLocation.Open($"Sections/{_proj.SectionName}/{i}.png",FileMode.Open,FileAccess.Read,FileShare.Read)) + { + return Image.Load(s); + } + } + public Image Current { + get { + return GetImage(); + } + } + + object IEnumerator.Current {get{return Current;}} + public IEnumerator> GetEnumerator() + { + return this; + } + + public bool MoveNext() + { + return ++i < count; + } + + public void Reset() + { + i=-1; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } +} \ No newline at end of file diff --git a/TimelapseApi/ExtensionFeatures.cs b/TimelapseApi/ExtensionFeatures.cs new file mode 100644 index 0000000..05c8b78 --- /dev/null +++ b/TimelapseApi/ExtensionFeatures.cs @@ -0,0 +1,81 @@ +namespace TimelapseApi; +using Eto.Forms; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +public sealed class ExtensionFeatures +{ + internal Api? Instance {get { return Extension.Instance;}} + internal TimelapseExtension Extension {get;private set;} + internal bool Valid {get;private set;} + internal ExtensionFeatures(TimelapseExtension ext) + { + Extension=ext; + Valid=true; + } + public ExtensionFeatures RegisterSettingsDialog(Func dialog,string text) + { + if(!Valid || Instance == null) return this; + + Instance._extSettings.Add((dialog,text,Extension)); + return this; + } + public ExtensionFeatures RegisterAsyncFrameHandler(Func,Task> handler,string handlerName) + { + if(!Valid || Instance == null) return this; + Instance._frameHandlers.Add((handler,handlerName,Extension)); + return this; + } + public ExtensionFeatures RegisterFileSystem(TimelapseFileSystem fs,string name) + { + if(!Valid || Instance == null) return this; + Instance._fs.Add((fs,name,Extension)); + return this; + } + public ExtensionFeatures RegisterFrameHandler(Func,bool> handler,string handlerName) + { + if(!Valid) return this; + RegisterAsyncFrameHandler(async(e)=>{ + if(handler !=null) + { + return await Task.Run(()=>{ + return handler(e); + }); + } + return true; + },handlerName); + return this; + } + public ExtensionFeatures RegisterExport(Func>,string,CancellationToken,Task> export,FileFilter[] filter,string text) + { + if(!Valid || Instance == null) return this; + if(export != null) + Instance._export.Add((export,text,Extension,filter)); + return this; + } + public ExtensionFeatures RegisterAsyncShareTarget(Func share,string text) + { + if(!Valid || Instance == null) return this; + if(share != null) + Instance._share.Add((share,text,Extension)); + return this; + } + public ExtensionFeatures RegisterShareTarget(Action share,string text) + { + if(!Valid) return this; + return RegisterAsyncShareTarget(async(s,e)=>{ + await Task.Run( + ()=>{ + if(share !=null) + { + share(s,e); + } + } + ); + },text); + } + public void Close() + { + Valid=false; + } +} \ No newline at end of file diff --git a/TimelapseApi/ExtensionInfo.cs b/TimelapseApi/ExtensionInfo.cs new file mode 100644 index 0000000..d501031 --- /dev/null +++ b/TimelapseApi/ExtensionInfo.cs @@ -0,0 +1,25 @@ +namespace TimelapseApi +{ + public class ExtensionInfo + { + public ExtensionInfo() + { + name="N/A"; + author="N/A"; + version="0.0.0"; + description=""; + } + /* { + "name": "TimelapseExtension0001", + "author": "YourNameOrCompanyName", + "version": "1.0.0", + "description": "Some Description" +}*/ + public string name {get;set;} + + public string author {get;set;} + public string version {get;set;} + + public string description {get;set;} + } +} \ No newline at end of file diff --git a/TimelapseApi/ExtensionLoader.cs b/TimelapseApi/ExtensionLoader.cs new file mode 100644 index 0000000..496b506 --- /dev/null +++ b/TimelapseApi/ExtensionLoader.cs @@ -0,0 +1,101 @@ +namespace TimelapseApi; + +using System.Reflection; +using Eto.Forms; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System.IO.Compression; +using Newtonsoft.Json; + +public class ExtensionLoader +{ + private static GuiData? _data; + public static GuiData Data {set{ + _data=value; + }} + + public static async Task InstallExtension(string path,bool add=false) + { + string dirTmp = Api.GetInternalFile("ExtTMP"); + if(Directory.Exists(dirTmp)) + { + Directory.Delete(dirTmp,true); + } + ZipFile.ExtractToDirectory(path,dirTmp); + var info=GetExtensionInfo(Path.Combine(dirTmp,"extension_info.json")); + if(info != null) + { + Directory.CreateDirectory(Api.GetInternalFile("ExtensionInfo")); + File.Copy(Path.Combine(dirTmp,"extension_info.json"),Api.GetInternalFile("ExtensionInfo",$"{info.name}.json")); + Directory.Move(Path.Combine(dirTmp,"ExtTMP","extension"),Api.GetInternalFile("ExtensionBinaries",info.name)); + File.Move(Api.GetInternalFile("ExtensionBinaries",info.name,"extension.dll"),Api.GetInternalFile("ExtensionBinaries",info.name,$"{info.name}.dll")); + + if(add) + { + string dir=Api.GetInternalFile("ExtensionBinaries",info.name); + string dirname=Path.GetFileName(dir); + string extname = Path.Combine(dir,$"{dirname}.dll"); + + var asm= Assembly.LoadFrom(extname); + foreach(var ext in asm.GetExportedTypes()) + { + if(ext.IsAssignableTo(typeof(TimelapseExtension))) + { + var ext2= (TimelapseExtension?)Activator.CreateInstance(ext); + + if(ext2 !=null && _data != null && _data.Instance != null) + { + var instance=_data.Instance; + ext2.FileName = dirname; + ext2.Instance=instance; + instance.Extensions.Add(ext2); + await ext2._Create(); + } + } + } + + } + } + } + public static ExtensionInfo? GetExtensionInfo(string filename) + { + if(!File.Exists(filename)) + { + filename=Api.GetInternalFile("ExtensionInfo",$"{filename}.json"); + if(!File.Exists(filename)) + { + return null; + } + } + return JsonConvert.DeserializeObject(File.ReadAllText(filename)); + } + public static IEnumerable GetTimelapseExtensions() + { + string dirtoitterateon= Api.GetInternalFile("ExtensionBinaries"); + if(!Directory.Exists(dirtoitterateon)) yield break; + foreach(var dir in Directory.GetDirectories(dirtoitterateon)) + { + //get dirname + string dirname = Path.GetFileName(dir); + string extname = Path.Combine(dir,$"{dirname}.dll"); + + if(File.Exists(extname)) + { + var asm= Assembly.LoadFrom(extname); + foreach(var ext in asm.GetExportedTypes()) + { + if(ext.IsAssignableTo(typeof(TimelapseExtension))) + { + var ext2= (TimelapseExtension?)Activator.CreateInstance(ext); + + if(ext2 !=null) + { + ext2.FileName = dirname; + yield return ext2; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/TimelapseApi/LockObj.cs b/TimelapseApi/LockObj.cs new file mode 100644 index 0000000..993c84b --- /dev/null +++ b/TimelapseApi/LockObj.cs @@ -0,0 +1,25 @@ +namespace TimelapseApi; +/// +///an empty object to use lock() { } with +/// +public class LockObj +{ + private LockObj() + { + + } + public static LockObj Create() + { + return new LockObj(); + } + public void Lock(Action a) + { + if(a ==null) + return; + lock(this) + { + + a(); + } + } +} \ No newline at end of file diff --git a/TimelapseApi/TimelapseApi.csproj b/TimelapseApi/TimelapseApi.csproj new file mode 100644 index 0000000..80324fd --- /dev/null +++ b/TimelapseApi/TimelapseApi.csproj @@ -0,0 +1,30 @@ + + + + Library + net6.0 + enable + enable + true + Tesses.TimelapseApi + Mike Nolan + Tesses + 1.0.0 + 1.0.0 + 1.0.0 + The api for TimelapseNow + GPL-3.0-only + true + Camera, Timelapse, Record + https://gitlab.tesses.net/tesses50/timelapsenow + + + + + + + + + + + diff --git a/TimelapseApi/TimelapseExtension.cs b/TimelapseApi/TimelapseExtension.cs new file mode 100644 index 0000000..76009ad --- /dev/null +++ b/TimelapseApi/TimelapseExtension.cs @@ -0,0 +1,65 @@ +namespace TimelapseApi; + +public abstract class TimelapseExtension : IDisposable +{ + + public Api? Instance {get;internal set;} + private class Nill : TimelapseExtension + { + public override string Name => "Timelapse"; + public override Guid Id => Guid.Empty; + } + private static Nill _null=new Nill(); + + + public static TimelapseExtension Null {get {return _null;}} + public abstract string Name {get;} + + public string? FileName {get;internal set;} + + public abstract Guid Id {get;} + + protected virtual async Task OnCreateAsync(ExtensionFeatures features) + { + await Task.FromResult(true); + } + protected virtual void OnCreate(ExtensionFeatures features) + { + + } + public string GetExtensionFolder() + { + string p = Api.GetInternalFile($"ExtensionData/{Id}"); + Directory.CreateDirectory(p); + return p; + + } + public TimelapseFileSystem? GetProjectSpecificLocation() + { + if(Instance != null && Instance.Project != null && Instance.Project.ProjectLocation != null) + { + Instance.Project.ProjectLocation.CreateDirectory("ExtensionData"); + Instance.Project.ProjectLocation.CreateDirectory($"ExtensionData/{Id}"); + var f= Instance.Project.ProjectLocation + $"ExtensionData/{Id}"; + return new Protect(f); + } + return null; + } + + internal async Task _Create() + { + ExtensionFeatures features=new ExtensionFeatures(this); + await OnCreateAsync(features); + OnCreate(features); + features.Close(); + } + + public void Dispose() + { + OnDestroy(); + } + protected virtual void OnDestroy() + { + + } +} \ No newline at end of file diff --git a/TimelapseApi/TimelapseFileSystem.cs b/TimelapseApi/TimelapseFileSystem.cs new file mode 100644 index 0000000..d06277e --- /dev/null +++ b/TimelapseApi/TimelapseFileSystem.cs @@ -0,0 +1,417 @@ +namespace TimelapseApi; +using Eto.Forms; + +public class Protect : TimelapseFileSystem +{ + TimelapseFileSystem fs; + public Protect(TimelapseFileSystem fs) + { + this.fs=fs; + } + + public override void CreateDirectory(string path) + { + fs.CreateDirectory(path); + } + + public override void DeleteDirectory(string path) + { + fs.DeleteDirectory(path); + } + + public override void DeleteFile(string path) + { + fs.DeleteFile(path); + } + + public override bool DirectoryExists(string path) + { + return fs.DirectoryExists(path); + } + + public override bool FileExists(string path) + { + return fs.FileExists(path); + } + + public override Stream Open(string path, FileMode mode, FileAccess access, FileShare share) + { + return fs.Open(path,mode,access,share); + } + + protected override IEnumerable GetDirectoriesImpl(string path, string filter = "*") + { + foreach(var items in fs.GetDirectories(path,filter)) + { + yield return CombinePath(path,items); + } + } + public override string? ShowSaveDialog(Window parent, FileFilter[] filters, string startDir = "") + { + return fs.ShowSaveDialog(parent, filters, startDir); + } + public override string[] ShowOpenDialog(Window parent, FileFilter[] filters, bool multi, string startDir = "") + { + return fs.ShowOpenDialog(parent, filters, multi, startDir); + } + public override string? ShowDirectoryDialog(Window parent, string startDir = "") + { + return fs.ShowDirectoryDialog(parent,startDir); + } + protected override IEnumerable GetFilesImpl(string path, string filter = "*") + { + foreach(var items in fs.GetFiles(path,filter)) + { + yield return CombinePath(path,items); + } + } +} +public class NativeFileSystem : TimelapseFileSystem +{ + public override void CreateDirectory(string path) + { + Directory.CreateDirectory(path); + } + + public override void DeleteDirectory(string path) + { + Directory.Delete(path); + } + + public override void DeleteFile(string path) + { + File.Delete(path); + } + + public override bool DirectoryExists(string path) + { + return Directory.Exists(path); + } + + public override bool FileExists(string path) + { + return File.Exists(path); + } + + public override Stream Open(string path, FileMode mode, FileAccess access, FileShare share) + { + + return File.Open(path,mode,access,share); + } + + protected override IEnumerable GetDirectoriesImpl(string path, string filter = "*") + { + return Directory.EnumerateDirectories(path,filter); + } + public override string? ShowDirectoryDialog(Window parent, string startDir = "") + { + using(var d = new SelectFolderDialog()) + { + if(!string.IsNullOrWhiteSpace(startDir)) + { + d.Directory = startDir; + } + return d.ShowDialog(parent) == DialogResult.Ok ? d.Directory : null; + } + } + public override string[] ShowOpenDialog(Window parent, FileFilter[] filters,bool multi, string startDir = "") + { + using(var ofd=new OpenFileDialog()) + { + ofd.MultiSelect = multi; + if(!string.IsNullOrWhiteSpace(startDir)) + { + ofd.Directory = new Uri(startDir); + } + foreach(var f in filters) + { + ofd.Filters.Add(f); + } + return ofd.ShowDialog(parent) == DialogResult.Ok ? ofd.Filenames.ToArray() : new string[0]; + } + } + public override string? ShowSaveDialog(Window parent, FileFilter[] filters, string startDir = "") + { + using(var sfd=new SaveFileDialog()) + { + if(!string.IsNullOrWhiteSpace(startDir)) + { + sfd.Directory = new Uri(startDir); + } + foreach(var f in filters) + { + sfd.Filters.Add(f); + } + return sfd.ShowDialog(parent) == DialogResult.Ok ? sfd.FileName : null; + } + } + public override void DeleteDirectory(string path, bool recursive) + { + Directory.Delete(path,recursive); + } + + protected override IEnumerable GetFilesImpl(string path, string filter = "*") + { + return Directory.EnumerateFiles(path,filter); + } +} + +public abstract class TimelapseFileSystem +{ + public string ReadAllText(string path) + { + using (var s=Open(path,FileMode.Open,FileAccess.Read,FileShare.Read)) + { + using(var sr=new StreamReader(s)) + { + return sr.ReadToEnd(); + } + } + } + public void WriteAllText(string path,string? contents) + { + using (var s=Open(path,FileMode.Create,FileAccess.Write,FileShare.None)) + { + using(var sw=new StreamWriter(s)) + { + sw.Write(contents); + } + } + } + + public string? ShowOpenDialog(Window parent,FileFilter[] filters,string startDir="") + { + var res=ShowOpenDialog(parent,filters,false,startDir); + return res.Length == 1 ? res[0] : null; + } + public virtual string[] ShowOpenDialog(Window parent,FileFilter[] filters,bool multi,string startDir="") + { + throw new Exception(); + } + + public virtual string? ShowSaveDialog(Window parent,FileFilter[] filters,string startDir="") + { + throw new Exception(); + } + public virtual string? ShowDirectoryDialog(Window parent,string startDir="") + { + throw new Exception(); + } + + public int GetNumberOfFiles(string path,string filter="*") + { + return GetFilesImpl(path,filter).Count(); + } + public int GetNumberOfDirectories(string path,string filter="*") + { + return GetDirectoriesImpl(path,filter).Count(); + } + public IEnumerable GetFiles(string path,string filter="*") + { + foreach(var f in GetFilesImpl(path,filter)) + { + yield return Path.GetFileName(f); + } + } + public IEnumerable GetDirectories(string path,string filter="*") + { + foreach(var f in GetDirectoriesImpl(path,filter)) + { + yield return Path.GetFileName(f); + } + } + public static string CombinePath(params string[] path) + { + if(path.Length==0) return "/"; + string path0=path[0]; + foreach(var p in path.Skip(1)) + { + path0= CombinePath(path0,p); + } + return path0; + } + public abstract void DeleteFile(string path); + + public abstract void DeleteDirectory(string path); + + public virtual void DeleteDirectory(string path,bool recursive) + { + if(recursive) + { + foreach(var d in GetDirectories(path)) + { + DeleteDirectory(CombinePath(path,d),recursive); + } + foreach(var f in GetFiles(path)) + { + DeleteFile(CombinePath(path,f)); + } + } + DeleteDirectory(path); + } + + public abstract void CreateDirectory(string path); + + public abstract bool FileExists(string path); + public abstract bool DirectoryExists(string path); + public static string CombinePath(string p1,string p2) + { + return Path.Combine(p1,p2).Replace(Path.DirectorySeparatorChar,'/'); + } + + public abstract Stream Open(string path,FileMode mode,FileAccess access,FileShare share); + protected abstract IEnumerable GetFilesImpl(string path,string filter="*"); + + protected abstract IEnumerable GetDirectoriesImpl(string path,string filter="*"); + public static SubFileSystem operator+(TimelapseFileSystem fs,string name) + { + SubFileSystem _fs=new SubFileSystem(fs,name); + + return _fs; + } +} + +public class SubFileSystem : TimelapseFileSystem +{ + public SubFileSystem(TimelapseFileSystem fs,string name) + { + var _fs = fs as SubFileSystem; + if(_fs != null) + { + FileSystem = _fs.FileSystem; + CurrentDirectory = CombinePath(_fs.CurrentDirectory,name); + + }else{ + FileSystem =fs; + CurrentDirectory = CombinePath("/",name); + } + } + public TimelapseFileSystem FileSystem {get;set;} + public string CurrentDirectory {get;set;} + + public override void CreateDirectory(string path) + { + FileSystem.CreateDirectory(CombinePath(CurrentDirectory,path)); + } + + public override void DeleteDirectory(string path) + { + FileSystem.DeleteDirectory(CombinePath(CurrentDirectory,path)); + } + + public override void DeleteFile(string path) + { + FileSystem.DeleteFile(CombinePath(CurrentDirectory,path)); + } + + public override bool DirectoryExists(string path) + { + return FileSystem.DirectoryExists(CombinePath(CurrentDirectory,path)); + } + + public override bool FileExists(string path) + { + return FileSystem.FileExists(CombinePath(CurrentDirectory,path)); + } + + public override Stream Open(string path, FileMode mode, FileAccess access, FileShare share) + { + return FileSystem.Open(CombinePath(CurrentDirectory,path),mode,access,share); + } + + protected override IEnumerable GetDirectoriesImpl(string path, string filter = "*") + { + foreach(var file in FileSystem.GetDirectories(CombinePath(CurrentDirectory,path),filter)) + { + yield return Path.GetFileName(file); + } + } + public override string[] ShowOpenDialog(Window parent, FileFilter[] filters, bool multi, string startDir = "") + { + string startDir1; + if(string.IsNullOrWhiteSpace(startDir)) + { + startDir1=CurrentDirectory; + }else{ + startDir1=CombinePath(CurrentDirectory,startDir); + } + + var res=FileSystem.ShowOpenDialog(parent,filters,multi,startDir1); + List validUrls=new List(); + foreach(var url in res) + { + if(url.StartsWith(CurrentDirectory)) + { + validUrls.Add(url); + }else + { + MessageBox.Show($"You can't open file \"{url}\" because it exists outside of \"{CurrentDirectory}\"",MessageBoxButtons.OK,MessageBoxType.Error); + } + } + return validUrls.ToArray(); + } + public override string? ShowSaveDialog(Window parent, FileFilter[] filters, string startDir = "") + { + string startDir1; + if(string.IsNullOrWhiteSpace(startDir)) + { + startDir1=CurrentDirectory; + }else{ + startDir1=CombinePath(CurrentDirectory,startDir); + } + + var url = FileSystem.ShowSaveDialog(parent,filters,startDir1); + if(!string.IsNullOrWhiteSpace(url) && !url.StartsWith(CurrentDirectory)) + { + MessageBox.Show($"You can't save file \"{url}\" because it exists outside of \"{CurrentDirectory}\"",MessageBoxButtons.OK,MessageBoxType.Error); + return null; + } + + return url; + } + public override string? ShowDirectoryDialog(Window parent, string startDir = "") + { + string startDir1; + if(string.IsNullOrWhiteSpace(startDir)) + { + startDir1=CurrentDirectory; + }else{ + startDir1=CombinePath(CurrentDirectory,startDir); + } + + var url = FileSystem.ShowDirectoryDialog(parent,startDir1); + if(!string.IsNullOrWhiteSpace(url) && !url.StartsWith(CurrentDirectory)) + { + MessageBox.Show($"You can't open directory \"{url}\" because it exists outside of \"{CurrentDirectory}\"",MessageBoxButtons.OK,MessageBoxType.Error); + return null; + } + + return url; + } + protected override IEnumerable GetFilesImpl(string path, string filter = "*") + { + foreach(var file in FileSystem.GetFiles(CombinePath(CurrentDirectory,path),filter)) + { + yield return Path.GetFileName(file); + } + } + + public static SubFileSystem operator-(SubFileSystem fs,int num) + { + string path=fs.CurrentDirectory; + for(int i = 0;i < num;i++) + { + string? p=Path.GetDirectoryName(path); + if(string.IsNullOrWhiteSpace(p)) + { + path="/"; + break; + }else{ + path = p; + } + + } + return new SubFileSystem(fs.FileSystem,path); + } +} + diff --git a/TimelapseApi/TimelapseProject.cs b/TimelapseApi/TimelapseProject.cs new file mode 100644 index 0000000..bf05f86 --- /dev/null +++ b/TimelapseApi/TimelapseProject.cs @@ -0,0 +1,166 @@ +using Newtonsoft.Json; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace TimelapseApi +{ + public class TimelapseProject + { + public TimelapseProject() + { + SectionName="Default"; + Interval = TimeSpan.FromSeconds(1); + + } + public void Save() + { + if(ProjectLocation !=null) + { + string name=Path.GetFileName(ProjectLocation.CurrentDirectory); + var fs2=ProjectLocation-1; + fs2.WriteAllText($"{name}.tlnp",JsonConvert.SerializeObject(this)); + } + } + + public static TimelapseProject? Open(SubFileSystem fs) + { + TimelapseProject? proj; + string name=Path.GetFileName(fs.CurrentDirectory); + + SubFileSystem fs2=fs-1; + + proj=JsonConvert.DeserializeObject(fs2.ReadAllText($"{name}.tlnp")); + + if(proj == null) + { + return proj; + } + + proj.ProjectLocation = fs; + return proj; + } + + [JsonIgnore] + public SubFileSystem? ProjectLocation {get;set;} + [JsonIgnore] + private string _SectionForFrame=""; + [JsonIgnore] + private int _cframe; + + [JsonIgnore] + private int CurrentFrame {get { + SetCFName(); + return _cframe++; + }} + + public int FrameCount {get { + SetCFName(); + return _cframe; + }} + + [JsonIgnore] + public DateTime LastFrameTaken {get;set;} + + public string SectionName {get;set;} + + public TimelapseInterval Interval {get;set;} + + + private void SetCFName() + { + if(ProjectLocation == null) + { + _cframe=-1; + return; + } + if(!SectionName.Equals(_SectionForFrame,StringComparison.Ordinal)) + { + _SectionForFrame=SectionName; + if(!ProjectLocation.DirectoryExists($"Sections/{SectionName}")) + { + ProjectLocation.CreateDirectory($"Sections/{SectionName}"); + } + + _cframe=ProjectLocation.GetNumberOfFiles($"Sections/{SectionName}","*.png"); + + } + } + + + public async Task Save(Image img) + { + if(ProjectLocation == null) + { + return; + } + string p=$"Sections/{SectionName}/{CurrentFrame}.png"; + if(!ProjectLocation.FileExists(p)) + { + using(var f = ProjectLocation.Open(p,FileMode.Create,FileAccess.Write,FileShare.None)) + { + await img.SaveAsPngAsync(f); + } + } + } + } + + public class TimelapseInterval + { + public TimelapseInterval() + { + UseEstimated=false; + EstimatedVideoLength=TimeSpan.FromSeconds(1); + EstimatedProjectLength =TimeSpan.FromSeconds(1); + } + public TimelapseInterval(TimeSpan estVidLen,TimeSpan estProjLen) + { + UseEstimated = true; + EstimatedVideoLength=estVidLen; + EstimatedProjectLength=estProjLen; + } + public TimelapseInterval(TimeSpan interval) + { + UseEstimated=false; + EstimatedVideoLength =TimeSpan.FromSeconds(1); + EstimatedProjectLength=interval; + } + public bool UseEstimated {get;set;} + + public TimeSpan EstimatedVideoLength {get;set;} + + public TimeSpan EstimatedProjectLength {get;set;} + + public TimeSpan GetTimeSpan() + { + if(UseEstimated && EstimatedProjectLength.TotalSeconds != 0.0) + { + + return TimeSpan.FromSeconds(EstimatedProjectLength.TotalSeconds/EstimatedVideoLength.TotalSeconds); + } + return EstimatedVideoLength; + } + + public static explicit operator double(TimelapseInterval interval) + { + return interval.GetTimeSpan().TotalSeconds; + } + public static implicit operator TimeSpan(TimelapseInterval interval) + { + return interval.GetTimeSpan(); + } + public static implicit operator (TimeSpan estVidLen,TimeSpan estProjLen)(TimelapseInterval span) + { + return (span.EstimatedProjectLength,span.EstimatedVideoLength); + } + public static implicit operator TimelapseInterval(TimeSpan span) + { + return new TimelapseInterval(span); + } + + public static implicit operator TimelapseInterval((TimeSpan span1,TimeSpan span2) span) + { + return new TimelapseInterval(span.span1,span.span2); + } + + } +} \ No newline at end of file diff --git a/TimelapseApi/TimelapseSettings.cs b/TimelapseApi/TimelapseSettings.cs new file mode 100644 index 0000000..259cbec --- /dev/null +++ b/TimelapseApi/TimelapseSettings.cs @@ -0,0 +1,247 @@ +namespace TimelapseApi; + +using System.Diagnostics; +using Eto.Forms; + +internal class FrameHandlerSettingsForm : Dialog +{ + + internal class FrameHandlerSettingsCollection + { + public FrameHandlerSettingsCollection(List img) + { + + Items=img; + } + + public CheckBox? OverlayEnabled {get;set;} + public CheckBox? BlockEnabled {get;set;} + public List Items {get;set;} + + + } + + internal class FrameHandlerSettings + { + public Guid Guid; + CheckBox? cb; + private bool? _chk; + + public FrameHandlerSettings(TimelapseExtension ext,string handlerName,bool overlay,bool block) + { + ExtensionName=ext.Name; + Guid=ext.Id; + HandlerName = handlerName; + OverlayChecked=overlay; + BlockChecked=block; + + + } + + public string HandlerName {get;set;} + public string ExtensionName {get;set;} + public bool OverlayChecked {get;set;} + public bool BlockChecked {get;set;} + } + public FrameHandlerSettingsForm(FrameHandlerSettingsCollection col) + { + if(col.OverlayEnabled == null || col.BlockEnabled == null) return; + + Width = 640; + Height=240; + Resizable=true; + Title="Frame Handler Settings"; + + Button okBtn = new Button{Text="OK"}; + okBtn.Click +=(sender,e)=>{ + this.Close(); + }; + + DynamicLayout lyt=new DynamicLayout(); + GridView itemsList=new GridView(); + + itemsList.Columns.Add(new GridColumn{ + HeaderText="HandlerName", + DataCell=new TextBoxCell("HandlerName"), + Editable=false + }); + + itemsList.Columns.Add(new GridColumn{ + HeaderText="Extension Name", + DataCell=new TextBoxCell("ExtensionName"), + Editable=false + }); + itemsList.Columns.Add(new GridColumn{ + HeaderText="Allow Overlay", + DataCell=new CheckBoxCell("OverlayChecked"), + Editable=true + }); + itemsList.Columns.Add(new GridColumn{ + HeaderText="Allow Block from Recording frame", + DataCell=new CheckBoxCell("BlockChecked"), + Editable=true + }); + itemsList.DataStore=col.Items; + + col.OverlayEnabled.Text="Allow Overlay"; + col.BlockEnabled.Text="Allow Block from Recording frame"; + lyt.BeginVertical(); + lyt.BeginHorizontal(); + lyt.Add(col.OverlayEnabled,true); + lyt.EndBeginHorizontal(); + lyt.Add(col.BlockEnabled,true); + lyt.EndBeginHorizontal(); + lyt.Add(itemsList,true,true); + lyt.EndBeginHorizontal(); + lyt.Add(okBtn,true); + lyt.EndHorizontal(); + lyt.EndVertical(); + Content=lyt; + } +} +internal class TimelapseSettings : Dialog +{ + public TimelapseSettings(Api api) + { + bool overLayBoxState=api.Model.canOverlayVideo; + bool blockBoxState=api.Model.canBlockFrames; + + List imgs=new List(); + List ext=new List(); + var coll=new FrameHandlerSettingsForm.FrameHandlerSettingsCollection(imgs); + + foreach(var item in api._frameHandlers) + { + if(!ext.Contains(item.Extension)) + { + + imgs.Add(new FrameHandlerSettingsForm.FrameHandlerSettings(item.Extension,item.HandlerName,!api.Model.deniedOverlayExtensions.Contains(item.Extension.Id),!api.Model.deniedBlockExtensions.Contains(item.Extension.Id))); + ext.Add(item.Extension); + } + } + ext.Clear(); + + Width = 320; + Height=240; + Title="Settings"; + Button ExtensionsFrameHandler=new Button{ + Text="Frame Handler Settings" + }; + Button configFolder = new Button{ + Text="Configuration folder" + }; + Button installExtension = new Button{ + Text="Install Extension" + }; + CheckBox enableExt=new CheckBox(); + enableExt.Text="Add extensions on install"; + enableExt.Checked = api.Model.addExtensionOnInstall; + installExtension.Click += async(sender,e)=>{ + using(var ofd=new OpenFileDialog()) + { + ofd.MultiSelect=true; + ofd.Filters.Add(new FileFilter("Timelapse Extension",".tle",".zip")); + if(ofd.ShowDialog(this)==DialogResult.Ok) + { + foreach(var ext in ofd.Filenames) + { + await ExtensionLoader.InstallExtension(ext,enableExt.Checked.GetValueOrDefault()); + } + } + } + }; + CheckBox enableServer = new CheckBox(); + enableServer.Text="Enable webserver"; + enableServer.Checked=api.Model.enableWebServer; + + configFolder.Click +=(sender,e)=>{ + using(Process p=new Process()){ + p.StartInfo = new ProcessStartInfo(Api.GetInternalFile()); + p.StartInfo.UseShellExecute=true; + p.Start(); + } + }; + ExtensionsFrameHandler.Click +=(sender,e)=>{ + coll.OverlayEnabled=new CheckBox(); + coll.BlockEnabled=new CheckBox(); + + coll.OverlayEnabled.Checked=overLayBoxState; + coll.BlockEnabled.Checked=blockBoxState; + using(var img=new FrameHandlerSettingsForm(coll)) + img.ShowModal(this); + overLayBoxState = coll.OverlayEnabled.Checked.GetValueOrDefault(); + blockBoxState = coll.BlockEnabled.Checked.GetValueOrDefault(); + + /* Console.WriteLine($"Global overlay state: {overLayBoxState}"); + Console.WriteLine($"Global block state: {blockBoxState}"); + foreach(var item in coll.Items) + { + Console.WriteLine(); + Console.WriteLine($"Extension name: {item.ExtensionName}"); + Console.WriteLine($"Handler name: {item.HandlerName}"); + Console.WriteLine($"Overlay state: {item.OverlayChecked}"); + Console.WriteLine($"Block state: {item.BlockChecked}"); + + }*/ + + }; + DynamicLayout lyt1=new DynamicLayout(); + Scrollable scrollable=new Scrollable(); + + DynamicLayout lyt2=new DynamicLayout(); + scrollable.Content=lyt2; + lyt2.BeginVertical(); + lyt2.AddRow(ExtensionsFrameHandler); + lyt2.AddRow(configFolder); + + StackLayout lyt=new StackLayout(); + lyt.Orientation= Orientation.Horizontal; + lyt.Items.Add(enableServer); + NumericStepper stepper=new NumericStepper(); + stepper.MinValue=0; + stepper.MaxValue=65535; + stepper.Value = api.Model.timelapsePort; + lyt.Items.Add(stepper); + lyt2.AddRow(lyt); + lyt2.AddRow(installExtension); + lyt2.AddRow(enableExt); + lyt2.AddRow(null); + lyt2.EndVertical(); + + lyt1.BeginVertical(); + lyt1.BeginHorizontal(); + lyt1.Add(scrollable,true,true); + + Button saveBtn = new Button {Text="Save"}; + saveBtn.Click += (sender,e)=>{ + api.Model.canBlockFrames=blockBoxState; + api.Model.canOverlayVideo=overLayBoxState; + + api.Model.deniedBlockExtensions.Clear(); + api.Model.deniedOverlayExtensions.Clear(); + api.Model.enableWebServer=enableServer.Checked.GetValueOrDefault(); + api.Model.timelapsePort=(ushort)stepper.Value; + api.Model.addExtensionOnInstall = enableExt.Checked.GetValueOrDefault(); + foreach(var item in coll.Items) + { + if(!item.OverlayChecked) + { + api.Model.deniedOverlayExtensions.Add(item.Guid); + } + if(!item.BlockChecked) + { + api.Model.deniedBlockExtensions.Add(item.Guid); + } + + } + api.SaveModel(); + }; + + lyt1.EndBeginHorizontal(); + lyt1.Add(saveBtn,true); + lyt1.EndHorizontal(); + lyt1.EndVertical(); + + this.Content=lyt1; + } +} \ No newline at end of file diff --git a/TimelapseApi/TimelapseSettingsModel.cs b/TimelapseApi/TimelapseSettingsModel.cs new file mode 100644 index 0000000..a519f34 --- /dev/null +++ b/TimelapseApi/TimelapseSettingsModel.cs @@ -0,0 +1,23 @@ +namespace TimelapseApi; + +public class TimelapseSettingsModel +{ + public TimelapseSettingsModel() + { + canOverlayVideo=true; + deniedOverlayExtensions=new List(); + deniedBlockExtensions=new List(); + enableWebServer=false; + timelapsePort=49290; + canBlockFrames=true; + addExtensionOnInstall=true; + + } + public bool addExtensionOnInstall {get;set;} + public bool canOverlayVideo {get;set;} + public bool canBlockFrames {get;set;} + public List deniedOverlayExtensions {get;set;} + public List deniedBlockExtensions {get;set;} + public bool enableWebServer {get;set;} + public ushort timelapsePort {get;set;} +} \ No newline at end of file diff --git a/TimelapseApi/VideoFileCreator.cs b/TimelapseApi/VideoFileCreator.cs new file mode 100644 index 0000000..89bf00e --- /dev/null +++ b/TimelapseApi/VideoFileCreator.cs @@ -0,0 +1,107 @@ +namespace TimelapseApi; + +using System.Diagnostics; +using System.Threading; + +public class VideoFileCreator : IAsyncDisposable, IDisposable +{ + Process? p; + Stream? iStrm; + string output; + double fps_src; + double fps_dest; + bool open; + + public bool OpenResult {get;private set;} + public VideoFileCreator(string path,double fps_src=10,double fps_dest=30,bool autoOpen=true) + { + this.fps_src=fps_src; + this.fps_dest =fps_dest; + output = path; + this.open=false; + if(autoOpen) + { + Open(); + } + } + + public bool Open() + { + if(open) + { + return OpenResult; + } + p=new Process(); + p.StartInfo=new ProcessStartInfo("ffmpeg",$"-f image2pipe -framerate {fps_src} -i - -c:v libx264 -vf format=yuv420p -r {fps_dest} -movflags +faststart \"{output}\"") {UseShellExecute=false,RedirectStandardInput=true,CreateNoWindow=true,WindowStyle=ProcessWindowStyle.Hidden}; + var r=p.Start(); + if(r) + { + iStrm = p.StandardInput.BaseStream; + } + open=true; + return r; + } + + + public void Add(byte[] data) + { + if(iStrm != null) + { + + iStrm.Write(data,0,data.Length); + + + } + } + public async Task AddAsync(byte[] data) + { + if(iStrm != null) + { + + await iStrm.WriteAsync(data,0,data.Length); + + + } + } + public void Add(string file) + { + if(iStrm != null) + { + byte[] data=File.ReadAllBytes(file); + iStrm.Write(data,0,data.Length); + } + } + public async Task AddAsync(string file) + { + if(iStrm != null) + { + byte[] data=await File.ReadAllBytesAsync(file); + await iStrm.WriteAsync(data,0,data.Length); + } + } + public async ValueTask DisposeAsync() + { + if(iStrm!= null) + { + await iStrm.DisposeAsync(); + } + if(p != null) + { + await p.WaitForExitAsync(); + p.Dispose(); + } + } + + public void Dispose() + { + if(iStrm!= null) + { + iStrm.Dispose(); + } + if(p != null) + { + p.WaitForExit(); + p.Dispose(); + } + } +} \ No newline at end of file diff --git a/timelapse.png b/timelapse.png new file mode 100644 index 0000000000000000000000000000000000000000..d31804afef534fdad5c81f84e11c4cfc78ec9bf7 GIT binary patch literal 857 zcmV-f1E&0mP)qNY06pVP#Q&MF#t7)5#<8>Uz`#2hc$L5|PoO;sciWU4KOHmD3lAf_f%KpcLx~X-9BJ?pi2aoa>%WZo z-sktcc+Giz=ahBw{hH@RtD~|A;$hBHboj1IL`C_WEvpuFP;FMQs}GB9x`){?g4qvK zAvHX&7AUn-_0Ov*lA#ds6_Nnv$zW*<@o%@lB%}h5Q>np`Ce3nm-|fC{?!uu_O?sT$ z?8JU)0<7@6@1H3cXwAq010`b(4QYyp{<|A1ka}Q<1=c;Dpp&lfcU52yjXjXT);y%> z4i9d5-~{e29!Nuy9KerjprpMdm}t_!?jcbYt~`zeh62MnB@$_;ZV_qHD|k@|)$YBJ zEI?vjJka8sn#VMfW*wyhcA{mrI#j2XjlQIptVzv}0cyQOu&8pi29VK=T&-`Xg4agl z`>Ci-Z=?`doC*I%Gk*M%fSpt*8G0vn>m?s3p@2r4#g^}F4MyM$)!~pUyg>*nqB&^bsfdAzw jF*{09og_MZ#_{zB>4hFiZ$61L00000NkvXXu0mjfgNl^6 literal 0 HcmV?d00001