From 84c5e4c30ba4f7eaf574cc659c0e92cc459fd6f0 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Sun, 17 Aug 2025 10:10:56 -0400 Subject: [PATCH 01/68] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cdad0222..57553e3e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Oqtane is being developed based on some fundamental principles which are outline # Latest Release -[6.1.4](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.4) was released on July 30, 2025 and is a maintenance release including 49 pull requests by 4 different contributors, pushing the total number of project commits all-time to over 6700. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. +[6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) was released on August 17, 2025 and is a maintenance release including 46 pull requests by 3 different contributors, pushing the total number of project commits all-time to almost 6900. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. # Try It Now! @@ -92,6 +92,10 @@ Connect with other developers, get support, and share ideas by joining the Oqtan # Roadmap This project is open source, and therefore is a work in progress... +[6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) (Aug 17, 2025) +- [x] Stabilization improvements +- [x] Database provider improvements + [6.1.4](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.4) (Jul 30, 2025) - [x] Stabilization improvements - [x] SMTP OAuth2 Support From b01f3b505d5e50eccf685e0bf122d040cf016ef6 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sun, 17 Aug 2025 10:29:25 -0400 Subject: [PATCH 02/68] update Azure ARM template to 6.1.5 --- azuredeploy.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azuredeploy.json b/azuredeploy.json index f4718349..40b5a30b 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -220,7 +220,7 @@ "apiVersion": "2024-04-01", "name": "[concat(parameters('BlazorWebsiteName'), '/ZipDeploy')]", "properties": { - "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.1.4/Oqtane.Framework.6.1.4.Install.zip" + "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.1.5/Oqtane.Framework.6.1.5.Install.zip" }, "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('BlazorWebsiteName'))]" From 7b42845eccc23b25967885c41ad3f2f5e8309f25 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sun, 17 Aug 2025 10:53:22 -0400 Subject: [PATCH 03/68] modify template content --- Oqtane.Application/AppHost/readme.md | 7 ------- Oqtane.Application/Build/icon.png | Bin 7800 -> 4895 bytes .../Oqtane.Application.Template.nuspec | 4 ++-- Oqtane.Application/README.md | 9 +++------ Oqtane.Application/icon.png | Bin 0 -> 4895 bytes 5 files changed, 5 insertions(+), 15 deletions(-) delete mode 100644 Oqtane.Application/AppHost/readme.md create mode 100644 Oqtane.Application/icon.png diff --git a/Oqtane.Application/AppHost/readme.md b/Oqtane.Application/AppHost/readme.md deleted file mode 100644 index 881a01c1..00000000 --- a/Oqtane.Application/AppHost/readme.md +++ /dev/null @@ -1,7 +0,0 @@ -# Oqtane Application Template - -![Oqtane](https://github.com/oqtane/framework/blob/master/oqtane.png?raw=true "Oqtane") - -Oqtane is an open source CMS and Application Framework that provides advanced functionality for developing web, mobile, and desktop applications on .NET. It leverages Blazor to compose a fully dynamic digital experience which can be hosted on Static Blazor, Blazor Server, Blazor WebAssembly, or Blazor Hybrid (via .NET MAUI). - -More information about Oqtane can be found at: [https://www.oqtane.org](https://www.oqtane.org) diff --git a/Oqtane.Application/Build/icon.png b/Oqtane.Application/Build/icon.png index 7422cf2f313e352d93b08d4e87fec74e52117713..3c43cce4c6604107eab529207edd44c386768ca1 100644 GIT binary patch delta 4857 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 M>>IU0xA6S`1HzXf%>V!Z diff --git a/Oqtane.Application/Oqtane.Application.Template.nuspec b/Oqtane.Application/Oqtane.Application.Template.nuspec index a740abe0..35a1c956 100644 --- a/Oqtane.Application/Oqtane.Application.Template.nuspec +++ b/Oqtane.Application/Oqtane.Application.Template.nuspec @@ -8,12 +8,12 @@ false MIT https://licenses.nuget.org/MIT - Build/icon.png + icon.png https://github.com/oqtane/oqtane.framework Oqtane is an open source CMS and Application Framework that provides advanced functionality for developing web, mobile, and desktop applications on .NET. It leverages Blazor to compose a fully dynamic digital experience which can be hosted on Static Blazor, Blazor Server, Blazor WebAssembly, or Blazor Hybrid (via .NET MAUI). en-US Web ASP.NET Blazor Oqtane Modular Multi-Tenant "Open Source" "SQL Server" MySQL PostgreSQL SQLite - AppHost/README.md + README.md diff --git a/Oqtane.Application/README.md b/Oqtane.Application/README.md index 5b4de06c..293e7a1f 100644 --- a/Oqtane.Application/README.md +++ b/Oqtane.Application/README.md @@ -1,21 +1,18 @@ # Oqtane Application Template -This folder contains content files for a Visual Studio Project Template designed for Oqtane development projects. The template relies on the native templating capabilities of the .NET Command Line Interface (CLI): +This is a Visual Studio Project Template designed for Oqtane development projects. This template relies on the native templating capabilities of the .NET Command Line Interface (CLI): ``` dotnet new install Oqtane.Application.Template dotnet new oqtane-app -o MyCompany.MyProject -dotnet new uninstall Oqtane.Application.Template ``` When using this approach you do not need to have a local copy of the oqtane.framework source code - you simply utilize Oqtane as a standard application dependency. -The solution contains an AppHost project which must be identified as the Startup project. It is only responsible for loading the development environment and launching the Oqtane framework. +The solution contains an AppHost project which must be identified as the Startup project. It is responsible for loading the development environment and launching the Oqtane framework. -The solution also contains Build, Client, Server, and Shared folders which is where you you would implement your custom functionality. An example module and theme are included for reference, and you can add additional modules and themes within the same projects by following the standard Oqtane conventions. +The solution also contains Build, Client, Server, and Shared folders which is where you you would implement your custom functionality. An example module and theme are included for reference, and you can add additional modules and themes within the same projects by following the standard Oqtane folder/namespace conventions. *Known Issues* - do not use the term "Oqtane" in your output name or else you will experience namespace conflicts -- the application's *.nuspec file should be included in the *.nupkg package however Nuget is excluding it -- when calling "dotnet new" the PostBuild section in the Oqtane.Application.Build.csproj is being modified - not sure why diff --git a/Oqtane.Application/icon.png b/Oqtane.Application/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3c43cce4c6604107eab529207edd44c386768ca1 GIT binary patch literal 4895 zcmV+)6X5KLP)Px#1ZP1_K>z@;j|==^1poj7B2Y|JMgRZ*{{H^`{r&v>{G+3zeSLkLoSa!%Sq26M z0|NsE1qDh25)y%dfpBneJ3BizHZ}s;WgrMN3Od zg@uKVj*gI!kau@?goK1!TU(u-or#HwuCA^uEG(Own>95xWMpIy4-c%YtT8b$NJvO^ zb#+owQYI!Qva+&FOiV5=E^KUUnVFfWsHl~dm3Vk~X=!OqO-;46wIU)SI5;>nGc&ff zwmv>SnwpxgudgpJFCQNtjg5^zKR>3Xri_e?dU|?OQ&VRaI57v9W-FfP;gB zZ*Omul$4j3m#3$vmX?-lYiqEuuvAo3h=_N?x0*=>;fLtmHDY5rf{_g*zKv)fg} z^!Chl^G)wePuHtg@2mIf>SH!&J(RLL`Ns{ziweNRq_s9qV=8Pt90B{`il-rL7BcnjL= zUz$gcD7CD%g)pYtT3eksqh<0_wpM4;_{P0lPY!`w%n91sUd{9Lu zT*tNVfPO3=Jjlq|brCfJdcBp*HmI_xg*X9M@rj|VgKXSD9j_;}LQ~pkg|iK{$;W~_ zuFW}UBuYJA9x;6%4wH*kvdQ1nd2m^6WitsIEgOs0ULOWTHlrXWG(vQ0e_JPinBo&Q zOE$qSc@iA_O~mN=ET2(exkOa9$imP`g%b3%r)-{#f~K^Et!$|^+5x@IX2>%7{bM13 zQ6$sD2twk~y20cGRCe1dyLeL>UAoJiS#H2x)Am4; zdo8?WF}Rd^#^3AGX7pAo%}~Km7B6A_s#1UQXE;D|FBvbV=lHd@qwg-8J3COl>=2(% z^xQpBEO8SF217H%U$X!*iEVqDFBp1wP-JZt9^#cC*hkXEd#Wlj0J3AhBd|bC=;^%> zjC>Ll4phiVx)b}E;32jhWOHL3!pG^=vxlEsV0pYf%PV_*2>aMFf$6123tVlUE3mbZ z$%ny%yomOm4Ub@iTSpdYJ?y%A1h_}%}NOU9B( zu_U;ihh`la56%!LCbK$3m~)wZtYyq#?NY&t4mQdKBBCoVN*(}=)>TQFiSF!=^zdYKr>v&DdZ`hPPQ3bCI)Hrqdp?k4A#`vxC-{zz>1*tbJ1u& zCXj+R7LC^-gz^EFWFXTjc9RA6bjJx+Ha3s^pimk_y4e~J6{ByL3>NCpa0gO*UjvVf zjZ19jKZL;Y(4e#}EN@W=Uh1JKR$UH+=5cXW`?=UsPg0KsJKR)E|4;?;JU(dgm91*a`HL-@$#)bz<#Z6fbMCKlaAX~_9r+TdI!(k3` zt7|`~)Nw1^C$elS(53Z6AfiH8LdWAgXiVi5N{+>NvQJH99x+4+ zo5rMxpqfv68i!3lk0nhVR;t%}c$SR$;s|IxMsqH;sL>hHP?t}NGe81VR$^FjvLBP{ z?{WTF7pAefF7gy` z=PcuP;*Exvp>_F9?%cR_Aj|wv^29U2(eiIucN?MBmr;XaLM_OgsLCm@>hYG%;c^Mh z_e=LP=e9V8XLr9FWOL)0FqdI-EP~oz`^Z%+wAsXxEZ-KaBntL4$S_1lbZK@_KvY>^ zZwL2SvDqS+IV4zPoNmy8vcV<9R^TZW@H1caX6?=)~m1*^M&2^2RzA5vR#TUW>T1Qc`GvIx!Vw`Sa#l`ZYQHklp>U^!=ALBsjWuF0RZQYZvBS4j; z!>JFE3fjOXU5J-e@Bz`_qMXn;LF!}z`#$uY(i7eKvMsL_AgzTJG*|Rad&!D!U-?M- zLzfkH!<1`Id#4Pxj)uZU9_dG5d8kn0$%>VA0NVF9(vlFYQ!Qf_UKGzm)NKNHtNYx2 zuvM?kWKz-^CS<~Zl;Q$N;zU~m11NPri*qIyj*4XZpbq4?XD}nHXfu@)k+2uHm6(Q` z3e9p_cXM#ztgm1qNu}er%^K7rpXvG|GI{ESl<^v?C3w`=$SIA0nJWjO51^_RdwUF4 zw>JGz1ces@k3�q3`kwQ;BU888;`$;WJ28OyUNR9n+_GyqC7;X zGWF*?|4RlHOoj@pZ6sE)Olt6ZWV)3~0J8B?(GywW2Pv{3czYIoU=)R^V4kJzIs9vHNe?+pFS5eZX*wiOS75JIJsdhbWW|!Vx{EA?Osq3qC)J=m1fx+bE(6Bv|bvR)DY6V9PvGKf% z2trQxH-B!fis?9~?5w8Z23jAchS!sC64?Z} z6OYEa(Muxf@UXai?QXMr$bs@>R_wZA+g=dhzeB}>3)GV!l}>C47P01$h4K*{c1(y| z*9=JhE91C*3#XYVVRmZ6h{a3d|F|;gm<~T|avdku6@nx9XGF1T8FSPB?`ocV5vdQ* zb8!W>xl@7&n7`p{e5^}QJv!{f)$A1gK{$;5^HZ9qG;30 z{G(BFK<$^)P~lQiJf!oYH`95?*FR7u^u)sBv{do1jSL!iHn^rv}423?YG#(5rpEr2Y9&;#t>I1WNl??MIv%%WwHp7VT5B+zB!j5bZ`g8L3LfG1O1qUU z9aI(R)KB-u15NM;{IqYHG$L(?FFd5>Ut^{MuByUMcqYcTDoO_M*m4m?w80}(2sve! zJcE%Q72DSJ*>_Na6x0r=e>r|mBr%AH4vS~MLG0Q>+JhDS;t+IS)xj?bm;!(5!Edeh zc4F6AHp5zx6cGiki>VXZ>kNw%i(!E^V^pwg)^R&;I|{+ad)W*iF%vm4gFlnrEoM!D ze}(4OB6{Ib`U5UCVR?$;UuYg9EV2)DC-(?8>iwpDZ8f$V=p-@zZeIcbCdDTOIrwX3a0k!E>+ z)>m7*E^h*4M}c1Sad$WWe3&<|B5#0nc~kUo@7T8T2xJV~L)N^xvji@FchFc)4l8z? zIY7?fxXeamkr6P%PQJhU&+dL&a5ZQorf=_#FF6zc$u`EY7F10N{`>leUG9rfT9>!X zdE&d6d|3mV_VW`nKI!hOd*+D3snpfEVBf|EvuJf3B0CE||L@YoyB|1n?%d@WGiH4H z-o$yg+)IhsXxP_*C{SvLd0o21gX$c^_|Ldvu>5edK};Ok^|bZKZGE)*=Ey@PFsc{Wd!6 R-3I^w002ovPDHLkV1nKx-0T1V literal 0 HcmV?d00001 From b9a97ffa4cfb405a96faccf9a40805afe224e721 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 19 Aug 2025 12:05:39 -0400 Subject: [PATCH 04/68] Resources for Interactive module components should be managed via JS Interop --- Oqtane.Server/Components/App.razor | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 638c8031..a4e1f4ab 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -646,8 +646,6 @@ var typename = ""; if (module.ModuleDefinition != null) { - resources = AddResources(resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", Utilities.GetTypeName(module.ModuleDefinition.ModuleDefinitionName), module.ModuleDefinition.Fingerprint, site.RenderMode); - // handle default action if (action == Constants.DefaultAction && !string.IsNullOrEmpty(module.ModuleDefinition.DefaultAction)) { @@ -692,7 +690,11 @@ var moduleobject = Activator.CreateInstance(moduletype) as IModuleControl; if (moduleobject != null) { - resources = AddResources(resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition?.Fingerprint, site.RenderMode); + if (module.ModuleDefinition != null) + { + resources = AddResources(resources, module.ModuleDefinition.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition.Fingerprint, moduleobject.RenderMode); + } + resources = AddResources(resources, moduleobject.Resources, ResourceLevel.Module, alias, "Modules", moduletype.Namespace, module.ModuleDefinition?.Fingerprint, moduleobject.RenderMode); // settings components are dynamically loaded within the framework Settings module if (action.ToLower() == "settings" && module.ModuleDefinition != null) From a340f5297326ea7ad7092b172ea915f2cb8397a3 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 19 Aug 2025 12:10:15 -0400 Subject: [PATCH 05/68] add project reference in AppHost to Server so that dependencies will be automatically copied --- .../AppHost/Oqtane.Application.AppHost.csproj | 4 +++ .../Build/Oqtane.Application.nuspec | 32 ------------------ Oqtane.Application/Build/debug.cmd | 10 ------ Oqtane.Application/Build/debug.sh | 11 ------ Oqtane.Application/Build/icon.png | Bin 4895 -> 0 bytes Oqtane.Application/Build/release.cmd | 2 -- Oqtane.Application/Build/release.sh | 1 - 7 files changed, 4 insertions(+), 56 deletions(-) delete mode 100644 Oqtane.Application/Build/Oqtane.Application.nuspec delete mode 100644 Oqtane.Application/Build/icon.png delete mode 100644 Oqtane.Application/Build/release.cmd delete mode 100644 Oqtane.Application/Build/release.sh diff --git a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj index 8f04d329..9490f607 100644 --- a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj +++ b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj @@ -44,4 +44,8 @@ + + + + diff --git a/Oqtane.Application/Build/Oqtane.Application.nuspec b/Oqtane.Application/Build/Oqtane.Application.nuspec deleted file mode 100644 index 1cca2e51..00000000 --- a/Oqtane.Application/Build/Oqtane.Application.nuspec +++ /dev/null @@ -1,32 +0,0 @@ - - - - $projectname$ - 1.0.0 - Oqtane.Application - Oqtane.Application - Oqtane.Application - Oqtane.Application - Oqtane.Application - false - MIT - https://github.com/oqtane/oqtane.framework - icon.png - oqtane module - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.cmd b/Oqtane.Application/Build/debug.cmd index 6ac5c190..697dd3ae 100644 --- a/Oqtane.Application/Build/debug.cmd +++ b/Oqtane.Application/Build/debug.cmd @@ -1,11 +1 @@ -@echo off -set TargetFramework=%1 -set ProjectName=%2 - -XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.dll" "..\AppHost\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.pdb" "..\AppHost\bin\Debug\%TargetFramework%\" /Y XCOPY "..\Server\wwwroot\*" "..\AppHost\wwwroot\" /Y /S /I \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.sh b/Oqtane.Application/Build/debug.sh index 7c4beb97..bf088d67 100644 --- a/Oqtane.Application/Build/debug.sh +++ b/Oqtane.Application/Build/debug.sh @@ -1,12 +1 @@ -#!/bin/bash - -TargetFramework=$1 -ProjectName=$2 - -cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.dll" "../AppHost/bin/Debug/$TargetFramework/" -cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.pdb" "../AppHost/bin/Debug/$TargetFramework/" cp -rf "../Server/wwwroot/"* "../AppHost/wwwroot/" \ No newline at end of file diff --git a/Oqtane.Application/Build/icon.png b/Oqtane.Application/Build/icon.png deleted file mode 100644 index 3c43cce4c6604107eab529207edd44c386768ca1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4895 zcmV+)6X5KLP)Px#1ZP1_K>z@;j|==^1poj7B2Y|JMgRZ*{{H^`{r&v>{G+3zeSLkLoSa!%Sq26M z0|NsE1qDh25)y%dfpBneJ3BizHZ}s;WgrMN3Od zg@uKVj*gI!kau@?goK1!TU(u-or#HwuCA^uEG(Own>95xWMpIy4-c%YtT8b$NJvO^ zb#+owQYI!Qva+&FOiV5=E^KUUnVFfWsHl~dm3Vk~X=!OqO-;46wIU)SI5;>nGc&ff zwmv>SnwpxgudgpJFCQNtjg5^zKR>3Xri_e?dU|?OQ&VRaI57v9W-FfP;gB zZ*Omul$4j3m#3$vmX?-lYiqEuuvAo3h=_N?x0*=>;fLtmHDY5rf{_g*zKv)fg} z^!Chl^G)wePuHtg@2mIf>SH!&J(RLL`Ns{ziweNRq_s9qV=8Pt90B{`il-rL7BcnjL= zUz$gcD7CD%g)pYtT3eksqh<0_wpM4;_{P0lPY!`w%n91sUd{9Lu zT*tNVfPO3=Jjlq|brCfJdcBp*HmI_xg*X9M@rj|VgKXSD9j_;}LQ~pkg|iK{$;W~_ zuFW}UBuYJA9x;6%4wH*kvdQ1nd2m^6WitsIEgOs0ULOWTHlrXWG(vQ0e_JPinBo&Q zOE$qSc@iA_O~mN=ET2(exkOa9$imP`g%b3%r)-{#f~K^Et!$|^+5x@IX2>%7{bM13 zQ6$sD2twk~y20cGRCe1dyLeL>UAoJiS#H2x)Am4; zdo8?WF}Rd^#^3AGX7pAo%}~Km7B6A_s#1UQXE;D|FBvbV=lHd@qwg-8J3COl>=2(% z^xQpBEO8SF217H%U$X!*iEVqDFBp1wP-JZt9^#cC*hkXEd#Wlj0J3AhBd|bC=;^%> zjC>Ll4phiVx)b}E;32jhWOHL3!pG^=vxlEsV0pYf%PV_*2>aMFf$6123tVlUE3mbZ z$%ny%yomOm4Ub@iTSpdYJ?y%A1h_}%}NOU9B( zu_U;ihh`la56%!LCbK$3m~)wZtYyq#?NY&t4mQdKBBCoVN*(}=)>TQFiSF!=^zdYKr>v&DdZ`hPPQ3bCI)Hrqdp?k4A#`vxC-{zz>1*tbJ1u& zCXj+R7LC^-gz^EFWFXTjc9RA6bjJx+Ha3s^pimk_y4e~J6{ByL3>NCpa0gO*UjvVf zjZ19jKZL;Y(4e#}EN@W=Uh1JKR$UH+=5cXW`?=UsPg0KsJKR)E|4;?;JU(dgm91*a`HL-@$#)bz<#Z6fbMCKlaAX~_9r+TdI!(k3` zt7|`~)Nw1^C$elS(53Z6AfiH8LdWAgXiVi5N{+>NvQJH99x+4+ zo5rMxpqfv68i!3lk0nhVR;t%}c$SR$;s|IxMsqH;sL>hHP?t}NGe81VR$^FjvLBP{ z?{WTF7pAefF7gy` z=PcuP;*Exvp>_F9?%cR_Aj|wv^29U2(eiIucN?MBmr;XaLM_OgsLCm@>hYG%;c^Mh z_e=LP=e9V8XLr9FWOL)0FqdI-EP~oz`^Z%+wAsXxEZ-KaBntL4$S_1lbZK@_KvY>^ zZwL2SvDqS+IV4zPoNmy8vcV<9R^TZW@H1caX6?=)~m1*^M&2^2RzA5vR#TUW>T1Qc`GvIx!Vw`Sa#l`ZYQHklp>U^!=ALBsjWuF0RZQYZvBS4j; z!>JFE3fjOXU5J-e@Bz`_qMXn;LF!}z`#$uY(i7eKvMsL_AgzTJG*|Rad&!D!U-?M- zLzfkH!<1`Id#4Pxj)uZU9_dG5d8kn0$%>VA0NVF9(vlFYQ!Qf_UKGzm)NKNHtNYx2 zuvM?kWKz-^CS<~Zl;Q$N;zU~m11NPri*qIyj*4XZpbq4?XD}nHXfu@)k+2uHm6(Q` z3e9p_cXM#ztgm1qNu}er%^K7rpXvG|GI{ESl<^v?C3w`=$SIA0nJWjO51^_RdwUF4 zw>JGz1ces@k3�q3`kwQ;BU888;`$;WJ28OyUNR9n+_GyqC7;X zGWF*?|4RlHOoj@pZ6sE)Olt6ZWV)3~0J8B?(GywW2Pv{3czYIoU=)R^V4kJzIs9vHNe?+pFS5eZX*wiOS75JIJsdhbWW|!Vx{EA?Osq3qC)J=m1fx+bE(6Bv|bvR)DY6V9PvGKf% z2trQxH-B!fis?9~?5w8Z23jAchS!sC64?Z} z6OYEa(Muxf@UXai?QXMr$bs@>R_wZA+g=dhzeB}>3)GV!l}>C47P01$h4K*{c1(y| z*9=JhE91C*3#XYVVRmZ6h{a3d|F|;gm<~T|avdku6@nx9XGF1T8FSPB?`ocV5vdQ* zb8!W>xl@7&n7`p{e5^}QJv!{f)$A1gK{$;5^HZ9qG;30 z{G(BFK<$^)P~lQiJf!oYH`95?*FR7u^u)sBv{do1jSL!iHn^rv}423?YG#(5rpEr2Y9&;#t>I1WNl??MIv%%WwHp7VT5B+zB!j5bZ`g8L3LfG1O1qUU z9aI(R)KB-u15NM;{IqYHG$L(?FFd5>Ut^{MuByUMcqYcTDoO_M*m4m?w80}(2sve! zJcE%Q72DSJ*>_Na6x0r=e>r|mBr%AH4vS~MLG0Q>+JhDS;t+IS)xj?bm;!(5!Edeh zc4F6AHp5zx6cGiki>VXZ>kNw%i(!E^V^pwg)^R&;I|{+ad)W*iF%vm4gFlnrEoM!D ze}(4OB6{Ib`U5UCVR?$;UuYg9EV2)DC-(?8>iwpDZ8f$V=p-@zZeIcbCdDTOIrwX3a0k!E>+ z)>m7*E^h*4M}c1Sad$WWe3&<|B5#0nc~kUo@7T8T2xJV~L)N^xvji@FchFc)4l8z? zIY7?fxXeamkr6P%PQJhU&+dL&a5ZQorf=_#FF6zc$u`EY7F10N{`>leUG9rfT9>!X zdE&d6d|3mV_VW`nKI!hOd*+D3snpfEVBf|EvuJf3B0CE||L@YoyB|1n?%d@WGiH4H z-o$yg+)IhsXxP_*C{SvLd0o21gX$c^_|Ldvu>5edK};Ok^|bZKZGE)*=Ey@PFsc{Wd!6 R-3I^w002ovPDHLkV1nKx-0T1V diff --git a/Oqtane.Application/Build/release.cmd b/Oqtane.Application/Build/release.cmd deleted file mode 100644 index a71d781e..00000000 --- a/Oqtane.Application/Build/release.cmd +++ /dev/null @@ -1,2 +0,0 @@ -del "*.nupkg" -"nuget.exe" pack Oqtane.Application.nuspec -Properties projectname=Oqtane.Application diff --git a/Oqtane.Application/Build/release.sh b/Oqtane.Application/Build/release.sh deleted file mode 100644 index 0a01b394..00000000 --- a/Oqtane.Application/Build/release.sh +++ /dev/null @@ -1 +0,0 @@ -"nuget.exe" pack Oqtane.Application.nuspec -Properties projectname=Oqtane.Application \ No newline at end of file From 78f8e2f4840444a4984f8404748c0ee4809abafb Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 19 Aug 2025 12:26:54 -0400 Subject: [PATCH 06/68] template improvements --- Oqtane.Application/.gitignore | 9 +++++++++ Oqtane.Package/Oqtane.Application.Template.cmd | 3 +++ Oqtane.Package/release.cmd | 1 - 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Oqtane.Application/.gitignore create mode 100644 Oqtane.Package/Oqtane.Application.Template.cmd diff --git a/Oqtane.Application/.gitignore b/Oqtane.Application/.gitignore new file mode 100644 index 00000000..ce6c2edc --- /dev/null +++ b/Oqtane.Application/.gitignore @@ -0,0 +1,9 @@ +.vs/ +bin/ +obj/ +*.user +artifacts/ +msbuild.binlog +.vscode/ +*.binlog +*.nupkg diff --git a/Oqtane.Package/Oqtane.Application.Template.cmd b/Oqtane.Package/Oqtane.Application.Template.cmd new file mode 100644 index 00000000..2352d0e9 --- /dev/null +++ b/Oqtane.Package/Oqtane.Application.Template.cmd @@ -0,0 +1,3 @@ +nuget.exe pack ..\Oqtane.Application\Oqtane.Application.Template.nuspec -NoDefaultExcludes +pause + diff --git a/Oqtane.Package/release.cmd b/Oqtane.Package/release.cmd index 6e9160ac..641cd4c4 100644 --- a/Oqtane.Package/release.cmd +++ b/Oqtane.Package/release.cmd @@ -55,6 +55,5 @@ dotnet clean -c Release ..\Oqtane.Updater.sln dotnet build -c Release ..\Oqtane.Updater.sln dotnet publish ..\Oqtane.Updater\Oqtane.Updater.csproj /p:Configuration=Release nuget.exe pack Oqtane.Updater.nuspec -nuget.exe pack ..\Oqtane.Application\Oqtane.Application.Template.nuspec pause From 96192e2e06087b0214e551dca127ade72885d655 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 19 Aug 2025 13:16:37 -0400 Subject: [PATCH 07/68] add additional SSL connection options for SMTP --- Oqtane.Client/Modules/Admin/Site/Index.razor | 17 +++++++----- .../Resources/Modules/Admin/Site/Index.resx | 19 ++++++++++++-- .../Infrastructure/Jobs/NotificationJob.cs | 26 +++++++++++++++++-- 3 files changed, 52 insertions(+), 10 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 115f29a0..7e1385ff 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -224,11 +224,14 @@
- +
- + + + + +
@@ -504,7 +507,7 @@ private string _smtpauthentication = "Basic"; private string _smtphost = string.Empty; private string _smtpport = string.Empty; - private string _smtpssl = "True"; + private string _smtpssl = "Auto"; private string _smtpusername = string.Empty; private string _smtppassword = string.Empty; private string _smtppasswordtype = "password"; @@ -613,7 +616,9 @@ { _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); - _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); + _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "Auto"); + if (_smtpssl == "True") _smtpssl = "SslOnConnect"; + if (_smtpssl == "False") _smtpssl = "StartTlsWhenAvailable"; _smtpauthentication = SettingService.GetSetting(settings, "SMTPAuthentication", "Basic"); _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); diff --git a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx index 97e4e8f3..5379db80 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Site/Index.resx @@ -193,7 +193,7 @@ Enter the port number for the SMTP server. Please note this field is required if you provide a host name. - Specify if SSL is required for your SMTP server + Specify the type of SSL connection for your SMTP server Enter the username for your SMTP account @@ -241,7 +241,7 @@ Port: - SSL Required: + SSL Options: Username: @@ -489,4 +489,19 @@ The Authority Url for the SMTP provider + + None + + + Automatic + + + Upgrade To TLS + + + Require SSL/TLS + + + Use TLS When Available + \ No newline at end of file diff --git a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs index 6b755e89..65b53cc0 100644 --- a/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs +++ b/Oqtane.Server/Infrastructure/Jobs/NotificationJob.cs @@ -81,9 +81,31 @@ namespace Oqtane.Infrastructure // construct SMTP Client using var client = new SmtpClient(); + var secureSocketOptions = SecureSocketOptions.Auto; + switch (settingRepository.GetSettingValue(settings, "SMTPSSL", "Auto")) + { + case "None": + secureSocketOptions = SecureSocketOptions.None; + break; + case "Auto": + secureSocketOptions = SecureSocketOptions.Auto; + break; + case "StartTls": + secureSocketOptions = SecureSocketOptions.StartTls; + break; + case "SslOnConnect": + case "True": // legacy setting value + secureSocketOptions = SecureSocketOptions.SslOnConnect; + break; + case "StartTlsWhenAvailable": + case "False": // legacy setting value + secureSocketOptions = SecureSocketOptions.StartTlsWhenAvailable; + break; + } + await client.ConnectAsync(settingRepository.GetSettingValue(settings, "SMTPHost", ""), - int.Parse(settingRepository.GetSettingValue(settings, "SMTPPort", "")), - bool.Parse(settingRepository.GetSettingValue(settings, "SMTPSSL", "False")) ? SecureSocketOptions.StartTls : SecureSocketOptions.None); + int.Parse(settingRepository.GetSettingValue(settings, "SMTPPort", "")), + secureSocketOptions); if (settingRepository.GetSettingValue(settings, "SMTPAuthentication", "Basic") == "Basic") { From 2f2baf12fbc8664d728a991e6fa345c0464ba183 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 19 Aug 2025 14:01:25 -0400 Subject: [PATCH 08/68] fix filename in template --- .../Client/Services/{ArticleService.cs => MyModuleService.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Oqtane.Application/Client/Services/{ArticleService.cs => MyModuleService.cs} (100%) diff --git a/Oqtane.Application/Client/Services/ArticleService.cs b/Oqtane.Application/Client/Services/MyModuleService.cs similarity index 100% rename from Oqtane.Application/Client/Services/ArticleService.cs rename to Oqtane.Application/Client/Services/MyModuleService.cs From 5b45e3e4170e50662bf335b498cfbd61a0bab75c Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 20 Aug 2025 07:09:33 -0400 Subject: [PATCH 09/68] support for staticwebassets folder in Nuget packages --- .../Infrastructure/InstallationManager.cs | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index ca09616c..883997e6 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -71,22 +71,30 @@ namespace Oqtane.Infrastructure { try { - // iterate through files + // open nupkg as zip archive using (ZipArchive archive = ZipFile.OpenRead(packagename)) { + string id = ""; string frameworkversion = ""; + // locate nuspec foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.ToLower().EndsWith(".nuspec")) { // open nuspec - XmlTextReader reader = new XmlTextReader(entry.Open()); + var reader = new XmlTextReader(entry.Open()); reader.Namespaces = false; // remove namespace - XmlDocument doc = new XmlDocument(); + var doc = new XmlDocument(); doc.Load(reader); + // get id + var node = doc.SelectSingleNode("/package/metadata/id"); + if (node != null) + { + id = node.InnerText; + } // get framework dependency - XmlNode node = doc.SelectSingleNode("/package/metadata/dependencies/dependency[@id='Oqtane.Framework']"); + node = doc.SelectSingleNode("/package/metadata/dependencies/dependency[@id='Oqtane.Framework']"); if (node != null) { frameworkversion = node.Attributes["version"].Value; @@ -109,7 +117,7 @@ namespace Oqtane.Infrastructure string filename = ""; // evaluate entry root folder - switch (entry.FullName.Split('/')[0]) + switch (entry.FullName.Split('/')[0].ToLower()) { case "lib": // lib/net*/... filename = ExtractFile(entry, binPath, 2); @@ -117,6 +125,9 @@ namespace Oqtane.Infrastructure case "wwwroot": // wwwroot/... filename = ExtractFile(entry, webRootPath, 1); break; + case "staticwebassets": // staticwebassets/... + filename = ExtractFile(entry, Path.Combine(webRootPath, Path.Combine("_content", id)), 1); + break; case "runtimes": // runtimes/name/... filename = ExtractFile(entry, binPath, 0); break; From 036bbb418e1fdbdda4bba80e9b41e72d1eeea00d Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 21 Aug 2025 09:56:03 -0400 Subject: [PATCH 10/68] template updates --- .../Build/Oqtane.Application.Build.csproj | 11 ++--------- .../Client/Oqtane.Application.Client.csproj | 5 ++--- .../Server/Oqtane.Application.Server.csproj | 9 ++------- .../Shared/Oqtane.Application.Shared.csproj | 2 +- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/Oqtane.Application/Build/Oqtane.Application.Build.csproj b/Oqtane.Application/Build/Oqtane.Application.Build.csproj index a432daef..af1c3888 100644 --- a/Oqtane.Application/Build/Oqtane.Application.Build.csproj +++ b/Oqtane.Application/Build/Oqtane.Application.Build.csproj @@ -6,13 +6,6 @@ false - - - True - - - - @@ -20,8 +13,8 @@ - - + + \ No newline at end of file diff --git a/Oqtane.Application/Client/Oqtane.Application.Client.csproj b/Oqtane.Application/Client/Oqtane.Application.Client.csproj index 24c49e8a..ae37ebd5 100644 --- a/Oqtane.Application/Client/Oqtane.Application.Client.csproj +++ b/Oqtane.Application/Client/Oqtane.Application.Client.csproj @@ -4,7 +4,6 @@ net9.0 1.0.0 Oqtane.Application.Client.Oqtane - true @@ -20,8 +19,8 @@ - - + + diff --git a/Oqtane.Application/Server/Oqtane.Application.Server.csproj b/Oqtane.Application/Server/Oqtane.Application.Server.csproj index 07e2a168..44826c6b 100644 --- a/Oqtane.Application/Server/Oqtane.Application.Server.csproj +++ b/Oqtane.Application/Server/Oqtane.Application.Server.csproj @@ -5,7 +5,6 @@ true 1.0.0 Oqtane.Application.Server.Oqtane - true @@ -26,11 +25,7 @@ - - - - - - + + diff --git a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj index 68aef478..641056f4 100644 --- a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj +++ b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj @@ -11,7 +11,7 @@ - + From 0f38df053fe8bf64c58287c4f6755d71f4a69969 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 21 Aug 2025 09:57:29 -0400 Subject: [PATCH 11/68] fix #5519 - Site hard delete exception --- Oqtane.Server/Repository/SiteRepository.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Oqtane.Server/Repository/SiteRepository.cs b/Oqtane.Server/Repository/SiteRepository.cs index 530c536c..f791aeac 100644 --- a/Oqtane.Server/Repository/SiteRepository.cs +++ b/Oqtane.Server/Repository/SiteRepository.cs @@ -109,6 +109,11 @@ namespace Oqtane.Repository public void DeleteSite(int siteId) { + foreach (var role in _roleRepository.GetRoles(siteId, false)) + { + _roleRepository.DeleteRole(role.RoleId); + } + using var db = _factory.CreateDbContext(); var site = db.Site.Find(siteId); db.Site.Remove(site); From cca0f2219e45a3b1f55cb1d2d52da2341b922e0d Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 21 Aug 2025 09:59:15 -0400 Subject: [PATCH 12/68] fix #5520 - site soft delete should only be visible to Host users --- Oqtane.Client/Modules/Admin/Site/Index.razor | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 7e1385ff..d76f56a5 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -54,15 +54,18 @@ -
- -
- + @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { +
+ +
+ +
-
+ }
From 52799c7cb05cc0ac8a94506a063db6104669806e Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 22 Aug 2025 08:41:52 -0400 Subject: [PATCH 13/68] declare dependencies in nuspec files and optimize application template --- .../AppHost/Oqtane.Application.AppHost.csproj | 47 ++----------------- .../Build/Oqtane.Application.Build.csproj | 20 -------- Oqtane.Application/Build/debug.cmd | 1 - Oqtane.Application/Build/debug.sh | 1 - .../Client/Oqtane.Application.Client.csproj | 12 +---- Oqtane.Application/Oqtane.Application.sln | 6 --- .../Server/Oqtane.Application.Server.csproj | 23 ++++----- .../Shared/Oqtane.Application.Shared.csproj | 6 +-- Oqtane.Package/Oqtane.Client.nuspec | 11 ++++- Oqtane.Package/Oqtane.Server.nuspec | 32 ++++++++++++- Oqtane.Package/Oqtane.Shared.nuspec | 12 ++++- Oqtane.Package/release.cmd | 2 +- 12 files changed, 69 insertions(+), 104 deletions(-) delete mode 100644 Oqtane.Application/Build/Oqtane.Application.Build.csproj delete mode 100644 Oqtane.Application/Build/debug.cmd delete mode 100644 Oqtane.Application/Build/debug.sh diff --git a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj index 9490f607..9a9cb9fa 100644 --- a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj +++ b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj @@ -2,50 +2,11 @@ net9.0 - 6.1.5 + 1.0.0 Oqtane.Application.AppHost - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + diff --git a/Oqtane.Application/Build/Oqtane.Application.Build.csproj b/Oqtane.Application/Build/Oqtane.Application.Build.csproj deleted file mode 100644 index af1c3888..00000000 --- a/Oqtane.Application/Build/Oqtane.Application.Build.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - net9.0 - false - false - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.cmd b/Oqtane.Application/Build/debug.cmd deleted file mode 100644 index 697dd3ae..00000000 --- a/Oqtane.Application/Build/debug.cmd +++ /dev/null @@ -1 +0,0 @@ -XCOPY "..\Server\wwwroot\*" "..\AppHost\wwwroot\" /Y /S /I \ No newline at end of file diff --git a/Oqtane.Application/Build/debug.sh b/Oqtane.Application/Build/debug.sh deleted file mode 100644 index bf088d67..00000000 --- a/Oqtane.Application/Build/debug.sh +++ /dev/null @@ -1 +0,0 @@ -cp -rf "../Server/wwwroot/"* "../AppHost/wwwroot/" \ No newline at end of file diff --git a/Oqtane.Application/Client/Oqtane.Application.Client.csproj b/Oqtane.Application/Client/Oqtane.Application.Client.csproj index ae37ebd5..865765fc 100644 --- a/Oqtane.Application/Client/Oqtane.Application.Client.csproj +++ b/Oqtane.Application/Client/Oqtane.Application.Client.csproj @@ -6,21 +6,13 @@ Oqtane.Application.Client.Oqtane - - - - - - - - - - + + diff --git a/Oqtane.Application/Oqtane.Application.sln b/Oqtane.Application/Oqtane.Application.sln index c5b05c71..a1054772 100644 --- a/Oqtane.Application/Oqtane.Application.sln +++ b/Oqtane.Application/Oqtane.Application.sln @@ -10,8 +10,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Server", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Shared", "Shared\Oqtane.Application.Shared.csproj", "{18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Build", "Build\Oqtane.Application.Build.csproj", "{C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -34,10 +32,6 @@ Global {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Debug|Any CPU.Build.0 = Debug|Any CPU {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Release|Any CPU.Build.0 = Release|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C5CE512D-CBB7-4545-AF0F-9B6591A0C3A7}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Oqtane.Application/Server/Oqtane.Application.Server.csproj b/Oqtane.Application/Server/Oqtane.Application.Server.csproj index 44826c6b..69ea8563 100644 --- a/Oqtane.Application/Server/Oqtane.Application.Server.csproj +++ b/Oqtane.Application/Server/Oqtane.Application.Server.csproj @@ -7,25 +7,20 @@ Oqtane.Application.Server.Oqtane - - - - - - - - - - - - - - + + + + + + + + + diff --git a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj index 641056f4..865461b1 100644 --- a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj +++ b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj @@ -7,11 +7,7 @@ - - - - - + diff --git a/Oqtane.Package/Oqtane.Client.nuspec b/Oqtane.Package/Oqtane.Client.nuspec index 18ea653b..3adc1e20 100644 --- a/Oqtane.Package/Oqtane.Client.nuspec +++ b/Oqtane.Package/Oqtane.Client.nuspec @@ -2,7 +2,7 @@ Oqtane.Client - 6.1.5 + 6.1.6 Shaun Walker .NET Foundation Oqtane Framework @@ -16,6 +16,15 @@ readme.md icon.png oqtane + + + + + + + + + diff --git a/Oqtane.Package/Oqtane.Server.nuspec b/Oqtane.Package/Oqtane.Server.nuspec index d7e88718..96074428 100644 --- a/Oqtane.Package/Oqtane.Server.nuspec +++ b/Oqtane.Package/Oqtane.Server.nuspec @@ -2,7 +2,7 @@ Oqtane.Server - 6.1.5 + 6.1.6 Shaun Walker .NET Foundation Oqtane Framework @@ -16,6 +16,36 @@ readme.md icon.png oqtane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Oqtane.Package/Oqtane.Shared.nuspec b/Oqtane.Package/Oqtane.Shared.nuspec index f8e1f177..320f80f8 100644 --- a/Oqtane.Package/Oqtane.Shared.nuspec +++ b/Oqtane.Package/Oqtane.Shared.nuspec @@ -2,7 +2,7 @@ Oqtane.Shared - 6.1.5 + 6.1.6 Shaun Walker .NET Foundation Oqtane Framework @@ -16,6 +16,16 @@ readme.md icon.png oqtane + + + + + + + + + + diff --git a/Oqtane.Package/release.cmd b/Oqtane.Package/release.cmd index 641cd4c4..8b914c90 100644 --- a/Oqtane.Package/release.cmd +++ b/Oqtane.Package/release.cmd @@ -1,12 +1,12 @@ del "*.nupkg" del "*.zip" +rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish" dotnet clean -c Release ..\Oqtane.sln dotnet build -c Release ..\Oqtane.sln nuget.exe pack Oqtane.Client.nuspec nuget.exe pack Oqtane.Server.nuspec nuget.exe pack Oqtane.Shared.nuspec nuget.exe pack Oqtane.Framework.nuspec -rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish" dotnet publish ..\Oqtane.Server\Oqtane.Server.csproj /p:Configuration=Release rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish\Content" rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish\wwwroot\Content" From 247baa375d9882ad0daf11174fac4a14986e1915 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 22 Aug 2025 08:55:20 -0400 Subject: [PATCH 14/68] increment template version --- Oqtane.Application/Oqtane.Application.Template.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Application/Oqtane.Application.Template.nuspec b/Oqtane.Application/Oqtane.Application.Template.nuspec index 35a1c956..964286a2 100644 --- a/Oqtane.Application/Oqtane.Application.Template.nuspec +++ b/Oqtane.Application/Oqtane.Application.Template.nuspec @@ -2,7 +2,7 @@ Oqtane.Application.Template - 6.1.5 + 6.1.6 Oqtane Application Solution For Blazor Shaun Walker false From 4e33aeef890f288e20687f8e303575d179f0f4b7 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 22 Aug 2025 09:17:24 -0400 Subject: [PATCH 15/68] more template optimizations --- Oqtane.Application/Client/Oqtane.Application.Client.csproj | 1 - Oqtane.Application/Server/Oqtane.Application.Server.csproj | 1 - 2 files changed, 2 deletions(-) diff --git a/Oqtane.Application/Client/Oqtane.Application.Client.csproj b/Oqtane.Application/Client/Oqtane.Application.Client.csproj index 865765fc..6d83fd5c 100644 --- a/Oqtane.Application/Client/Oqtane.Application.Client.csproj +++ b/Oqtane.Application/Client/Oqtane.Application.Client.csproj @@ -12,7 +12,6 @@ - diff --git a/Oqtane.Application/Server/Oqtane.Application.Server.csproj b/Oqtane.Application/Server/Oqtane.Application.Server.csproj index 69ea8563..7e9ad243 100644 --- a/Oqtane.Application/Server/Oqtane.Application.Server.csproj +++ b/Oqtane.Application/Server/Oqtane.Application.Server.csproj @@ -14,7 +14,6 @@ - From 7f1fed2fb15b32f08cabdd56d5112545e802f0fe Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 22 Aug 2025 10:06:10 -0400 Subject: [PATCH 16/68] make kestrel the default web server for the app template --- .../AppHost/Properties/launchSettings.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Oqtane.Application/AppHost/Properties/launchSettings.json b/Oqtane.Application/AppHost/Properties/launchSettings.json index c0b641d5..11cab4d9 100644 --- a/Oqtane.Application/AppHost/Properties/launchSettings.json +++ b/Oqtane.Application/AppHost/Properties/launchSettings.json @@ -8,15 +8,7 @@ } }, "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Oqtane.AppHost": { + "Oqtane.Application": { "commandName": "Project", "launchBrowser": true, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", @@ -24,6 +16,14 @@ "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "http://localhost:44358/" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } } } } From 6a0c47f7b1211a13896d6bd27e86b4fede8ac1d8 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 22 Aug 2025 14:21:49 -0400 Subject: [PATCH 17/68] remove unecessary content exclusion --- Oqtane.Client/Oqtane.Client.csproj | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index 6c4b6c37..c1bdea3f 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -32,12 +32,6 @@ - - - true - - - false false From 919fb5012f33a6517f3217f10c6f4c4b3364d514 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 26 Aug 2025 18:13:09 +0800 Subject: [PATCH 18/68] Fix #5532: add require nonce setting. --- Oqtane.Client/Modules/Admin/Users/Index.razor | 15 +++++++++++++++ .../Resources/Modules/Admin/Users/Index.resx | 6 ++++++ .../OqtaneSiteAuthenticationBuilderExtensions.cs | 1 + 3 files changed, 22 insertions(+) diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 53218b3c..97bbdebe 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -413,6 +413,18 @@ else
+ @if (_providertype == AuthenticationProviderTypes.OpenIDConnect) + { +
+ +
+ +
+
+ }
@@ -557,6 +569,7 @@ else private string _synchronizeroles; private string _profileclaimtypes; private string _savetokens; + private string _requirenonce; private string _domainfilter; private string _createusers; private string _verifyusers; @@ -643,6 +656,7 @@ else _synchronizeroles = SettingService.GetSetting(settings, "ExternalLogin:SynchronizeRoles", "false"); _profileclaimtypes = SettingService.GetSetting(settings, "ExternalLogin:ProfileClaimTypes", ""); _savetokens = SettingService.GetSetting(settings, "ExternalLogin:SaveTokens", "false"); + _requirenonce = SettingService.GetSetting(settings, "ExternalLogin:RequireNonce", "false"); _domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", ""); _createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true"); _verifyusers = SettingService.GetSetting(settings, "ExternalLogin:VerifyUsers", "true"); @@ -762,6 +776,7 @@ else settings = SettingService.SetSetting(settings, "ExternalLogin:SynchronizeRoles", _synchronizeroles, true); settings = SettingService.SetSetting(settings, "ExternalLogin:ProfileClaimTypes", _profileclaimtypes, true); settings = SettingService.SetSetting(settings, "ExternalLogin:SaveTokens", _savetokens, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:RequireNonce", _requirenonce, true); settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true); settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true); settings = SettingService.SetSetting(settings, "ExternalLogin:VerifyUsers", _verifyusers, true); diff --git a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx index 16e0d40e..e6d07a27 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx @@ -513,6 +513,12 @@ OpenID Connect (OIDC) + + Require Nonce? + + + Specify the RequireNonce property for OpenID Connect Authentication. + Save Tokens? diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index f142c602..6f6651e3 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -63,6 +63,7 @@ namespace Oqtane.Extensions options.ResponseType = sitesettings.GetValue("ExternalLogin:AuthResponseType", "code"); // default is authorization code flow options.UsePkce = bool.Parse(sitesettings.GetValue("ExternalLogin:PKCE", "false")); options.SaveTokens = bool.Parse(sitesettings.GetValue("ExternalLogin:SaveTokens", "false")); + options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "false")); ; if (!string.IsNullOrEmpty(sitesettings.GetValue("ExternalLogin:RoleClaimType", ""))) { options.TokenValidationParameters.RoleClaimType = sitesettings.GetValue("ExternalLogin:RoleClaimType", ""); From 91e55aeb9b15da948e154a301ac6e8982c5b67ea Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 26 Aug 2025 20:26:11 +0800 Subject: [PATCH 19/68] Fix #5532: change the default value to true. --- Oqtane.Client/Modules/Admin/Users/Index.razor | 2 +- .../Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 97bbdebe..fa3dccf3 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -656,7 +656,7 @@ else _synchronizeroles = SettingService.GetSetting(settings, "ExternalLogin:SynchronizeRoles", "false"); _profileclaimtypes = SettingService.GetSetting(settings, "ExternalLogin:ProfileClaimTypes", ""); _savetokens = SettingService.GetSetting(settings, "ExternalLogin:SaveTokens", "false"); - _requirenonce = SettingService.GetSetting(settings, "ExternalLogin:RequireNonce", "false"); + _requirenonce = SettingService.GetSetting(settings, "ExternalLogin:RequireNonce", "true"); _domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", ""); _createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true"); _verifyusers = SettingService.GetSetting(settings, "ExternalLogin:VerifyUsers", "true"); diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index 6f6651e3..3bdc49c4 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -63,7 +63,7 @@ namespace Oqtane.Extensions options.ResponseType = sitesettings.GetValue("ExternalLogin:AuthResponseType", "code"); // default is authorization code flow options.UsePkce = bool.Parse(sitesettings.GetValue("ExternalLogin:PKCE", "false")); options.SaveTokens = bool.Parse(sitesettings.GetValue("ExternalLogin:SaveTokens", "false")); - options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "false")); ; + options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "true")); ; if (!string.IsNullOrEmpty(sitesettings.GetValue("ExternalLogin:RoleClaimType", ""))) { options.TokenValidationParameters.RoleClaimType = sitesettings.GetValue("ExternalLogin:RoleClaimType", ""); From f451cfce090fe2c235958effa4f2ee5d5addae48 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 26 Aug 2025 20:27:41 +0800 Subject: [PATCH 20/68] Fix #5532: remove duplicated semi colon. --- .../Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index 3bdc49c4..544ad068 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -63,7 +63,7 @@ namespace Oqtane.Extensions options.ResponseType = sitesettings.GetValue("ExternalLogin:AuthResponseType", "code"); // default is authorization code flow options.UsePkce = bool.Parse(sitesettings.GetValue("ExternalLogin:PKCE", "false")); options.SaveTokens = bool.Parse(sitesettings.GetValue("ExternalLogin:SaveTokens", "false")); - options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "true")); ; + options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "true")); if (!string.IsNullOrEmpty(sitesettings.GetValue("ExternalLogin:RoleClaimType", ""))) { options.TokenValidationParameters.RoleClaimType = sitesettings.GetValue("ExternalLogin:RoleClaimType", ""); From ec06c1cdf1bf2f903c3607d95762c095ccb45328 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 26 Aug 2025 15:27:35 -0400 Subject: [PATCH 21/68] optimize startup --- .../ApplicationBuilderExtensions.cs | 91 +++++++ .../OqtaneServiceCollectionExtensions.cs | 141 +++++++++- .../Infrastructure/LocalizationManager.cs | 6 + Oqtane.Server/Startup.cs | 241 +----------------- 4 files changed, 241 insertions(+), 238 deletions(-) diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 3e31ac60..fa3835ea 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -2,14 +2,105 @@ using System; using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Cors.Infrastructure; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Net.Http.Headers; +using Oqtane.Components; using Oqtane.Infrastructure; +using Oqtane.Shared; +using Oqtane.UI; +using OqtaneSSR.Extensions; namespace Oqtane.Extensions { public static class ApplicationBuilderExtensions { + public static IApplicationBuilder UseOqtane(this IApplicationBuilder app, IConfigurationRoot configuration, IWebHostEnvironment environment, ICorsService corsService, ICorsPolicyProvider corsPolicyProvider, ISyncManager sync) + { + ServiceActivator.Configure(app.ApplicationServices); + + if (environment.IsDevelopment()) + { + app.UseWebAssemblyDebugging(); + app.UseForwardedHeaders(); + } + else + { + app.UseForwardedHeaders(); + app.UseExceptionHandler("/Error", createScopeForErrors: true); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + // allow oqtane localization middleware + app.UseOqtaneLocalization(); + + app.UseHttpsRedirection(); + app.UseStaticFiles(new StaticFileOptions + { + OnPrepareResponse = (ctx) => + { + // static asset caching + var cachecontrol = configuration.GetSection("CacheControl"); + if (!string.IsNullOrEmpty(cachecontrol.Value)) + { + ctx.Context.Response.Headers.Append(HeaderNames.CacheControl, cachecontrol.Value); + } + // CORS headers for .NET MAUI clients + var policy = corsPolicyProvider.GetPolicyAsync(ctx.Context, Constants.MauiCorsPolicy) + .ConfigureAwait(false).GetAwaiter().GetResult(); + corsService.ApplyResult(corsService.EvaluatePolicy(ctx.Context, policy), ctx.Context.Response); + } + }); + app.UseExceptionMiddleWare(); + app.UseTenantResolution(); + app.UseJwtAuthorization(); + app.UseRouting(); + app.UseCors(); + app.UseOutputCache(); + app.UseAuthentication(); + app.UseAuthorization(); + app.UseAntiforgery(); + + // execute any IServerStartup logic + app.ConfigureOqtaneAssemblies(environment); + + if (configuration.GetSection("UseSwagger").Value != "false") + { + app.UseSwagger(); + app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/" + Constants.Version + "/swagger.json", Constants.PackageId + " " + Constants.Version); }); + } + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + endpoints.MapRazorPages(); + }); + + app.UseEndpoints(endpoints => + { + endpoints.MapRazorComponents() + .AddInteractiveServerRenderMode() + .AddInteractiveWebAssemblyRenderMode() + .AddAdditionalAssemblies(typeof(SiteRouter).Assembly); + }); + + // simulate the fallback routing approach of traditional Blazor - allowing the custom SiteRouter to handle all routing concerns + app.UseEndpoints(endpoints => + { + endpoints.MapFallback(); + }); + + // create a global sync event to identify server application startup + sync.AddSyncEvent(-1, -1, EntityNames.Host, -1, SyncEventActions.Reload); + + return app; + } + public static IApplicationBuilder ConfigureOqtaneAssemblies(this IApplicationBuilder app, IWebHostEnvironment env) { var startUps = AppDomain.CurrentDomain diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index 20a11ced..ccd9f3a3 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IdentityModel.Tokens.Jwt; using System.IO; @@ -11,12 +12,17 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication.OAuth; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; +using Oqtane.Extensions; using Oqtane.Infrastructure; using Oqtane.Interfaces; using Oqtane.Managers; @@ -31,10 +37,126 @@ namespace Microsoft.Extensions.DependencyInjection { public static class OqtaneServiceCollectionExtensions { - public static IServiceCollection AddOqtane(this IServiceCollection services, string[] installedCultures) + public static IServiceCollection AddOqtane(this IServiceCollection services, IConfigurationRoot configuration, IWebHostEnvironment environment) + { + // process forwarded headers on load balancers and proxy servers + services.Configure(options => + { + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + }); + + // register localization services + services.AddLocalization(options => options.ResourcesPath = "Resources"); + + services.AddOptions>().Bind(configuration.GetSection(SettingKeys.AvailableDatabasesSection)); + + // register scoped core services + services.AddScoped() + .AddOqtaneServerScopedServices(); + + services.AddSingleton(); + + // setup HttpClient for server side in a client side compatible fashion ( with auth cookie ) + services.AddHttpClients(); + + // register singleton scoped core services + services.AddSingleton(configuration) + .AddOqtaneSingletonServices(); + + // install any modules or themes ( this needs to occur BEFORE the assemblies are loaded into the app domain ) + InstallationManager.InstallPackages(environment.WebRootPath, environment.ContentRootPath); + + // register transient scoped core services + services.AddOqtaneTransientServices(); + + // load the external assemblies into the app domain, install services + services.AddOqtaneAssemblies(); + services.AddOqtaneDbContext(); + + services.AddAntiforgery(options => + { + options.HeaderName = Constants.AntiForgeryTokenHeaderName; + options.Cookie.Name = Constants.AntiForgeryTokenCookieName; + options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict; + options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; + options.Cookie.HttpOnly = true; + }); + + services.AddIdentityCore(options => { }) + .AddEntityFrameworkStores() + .AddSignInManager() + .AddDefaultTokenProviders() + .AddClaimsPrincipalFactory>(); // role claims + + services.ConfigureOqtaneIdentityOptions(configuration); + + services.AddCascadingAuthenticationState(); + services.AddScoped(); + services.AddAuthorization(); + + services.AddAuthentication(options => + { + options.DefaultScheme = Constants.AuthenticationScheme; + }) + .AddCookie(Constants.AuthenticationScheme) + .AddOpenIdConnect(AuthenticationProviderTypes.OpenIDConnect, options => { }) + .AddOAuth(AuthenticationProviderTypes.OAuth2, options => { }); + + services.ConfigureOqtaneCookieOptions(); + services.ConfigureOqtaneAuthenticationOptions(configuration); + + services.AddOqtaneSiteOptions() + .WithSiteIdentity() + .WithSiteAuthentication(); + + services.AddCors(options => + { + options.AddPolicy(Constants.MauiCorsPolicy, + policy => + { + // allow .NET MAUI client cross origin calls + policy.WithOrigins("https://0.0.0.1", "http://0.0.0.1", "app://0.0.0.1") + .AllowAnyHeader().AllowAnyMethod().AllowCredentials(); + }); + }); + + services.AddOutputCache(); + + services.AddMvc(options => + { + options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); + }) + .AddOqtaneApplicationParts() // register any Controllers from custom modules + .ConfigureOqtaneMvc(); // any additional configuration from IStartup classes + + services.AddRazorPages(); + + services.AddRazorComponents() + .AddInteractiveServerComponents(options => + { + if (environment.IsDevelopment()) + { + options.DetailedErrors = true; + } + }).AddHubOptions(options => + { + options.MaximumReceiveMessageSize = null; // no limit (for large amounts of data ie. textarea components) + }) + .AddInteractiveWebAssemblyComponents(); + + services.AddSwaggerGen(options => + { + options.CustomSchemaIds(type => type.ToString()); // Handle SchemaId already used for different type + }); + services.TryAddSwagger(configuration); + + return services; + } + + public static IServiceCollection AddOqtaneAssemblies(this IServiceCollection services) { LoadAssemblies(); - LoadSatelliteAssemblies(installedCultures); + LoadSatelliteAssemblies(); services.AddOqtaneServices(); return services; @@ -53,7 +175,7 @@ namespace Microsoft.Extensions.DependencyInjection return new OqtaneSiteOptionsBuilder(services); } - internal static IServiceCollection AddOqtaneSingletonServices(this IServiceCollection services) + public static IServiceCollection AddOqtaneSingletonServices(this IServiceCollection services) { services.AddSingleton(); services.AddSingleton(); @@ -66,7 +188,7 @@ namespace Microsoft.Extensions.DependencyInjection return services; } - internal static IServiceCollection AddOqtaneServerScopedServices(this IServiceCollection services) + public static IServiceCollection AddOqtaneServerScopedServices(this IServiceCollection services) { services.AddScoped(); services.AddScoped(); @@ -112,7 +234,7 @@ namespace Microsoft.Extensions.DependencyInjection return services; } - internal static IServiceCollection AddOqtaneTransientServices(this IServiceCollection services) + public static IServiceCollection AddOqtaneTransientServices(this IServiceCollection services) { // services services.AddTransient(); @@ -242,7 +364,7 @@ namespace Microsoft.Extensions.DependencyInjection return services; } - internal static IServiceCollection AddHttpClients(this IServiceCollection services) + public static IServiceCollection AddHttpClients(this IServiceCollection services) { if (!services.Any(x => x.ServiceType == typeof(HttpClient))) { @@ -285,9 +407,9 @@ namespace Microsoft.Extensions.DependencyInjection return services; } - internal static IServiceCollection TryAddSwagger(this IServiceCollection services, bool useSwagger) + public static IServiceCollection TryAddSwagger(this IServiceCollection services, IConfigurationRoot configuration) { - if (useSwagger) + if (configuration.GetSection("UseSwagger").Value != "false") { services.AddSwaggerGen(c => { @@ -386,10 +508,11 @@ namespace Microsoft.Extensions.DependencyInjection } } - private static void LoadSatelliteAssemblies(string[] installedCultures) + private static void LoadSatelliteAssemblies() { AssemblyLoadContext.Default.Resolving += ResolveDependencies; + var installedCultures = LocalizationManager.GetSatelliteAssemblyCultures(); foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) { var code = Path.GetFileName(Path.GetDirectoryName(file)); diff --git a/Oqtane.Server/Infrastructure/LocalizationManager.cs b/Oqtane.Server/Infrastructure/LocalizationManager.cs index 0d083c4f..3dfc0b54 100644 --- a/Oqtane.Server/Infrastructure/LocalizationManager.cs +++ b/Oqtane.Server/Infrastructure/LocalizationManager.cs @@ -45,6 +45,12 @@ namespace Oqtane.Infrastructure } public string[] GetInstalledCultures() + { + return GetSatelliteAssemblyCultures(); + } + + // method is static as it is called during startup + public static string[] GetSatelliteAssemblyCultures() { var cultures = new List(); foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 3642addd..979c57e4 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -1,260 +1,43 @@ using System; -using System.Collections.Generic; using System.IO; -using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; using Oqtane.Extensions; using Oqtane.Infrastructure; -using Oqtane.Repository; -using Oqtane.Security; using Oqtane.Shared; -using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.Extensions.Logging; -using Oqtane.Components; -using Oqtane.UI; -using OqtaneSSR.Extensions; -using Microsoft.AspNetCore.Components.Authorization; -using Oqtane.Providers; using Microsoft.AspNetCore.Cors.Infrastructure; -using Microsoft.Net.Http.Headers; namespace Oqtane { public class Startup { - private readonly bool _useSwagger; - private readonly IWebHostEnvironment _env; - private readonly string[] _installedCultures; - private string _configureServicesErrors; + private readonly IConfigurationRoot _configuration; + private readonly IWebHostEnvironment _environment; - public IConfigurationRoot Configuration { get; } - - public Startup(IWebHostEnvironment env, ILocalizationManager localizationManager) + public Startup(IWebHostEnvironment environment) { + AppDomain.CurrentDomain.SetData(Constants.DataDirectory, Path.Combine(environment.ContentRootPath, "Data")); + var builder = new ConfigurationBuilder() - .SetBasePath(env.ContentRootPath) + .SetBasePath(environment.ContentRootPath) .AddJsonFile("appsettings.json", false, true) - .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true) + .AddJsonFile($"appsettings.{environment.EnvironmentName}.json", true, true) .AddEnvironmentVariables(); - Configuration = builder.Build(); - - _installedCultures = localizationManager.GetInstalledCultures(); - - //add possibility to switch off swagger on production. - _useSwagger = Configuration.GetSection("UseSwagger").Value != "false"; - - AppDomain.CurrentDomain.SetData(Constants.DataDirectory, Path.Combine(env.ContentRootPath, "Data")); - - _env = env; + _configuration = builder.Build(); + _environment = environment; } - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { - // process forwarded headers on load balancers and proxy servers - services.Configure(options => - { - options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; - }); - - // register localization services - services.AddLocalization(options => options.ResourcesPath = "Resources"); - - services.AddOptions>().Bind(Configuration.GetSection(SettingKeys.AvailableDatabasesSection)); - - // register scoped core services - services.AddScoped() - .AddOqtaneServerScopedServices(); - - services.AddSingleton(); - - // setup HttpClient for server side in a client side compatible fashion ( with auth cookie ) - services.AddHttpClients(); - - // register singleton scoped core services - services.AddSingleton(Configuration) - .AddOqtaneSingletonServices(); - - // install any modules or themes ( this needs to occur BEFORE the assemblies are loaded into the app domain ) - _configureServicesErrors += InstallationManager.InstallPackages(_env.WebRootPath, _env.ContentRootPath); - - // register transient scoped core services - services.AddOqtaneTransientServices(); - - // load the external assemblies into the app domain, install services - services.AddOqtane(_installedCultures); - services.AddOqtaneDbContext(); - - services.AddAntiforgery(options => - { - options.HeaderName = Constants.AntiForgeryTokenHeaderName; - options.Cookie.Name = Constants.AntiForgeryTokenCookieName; - options.Cookie.SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Strict; - options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; - options.Cookie.HttpOnly = true; - }); - - services.AddIdentityCore(options => { }) - .AddEntityFrameworkStores() - .AddSignInManager() - .AddDefaultTokenProviders() - .AddClaimsPrincipalFactory>(); // role claims - - services.ConfigureOqtaneIdentityOptions(Configuration); - - services.AddCascadingAuthenticationState(); - services.AddScoped(); - services.AddAuthorization(); - - services.AddAuthentication(options => - { - options.DefaultScheme = Constants.AuthenticationScheme; - }) - .AddCookie(Constants.AuthenticationScheme) - .AddOpenIdConnect(AuthenticationProviderTypes.OpenIDConnect, options => { }) - .AddOAuth(AuthenticationProviderTypes.OAuth2, options => { }); - - services.ConfigureOqtaneCookieOptions(); - services.ConfigureOqtaneAuthenticationOptions(Configuration); - - services.AddOqtaneSiteOptions() - .WithSiteIdentity() - .WithSiteAuthentication(); - - services.AddCors(options => - { - options.AddPolicy(Constants.MauiCorsPolicy, - policy => - { - // allow .NET MAUI client cross origin calls - policy.WithOrigins("https://0.0.0.1", "http://0.0.0.1", "app://0.0.0.1") - .AllowAnyHeader().AllowAnyMethod().AllowCredentials(); - }); - }); - - services.AddOutputCache(); - - services.AddMvc(options => - { - options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); - }) - .AddOqtaneApplicationParts() // register any Controllers from custom modules - .ConfigureOqtaneMvc(); // any additional configuration from IStartup classes - - services.AddRazorPages(); - - services.AddRazorComponents() - .AddInteractiveServerComponents(options => - { - if (_env.IsDevelopment()) - { - options.DetailedErrors = true; - } - }).AddHubOptions(options => - { - options.MaximumReceiveMessageSize = null; // no limit (for large amounts of data ie. textarea components) - }) - .AddInteractiveWebAssemblyComponents(); - - services.AddSwaggerGen(options => - { - options.CustomSchemaIds(type => type.ToString()); // Handle SchemaId already used for different type - }); - services.TryAddSwagger(_useSwagger); + services.AddOqtane(_configuration, _environment); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ISyncManager sync, ICorsService corsService, ICorsPolicyProvider corsPolicyProvider, ILogger logger) + public void Configure(IApplicationBuilder app, IConfigurationRoot configuration, IWebHostEnvironment environment, ICorsService corsService, ICorsPolicyProvider corsPolicyProvider, ISyncManager sync) { - if (!string.IsNullOrEmpty(_configureServicesErrors)) - { - logger.LogError(_configureServicesErrors); - } - - ServiceActivator.Configure(app.ApplicationServices); - - if (env.IsDevelopment()) - { - app.UseWebAssemblyDebugging(); - app.UseForwardedHeaders(); - } - else - { - app.UseForwardedHeaders(); - app.UseExceptionHandler("/Error", createScopeForErrors: true); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - // allow oqtane localization middleware - app.UseOqtaneLocalization(); - - app.UseHttpsRedirection(); - app.UseStaticFiles(new StaticFileOptions - { - OnPrepareResponse = (ctx) => - { - // static asset caching - var cachecontrol = Configuration.GetSection("CacheControl"); - if (!string.IsNullOrEmpty(cachecontrol.Value)) - { - ctx.Context.Response.Headers.Append(HeaderNames.CacheControl, cachecontrol.Value); - } - // CORS headers for .NET MAUI clients - var policy = corsPolicyProvider.GetPolicyAsync(ctx.Context, Constants.MauiCorsPolicy) - .ConfigureAwait(false).GetAwaiter().GetResult(); - corsService.ApplyResult(corsService.EvaluatePolicy(ctx.Context, policy), ctx.Context.Response); - } - }); - app.UseExceptionMiddleWare(); - app.UseTenantResolution(); - app.UseJwtAuthorization(); - app.UseRouting(); - app.UseCors(); - app.UseOutputCache(); - app.UseAuthentication(); - app.UseAuthorization(); - app.UseAntiforgery(); - - // execute any IServerStartup logic - app.ConfigureOqtaneAssemblies(env); - - if (_useSwagger) - { - app.UseSwagger(); - app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/" + Constants.Version + "/swagger.json", Constants.PackageId + " " + Constants.Version); }); - } - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - endpoints.MapRazorPages(); - }); - - app.UseEndpoints(endpoints => - { - endpoints.MapRazorComponents() - .AddInteractiveServerRenderMode() - .AddInteractiveWebAssemblyRenderMode() - .AddAdditionalAssemblies(typeof(SiteRouter).Assembly); - }); - - // simulate the fallback routing approach of traditional Blazor - allowing the custom SiteRouter to handle all routing concerns - app.UseEndpoints(endpoints => - { - endpoints.MapFallback(); - }); - - // create a global sync event to identify server application startup - sync.AddSyncEvent(-1, -1, EntityNames.Host, -1, SyncEventActions.Reload); + app.UseOqtane(configuration, environment, corsService, corsPolicyProvider, sync); } } } From 4d5168c99889478073ac0db66eb763a2f4f15658 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 26 Aug 2025 17:15:46 -0400 Subject: [PATCH 22/68] application template changes --- .../AppHost/Oqtane.Application.AppHost.csproj | 12 ----- .../AppHost/Properties/launchSettings.json | 29 ------------ .../AppHost/wwwroot/_content/Placeholder.txt | 11 ----- .../AppHost/wwwroot/resources.txt | 1 - .../Client/Modules/MyModule/Edit.razor | 2 +- .../Client/Modules/MyModule/Index.razor | 4 +- .../Client/Oqtane.Application.Client.csproj | 34 +++++++------- Oqtane.Application/Client/Program.cs | 12 +++++ .../Client/Themes/MyTheme/ThemeInfo.cs | 4 +- Oqtane.Application/Oqtane.Application.sln | 19 ++------ .../Server/Oqtane.Application.Server.csproj | 35 ++++++-------- .../{AppHost => Server}/Program.cs | 14 +++--- .../Server/Properties/launchSettings.json | 25 ++++++++++ Oqtane.Application/Server/Startup.cs | 43 ++++++++++++++++++ .../{AppHost => Server}/appsettings.json | 5 +- .../Oqtane.Modules.Admin.Login/Module.css | 0 .../Oqtane.Modules.HtmlText/Module.css | 0 .../wwwroot/Oqtane.Server.lib.module.js | 0 .../Oqtane.Themes.BlazorTheme/Theme.css | 0 .../Oqtane.Themes.OqtaneTheme/Theme.css | 0 .../Server/wwwroot/_content/Placeholder.txt | 11 ----- .../wwwroot/app_offline.bak | 0 .../{AppHost => Server}/wwwroot/css/app.css | 0 .../wwwroot/css/open-iconic/FONT-LICENSE | 0 .../wwwroot/css/open-iconic/ICON-LICENSE | 0 .../wwwroot/css/open-iconic/README.md | 0 .../font/css/open-iconic-bootstrap.min.css | 0 .../open-iconic/font/fonts/open-iconic.eot | Bin .../open-iconic/font/fonts/open-iconic.otf | Bin .../open-iconic/font/fonts/open-iconic.svg | 0 .../open-iconic/font/fonts/open-iconic.ttf | Bin .../open-iconic/font/fonts/open-iconic.woff | Bin .../wwwroot/css/quill/quill.bubble.css | 0 .../wwwroot/css/quill/quill.snow.css | 0 .../wwwroot/css/quill/quill1.3.7.bubble.css | 0 .../wwwroot/css/quill/quill1.3.7.snow.css | 0 .../{AppHost => Server}/wwwroot/favicon.ico | Bin .../{AppHost => Server}/wwwroot/icon.png | Bin .../wwwroot/images/checked.png | Bin .../wwwroot/images/disabled.png | Bin .../wwwroot/images/error.png | Bin .../wwwroot/images/help.png | Bin .../wwwroot/images/logo-black.png | Bin .../wwwroot/images/logo-white.png | Bin .../wwwroot/images/null.png | Bin .../wwwroot/images/unchecked.png | Bin .../{AppHost => Server}/wwwroot/js/app.js | 0 .../{AppHost => Server}/wwwroot/js/interop.js | 0 .../wwwroot/js/loadjs.min.js | 0 .../wwwroot/js/quill-blot-formatter.min.js | 0 .../wwwroot/js/quill-interop.js | 0 .../wwwroot/js/quill.min.js | 0 .../wwwroot/js/quill.min.js.map | 0 .../wwwroot/js/quill1.3.7.min.js | 0 .../{AppHost => Server}/wwwroot/js/reload.js | 0 .../{AppHost => Server}/wwwroot/loading.gif | Bin .../wwwroot/oqtane-black.png | Bin .../wwwroot/oqtane-glow.png | Bin .../wwwroot/oqtane-white.png | Bin .../{AppHost => Server}/wwwroot/oqtane.ico | Bin .../{AppHost => Server}/wwwroot/oqtane.png | Bin .../{AppHost => Server}/wwwroot/package.png | Bin .../wwwroot/service-worker.js | 0 .../{AppHost => Server}/wwwroot/users.txt | 0 .../Shared/Oqtane.Application.Shared.csproj | 16 +++---- 65 files changed, 136 insertions(+), 141 deletions(-) delete mode 100644 Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj delete mode 100644 Oqtane.Application/AppHost/Properties/launchSettings.json delete mode 100644 Oqtane.Application/AppHost/wwwroot/_content/Placeholder.txt delete mode 100644 Oqtane.Application/AppHost/wwwroot/resources.txt create mode 100644 Oqtane.Application/Client/Program.cs rename Oqtane.Application/{AppHost => Server}/Program.cs (84%) create mode 100644 Oqtane.Application/Server/Properties/launchSettings.json create mode 100644 Oqtane.Application/Server/Startup.cs rename Oqtane.Application/{AppHost => Server}/appsettings.json (92%) rename Oqtane.Application/{AppHost => Server}/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/Oqtane.Server.lib.module.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/Themes/Oqtane.Themes.BlazorTheme/Theme.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css (100%) delete mode 100644 Oqtane.Application/Server/wwwroot/_content/Placeholder.txt rename Oqtane.Application/{AppHost => Server}/wwwroot/app_offline.bak (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/app.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/FONT-LICENSE (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/ICON-LICENSE (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/README.md (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/fonts/open-iconic.eot (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/fonts/open-iconic.otf (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/fonts/open-iconic.svg (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/open-iconic/font/fonts/open-iconic.woff (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/quill/quill.bubble.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/quill/quill.snow.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/quill/quill1.3.7.bubble.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/css/quill/quill1.3.7.snow.css (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/favicon.ico (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/icon.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/checked.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/disabled.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/error.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/help.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/logo-black.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/logo-white.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/null.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/images/unchecked.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/app.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/interop.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/loadjs.min.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/quill-blot-formatter.min.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/quill-interop.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/quill.min.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/quill.min.js.map (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/quill1.3.7.min.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/js/reload.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/loading.gif (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/oqtane-black.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/oqtane-glow.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/oqtane-white.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/oqtane.ico (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/oqtane.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/package.png (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/service-worker.js (100%) rename Oqtane.Application/{AppHost => Server}/wwwroot/users.txt (100%) diff --git a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj b/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj deleted file mode 100644 index 9a9cb9fa..00000000 --- a/Oqtane.Application/AppHost/Oqtane.Application.AppHost.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - net9.0 - 1.0.0 - Oqtane.Application.AppHost - - - - - - diff --git a/Oqtane.Application/AppHost/Properties/launchSettings.json b/Oqtane.Application/AppHost/Properties/launchSettings.json deleted file mode 100644 index 11cab4d9..00000000 --- a/Oqtane.Application/AppHost/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:44358/", - "sslPort": 0 - } - }, - "profiles": { - "Oqtane.Application": { - "commandName": "Project", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:44358/" - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/Oqtane.Application/AppHost/wwwroot/_content/Placeholder.txt b/Oqtane.Application/AppHost/wwwroot/_content/Placeholder.txt deleted file mode 100644 index 5a324d79..00000000 --- a/Oqtane.Application/AppHost/wwwroot/_content/Placeholder.txt +++ /dev/null @@ -1,11 +0,0 @@ -The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder. - -ie. - -/_content - /Radzen.Blazor - /css - /fonts - /syncfusion.blazor - /scripts - /styles diff --git a/Oqtane.Application/AppHost/wwwroot/resources.txt b/Oqtane.Application/AppHost/wwwroot/resources.txt deleted file mode 100644 index 2542de03..00000000 --- a/Oqtane.Application/AppHost/wwwroot/resources.txt +++ /dev/null @@ -1 +0,0 @@ -This is the location where static resources such as images or style sheets should be located \ No newline at end of file diff --git a/Oqtane.Application/Client/Modules/MyModule/Edit.razor b/Oqtane.Application/Client/Modules/MyModule/Edit.razor index f84c4daf..3e9caa2a 100644 --- a/Oqtane.Application/Client/Modules/MyModule/Edit.razor +++ b/Oqtane.Application/Client/Modules/MyModule/Edit.razor @@ -35,7 +35,7 @@ public override List Resources => new List() { - new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } + new Stylesheet(ModulePath() + "Module.css") }; private ElementReference form; diff --git a/Oqtane.Application/Client/Modules/MyModule/Index.razor b/Oqtane.Application/Client/Modules/MyModule/Index.razor index 637ba533..1987a19a 100644 --- a/Oqtane.Application/Client/Modules/MyModule/Index.razor +++ b/Oqtane.Application/Client/Modules/MyModule/Index.razor @@ -42,8 +42,8 @@ else public override List Resources => new List() { - new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }, - new Resource { ResourceType = ResourceType.Script, Url = ModulePath() + "Module.js" } + new Stylesheet(ModulePath() + "Module.css"), + new Script(ModulePath() + "Module.js") }; List _MyModules; diff --git a/Oqtane.Application/Client/Oqtane.Application.Client.csproj b/Oqtane.Application/Client/Oqtane.Application.Client.csproj index 6d83fd5c..638acb68 100644 --- a/Oqtane.Application/Client/Oqtane.Application.Client.csproj +++ b/Oqtane.Application/Client/Oqtane.Application.Client.csproj @@ -1,23 +1,21 @@ - + - - net9.0 - 1.0.0 - Oqtane.Application.Client.Oqtane - + + net9.0 + 1.0.0 + Oqtane.Application.Client.Oqtane + true + Default + false + true + - - - + + + - - - - - - - false - false - + + + diff --git a/Oqtane.Application/Client/Program.cs b/Oqtane.Application/Client/Program.cs new file mode 100644 index 00000000..3d0820e2 --- /dev/null +++ b/Oqtane.Application/Client/Program.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Oqtane.Application.Client +{ + internal class Program + { + static async Task Main(string[] args) + { + await Oqtane.Client.Program.Main(args); + } + } +} diff --git a/Oqtane.Application/Client/Themes/MyTheme/ThemeInfo.cs b/Oqtane.Application/Client/Themes/MyTheme/ThemeInfo.cs index 55047946..f46efe9a 100644 --- a/Oqtane.Application/Client/Themes/MyTheme/ThemeInfo.cs +++ b/Oqtane.Application/Client/Themes/MyTheme/ThemeInfo.cs @@ -16,8 +16,8 @@ namespace Oqtane.Application.MyTheme ContainerSettingsType = "Oqtane.Application.MyTheme.ContainerSettings, Oqtane.Application.Client.Oqtane", Resources = new List() { - new Script(Constants.BootstrapStylesheetUrl, Constants.BootstrapStylesheetIntegrity, "anonymous"), - new Resource { ResourceType = ResourceType.Stylesheet, Url = "~/Theme.css" }, + new Stylesheet(Constants.BootstrapStylesheetUrl, Constants.BootstrapStylesheetIntegrity, "anonymous"), + new Stylesheet("~/Theme.css"), new Script(Constants.BootstrapScriptUrl, Constants.BootstrapScriptIntegrity, "anonymous") } }; diff --git a/Oqtane.Application/Oqtane.Application.sln b/Oqtane.Application/Oqtane.Application.sln index a1054772..ea06ef57 100644 --- a/Oqtane.Application/Oqtane.Application.sln +++ b/Oqtane.Application/Oqtane.Application.sln @@ -2,12 +2,10 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.12.35506.116 d17.12 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Oqtane.Application.AppHost", "AppHost\Oqtane.Application.AppHost.csproj", "{5BDDA15B-05CF-41B2-BF12-D532D1A561D1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Server", "Server\Oqtane.Application.Server.csproj", "{04B05448-788F-433D-92C0-FED35122D45A}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Client", "Client\Oqtane.Application.Client.csproj", "{AA8E58A1-CD09-4208-BF66-A8BB341FD669}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Server", "Server\Oqtane.Application.Server.csproj", "{04B05448-788F-433D-92C0-FED35122D45A}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Oqtane.Application.Shared", "Shared\Oqtane.Application.Shared.csproj", "{18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}" EndProject Global @@ -16,18 +14,14 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5BDDA15B-05CF-41B2-BF12-D532D1A561D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5BDDA15B-05CF-41B2-BF12-D532D1A561D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5BDDA15B-05CF-41B2-BF12-D532D1A561D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5BDDA15B-05CF-41B2-BF12-D532D1A561D1}.Release|Any CPU.Build.0 = Release|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.Build.0 = Release|Any CPU {04B05448-788F-433D-92C0-FED35122D45A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04B05448-788F-433D-92C0-FED35122D45A}.Debug|Any CPU.Build.0 = Debug|Any CPU {04B05448-788F-433D-92C0-FED35122D45A}.Release|Any CPU.ActiveCfg = Release|Any CPU {04B05448-788F-433D-92C0-FED35122D45A}.Release|Any CPU.Build.0 = Release|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA8E58A1-CD09-4208-BF66-A8BB341FD669}.Release|Any CPU.Build.0 = Release|Any CPU {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Debug|Any CPU.Build.0 = Debug|Any CPU {18D73F73-D7BE-4388-85BA-FBD9AC96FCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -36,7 +30,4 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1D016F15-46FE-4726-8DFD-2E4FD4DC7668} - EndGlobalSection EndGlobal diff --git a/Oqtane.Application/Server/Oqtane.Application.Server.csproj b/Oqtane.Application/Server/Oqtane.Application.Server.csproj index 7e9ad243..5259f3b5 100644 --- a/Oqtane.Application/Server/Oqtane.Application.Server.csproj +++ b/Oqtane.Application/Server/Oqtane.Application.Server.csproj @@ -1,25 +1,18 @@ - + - - net9.0 - true - 1.0.0 - Oqtane.Application.Server.Oqtane - + + net9.0 + 1.0.0 + Oqtane.Application.Server.Oqtane + - - - - + + + + - - - - - - - - - - + + + + diff --git a/Oqtane.Application/AppHost/Program.cs b/Oqtane.Application/Server/Program.cs similarity index 84% rename from Oqtane.Application/AppHost/Program.cs rename to Oqtane.Application/Server/Program.cs index e2a7714c..9cbd89e5 100644 --- a/Oqtane.Application/AppHost/Program.cs +++ b/Oqtane.Application/Server/Program.cs @@ -1,12 +1,11 @@ using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore; -using Microsoft.Extensions.DependencyInjection; -using Oqtane.Infrastructure; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Oqtane.Infrastructure; +using Microsoft.Extensions.DependencyInjection; -namespace Oqtane.Application.AppHost +namespace Oqtane.Application.Server { public class Program { @@ -20,7 +19,7 @@ namespace Oqtane.Application.AppHost var filelogger = host.Services.GetRequiredService>(); if (filelogger != null) { - filelogger.LogError($"[Oqtane.Application.AppHost.Program.Main] {install.Message}"); + filelogger.LogError($"[Oqtane.Application.Server.Program.Main] {install.Message}"); } } else @@ -35,9 +34,8 @@ namespace Oqtane.Application.AppHost .AddCommandLine(args) .AddEnvironmentVariables() .Build()) - .UseStartup() + .UseStartup() .ConfigureLocalizationSettings() .Build(); } } - diff --git a/Oqtane.Application/Server/Properties/launchSettings.json b/Oqtane.Application/Server/Properties/launchSettings.json new file mode 100644 index 00000000..80a48970 --- /dev/null +++ b/Oqtane.Application/Server/Properties/launchSettings.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5084", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "https://localhost:7035;http://localhost:5084", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/Oqtane.Application/Server/Startup.cs b/Oqtane.Application/Server/Startup.cs new file mode 100644 index 00000000..da1bc828 --- /dev/null +++ b/Oqtane.Application/Server/Startup.cs @@ -0,0 +1,43 @@ +using System; +using System.IO; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Oqtane.Extensions; +using Oqtane.Infrastructure; +using Oqtane.Shared; +using Microsoft.AspNetCore.Cors.Infrastructure; + +namespace Oqtane.Application.Server +{ + public class Startup + { + private readonly IConfigurationRoot _configuration; + private readonly IWebHostEnvironment _environment; + + public Startup(IWebHostEnvironment environment) + { + AppDomain.CurrentDomain.SetData(Constants.DataDirectory, Path.Combine(environment.ContentRootPath, "Data")); + + var builder = new ConfigurationBuilder() + .SetBasePath(environment.ContentRootPath) + .AddJsonFile("appsettings.json", false, true) + .AddJsonFile($"appsettings.{environment.EnvironmentName}.json", true, true) + .AddEnvironmentVariables(); + + _configuration = builder.Build(); + _environment = environment; + } + + public void ConfigureServices(IServiceCollection services) + { + services.AddOqtane(_configuration, _environment); + } + + public void Configure(IApplicationBuilder app, IConfigurationRoot configuration, IWebHostEnvironment environment, ICorsService corsService, ICorsPolicyProvider corsPolicyProvider, ISyncManager sync) + { + app.UseOqtane(configuration, environment, corsService, corsPolicyProvider, sync); + } + } +} diff --git a/Oqtane.Application/AppHost/appsettings.json b/Oqtane.Application/Server/appsettings.json similarity index 92% rename from Oqtane.Application/AppHost/appsettings.json rename to Oqtane.Application/Server/appsettings.json index cbf901bd..4da5bbc7 100644 --- a/Oqtane.Application/AppHost/appsettings.json +++ b/Oqtane.Application/Server/appsettings.json @@ -2,7 +2,7 @@ "RenderMode": "Interactive", "Runtime": "Server", "Database": { - "DefaultDBType": "Oqtane.Database.SqlServer.SqlServerDatabase, Oqtane.Server" + "DefaultDBType": "" }, "ConnectionStrings": { "DefaultConnection": "" @@ -57,8 +57,7 @@ } }, "LogLevel": { - "Default": "Information", - "Notify": "Error" + "Default": "Information" } } } \ No newline at end of file diff --git a/Oqtane.Application/AppHost/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css b/Oqtane.Application/Server/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css rename to Oqtane.Application/Server/wwwroot/Modules/Oqtane.Modules.Admin.Login/Module.css diff --git a/Oqtane.Application/AppHost/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css b/Oqtane.Application/Server/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css rename to Oqtane.Application/Server/wwwroot/Modules/Oqtane.Modules.HtmlText/Module.css diff --git a/Oqtane.Application/AppHost/wwwroot/Oqtane.Server.lib.module.js b/Oqtane.Application/Server/wwwroot/Oqtane.Server.lib.module.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/Oqtane.Server.lib.module.js rename to Oqtane.Application/Server/wwwroot/Oqtane.Server.lib.module.js diff --git a/Oqtane.Application/AppHost/wwwroot/Themes/Oqtane.Themes.BlazorTheme/Theme.css b/Oqtane.Application/Server/wwwroot/Themes/Oqtane.Themes.BlazorTheme/Theme.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/Themes/Oqtane.Themes.BlazorTheme/Theme.css rename to Oqtane.Application/Server/wwwroot/Themes/Oqtane.Themes.BlazorTheme/Theme.css diff --git a/Oqtane.Application/AppHost/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css b/Oqtane.Application/Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css rename to Oqtane.Application/Server/wwwroot/Themes/Oqtane.Themes.OqtaneTheme/Theme.css diff --git a/Oqtane.Application/Server/wwwroot/_content/Placeholder.txt b/Oqtane.Application/Server/wwwroot/_content/Placeholder.txt deleted file mode 100644 index 5a324d79..00000000 --- a/Oqtane.Application/Server/wwwroot/_content/Placeholder.txt +++ /dev/null @@ -1,11 +0,0 @@ -The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder. - -ie. - -/_content - /Radzen.Blazor - /css - /fonts - /syncfusion.blazor - /scripts - /styles diff --git a/Oqtane.Application/AppHost/wwwroot/app_offline.bak b/Oqtane.Application/Server/wwwroot/app_offline.bak similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/app_offline.bak rename to Oqtane.Application/Server/wwwroot/app_offline.bak diff --git a/Oqtane.Application/AppHost/wwwroot/css/app.css b/Oqtane.Application/Server/wwwroot/css/app.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/app.css rename to Oqtane.Application/Server/wwwroot/css/app.css diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/FONT-LICENSE b/Oqtane.Application/Server/wwwroot/css/open-iconic/FONT-LICENSE similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/FONT-LICENSE rename to Oqtane.Application/Server/wwwroot/css/open-iconic/FONT-LICENSE diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/ICON-LICENSE b/Oqtane.Application/Server/wwwroot/css/open-iconic/ICON-LICENSE similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/ICON-LICENSE rename to Oqtane.Application/Server/wwwroot/css/open-iconic/ICON-LICENSE diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/README.md b/Oqtane.Application/Server/wwwroot/css/open-iconic/README.md similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/README.md rename to Oqtane.Application/Server/wwwroot/css/open-iconic/README.md diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.eot similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.eot rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.eot diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.otf b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.otf similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.otf rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.otf diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.svg b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.svg similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.svg rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.svg diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf diff --git a/Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.woff similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/open-iconic/font/fonts/open-iconic.woff rename to Oqtane.Application/Server/wwwroot/css/open-iconic/font/fonts/open-iconic.woff diff --git a/Oqtane.Application/AppHost/wwwroot/css/quill/quill.bubble.css b/Oqtane.Application/Server/wwwroot/css/quill/quill.bubble.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/quill/quill.bubble.css rename to Oqtane.Application/Server/wwwroot/css/quill/quill.bubble.css diff --git a/Oqtane.Application/AppHost/wwwroot/css/quill/quill.snow.css b/Oqtane.Application/Server/wwwroot/css/quill/quill.snow.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/quill/quill.snow.css rename to Oqtane.Application/Server/wwwroot/css/quill/quill.snow.css diff --git a/Oqtane.Application/AppHost/wwwroot/css/quill/quill1.3.7.bubble.css b/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/quill/quill1.3.7.bubble.css rename to Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css diff --git a/Oqtane.Application/AppHost/wwwroot/css/quill/quill1.3.7.snow.css b/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/css/quill/quill1.3.7.snow.css rename to Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css diff --git a/Oqtane.Application/AppHost/wwwroot/favicon.ico b/Oqtane.Application/Server/wwwroot/favicon.ico similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/favicon.ico rename to Oqtane.Application/Server/wwwroot/favicon.ico diff --git a/Oqtane.Application/AppHost/wwwroot/icon.png b/Oqtane.Application/Server/wwwroot/icon.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/icon.png rename to Oqtane.Application/Server/wwwroot/icon.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/checked.png b/Oqtane.Application/Server/wwwroot/images/checked.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/checked.png rename to Oqtane.Application/Server/wwwroot/images/checked.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/disabled.png b/Oqtane.Application/Server/wwwroot/images/disabled.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/disabled.png rename to Oqtane.Application/Server/wwwroot/images/disabled.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/error.png b/Oqtane.Application/Server/wwwroot/images/error.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/error.png rename to Oqtane.Application/Server/wwwroot/images/error.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/help.png b/Oqtane.Application/Server/wwwroot/images/help.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/help.png rename to Oqtane.Application/Server/wwwroot/images/help.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/logo-black.png b/Oqtane.Application/Server/wwwroot/images/logo-black.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/logo-black.png rename to Oqtane.Application/Server/wwwroot/images/logo-black.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/logo-white.png b/Oqtane.Application/Server/wwwroot/images/logo-white.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/logo-white.png rename to Oqtane.Application/Server/wwwroot/images/logo-white.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/null.png b/Oqtane.Application/Server/wwwroot/images/null.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/null.png rename to Oqtane.Application/Server/wwwroot/images/null.png diff --git a/Oqtane.Application/AppHost/wwwroot/images/unchecked.png b/Oqtane.Application/Server/wwwroot/images/unchecked.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/images/unchecked.png rename to Oqtane.Application/Server/wwwroot/images/unchecked.png diff --git a/Oqtane.Application/AppHost/wwwroot/js/app.js b/Oqtane.Application/Server/wwwroot/js/app.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/app.js rename to Oqtane.Application/Server/wwwroot/js/app.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/interop.js b/Oqtane.Application/Server/wwwroot/js/interop.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/interop.js rename to Oqtane.Application/Server/wwwroot/js/interop.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/loadjs.min.js b/Oqtane.Application/Server/wwwroot/js/loadjs.min.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/loadjs.min.js rename to Oqtane.Application/Server/wwwroot/js/loadjs.min.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/quill-blot-formatter.min.js b/Oqtane.Application/Server/wwwroot/js/quill-blot-formatter.min.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/quill-blot-formatter.min.js rename to Oqtane.Application/Server/wwwroot/js/quill-blot-formatter.min.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/quill-interop.js b/Oqtane.Application/Server/wwwroot/js/quill-interop.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/quill-interop.js rename to Oqtane.Application/Server/wwwroot/js/quill-interop.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/quill.min.js b/Oqtane.Application/Server/wwwroot/js/quill.min.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/quill.min.js rename to Oqtane.Application/Server/wwwroot/js/quill.min.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/quill.min.js.map b/Oqtane.Application/Server/wwwroot/js/quill.min.js.map similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/quill.min.js.map rename to Oqtane.Application/Server/wwwroot/js/quill.min.js.map diff --git a/Oqtane.Application/AppHost/wwwroot/js/quill1.3.7.min.js b/Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/quill1.3.7.min.js rename to Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js diff --git a/Oqtane.Application/AppHost/wwwroot/js/reload.js b/Oqtane.Application/Server/wwwroot/js/reload.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/js/reload.js rename to Oqtane.Application/Server/wwwroot/js/reload.js diff --git a/Oqtane.Application/AppHost/wwwroot/loading.gif b/Oqtane.Application/Server/wwwroot/loading.gif similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/loading.gif rename to Oqtane.Application/Server/wwwroot/loading.gif diff --git a/Oqtane.Application/AppHost/wwwroot/oqtane-black.png b/Oqtane.Application/Server/wwwroot/oqtane-black.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/oqtane-black.png rename to Oqtane.Application/Server/wwwroot/oqtane-black.png diff --git a/Oqtane.Application/AppHost/wwwroot/oqtane-glow.png b/Oqtane.Application/Server/wwwroot/oqtane-glow.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/oqtane-glow.png rename to Oqtane.Application/Server/wwwroot/oqtane-glow.png diff --git a/Oqtane.Application/AppHost/wwwroot/oqtane-white.png b/Oqtane.Application/Server/wwwroot/oqtane-white.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/oqtane-white.png rename to Oqtane.Application/Server/wwwroot/oqtane-white.png diff --git a/Oqtane.Application/AppHost/wwwroot/oqtane.ico b/Oqtane.Application/Server/wwwroot/oqtane.ico similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/oqtane.ico rename to Oqtane.Application/Server/wwwroot/oqtane.ico diff --git a/Oqtane.Application/AppHost/wwwroot/oqtane.png b/Oqtane.Application/Server/wwwroot/oqtane.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/oqtane.png rename to Oqtane.Application/Server/wwwroot/oqtane.png diff --git a/Oqtane.Application/AppHost/wwwroot/package.png b/Oqtane.Application/Server/wwwroot/package.png similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/package.png rename to Oqtane.Application/Server/wwwroot/package.png diff --git a/Oqtane.Application/AppHost/wwwroot/service-worker.js b/Oqtane.Application/Server/wwwroot/service-worker.js similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/service-worker.js rename to Oqtane.Application/Server/wwwroot/service-worker.js diff --git a/Oqtane.Application/AppHost/wwwroot/users.txt b/Oqtane.Application/Server/wwwroot/users.txt similarity index 100% rename from Oqtane.Application/AppHost/wwwroot/users.txt rename to Oqtane.Application/Server/wwwroot/users.txt diff --git a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj index 865461b1..90fcda5d 100644 --- a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj +++ b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj @@ -1,13 +1,13 @@ - - net9.0 - 1.0.0 - Oqtane.Application.Shared.Oqtane - + + net9.0 + 1.0.0 + Oqtane.Application.Shared.Oqtane + - - - + + + From 9e85b35498592a0d1ebb9a931b4ed158dd968011 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 26 Aug 2025 17:22:10 -0400 Subject: [PATCH 23/68] fix naming --- Oqtane.Application/Oqtane.Application.Template.nuspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Application/Oqtane.Application.Template.nuspec b/Oqtane.Application/Oqtane.Application.Template.nuspec index 964286a2..31d80f81 100644 --- a/Oqtane.Application/Oqtane.Application.Template.nuspec +++ b/Oqtane.Application/Oqtane.Application.Template.nuspec @@ -3,7 +3,7 @@ Oqtane.Application.Template 6.1.6 - Oqtane Application Solution For Blazor + Oqtane Application Template For Blazor Shaun Walker false MIT From 581f14e66163750227ac5d54b322599520714aaf Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 09:21:19 -0400 Subject: [PATCH 24/68] default index component to interactive --- Oqtane.Application/Client/Modules/MyModule/Index.razor | 2 -- 1 file changed, 2 deletions(-) diff --git a/Oqtane.Application/Client/Modules/MyModule/Index.razor b/Oqtane.Application/Client/Modules/MyModule/Index.razor index 1987a19a..fc3744d5 100644 --- a/Oqtane.Application/Client/Modules/MyModule/Index.razor +++ b/Oqtane.Application/Client/Modules/MyModule/Index.razor @@ -38,8 +38,6 @@ else } @code { - public override string RenderMode => RenderModes.Static; - public override List Resources => new List() { new Stylesheet(ModulePath() + "Module.css"), From 7cf9d9ad6573d867c16284d2dc07307d0cbf019a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 12:20:59 -0400 Subject: [PATCH 25/68] optimize client startup in templates --- Oqtane.Application/Client/Startup/ClientStartup.cs | 5 ++++- .../Templates/External/Client/Startup/ClientStartup.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Oqtane.Application/Client/Startup/ClientStartup.cs b/Oqtane.Application/Client/Startup/ClientStartup.cs index 1cdbd905..cf29f81d 100644 --- a/Oqtane.Application/Client/Startup/ClientStartup.cs +++ b/Oqtane.Application/Client/Startup/ClientStartup.cs @@ -8,7 +8,10 @@ namespace Oqtane.Application.Startup { public void ConfigureServices(IServiceCollection services) { - services.AddScoped(); + if (!services.Any(s => s.ServiceType == typeof(IMyModuleService))) + { + services.AddScoped(); + } } } } diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs index 611b5a8e..5050abee 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs @@ -8,7 +8,10 @@ namespace [Owner].Module.[Module].Startup { public void ConfigureServices(IServiceCollection services) { - services.AddScoped(); + if (!services.Any(s => s.ServiceType == typeof(I[Module]Service))) + { + services.AddScoped(); + } } } } From 9a6195edf1ef4278f7f852814af95b5e1fb13c62 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 12:28:51 -0400 Subject: [PATCH 26/68] fix resources in default theme template --- .../wwwroot/Themes/Templates/External/Client/ThemeInfo.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs index 4dea5a8f..6ceaa574 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs @@ -16,11 +16,10 @@ namespace [Owner].Theme.[Theme] ContainerSettingsType = "[Owner].Theme.[Theme].ContainerSettings, [Owner].Theme.[Theme].Client.Oqtane", Resources = new List() { - // obtained from https://cdnjs.com/libraries - new StyleSheet(Constants.BootstrapStylesheetUrl, Constants.BootstrapStylesheetIntegrity, "anonymous"), - new Resource { ResourceType = ResourceType.Stylesheet, Url = "~/Theme.css" }, + // obtained from https://cdnjs.com/libraries + new Stylesheet(Constants.BootstrapStylesheetUrl, Constants.BootstrapStylesheetIntegrity, "anonymous"), + new Stylesheet("~/Theme.css"), new Script(Constants.BootstrapScriptUrl, Constants.BootstrapScriptIntegrity, "anonymous") - } }; From edad9e6b3c07bfea45577b4b07325b1cc22728f0 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 13:54:30 -0400 Subject: [PATCH 27/68] fix #5531 - external login single sign-on for multiple sites --- ...taneSiteAuthenticationBuilderExtensions.cs | 67 ++++++++++++------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index f142c602..9bbe4e41 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -476,8 +476,26 @@ namespace Oqtane.Extensions else { var logins = await _identityUserManager.GetLoginsAsync(identityuser); - var login = logins.FirstOrDefault(item => item.LoginProvider == (providerType + ":" + alias.SiteId.ToString())); - if (login == null) + // check if any logins exist for this user and provider type for any site + var login = logins.FirstOrDefault(item => item.LoginProvider.StartsWith(providerType)); + if (login != null || !bool.Parse(httpContext.GetSiteSettings().GetValue("ExternalLogin:VerifyUsers", "true"))) + { + // external login using existing user account - link automatically + user = _users.GetUser(identityuser.UserName); + user.SiteId = alias.SiteId; + + var _notifications = httpContext.RequestServices.GetRequiredService(); + string url = httpContext.Request.Scheme + "://" + alias.Name; + string body = "You Recently Used An External Account To Sign In To Our Site.\n\n" + url + "\n\nThank You!"; + var notification = new Notification(user.SiteId, user, "User Account Notification", body); + _notifications.AddNotification(notification); + + // add user login + await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType + ":" + user.SiteId.ToString(), id, providerName)); + + _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "External Login Linkage Created For User {Username} And Provider {Provider}", user.Username, providerName); + } + else { if (bool.Parse(httpContext.GetSiteSettings().GetValue("ExternalLogin:VerifyUsers", "true"))) { @@ -496,28 +514,11 @@ namespace Oqtane.Extensions } else { - // external login using existing user account - link automatically - user = _users.GetUser(identityuser.UserName); - user.SiteId = alias.SiteId; - - var _notifications = httpContext.RequestServices.GetRequiredService(); - string url = httpContext.Request.Scheme + "://" + alias.Name; - string body = "You Recently Used An External Account To Sign In To Our Site.\n\n" + url + "\n\nThank You!"; - var notification = new Notification(user.SiteId, user, "User Account Notification", body); - _notifications.AddNotification(notification); - - // add user login - await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType + ":" + user.SiteId.ToString(), id, providerName)); - - _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "External Login Linkage Created For User {Username} And Provider {Provider}", user.Username, providerName); + // provider keys do not match + identity.Label = ExternalLoginStatus.ProviderKeyMismatch; + _logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Provider Key Does Not Match For User {Username}. Login Denied.", identityuser.UserName); } } - else - { - // provider keys do not match - identity.Label = ExternalLoginStatus.ProviderKeyMismatch; - _logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Provider Key Does Not Match For User {Username}. Login Denied.", identityuser.UserName); - } } } @@ -525,14 +526,34 @@ namespace Oqtane.Extensions if (user != null) { // manage roles + var _roles = httpContext.RequestServices.GetRequiredService(); var _userRoles = httpContext.RequestServices.GetRequiredService(); var userRoles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList(); + + // if user is signing in to a new site + if (userRoles.Count == 0) + { + // add auto assigned roles to user for site + var roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); + foreach (var role in roles) + { + var userrole = new UserRole(); + userrole.UserId = user.UserId; + userrole.RoleId = role.RoleId; + userrole.EffectiveDate = null; + userrole.ExpiryDate = null; + userrole.IgnoreSecurityStamp = true; + _userRoles.AddUserRole(userrole); + } + userRoles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList(); + } + + // process any role claims if (!string.IsNullOrEmpty(httpContext.GetSiteSettings().GetValue("ExternalLogin:RoleClaimType", ""))) { // external roles if (claimsPrincipal.Claims.Any(item => item.Type == httpContext.GetSiteSettings().GetValue("ExternalLogin:RoleClaimType", ""))) { - var _roles = httpContext.RequestServices.GetRequiredService(); var allowhostrole = bool.Parse(httpContext.GetSiteSettings().GetValue("ExternalLogin:AllowHostRole", "false")); var roles = _roles.GetRoles(user.SiteId, allowhostrole).ToList(); From 3b16ae8cc061b864f2ff7a1a740ae973db6e8232 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 14:07:51 -0400 Subject: [PATCH 28/68] improve help text --- Oqtane.Client/Modules/Admin/Users/Index.razor | 27 +++++++++---------- .../Resources/Modules/Admin/Users/Index.resx | 2 +- ...taneSiteAuthenticationBuilderExtensions.cs | 2 +- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index fa3dccf3..b3a7d623 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -314,6 +314,15 @@ else
+
+ +
+ +
+
}
@@ -413,18 +422,6 @@ else
- @if (_providertype == AuthenticationProviderTypes.OpenIDConnect) - { -
- -
- -
-
- }
@@ -555,6 +552,7 @@ else private string _clientsecrettype = "password"; private string _toggleclientsecret = string.Empty; private string _authresponsetype; + private string _requirenonce; private string _scopes; private string _parameters; private string _pkce; @@ -569,7 +567,6 @@ else private string _synchronizeroles; private string _profileclaimtypes; private string _savetokens; - private string _requirenonce; private string _domainfilter; private string _createusers; private string _verifyusers; @@ -642,6 +639,7 @@ else _clientsecret = SettingService.GetSetting(settings, "ExternalLogin:ClientSecret", ""); _toggleclientsecret = SharedLocalizer["ShowPassword"]; _authresponsetype = SettingService.GetSetting(settings, "ExternalLogin:AuthResponseType", "code"); + _requirenonce = SettingService.GetSetting(settings, "ExternalLogin:RequireNonce", "true"); _scopes = SettingService.GetSetting(settings, "ExternalLogin:Scopes", ""); _parameters = SettingService.GetSetting(settings, "ExternalLogin:Parameters", ""); _pkce = SettingService.GetSetting(settings, "ExternalLogin:PKCE", "false"); @@ -656,7 +654,6 @@ else _synchronizeroles = SettingService.GetSetting(settings, "ExternalLogin:SynchronizeRoles", "false"); _profileclaimtypes = SettingService.GetSetting(settings, "ExternalLogin:ProfileClaimTypes", ""); _savetokens = SettingService.GetSetting(settings, "ExternalLogin:SaveTokens", "false"); - _requirenonce = SettingService.GetSetting(settings, "ExternalLogin:RequireNonce", "true"); _domainfilter = SettingService.GetSetting(settings, "ExternalLogin:DomainFilter", ""); _createusers = SettingService.GetSetting(settings, "ExternalLogin:CreateUsers", "true"); _verifyusers = SettingService.GetSetting(settings, "ExternalLogin:VerifyUsers", "true"); @@ -764,6 +761,7 @@ else settings = SettingService.SetSetting(settings, "ExternalLogin:ClientId", _clientid, true); settings = SettingService.SetSetting(settings, "ExternalLogin:ClientSecret", _clientsecret, true); settings = SettingService.SetSetting(settings, "ExternalLogin:AuthResponseType", _authresponsetype, true); + settings = SettingService.SetSetting(settings, "ExternalLogin:RequireNonce", _requirenonce, true); settings = SettingService.SetSetting(settings, "ExternalLogin:Scopes", _scopes, true); settings = SettingService.SetSetting(settings, "ExternalLogin:Parameters", _parameters, true); settings = SettingService.SetSetting(settings, "ExternalLogin:PKCE", _pkce, true); @@ -776,7 +774,6 @@ else settings = SettingService.SetSetting(settings, "ExternalLogin:SynchronizeRoles", _synchronizeroles, true); settings = SettingService.SetSetting(settings, "ExternalLogin:ProfileClaimTypes", _profileclaimtypes, true); settings = SettingService.SetSetting(settings, "ExternalLogin:SaveTokens", _savetokens, true); - settings = SettingService.SetSetting(settings, "ExternalLogin:RequireNonce", _requirenonce, true); settings = SettingService.SetSetting(settings, "ExternalLogin:DomainFilter", _domainfilter, true); settings = SettingService.SetSetting(settings, "ExternalLogin:CreateUsers", _createusers, true); settings = SettingService.SetSetting(settings, "ExternalLogin:VerifyUsers", _verifyusers, true); diff --git a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx index e6d07a27..8b2be8e7 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx @@ -517,7 +517,7 @@ Require Nonce? - Specify the RequireNonce property for OpenID Connect Authentication. + Specify if Nonce validation is required for the ID token (the default is true) Save Tokens? diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index 143874ba..1a1a3687 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -61,9 +61,9 @@ namespace Oqtane.Extensions options.ClientId = sitesettings.GetValue("ExternalLogin:ClientId", ""); options.ClientSecret = sitesettings.GetValue("ExternalLogin:ClientSecret", ""); options.ResponseType = sitesettings.GetValue("ExternalLogin:AuthResponseType", "code"); // default is authorization code flow + options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "true")); options.UsePkce = bool.Parse(sitesettings.GetValue("ExternalLogin:PKCE", "false")); options.SaveTokens = bool.Parse(sitesettings.GetValue("ExternalLogin:SaveTokens", "false")); - options.ProtocolValidator.RequireNonce = bool.Parse(sitesettings.GetValue("ExternalLogin:RequireNonce", "true")); if (!string.IsNullOrEmpty(sitesettings.GetValue("ExternalLogin:RoleClaimType", ""))) { options.TokenValidationParameters.RoleClaimType = sitesettings.GetValue("ExternalLogin:RoleClaimType", ""); From 68a7571741370f4d750cae8a892628b2ad13bc83 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 27 Aug 2025 14:26:47 -0400 Subject: [PATCH 29/68] Change RenderMode from Interactive to Static --- Oqtane.Server/appsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/appsettings.json b/Oqtane.Server/appsettings.json index 46ae54ac..9f96daeb 100644 --- a/Oqtane.Server/appsettings.json +++ b/Oqtane.Server/appsettings.json @@ -1,5 +1,5 @@ { - "RenderMode": "Interactive", + "RenderMode": "Static", "Runtime": "Server", "Database": { "DefaultDBType": "" From 23f29ca55d086e5284709f43ae991ae4bafc5322 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 27 Aug 2025 14:27:01 -0400 Subject: [PATCH 30/68] Change RenderMode from Interactive to Static --- Oqtane.Server/appsettings.release.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Oqtane.Server/appsettings.release.json b/Oqtane.Server/appsettings.release.json index 9269136e..307008c8 100644 --- a/Oqtane.Server/appsettings.release.json +++ b/Oqtane.Server/appsettings.release.json @@ -1,5 +1,5 @@ { - "RenderMode": "Interactive", + "RenderMode": "Static", "Runtime": "Server", "Database": { "DefaultDBType": "" From 006423e32e3e9e360d66cfdacc571a596f837bb9 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 27 Aug 2025 14:27:28 -0400 Subject: [PATCH 31/68] Change RenderMode from Interactive to Static --- Oqtane.Application/Server/appsettings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Application/Server/appsettings.json b/Oqtane.Application/Server/appsettings.json index 4da5bbc7..9f96daeb 100644 --- a/Oqtane.Application/Server/appsettings.json +++ b/Oqtane.Application/Server/appsettings.json @@ -1,5 +1,5 @@ { - "RenderMode": "Interactive", + "RenderMode": "Static", "Runtime": "Server", "Database": { "DefaultDBType": "" @@ -60,4 +60,4 @@ "Default": "Information" } } -} \ No newline at end of file +} From 2af02fae95e2253db0d2eb4185dc358a424ae2cf Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 27 Aug 2025 14:28:23 -0400 Subject: [PATCH 32/68] install wizard should use RenderMode and Runtime values from appsettings.json when creating site --- Oqtane.Client/Installer/Installer.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 5d2a487a..56756a5a 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -269,8 +269,8 @@ SiteName = Constants.DefaultSite, Register = _register, SiteTemplate = _template, - RenderMode = RenderModes.Static, - Runtime = Runtimes.Server + RenderMode = "", // provided by appsettings.json + Runtime = "" // provided by appsettings.json }; var installation = await InstallationService.Install(config); From 6f7a18674e38c29480b52b37d9cc2b119c0cf85e Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 14:30:49 -0400 Subject: [PATCH 33/68] add support for packageType in nuspec files for minimum Oqtane version --- Oqtane.Server/Infrastructure/InstallationManager.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index 883997e6..8da91ec6 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -93,12 +93,21 @@ namespace Oqtane.Infrastructure { id = node.InnerText; } - // get framework dependency - node = doc.SelectSingleNode("/package/metadata/dependencies/dependency[@id='Oqtane.Framework']"); + // get minimum framework version using packageType + node = doc.SelectSingleNode("/package/metadata/packageTypes/packageType[@name='Oqtane.Framework']"); if (node != null) { frameworkversion = node.Attributes["version"].Value; } + if (string.IsNullOrEmpty(frameworkversion)) + { + // legacy packages used the dependency metadata + node = doc.SelectSingleNode("/package/metadata/dependencies/dependency[@id='Oqtane.Framework']"); + if (node != null) + { + frameworkversion = node.Attributes["version"].Value; + } + } reader.Close(); break; } From ab534d07f34cb4b53f0b179fdabb64df95263d74 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 15:14:48 -0400 Subject: [PATCH 34/68] update default module/theme templates to use projectType rather than dependency in nuspec file --- .../External/Package/[Owner].Module.[Module].nuspec | 7 ++++--- .../External/Package/[Owner].Theme.[Theme].nuspec | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec index 67af3899..9df56e87 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec @@ -15,9 +15,10 @@ oqtane module - - - + + + + diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec index 40f5f3b3..16777464 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec @@ -15,9 +15,10 @@ oqtane theme - - - + + + + From 0067cc426648fc68eb10fb8a7f6213e365ac9365 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 29 Aug 2025 15:19:07 -0400 Subject: [PATCH 35/68] Added FixProps command line utility --- Oqtane.Package/FixProps.exe | Bin 0 -> 126943 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Oqtane.Package/FixProps.exe diff --git a/Oqtane.Package/FixProps.exe b/Oqtane.Package/FixProps.exe new file mode 100644 index 0000000000000000000000000000000000000000..58d79183ebabc2ea2d6a605c681ba19350d08048 GIT binary patch literal 126943 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 CHidBj literal 0 HcmV?d00001 From d2d88d4b5e30fa5cd099b1798cb70935e61903aa Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 16:20:16 -0400 Subject: [PATCH 36/68] improve default module template to follow RCL/Nuget standards --- .../Client/Modules/[Owner].Module.[Module]/Edit.razor | 2 +- .../Client/Modules/[Owner].Module.[Module]/Index.razor | 4 ++-- .../External/Package/[Owner].Module.[Module].nuspec | 7 ++++++- .../wwwroot/Modules/Templates/External/Package/debug.cmd | 2 +- .../wwwroot/Modules/Templates/External/Package/debug.sh | 2 +- .../wwwroot/Modules/Templates/External/Package/release.cmd | 1 + .../wwwroot/Modules/Templates/External/Package/release.sh | 2 ++ 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor index 23ca8f4f..a3d25ab5 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Edit.razor @@ -35,7 +35,7 @@ public override List Resources => new List() { - new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } + new Stylesheet("_content/[Owner].Module.[Module]/Module.css") }; private ElementReference form; diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor index 4c68ada6..6f43dcb3 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Modules/[Owner].Module.[Module]/Index.razor @@ -42,8 +42,8 @@ else public override List Resources => new List() { - new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }, - new Resource { ResourceType = ResourceType.Script, Url = ModulePath() + "Module.js" } + new Stylesheet("_content/[Owner].Module.[Module]/Module.css"), + new Script("_content/[Owner].Module.[Module]/Module.js") }; List<[Module]> _[Module]s; diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec index 9df56e87..bf919a3d 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/[Owner].Module.[Module].nuspec @@ -27,7 +27,12 @@ - + + + + + + \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd index af7654c7..35093663 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.cmd @@ -8,4 +8,4 @@ XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.dll" ". XCOPY "..\Server\bin\Debug\%TargetFramework%\%ProjectName%.Server.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y XCOPY "..\Shared\bin\Debug\%TargetFramework%\%ProjectName%.Shared.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Server\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I \ No newline at end of file +XCOPY "..\Server\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\_content\%ProjectName%\" /Y /S /I \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.sh b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.sh index bcdee757..74703939 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.sh +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/debug.sh @@ -9,4 +9,4 @@ cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.dll" ".. cp -f "../Server/bin/Debug/$TargetFramework/$ProjectName$.Server.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/" cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/" cp -f "../Shared/bin/Debug/$TargetFramework/$ProjectName$.Shared.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/" -cp -rf "../Server/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/" \ No newline at end of file +cp -rf "../Server/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/_content/%ProjectName%/" diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd index 1785fa66..5b49099f 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.cmd @@ -3,5 +3,6 @@ set TargetFramework=%1 set ProjectName=%2 del "*.nupkg" +"..\..\oqtane.framework\oqtane.package\FixProps.exe" "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName% XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" /Y \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.sh b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.sh index 1334e6a7..98526bc0 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.sh +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Package/release.sh @@ -1,5 +1,7 @@ TargetFramework=$1 ProjectName=$2 +find . -name "*.nupkg" -delete +"..\..\oqtane.framework\oqtane.package\FixProps.exe" "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName% cp -f "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" \ No newline at end of file From e4b6d0ff2982244370df7743c7d6ac227f9d0ba4 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 16:30:49 -0400 Subject: [PATCH 37/68] improve default theme template to follow RCL/Nuget standards --- .../wwwroot/Themes/Templates/External/Client/ThemeInfo.cs | 2 +- .../External/Package/[Owner].Theme.[Theme].nuspec | 7 ++++++- .../wwwroot/Themes/Templates/External/Package/debug.cmd | 2 +- .../wwwroot/Themes/Templates/External/Package/debug.sh | 2 +- .../wwwroot/Themes/Templates/External/Package/release.cmd | 1 + .../wwwroot/Themes/Templates/External/Package/release.sh | 2 ++ 6 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs index 6ceaa574..3d007129 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/ThemeInfo.cs @@ -18,7 +18,7 @@ namespace [Owner].Theme.[Theme] { // obtained from https://cdnjs.com/libraries new Stylesheet(Constants.BootstrapStylesheetUrl, Constants.BootstrapStylesheetIntegrity, "anonymous"), - new Stylesheet("~/Theme.css"), + new Stylesheet("_content/[Owner].Theme.[Theme]/Theme.css"), new Script(Constants.BootstrapScriptUrl, Constants.BootstrapScriptIntegrity, "anonymous") } }; diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec index 16777464..363ebaa9 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/[Owner].Theme.[Theme].nuspec @@ -23,7 +23,12 @@ - + + + + + + \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd index 196fb916..e7073b94 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.cmd @@ -4,4 +4,4 @@ set ProjectName=%2 XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.dll" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y XCOPY "..\Client\bin\Debug\%TargetFramework%\%ProjectName%.Client.Oqtane.pdb" "..\..\[RootFolder]\Oqtane.Server\bin\Debug\%TargetFramework%\" /Y -XCOPY "..\Client\wwwroot\*" "..\..\[RootFolder]\Oqtane.Server\wwwroot\" /Y /S /I \ No newline at end of file +XCOPY "..\Client\wwwroot\*" "..\..\oqtane.framework\Oqtane.Server\wwwroot\_content\%ProjectName%\" /Y /S /I \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.sh b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.sh index 0caca359..47311fc8 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.sh +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/debug.sh @@ -5,4 +5,4 @@ ProjectName=$2 cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.dll" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/" cp -f "../Client/bin/Debug/$TargetFramework/$ProjectName$.Client.Oqtane.pdb" "../../[RootFolder]/Oqtane.Server/bin/Debug/$TargetFramework/" -cp -rf "../Server/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/" \ No newline at end of file +cp -rf "../Client/wwwroot/"* "../../[RootFolder]/Oqtane.Server/wwwroot/_content/%ProjectName%/" \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd index 1785fa66..31809574 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.cmd @@ -3,5 +3,6 @@ set TargetFramework=%1 set ProjectName=%2 del "*.nupkg" +"..\..\[RootFolder]\oqtane.package\FixProps.exe" "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName% XCOPY "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" /Y \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.sh b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.sh index 1334e6a7..98526bc0 100644 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.sh +++ b/Oqtane.Server/wwwroot/Themes/Templates/External/Package/release.sh @@ -1,5 +1,7 @@ TargetFramework=$1 ProjectName=$2 +find . -name "*.nupkg" -delete +"..\..\oqtane.framework\oqtane.package\FixProps.exe" "..\..\[RootFolder]\oqtane.package\nuget.exe" pack %ProjectName%.nuspec -Properties targetframework=%TargetFramework%;projectname=%ProjectName% cp -f "*.nupkg" "..\..\[RootFolder]\Oqtane.Server\Packages\" \ No newline at end of file From 713ec1b373b234a7801aeed2630377ff63195b8a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 16:33:51 -0400 Subject: [PATCH 38/68] move default template static assets --- .../[Owner].Module.[Module] => }/Module.css | 0 .../[Owner].Module.[Module] => }/Module.js | 0 .../Server/wwwroot/_content/Placeholder.txt | 11 -- .../Themes/[Owner].Theme.[Theme]/Theme.css | 123 ------------------ 4 files changed, 134 deletions(-) rename Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/{Modules/[Owner].Module.[Module] => }/Module.css (100%) rename Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/{Modules/[Owner].Module.[Module] => }/Module.js (100%) delete mode 100644 Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/_content/Placeholder.txt delete mode 100644 Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.css b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Module.css similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.css rename to Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Module.css diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Module.js similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Modules/[Owner].Module.[Module]/Module.js rename to Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/Module.js diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/_content/Placeholder.txt b/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/_content/Placeholder.txt deleted file mode 100644 index 5a324d79..00000000 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Server/wwwroot/_content/Placeholder.txt +++ /dev/null @@ -1,11 +0,0 @@ -The _content folder should only contain static resources from shared razor component libraries (RCLs). Static resources can be extracted from shared RCL Nuget packages by executing a Publish task on the module's Server project to a local folder and copying the files from the _content folder which is created. Each shared RCL would have its own appropriately named subfolder within the module's _content folder. - -ie. - -/_content - /Radzen.Blazor - /css - /fonts - /syncfusion.blazor - /scripts - /styles diff --git a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css b/Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css deleted file mode 100644 index 2a6101ef..00000000 --- a/Oqtane.Server/wwwroot/Themes/Templates/External/Client/wwwroot/Themes/[Owner].Theme.[Theme]/Theme.css +++ /dev/null @@ -1,123 +0,0 @@ -/* Oqtane Styles */ - -body { - padding-top: 7rem; -} - -/* App Logo */ -.app-logo .img-fluid { - max-height: 90px; - padding: 0 5px 0 5px; -} - -.table > :not(caption) > * > * { - box-shadow: none; -} - -.table .form-control { - background-color: #ffffff !important; - border-width: 0.5px !important; - border-bottom-color: #ccc !important; -} - -.table .form-select { - background-color: #ffffff !important; - border-width: 0.5px !important; - border-bottom-color: #ccc !important; -} - -.table .btn-primary { - background-color: var(--bs-primary); -} - -.table .btn-secondary { - background-color: var(--bs-secondary); -} - -.alert-dismissible .btn-close { - z-index: 1; -} - -.controls { - z-index: 2000; - padding-top: 15px; - padding-bottom: 15px; - margin-right: 10px; -} - -.app-menu .nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; - white-space: nowrap; -} - -.app-menu .nav-item a { - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - padding-left: 1rem; -} - -.app-menu .nav-item a.active { - background-color: rgba(255,255,255,0.25); - color: white; -} - -.app-menu .nav-item a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -.app-menu .nav-link .oi { - width: 1.5rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; -} - -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); - margin: .5rem; -} - -div.app-moduleactions a.dropdown-toggle, div.app-moduleactions div.dropdown-menu { - color: #000000; -} - -.dropdown-menu span { - mix-blend-mode: difference; -} - -@media (max-width: 767.98px) { - - .app-menu { - width: 100%; - } - - .navbar { - position: fixed; - top: 60px; - width: 100%; - } - - .controls { - height: 60px; - top: 15px; - position: fixed; - top: 0px; - width: 100%; - background-color: rgb(0, 0, 0); - } - - .controls-group { - float: right; - margin-right: 25px; - } - - .content { - position: relative; - top: 60px; - } -} From a9bc356f37c3ef3dcc666b9c60a64811b15da42f Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 29 Aug 2025 17:16:42 -0400 Subject: [PATCH 39/68] remove hardcoded references to LocalDB --- Oqtane.Client/Installer/Installer.razor | 2 +- Oqtane.Client/Modules/Admin/Site/Index.razor | 3 ++- Oqtane.Client/Modules/Admin/Sites/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Sql/Index.razor | 5 +++-- Oqtane.Shared/Shared/Constants.cs | 1 + 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 56756a5a..c5becbb0 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -182,7 +182,7 @@ } else { - _databaseName = "LocalDB"; + _databaseName = Constants.DefaultDBName; } LoadDatabaseConfigComponent(); diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index d76f56a5..b921ab38 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -665,7 +665,8 @@ if (tenant != null) { _tenant = tenant.Name; - _database = _databases.Find(item => item.DBType == tenant.DBType && item.Name != "LocalDB")?.Name; + // hack - there are 3 providers with SqlServerDatabase DBTypes - so we are choosing the last one in alphabetical order + _database = _databases.Where(item => item.DBType == tenant.DBType).OrderBy(item => item.Name).Last()?.Name; _connectionstring = tenant.DBConnectionString; } } diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 459e5143..96949077 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -237,7 +237,7 @@ else } else { - _databaseName = "LocalDB"; + _databaseName = Constants.DefaultDBName; } LoadDatabaseConfigComponent(); } diff --git a/Oqtane.Client/Modules/Admin/Sql/Index.razor b/Oqtane.Client/Modules/Admin/Sql/Index.razor index 476ebd1e..bf2eefec 100644 --- a/Oqtane.Client/Modules/Admin/Sql/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sql/Index.razor @@ -200,7 +200,8 @@ else if (tenant != null) { _tenant = tenant.Name; - _databasetype = _databases.FirstOrDefault(item => item.DBType == tenant.DBType && item.Name != "LocalDB").Name; + // hack - there are 3 providers with SqlServerDatabase DBTypes - so we are choosing the last one in alphabetical order + _databasetype = _databases.Where(item => item.DBType == tenant.DBType).OrderBy(item => item.Name).Last()?.Name; } } else @@ -211,7 +212,7 @@ else } else { - _databasetype = "LocalDB"; + _databasetype = Constants.DefaultDBName; } _showConnectionString = false; LoadDatabaseConfigComponent(); diff --git a/Oqtane.Shared/Shared/Constants.cs b/Oqtane.Shared/Shared/Constants.cs index bf30580b..0348e7c2 100644 --- a/Oqtane.Shared/Shared/Constants.cs +++ b/Oqtane.Shared/Shared/Constants.cs @@ -12,6 +12,7 @@ namespace Oqtane.Shared public const string PackageRegistryUrl = "https://www.oqtane.net"; public const string DataDirectory = "DataDirectory"; + public const string DefaultDBName = "LocalDB"; public const string DefaultDBType = "Oqtane.Database.SqlServer.SqlServerDatabase, Oqtane.Server"; public const string DefaultTheme = "Oqtane.Themes.OqtaneTheme.Default, Oqtane.Client"; From efa466e1d654dd3169961716fe6a6bc5c3015266 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sat, 30 Aug 2025 07:26:37 -0400 Subject: [PATCH 40/68] add comments --- Oqtane.Application/Client/Program.cs | 1 + Oqtane.Application/Server/Program.cs | 1 + Oqtane.Application/Server/Startup.cs | 2 ++ 3 files changed, 4 insertions(+) diff --git a/Oqtane.Application/Client/Program.cs b/Oqtane.Application/Client/Program.cs index 3d0820e2..0dfa0b4a 100644 --- a/Oqtane.Application/Client/Program.cs +++ b/Oqtane.Application/Client/Program.cs @@ -6,6 +6,7 @@ namespace Oqtane.Application.Client { static async Task Main(string[] args) { + // defer client startup to Oqtane - do not modify await Oqtane.Client.Program.Main(args); } } diff --git a/Oqtane.Application/Server/Program.cs b/Oqtane.Application/Server/Program.cs index 9cbd89e5..55a18e50 100644 --- a/Oqtane.Application/Server/Program.cs +++ b/Oqtane.Application/Server/Program.cs @@ -11,6 +11,7 @@ namespace Oqtane.Application.Server { public static void Main(string[] args) { + // defer server startup to Oqtane - do not modify var host = BuildWebHost(args); var databaseManager = host.Services.GetService(); var install = databaseManager.Install(); diff --git a/Oqtane.Application/Server/Startup.cs b/Oqtane.Application/Server/Startup.cs index da1bc828..71f5bd19 100644 --- a/Oqtane.Application/Server/Startup.cs +++ b/Oqtane.Application/Server/Startup.cs @@ -32,11 +32,13 @@ namespace Oqtane.Application.Server public void ConfigureServices(IServiceCollection services) { + // defer server startup to Oqtane - do not modify services.AddOqtane(_configuration, _environment); } public void Configure(IApplicationBuilder app, IConfigurationRoot configuration, IWebHostEnvironment environment, ICorsService corsService, ICorsPolicyProvider corsPolicyProvider, ISyncManager sync) { + // defer server startup to Oqtane - do not modify app.UseOqtane(configuration, environment, corsService, corsPolicyProvider, sync); } } From 1ebf3c4077e259e467d4071da9aae1595014aade Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sat, 30 Aug 2025 07:48:26 -0400 Subject: [PATCH 41/68] added StaticAssetPath properties to base classes --- Oqtane.Client/Modules/ModuleBase.cs | 11 ++++++++++- Oqtane.Client/Themes/ThemeBase.cs | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 94cef77c..782a4b0a 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -140,13 +140,22 @@ namespace Oqtane.Modules } } - // path method + // path methods public string ModulePath() { return PageState?.Alias.BaseUrl + "/Modules/" + GetType().Namespace + "/"; } + public string StaticAssetPath + { + get + { + // requires module to have implemented IModule + return PageState?.Alias.BaseUrl + "_content/" + ModuleState.ModuleDefinition?.PackageName + "/"; + } + } + // fingerprint hash code for static assets public string Fingerprint diff --git a/Oqtane.Client/Themes/ThemeBase.cs b/Oqtane.Client/Themes/ThemeBase.cs index 4359f48e..d66ddb76 100644 --- a/Oqtane.Client/Themes/ThemeBase.cs +++ b/Oqtane.Client/Themes/ThemeBase.cs @@ -108,13 +108,22 @@ namespace Oqtane.Themes } } - // path method + // path methods public string ThemePath() { return PageState?.Alias.BaseUrl + "/Themes/" + GetType().Namespace + "/"; } + public string StaticAssetPath + { + get + { + // requires theme to have implemented ITheme + return PageState?.Alias.BaseUrl + "_content/" + ThemeState?.PackageName + "/"; + } + } + // fingerprint hash code for static assets public string Fingerprint { From 6daf675e5299e27f8c436fa83b9b6c36511ded6f Mon Sep 17 00:00:00 2001 From: sbwalker Date: Sat, 30 Aug 2025 08:01:18 -0400 Subject: [PATCH 42/68] added support for cookie domain option in User Management Settings --- Oqtane.Client/Modules/Admin/Users/Index.razor | 9 +++++++++ Oqtane.Client/Resources/Modules/Admin/Users/Index.resx | 6 ++++++ .../OqtaneSiteAuthenticationBuilderExtensions.cs | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index b3a7d623..0e76dc49 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -114,6 +114,12 @@ else
+
+ +
+ +
+
@@ -525,6 +531,7 @@ else private string _requireconfirmedemail; private string _twofactor; private string _cookiename; + private string _cookiedomain; private string _cookieexpiration; private string _alwaysremember; private string _logouteverywhere; @@ -600,6 +607,7 @@ else { _twofactor = SettingService.GetSetting(settings, "LoginOptions:TwoFactor", "false"); _cookiename = SettingService.GetSetting(settings, "LoginOptions:CookieName", ".AspNetCore.Identity.Application"); + _cookiedomain = SettingService.GetSetting(settings, "LoginOptions:CookieDomain", ""); _cookieexpiration = SettingService.GetSetting(settings, "LoginOptions:CookieExpiration", ""); _alwaysremember = SettingService.GetSetting(settings, "LoginOptions:AlwaysRemember", "false"); _logouteverywhere = SettingService.GetSetting(settings, "LoginOptions:LogoutEverywhere", "false"); @@ -736,6 +744,7 @@ else settings = SettingService.SetSetting(settings, "LoginOptions:RequireConfirmedEmail", _requireconfirmedemail, false); settings = SettingService.SetSetting(settings, "LoginOptions:TwoFactor", _twofactor, false); settings = SettingService.SetSetting(settings, "LoginOptions:CookieName", _cookiename, true); + settings = SettingService.SetSetting(settings, "LoginOptions:CookieDomain", _cookiedomain, true); settings = SettingService.SetSetting(settings, "LoginOptions:CookieExpiration", _cookieexpiration, true); settings = SettingService.SetSetting(settings, "LoginOptions:AlwaysRemember", _alwaysremember, false); settings = SettingService.SetSetting(settings, "LoginOptions:LogoutEverywhere", _logouteverywhere, false); diff --git a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx index 8b2be8e7..e9bc7d13 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Users/Index.resx @@ -549,4 +549,10 @@ Deleted Users + + Cookie Domain: + + + If you would like to share cookies across subdomains you will need to specify a root domain with a leading dot (ie. '.example.com') + \ No newline at end of file diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index 1a1a3687..8c8f1990 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -31,6 +31,10 @@ namespace Oqtane.Extensions builder.AddSiteNamedOptions(Constants.AuthenticationScheme, (options, alias, sitesettings) => { options.Cookie.Name = sitesettings.GetValue("LoginOptions:CookieName", ".AspNetCore.Identity.Application"); + if (!string.IsNullOrEmpty(sitesettings.GetValue("LoginOptions:CookieDomain", ""))) + { + options.Cookie.Domain = sitesettings.GetValue("LoginOptions:CookieDomain", ""); + } string cookieExpStr = sitesettings.GetValue("LoginOptions:CookieExpiration", ""); if (!string.IsNullOrEmpty(cookieExpStr) && TimeSpan.TryParse(cookieExpStr, out TimeSpan cookieExpTS)) { From b5fdf42c37319f3a8d280fed332fb4c757fdfd03 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 Sep 2025 08:32:46 -0400 Subject: [PATCH 43/68] allow modules to be able to specify the databases they support --- .../Infrastructure/DatabaseManager.cs | 18 +++++++++++++++++- .../Repository/ModuleDefinitionRepository.cs | 17 +++++++++++++++++ Oqtane.Shared/Models/ModuleDefinition.cs | 6 +++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index 3d72ae06..4dd4ea52 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -476,7 +476,7 @@ namespace Oqtane.Infrastructure { index = -1; } - if (index != (versions.Length - 1)) + if (index != (versions.Length - 1) && ModuleSupportsDatabase(moduleDefinition.Databases, tenant.DBType)) { for (var i = (index + 1); i < versions.Length; i++) { @@ -789,5 +789,21 @@ namespace Oqtane.Infrastructure _configManager.AddOrUpdateSetting(SettingKeys.AvailableDatabasesSection, databases, true); } } + + private bool ModuleSupportsDatabase(string databases, string dbtype) + { + // check if module supports tenant database + if (!string.IsNullOrEmpty(databases)) + { + foreach (var database in databases.Split(',', StringSplitOptions.RemoveEmptyEntries)) + { + if (dbtype.ToLower().Contains(database.ToLower())) + { + return true; + } + } + } + return string.IsNullOrEmpty(databases); + } } } diff --git a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs index b073f5d5..10226d28 100644 --- a/Oqtane.Server/Repository/ModuleDefinitionRepository.cs +++ b/Oqtane.Server/Repository/ModuleDefinitionRepository.cs @@ -196,6 +196,7 @@ namespace Oqtane.Repository if (siteId != -1) { var siteKey = _tenants.GetAlias().SiteKey; + var dbType = _tenants.GetTenant().DBType; var assemblies = new List(); // get all module definition permissions for site @@ -219,6 +220,22 @@ namespace Oqtane.Repository moduledefinition.IsEnabled = moduledefinition.IsAutoEnabled; } + // check if module supports tenant database + if (moduledefinition.IsEnabled) + { + moduledefinition.IsEnabled = string.IsNullOrEmpty(moduledefinition.Databases); + if (!string.IsNullOrEmpty(moduledefinition.Databases)) + { + foreach (var database in moduledefinition.Databases.Split(',', StringSplitOptions.RemoveEmptyEntries)) + { + if (dbType.ToLower().Contains(database.ToLower())) + { + moduledefinition.IsEnabled = true; + } + } + } + } + if (moduledefinition.IsEnabled) { // build list of assemblies for site diff --git a/Oqtane.Shared/Models/ModuleDefinition.cs b/Oqtane.Shared/Models/ModuleDefinition.cs index ce344d09..a7d7b4dd 100644 --- a/Oqtane.Shared/Models/ModuleDefinition.cs +++ b/Oqtane.Shared/Models/ModuleDefinition.cs @@ -33,6 +33,7 @@ namespace Oqtane.Models SettingsType = ""; PackageName = ""; Runtimes = ""; + Databases = ""; Template = ""; Resources = null; IsAutoEnabled = true; @@ -83,7 +84,10 @@ namespace Oqtane.Models public string License { get; set; } [NotMapped] - public string Runtimes { get; set; } + public string Runtimes { get; set; } // comma-delimited list of runtimes ie. Server, WebAssembly + + [NotMapped] + public string Databases { get; set; } // comma-delimited list of database names ie. SQLServer, SQLite [NotMapped] public string Dependencies { get; set; } From 30c6da13c2a34951afcc6435a6759346eb85279a Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 Sep 2025 08:49:32 -0400 Subject: [PATCH 44/68] fix help text related to module/theme upload --- Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor | 2 +- Oqtane.Client/Modules/Admin/Themes/Add.razor | 2 +- .../Resources/Modules/Admin/ModuleDefinitions/Add.resx | 3 +++ Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx | 3 +++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index f94f8997..f8057caa 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -310,6 +310,6 @@ private void OnUpload() { - AddModuleMessage(string.Format(Localizer["Success.Module.Download"], NavigateUrl("admin/system")), MessageType.Success); + AddModuleMessage(string.Format(Localizer["Success.Module.Upload"], NavigateUrl("admin/system")), MessageType.Success); } } diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index d8937984..00d8c67f 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -310,6 +310,6 @@ private void OnUpload() { - AddModuleMessage(string.Format(Localizer["Success.Theme.Download"], NavigateUrl("admin/system")), MessageType.Success); + AddModuleMessage(string.Format(Localizer["Success.Theme.Upload"], NavigateUrl("admin/system")), MessageType.Success); } } diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx index a75079fd..5989035c 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Add.resx @@ -126,6 +126,9 @@ Module Package Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + + Module Package Uploaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Error Downloading Module diff --git a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx index 93712015..9542df74 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Themes/Add.resx @@ -126,6 +126,9 @@ Theme Package Downloaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + + Theme Package Uploaded Successfully. You Must <a href={0}>Restart</a> Your Application To Complete The Installation. + Error Downloading Theme From e7bc11d026db52151e9f2f0df8647a8cd276a7c3 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 Sep 2025 13:59:27 -0400 Subject: [PATCH 45/68] bump version to 6.2.0 --- .../Client/Oqtane.Application.Client.csproj | 2 +- Oqtane.Application/Oqtane.Application.Template.nuspec | 2 +- .../Server/Oqtane.Application.Server.csproj | 2 +- .../Shared/Oqtane.Application.Shared.csproj | 2 +- Oqtane.Client/Oqtane.Client.csproj | 4 ++-- Oqtane.Maui/Oqtane.Maui.csproj | 6 +++--- Oqtane.Package/Oqtane.Client.nuspec | 6 +++--- Oqtane.Package/Oqtane.Framework.nuspec | 6 +++--- Oqtane.Package/Oqtane.Server.nuspec | 10 +++++----- Oqtane.Package/Oqtane.Shared.nuspec | 4 ++-- Oqtane.Package/Oqtane.Updater.nuspec | 4 ++-- Oqtane.Package/install.ps1 | 2 +- Oqtane.Package/upgrade.ps1 | 2 +- Oqtane.Server/Oqtane.Server.csproj | 6 +++--- Oqtane.Shared/Oqtane.Shared.csproj | 4 ++-- Oqtane.Shared/Shared/Constants.cs | 4 ++-- Oqtane.Updater/Oqtane.Updater.csproj | 4 ++-- 17 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Oqtane.Application/Client/Oqtane.Application.Client.csproj b/Oqtane.Application/Client/Oqtane.Application.Client.csproj index 638acb68..50b9b31e 100644 --- a/Oqtane.Application/Client/Oqtane.Application.Client.csproj +++ b/Oqtane.Application/Client/Oqtane.Application.Client.csproj @@ -15,7 +15,7 @@ - + diff --git a/Oqtane.Application/Oqtane.Application.Template.nuspec b/Oqtane.Application/Oqtane.Application.Template.nuspec index 31d80f81..47fabbf3 100644 --- a/Oqtane.Application/Oqtane.Application.Template.nuspec +++ b/Oqtane.Application/Oqtane.Application.Template.nuspec @@ -2,7 +2,7 @@ Oqtane.Application.Template - 6.1.6 + 6.2.0 Oqtane Application Template For Blazor Shaun Walker false diff --git a/Oqtane.Application/Server/Oqtane.Application.Server.csproj b/Oqtane.Application/Server/Oqtane.Application.Server.csproj index 5259f3b5..79d6749a 100644 --- a/Oqtane.Application/Server/Oqtane.Application.Server.csproj +++ b/Oqtane.Application/Server/Oqtane.Application.Server.csproj @@ -12,7 +12,7 @@ - + diff --git a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj index 90fcda5d..a10df1dc 100644 --- a/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj +++ b/Oqtane.Application/Shared/Oqtane.Application.Shared.csproj @@ -7,7 +7,7 @@ - + diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index c1bdea3f..f35decd2 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -4,7 +4,7 @@ net9.0 Exe Debug;Release - 6.1.5 + 6.2.0 Oqtane Shaun Walker .NET Foundation @@ -12,7 +12,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Maui/Oqtane.Maui.csproj b/Oqtane.Maui/Oqtane.Maui.csproj index f9cf6f34..144d85d3 100644 --- a/Oqtane.Maui/Oqtane.Maui.csproj +++ b/Oqtane.Maui/Oqtane.Maui.csproj @@ -6,7 +6,7 @@ Exe - 6.1.5 + 6.2.0 Oqtane Shaun Walker .NET Foundation @@ -14,7 +14,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 https://github.com/oqtane/oqtane.framework Git Oqtane.Maui @@ -30,7 +30,7 @@ com.oqtane.maui - 6.1.5 + 6.2.0 1 diff --git a/Oqtane.Package/Oqtane.Client.nuspec b/Oqtane.Package/Oqtane.Client.nuspec index 3adc1e20..37bdefe9 100644 --- a/Oqtane.Package/Oqtane.Client.nuspec +++ b/Oqtane.Package/Oqtane.Client.nuspec @@ -2,7 +2,7 @@ Oqtane.Client - 6.1.6 + 6.2.0 Shaun Walker .NET Foundation Oqtane Framework @@ -12,13 +12,13 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 readme.md icon.png oqtane - + diff --git a/Oqtane.Package/Oqtane.Framework.nuspec b/Oqtane.Package/Oqtane.Framework.nuspec index e58a74a2..c8d8f1cb 100644 --- a/Oqtane.Package/Oqtane.Framework.nuspec +++ b/Oqtane.Package/Oqtane.Framework.nuspec @@ -2,7 +2,7 @@ Oqtane.Framework - 6.1.5 + 6.2.0 Shaun Walker .NET Foundation Oqtane Framework @@ -11,8 +11,8 @@ .NET Foundation false MIT - https://github.com/oqtane/oqtane.framework/releases/download/v6.1.5/Oqtane.Framework.6.1.5.Upgrade.zip - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/download/v6.2.0/Oqtane.Framework.6.2.0.Upgrade.zip + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 readme.md icon.png oqtane framework diff --git a/Oqtane.Package/Oqtane.Server.nuspec b/Oqtane.Package/Oqtane.Server.nuspec index 96074428..a476c356 100644 --- a/Oqtane.Package/Oqtane.Server.nuspec +++ b/Oqtane.Package/Oqtane.Server.nuspec @@ -2,7 +2,7 @@ Oqtane.Server - 6.1.6 + 6.2.0 Shaun Walker .NET Foundation Oqtane Framework @@ -12,14 +12,14 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 readme.md icon.png oqtane - - + + @@ -35,7 +35,7 @@ - + diff --git a/Oqtane.Package/Oqtane.Shared.nuspec b/Oqtane.Package/Oqtane.Shared.nuspec index 320f80f8..ebef46ad 100644 --- a/Oqtane.Package/Oqtane.Shared.nuspec +++ b/Oqtane.Package/Oqtane.Shared.nuspec @@ -2,7 +2,7 @@ Oqtane.Shared - 6.1.6 + 6.2.0 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 readme.md icon.png oqtane diff --git a/Oqtane.Package/Oqtane.Updater.nuspec b/Oqtane.Package/Oqtane.Updater.nuspec index 9bfc53a1..d5ed33fa 100644 --- a/Oqtane.Package/Oqtane.Updater.nuspec +++ b/Oqtane.Package/Oqtane.Updater.nuspec @@ -2,7 +2,7 @@ Oqtane.Updater - 6.1.5 + 6.2.0 Shaun Walker .NET Foundation Oqtane Framework @@ -12,7 +12,7 @@ false MIT https://github.com/oqtane/oqtane.framework - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 readme.md icon.png oqtane diff --git a/Oqtane.Package/install.ps1 b/Oqtane.Package/install.ps1 index 137b9b7e..67aab1f3 100644 --- a/Oqtane.Package/install.ps1 +++ b/Oqtane.Package/install.ps1 @@ -1 +1 @@ -Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.1.5.Install.zip" -Force +Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.2.0.Install.zip" -Force diff --git a/Oqtane.Package/upgrade.ps1 b/Oqtane.Package/upgrade.ps1 index e2e5031a..af2b5571 100644 --- a/Oqtane.Package/upgrade.ps1 +++ b/Oqtane.Package/upgrade.ps1 @@ -1 +1 @@ -Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.1.5.Upgrade.zip" -Force +Compress-Archive -Path "..\Oqtane.Server\bin\Release\net9.0\publish\*" -DestinationPath "Oqtane.Framework.6.2.0.Upgrade.zip" -Force diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index da8a2bb1..e68eb1bd 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -3,7 +3,7 @@ net9.0 Debug;Release - 6.1.5 + 6.2.0 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 https://github.com/oqtane/oqtane.framework Git Oqtane @@ -54,7 +54,7 @@ - + diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index 331fe1fb..30e64740 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -3,7 +3,7 @@ net9.0 Debug;Release - 6.1.5 + 6.2.0 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 https://github.com/oqtane/oqtane.framework Git Oqtane diff --git a/Oqtane.Shared/Shared/Constants.cs b/Oqtane.Shared/Shared/Constants.cs index 0348e7c2..1cd0567c 100644 --- a/Oqtane.Shared/Shared/Constants.cs +++ b/Oqtane.Shared/Shared/Constants.cs @@ -4,8 +4,8 @@ namespace Oqtane.Shared { public class Constants { - public static readonly string Version = "6.1.5"; - public const string ReleaseVersions = "1.0.0,1.0.1,1.0.2,1.0.3,1.0.4,2.0.0,2.0.1,2.0.2,2.1.0,2.2.0,2.3.0,2.3.1,3.0.0,3.0.1,3.0.2,3.0.3,3.1.0,3.1.1,3.1.2,3.1.3,3.1.4,3.2.0,3.2.1,3.3.0,3.3.1,3.4.0,3.4.1,3.4.2,3.4.3,4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,5.0.0,5.0.1,5.0.2,5.0.3,5.1.0,5.1.1,5.1.2,5.2.0,5.2.1,5.2.2,5.2.3,5.2.4,6.0.0,6.0.1,6.1.0,6.1.1,6.1.2,6.1.3,6.1.4,6.1.5"; + public static readonly string Version = "6.2.0"; + public const string ReleaseVersions = "1.0.0,1.0.1,1.0.2,1.0.3,1.0.4,2.0.0,2.0.1,2.0.2,2.1.0,2.2.0,2.3.0,2.3.1,3.0.0,3.0.1,3.0.2,3.0.3,3.1.0,3.1.1,3.1.2,3.1.3,3.1.4,3.2.0,3.2.1,3.3.0,3.3.1,3.4.0,3.4.1,3.4.2,3.4.3,4.0.0,4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,5.0.0,5.0.1,5.0.2,5.0.3,5.1.0,5.1.1,5.1.2,5.2.0,5.2.1,5.2.2,5.2.3,5.2.4,6.0.0,6.0.1,6.1.0,6.1.1,6.1.2,6.1.3,6.1.4,6.1.5,6.2.0"; public const string PackageId = "Oqtane.Framework"; public const string ClientId = "Oqtane.Client"; public const string UpdaterPackageId = "Oqtane.Updater"; diff --git a/Oqtane.Updater/Oqtane.Updater.csproj b/Oqtane.Updater/Oqtane.Updater.csproj index 9e2cde44..cdc1f556 100644 --- a/Oqtane.Updater/Oqtane.Updater.csproj +++ b/Oqtane.Updater/Oqtane.Updater.csproj @@ -3,7 +3,7 @@ net9.0 Exe - 6.1.5 + 6.2.0 Oqtane Shaun Walker .NET Foundation @@ -11,7 +11,7 @@ .NET Foundation https://www.oqtane.org https://github.com/oqtane/oqtane.framework/blob/dev/LICENSE - https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5 + https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0 https://github.com/oqtane/oqtane.framework Git Oqtane From 304694fbf99ed54c16825dd461fc1e1665172871 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 2 Sep 2025 12:53:42 -0700 Subject: [PATCH 46/68] Update to latest SQLitePCLRaw.bundle_e_sqlite3 & Swashbuckle.AspNetCore Package Dependencies --- Oqtane.Server/Oqtane.Server.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index e68eb1bd..7933c9e4 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -47,7 +47,7 @@ - + @@ -62,7 +62,7 @@ - + From 9a06a3311e5920739d0d2252cbdde3cec2e72ef6 Mon Sep 17 00:00:00 2001 From: Cody Date: Tue, 2 Sep 2025 12:58:04 -0700 Subject: [PATCH 47/68] Update azuredeploy.json to v6.2.0 --- azuredeploy.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azuredeploy.json b/azuredeploy.json index 40b5a30b..05388b1c 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -220,7 +220,7 @@ "apiVersion": "2024-04-01", "name": "[concat(parameters('BlazorWebsiteName'), '/ZipDeploy')]", "properties": { - "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.1.5/Oqtane.Framework.6.1.5.Install.zip" + "packageUri": "https://github.com/oqtane/oqtane.framework/releases/download/v6.2.0/Oqtane.Framework.6.2.0.Install.zip" }, "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('BlazorWebsiteName'))]" @@ -229,4 +229,4 @@ ] } ] -} \ No newline at end of file +} From 09daf3f6cc7f45fa3c468cf1e0e3e5fc5c03bf83 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 Sep 2025 17:09:55 -0400 Subject: [PATCH 48/68] fix issue in default module template --- .../Modules/Templates/External/Client/Startup/ClientStartup.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs index 5050abee..95ed096c 100644 --- a/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs +++ b/Oqtane.Server/wwwroot/Modules/Templates/External/Client/Startup/ClientStartup.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using System.Linq; using Oqtane.Services; using [Owner].Module.[Module].Services; From 2b500d41cac0a106e9b38f4b14dd506093295a0f Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 2 Sep 2025 17:11:23 -0400 Subject: [PATCH 49/68] fix issue in application template --- Oqtane.Application/Client/Startup/ClientStartup.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Oqtane.Application/Client/Startup/ClientStartup.cs b/Oqtane.Application/Client/Startup/ClientStartup.cs index cf29f81d..9f336c41 100644 --- a/Oqtane.Application/Client/Startup/ClientStartup.cs +++ b/Oqtane.Application/Client/Startup/ClientStartup.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using System.Linq; using Oqtane.Services; using Oqtane.Application.Services; From ca9ddbd90f0828fb9e639bcc6ba0601f536eccdc Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 4 Sep 2025 14:01:42 -0400 Subject: [PATCH 50/68] fix #5570 - multi-database installation authentication issue --- Oqtane.Server/Security/PrincipalValidator.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Oqtane.Server/Security/PrincipalValidator.cs b/Oqtane.Server/Security/PrincipalValidator.cs index 45e99c34..b45ec366 100644 --- a/Oqtane.Server/Security/PrincipalValidator.cs +++ b/Oqtane.Server/Security/PrincipalValidator.cs @@ -31,11 +31,11 @@ namespace Oqtane.Security var userManager = context.HttpContext.RequestServices.GetService(typeof(IUserManager)) as IUserManager; var user = userManager.GetUser(context.Principal.UserId(), alias.SiteId); // cached - // check if user is valid, not deleted, has roles, and security stamp has not changed - if (user != null && !user.IsDeleted && !string.IsNullOrEmpty(user.Roles) && context.Principal.SecurityStamp() == user.SecurityStamp) + // check if user is valid, not deleted, has roles, and security stamp has not changed for this tenant + if (user != null && !user.IsDeleted && !string.IsNullOrEmpty(user.Roles) && (context.Principal.SecurityStamp() == user.SecurityStamp || context.Principal.SiteKey() != alias.SiteKey)) { - // validate sitekey in case user has changed sites in installation - if (context.Principal.SiteKey() != alias.SiteKey || !context.Principal.Roles().Any()) + // validate security stamp and sitekey (in case user has changed tenants/sites in installation) + if (context.Principal.SecurityStamp() != user.SecurityStamp || context.Principal.SiteKey() != alias.SiteKey || !context.Principal.Roles().Any()) { // refresh principal var identity = UserSecurity.CreateClaimsIdentity(alias, user); From b049be9d8388d138e88058999b454ec3e8357444 Mon Sep 17 00:00:00 2001 From: Jon Welfringer <7365166+W6HBR@users.noreply.github.com> Date: Thu, 4 Sep 2025 21:44:14 -0700 Subject: [PATCH 51/68] Change IsStarted to follow IsEnabled value upon startup. Changes behavior of IsStarted to follow the same value of IsEnabled. --- Oqtane.Server/Infrastructure/Jobs/HostedServiceBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Server/Infrastructure/Jobs/HostedServiceBase.cs b/Oqtane.Server/Infrastructure/Jobs/HostedServiceBase.cs index 655c7b20..349ce812 100644 --- a/Oqtane.Server/Infrastructure/Jobs/HostedServiceBase.cs +++ b/Oqtane.Server/Infrastructure/Jobs/HostedServiceBase.cs @@ -252,8 +252,8 @@ namespace Oqtane.Infrastructure Job job = jobs.GetJobs().Where(item => item.JobType == jobTypeName).FirstOrDefault(); if (job != null) { - // reset in case this job was forcefully terminated previously - job.IsStarted = true; + // reset in case this job was enabled and forcefully terminated previously + job.IsStarted = job.IsEnabled; job.IsExecuting = false; jobs.UpdateJob(job); } From 1ea76d06d1e5c2cf2e0cf86ae8946418264797ea Mon Sep 17 00:00:00 2001 From: Jon Welfringer <7365166+W6HBR@users.noreply.github.com> Date: Thu, 4 Sep 2025 21:47:51 -0700 Subject: [PATCH 52/68] Change StartJob to check if job is enabled --- Oqtane.Client/Modules/Admin/Jobs/Index.razor | 26 +++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index 033c3787..ed9c9f41 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -114,18 +114,26 @@ else private async Task StartJob(int jobId) { - try + Job _job = await JobService.GetJobAsync(jobId); + if (!_job.IsEnabled) { - await JobService.StartJobAsync(jobId); - await logger.LogInformation("Job Started {JobId}", jobId); - AddModuleMessage(Localizer["Message.Job.Start"], MessageType.Success); - _jobs = await JobService.GetJobsAsync(); - StateHasChanged(); + AddModuleMessage(Localizer["Message.Job.Disabled"], MessageType.Warning); } - catch (Exception ex) + else { - await logger.LogError(ex, "Error Starting Job {JobId} {Error}", jobId, ex.Message); - AddModuleMessage(Localizer["Error.Job.Start"], MessageType.Error); + try + { + await JobService.StartJobAsync(jobId); + await logger.LogInformation("Job Started {JobId}", jobId); + AddModuleMessage(Localizer["Message.Job.Start"], MessageType.Success); + _jobs = await JobService.GetJobsAsync(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Starting Job {JobId} {Error}", jobId, ex.Message); + AddModuleMessage(Localizer["Error.Job.Start"], MessageType.Error); + } } } From b7bc527d6cdaf88ff202dd05d5b1993e0219c388 Mon Sep 17 00:00:00 2001 From: Jon Welfringer <7365166+W6HBR@users.noreply.github.com> Date: Thu, 4 Sep 2025 21:52:24 -0700 Subject: [PATCH 53/68] Added resource message for Message.Job.Disabled --- Oqtane.Client/Resources/Modules/Admin/Jobs/Index.resx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Resources/Modules/Admin/Jobs/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Jobs/Index.resx index 53326062..f4812765 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Jobs/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Jobs/Index.resx @@ -183,4 +183,7 @@ Refresh - \ No newline at end of file + + The job cannot be started while in the disabled state. + + From e59d5fd33978a7ddbf968d5bdf6d66acbf86a926 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 5 Sep 2025 20:36:50 +0800 Subject: [PATCH 54/68] implement radzen text editor. --- .../OqtaneServiceCollectionExtensions.cs | 12 +- .../Modules/Controls/FileManagerDialog.razor | 45 ++++ .../Controls/RadzenEditorDefinitions.cs | 85 +++++++ .../Modules/Controls/RadzenEditorInterop.cs | 60 +++++ .../Modules/Controls/RadzenEditorSetting.cs | 11 + .../Modules/Controls/RadzenTextEditor.razor | 193 +++++++++++++++ .../Modules/Controls/SettingsDialog.razor | 222 ++++++++++++++++++ Oqtane.Client/Oqtane.Client.csproj | 1 + .../Modules/Controls/RadzenTextEditor.resx | 219 +++++++++++++++++ .../Services/RadzenEditorSettingService.cs | 144 ++++++++++++ .../OqtaneServiceCollectionExtensions.cs | 12 +- .../css/radzentexteditor.override.css | 22 ++ .../js/Interops/RadzenTextEditorInterop.js | 47 ++++ 13 files changed, 1069 insertions(+), 4 deletions(-) create mode 100644 Oqtane.Client/Modules/Controls/FileManagerDialog.razor create mode 100644 Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs create mode 100644 Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs create mode 100644 Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs create mode 100644 Oqtane.Client/Modules/Controls/RadzenTextEditor.razor create mode 100644 Oqtane.Client/Modules/Controls/SettingsDialog.razor create mode 100644 Oqtane.Client/Resources/Modules/Controls/RadzenTextEditor.resx create mode 100644 Oqtane.Client/Services/RadzenEditorSettingService.cs create mode 100644 Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css create mode 100644 Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js diff --git a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs index eae6ba0f..96d68d37 100644 --- a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs @@ -1,8 +1,10 @@ using Microsoft.AspNetCore.Components.Authorization; +using Microsoft.Extensions.Localization; using Oqtane.Interfaces; using Oqtane.Providers; using Oqtane.Services; using Oqtane.Shared; +using Radzen; namespace Microsoft.Extensions.DependencyInjection { @@ -23,7 +25,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -39,7 +41,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -59,6 +61,12 @@ namespace Microsoft.Extensions.DependencyInjection // providers services.AddScoped(); services.AddScoped(); + services.AddScoped(); + + services.AddRadzenComponents(); + + var localizer = services.BuildServiceProvider().GetService>(); + Oqtane.Modules.Controls.RadzenEditorDefinitions.Localizer = localizer; return services; } diff --git a/Oqtane.Client/Modules/Controls/FileManagerDialog.razor b/Oqtane.Client/Modules/Controls/FileManagerDialog.razor new file mode 100644 index 00000000..48fdbc37 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/FileManagerDialog.razor @@ -0,0 +1,45 @@ +@namespace Oqtane.Modules.Controls +@using System.IO +@using Radzen +@using Radzen.Blazor +@inject DialogService DialogService +@inject IStringLocalizer Localizer + +
+ +
+
+ +
+
+ + +
+@code { + private FileManager _fileManager; + private string _message = string.Empty; + + [Parameter] + public string Filters { get; set; } + + private void OnCancelClick() + { + DialogService.Close(null); + } + + private void OnOkClick() + { + _message = string.Empty; + var file = _fileManager.GetFile(); + if (file != null) + { + var result = $"\"{file.Name}\""; + DialogService.Close(result); + } + else + { + _message = Localizer["Message.Require.Image"]; + StateHasChanged(); + } + } +} \ No newline at end of file diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs b/Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs new file mode 100644 index 00000000..9fdd778d --- /dev/null +++ b/Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs @@ -0,0 +1,85 @@ +using Microsoft.AspNetCore.Components.Rendering; +using Microsoft.Extensions.Localization; +using System; +using System.Collections.Generic; + +namespace Oqtane.Modules.Controls +{ + public sealed class RadzenEditorDefinitions + { + public static IStringLocalizer Localizer { get; internal set; } + + public const string TransparentBackgroundColor = "rgba(0, 0, 0, 0)"; + + public const string LightBackgroundColor = "rgba(255, 255, 255, 1)"; + + public const string DarkBackgroundColor = "rgba(0, 0, 0, 1)"; + + public const string DefaultTheme = "default"; + + public const string DefaultBackground = "Default"; + + public static readonly IDictionary> ToolbarItems = new Dictionary>() + { + { "AlignCenter", (builder, sequence) => CreateFragment(builder, sequence, "AlignCenter", "RadzenHtmlEditorAlignCenter") }, + { "AlignLeft", (builder, sequence) => CreateFragment(builder, sequence, "AlignLeft", "RadzenHtmlEditorAlignLeft") }, + { "AlignRight", (builder, sequence) => CreateFragment(builder, sequence, "AlignRight", "RadzenHtmlEditorAlignRight") }, + { "Background", (builder, sequence) => CreateFragment(builder, sequence, "Background", "RadzenHtmlEditorBackground") }, + { "Color", (builder, sequence) => CreateFragment(builder, sequence, "Color", "RadzenHtmlEditorColor") }, + { "FontName", (builder, sequence) => CreateFragment(builder, sequence, "FontName", "RadzenHtmlEditorFontName") }, + { "FontSize", (builder, sequence) => CreateFragment(builder, sequence, "FontSize", "RadzenHtmlEditorFontSize") }, + { "FormatBlock", (builder, sequence) => CreateFragment(builder, sequence, "FormatBlock", "RadzenHtmlEditorFormatBlock") }, + { "Indent", (builder, sequence) => CreateFragment(builder, sequence, "Indent", "RadzenHtmlEditorIndent") }, + { "InsertImage", (builder, sequence) => CreateFragment(builder, sequence, "InsertImage", "RadzenHtmlEditorCustomTool", "InsertImage", "image") }, + { "Italic", (builder, sequence) => CreateFragment(builder, sequence, "Italic", "RadzenHtmlEditorItalic") }, + { "Justify", (builder, sequence) => CreateFragment(builder, sequence, "Justify", "RadzenHtmlEditorJustify") }, + { "Link", (builder, sequence) => CreateFragment(builder, sequence, "Link", "RadzenHtmlEditorLink") }, + { "OrderedList", (builder, sequence) => CreateFragment(builder, sequence, "OrderedList", "RadzenHtmlEditorOrderedList") }, + { "Outdent", (builder, sequence) => CreateFragment(builder, sequence, "Outdent", "RadzenHtmlEditorOutdent") }, + { "Redo", (builder, sequence) => CreateFragment(builder, sequence, "Redo", "RadzenHtmlEditorRedo") }, + { "RemoveFormat", (builder, sequence) => CreateFragment(builder, sequence, "RemoveFormat", "RadzenHtmlEditorRemoveFormat") }, + { "Separator", (builder, sequence) => CreateFragment(builder, sequence, "Separator", "RadzenHtmlEditorSeparator") }, + { "Source", (builder, sequence) => CreateFragment(builder, sequence, "Source", "RadzenHtmlEditorSource") }, + { "StrikeThrough", (builder, sequence) => CreateFragment(builder, sequence, "StrikeThrough", "RadzenHtmlEditorStrikeThrough") }, + { "Subscript", (builder, sequence) => CreateFragment(builder, sequence, "Subscript", "RadzenHtmlEditorSubscript") }, + { "Superscript", (builder, sequence) => CreateFragment(builder, sequence, "Superscript", "RadzenHtmlEditorSuperscript") }, + { "Underline", (builder, sequence) => CreateFragment(builder, sequence, "Underline", "RadzenHtmlEditorUnderline") }, + { "Undo", (builder, sequence) => CreateFragment(builder, sequence, "Undo", "RadzenHtmlEditorUndo") }, + { "Unlink", (builder, sequence) => CreateFragment(builder, sequence, "Unlink", "RadzenHtmlEditorUnlink") }, + { "UnorderedList", (builder, sequence) => CreateFragment(builder, sequence, "UnorderedList", "RadzenHtmlEditorUnorderedList") }, + }; + + public static readonly string DefaultToolbarItems = "Undo,Redo,Separator,FontName,FontSize,FormatBlock,Bold,Italic,Underline,StrikeThrough,Separator,AlignLeft,AlignCenter,AlignRight,Justify,Separator,Indent,Outdent,UnorderedList,OrderedList,Separator,Color,Background,RemoveFormat,Separator,Subscript,Superscript,Separator,Link,Unlink,InsertImage,Separator,Source"; + + private static int CreateFragment(RenderTreeBuilder builder, int sequence, string name, string typeName, string commaneName = "", string icon = "") + { + var fullTypeName = $"Radzen.Blazor.{typeName}, Radzen.Blazor"; + var type = Type.GetType(fullTypeName); + if (type != null) + { + var title = Localizer[$"{name}.Title"]; + var placeholder = Localizer[$"{name}.Placeholder"]; + builder.OpenComponent(sequence++, type); + if (!string.IsNullOrEmpty(title) && title != $"{name}.Title" && type.GetProperty("Title") != null) + { + builder.AddAttribute(sequence++, "Title", title); + } + if (!string.IsNullOrEmpty(placeholder) && placeholder != $"{name}.Placeholder" && type.GetProperty("Placeholder") != null) + { + builder.AddAttribute(sequence++, "Placeholder", placeholder); + } + if (!string.IsNullOrEmpty(commaneName) && type.GetProperty("CommandName") != null) + { + builder.AddAttribute(sequence++, "CommandName", commaneName); + } + if (!string.IsNullOrEmpty(icon) && type.GetProperty("Icon") != null) + { + builder.AddAttribute(sequence++, "Icon", icon); + } + builder.CloseComponent(); + } + + return sequence; + } + } +} diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs b/Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs new file mode 100644 index 00000000..b9ddcfb0 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs @@ -0,0 +1,60 @@ +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +using System.Threading.Tasks; + +namespace Oqtane.Modules.Controls +{ + public class RadzenEditorInterop + { + private readonly IJSRuntime _jsRuntime; + + public RadzenEditorInterop(IJSRuntime jsRuntime) + { + _jsRuntime = jsRuntime; + } + + public Task Initialize(ElementReference editor) + { + try + { + _jsRuntime.InvokeVoidAsync("Oqtane.RadzenTextEditor.initialize", editor); + } + catch + { + + } + + return Task.CompletedTask; + } + + public Task SetBackgroundColor(ElementReference editor, string color) + { + try + { + _jsRuntime.InvokeVoidAsync( + "Oqtane.RadzenTextEditor.setBackgroundColor", + editor, color); + } + catch + { + + } + + return Task.CompletedTask; + } + + public Task UpdateDialogLayout(ElementReference editor) + { + try + { + _jsRuntime.InvokeVoidAsync("Oqtane.RadzenTextEditor.updateDialogLayout", editor); + } + catch + { + + } + + return Task.CompletedTask; + } + } +} diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs b/Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs new file mode 100644 index 00000000..f6d98f49 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs @@ -0,0 +1,11 @@ +namespace Oqtane.Modules.Controls +{ + public class RadzenEditorSetting + { + public string Theme { get; set; } + + public string Background { get; set; } + + public string ToolbarItems { get; set; } + } +} diff --git a/Oqtane.Client/Modules/Controls/RadzenTextEditor.razor b/Oqtane.Client/Modules/Controls/RadzenTextEditor.razor new file mode 100644 index 00000000..1b3acd85 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/RadzenTextEditor.razor @@ -0,0 +1,193 @@ +@using Microsoft.Extensions.Configuration +@using Oqtane.Interfaces +@using System.Text.RegularExpressions +@using Radzen +@using Radzen.Blazor + +@namespace Oqtane.Modules.Controls +@inherits ModuleControlBase +@implements ITextEditor +@implements IDisposable +@inject Radzen.ThemeService ThemeService +@inject IRadzenEditorSettingService EditorSettingService +@inject DialogService DialogService +@inject NavigationManager NavigationManager +@inject IStringLocalizer Localizer + + + + + + @_toolbar + @if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + { + + } + + + + +@code { + private Oqtane.Modules.Controls.RadzenEditorInterop _interop; + private RadzenHtmlEditor _editor; + private string _value; + private bool _visible = false; + private string _theme; + private string _background; + private IList _toolbarItems; + private RenderFragment _toolbar; + + [Parameter] + public string Placeholder { get; set; } + + [Parameter] + public bool ReadOnly { get; set; } + + [Parameter] + public int Height { get; set; } = 450; + + public string Name => "RadzenTextEditor"; + + public override List Resources { get; set; } = new List() + { + new Resource { ResourceType = ResourceType.Script, Url = "/_content/Radzen.Blazor/Radzen.Blazor.js", Location = ResourceLocation.Head }, + new Resource { ResourceType = ResourceType.Script, Url = "/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js", Location = ResourceLocation.Head }, + }; + + protected override void OnInitialized() + { + _interop = new Oqtane.Modules.Controls.RadzenEditorInterop(JSRuntime); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + if (firstRender) + { + var interop = new Interop(JSRuntime); + await interop.IncludeLink("", "stylesheet", $"/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css", "text/css", "", "", ""); + await LoadSettings(); + _visible = true; + StateHasChanged(); + + await _interop.Initialize(_editor.Element); + + if (!string.IsNullOrEmpty(_theme)) + { + ThemeService.SetTheme(_theme); + } + + if (!string.IsNullOrEmpty(_background)) + { + var backgroundColor = RadzenEditorDefinitions.TransparentBackgroundColor; + switch (_background) + { + case "Light": + backgroundColor = RadzenEditorDefinitions.LightBackgroundColor; + break; + case "Dark": + backgroundColor = RadzenEditorDefinitions.DarkBackgroundColor; + break; + } + await _interop.SetBackgroundColor(_editor.Element, backgroundColor); + } + } + } + + public void Initialize(string content) + { + _value = !string.IsNullOrEmpty(content) ? content : string.Empty; + DialogService.OnOpen += OnDialogOpened; + } + + public void Dispose() + { + if (DialogService != null) + { + DialogService.OnOpen -= OnDialogOpened; + } + } + + public async Task GetContent() + { + await Task.CompletedTask; + + return _value; + } + + private async Task LoadSettings() + { + var scope = await EditorSettingService.GetSettingScopeAsync(ModuleState.ModuleId); + var editorSetting = scope == 1 + ? await EditorSettingService.LoadSettingsFromModuleAsync(ModuleState.ModuleId) + : await EditorSettingService.LoadSettingsFromSiteAsync(PageState.Site.SiteId); + + _theme = editorSetting.Theme; + _background = editorSetting.Background; + _toolbarItems = editorSetting.ToolbarItems.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList(); + _toolbar = SetupToolbarItems(); + } + + private RenderFragment SetupToolbarItems() + { + return builder => + { + var sequence = 0; + foreach (var item in _toolbarItems) + { + if (RadzenEditorDefinitions.ToolbarItems.ContainsKey(item)) + { + sequence = RadzenEditorDefinitions.ToolbarItems[item](builder, sequence); + } + } + }; + } + + private async Task OnExecute(HtmlEditorExecuteEventArgs args) + { + if (args.CommandName == "InsertImage") + { + await InsertImage(args.Editor); + } + else if (args.CommandName == "Settings") + { + await UpdateSettings(args.Editor); + } + } + + private async Task InsertImage(RadzenHtmlEditor editor) + { + await editor.SaveSelectionAsync(); + + var result = await DialogService.OpenAsync(Localizer["DialogTitle.SelectImage"], new Dictionary + { + { "Filters", PageState.Site.ImageFiles } + }); + + await editor.RestoreSelectionAsync(); + + if (result != null) + { + await editor.ExecuteCommandAsync(HtmlEditorCommands.InsertHtml, result); + } + } + + private async Task UpdateSettings(RadzenHtmlEditor editor) + { + await editor.SaveSelectionAsync(); + + var result = await DialogService.OpenAsync(Localizer["Settings"], null, new DialogOptions { Width = "650px" }); + if (result == true) + { + NavigationManager.NavigateTo(NavigationManager.Uri); + } + + await editor.RestoreSelectionAsync(); + } + + private async void OnDialogOpened(string title, Type componentType, Dictionary parameters, DialogOptions options) + { + await _interop.UpdateDialogLayout(_editor.Element); + } +} \ No newline at end of file diff --git a/Oqtane.Client/Modules/Controls/SettingsDialog.razor b/Oqtane.Client/Modules/Controls/SettingsDialog.razor new file mode 100644 index 00000000..d9ddaca2 --- /dev/null +++ b/Oqtane.Client/Modules/Controls/SettingsDialog.razor @@ -0,0 +1,222 @@ +@namespace Oqtane.Modules.Controls +@using System.IO +@using Radzen +@using Radzen.Blazor +@inherits ModuleControlBase +@inject DialogService DialogService +@inject Radzen.ThemeService ThemeService +@inject ISettingService SettingService +@inject IRadzenEditorSettingService EditorSettingService +@inject IStringLocalizer Localizer + +
+
+ @Localizer["Scope"] +
+
+ + + + + + +
+
+
+
+ @Localizer["Theme"] +
+
+ + + +
+
+
+
+ @Localizer["Background"] +
+
+ + + +
+
+
+
+ @Localizer["Toolbar"] +
+
+
+
+ + +
+
+ + +
+
+
+
+ + + + + + + +
+
+
+
+
+ + +
+ +@code { + private readonly IList _themes = new List + { + "default", + "dark", + "material", + "material-dark", + "standard", + "standard-dark", + "humanistic", + "humanistic-dark", + "software", + "software-dark" + }; + private readonly IList _backgroundColors = new List { "Default", "Light", "Dark" }; + + private int _settingScope; + private string _theme; + private string _background; + private IList _toolbarItems = new List(); + private string _addToolbarItem; + + protected override async Task OnInitializedAsync() + { + _settingScope = await EditorSettingService.GetSettingScopeAsync(ModuleState.ModuleId); + + await LoadSettings(); + } + + private async Task LoadSettingsFromModule() + { + return await EditorSettingService.LoadSettingsFromModuleAsync(ModuleState.ModuleId); + } + + private async Task LoadSettingsFromSite() + { + return await EditorSettingService.LoadSettingsFromSiteAsync(PageState.Site.SiteId); + } + + private async Task LoadSettings() + { + var editorSetting = _settingScope == 1 ? await LoadSettingsFromModule() : await LoadSettingsFromSite(); + _theme = editorSetting.Theme; + _background = editorSetting.Background; + _toolbarItems = editorSetting.ToolbarItems.Split(',').Select((v, i) => + { + return new ToolbarItem { Key = i, Name = v }; + }).ToList(); + } + + private async Task OnScopeChanged() + { + await LoadSettings(); + + StateHasChanged(); + } + + private void AddToolbarItem() + { + if (!string.IsNullOrEmpty(_addToolbarItem)) + { + _toolbarItems.Add(new ToolbarItem { Key = _toolbarItems.Count, Name = _addToolbarItem }); + _addToolbarItem = string.Empty; + + StateHasChanged(); + } + } + + private void ResetToolbarItem() + { + _toolbarItems = RadzenEditorDefinitions.DefaultToolbarItems.Split(',').Select((v, i) => + { + return new ToolbarItem { Key = i, Name = v }; + }).ToList(); + + StateHasChanged(); + } + + private void DeleteToolbarItem(ToolbarItem item) + { + _toolbarItems.Remove(item); + + StateHasChanged(); + } + + private void OnCancelClick() + { + DialogService.Close(false); + } + + private async Task OnOkClick() + { + var editorSetting = new RadzenEditorSetting + { + Theme = _theme, + Background = _background, + ToolbarItems = string.Join(",", _toolbarItems.Select(i => i.Name)) + }; + await EditorSettingService.UpdateSettingScopeAsync(ModuleState.ModuleId, _settingScope); + if (_settingScope == 1) + { + await EditorSettingService.SaveModuleSettingsAsync(ModuleState.ModuleId, editorSetting); + } + else + { + await EditorSettingService.SaveSiteSettingsAsync(PageState.Site.SiteId, editorSetting); + } + + DialogService.Close(true); + } + + private void OnToolbarItemDrop(RadzenDropZoneItemEventArgs args) + { + if (args.ToItem != null && args.ToItem.Key != args.Item.Key) + { + _toolbarItems.Remove(args.Item); + _toolbarItems.Insert(_toolbarItems.IndexOf(args.ToItem), args.Item); + } + } + + private void OnToolbarItemRender(RadzenDropZoneItemRenderEventArgs args) + { + args.Attributes.Add("class", "rz-card rz-variant-flat rz-background-color-primary-lighter rz-color-on-primary-lighter rz-p-2 d-inline-block ms-1 mt-1"); + } + + public class ToolbarItem + { + public int Key { get; set; } + + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index f35decd2..5ff0e3e1 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -26,6 +26,7 @@ + diff --git a/Oqtane.Client/Resources/Modules/Controls/RadzenTextEditor.resx b/Oqtane.Client/Resources/Modules/Controls/RadzenTextEditor.resx new file mode 100644 index 00000000..4c84d4df --- /dev/null +++ b/Oqtane.Client/Resources/Modules/Controls/RadzenTextEditor.resx @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Editor Background: + + + Close + + + Dark + + + Default + + + Select Image + + + Font + + + Font Name + + + Size + + + Font Size + + + Format + + + Format Block + + + Humanistic + + + Humanistic Dark + + + Insert Image + + + Light + + + Material + + + Material Dark + + + You Must Select An Image To Insert + + + Module + + + Enter Your Content... + + + Settings + + + Scope: + + + Site + + + Software + + + Software Dark + + + Standard + + + Standard Dark + + + Theme: + + + Dark + + + Default + + + Toolbar Items: + + + Add + + + Reset + + \ No newline at end of file diff --git a/Oqtane.Client/Services/RadzenEditorSettingService.cs b/Oqtane.Client/Services/RadzenEditorSettingService.cs new file mode 100644 index 00000000..d3153042 --- /dev/null +++ b/Oqtane.Client/Services/RadzenEditorSettingService.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Oqtane.Models; +using Oqtane.Modules; +using Oqtane.Modules.Controls; +using Oqtane.Services; + +namespace Oqtane.Services +{ + public interface IRadzenEditorSettingService + { + Task GetSettingScopeAsync(int moduleId); + + Task UpdateSettingScopeAsync(int moduleId, int scope); + + Task LoadSettingsFromModuleAsync(int moduleId); + + Task LoadSettingsFromSiteAsync(int siteId); + + Task SaveSiteSettingsAsync(int siteId, RadzenEditorSetting editorSetting); + + Task SaveModuleSettingsAsync(int moduleId, RadzenEditorSetting editorSetting); + } + public class RadzenEditorSettingService : IRadzenEditorSettingService, IService + { + private const string SettingPrefix = "rzeditor:"; + + private readonly ISettingService _settingService; + + public RadzenEditorSettingService(ISettingService settingService) + { + _settingService = settingService; + } + + public async Task GetSettingScopeAsync(int moduleId) + { + var key = $"{SettingPrefix}Scope"; + var settings = await _settingService.GetModuleSettingsAsync(moduleId); + if (settings.ContainsKey(key) && int.TryParse(settings[key], out int value)) + { + return value; + } + + return 0; // site as default + } + + public async Task UpdateSettingScopeAsync(int moduleId, int scope) + { + var settings = new Dictionary + { + { $"{SettingPrefix}Scope", scope.ToString() } + }; + + await _settingService.UpdateModuleSettingsAsync(settings, moduleId); + } + + public async Task LoadSettingsFromModuleAsync(int moduleId) + { + var settings = await _settingService.GetModuleSettingsAsync(moduleId); + return ReadSettings(settings); + } + + public async Task LoadSettingsFromSiteAsync(int siteId) + { + var settings = await _settingService.GetSiteSettingsAsync(siteId); + return ReadSettings(settings); + } + + public async Task SaveSiteSettingsAsync(int siteId, RadzenEditorSetting editorSetting) + { + var settings = CreateSettingsDictionary(editorSetting); + if (settings.Any()) + { + await _settingService.UpdateSiteSettingsAsync(settings, siteId); + } + } + + public async Task SaveModuleSettingsAsync(int moduleId, RadzenEditorSetting editorSetting) + { + var settings = CreateSettingsDictionary(editorSetting); + if (settings.Any()) + { + await _settingService.UpdateModuleSettingsAsync(settings, moduleId); + } + } + + private RadzenEditorSetting ReadSettings(IDictionary settings) + { + var setting = new RadzenEditorSetting + { + Theme = RadzenEditorDefinitions.DefaultTheme, + Background = RadzenEditorDefinitions.DefaultBackground, + ToolbarItems = RadzenEditorDefinitions.DefaultToolbarItems + }; + + if (settings != null) + { + var themeKey = $"{SettingPrefix}Theme"; + var backgroundKey = $"{SettingPrefix}Background"; + var toolbarItemsKey = $"{SettingPrefix}ToolbarItems"; + + if (settings.ContainsKey(themeKey) && !string.IsNullOrEmpty(settings[themeKey])) + { + setting.Theme = settings[themeKey]; + } + + if (settings.ContainsKey(backgroundKey) && !string.IsNullOrEmpty(settings[backgroundKey])) + { + setting.Background = settings[backgroundKey]; + } + + if (settings.ContainsKey(toolbarItemsKey) && !string.IsNullOrEmpty(settings[toolbarItemsKey])) + { + setting.ToolbarItems = settings[toolbarItemsKey]; + } + } + + return setting; + } + + private Dictionary CreateSettingsDictionary(RadzenEditorSetting editorSetting) + { + var settings = new Dictionary(); + + if (!string.IsNullOrEmpty(editorSetting.Theme)) + { + settings.Add($"{SettingPrefix}Theme", editorSetting.Theme); + } + if (!string.IsNullOrEmpty(editorSetting.Background)) + { + settings.Add($"{SettingPrefix}Background", editorSetting.Background); + } + if (!string.IsNullOrEmpty(editorSetting.ToolbarItems)) + { + settings.Add($"{SettingPrefix}ToolbarItems", editorSetting.ToolbarItems); + } + + return settings; + } + } +} diff --git a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs index ccd9f3a3..dbafdab7 100644 --- a/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneServiceCollectionExtensions.cs @@ -20,6 +20,7 @@ using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using Oqtane.Extensions; @@ -32,6 +33,7 @@ using Oqtane.Repository; using Oqtane.Security; using Oqtane.Services; using Oqtane.Shared; +using Radzen; namespace Microsoft.Extensions.DependencyInjection { @@ -193,7 +195,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -208,7 +210,7 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -230,6 +232,12 @@ namespace Microsoft.Extensions.DependencyInjection // providers services.AddScoped(); services.AddScoped(); + services.AddScoped(); + + services.AddRadzenComponents(); + + var localizer = services.BuildServiceProvider().GetService>(); + Oqtane.Modules.Controls.RadzenEditorDefinitions.Localizer = localizer; return services; } diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css b/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css new file mode 100644 index 00000000..e142053b --- /dev/null +++ b/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css @@ -0,0 +1,22 @@ +.rz-text-editor { + outline: none !important; +} + +.rz-html-editor-dropdown-items, +.rz-popup, +.rz-editor-dialog-wrapper { + z-index: 9999 !important; +} + +.rz-html-editor-dropdown-items .rz-html-editor-dropdown-item, +.rz-html-editor-dropdown-items .rz-html-editor-dropdown-item > * { + color: var(--rz-editor-button-color); +} +.rz-text-editor .rz-html-editor-dropdown .rz-html-editor-dropdown-value, +.rz-text-editor .rz-html-editor-dropdown .rz-html-editor-dropdown-trigger, +.rz-text-editor .rz-html-editor-colorpicker .rz-html-editor-color { + color: var(--rz-editor-button-color); +} +.rz-text-editor .rz-colorpicker.rz-state-disabled { + border: none !important; +} \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js b/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js new file mode 100644 index 00000000..e92c7150 --- /dev/null +++ b/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js @@ -0,0 +1,47 @@ +var Oqtane = Oqtane || {}; + +Oqtane.RadzenTextEditor = { + initialize: function (editor) { + if (typeof Radzen.openPopup === "function" && Radzen.openPopup !== Oqtane.RadzenTextEditor.openPopup) { + Oqtane.RadzenTextEditor.radzenOpenPopup = Radzen.openPopup; + Radzen.openPopup = Oqtane.RadzenTextEditor.openPopup; + } + }, + openPopup: function () { + Oqtane.RadzenTextEditor.radzenOpenPopup.apply(this, arguments); + var id = arguments[1]; + var popup = document.getElementById(id); + if (popup) { + Oqtane.RadzenTextEditor.updateButtonStyles(popup); + } + }, + setBackgroundColor: function (editor, color) { + editor.getElementsByClassName("rz-html-editor-content")[0].style.backgroundColor = color; + }, + updateDialogLayout: function (editor) { + var dialogs = editor.parentElement.getElementsByClassName('rz-dialog-wrapper'); + for (var dialog of dialogs) { + document.body.appendChild(dialog); + dialog.classList.add('rz-editor-dialog-wrapper', 'text-dark'); + + this.updateButtonStyles(dialog); + } + }, + updateButtonStyles: function (parent) { + var primaryBtns = parent.getElementsByClassName('rz-primary'); + if (primaryBtns) { + for (var btn of primaryBtns) { + btn.classList.remove('rz-button', 'rz-primary'); + btn.classList.add('btn', 'btn-primary'); + } + } + + var secondaryBtns = parent.getElementsByClassName('rz-secondary'); + if (secondaryBtns) { + for (var btn of secondaryBtns) { + btn.classList.remove('rz-button', 'rz-secondary'); + btn.classList.add('btn', 'btn-secondary'); + } + } + } +} \ No newline at end of file From 07341aeebe9627e10bc20dd620a1232ddaebd02d Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 5 Sep 2025 11:02:00 -0400 Subject: [PATCH 55/68] Fix Azure deployment link in README Updated Azure deployment link to use the master branch. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57553e3e..e681e987 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Oqtane is being developed based on some fundamental principles which are outline # Try It Now! Microsoft's Public Cloud (requires an Azure account) -[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Foqtane%2Foqtane.framework%2Fdev%2Fazuredeploy.json) +[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Foqtane%2Foqtane.framework%2Fmaster%2Fazuredeploy.json) A free ASP.NET hosting account. No hidden fees. No credit card required. [![Deploy to MonsterASP.NET](https://www.oqtane.org/files/Public/MonsterASPNET.png)](https://www.monsterasp.net/) From 0c60085e093414af8c6917d0d63d859d636772d7 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 11:05:18 -0400 Subject: [PATCH 56/68] update dependencies in Oqtane.Server.nusepc --- Oqtane.Package/Oqtane.Server.nuspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Package/Oqtane.Server.nuspec b/Oqtane.Package/Oqtane.Server.nuspec index a476c356..0f939c8d 100644 --- a/Oqtane.Package/Oqtane.Server.nuspec +++ b/Oqtane.Package/Oqtane.Server.nuspec @@ -36,9 +36,9 @@ - + - +
From e913c10d5b0a26e0236e510ed9222fa52f16ef60 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 11:13:21 -0400 Subject: [PATCH 57/68] exception handling needs to encapsulate entire method --- Oqtane.Client/Modules/Admin/Jobs/Index.razor | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index ed9c9f41..0bd39b43 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -114,14 +114,14 @@ else private async Task StartJob(int jobId) { - Job _job = await JobService.GetJobAsync(jobId); - if (!_job.IsEnabled) + try { - AddModuleMessage(Localizer["Message.Job.Disabled"], MessageType.Warning); - } - else - { - try + Job _job = await JobService.GetJobAsync(jobId); + if (!_job.IsEnabled) + { + AddModuleMessage(Localizer["Message.Job.Disabled"], MessageType.Warning); + } + else { await JobService.StartJobAsync(jobId); await logger.LogInformation("Job Started {JobId}", jobId); @@ -129,11 +129,11 @@ else _jobs = await JobService.GetJobsAsync(); StateHasChanged(); } - catch (Exception ex) - { - await logger.LogError(ex, "Error Starting Job {JobId} {Error}", jobId, ex.Message); - AddModuleMessage(Localizer["Error.Job.Start"], MessageType.Error); - } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Starting Job {JobId} {Error}", jobId, ex.Message); + AddModuleMessage(Localizer["Error.Job.Start"], MessageType.Error); } } From 27041f464f1943f6bc3179a0e5cbda6f86bee8f4 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 12:32:43 -0400 Subject: [PATCH 58/68] restructure text editors and static assets --- .../QuillJS}/QuillJSTextEditor.razor | 14 +- .../QuillJS/QuillJSTextEditorInterop.cs} | 4 +- .../Radzen}/RadzenTextEditor.razor | 13 +- .../Radzen/RadzenTextEditorDefinitions.cs} | 0 .../Radzen/RadzenTextEditorInterop.cs} | 4 +- .../Radzen/RadzenTextEditorSetting.cs} | 0 .../TextArea}/TextAreaTextEditor.razor | 2 +- Oqtane.Package/Oqtane.Client.nuspec | 1 + Oqtane.Package/Oqtane.Server.nuspec | 24 +- .../wwwroot/css/quill/quill1.3.7.bubble.css | 1173 ----------------- .../wwwroot/css/quill/quill1.3.7.snow.css | 1170 ---------------- .../quilljs}/quill.bubble.css | 0 .../quilljs}/quill.snow.css | 0 .../texteditors/radzen/radzentexteditor.css} | 0 Oqtane.Server/wwwroot/js/quill1.3.7.min.js | 8 - .../quilljs}/quill-blot-formatter.min.js | 0 .../quilljs}/quill-interop.js | 0 .../js/{ => texteditors/quilljs}/quill.min.js | 0 .../quilljs}/quill.min.js.map | 0 .../texteditors/radzen/radzen-interop.js} | 0 Oqtane.Shared/Shared/Constants.cs | 6 +- 21 files changed, 36 insertions(+), 2383 deletions(-) rename Oqtane.Client/Modules/Controls/{ => TextEditors/QuillJS}/QuillJSTextEditor.razor (97%) rename Oqtane.Client/Modules/Controls/{QuillEditorInterop.cs => TextEditors/QuillJS/QuillJSTextEditorInterop.cs} (97%) rename Oqtane.Client/Modules/Controls/{ => TextEditors/Radzen}/RadzenTextEditor.razor (91%) rename Oqtane.Client/Modules/Controls/{RadzenEditorDefinitions.cs => TextEditors/Radzen/RadzenTextEditorDefinitions.cs} (100%) rename Oqtane.Client/Modules/Controls/{RadzenEditorInterop.cs => TextEditors/Radzen/RadzenTextEditorInterop.cs} (92%) rename Oqtane.Client/Modules/Controls/{RadzenEditorSetting.cs => TextEditors/Radzen/RadzenTextEditorSetting.cs} (100%) rename Oqtane.Client/Modules/Controls/{ => TextEditors/TextArea}/TextAreaTextEditor.razor (93%) delete mode 100644 Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css delete mode 100644 Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css rename Oqtane.Server/wwwroot/css/{quill => texteditors/quilljs}/quill.bubble.css (100%) rename Oqtane.Server/wwwroot/css/{quill => texteditors/quilljs}/quill.snow.css (100%) rename Oqtane.Server/wwwroot/{Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css => css/texteditors/radzen/radzentexteditor.css} (100%) delete mode 100644 Oqtane.Server/wwwroot/js/quill1.3.7.min.js rename Oqtane.Server/wwwroot/js/{ => texteditors/quilljs}/quill-blot-formatter.min.js (100%) rename Oqtane.Server/wwwroot/js/{ => texteditors/quilljs}/quill-interop.js (100%) rename Oqtane.Server/wwwroot/js/{ => texteditors/quilljs}/quill.min.js (100%) rename Oqtane.Server/wwwroot/js/{ => texteditors/quilljs}/quill.min.js.map (100%) rename Oqtane.Server/wwwroot/{Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js => js/texteditors/radzen/radzen-interop.js} (100%) diff --git a/Oqtane.Client/Modules/Controls/QuillJSTextEditor.razor b/Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditor.razor similarity index 97% rename from Oqtane.Client/Modules/Controls/QuillJSTextEditor.razor rename to Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditor.razor index cc458f02..296cf14a 100644 --- a/Oqtane.Client/Modules/Controls/QuillJSTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditor.razor @@ -177,14 +177,14 @@
@code { - public string Name => "QuillJS"; + public string Name => "QuillJS Text Editor"; private string resourceType = "Oqtane.Modules.Controls.QuillJSTextEditor, Oqtane.Client"; private bool _settingsLoaded; private bool _initialized = false; - private QuillEditorInterop _interop; + private QuillJSTextEditorInterop _interop; private FileManager _fileManager; private string _activetab = "Rich"; private bool _allowSettings = false; @@ -246,14 +246,14 @@ public override List Resources { get; set; } = new List() { - new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill.min.js", Location = ResourceLocation.Body }, - new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-blot-formatter.min.js", Location = ResourceLocation.Body }, - new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-interop.js", Location = ResourceLocation.Body } + new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/texteditors/quilljs/quill.min.js", Location = ResourceLocation.Body }, + new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/texteditors/quilljs/quill-blot-formatter.min.js", Location = ResourceLocation.Body }, + new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/texteditors/quilljs/quill-interop.js", Location = ResourceLocation.Body } }; protected override void OnInitialized() { - _interop = new QuillEditorInterop(JSRuntime); + _interop = new QuillJSTextEditorInterop(JSRuntime); if (string.IsNullOrEmpty(Placeholder)) { @@ -277,7 +277,7 @@ { // include CSS theme var interop = new Interop(JSRuntime); - await interop.IncludeLink("", "stylesheet", $"{PageState?.Alias.BaseUrl}/css/quill/quill.{_theme}.css", "text/css", "", "", ""); + await interop.IncludeLink("", "stylesheet", $"{PageState?.Alias.BaseUrl}/css/texteditors/quilljs/quill.{_theme}.css", "text/css", "", "", ""); } await base.OnAfterRenderAsync(firstRender); diff --git a/Oqtane.Client/Modules/Controls/QuillEditorInterop.cs b/Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditorInterop.cs similarity index 97% rename from Oqtane.Client/Modules/Controls/QuillEditorInterop.cs rename to Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditorInterop.cs index ed53c4e7..5409bb55 100644 --- a/Oqtane.Client/Modules/Controls/QuillEditorInterop.cs +++ b/Oqtane.Client/Modules/Controls/TextEditors/QuillJS/QuillJSTextEditorInterop.cs @@ -4,11 +4,11 @@ using System.Threading.Tasks; namespace Oqtane.Modules.Controls { - public class QuillEditorInterop + public class QuillJSTextEditorInterop { private readonly IJSRuntime _jsRuntime; - public QuillEditorInterop(IJSRuntime jsRuntime) + public QuillJSTextEditorInterop(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } diff --git a/Oqtane.Client/Modules/Controls/RadzenTextEditor.razor b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditor.razor similarity index 91% rename from Oqtane.Client/Modules/Controls/RadzenTextEditor.razor rename to Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditor.razor index 1b3acd85..3a16bc45 100644 --- a/Oqtane.Client/Modules/Controls/RadzenTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditor.razor @@ -29,7 +29,7 @@ @code { - private Oqtane.Modules.Controls.RadzenEditorInterop _interop; + private Oqtane.Modules.Controls.RadzenTextEditorInterop _interop; private RadzenHtmlEditor _editor; private string _value; private bool _visible = false; @@ -47,26 +47,27 @@ [Parameter] public int Height { get; set; } = 450; - public string Name => "RadzenTextEditor"; + public string Name => "Radzen HTML Editor"; public override List Resources { get; set; } = new List() { - new Resource { ResourceType = ResourceType.Script, Url = "/_content/Radzen.Blazor/Radzen.Blazor.js", Location = ResourceLocation.Head }, - new Resource { ResourceType = ResourceType.Script, Url = "/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js", Location = ResourceLocation.Head }, + new Resource { ResourceType = ResourceType.Script, Url = "_content/Radzen.Blazor/Radzen.Blazor.js", Location = ResourceLocation.Body }, + new Resource { ResourceType = ResourceType.Script, Url = "js/texteditors/radzen/radzen-interop.js", Location = ResourceLocation.Body } }; protected override void OnInitialized() { - _interop = new Oqtane.Modules.Controls.RadzenEditorInterop(JSRuntime); + _interop = new Oqtane.Modules.Controls.RadzenTextEditorInterop(JSRuntime); } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); + if (firstRender) { var interop = new Interop(JSRuntime); - await interop.IncludeLink("", "stylesheet", $"/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css", "text/css", "", "", ""); + await interop.IncludeLink("", "stylesheet", $"{PageState?.Alias.BaseUrl}/css/texteditors/radzen/radzentexteditor.css", "text/css", "", "", ""); await LoadSettings(); _visible = true; StateHasChanged(); diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorDefinitions.cs similarity index 100% rename from Oqtane.Client/Modules/Controls/RadzenEditorDefinitions.cs rename to Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorDefinitions.cs diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorInterop.cs similarity index 92% rename from Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs rename to Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorInterop.cs index b9ddcfb0..7b8df8a5 100644 --- a/Oqtane.Client/Modules/Controls/RadzenEditorInterop.cs +++ b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorInterop.cs @@ -4,11 +4,11 @@ using System.Threading.Tasks; namespace Oqtane.Modules.Controls { - public class RadzenEditorInterop + public class RadzenTextEditorInterop { private readonly IJSRuntime _jsRuntime; - public RadzenEditorInterop(IJSRuntime jsRuntime) + public RadzenTextEditorInterop(IJSRuntime jsRuntime) { _jsRuntime = jsRuntime; } diff --git a/Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs b/Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorSetting.cs similarity index 100% rename from Oqtane.Client/Modules/Controls/RadzenEditorSetting.cs rename to Oqtane.Client/Modules/Controls/TextEditors/Radzen/RadzenTextEditorSetting.cs diff --git a/Oqtane.Client/Modules/Controls/TextAreaTextEditor.razor b/Oqtane.Client/Modules/Controls/TextEditors/TextArea/TextAreaTextEditor.razor similarity index 93% rename from Oqtane.Client/Modules/Controls/TextAreaTextEditor.razor rename to Oqtane.Client/Modules/Controls/TextEditors/TextArea/TextAreaTextEditor.razor index f8bb9565..c8f91e47 100644 --- a/Oqtane.Client/Modules/Controls/TextAreaTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/TextEditors/TextArea/TextAreaTextEditor.razor @@ -7,7 +7,7 @@
@code { - public string Name => "TextArea"; + public string Name => "Basic Text Editor"; private ElementReference _editor; private string _content; diff --git a/Oqtane.Package/Oqtane.Client.nuspec b/Oqtane.Package/Oqtane.Client.nuspec index 37bdefe9..9b47c86a 100644 --- a/Oqtane.Package/Oqtane.Client.nuspec +++ b/Oqtane.Package/Oqtane.Client.nuspec @@ -23,6 +23,7 @@ + diff --git a/Oqtane.Package/Oqtane.Server.nuspec b/Oqtane.Package/Oqtane.Server.nuspec index 0f939c8d..7881d079 100644 --- a/Oqtane.Package/Oqtane.Server.nuspec +++ b/Oqtane.Package/Oqtane.Server.nuspec @@ -20,25 +20,25 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css deleted file mode 100644 index 15661dda..00000000 --- a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css +++ /dev/null @@ -1,1173 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -.ql-container { - box-sizing: border-box; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - height: 100%; - margin: 0px; - position: relative; -} - - .ql-container.ql-disabled .ql-tooltip { - visibility: hidden; - } - - .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { - pointer-events: none; - } - -.ql-clipboard { - left: -100000px; - height: 1px; - overflow-y: hidden; - position: absolute; - top: 50%; -} - - .ql-clipboard p { - margin: 0; - padding: 0; - } - -.ql-editor { - box-sizing: border-box; - line-height: 1.42; - height: 100%; - outline: none; - overflow-y: auto; - padding: 12px 15px; - tab-size: 4; - -moz-tab-size: 4; - text-align: left; - white-space: pre-wrap; - word-wrap: break-word; -} - - .ql-editor > * { - cursor: text; - } - - .ql-editor p, - .ql-editor ol, - .ql-editor ul, - .ql-editor pre, - .ql-editor blockquote, - .ql-editor h1, - .ql-editor h2, - .ql-editor h3, - .ql-editor h4, - .ql-editor h5, - .ql-editor h6 { - margin: 0; - padding: 0; - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol, - .ql-editor ul { - padding-left: 1.5em; - } - - .ql-editor ol > li, - .ql-editor ul > li { - list-style-type: none; - } - - .ql-editor ul > li::before { - content: '\2022'; - } - - .ql-editor ul[data-checked=true], - .ql-editor ul[data-checked=false] { - pointer-events: none; - } - - .ql-editor ul[data-checked=true] > li *, - .ql-editor ul[data-checked=false] > li * { - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before, - .ql-editor ul[data-checked=false] > li::before { - color: #777; - cursor: pointer; - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before { - content: '\2611'; - } - - .ql-editor ul[data-checked=false] > li::before { - content: '\2610'; - } - - .ql-editor li::before { - display: inline-block; - white-space: nowrap; - width: 1.2em; - } - - .ql-editor li:not(.ql-direction-rtl)::before { - margin-left: -1.5em; - margin-right: 0.3em; - text-align: right; - } - - .ql-editor li.ql-direction-rtl::before { - margin-left: 0.3em; - margin-right: -1.5em; - } - - .ql-editor ol li:not(.ql-direction-rtl), - .ql-editor ul li:not(.ql-direction-rtl) { - padding-left: 1.5em; - } - - .ql-editor ol li.ql-direction-rtl, - .ql-editor ul li.ql-direction-rtl { - padding-right: 1.5em; - } - - .ql-editor ol li { - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - counter-increment: list-0; - } - - .ql-editor ol li:before { - content: counter(list-0, decimal) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-increment: list-1; - } - - .ql-editor ol li.ql-indent-1:before { - content: counter(list-1, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-2 { - counter-increment: list-2; - } - - .ql-editor ol li.ql-indent-2:before { - content: counter(list-2, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-2 { - counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-3 { - counter-increment: list-3; - } - - .ql-editor ol li.ql-indent-3:before { - content: counter(list-3, decimal) '. '; - } - - .ql-editor ol li.ql-indent-3 { - counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-4 { - counter-increment: list-4; - } - - .ql-editor ol li.ql-indent-4:before { - content: counter(list-4, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-4 { - counter-reset: list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-5 { - counter-increment: list-5; - } - - .ql-editor ol li.ql-indent-5:before { - content: counter(list-5, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-5 { - counter-reset: list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-6 { - counter-increment: list-6; - } - - .ql-editor ol li.ql-indent-6:before { - content: counter(list-6, decimal) '. '; - } - - .ql-editor ol li.ql-indent-6 { - counter-reset: list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-7 { - counter-increment: list-7; - } - - .ql-editor ol li.ql-indent-7:before { - content: counter(list-7, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-7 { - counter-reset: list-8 list-9; - } - - .ql-editor ol li.ql-indent-8 { - counter-increment: list-8; - } - - .ql-editor ol li.ql-indent-8:before { - content: counter(list-8, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-8 { - counter-reset: list-9; - } - - .ql-editor ol li.ql-indent-9 { - counter-increment: list-9; - } - - .ql-editor ol li.ql-indent-9:before { - content: counter(list-9, decimal) '. '; - } - - .ql-editor .ql-indent-1:not(.ql-direction-rtl) { - padding-left: 3em; - } - - .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { - padding-left: 4.5em; - } - - .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 3em; - } - - .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 4.5em; - } - - .ql-editor .ql-indent-2:not(.ql-direction-rtl) { - padding-left: 6em; - } - - .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { - padding-left: 7.5em; - } - - .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 6em; - } - - .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 7.5em; - } - - .ql-editor .ql-indent-3:not(.ql-direction-rtl) { - padding-left: 9em; - } - - .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { - padding-left: 10.5em; - } - - .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 9em; - } - - .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 10.5em; - } - - .ql-editor .ql-indent-4:not(.ql-direction-rtl) { - padding-left: 12em; - } - - .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { - padding-left: 13.5em; - } - - .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 12em; - } - - .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 13.5em; - } - - .ql-editor .ql-indent-5:not(.ql-direction-rtl) { - padding-left: 15em; - } - - .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { - padding-left: 16.5em; - } - - .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 15em; - } - - .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 16.5em; - } - - .ql-editor .ql-indent-6:not(.ql-direction-rtl) { - padding-left: 18em; - } - - .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { - padding-left: 19.5em; - } - - .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 18em; - } - - .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 19.5em; - } - - .ql-editor .ql-indent-7:not(.ql-direction-rtl) { - padding-left: 21em; - } - - .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { - padding-left: 22.5em; - } - - .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 21em; - } - - .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 22.5em; - } - - .ql-editor .ql-indent-8:not(.ql-direction-rtl) { - padding-left: 24em; - } - - .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { - padding-left: 25.5em; - } - - .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 24em; - } - - .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 25.5em; - } - - .ql-editor .ql-indent-9:not(.ql-direction-rtl) { - padding-left: 27em; - } - - .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { - padding-left: 28.5em; - } - - .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 27em; - } - - .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 28.5em; - } - - .ql-editor .ql-video { - display: block; - max-width: 100%; - } - - .ql-editor .ql-video.ql-align-center { - margin: 0 auto; - } - - .ql-editor .ql-video.ql-align-right { - margin: 0 0 0 auto; - } - - .ql-editor .ql-bg-black { - background-color: #000; - } - - .ql-editor .ql-bg-red { - background-color: #e60000; - } - - .ql-editor .ql-bg-orange { - background-color: #f90; - } - - .ql-editor .ql-bg-yellow { - background-color: #ff0; - } - - .ql-editor .ql-bg-green { - background-color: #008a00; - } - - .ql-editor .ql-bg-blue { - background-color: #06c; - } - - .ql-editor .ql-bg-purple { - background-color: #93f; - } - - .ql-editor .ql-color-white { - color: #fff; - } - - .ql-editor .ql-color-red { - color: #e60000; - } - - .ql-editor .ql-color-orange { - color: #f90; - } - - .ql-editor .ql-color-yellow { - color: #ff0; - } - - .ql-editor .ql-color-green { - color: #008a00; - } - - .ql-editor .ql-color-blue { - color: #06c; - } - - .ql-editor .ql-color-purple { - color: #93f; - } - - .ql-editor .ql-font-serif { - font-family: Georgia, Times New Roman, serif; - } - - .ql-editor .ql-font-monospace { - font-family: Monaco, Courier New, monospace; - } - - .ql-editor .ql-size-small { - font-size: 0.75em; - } - - .ql-editor .ql-size-large { - font-size: 1.5em; - } - - .ql-editor .ql-size-huge { - font-size: 2.5em; - } - - .ql-editor .ql-direction-rtl { - direction: rtl; - text-align: inherit; - } - - .ql-editor .ql-align-center { - text-align: center; - } - - .ql-editor .ql-align-justify { - text-align: justify; - } - - .ql-editor .ql-align-right { - text-align: right; - } - - .ql-editor.ql-blank::before { - color: rgba(0,0,0,0.6); - content: attr(data-placeholder); - font-style: italic; - left: 15px; - pointer-events: none; - position: absolute; - right: 15px; - } - -.ql-bubble.ql-toolbar:after, -.ql-bubble .ql-toolbar:after { - clear: both; - content: ''; - display: table; -} - -.ql-bubble.ql-toolbar button, -.ql-bubble .ql-toolbar button { - background: none; - border: none; - cursor: pointer; - display: inline-block; - float: left; - height: 24px; - padding: 3px 5px; - width: 28px; -} - - .ql-bubble.ql-toolbar button svg, - .ql-bubble .ql-toolbar button svg { - float: left; - height: 100%; - } - - .ql-bubble.ql-toolbar button:active:hover, - .ql-bubble .ql-toolbar button:active:hover { - outline: none; - } - -.ql-bubble.ql-toolbar input.ql-image[type=file], -.ql-bubble .ql-toolbar input.ql-image[type=file] { - display: none; -} - -.ql-bubble.ql-toolbar button:hover, -.ql-bubble .ql-toolbar button:hover, -.ql-bubble.ql-toolbar button:focus, -.ql-bubble .ql-toolbar button:focus, -.ql-bubble.ql-toolbar button.ql-active, -.ql-bubble .ql-toolbar button.ql-active, -.ql-bubble.ql-toolbar .ql-picker-label:hover, -.ql-bubble .ql-toolbar .ql-picker-label:hover, -.ql-bubble.ql-toolbar .ql-picker-label.ql-active, -.ql-bubble .ql-toolbar .ql-picker-label.ql-active, -.ql-bubble.ql-toolbar .ql-picker-item:hover, -.ql-bubble .ql-toolbar .ql-picker-item:hover, -.ql-bubble.ql-toolbar .ql-picker-item.ql-selected, -.ql-bubble .ql-toolbar .ql-picker-item.ql-selected { - color: #fff; -} - - .ql-bubble.ql-toolbar button:hover .ql-fill, - .ql-bubble .ql-toolbar button:hover .ql-fill, - .ql-bubble.ql-toolbar button:focus .ql-fill, - .ql-bubble .ql-toolbar button:focus .ql-fill, - .ql-bubble.ql-toolbar button.ql-active .ql-fill, - .ql-bubble .ql-toolbar button.ql-active .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { - fill: #fff; - } - - .ql-bubble.ql-toolbar button:hover .ql-stroke, - .ql-bubble .ql-toolbar button:hover .ql-stroke, - .ql-bubble.ql-toolbar button:focus .ql-stroke, - .ql-bubble .ql-toolbar button:focus .ql-stroke, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-bubble.ql-toolbar button:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar button:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar button:focus .ql-stroke-miter, - .ql-bubble .ql-toolbar button:focus .ql-stroke-miter, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { - stroke: #fff; - } - -@media (pointer: coarse) { - .ql-bubble.ql-toolbar button:hover:not(.ql-active), - .ql-bubble .ql-toolbar button:hover:not(.ql-active) { - color: #ccc; - } - - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { - fill: #ccc; - } - - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { - stroke: #ccc; - } -} - -.ql-bubble { - box-sizing: border-box; -} - - .ql-bubble * { - box-sizing: border-box; - } - - .ql-bubble .ql-hidden { - display: none; - } - - .ql-bubble .ql-out-bottom, - .ql-bubble .ql-out-top { - visibility: hidden; - } - - .ql-bubble .ql-tooltip { - position: absolute; - transform: translateY(10px); - } - - .ql-bubble .ql-tooltip a { - cursor: pointer; - text-decoration: none; - } - - .ql-bubble .ql-tooltip.ql-flip { - transform: translateY(-10px); - } - - .ql-bubble .ql-formats { - display: inline-block; - vertical-align: middle; - } - - .ql-bubble .ql-formats:after { - clear: both; - content: ''; - display: table; - } - - .ql-bubble .ql-stroke { - fill: none; - stroke: #ccc; - stroke-linecap: round; - stroke-linejoin: round; - stroke-width: 2; - } - - .ql-bubble .ql-stroke-miter { - fill: none; - stroke: #ccc; - stroke-miterlimit: 10; - stroke-width: 2; - } - - .ql-bubble .ql-fill, - .ql-bubble .ql-stroke.ql-fill { - fill: #ccc; - } - - .ql-bubble .ql-empty { - fill: none; - } - - .ql-bubble .ql-even { - fill-rule: evenodd; - } - - .ql-bubble .ql-thin, - .ql-bubble .ql-stroke.ql-thin { - stroke-width: 1; - } - - .ql-bubble .ql-transparent { - opacity: 0.4; - } - - .ql-bubble .ql-direction svg:last-child { - display: none; - } - - .ql-bubble .ql-direction.ql-active svg:last-child { - display: inline; - } - - .ql-bubble .ql-direction.ql-active svg:first-child { - display: none; - } - - .ql-bubble .ql-editor h1 { - font-size: 2em; - } - - .ql-bubble .ql-editor h2 { - font-size: 1.5em; - } - - .ql-bubble .ql-editor h3 { - font-size: 1.17em; - } - - .ql-bubble .ql-editor h4 { - font-size: 1em; - } - - .ql-bubble .ql-editor h5 { - font-size: 0.83em; - } - - .ql-bubble .ql-editor h6 { - font-size: 0.67em; - } - - .ql-bubble .ql-editor a { - text-decoration: underline; - } - - .ql-bubble .ql-editor blockquote { - border-left: 4px solid #ccc; - margin-bottom: 5px; - margin-top: 5px; - padding-left: 16px; - } - - .ql-bubble .ql-editor code, - .ql-bubble .ql-editor pre { - background-color: #f0f0f0; - border-radius: 3px; - } - - .ql-bubble .ql-editor pre { - white-space: pre-wrap; - margin-bottom: 5px; - margin-top: 5px; - padding: 5px 10px; - } - - .ql-bubble .ql-editor code { - font-size: 85%; - padding: 2px 4px; - } - - .ql-bubble .ql-editor pre.ql-syntax { - background-color: #23241f; - color: #f8f8f2; - overflow: visible; - } - - .ql-bubble .ql-editor img { - max-width: 100%; - } - - .ql-bubble .ql-picker { - color: #ccc; - display: inline-block; - float: left; - font-size: 14px; - font-weight: 500; - height: 24px; - position: relative; - vertical-align: middle; - } - - .ql-bubble .ql-picker-label { - cursor: pointer; - display: inline-block; - height: 100%; - padding-left: 8px; - padding-right: 2px; - position: relative; - width: 100%; - } - - .ql-bubble .ql-picker-label::before { - display: inline-block; - line-height: 22px; - } - - .ql-bubble .ql-picker-options { - background-color: #444; - display: none; - min-width: 100%; - padding: 4px 8px; - position: absolute; - white-space: nowrap; - } - - .ql-bubble .ql-picker-options .ql-picker-item { - cursor: pointer; - display: block; - padding-bottom: 5px; - padding-top: 5px; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label { - color: #777; - z-index: 2; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill { - fill: #777; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke { - stroke: #777; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-options { - display: block; - margin-top: -1px; - top: 100%; - z-index: 1; - } - - .ql-bubble .ql-color-picker, - .ql-bubble .ql-icon-picker { - width: 28px; - } - - .ql-bubble .ql-color-picker .ql-picker-label, - .ql-bubble .ql-icon-picker .ql-picker-label { - padding: 2px 4px; - } - - .ql-bubble .ql-color-picker .ql-picker-label svg, - .ql-bubble .ql-icon-picker .ql-picker-label svg { - right: 4px; - } - - .ql-bubble .ql-icon-picker .ql-picker-options { - padding: 4px 0px; - } - - .ql-bubble .ql-icon-picker .ql-picker-item { - height: 24px; - width: 24px; - padding: 2px 4px; - } - - .ql-bubble .ql-color-picker .ql-picker-options { - padding: 3px 5px; - width: 152px; - } - - .ql-bubble .ql-color-picker .ql-picker-item { - border: 1px solid transparent; - float: left; - height: 16px; - margin: 2px; - padding: 0px; - width: 16px; - } - - .ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { - position: absolute; - margin-top: -9px; - right: 0; - top: 50%; - width: 18px; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { - content: attr(data-label); - } - - .ql-bubble .ql-picker.ql-header { - width: 98px; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item::before { - content: 'Normal'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: 'Heading 1'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: 'Heading 2'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: 'Heading 3'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: 'Heading 4'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: 'Heading 5'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: 'Heading 6'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - font-size: 2em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - font-size: 1.5em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - font-size: 1.17em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - font-size: 1em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - font-size: 0.83em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - font-size: 0.67em; - } - - .ql-bubble .ql-picker.ql-font { - width: 108px; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item::before { - content: 'Sans Serif'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - content: 'Serif'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - content: 'Monospace'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - font-family: Georgia, Times New Roman, serif; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - font-family: Monaco, Courier New, monospace; - } - - .ql-bubble .ql-picker.ql-size { - width: 98px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item::before { - content: 'Normal'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - content: 'Small'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - content: 'Large'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - content: 'Huge'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - font-size: 10px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - font-size: 18px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - font-size: 32px; - } - - .ql-bubble .ql-color-picker.ql-background .ql-picker-item { - background-color: #fff; - } - - .ql-bubble .ql-color-picker.ql-color .ql-picker-item { - background-color: #000; - } - - .ql-bubble .ql-toolbar .ql-formats { - margin: 8px 12px 8px 0px; - } - - .ql-bubble .ql-toolbar .ql-formats:first-child { - margin-left: 12px; - } - - .ql-bubble .ql-color-picker svg { - margin: 1px; - } - - .ql-bubble .ql-color-picker .ql-picker-item.ql-selected, - .ql-bubble .ql-color-picker .ql-picker-item:hover { - border-color: #fff; - } - - .ql-bubble .ql-tooltip { - background-color: #444; - border-radius: 25px; - color: #fff; - } - - .ql-bubble .ql-tooltip-arrow { - border-left: 6px solid transparent; - border-right: 6px solid transparent; - content: " "; - display: block; - left: 50%; - margin-left: -6px; - position: absolute; - } - - .ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow { - border-bottom: 6px solid #444; - top: -6px; - } - - .ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow { - border-top: 6px solid #444; - bottom: -6px; - } - - .ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor { - display: block; - } - - .ql-bubble .ql-tooltip.ql-editing .ql-formats { - visibility: hidden; - } - - .ql-bubble .ql-tooltip-editor { - display: none; - } - - .ql-bubble .ql-tooltip-editor input[type=text] { - background: transparent; - border: none; - color: #fff; - font-size: 13px; - height: 100%; - outline: none; - padding: 10px 20px; - position: absolute; - width: 100%; - } - - .ql-bubble .ql-tooltip-editor a { - top: 10px; - position: absolute; - right: 20px; - } - - .ql-bubble .ql-tooltip-editor a:before { - color: #ccc; - content: "\D7"; - font-size: 16px; - font-weight: bold; - } - -.ql-container.ql-bubble:not(.ql-disabled) a { - position: relative; - white-space: nowrap; -} - - .ql-container.ql-bubble:not(.ql-disabled) a::before { - background-color: #444; - border-radius: 15px; - top: -5px; - font-size: 12px; - color: #fff; - content: attr(href); - font-weight: normal; - overflow: hidden; - padding: 5px 15px; - text-decoration: none; - z-index: 1; - } - - .ql-container.ql-bubble:not(.ql-disabled) a::after { - border-top: 6px solid #444; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - top: 0; - content: " "; - height: 0; - width: 0; - } - - .ql-container.ql-bubble:not(.ql-disabled) a::before, - .ql-container.ql-bubble:not(.ql-disabled) a::after { - left: 0; - margin-left: 50%; - position: absolute; - transform: translate(-50%, -100%); - transition: visibility 0s ease 200ms; - visibility: hidden; - } - - .ql-container.ql-bubble:not(.ql-disabled) a:hover::before, - .ql-container.ql-bubble:not(.ql-disabled) a:hover::after { - visibility: visible; - } diff --git a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css deleted file mode 100644 index 31ffab18..00000000 --- a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css +++ /dev/null @@ -1,1170 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -.ql-container { - box-sizing: border-box; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - height: 100%; - margin: 0px; - position: relative; -} - - .ql-container.ql-disabled .ql-tooltip { - visibility: hidden; - } - - .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { - pointer-events: none; - } - -.ql-clipboard { - left: -100000px; - height: 1px; - overflow-y: hidden; - position: absolute; - top: 50%; -} - - .ql-clipboard p { - margin: 0; - padding: 0; - } - -.ql-editor { - box-sizing: border-box; - line-height: 1.42; - height: 100%; - outline: none; - overflow-y: auto; - padding: 12px 15px; - tab-size: 4; - -moz-tab-size: 4; - text-align: left; - white-space: pre-wrap; - word-wrap: break-word; -} - - .ql-editor > * { - cursor: text; - } - - .ql-editor p, - .ql-editor ol, - .ql-editor ul, - .ql-editor pre, - .ql-editor blockquote, - .ql-editor h1, - .ql-editor h2, - .ql-editor h3, - .ql-editor h4, - .ql-editor h5, - .ql-editor h6 { - margin: 0; - padding: 0; - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol, - .ql-editor ul { - padding-left: 1.5em; - } - - .ql-editor ol > li, - .ql-editor ul > li { - list-style-type: none; - } - - .ql-editor ul > li::before { - content: '\2022'; - } - - .ql-editor ul[data-checked=true], - .ql-editor ul[data-checked=false] { - pointer-events: none; - } - - .ql-editor ul[data-checked=true] > li *, - .ql-editor ul[data-checked=false] > li * { - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before, - .ql-editor ul[data-checked=false] > li::before { - color: #777; - cursor: pointer; - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before { - content: '\2611'; - } - - .ql-editor ul[data-checked=false] > li::before { - content: '\2610'; - } - - .ql-editor li::before { - display: inline-block; - white-space: nowrap; - width: 1.2em; - } - - .ql-editor li:not(.ql-direction-rtl)::before { - margin-left: -1.5em; - margin-right: 0.3em; - text-align: right; - } - - .ql-editor li.ql-direction-rtl::before { - margin-left: 0.3em; - margin-right: -1.5em; - } - - .ql-editor ol li:not(.ql-direction-rtl), - .ql-editor ul li:not(.ql-direction-rtl) { - padding-left: 1.5em; - } - - .ql-editor ol li.ql-direction-rtl, - .ql-editor ul li.ql-direction-rtl { - padding-right: 1.5em; - } - - .ql-editor ol li { - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - counter-increment: list-0; - } - - .ql-editor ol li:before { - content: counter(list-0, decimal) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-increment: list-1; - } - - .ql-editor ol li.ql-indent-1:before { - content: counter(list-1, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-2 { - counter-increment: list-2; - } - - .ql-editor ol li.ql-indent-2:before { - content: counter(list-2, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-2 { - counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-3 { - counter-increment: list-3; - } - - .ql-editor ol li.ql-indent-3:before { - content: counter(list-3, decimal) '. '; - } - - .ql-editor ol li.ql-indent-3 { - counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-4 { - counter-increment: list-4; - } - - .ql-editor ol li.ql-indent-4:before { - content: counter(list-4, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-4 { - counter-reset: list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-5 { - counter-increment: list-5; - } - - .ql-editor ol li.ql-indent-5:before { - content: counter(list-5, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-5 { - counter-reset: list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-6 { - counter-increment: list-6; - } - - .ql-editor ol li.ql-indent-6:before { - content: counter(list-6, decimal) '. '; - } - - .ql-editor ol li.ql-indent-6 { - counter-reset: list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-7 { - counter-increment: list-7; - } - - .ql-editor ol li.ql-indent-7:before { - content: counter(list-7, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-7 { - counter-reset: list-8 list-9; - } - - .ql-editor ol li.ql-indent-8 { - counter-increment: list-8; - } - - .ql-editor ol li.ql-indent-8:before { - content: counter(list-8, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-8 { - counter-reset: list-9; - } - - .ql-editor ol li.ql-indent-9 { - counter-increment: list-9; - } - - .ql-editor ol li.ql-indent-9:before { - content: counter(list-9, decimal) '. '; - } - - .ql-editor .ql-indent-1:not(.ql-direction-rtl) { - padding-left: 3em; - } - - .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { - padding-left: 4.5em; - } - - .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 3em; - } - - .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 4.5em; - } - - .ql-editor .ql-indent-2:not(.ql-direction-rtl) { - padding-left: 6em; - } - - .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { - padding-left: 7.5em; - } - - .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 6em; - } - - .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 7.5em; - } - - .ql-editor .ql-indent-3:not(.ql-direction-rtl) { - padding-left: 9em; - } - - .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { - padding-left: 10.5em; - } - - .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 9em; - } - - .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 10.5em; - } - - .ql-editor .ql-indent-4:not(.ql-direction-rtl) { - padding-left: 12em; - } - - .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { - padding-left: 13.5em; - } - - .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 12em; - } - - .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 13.5em; - } - - .ql-editor .ql-indent-5:not(.ql-direction-rtl) { - padding-left: 15em; - } - - .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { - padding-left: 16.5em; - } - - .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 15em; - } - - .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 16.5em; - } - - .ql-editor .ql-indent-6:not(.ql-direction-rtl) { - padding-left: 18em; - } - - .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { - padding-left: 19.5em; - } - - .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 18em; - } - - .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 19.5em; - } - - .ql-editor .ql-indent-7:not(.ql-direction-rtl) { - padding-left: 21em; - } - - .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { - padding-left: 22.5em; - } - - .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 21em; - } - - .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 22.5em; - } - - .ql-editor .ql-indent-8:not(.ql-direction-rtl) { - padding-left: 24em; - } - - .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { - padding-left: 25.5em; - } - - .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 24em; - } - - .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 25.5em; - } - - .ql-editor .ql-indent-9:not(.ql-direction-rtl) { - padding-left: 27em; - } - - .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { - padding-left: 28.5em; - } - - .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 27em; - } - - .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 28.5em; - } - - .ql-editor .ql-video { - display: block; - max-width: 100%; - } - - .ql-editor .ql-video.ql-align-center { - margin: 0 auto; - } - - .ql-editor .ql-video.ql-align-right { - margin: 0 0 0 auto; - } - - .ql-editor .ql-bg-black { - background-color: #000; - } - - .ql-editor .ql-bg-red { - background-color: #e60000; - } - - .ql-editor .ql-bg-orange { - background-color: #f90; - } - - .ql-editor .ql-bg-yellow { - background-color: #ff0; - } - - .ql-editor .ql-bg-green { - background-color: #008a00; - } - - .ql-editor .ql-bg-blue { - background-color: #06c; - } - - .ql-editor .ql-bg-purple { - background-color: #93f; - } - - .ql-editor .ql-color-white { - color: #fff; - } - - .ql-editor .ql-color-red { - color: #e60000; - } - - .ql-editor .ql-color-orange { - color: #f90; - } - - .ql-editor .ql-color-yellow { - color: #ff0; - } - - .ql-editor .ql-color-green { - color: #008a00; - } - - .ql-editor .ql-color-blue { - color: #06c; - } - - .ql-editor .ql-color-purple { - color: #93f; - } - - .ql-editor .ql-font-serif { - font-family: Georgia, Times New Roman, serif; - } - - .ql-editor .ql-font-monospace { - font-family: Monaco, Courier New, monospace; - } - - .ql-editor .ql-size-small { - font-size: 0.75em; - } - - .ql-editor .ql-size-large { - font-size: 1.5em; - } - - .ql-editor .ql-size-huge { - font-size: 2.5em; - } - - .ql-editor .ql-direction-rtl { - direction: rtl; - text-align: inherit; - } - - .ql-editor .ql-align-center { - text-align: center; - } - - .ql-editor .ql-align-justify { - text-align: justify; - } - - .ql-editor .ql-align-right { - text-align: right; - } - - .ql-editor.ql-blank::before { - color: rgba(0,0,0,0.6); - content: attr(data-placeholder); - font-style: italic; - left: 15px; - pointer-events: none; - position: absolute; - right: 15px; - } - -.ql-snow.ql-toolbar:after, -.ql-snow .ql-toolbar:after { - clear: both; - content: ''; - display: table; -} - -.ql-snow.ql-toolbar button, -.ql-snow .ql-toolbar button { - background: none; - border: none; - cursor: pointer; - display: inline-block; - float: left; - height: 24px; - padding: 3px 5px; - width: 28px; -} - - .ql-snow.ql-toolbar button svg, - .ql-snow .ql-toolbar button svg { - float: left; - height: 100%; - } - - .ql-snow.ql-toolbar button:active:hover, - .ql-snow .ql-toolbar button:active:hover { - outline: none; - } - -.ql-snow.ql-toolbar input.ql-image[type=file], -.ql-snow .ql-toolbar input.ql-image[type=file] { - display: none; -} - -.ql-snow.ql-toolbar button:hover, -.ql-snow .ql-toolbar button:hover, -.ql-snow.ql-toolbar button:focus, -.ql-snow .ql-toolbar button:focus, -.ql-snow.ql-toolbar button.ql-active, -.ql-snow .ql-toolbar button.ql-active, -.ql-snow.ql-toolbar .ql-picker-label:hover, -.ql-snow .ql-toolbar .ql-picker-label:hover, -.ql-snow.ql-toolbar .ql-picker-label.ql-active, -.ql-snow .ql-toolbar .ql-picker-label.ql-active, -.ql-snow.ql-toolbar .ql-picker-item:hover, -.ql-snow .ql-toolbar .ql-picker-item:hover, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected { - color: #06c; -} - - .ql-snow.ql-toolbar button:hover .ql-fill, - .ql-snow .ql-toolbar button:hover .ql-fill, - .ql-snow.ql-toolbar button:focus .ql-fill, - .ql-snow .ql-toolbar button:focus .ql-fill, - .ql-snow.ql-toolbar button.ql-active .ql-fill, - .ql-snow .ql-toolbar button.ql-active .ql-fill, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { - fill: #06c; - } - - .ql-snow.ql-toolbar button:hover .ql-stroke, - .ql-snow .ql-toolbar button:hover .ql-stroke, - .ql-snow.ql-toolbar button:focus .ql-stroke, - .ql-snow .ql-toolbar button:focus .ql-stroke, - .ql-snow.ql-toolbar button.ql-active .ql-stroke, - .ql-snow .ql-toolbar button.ql-active .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-snow.ql-toolbar button:hover .ql-stroke-miter, - .ql-snow .ql-toolbar button:hover .ql-stroke-miter, - .ql-snow.ql-toolbar button:focus .ql-stroke-miter, - .ql-snow .ql-toolbar button:focus .ql-stroke-miter, - .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, - .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { - stroke: #06c; - } - -@media (pointer: coarse) { - .ql-snow.ql-toolbar button:hover:not(.ql-active), - .ql-snow .ql-toolbar button:hover:not(.ql-active) { - color: #444; - } - - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { - fill: #444; - } - - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { - stroke: #444; - } -} - -.ql-snow { - box-sizing: border-box; -} - - .ql-snow * { - box-sizing: border-box; - } - - .ql-snow .ql-hidden { - display: none; - } - - .ql-snow .ql-out-bottom, - .ql-snow .ql-out-top { - visibility: hidden; - } - - .ql-snow .ql-tooltip { - position: absolute; - transform: translateY(10px); - } - - .ql-snow .ql-tooltip a { - cursor: pointer; - text-decoration: none; - } - - .ql-snow .ql-tooltip.ql-flip { - transform: translateY(-10px); - } - - .ql-snow .ql-formats { - display: inline-block; - vertical-align: middle; - } - - .ql-snow .ql-formats:after { - clear: both; - content: ''; - display: table; - } - - .ql-snow .ql-stroke { - fill: none; - stroke: #444; - stroke-linecap: round; - stroke-linejoin: round; - stroke-width: 2; - } - - .ql-snow .ql-stroke-miter { - fill: none; - stroke: #444; - stroke-miterlimit: 10; - stroke-width: 2; - } - - .ql-snow .ql-fill, - .ql-snow .ql-stroke.ql-fill { - fill: #444; - } - - .ql-snow .ql-empty { - fill: none; - } - - .ql-snow .ql-even { - fill-rule: evenodd; - } - - .ql-snow .ql-thin, - .ql-snow .ql-stroke.ql-thin { - stroke-width: 1; - } - - .ql-snow .ql-transparent { - opacity: 0.4; - } - - .ql-snow .ql-direction svg:last-child { - display: none; - } - - .ql-snow .ql-direction.ql-active svg:last-child { - display: inline; - } - - .ql-snow .ql-direction.ql-active svg:first-child { - display: none; - } - - .ql-snow .ql-editor h1 { - font-size: 2em; - } - - .ql-snow .ql-editor h2 { - font-size: 1.5em; - } - - .ql-snow .ql-editor h3 { - font-size: 1.17em; - } - - .ql-snow .ql-editor h4 { - font-size: 1em; - } - - .ql-snow .ql-editor h5 { - font-size: 0.83em; - } - - .ql-snow .ql-editor h6 { - font-size: 0.67em; - } - - .ql-snow .ql-editor a { - text-decoration: underline; - } - - .ql-snow .ql-editor blockquote { - border-left: 4px solid #ccc; - margin-bottom: 5px; - margin-top: 5px; - padding-left: 16px; - } - - .ql-snow .ql-editor code, - .ql-snow .ql-editor pre { - background-color: #f0f0f0; - border-radius: 3px; - } - - .ql-snow .ql-editor pre { - white-space: pre-wrap; - margin-bottom: 5px; - margin-top: 5px; - padding: 5px 10px; - } - - .ql-snow .ql-editor code { - font-size: 85%; - padding: 2px 4px; - } - - .ql-snow .ql-editor pre.ql-syntax { - background-color: #23241f; - color: #f8f8f2; - overflow: visible; - } - - .ql-snow .ql-editor img { - max-width: 100%; - } - - .ql-snow .ql-picker { - color: #444; - display: inline-block; - float: left; - font-size: 14px; - font-weight: 500; - height: 24px; - position: relative; - vertical-align: middle; - } - - .ql-snow .ql-picker-label { - cursor: pointer; - display: inline-block; - height: 100%; - padding-left: 8px; - padding-right: 2px; - position: relative; - width: 100%; - } - - .ql-snow .ql-picker-label::before { - display: inline-block; - line-height: 22px; - } - - .ql-snow .ql-picker-options { - background-color: #fff; - display: none; - min-width: 100%; - padding: 4px 8px; - position: absolute; - white-space: nowrap; - } - - .ql-snow .ql-picker-options .ql-picker-item { - cursor: pointer; - display: block; - padding-bottom: 5px; - padding-top: 5px; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label { - color: #ccc; - z-index: 2; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { - fill: #ccc; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { - stroke: #ccc; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-options { - display: block; - margin-top: -1px; - top: 100%; - z-index: 1; - } - - .ql-snow .ql-color-picker, - .ql-snow .ql-icon-picker { - width: 28px; - } - - .ql-snow .ql-color-picker .ql-picker-label, - .ql-snow .ql-icon-picker .ql-picker-label { - padding: 2px 4px; - } - - .ql-snow .ql-color-picker .ql-picker-label svg, - .ql-snow .ql-icon-picker .ql-picker-label svg { - right: 4px; - } - - .ql-snow .ql-icon-picker .ql-picker-options { - padding: 4px 0px; - } - - .ql-snow .ql-icon-picker .ql-picker-item { - height: 24px; - width: 24px; - padding: 2px 4px; - } - - .ql-snow .ql-color-picker .ql-picker-options { - padding: 3px 5px; - width: 152px; - } - - .ql-snow .ql-color-picker .ql-picker-item { - border: 1px solid transparent; - float: left; - height: 16px; - margin: 2px; - padding: 0px; - width: 16px; - } - - .ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { - position: absolute; - margin-top: -9px; - right: 0; - top: 50%; - width: 18px; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { - content: attr(data-label); - } - - .ql-snow .ql-picker.ql-header { - width: 98px; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label::before, - .ql-snow .ql-picker.ql-header .ql-picker-item::before { - content: 'Normal'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: 'Heading 1'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: 'Heading 2'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: 'Heading 3'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: 'Heading 4'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: 'Heading 5'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: 'Heading 6'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - font-size: 2em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - font-size: 1.5em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - font-size: 1.17em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - font-size: 1em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - font-size: 0.83em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - font-size: 0.67em; - } - - .ql-snow .ql-picker.ql-font { - width: 108px; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label::before, - .ql-snow .ql-picker.ql-font .ql-picker-item::before { - content: 'Sans Serif'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - content: 'Serif'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - content: 'Monospace'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - font-family: Georgia, Times New Roman, serif; - } - - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - font-family: Monaco, Courier New, monospace; - } - - .ql-snow .ql-picker.ql-size { - width: 98px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label::before, - .ql-snow .ql-picker.ql-size .ql-picker-item::before { - content: 'Normal'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - content: 'Small'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - content: 'Large'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - content: 'Huge'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - font-size: 10px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - font-size: 18px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - font-size: 32px; - } - - .ql-snow .ql-color-picker.ql-background .ql-picker-item { - background-color: #fff; - } - - .ql-snow .ql-color-picker.ql-color .ql-picker-item { - background-color: #000; - } - -.ql-toolbar.ql-snow { - border: 1px solid #ccc; - box-sizing: border-box; - font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; - padding: 8px; -} - - .ql-toolbar.ql-snow .ql-formats { - margin-right: 15px; - } - - .ql-toolbar.ql-snow .ql-picker-label { - border: 1px solid transparent; - } - - .ql-toolbar.ql-snow .ql-picker-options { - border: 1px solid transparent; - box-shadow: rgba(0,0,0,0.2) 0 2px 8px; - } - - .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { - border-color: #ccc; - } - - .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { - border-color: #ccc; - } - - .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, - .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { - border-color: #000; - } - - .ql-toolbar.ql-snow + .ql-container.ql-snow { - border-top: 0px; - } - -.ql-snow .ql-tooltip { - background-color: #fff; - border: 1px solid #ccc; - box-shadow: 0px 0px 5px #ddd; - color: #444; - padding: 5px 12px; - white-space: nowrap; -} - - .ql-snow .ql-tooltip::before { - content: "Visit URL:"; - line-height: 26px; - margin-right: 8px; - } - - .ql-snow .ql-tooltip input[type=text] { - display: none; - border: 1px solid #ccc; - font-size: 13px; - height: 26px; - margin: 0px; - padding: 3px 5px; - width: 170px; - } - - .ql-snow .ql-tooltip a.ql-preview { - display: inline-block; - max-width: 200px; - overflow-x: hidden; - text-overflow: ellipsis; - vertical-align: top; - } - - .ql-snow .ql-tooltip a.ql-action::after { - border-right: 1px solid #ccc; - content: 'Edit'; - margin-left: 16px; - padding-right: 8px; - } - - .ql-snow .ql-tooltip a.ql-remove::before { - content: 'Remove'; - margin-left: 8px; - } - - .ql-snow .ql-tooltip a { - line-height: 26px; - } - - .ql-snow .ql-tooltip.ql-editing a.ql-preview, - .ql-snow .ql-tooltip.ql-editing a.ql-remove { - display: none; - } - - .ql-snow .ql-tooltip.ql-editing input[type=text] { - display: inline-block; - } - - .ql-snow .ql-tooltip.ql-editing a.ql-action::after { - border-right: 0px; - content: 'Save'; - padding-right: 0px; - } - - .ql-snow .ql-tooltip[data-mode=link]::before { - content: "Enter link:"; - } - - .ql-snow .ql-tooltip[data-mode=formula]::before { - content: "Enter formula:"; - } - - .ql-snow .ql-tooltip[data-mode=video]::before { - content: "Enter video:"; - } - -.ql-snow a { - color: #06c; -} - -.ql-container.ql-snow { - border: 1px solid #ccc; -} diff --git a/Oqtane.Server/wwwroot/css/quill/quill.bubble.css b/Oqtane.Server/wwwroot/css/texteditors/quilljs/quill.bubble.css similarity index 100% rename from Oqtane.Server/wwwroot/css/quill/quill.bubble.css rename to Oqtane.Server/wwwroot/css/texteditors/quilljs/quill.bubble.css diff --git a/Oqtane.Server/wwwroot/css/quill/quill.snow.css b/Oqtane.Server/wwwroot/css/texteditors/quilljs/quill.snow.css similarity index 100% rename from Oqtane.Server/wwwroot/css/quill/quill.snow.css rename to Oqtane.Server/wwwroot/css/texteditors/quilljs/quill.snow.css diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css b/Oqtane.Server/wwwroot/css/texteditors/radzen/radzentexteditor.css similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/css/radzentexteditor.override.css rename to Oqtane.Server/wwwroot/css/texteditors/radzen/radzentexteditor.css diff --git a/Oqtane.Server/wwwroot/js/quill1.3.7.min.js b/Oqtane.Server/wwwroot/js/quill1.3.7.min.js deleted file mode 100644 index c0d84f88..00000000 --- a/Oqtane.Server/wwwroot/js/quill1.3.7.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -!function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.Quill = e() : t.Quill = e() }("undefined" != typeof self ? self : this, function () { return function (t) { function e(r) { if (n[r]) return n[r].exports; var o = n[r] = { i: r, l: !1, exports: {} }; return t[r].call(o.exports, o, o.exports, e), o.l = !0, o.exports } var n = {}; return e.m = t, e.c = n, e.d = function (t, n, r) { e.o(t, n) || Object.defineProperty(t, n, { configurable: !1, enumerable: !0, get: r }) }, e.n = function (t) { var n = t && t.__esModule ? function () { return t.default } : function () { return t }; return e.d(n, "a", n), n }, e.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, e.p = "", e(e.s = 45) }([function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(17), o = n(18), i = n(19), l = n(48), a = n(49), s = n(50), u = n(51), c = n(52), f = n(11), h = n(29), p = n(30), d = n(28), y = n(1), v = { Scope: y.Scope, create: y.create, find: y.find, query: y.query, register: y.register, Container: r.default, Format: o.default, Leaf: i.default, Embed: u.default, Scroll: l.default, Block: s.default, Inline: a.default, Text: c.default, Attributor: { Attribute: f.default, Class: h.default, Style: p.default, Store: d.default } }; e.default = v }, function (t, e, n) { "use strict"; function r(t, e) { var n = i(t); if (null == n) throw new s("Unable to create " + t + " blot"); var r = n; return new r(t instanceof Node || t.nodeType === Node.TEXT_NODE ? t : r.create(e), e) } function o(t, n) { return void 0 === n && (n = !1), null == t ? null : null != t[e.DATA_KEY] ? t[e.DATA_KEY].blot : n ? o(t.parentNode, n) : null } function i(t, e) { void 0 === e && (e = p.ANY); var n; if ("string" == typeof t) n = h[t] || u[t]; else if (t instanceof Text || t.nodeType === Node.TEXT_NODE) n = h.text; else if ("number" == typeof t) t & p.LEVEL & p.BLOCK ? n = h.block : t & p.LEVEL & p.INLINE && (n = h.inline); else if (t instanceof HTMLElement) { var r = (t.getAttribute("class") || "").split(/\s+/); for (var o in r) if (n = c[r[o]]) break; n = n || f[t.tagName] } return null == n ? null : e & p.LEVEL & n.scope && e & p.TYPE & n.scope ? n : null } function l() { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; if (t.length > 1) return t.map(function (t) { return l(t) }); var n = t[0]; if ("string" != typeof n.blotName && "string" != typeof n.attrName) throw new s("Invalid definition"); if ("abstract" === n.blotName) throw new s("Cannot register abstract class"); if (h[n.blotName || n.attrName] = n, "string" == typeof n.keyName) u[n.keyName] = n; else if (null != n.className && (c[n.className] = n), null != n.tagName) { Array.isArray(n.tagName) ? n.tagName = n.tagName.map(function (t) { return t.toUpperCase() }) : n.tagName = n.tagName.toUpperCase(); var r = Array.isArray(n.tagName) ? n.tagName : [n.tagName]; r.forEach(function (t) { null != f[t] && null != n.className || (f[t] = n) }) } return n } var a = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var s = function (t) { function e(e) { var n = this; return e = "[Parchment] " + e, n = t.call(this, e) || this, n.message = e, n.name = n.constructor.name, n } return a(e, t), e }(Error); e.ParchmentError = s; var u = {}, c = {}, f = {}, h = {}; e.DATA_KEY = "__blot"; var p; !function (t) { t[t.TYPE = 3] = "TYPE", t[t.LEVEL = 12] = "LEVEL", t[t.ATTRIBUTE = 13] = "ATTRIBUTE", t[t.BLOT = 14] = "BLOT", t[t.INLINE = 7] = "INLINE", t[t.BLOCK = 11] = "BLOCK", t[t.BLOCK_BLOT = 10] = "BLOCK_BLOT", t[t.INLINE_BLOT = 6] = "INLINE_BLOT", t[t.BLOCK_ATTRIBUTE = 9] = "BLOCK_ATTRIBUTE", t[t.INLINE_ATTRIBUTE = 5] = "INLINE_ATTRIBUTE", t[t.ANY = 15] = "ANY" }(p = e.Scope || (e.Scope = {})), e.create = r, e.find = o, e.query = i, e.register = l }, function (t, e) { "use strict"; var n = Object.prototype.hasOwnProperty, r = Object.prototype.toString, o = Object.defineProperty, i = Object.getOwnPropertyDescriptor, l = function (t) { return "function" == typeof Array.isArray ? Array.isArray(t) : "[object Array]" === r.call(t) }, a = function (t) { if (!t || "[object Object]" !== r.call(t)) return !1; var e = n.call(t, "constructor"), o = t.constructor && t.constructor.prototype && n.call(t.constructor.prototype, "isPrototypeOf"); if (t.constructor && !e && !o) return !1; var i; for (i in t); return void 0 === i || n.call(t, i) }, s = function (t, e) { o && "__proto__" === e.name ? o(t, e.name, { enumerable: !0, configurable: !0, value: e.newValue, writable: !0 }) : t[e.name] = e.newValue }, u = function (t, e) { if ("__proto__" === e) { if (!n.call(t, e)) return; if (i) return i(t, e).value } return t[e] }; t.exports = function t() { var e, n, r, o, i, c, f = arguments[0], h = 1, p = arguments.length, d = !1; for ("boolean" == typeof f && (d = f, f = arguments[1] || {}, h = 2), (null == f || "object" != typeof f && "function" != typeof f) && (f = {}); h < p; ++h)if (null != (e = arguments[h])) for (n in e) r = u(f, n), o = u(e, n), f !== o && (d && o && (a(o) || (i = l(o))) ? (i ? (i = !1, c = r && l(r) ? r : []) : c = r && a(r) ? r : {}, s(f, { name: n, newValue: t(d, c, o) })) : void 0 !== o && s(f, { name: n, newValue: o })); return f } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return null == t ? e : ("function" == typeof t.formats && (e = (0, f.default)(e, t.formats())), null == t.parent || "scroll" == t.parent.blotName || t.parent.statics.scope !== t.statics.scope ? e : a(t.parent, e)) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BlockEmbed = e.bubbleFormats = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(2), f = r(c), h = n(4), p = r(h), d = n(0), y = r(d), v = n(14), b = r(v), g = n(5), m = r(g), _ = n(8), O = r(_), w = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "attach", value: function () { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "attach", this).call(this), this.attributes = new y.default.Attributor.Store(this.domNode) } }, { key: "delta", value: function () { return (new p.default).insert(this.value(), (0, f.default)(this.formats(), this.attributes.values())) } }, { key: "format", value: function (t, e) { var n = y.default.query(t, y.default.Scope.BLOCK_ATTRIBUTE); null != n && this.attributes.attribute(n, e) } }, { key: "formatAt", value: function (t, e, n, r) { this.format(n, r) } }, { key: "insertAt", value: function (t, n, r) { if ("string" == typeof n && n.endsWith("\n")) { var o = y.default.create(x.blotName); this.parent.insertBefore(o, 0 === t ? this : this.next), o.insertAt(0, n.slice(0, -1)) } else u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r) } }]), e }(y.default.Embed); w.scope = y.default.Scope.BLOCK_BLOT; var x = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.cache = {}, n } return l(e, t), s(e, [{ key: "delta", value: function () { return null == this.cache.delta && (this.cache.delta = this.descendants(y.default.Leaf).reduce(function (t, e) { return 0 === e.length() ? t : t.insert(e.value(), a(e)) }, new p.default).insert("\n", a(this))), this.cache.delta } }, { key: "deleteAt", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), this.cache = {} } }, { key: "formatAt", value: function (t, n, r, o) { n <= 0 || (y.default.query(r, y.default.Scope.BLOCK) ? t + n === this.length() && this.format(r, o) : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, Math.min(n, this.length() - t - 1), r, o), this.cache = {}) } }, { key: "insertAt", value: function (t, n, r) { if (null != r) return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); if (0 !== n.length) { var o = n.split("\n"), i = o.shift(); i.length > 0 && (t < this.length() - 1 || null == this.children.tail ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, Math.min(t, this.length() - 1), i) : this.children.tail.insertAt(this.children.tail.length(), i), this.cache = {}); var l = this; o.reduce(function (t, e) { return l = l.split(t, !0), l.insertAt(0, e), e.length }, t + i.length) } } }, { key: "insertBefore", value: function (t, n) { var r = this.children.head; u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n), r instanceof b.default && r.remove(), this.cache = {} } }, { key: "length", value: function () { return null == this.cache.length && (this.cache.length = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "length", this).call(this) + 1), this.cache.length } }, { key: "moveChildren", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "moveChildren", this).call(this, t, n), this.cache = {} } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.cache = {} } }, { key: "path", value: function (t) { return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t, !0) } }, { key: "removeChild", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "removeChild", this).call(this, t), this.cache = {} } }, { key: "split", value: function (t) { var n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; if (n && (0 === t || t >= this.length() - 1)) { var r = this.clone(); return 0 === t ? (this.parent.insertBefore(r, this), this) : (this.parent.insertBefore(r, this.next), r) } var o = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "split", this).call(this, t, n); return this.cache = {}, o } }]), e }(y.default.Block); x.blotName = "block", x.tagName = "P", x.defaultChild = "break", x.allowedChildren = [m.default, y.default.Embed, O.default], e.bubbleFormats = a, e.BlockEmbed = w, e.default = x }, function (t, e, n) { var r = n(54), o = n(12), i = n(2), l = n(20), a = String.fromCharCode(0), s = function (t) { Array.isArray(t) ? this.ops = t : null != t && Array.isArray(t.ops) ? this.ops = t.ops : this.ops = [] }; s.prototype.insert = function (t, e) { var n = {}; return 0 === t.length ? this : (n.insert = t, null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n)) }, s.prototype.delete = function (t) { return t <= 0 ? this : this.push({ delete: t }) }, s.prototype.retain = function (t, e) { if (t <= 0) return this; var n = { retain: t }; return null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n) }, s.prototype.push = function (t) { var e = this.ops.length, n = this.ops[e - 1]; if (t = i(!0, {}, t), "object" == typeof n) { if ("number" == typeof t.delete && "number" == typeof n.delete) return this.ops[e - 1] = { delete: n.delete + t.delete }, this; if ("number" == typeof n.delete && null != t.insert && (e -= 1, "object" != typeof (n = this.ops[e - 1]))) return this.ops.unshift(t), this; if (o(t.attributes, n.attributes)) { if ("string" == typeof t.insert && "string" == typeof n.insert) return this.ops[e - 1] = { insert: n.insert + t.insert }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this; if ("number" == typeof t.retain && "number" == typeof n.retain) return this.ops[e - 1] = { retain: n.retain + t.retain }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this } } return e === this.ops.length ? this.ops.push(t) : this.ops.splice(e, 0, t), this }, s.prototype.chop = function () { var t = this.ops[this.ops.length - 1]; return t && t.retain && !t.attributes && this.ops.pop(), this }, s.prototype.filter = function (t) { return this.ops.filter(t) }, s.prototype.forEach = function (t) { this.ops.forEach(t) }, s.prototype.map = function (t) { return this.ops.map(t) }, s.prototype.partition = function (t) { var e = [], n = []; return this.forEach(function (r) { (t(r) ? e : n).push(r) }), [e, n] }, s.prototype.reduce = function (t, e) { return this.ops.reduce(t, e) }, s.prototype.changeLength = function () { return this.reduce(function (t, e) { return e.insert ? t + l.length(e) : e.delete ? t - e.delete : t }, 0) }, s.prototype.length = function () { return this.reduce(function (t, e) { return t + l.length(e) }, 0) }, s.prototype.slice = function (t, e) { t = t || 0, "number" != typeof e && (e = 1 / 0); for (var n = [], r = l.iterator(this.ops), o = 0; o < e && r.hasNext();) { var i; o < t ? i = r.next(t - o) : (i = r.next(e - o), n.push(i)), o += l.length(i) } return new s(n) }, s.prototype.compose = function (t) { var e = l.iterator(this.ops), n = l.iterator(t.ops), r = [], i = n.peek(); if (null != i && "number" == typeof i.retain && null == i.attributes) { for (var a = i.retain; "insert" === e.peekType() && e.peekLength() <= a;)a -= e.peekLength(), r.push(e.next()); i.retain - a > 0 && n.next(i.retain - a) } for (var u = new s(r); e.hasNext() || n.hasNext();)if ("insert" === n.peekType()) u.push(n.next()); else if ("delete" === e.peekType()) u.push(e.next()); else { var c = Math.min(e.peekLength(), n.peekLength()), f = e.next(c), h = n.next(c); if ("number" == typeof h.retain) { var p = {}; "number" == typeof f.retain ? p.retain = c : p.insert = f.insert; var d = l.attributes.compose(f.attributes, h.attributes, "number" == typeof f.retain); if (d && (p.attributes = d), u.push(p), !n.hasNext() && o(u.ops[u.ops.length - 1], p)) { var y = new s(e.rest()); return u.concat(y).chop() } } else "number" == typeof h.delete && "number" == typeof f.retain && u.push(h) } return u.chop() }, s.prototype.concat = function (t) { var e = new s(this.ops.slice()); return t.ops.length > 0 && (e.push(t.ops[0]), e.ops = e.ops.concat(t.ops.slice(1))), e }, s.prototype.diff = function (t, e) { if (this.ops === t.ops) return new s; var n = [this, t].map(function (e) { return e.map(function (n) { if (null != n.insert) return "string" == typeof n.insert ? n.insert : a; var r = e === t ? "on" : "with"; throw new Error("diff() called " + r + " non-document") }).join("") }), i = new s, u = r(n[0], n[1], e), c = l.iterator(this.ops), f = l.iterator(t.ops); return u.forEach(function (t) { for (var e = t[1].length; e > 0;) { var n = 0; switch (t[0]) { case r.INSERT: n = Math.min(f.peekLength(), e), i.push(f.next(n)); break; case r.DELETE: n = Math.min(e, c.peekLength()), c.next(n), i.delete(n); break; case r.EQUAL: n = Math.min(c.peekLength(), f.peekLength(), e); var a = c.next(n), s = f.next(n); o(a.insert, s.insert) ? i.retain(n, l.attributes.diff(a.attributes, s.attributes)) : i.push(s).delete(n) }e -= n } }), i.chop() }, s.prototype.eachLine = function (t, e) { e = e || "\n"; for (var n = l.iterator(this.ops), r = new s, o = 0; n.hasNext();) { if ("insert" !== n.peekType()) return; var i = n.peek(), a = l.length(i) - n.peekLength(), u = "string" == typeof i.insert ? i.insert.indexOf(e, a) - a : -1; if (u < 0) r.push(n.next()); else if (u > 0) r.push(n.next(u)); else { if (!1 === t(r, n.next(1).attributes || {}, o)) return; o += 1, r = new s } } r.length() > 0 && t(r, {}, o) }, s.prototype.transform = function (t, e) { if (e = !!e, "number" == typeof t) return this.transformPosition(t, e); for (var n = l.iterator(this.ops), r = l.iterator(t.ops), o = new s; n.hasNext() || r.hasNext();)if ("insert" !== n.peekType() || !e && "insert" === r.peekType()) if ("insert" === r.peekType()) o.push(r.next()); else { var i = Math.min(n.peekLength(), r.peekLength()), a = n.next(i), u = r.next(i); if (a.delete) continue; u.delete ? o.push(u) : o.retain(i, l.attributes.transform(a.attributes, u.attributes, e)) } else o.retain(l.length(n.next())); return o.chop() }, s.prototype.transformPosition = function (t, e) { e = !!e; for (var n = l.iterator(this.ops), r = 0; n.hasNext() && r <= t;) { var o = n.peekLength(), i = n.peekType(); n.next(), "delete" !== i ? ("insert" === i && (r < t || !e) && (t += o), r += o) : t -= Math.min(o, t - r) } return t }, t.exports = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(8), c = r(u), f = n(0), h = r(f), p = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "formatAt", value: function (t, n, r, o) { if (e.compare(this.statics.blotName, r) < 0 && h.default.query(r, h.default.Scope.BLOT)) { var i = this.isolate(t, n); o && i.wrap(r, o) } else s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o) } }, { key: "optimize", value: function (t) { if (s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.parent instanceof e && e.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { var n = this.parent.isolate(this.offset(), this.length()); this.moveChildren(n), n.wrap(this) } } }], [{ key: "compare", value: function (t, n) { var r = e.order.indexOf(t), o = e.order.indexOf(n); return r >= 0 || o >= 0 ? r - o : t === n ? 0 : t < n ? -1 : 1 } }]), e }(h.default.Inline); p.allowedChildren = [p, h.default.Embed, c.default], p.order = ["cursor", "inline", "underline", "strike", "italic", "bold", "script", "link", "code"], e.default = p }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (e = (0, N.default)(!0, { container: t, modules: { clipboard: !0, keyboard: !0, history: !0 } }, e), e.theme && e.theme !== S.DEFAULTS.theme) { if (e.theme = S.import("themes/" + e.theme), null == e.theme) throw new Error("Invalid theme " + e.theme + ". Did you register it?") } else e.theme = T.default; var n = (0, N.default)(!0, {}, e.theme.DEFAULTS);[n, e].forEach(function (t) { t.modules = t.modules || {}, Object.keys(t.modules).forEach(function (e) { !0 === t.modules[e] && (t.modules[e] = {}) }) }); var r = Object.keys(n.modules).concat(Object.keys(e.modules)), o = r.reduce(function (t, e) { var n = S.import("modules/" + e); return null == n ? P.error("Cannot load " + e + " module. Are you sure you registered it?") : t[e] = n.DEFAULTS || {}, t }, {}); return null != e.modules && e.modules.toolbar && e.modules.toolbar.constructor !== Object && (e.modules.toolbar = { container: e.modules.toolbar }), e = (0, N.default)(!0, {}, S.DEFAULTS, { modules: o }, n, e), ["bounds", "container", "scrollingContainer"].forEach(function (t) { "string" == typeof e[t] && (e[t] = document.querySelector(e[t])) }), e.modules = Object.keys(e.modules).reduce(function (t, n) { return e.modules[n] && (t[n] = e.modules[n]), t }, {}), e } function a(t, e, n, r) { if (this.options.strict && !this.isEnabled() && e === g.default.sources.USER) return new d.default; var o = null == n ? null : this.getSelection(), i = this.editor.delta, l = t(); if (null != o && (!0 === n && (n = o.index), null == r ? o = u(o, l, e) : 0 !== r && (o = u(o, n, r, e)), this.setSelection(o, g.default.sources.SILENT)), l.length() > 0) { var a, s = [g.default.events.TEXT_CHANGE, l, i, e]; if ((a = this.emitter).emit.apply(a, [g.default.events.EDITOR_CHANGE].concat(s)), e !== g.default.sources.SILENT) { var c; (c = this.emitter).emit.apply(c, s) } } return l } function s(t, e, n, r, o) { var i = {}; return "number" == typeof t.index && "number" == typeof t.length ? "number" != typeof e ? (o = r, r = n, n = e, e = t.length, t = t.index) : (e = t.length, t = t.index) : "number" != typeof e && (o = r, r = n, n = e, e = 0), "object" === (void 0 === n ? "undefined" : c(n)) ? (i = n, o = r) : "string" == typeof n && (null != r ? i[n] = r : o = n), o = o || g.default.sources.API, [t, e, i, o] } function u(t, e, n, r) { if (null == t) return null; var o = void 0, i = void 0; if (e instanceof d.default) { var l = [t.index, t.index + t.length].map(function (t) { return e.transformPosition(t, r !== g.default.sources.USER) }), a = f(l, 2); o = a[0], i = a[1] } else { var s = [t.index, t.index + t.length].map(function (t) { return t < e || t === e && r === g.default.sources.USER ? t : n >= 0 ? t + n : Math.max(e, t + n) }), u = f(s, 2); o = u[0], i = u[1] } return new x.Range(o, i - o) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.overload = e.expandConfig = void 0; var c = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(); n(53); var p = n(4), d = r(p), y = n(57), v = r(y), b = n(9), g = r(b), m = n(7), _ = r(m), O = n(0), w = r(O), x = n(22), k = r(x), E = n(2), N = r(E), j = n(10), A = r(j), q = n(32), T = r(q), P = (0, A.default)("quill"), S = function () { function t(e) { var n = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (i(this, t), this.options = l(e, r), this.container = this.options.container, null == this.container) return P.error("Invalid Quill container", e); this.options.debug && t.debug(this.options.debug); var o = this.container.innerHTML.trim(); this.container.classList.add("ql-container"), this.container.innerHTML = "", this.container.__quill = this, this.root = this.addContainer("ql-editor"), this.root.classList.add("ql-blank"), this.root.setAttribute("data-gramm", !1), this.scrollingContainer = this.options.scrollingContainer || this.root, this.emitter = new g.default, this.scroll = w.default.create(this.root, { emitter: this.emitter, whitelist: this.options.formats }), this.editor = new v.default(this.scroll), this.selection = new k.default(this.scroll, this.emitter), this.theme = new this.options.theme(this, this.options), this.keyboard = this.theme.addModule("keyboard"), this.clipboard = this.theme.addModule("clipboard"), this.history = this.theme.addModule("history"), this.theme.init(), this.emitter.on(g.default.events.EDITOR_CHANGE, function (t) { t === g.default.events.TEXT_CHANGE && n.root.classList.toggle("ql-blank", n.editor.isBlank()) }), this.emitter.on(g.default.events.SCROLL_UPDATE, function (t, e) { var r = n.selection.lastRange, o = r && 0 === r.length ? r.index : void 0; a.call(n, function () { return n.editor.update(null, e, o) }, t) }); var s = this.clipboard.convert("
" + o + "


"); this.setContents(s), this.history.clear(), this.options.placeholder && this.root.setAttribute("data-placeholder", this.options.placeholder), this.options.readOnly && this.disable() } return h(t, null, [{ key: "debug", value: function (t) { !0 === t && (t = "log"), A.default.level(t) } }, { key: "find", value: function (t) { return t.__quill || w.default.find(t) } }, { key: "import", value: function (t) { return null == this.imports[t] && P.error("Cannot import " + t + ". Are you sure it was registered?"), this.imports[t] } }, { key: "register", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; if ("string" != typeof t) { var o = t.attrName || t.blotName; "string" == typeof o ? this.register("formats/" + o, t, e) : Object.keys(t).forEach(function (r) { n.register(r, t[r], e) }) } else null == this.imports[t] || r || P.warn("Overwriting " + t + " with", e), this.imports[t] = e, (t.startsWith("blots/") || t.startsWith("formats/")) && "abstract" !== e.blotName ? w.default.register(e) : t.startsWith("modules") && "function" == typeof e.register && e.register() } }]), h(t, [{ key: "addContainer", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; if ("string" == typeof t) { var n = t; t = document.createElement("div"), t.classList.add(n) } return this.container.insertBefore(t, e), t } }, { key: "blur", value: function () { this.selection.setRange(null) } }, { key: "deleteText", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.deleteText(t, e) }, n, t, -1 * e) } }, { key: "disable", value: function () { this.enable(!1) } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.scroll.enable(t), this.container.classList.toggle("ql-disabled", !t) } }, { key: "focus", value: function () { var t = this.scrollingContainer.scrollTop; this.selection.focus(), this.scrollingContainer.scrollTop = t, this.scrollIntoView() } }, { key: "format", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : g.default.sources.API; return a.call(this, function () { var r = n.getSelection(!0), i = new d.default; if (null == r) return i; if (w.default.query(t, w.default.Scope.BLOCK)) i = n.editor.formatLine(r.index, r.length, o({}, t, e)); else { if (0 === r.length) return n.selection.format(t, e), i; i = n.editor.formatText(r.index, r.length, o({}, t, e)) } return n.setSelection(r, g.default.sources.SILENT), i }, r) } }, { key: "formatLine", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatLine(t, e, l) }, o, t, 0) } }, { key: "formatText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatText(t, e, l) }, o, t, 0) } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = void 0; n = "number" == typeof t ? this.selection.getBounds(t, e) : this.selection.getBounds(t.index, t.length); var r = this.container.getBoundingClientRect(); return { bottom: n.bottom - r.top, height: n.height, left: n.left - r.left, right: n.right - r.left, top: n.top - r.top, width: n.width } } }, { key: "getContents", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getContents(t, e) } }, { key: "getFormat", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.getSelection(!0), e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; return "number" == typeof t ? this.editor.getFormat(t, e) : this.editor.getFormat(t.index, t.length) } }, { key: "getIndex", value: function (t) { return t.offset(this.scroll) } }, { key: "getLength", value: function () { return this.scroll.length() } }, { key: "getLeaf", value: function (t) { return this.scroll.leaf(t) } }, { key: "getLine", value: function (t) { return this.scroll.line(t) } }, { key: "getLines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return "number" != typeof t ? this.scroll.lines(t.index, t.length) : this.scroll.lines(t, e) } }, { key: "getModule", value: function (t) { return this.theme.modules[t] } }, { key: "getSelection", value: function () { return arguments.length > 0 && void 0 !== arguments[0] && arguments[0] && this.focus(), this.update(), this.selection.getRange()[0] } }, { key: "getText", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getText(t, e) } }, { key: "hasFocus", value: function () { return this.selection.hasFocus() } }, { key: "insertEmbed", value: function (e, n, r) { var o = this, i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : t.sources.API; return a.call(this, function () { return o.editor.insertEmbed(e, n, r) }, i, e) } }, { key: "insertText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, 0, n, r, o), c = f(u, 4); return t = c[0], l = c[2], o = c[3], a.call(this, function () { return i.editor.insertText(t, e, l) }, o, t, e.length) } }, { key: "isEnabled", value: function () { return !this.container.classList.contains("ql-disabled") } }, { key: "off", value: function () { return this.emitter.off.apply(this.emitter, arguments) } }, { key: "on", value: function () { return this.emitter.on.apply(this.emitter, arguments) } }, { key: "once", value: function () { return this.emitter.once.apply(this.emitter, arguments) } }, { key: "pasteHTML", value: function (t, e, n) { this.clipboard.dangerouslyPasteHTML(t, e, n) } }, { key: "removeFormat", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.removeFormat(t, e) }, n, t) } }, { key: "scrollIntoView", value: function () { this.selection.scrollIntoView(this.scrollingContainer) } }, { key: "setContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { t = new d.default(t); var n = e.getLength(), r = e.editor.deleteText(0, n), o = e.editor.applyDelta(t), i = o.ops[o.ops.length - 1]; return null != i && "string" == typeof i.insert && "\n" === i.insert[i.insert.length - 1] && (e.editor.deleteText(e.getLength() - 1, 1), o.delete(1)), r.compose(o) }, n) } }, { key: "setSelection", value: function (e, n, r) { if (null == e) this.selection.setRange(null, n || t.sources.API); else { var o = s(e, n, r), i = f(o, 4); e = i[0], n = i[1], r = i[3], this.selection.setRange(new x.Range(e, n), r), r !== g.default.sources.SILENT && this.selection.scrollIntoView(this.scrollingContainer) } } }, { key: "setText", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API, n = (new d.default).insert(t); return this.setContents(n, e) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : g.default.sources.USER, e = this.scroll.update(t); return this.selection.update(t), e } }, { key: "updateContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { return t = new d.default(t), e.editor.applyDelta(t, n) }, n, !0) } }]), t }(); S.DEFAULTS = { bounds: null, formats: null, modules: {}, placeholder: "", readOnly: !1, scrollingContainer: null, strict: !0, theme: "default" }, S.events = g.default.events, S.sources = g.default.sources, S.version = "1.3.7", S.imports = { delta: d.default, parchment: w.default, "core/module": _.default, "core/theme": T.default }, e.expandConfig = l, e.overload = s, e.default = S }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; r(this, t), this.quill = e, this.options = n }; o.DEFAULTS = {}, e.default = o }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(0), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default.Text); e.default = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(58), c = r(u), f = n(10), h = r(f), p = (0, h.default)("quill:events");["selectionchange", "mousedown", "mouseup", "click"].forEach(function (t) { document.addEventListener(t, function () { for (var t = arguments.length, e = Array(t), n = 0; n < t; n++)e[n] = arguments[n];[].slice.call(document.querySelectorAll(".ql-container")).forEach(function (t) { if (t.__quill && t.__quill.emitter) { var n; (n = t.__quill.emitter).handleDOM.apply(n, e) } }) }) }); var d = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); return t.listeners = {}, t.on("error", p.error), t } return l(e, t), a(e, [{ key: "emit", value: function () { p.log.apply(p, arguments), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "emit", this).apply(this, arguments) } }, { key: "handleDOM", value: function (t) { for (var e = arguments.length, n = Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)n[r - 1] = arguments[r]; (this.listeners[t.type] || []).forEach(function (e) { var r = e.node, o = e.handler; (t.target === r || r.contains(t.target)) && o.apply(void 0, [t].concat(n)) }) } }, { key: "listenDOM", value: function (t, e, n) { this.listeners[t] || (this.listeners[t] = []), this.listeners[t].push({ node: e, handler: n }) } }]), e }(c.default); d.events = { EDITOR_CHANGE: "editor-change", SCROLL_BEFORE_UPDATE: "scroll-before-update", SCROLL_OPTIMIZE: "scroll-optimize", SCROLL_UPDATE: "scroll-update", SELECTION_CHANGE: "selection-change", TEXT_CHANGE: "text-change" }, d.sources = { API: "api", SILENT: "silent", USER: "user" }, e.default = d }, function (t, e, n) { "use strict"; function r(t) { if (i.indexOf(t) <= i.indexOf(l)) { for (var e, n = arguments.length, r = Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++)r[o - 1] = arguments[o]; (e = console)[t].apply(e, r) } } function o(t) { return i.reduce(function (e, n) { return e[n] = r.bind(console, n, t), e }, {}) } Object.defineProperty(e, "__esModule", { value: !0 }); var i = ["error", "warn", "log", "info"], l = "warn"; r.level = o.level = function (t) { l = t }, e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t, e, n) { void 0 === n && (n = {}), this.attrName = t, this.keyName = e; var o = r.Scope.TYPE & r.Scope.ATTRIBUTE; null != n.scope ? this.scope = n.scope & r.Scope.LEVEL | o : this.scope = r.Scope.ATTRIBUTE, null != n.whitelist && (this.whitelist = n.whitelist) } return t.keys = function (t) { return [].map.call(t.attributes, function (t) { return t.name }) }, t.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.setAttribute(this.keyName, e), !0) }, t.prototype.canAdd = function (t, e) { return null != r.query(t, r.Scope.BLOT & (this.scope | r.Scope.TYPE)) && (null == this.whitelist || ("string" == typeof e ? this.whitelist.indexOf(e.replace(/["']/g, "")) > -1 : this.whitelist.indexOf(e) > -1)) }, t.prototype.remove = function (t) { t.removeAttribute(this.keyName) }, t.prototype.value = function (t) { var e = t.getAttribute(this.keyName); return this.canAdd(t, e) && e ? e : "" }, t }(); e.default = o }, function (t, e, n) { function r(t) { return null === t || void 0 === t } function o(t) { return !(!t || "object" != typeof t || "number" != typeof t.length) && ("function" == typeof t.copy && "function" == typeof t.slice && !(t.length > 0 && "number" != typeof t[0])) } function i(t, e, n) { var i, c; if (r(t) || r(e)) return !1; if (t.prototype !== e.prototype) return !1; if (s(t)) return !!s(e) && (t = l.call(t), e = l.call(e), u(t, e, n)); if (o(t)) { if (!o(e)) return !1; if (t.length !== e.length) return !1; for (i = 0; i < t.length; i++)if (t[i] !== e[i]) return !1; return !0 } try { var f = a(t), h = a(e) } catch (t) { return !1 } if (f.length != h.length) return !1; for (f.sort(), h.sort(), i = f.length - 1; i >= 0; i--)if (f[i] != h[i]) return !1; for (i = f.length - 1; i >= 0; i--)if (c = f[i], !u(t[c], e[c], n)) return !1; return typeof t == typeof e } var l = Array.prototype.slice, a = n(55), s = n(56), u = t.exports = function (t, e, n) { return n || (n = {}), t === e || (t instanceof Date && e instanceof Date ? t.getTime() === e.getTime() : !t || !e || "object" != typeof t && "object" != typeof e ? n.strict ? t === e : t == e : i(t, e, n)) } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Code = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(4), f = r(c), h = n(0), p = r(h), d = n(3), y = r(d), v = n(5), b = r(v), g = n(8), m = r(g), _ = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(b.default); _.blotName = "code", _.tagName = "CODE"; var O = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "delta", value: function () { var t = this, e = this.domNode.textContent; return e.endsWith("\n") && (e = e.slice(0, -1)), e.split("\n").reduce(function (e, n) { return e.insert(n).insert("\n", t.formats()) }, new f.default) } }, { key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) { var r = this.descendant(m.default, this.length() - 1), o = a(r, 1), i = o[0]; null != i && i.deleteAt(i.length() - 1, 1), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } } }, { key: "formatAt", value: function (t, n, r, o) { if (0 !== n && null != p.default.query(r, p.default.Scope.BLOCK) && (r !== this.statics.blotName || o !== this.statics.formats(this.domNode))) { var i = this.newlineIndex(t); if (!(i < 0 || i >= t + n)) { var l = this.newlineIndex(t, !0) + 1, a = i - l + 1, s = this.isolate(l, a), u = s.next; s.format(r, o), u instanceof e && u.formatAt(0, t - l + n - a, r, o) } } } }, { key: "insertAt", value: function (t, e, n) { if (null == n) { var r = this.descendant(m.default, t), o = a(r, 2), i = o[0], l = o[1]; i.insertAt(l, e) } } }, { key: "length", value: function () { var t = this.domNode.textContent.length; return this.domNode.textContent.endsWith("\n") ? t : t + 1 } }, { key: "newlineIndex", value: function (t) { if (arguments.length > 1 && void 0 !== arguments[1] && arguments[1]) return this.domNode.textContent.slice(0, t).lastIndexOf("\n"); var e = this.domNode.textContent.slice(t).indexOf("\n"); return e > -1 ? t + e : -1 } }, { key: "optimize", value: function (t) { this.domNode.textContent.endsWith("\n") || this.appendChild(p.default.create("text", "\n")), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === n.statics.formats(n.domNode) && (n.optimize(t), n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t), [].slice.call(this.domNode.querySelectorAll("*")).forEach(function (t) { var e = p.default.find(t); null == e ? t.parentNode.removeChild(t) : e instanceof p.default.Embed ? e.remove() : e.unwrap() }) } }], [{ key: "create", value: function (t) { var n = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("spellcheck", !1), n } }, { key: "formats", value: function () { return !0 } }]), e }(y.default); O.blotName = "code-block", O.tagName = "PRE", O.TAB = " ", e.Code = _, e.default = O }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "insertInto", value: function (t, n) { 0 === t.children.length ? a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertInto", this).call(this, t, n) : this.remove() } }, { key: "length", value: function () { return 0 } }, { key: "value", value: function () { return "" } }], [{ key: "value", value: function () { } }]), e }(u.default.Embed); c.blotName = "break", c.tagName = "BR", e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function l(t, e) { var n = document.createElement("a"); n.href = t; var r = n.href.slice(0, n.href.indexOf(":")); return e.indexOf(r) > -1 } Object.defineProperty(e, "__esModule", { value: !0 }), e.sanitize = e.default = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(5), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), a(e, [{ key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); n = this.constructor.sanitize(n), this.domNode.setAttribute("href", n) } }], [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return t = this.sanitize(t), n.setAttribute("href", t), n.setAttribute("rel", "noopener noreferrer"), n.setAttribute("target", "_blank"), n } }, { key: "formats", value: function (t) { return t.getAttribute("href") } }, { key: "sanitize", value: function (t) { return l(t, this.PROTOCOL_WHITELIST) ? t : this.SANITIZED_URL } }]), e }(c.default); f.blotName = "link", f.tagName = "A", f.SANITIZED_URL = "about:blank", f.PROTOCOL_WHITELIST = ["http", "https", "mailto", "tel"], e.default = f, e.sanitize = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { t.setAttribute(e, !("true" === t.getAttribute(e))) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = n(25), u = r(s), c = n(106), f = r(c), h = 0, p = function () { function t(e) { var n = this; o(this, t), this.select = e, this.container = document.createElement("span"), this.buildPicker(), this.select.style.display = "none", this.select.parentNode.insertBefore(this.container, this.select), this.label.addEventListener("mousedown", function () { n.togglePicker() }), this.label.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: n.togglePicker(); break; case u.default.keys.ESCAPE: n.escape(), t.preventDefault() } }), this.select.addEventListener("change", this.update.bind(this)) } return a(t, [{ key: "togglePicker", value: function () { this.container.classList.toggle("ql-expanded"), i(this.label, "aria-expanded"), i(this.options, "aria-hidden") } }, { key: "buildItem", value: function (t) { var e = this, n = document.createElement("span"); return n.tabIndex = "0", n.setAttribute("role", "button"), n.classList.add("ql-picker-item"), t.hasAttribute("value") && n.setAttribute("data-value", t.getAttribute("value")), t.textContent && n.setAttribute("data-label", t.textContent), n.addEventListener("click", function () { e.selectItem(n, !0) }), n.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: e.selectItem(n, !0), t.preventDefault(); break; case u.default.keys.ESCAPE: e.escape(), t.preventDefault() } }), n } }, { key: "buildLabel", value: function () { var t = document.createElement("span"); return t.classList.add("ql-picker-label"), t.innerHTML = f.default, t.tabIndex = "0", t.setAttribute("role", "button"), t.setAttribute("aria-expanded", "false"), this.container.appendChild(t), t } }, { key: "buildOptions", value: function () { var t = this, e = document.createElement("span"); e.classList.add("ql-picker-options"), e.setAttribute("aria-hidden", "true"), e.tabIndex = "-1", e.id = "ql-picker-options-" + h, h += 1, this.label.setAttribute("aria-controls", e.id), this.options = e, [].slice.call(this.select.options).forEach(function (n) { var r = t.buildItem(n); e.appendChild(r), !0 === n.selected && t.selectItem(r) }), this.container.appendChild(e) } }, { key: "buildPicker", value: function () { var t = this;[].slice.call(this.select.attributes).forEach(function (e) { t.container.setAttribute(e.name, e.value) }), this.container.classList.add("ql-picker"), this.label = this.buildLabel(), this.buildOptions() } }, { key: "escape", value: function () { var t = this; this.close(), setTimeout(function () { return t.label.focus() }, 1) } }, { key: "close", value: function () { this.container.classList.remove("ql-expanded"), this.label.setAttribute("aria-expanded", "false"), this.options.setAttribute("aria-hidden", "true") } }, { key: "selectItem", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = this.container.querySelector(".ql-selected"); if (t !== n && (null != n && n.classList.remove("ql-selected"), null != t && (t.classList.add("ql-selected"), this.select.selectedIndex = [].indexOf.call(t.parentNode.children, t), t.hasAttribute("data-value") ? this.label.setAttribute("data-value", t.getAttribute("data-value")) : this.label.removeAttribute("data-value"), t.hasAttribute("data-label") ? this.label.setAttribute("data-label", t.getAttribute("data-label")) : this.label.removeAttribute("data-label"), e))) { if ("function" == typeof Event) this.select.dispatchEvent(new Event("change")); else if ("object" === ("undefined" == typeof Event ? "undefined" : l(Event))) { var r = document.createEvent("Event"); r.initEvent("change", !0, !0), this.select.dispatchEvent(r) } this.close() } } }, { key: "update", value: function () { var t = void 0; if (this.select.selectedIndex > -1) { var e = this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex]; t = this.select.options[this.select.selectedIndex], this.selectItem(e) } else this.selectItem(null); var n = null != t && t !== this.select.querySelector("option[selected]"); this.label.classList.toggle("ql-active", n) } }]), t }(); e.default = p }, function (t, e, n) { "use strict"; function r(t) { var e = a.find(t); if (null == e) try { e = a.create(t) } catch (n) { e = a.create(a.Scope.INLINE), [].slice.call(t.childNodes).forEach(function (t) { e.domNode.appendChild(t) }), t.parentNode && t.parentNode.replaceChild(e.domNode, t), e.attach() } return e } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(47), l = n(27), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.build(), n } return o(e, t), e.prototype.appendChild = function (t) { this.insertBefore(t) }, e.prototype.attach = function () { t.prototype.attach.call(this), this.children.forEach(function (t) { t.attach() }) }, e.prototype.build = function () { var t = this; this.children = new i.default, [].slice.call(this.domNode.childNodes).reverse().forEach(function (e) { try { var n = r(e); t.insertBefore(n, t.children.head || void 0) } catch (t) { if (t instanceof a.ParchmentError) return; throw t } }) }, e.prototype.deleteAt = function (t, e) { if (0 === t && e === this.length()) return this.remove(); this.children.forEachAt(t, e, function (t, e, n) { t.deleteAt(e, n) }) }, e.prototype.descendant = function (t, n) { var r = this.children.find(n), o = r[0], i = r[1]; return null == t.blotName && t(o) || null != t.blotName && o instanceof t ? [o, i] : o instanceof e ? o.descendant(t, i) : [null, -1] }, e.prototype.descendants = function (t, n, r) { void 0 === n && (n = 0), void 0 === r && (r = Number.MAX_VALUE); var o = [], i = r; return this.children.forEachAt(n, r, function (n, r, l) { (null == t.blotName && t(n) || null != t.blotName && n instanceof t) && o.push(n), n instanceof e && (o = o.concat(n.descendants(t, r, i))), i -= l }), o }, e.prototype.detach = function () { this.children.forEach(function (t) { t.detach() }), t.prototype.detach.call(this) }, e.prototype.formatAt = function (t, e, n, r) { this.children.forEachAt(t, e, function (t, e, o) { t.formatAt(e, o, n, r) }) }, e.prototype.insertAt = function (t, e, n) { var r = this.children.find(t), o = r[0], i = r[1]; if (o) o.insertAt(i, e, n); else { var l = null == n ? a.create("text", e) : a.create(e, n); this.appendChild(l) } }, e.prototype.insertBefore = function (t, e) { if (null != this.statics.allowedChildren && !this.statics.allowedChildren.some(function (e) { return t instanceof e })) throw new a.ParchmentError("Cannot insert " + t.statics.blotName + " into " + this.statics.blotName); t.insertInto(this, e) }, e.prototype.length = function () { return this.children.reduce(function (t, e) { return t + e.length() }, 0) }, e.prototype.moveChildren = function (t, e) { this.children.forEach(function (n) { t.insertBefore(n, e) }) }, e.prototype.optimize = function (e) { if (t.prototype.optimize.call(this, e), 0 === this.children.length) if (null != this.statics.defaultChild) { var n = a.create(this.statics.defaultChild); this.appendChild(n), n.optimize(e) } else this.remove() }, e.prototype.path = function (t, n) { void 0 === n && (n = !1); var r = this.children.find(t, n), o = r[0], i = r[1], l = [[this, t]]; return o instanceof e ? l.concat(o.path(i, n)) : (null != o && l.push([o, i]), l) }, e.prototype.removeChild = function (t) { this.children.remove(t) }, e.prototype.replace = function (n) { n instanceof e && n.moveChildren(this), t.prototype.replace.call(this, n) }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = this.clone(); return this.parent.insertBefore(n, this.next), this.children.forEachAt(t, this.length(), function (t, r, o) { t = t.split(r, e), n.appendChild(t) }), n }, e.prototype.unwrap = function () { this.moveChildren(this.parent, this.next), this.remove() }, e.prototype.update = function (t, e) { var n = this, o = [], i = []; t.forEach(function (t) { t.target === n.domNode && "childList" === t.type && (o.push.apply(o, t.addedNodes), i.push.apply(i, t.removedNodes)) }), i.forEach(function (t) { if (!(null != t.parentNode && "IFRAME" !== t.tagName && document.body.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY)) { var e = a.find(t); null != e && (null != e.domNode.parentNode && e.domNode.parentNode !== n.domNode || e.detach()) } }), o.filter(function (t) { return t.parentNode == n.domNode }).sort(function (t, e) { return t === e ? 0 : t.compareDocumentPosition(e) & Node.DOCUMENT_POSITION_FOLLOWING ? 1 : -1 }).forEach(function (t) { var e = null; null != t.nextSibling && (e = a.find(t.nextSibling)); var o = r(t); o.next == e && null != o.next || (null != o.parent && o.parent.removeChild(n), n.insertBefore(o, e || void 0)) }) }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(11), i = n(28), l = n(17), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.attributes = new i.default(n.domNode), n } return r(e, t), e.formats = function (t) { return "string" == typeof this.tagName || (Array.isArray(this.tagName) ? t.tagName.toLowerCase() : void 0) }, e.prototype.format = function (t, e) { var n = a.query(t); n instanceof o.default ? this.attributes.attribute(n, e) : e && (null == n || t === this.statics.blotName && this.formats()[t] === e || this.replaceWith(t, e)) }, e.prototype.formats = function () { var t = this.attributes.values(), e = this.statics.formats(this.domNode); return null != e && (t[this.statics.blotName] = e), t }, e.prototype.replaceWith = function (e, n) { var r = t.prototype.replaceWith.call(this, e, n); return this.attributes.copy(r), r }, e.prototype.update = function (e, n) { var r = this; t.prototype.update.call(this, e, n), e.some(function (t) { return t.target === r.domNode && "attributes" === t.type }) && this.attributes.build() }, e.prototype.wrap = function (n, r) { var o = t.prototype.wrap.call(this, n, r); return o instanceof e && o.statics.scope === this.statics.scope && this.attributes.move(o), o }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(27), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.value = function (t) { return !0 }, e.prototype.index = function (t, e) { return this.domNode === t || this.domNode.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY ? Math.min(e, 1) : -1 }, e.prototype.position = function (t, e) { var n = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); return t > 0 && (n += 1), [this.parent.domNode, n] }, e.prototype.value = function () { var t; return t = {}, t[this.statics.blotName] = this.statics.value(this.domNode) || !0, t }, e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { function r(t) { this.ops = t, this.index = 0, this.offset = 0 } var o = n(12), i = n(2), l = { attributes: { compose: function (t, e, n) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var r = i(!0, {}, e); n || (r = Object.keys(r).reduce(function (t, e) { return null != r[e] && (t[e] = r[e]), t }, {})); for (var o in t) void 0 !== t[o] && void 0 === e[o] && (r[o] = t[o]); return Object.keys(r).length > 0 ? r : void 0 }, diff: function (t, e) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var n = Object.keys(t).concat(Object.keys(e)).reduce(function (n, r) { return o(t[r], e[r]) || (n[r] = void 0 === e[r] ? null : e[r]), n }, {}); return Object.keys(n).length > 0 ? n : void 0 }, transform: function (t, e, n) { if ("object" != typeof t) return e; if ("object" == typeof e) { if (!n) return e; var r = Object.keys(e).reduce(function (n, r) { return void 0 === t[r] && (n[r] = e[r]), n }, {}); return Object.keys(r).length > 0 ? r : void 0 } } }, iterator: function (t) { return new r(t) }, length: function (t) { return "number" == typeof t.delete ? t.delete : "number" == typeof t.retain ? t.retain : "string" == typeof t.insert ? t.insert.length : 1 } }; r.prototype.hasNext = function () { return this.peekLength() < 1 / 0 }, r.prototype.next = function (t) { t || (t = 1 / 0); var e = this.ops[this.index]; if (e) { var n = this.offset, r = l.length(e); if (t >= r - n ? (t = r - n, this.index += 1, this.offset = 0) : this.offset += t, "number" == typeof e.delete) return { delete: t }; var o = {}; return e.attributes && (o.attributes = e.attributes), "number" == typeof e.retain ? o.retain = t : "string" == typeof e.insert ? o.insert = e.insert.substr(n, t) : o.insert = e.insert, o } return { retain: 1 / 0 } }, r.prototype.peek = function () { return this.ops[this.index] }, r.prototype.peekLength = function () { return this.ops[this.index] ? l.length(this.ops[this.index]) - this.offset : 1 / 0 }, r.prototype.peekType = function () { return this.ops[this.index] ? "number" == typeof this.ops[this.index].delete ? "delete" : "number" == typeof this.ops[this.index].retain ? "retain" : "insert" : "retain" }, r.prototype.rest = function () { if (this.hasNext()) { if (0 === this.offset) return this.ops.slice(this.index); var t = this.offset, e = this.index, n = this.next(), r = this.ops.slice(this.index); return this.offset = t, this.index = e, [n].concat(r) } return [] }, t.exports = l }, function (t, e) { var n = function () { "use strict"; function t(t, e) { return null != e && t instanceof e } function e(n, r, o, i, c) { function f(n, o) { if (null === n) return null; if (0 === o) return n; var y, v; if ("object" != typeof n) return n; if (t(n, a)) y = new a; else if (t(n, s)) y = new s; else if (t(n, u)) y = new u(function (t, e) { n.then(function (e) { t(f(e, o - 1)) }, function (t) { e(f(t, o - 1)) }) }); else if (e.__isArray(n)) y = []; else if (e.__isRegExp(n)) y = new RegExp(n.source, l(n)), n.lastIndex && (y.lastIndex = n.lastIndex); else if (e.__isDate(n)) y = new Date(n.getTime()); else { if (d && Buffer.isBuffer(n)) return y = Buffer.allocUnsafe ? Buffer.allocUnsafe(n.length) : new Buffer(n.length), n.copy(y), y; t(n, Error) ? y = Object.create(n) : void 0 === i ? (v = Object.getPrototypeOf(n), y = Object.create(v)) : (y = Object.create(i), v = i) } if (r) { var b = h.indexOf(n); if (-1 != b) return p[b]; h.push(n), p.push(y) } t(n, a) && n.forEach(function (t, e) { var n = f(e, o - 1), r = f(t, o - 1); y.set(n, r) }), t(n, s) && n.forEach(function (t) { var e = f(t, o - 1); y.add(e) }); for (var g in n) { var m; v && (m = Object.getOwnPropertyDescriptor(v, g)), m && null == m.set || (y[g] = f(n[g], o - 1)) } if (Object.getOwnPropertySymbols) for (var _ = Object.getOwnPropertySymbols(n), g = 0; g < _.length; g++) { var O = _[g], w = Object.getOwnPropertyDescriptor(n, O); (!w || w.enumerable || c) && (y[O] = f(n[O], o - 1), w.enumerable || Object.defineProperty(y, O, { enumerable: !1 })) } if (c) for (var x = Object.getOwnPropertyNames(n), g = 0; g < x.length; g++) { var k = x[g], w = Object.getOwnPropertyDescriptor(n, k); w && w.enumerable || (y[k] = f(n[k], o - 1), Object.defineProperty(y, k, { enumerable: !1 })) } return y } "object" == typeof r && (o = r.depth, i = r.prototype, c = r.includeNonEnumerable, r = r.circular); var h = [], p = [], d = "undefined" != typeof Buffer; return void 0 === r && (r = !0), void 0 === o && (o = 1 / 0), f(n, o) } function n(t) { return Object.prototype.toString.call(t) } function r(t) { return "object" == typeof t && "[object Date]" === n(t) } function o(t) { return "object" == typeof t && "[object Array]" === n(t) } function i(t) { return "object" == typeof t && "[object RegExp]" === n(t) } function l(t) { var e = ""; return t.global && (e += "g"), t.ignoreCase && (e += "i"), t.multiline && (e += "m"), e } var a; try { a = Map } catch (t) { a = function () { } } var s; try { s = Set } catch (t) { s = function () { } } var u; try { u = Promise } catch (t) { u = function () { } } return e.clonePrototype = function (t) { if (null === t) return null; var e = function () { }; return e.prototype = t, new e }, e.__objToStr = n, e.__isDate = r, e.__isArray = o, e.__isRegExp = i, e.__getRegExpFlags = l, e }(); "object" == typeof t && t.exports && (t.exports = n) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t) { if (Array.isArray(t)) { for (var e = 0, n = Array(t.length); e < t.length; e++)n[e] = t[e]; return n } return Array.from(t) } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { try { e.parentNode } catch (t) { return !1 } return e instanceof Text && (e = e.parentNode), t.contains(e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Range = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(0), c = r(u), f = n(21), h = r(f), p = n(12), d = r(p), y = n(9), v = r(y), b = n(10), g = r(b), m = (0, g.default)("quill:selection"), _ = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; i(this, t), this.index = e, this.length = n }, O = function () { function t(e, n) { var r = this; i(this, t), this.emitter = n, this.scroll = e, this.composing = !1, this.mouseDown = !1, this.root = this.scroll.domNode, this.cursor = c.default.create("cursor", this), this.lastRange = this.savedRange = new _(0, 0), this.handleComposition(), this.handleDragging(), this.emitter.listenDOM("selectionchange", document, function () { r.mouseDown || setTimeout(r.update.bind(r, v.default.sources.USER), 1) }), this.emitter.on(v.default.events.EDITOR_CHANGE, function (t, e) { t === v.default.events.TEXT_CHANGE && e.length() > 0 && r.update(v.default.sources.SILENT) }), this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE, function () { if (r.hasFocus()) { var t = r.getNativeRange(); null != t && t.start.node !== r.cursor.textNode && r.emitter.once(v.default.events.SCROLL_UPDATE, function () { try { r.setNativeRange(t.start.node, t.start.offset, t.end.node, t.end.offset) } catch (t) { } }) } }), this.emitter.on(v.default.events.SCROLL_OPTIMIZE, function (t, e) { if (e.range) { var n = e.range, o = n.startNode, i = n.startOffset, l = n.endNode, a = n.endOffset; r.setNativeRange(o, i, l, a) } }), this.update(v.default.sources.SILENT) } return s(t, [{ key: "handleComposition", value: function () { var t = this; this.root.addEventListener("compositionstart", function () { t.composing = !0 }), this.root.addEventListener("compositionend", function () { if (t.composing = !1, t.cursor.parent) { var e = t.cursor.restore(); if (!e) return; setTimeout(function () { t.setNativeRange(e.startNode, e.startOffset, e.endNode, e.endOffset) }, 1) } }) } }, { key: "handleDragging", value: function () { var t = this; this.emitter.listenDOM("mousedown", document.body, function () { t.mouseDown = !0 }), this.emitter.listenDOM("mouseup", document.body, function () { t.mouseDown = !1, t.update(v.default.sources.USER) }) } }, { key: "focus", value: function () { this.hasFocus() || (this.root.focus(), this.setRange(this.savedRange)) } }, { key: "format", value: function (t, e) { if (null == this.scroll.whitelist || this.scroll.whitelist[t]) { this.scroll.update(); var n = this.getNativeRange(); if (null != n && n.native.collapsed && !c.default.query(t, c.default.Scope.BLOCK)) { if (n.start.node !== this.cursor.textNode) { var r = c.default.find(n.start.node, !1); if (null == r) return; if (r instanceof c.default.Leaf) { var o = r.split(n.start.offset); r.parent.insertBefore(this.cursor, o) } else r.insertBefore(this.cursor, n.start.node); this.cursor.attach() } this.cursor.format(t, e), this.scroll.optimize(), this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length), this.update() } } } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = this.scroll.length(); t = Math.min(t, n - 1), e = Math.min(t + e, n - 1) - t; var r = void 0, o = this.scroll.leaf(t), i = a(o, 2), l = i[0], s = i[1]; if (null == l) return null; var u = l.position(s, !0), c = a(u, 2); r = c[0], s = c[1]; var f = document.createRange(); if (e > 0) { f.setStart(r, s); var h = this.scroll.leaf(t + e), p = a(h, 2); if (l = p[0], s = p[1], null == l) return null; var d = l.position(s, !0), y = a(d, 2); return r = y[0], s = y[1], f.setEnd(r, s), f.getBoundingClientRect() } var v = "left", b = void 0; return r instanceof Text ? (s < r.data.length ? (f.setStart(r, s), f.setEnd(r, s + 1)) : (f.setStart(r, s - 1), f.setEnd(r, s), v = "right"), b = f.getBoundingClientRect()) : (b = l.domNode.getBoundingClientRect(), s > 0 && (v = "right")), { bottom: b.top + b.height, height: b.height, left: b[v], right: b[v], top: b.top, width: 0 } } }, { key: "getNativeRange", value: function () { var t = document.getSelection(); if (null == t || t.rangeCount <= 0) return null; var e = t.getRangeAt(0); if (null == e) return null; var n = this.normalizeNative(e); return m.info("getNativeRange", n), n } }, { key: "getRange", value: function () { var t = this.getNativeRange(); return null == t ? [null, null] : [this.normalizedToRange(t), t] } }, { key: "hasFocus", value: function () { return document.activeElement === this.root } }, { key: "normalizedToRange", value: function (t) { var e = this, n = [[t.start.node, t.start.offset]]; t.native.collapsed || n.push([t.end.node, t.end.offset]); var r = n.map(function (t) { var n = a(t, 2), r = n[0], o = n[1], i = c.default.find(r, !0), l = i.offset(e.scroll); return 0 === o ? l : i instanceof c.default.Container ? l + i.length() : l + i.index(r, o) }), i = Math.min(Math.max.apply(Math, o(r)), this.scroll.length() - 1), l = Math.min.apply(Math, [i].concat(o(r))); return new _(l, i - l) } }, { key: "normalizeNative", value: function (t) { if (!l(this.root, t.startContainer) || !t.collapsed && !l(this.root, t.endContainer)) return null; var e = { start: { node: t.startContainer, offset: t.startOffset }, end: { node: t.endContainer, offset: t.endOffset }, native: t }; return [e.start, e.end].forEach(function (t) { for (var e = t.node, n = t.offset; !(e instanceof Text) && e.childNodes.length > 0;)if (e.childNodes.length > n) e = e.childNodes[n], n = 0; else { if (e.childNodes.length !== n) break; e = e.lastChild, n = e instanceof Text ? e.data.length : e.childNodes.length + 1 } t.node = e, t.offset = n }), e } }, { key: "rangeToNative", value: function (t) { var e = this, n = t.collapsed ? [t.index] : [t.index, t.index + t.length], r = [], o = this.scroll.length(); return n.forEach(function (t, n) { t = Math.min(o - 1, t); var i = void 0, l = e.scroll.leaf(t), s = a(l, 2), u = s[0], c = s[1], f = u.position(c, 0 !== n), h = a(f, 2); i = h[0], c = h[1], r.push(i, c) }), r.length < 2 && (r = r.concat(r)), r } }, { key: "scrollIntoView", value: function (t) { var e = this.lastRange; if (null != e) { var n = this.getBounds(e.index, e.length); if (null != n) { var r = this.scroll.length() - 1, o = this.scroll.line(Math.min(e.index, r)), i = a(o, 1), l = i[0], s = l; if (e.length > 0) { var u = this.scroll.line(Math.min(e.index + e.length, r)); s = a(u, 1)[0] } if (null != l && null != s) { var c = t.getBoundingClientRect(); n.top < c.top ? t.scrollTop -= c.top - n.top : n.bottom > c.bottom && (t.scrollTop += n.bottom - c.bottom) } } } } }, { key: "setNativeRange", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : t, r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : e, o = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; if (m.info("setNativeRange", t, e, n, r), null == t || null != this.root.parentNode && null != t.parentNode && null != n.parentNode) { var i = document.getSelection(); if (null != i) if (null != t) { this.hasFocus() || this.root.focus(); var l = (this.getNativeRange() || {}).native; if (null == l || o || t !== l.startContainer || e !== l.startOffset || n !== l.endContainer || r !== l.endOffset) { "BR" == t.tagName && (e = [].indexOf.call(t.parentNode.childNodes, t), t = t.parentNode), "BR" == n.tagName && (r = [].indexOf.call(n.parentNode.childNodes, n), n = n.parentNode); var a = document.createRange(); a.setStart(t, e), a.setEnd(n, r), i.removeAllRanges(), i.addRange(a) } } else i.removeAllRanges(), this.root.blur(), document.body.focus() } } }, { key: "setRange", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : v.default.sources.API; if ("string" == typeof e && (n = e, e = !1), m.info("setRange", t), null != t) { var r = this.rangeToNative(t); this.setNativeRange.apply(this, o(r).concat([e])) } else this.setNativeRange(null); this.update(n) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : v.default.sources.USER, e = this.lastRange, n = this.getRange(), r = a(n, 2), o = r[0], i = r[1]; if (this.lastRange = o, null != this.lastRange && (this.savedRange = this.lastRange), !(0, d.default)(e, this.lastRange)) { var l; !this.composing && null != i && i.native.collapsed && i.start.node !== this.cursor.textNode && this.cursor.restore(); var s = [v.default.events.SELECTION_CHANGE, (0, h.default)(this.lastRange), (0, h.default)(e), t]; if ((l = this.emitter).emit.apply(l, [v.default.events.EDITOR_CHANGE].concat(s)), t !== v.default.sources.SILENT) { var u; (u = this.emitter).emit.apply(u, s) } } } }]), t }(); e.Range = _, e.default = O }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = n(0), s = r(a), u = n(3), c = r(u), f = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(s.default.Container); f.allowedChildren = [c.default, u.BlockEmbed, f], e.default = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.ColorStyle = e.ColorClass = e.ColorAttributor = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t); return n.startsWith("rgb(") ? (n = n.replace(/^[^\d]+/, "").replace(/[^\d]+$/, ""), "#" + n.split(",").map(function (t) { return ("00" + parseInt(t).toString(16)).slice(-2) }).join("")) : n } }]), e }(u.default.Attributor.Style), f = new u.default.Attributor.Class("color", "ql-color", { scope: u.default.Scope.INLINE }), h = new c("color", "color", { scope: u.default.Scope.INLINE }); e.ColorAttributor = c, e.ColorClass = f, e.ColorStyle = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e) { var n, r = t === D.keys.LEFT ? "prefix" : "suffix"; return n = { key: t, shiftKey: e, altKey: null }, o(n, r, /^$/), o(n, "handler", function (n) { var r = n.index; t === D.keys.RIGHT && (r += n.length + 1); var o = this.quill.getLeaf(r); return !(b(o, 1)[0] instanceof T.default.Embed) || (t === D.keys.LEFT ? e ? this.quill.setSelection(n.index - 1, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index - 1, S.default.sources.USER) : e ? this.quill.setSelection(n.index, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index + n.length + 1, S.default.sources.USER), !1) }), n } function u(t, e) { if (!(0 === t.index || this.quill.getLength() <= 1)) { var n = this.quill.getLine(t.index), r = b(n, 1), o = r[0], i = {}; if (0 === e.offset) { var l = this.quill.getLine(t.index - 1), a = b(l, 1), s = a[0]; if (null != s && s.length() > 1) { var u = o.formats(), c = this.quill.getFormat(t.index - 1, 1); i = A.default.attributes.diff(u, c) || {} } } var f = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix) ? 2 : 1; this.quill.deleteText(t.index - f, f, S.default.sources.USER), Object.keys(i).length > 0 && this.quill.formatLine(t.index - f, f, i, S.default.sources.USER), this.quill.focus() } } function c(t, e) { var n = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix) ? 2 : 1; if (!(t.index >= this.quill.getLength() - n)) { var r = {}, o = 0, i = this.quill.getLine(t.index), l = b(i, 1), a = l[0]; if (e.offset >= a.length() - 1) { var s = this.quill.getLine(t.index + 1), u = b(s, 1), c = u[0]; if (c) { var f = a.formats(), h = this.quill.getFormat(t.index, 1); r = A.default.attributes.diff(f, h) || {}, o = c.length() } } this.quill.deleteText(t.index, n, S.default.sources.USER), Object.keys(r).length > 0 && this.quill.formatLine(t.index + o - 1, n, r, S.default.sources.USER) } } function f(t) { var e = this.quill.getLines(t), n = {}; if (e.length > 1) { var r = e[0].formats(), o = e[e.length - 1].formats(); n = A.default.attributes.diff(o, r) || {} } this.quill.deleteText(t, S.default.sources.USER), Object.keys(n).length > 0 && this.quill.formatLine(t.index, 1, n, S.default.sources.USER), this.quill.setSelection(t.index, S.default.sources.SILENT), this.quill.focus() } function h(t, e) { var n = this; t.length > 0 && this.quill.scroll.deleteAt(t.index, t.length); var r = Object.keys(e.format).reduce(function (t, n) { return T.default.query(n, T.default.Scope.BLOCK) && !Array.isArray(e.format[n]) && (t[n] = e.format[n]), t }, {}); this.quill.insertText(t.index, "\n", r, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.focus(), Object.keys(e.format).forEach(function (t) { null == r[t] && (Array.isArray(e.format[t]) || "link" !== t && n.quill.format(t, e.format[t], S.default.sources.USER)) }) } function p(t) { return { key: D.keys.TAB, shiftKey: !t, format: { "code-block": !0 }, handler: function (e) { var n = T.default.query("code-block"), r = e.index, o = e.length, i = this.quill.scroll.descendant(n, r), l = b(i, 2), a = l[0], s = l[1]; if (null != a) { var u = this.quill.getIndex(a), c = a.newlineIndex(s, !0) + 1, f = a.newlineIndex(u + s + o), h = a.domNode.textContent.slice(c, f).split("\n"); s = 0, h.forEach(function (e, i) { t ? (a.insertAt(c + s, n.TAB), s += n.TAB.length, 0 === i ? r += n.TAB.length : o += n.TAB.length) : e.startsWith(n.TAB) && (a.deleteAt(c + s, n.TAB.length), s -= n.TAB.length, 0 === i ? r -= n.TAB.length : o -= n.TAB.length), s += e.length + 1 }), this.quill.update(S.default.sources.USER), this.quill.setSelection(r, o, S.default.sources.SILENT) } } } } function d(t) { return { key: t[0].toUpperCase(), shortKey: !0, handler: function (e, n) { this.quill.format(t, !n.format[t], S.default.sources.USER) } } } function y(t) { if ("string" == typeof t || "number" == typeof t) return y({ key: t }); if ("object" === (void 0 === t ? "undefined" : v(t)) && (t = (0, _.default)(t, !1)), "string" == typeof t.key) if (null != D.keys[t.key.toUpperCase()]) t.key = D.keys[t.key.toUpperCase()]; else { if (1 !== t.key.length) return null; t.key = t.key.toUpperCase().charCodeAt(0) } return t.shortKey && (t[B] = t.shortKey, delete t.shortKey), t } Object.defineProperty(e, "__esModule", { value: !0 }), e.SHORTKEY = e.default = void 0; var v = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, b = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), g = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), m = n(21), _ = r(m), O = n(12), w = r(O), x = n(2), k = r(x), E = n(4), N = r(E), j = n(20), A = r(j), q = n(0), T = r(q), P = n(6), S = r(P), C = n(10), L = r(C), M = n(7), R = r(M), I = (0, L.default)("quill:keyboard"), B = /Mac/i.test(navigator.platform) ? "metaKey" : "ctrlKey", D = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.bindings = {}, Object.keys(r.options.bindings).forEach(function (e) { ("list autofill" !== e || null == t.scroll.whitelist || t.scroll.whitelist.list) && r.options.bindings[e] && r.addBinding(r.options.bindings[e]) }), r.addBinding({ key: e.keys.ENTER, shiftKey: null }, h), r.addBinding({ key: e.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () { }), /Firefox/i.test(navigator.userAgent) ? (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0 }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0 }, c)) : (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0, prefix: /^.?$/ }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0, suffix: /^.?$/ }, c)), r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.DELETE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: !0, offset: 0 }, u), r.listen(), r } return a(e, t), g(e, null, [{ key: "match", value: function (t, e) { return e = y(e), !["altKey", "ctrlKey", "metaKey", "shiftKey"].some(function (n) { return !!e[n] !== t[n] && null !== e[n] }) && e.key === (t.which || t.keyCode) } }]), g(e, [{ key: "addBinding", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = y(t); if (null == r || null == r.key) return I.warn("Attempted to add invalid keyboard binding", r); "function" == typeof e && (e = { handler: e }), "function" == typeof n && (n = { handler: n }), r = (0, k.default)(r, e, n), this.bindings[r.key] = this.bindings[r.key] || [], this.bindings[r.key].push(r) } }, { key: "listen", value: function () { var t = this; this.quill.root.addEventListener("keydown", function (n) { if (!n.defaultPrevented) { var r = n.which || n.keyCode, o = (t.bindings[r] || []).filter(function (t) { return e.match(n, t) }); if (0 !== o.length) { var i = t.quill.getSelection(); if (null != i && t.quill.hasFocus()) { var l = t.quill.getLine(i.index), a = b(l, 2), s = a[0], u = a[1], c = t.quill.getLeaf(i.index), f = b(c, 2), h = f[0], p = f[1], d = 0 === i.length ? [h, p] : t.quill.getLeaf(i.index + i.length), y = b(d, 2), g = y[0], m = y[1], _ = h instanceof T.default.Text ? h.value().slice(0, p) : "", O = g instanceof T.default.Text ? g.value().slice(m) : "", x = { collapsed: 0 === i.length, empty: 0 === i.length && s.length() <= 1, format: t.quill.getFormat(i), offset: u, prefix: _, suffix: O }; o.some(function (e) { if (null != e.collapsed && e.collapsed !== x.collapsed) return !1; if (null != e.empty && e.empty !== x.empty) return !1; if (null != e.offset && e.offset !== x.offset) return !1; if (Array.isArray(e.format)) { if (e.format.every(function (t) { return null == x.format[t] })) return !1 } else if ("object" === v(e.format) && !Object.keys(e.format).every(function (t) { return !0 === e.format[t] ? null != x.format[t] : !1 === e.format[t] ? null == x.format[t] : (0, w.default)(e.format[t], x.format[t]) })) return !1; return !(null != e.prefix && !e.prefix.test(x.prefix)) && (!(null != e.suffix && !e.suffix.test(x.suffix)) && !0 !== e.handler.call(t, i, x)) }) && n.preventDefault() } } } }) } }]), e }(R.default); D.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, ESCAPE: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }, D.DEFAULTS = { bindings: { bold: d("bold"), italic: d("italic"), underline: d("underline"), indent: { key: D.keys.TAB, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "+1", S.default.sources.USER) } }, outdent: { key: D.keys.TAB, shiftKey: !0, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "-1", S.default.sources.USER) } }, "outdent backspace": { key: D.keys.BACKSPACE, collapsed: !0, shiftKey: null, metaKey: null, ctrlKey: null, altKey: null, format: ["indent", "list"], offset: 0, handler: function (t, e) { null != e.format.indent ? this.quill.format("indent", "-1", S.default.sources.USER) : null != e.format.list && this.quill.format("list", !1, S.default.sources.USER) } }, "indent code-block": p(!0), "outdent code-block": p(!1), "remove tab": { key: D.keys.TAB, shiftKey: !0, collapsed: !0, prefix: /\t$/, handler: function (t) { this.quill.deleteText(t.index - 1, 1, S.default.sources.USER) } }, tab: { key: D.keys.TAB, handler: function (t) { this.quill.history.cutoff(); var e = (new N.default).retain(t.index).delete(t.length).insert("\t"); this.quill.updateContents(e, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index + 1, S.default.sources.SILENT) } }, "list empty enter": { key: D.keys.ENTER, collapsed: !0, format: ["list"], empty: !0, handler: function (t, e) { this.quill.format("list", !1, S.default.sources.USER), e.format.indent && this.quill.format("indent", !1, S.default.sources.USER) } }, "checklist enter": { key: D.keys.ENTER, collapsed: !0, format: { list: "checked" }, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (0, k.default)({}, r.formats(), { list: "checked" }), l = (new N.default).retain(t.index).insert("\n", i).retain(r.length() - o - 1).retain(1, { list: "unchecked" }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "header enter": { key: D.keys.ENTER, collapsed: !0, format: ["header"], suffix: /^$/, handler: function (t, e) { var n = this.quill.getLine(t.index), r = b(n, 2), o = r[0], i = r[1], l = (new N.default).retain(t.index).insert("\n", e.format).retain(o.length() - i - 1).retain(1, { header: null }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "list autofill": { key: " ", collapsed: !0, format: { list: !1 }, prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, handler: function (t, e) { var n = e.prefix.length, r = this.quill.getLine(t.index), o = b(r, 2), i = o[0], l = o[1]; if (l > n) return !0; var a = void 0; switch (e.prefix.trim()) { case "[]": case "[ ]": a = "unchecked"; break; case "[x]": a = "checked"; break; case "-": case "*": a = "bullet"; break; default: a = "ordered" }this.quill.insertText(t.index, " ", S.default.sources.USER), this.quill.history.cutoff(); var s = (new N.default).retain(t.index - l).delete(n + 1).retain(i.length() - 2 - l).retain(1, { list: a }); this.quill.updateContents(s, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index - n, S.default.sources.SILENT) } }, "code exit": { key: D.keys.ENTER, collapsed: !0, format: ["code-block"], prefix: /\n\n$/, suffix: /^\s+$/, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (new N.default).retain(t.index + r.length() - o - 2).retain(1, { "code-block": null }).delete(1); this.quill.updateContents(i, S.default.sources.USER) } }, "embed left": s(D.keys.LEFT, !1), "embed left shift": s(D.keys.LEFT, !0), "embed right": s(D.keys.RIGHT, !1), "embed right shift": s(D.keys.RIGHT, !0) } }, e.default = D, e.SHORTKEY = B }, function (t, e, n) { "use strict"; t.exports = { align: { "": n(75), center: n(76), right: n(77), justify: n(78) }, background: n(79), blockquote: n(80), bold: n(81), clean: n(82), code: n(40), "code-block": n(40), color: n(83), direction: { "": n(84), rtl: n(85) }, float: { center: n(86), full: n(87), left: n(88), right: n(89) }, formula: n(90), header: { 1: n(91), 2: n(92) }, italic: n(93), image: n(94), indent: { "+1": n(95), "-1": n(96) }, link: n(97), list: { ordered: n(98), bullet: n(99), check: n(100) }, script: { sub: n(101), super: n(102) }, strike: n(103), underline: n(104), video: n(105) } }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t) { this.domNode = t, this.domNode[r.DATA_KEY] = { blot: this } } return Object.defineProperty(t.prototype, "statics", { get: function () { return this.constructor }, enumerable: !0, configurable: !0 }), t.create = function (t) { if (null == this.tagName) throw new r.ParchmentError("Blot definition missing tagName"); var e; return Array.isArray(this.tagName) ? ("string" == typeof t && (t = t.toUpperCase(), parseInt(t).toString() === t && (t = parseInt(t))), e = "number" == typeof t ? document.createElement(this.tagName[t - 1]) : this.tagName.indexOf(t) > -1 ? document.createElement(t) : document.createElement(this.tagName[0])) : e = document.createElement(this.tagName), this.className && e.classList.add(this.className), e }, t.prototype.attach = function () { null != this.parent && (this.scroll = this.parent.scroll) }, t.prototype.clone = function () { var t = this.domNode.cloneNode(!1); return r.create(t) }, t.prototype.detach = function () { null != this.parent && this.parent.removeChild(this), delete this.domNode[r.DATA_KEY] }, t.prototype.deleteAt = function (t, e) { this.isolate(t, e).remove() }, t.prototype.formatAt = function (t, e, n, o) { var i = this.isolate(t, e); if (null != r.query(n, r.Scope.BLOT) && o) i.wrap(n, o); else if (null != r.query(n, r.Scope.ATTRIBUTE)) { var l = r.create(this.statics.scope); i.wrap(l), l.format(n, o) } }, t.prototype.insertAt = function (t, e, n) { var o = null == n ? r.create("text", e) : r.create(e, n), i = this.split(t); this.parent.insertBefore(o, i) }, t.prototype.insertInto = function (t, e) { void 0 === e && (e = null), null != this.parent && this.parent.children.remove(this); var n = null; t.children.insertBefore(this, e), null != e && (n = e.domNode), this.domNode.parentNode == t.domNode && this.domNode.nextSibling == n || t.domNode.insertBefore(this.domNode, n), this.parent = t, this.attach() }, t.prototype.isolate = function (t, e) { var n = this.split(t); return n.split(e), n }, t.prototype.length = function () { return 1 }, t.prototype.offset = function (t) { return void 0 === t && (t = this.parent), null == this.parent || this == t ? 0 : this.parent.children.offset(this) + this.parent.offset(t) }, t.prototype.optimize = function (t) { null != this.domNode[r.DATA_KEY] && delete this.domNode[r.DATA_KEY].mutations }, t.prototype.remove = function () { null != this.domNode.parentNode && this.domNode.parentNode.removeChild(this.domNode), this.detach() }, t.prototype.replace = function (t) { null != t.parent && (t.parent.insertBefore(this, t.next), t.remove()) }, t.prototype.replaceWith = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return n.replace(this), n }, t.prototype.split = function (t, e) { return 0 === t ? this : this.next }, t.prototype.update = function (t, e) { }, t.prototype.wrap = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return null != this.parent && this.parent.insertBefore(n, this.next), n.appendChild(this), n }, t.blotName = "abstract", t }(); e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(11), o = n(29), i = n(30), l = n(1), a = function () { function t(t) { this.attributes = {}, this.domNode = t, this.build() } return t.prototype.attribute = function (t, e) { e ? t.add(this.domNode, e) && (null != t.value(this.domNode) ? this.attributes[t.attrName] = t : delete this.attributes[t.attrName]) : (t.remove(this.domNode), delete this.attributes[t.attrName]) }, t.prototype.build = function () { var t = this; this.attributes = {}; var e = r.default.keys(this.domNode), n = o.default.keys(this.domNode), a = i.default.keys(this.domNode); e.concat(n).concat(a).forEach(function (e) { var n = l.query(e, l.Scope.ATTRIBUTE); n instanceof r.default && (t.attributes[n.attrName] = n) }) }, t.prototype.copy = function (t) { var e = this; Object.keys(this.attributes).forEach(function (n) { var r = e.attributes[n].value(e.domNode); t.format(n, r) }) }, t.prototype.move = function (t) { var e = this; this.copy(t), Object.keys(this.attributes).forEach(function (t) { e.attributes[t].remove(e.domNode) }), this.attributes = {} }, t.prototype.values = function () { var t = this; return Object.keys(this.attributes).reduce(function (e, n) { return e[n] = t.attributes[n].value(t.domNode), e }, {}) }, t }(); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { return (t.getAttribute("class") || "").split(/\s+/).filter(function (t) { return 0 === t.indexOf(e + "-") }) } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("class") || "").split(/\s+/).map(function (t) { return t.split("-").slice(0, -1).join("-") }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (this.remove(t), t.classList.add(this.keyName + "-" + e), !0) }, e.prototype.remove = function (t) { r(t, this.keyName).forEach(function (e) { t.classList.remove(e) }), 0 === t.classList.length && t.removeAttribute("class") }, e.prototype.value = function (t) { var e = r(t, this.keyName)[0] || "", n = e.slice(this.keyName.length + 1); return this.canAdd(t, n) ? n : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { var e = t.split("-"), n = e.slice(1).map(function (t) { return t[0].toUpperCase() + t.slice(1) }).join(""); return e[0] + n } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("style") || "").split(";").map(function (t) { return t.split(":")[0].trim() }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.style[r(this.keyName)] = e, !0) }, e.prototype.remove = function (t) { t.style[r(this.keyName)] = "", t.getAttribute("style") || t.removeAttribute("style") }, e.prototype.value = function (t) { var e = t.style[r(this.keyName)]; return this.canAdd(t, e) ? e : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(8), p = r(h), d = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.selection = n, r.textNode = document.createTextNode(e.CONTENTS), r.domNode.appendChild(r.textNode), r._length = 0, r } return l(e, t), u(e, null, [{ key: "value", value: function () { } }]), u(e, [{ key: "detach", value: function () { null != this.parent && this.parent.removeChild(this) } }, { key: "format", value: function (t, n) { if (0 !== this._length) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); for (var r = this, o = 0; null != r && r.statics.scope !== f.default.Scope.BLOCK_BLOT;)o += r.offset(r.parent), r = r.parent; null != r && (this._length = e.CONTENTS.length, r.optimize(), r.formatAt(o, e.CONTENTS.length, t, n), this._length = 0) } }, { key: "index", value: function (t, n) { return t === this.textNode ? 0 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "length", value: function () { return this._length } }, { key: "position", value: function () { return [this.textNode, this.textNode.data.length] } }, { key: "remove", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this), this.parent = null } }, { key: "restore", value: function () { if (!this.selection.composing && null != this.parent) { var t = this.textNode, n = this.selection.getNativeRange(), r = void 0, o = void 0, i = void 0; if (null != n && n.start.node === t && n.end.node === t) { var l = [t, n.start.offset, n.end.offset]; r = l[0], o = l[1], i = l[2] } for (; null != this.domNode.lastChild && this.domNode.lastChild !== this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); if (this.textNode.data !== e.CONTENTS) { var s = this.textNode.data.split(e.CONTENTS).join(""); this.next instanceof p.default ? (r = this.next.domNode, this.next.insertAt(0, s), this.textNode.data = e.CONTENTS) : (this.textNode.data = s, this.parent.insertBefore(f.default.create(this.textNode), this), this.textNode = document.createTextNode(e.CONTENTS), this.domNode.appendChild(this.textNode)) } if (this.remove(), null != o) { var u = [o, i].map(function (t) { return Math.max(0, Math.min(r.data.length, t - 1)) }), c = a(u, 2); return o = c[0], i = c[1], { startNode: r, startOffset: o, endNode: r, endOffset: i } } } } }, { key: "update", value: function (t, e) { var n = this; if (t.some(function (t) { return "characterData" === t.type && t.target === n.textNode })) { var r = this.restore(); r && (e.range = r) } } }, { key: "value", value: function () { return "" } }]), e }(f.default.Embed); d.blotName = "cursor", d.className = "ql-cursor", d.tagName = "span", d.CONTENTS = "\ufeff", e.default = d }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { r(this, t), this.quill = e, this.options = n, this.modules = {} } return o(t, [{ key: "init", value: function () { var t = this; Object.keys(this.options.modules).forEach(function (e) { null == t.modules[e] && t.addModule(e) }) } }, { key: "addModule", value: function (t) { var e = this.quill.constructor.import("modules/" + t); return this.modules[t] = new e(this.quill, this.options.modules[t] || {}), this.modules[t] } }]), t }(); i.DEFAULTS = { modules: {} }, i.themes = { default: i }, e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(8), h = r(f), p = "\ufeff", d = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.contentNode = document.createElement("span"), n.contentNode.setAttribute("contenteditable", !1), [].slice.call(n.domNode.childNodes).forEach(function (t) { n.contentNode.appendChild(t) }), n.leftGuard = document.createTextNode(p), n.rightGuard = document.createTextNode(p), n.domNode.appendChild(n.leftGuard), n.domNode.appendChild(n.contentNode), n.domNode.appendChild(n.rightGuard), n } return l(e, t), a(e, [{ key: "index", value: function (t, n) { return t === this.leftGuard ? 0 : t === this.rightGuard ? 1 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "restore", value: function (t) { var e = void 0, n = void 0, r = t.data.split(p).join(""); if (t === this.leftGuard) if (this.prev instanceof h.default) { var o = this.prev.length(); this.prev.insertAt(o, r), e = { startNode: this.prev.domNode, startOffset: o + r.length } } else n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this), e = { startNode: n, startOffset: r.length }; else t === this.rightGuard && (this.next instanceof h.default ? (this.next.insertAt(0, r), e = { startNode: this.next.domNode, startOffset: r.length }) : (n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this.next), e = { startNode: n, startOffset: r.length })); return t.data = p, e } }, { key: "update", value: function (t, e) { var n = this; t.forEach(function (t) { if ("characterData" === t.type && (t.target === n.leftGuard || t.target === n.rightGuard)) { var r = n.restore(t.target); r && (e.range = r) } }) } }]), e }(c.default.Embed); e.default = d }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.AlignStyle = e.AlignClass = e.AlignAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["right", "center", "justify"] }, l = new o.default.Attributor.Attribute("align", "align", i), a = new o.default.Attributor.Class("align", "ql-align", i), s = new o.default.Attributor.Style("align", "text-align", i); e.AlignAttribute = l, e.AlignClass = a, e.AlignStyle = s }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.BackgroundStyle = e.BackgroundClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = n(24), l = new o.default.Attributor.Class("background", "ql-bg", { scope: o.default.Scope.INLINE }), a = new i.ColorAttributor("background", "background-color", { scope: o.default.Scope.INLINE }); e.BackgroundClass = l, e.BackgroundStyle = a }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.DirectionStyle = e.DirectionClass = e.DirectionAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["rtl"] }, l = new o.default.Attributor.Attribute("direction", "dir", i), a = new o.default.Attributor.Class("direction", "ql-direction", i), s = new o.default.Attributor.Style("direction", "direction", i); e.DirectionAttribute = l, e.DirectionClass = a, e.DirectionStyle = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.FontClass = e.FontStyle = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = { scope: u.default.Scope.INLINE, whitelist: ["serif", "monospace"] }, f = new u.default.Attributor.Class("font", "ql-font", c), h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t).replace(/["']/g, "") } }]), e }(u.default.Attributor.Style), p = new h("font", "font-family", c); e.FontStyle = p, e.FontClass = f }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.SizeStyle = e.SizeClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = new o.default.Attributor.Class("size", "ql-size", { scope: o.default.Scope.INLINE, whitelist: ["small", "large", "huge"] }), l = new o.default.Attributor.Style("size", "font-size", { scope: o.default.Scope.INLINE, whitelist: ["10px", "18px", "32px"] }); e.SizeClass = i, e.SizeStyle = l }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "optimize", value: function (t) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.domNode.tagName !== this.statics.tagName[0] && this.replaceWith(this.statics.blotName) } }], [{ key: "create", value: function () { return a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this) } }, { key: "formats", value: function () { return !0 } }]), e }(u.default); c.blotName = "bold", c.tagName = ["STRONG", "B"], e.default = c }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.label.innerHTML = n, i.container.classList.add("ql-color-picker"), [].slice.call(i.container.querySelectorAll(".ql-picker-item"), 0, 7).forEach(function (t) { t.classList.add("ql-primary") }), i } return i(e, t), l(e, [{ key: "buildItem", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "buildItem", this).call(this, t); return n.style.backgroundColor = t.getAttribute("value") || "", n } }, { key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n); var r = this.label.querySelector(".ql-color-label"), o = t ? t.getAttribute("data-value") || "" : ""; r && ("line" === r.tagName ? r.style.stroke = o : r.style.fill = o) } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.container.classList.add("ql-icon-picker"), [].forEach.call(i.container.querySelectorAll(".ql-picker-item"), function (t) { t.innerHTML = n[t.getAttribute("data-value") || ""] }), i.defaultItem = i.container.querySelector(".ql-selected"), i.selectItem(i.defaultItem), i } return i(e, t), l(e, [{ key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n), t = t || this.defaultItem, this.label.innerHTML = t.innerHTML } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { var o = this; r(this, t), this.quill = e, this.boundsContainer = n || document.body, this.root = e.addContainer("ql-tooltip"), this.root.innerHTML = this.constructor.TEMPLATE, this.quill.root === this.quill.scrollingContainer && this.quill.root.addEventListener("scroll", function () { o.root.style.marginTop = -1 * o.quill.root.scrollTop + "px" }), this.hide() } return o(t, [{ key: "hide", value: function () { this.root.classList.add("ql-hidden") } }, { key: "position", value: function (t) { var e = t.left + t.width / 2 - this.root.offsetWidth / 2, n = t.bottom + this.quill.root.scrollTop; this.root.style.left = e + "px", this.root.style.top = n + "px", this.root.classList.remove("ql-flip"); var r = this.boundsContainer.getBoundingClientRect(), o = this.root.getBoundingClientRect(), i = 0; if (o.right > r.right && (i = r.right - o.right, this.root.style.left = e + i + "px"), o.left < r.left && (i = r.left - o.left, this.root.style.left = e + i + "px"), o.bottom > r.bottom) { var l = o.bottom - o.top, a = t.bottom - t.top + l; this.root.style.top = n - a + "px", this.root.classList.add("ql-flip") } return i } }, { key: "show", value: function () { this.root.classList.remove("ql-editing"), this.root.classList.remove("ql-hidden") } }]), t }(); e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); return e ? (e[1] || "https") + "://www.youtube.com/embed/" + e[2] + "?showinfo=0" : (e = t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) ? (e[1] || "https") + "://player.vimeo.com/video/" + e[2] + "/" : t } function s(t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; e.forEach(function (e) { var r = document.createElement("option"); e === n ? r.setAttribute("selected", "selected") : r.setAttribute("value", e), t.appendChild(r) }) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BaseTooltip = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(2), h = r(f), p = n(4), d = r(p), y = n(9), v = r(y), b = n(25), g = r(b), m = n(32), _ = r(m), O = n(41), w = r(O), x = n(42), k = r(x), E = n(16), N = r(E), j = n(43), A = r(j), q = [!1, "center", "right", "justify"], T = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"], P = [!1, "serif", "monospace"], S = ["1", "2", "3", !1], C = ["small", !1, "large", "huge"], L = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)), l = function e(n) { if (!document.body.contains(t.root)) return document.body.removeEventListener("click", e); null == r.tooltip || r.tooltip.root.contains(n.target) || document.activeElement === r.tooltip.textbox || r.quill.hasFocus() || r.tooltip.hide(), null != r.pickers && r.pickers.forEach(function (t) { t.container.contains(n.target) || t.close() }) }; return t.emitter.listenDOM("click", document.body, l), r } return l(e, t), u(e, [{ key: "addModule", value: function (t) { var n = c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "addModule", this).call(this, t); return "toolbar" === t && this.extendToolbar(n), n } }, { key: "buildButtons", value: function (t, e) { t.forEach(function (t) { (t.getAttribute("class") || "").split(/\s+/).forEach(function (n) { if (n.startsWith("ql-") && (n = n.slice("ql-".length), null != e[n])) if ("direction" === n) t.innerHTML = e[n][""] + e[n].rtl; else if ("string" == typeof e[n]) t.innerHTML = e[n]; else { var r = t.value || ""; null != r && e[n][r] && (t.innerHTML = e[n][r]) } }) }) } }, { key: "buildPickers", value: function (t, e) { var n = this; this.pickers = t.map(function (t) { if (t.classList.contains("ql-align")) return null == t.querySelector("option") && s(t, q), new k.default(t, e.align); if (t.classList.contains("ql-background") || t.classList.contains("ql-color")) { var n = t.classList.contains("ql-background") ? "background" : "color"; return null == t.querySelector("option") && s(t, T, "background" === n ? "#ffffff" : "#000000"), new w.default(t, e[n]) } return null == t.querySelector("option") && (t.classList.contains("ql-font") ? s(t, P) : t.classList.contains("ql-header") ? s(t, S) : t.classList.contains("ql-size") && s(t, C)), new N.default(t) }); var r = function () { n.pickers.forEach(function (t) { t.update() }) }; this.quill.on(v.default.events.EDITOR_CHANGE, r) } }]), e }(_.default); L.DEFAULTS = (0, h.default)(!0, {}, _.default.DEFAULTS, { modules: { toolbar: { handlers: { formula: function () { this.quill.theme.tooltip.edit("formula") }, image: function () { var t = this, e = this.container.querySelector("input.ql-image[type=file]"); null == e && (e = document.createElement("input"), e.setAttribute("type", "file"), e.setAttribute("accept", "image/png, image/gif, image/jpeg, image/bmp, image/x-icon"), e.classList.add("ql-image"), e.addEventListener("change", function () { if (null != e.files && null != e.files[0]) { var n = new FileReader; n.onload = function (n) { var r = t.quill.getSelection(!0); t.quill.updateContents((new d.default).retain(r.index).delete(r.length).insert({ image: n.target.result }), v.default.sources.USER), t.quill.setSelection(r.index + 1, v.default.sources.SILENT), e.value = "" }, n.readAsDataURL(e.files[0]) } }), this.container.appendChild(e)), e.click() }, video: function () { this.quill.theme.tooltip.edit("video") } } } } }); var M = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.textbox = r.root.querySelector('input[type="text"]'), r.listen(), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; this.textbox.addEventListener("keydown", function (e) { g.default.match(e, "enter") ? (t.save(), e.preventDefault()) : g.default.match(e, "escape") && (t.cancel(), e.preventDefault()) }) } }, { key: "cancel", value: function () { this.hide() } }, { key: "edit", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "link", e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; this.root.classList.remove("ql-hidden"), this.root.classList.add("ql-editing"), null != e ? this.textbox.value = e : t !== this.root.getAttribute("data-mode") && (this.textbox.value = ""), this.position(this.quill.getBounds(this.quill.selection.savedRange)), this.textbox.select(), this.textbox.setAttribute("placeholder", this.textbox.getAttribute("data-" + t) || ""), this.root.setAttribute("data-mode", t) } }, { key: "restoreFocus", value: function () { var t = this.quill.scrollingContainer.scrollTop; this.quill.focus(), this.quill.scrollingContainer.scrollTop = t } }, { key: "save", value: function () { var t = this.textbox.value; switch (this.root.getAttribute("data-mode")) { case "link": var e = this.quill.root.scrollTop; this.linkRange ? (this.quill.formatText(this.linkRange, "link", t, v.default.sources.USER), delete this.linkRange) : (this.restoreFocus(), this.quill.format("link", t, v.default.sources.USER)), this.quill.root.scrollTop = e; break; case "video": t = a(t); case "formula": if (!t) break; var n = this.quill.getSelection(!0); if (null != n) { var r = n.index + n.length; this.quill.insertEmbed(r, this.root.getAttribute("data-mode"), t, v.default.sources.USER), "formula" === this.root.getAttribute("data-mode") && this.quill.insertText(r + 1, " ", v.default.sources.USER), this.quill.setSelection(r + 2, v.default.sources.USER) } }this.textbox.value = "", this.hide() } }]), e }(A.default); e.BaseTooltip = M, e.default = L }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(46), i = r(o), l = n(34), a = n(36), s = n(62), u = n(63), c = r(u), f = n(64), h = r(f), p = n(65), d = r(p), y = n(35), v = n(24), b = n(37), g = n(38), m = n(39), _ = r(m), O = n(66), w = r(O), x = n(15), k = r(x), E = n(67), N = r(E), j = n(68), A = r(j), q = n(69), T = r(q), P = n(70), S = r(P), C = n(71), L = r(C), M = n(13), R = r(M), I = n(72), B = r(I), D = n(73), U = r(D), F = n(74), H = r(F), K = n(26), z = r(K), V = n(16), Z = r(V), W = n(41), G = r(W), Y = n(42), X = r(Y), $ = n(43), Q = r($), J = n(107), tt = r(J), et = n(108), nt = r(et); i.default.register({ "attributors/attribute/direction": a.DirectionAttribute, "attributors/class/align": l.AlignClass, "attributors/class/background": y.BackgroundClass, "attributors/class/color": v.ColorClass, "attributors/class/direction": a.DirectionClass, "attributors/class/font": b.FontClass, "attributors/class/size": g.SizeClass, "attributors/style/align": l.AlignStyle, "attributors/style/background": y.BackgroundStyle, "attributors/style/color": v.ColorStyle, "attributors/style/direction": a.DirectionStyle, "attributors/style/font": b.FontStyle, "attributors/style/size": g.SizeStyle }, !0), i.default.register({ "formats/align": l.AlignClass, "formats/direction": a.DirectionClass, "formats/indent": s.IndentClass, "formats/background": y.BackgroundStyle, "formats/color": v.ColorStyle, "formats/font": b.FontClass, "formats/size": g.SizeClass, "formats/blockquote": c.default, "formats/code-block": R.default, "formats/header": h.default, "formats/list": d.default, "formats/bold": _.default, "formats/code": M.Code, "formats/italic": w.default, "formats/link": k.default, "formats/script": N.default, "formats/strike": A.default, "formats/underline": T.default, "formats/image": S.default, "formats/video": L.default, "formats/list/item": p.ListItem, "modules/formula": B.default, "modules/syntax": U.default, "modules/toolbar": H.default, "themes/bubble": tt.default, "themes/snow": nt.default, "ui/icons": z.default, "ui/picker": Z.default, "ui/icon-picker": X.default, "ui/color-picker": G.default, "ui/tooltip": Q.default }, !0), e.default = i.default }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(0), i = r(o), l = n(6), a = r(l), s = n(3), u = r(s), c = n(14), f = r(c), h = n(23), p = r(h), d = n(31), y = r(d), v = n(33), b = r(v), g = n(5), m = r(g), _ = n(59), O = r(_), w = n(8), x = r(w), k = n(60), E = r(k), N = n(61), j = r(N), A = n(25), q = r(A); a.default.register({ "blots/block": u.default, "blots/block/embed": s.BlockEmbed, "blots/break": f.default, "blots/container": p.default, "blots/cursor": y.default, "blots/embed": b.default, "blots/inline": m.default, "blots/scroll": O.default, "blots/text": x.default, "modules/clipboard": E.default, "modules/history": j.default, "modules/keyboard": q.default }), i.default.register(u.default, f.default, y.default, m.default, O.default, x.default), e.default = a.default }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = function () { function t() { this.head = this.tail = null, this.length = 0 } return t.prototype.append = function () { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; this.insertBefore(t[0], null), t.length > 1 && this.append.apply(this, t.slice(1)) }, t.prototype.contains = function (t) { for (var e, n = this.iterator(); e = n();)if (e === t) return !0; return !1 }, t.prototype.insertBefore = function (t, e) { t && (t.next = e, null != e ? (t.prev = e.prev, null != e.prev && (e.prev.next = t), e.prev = t, e === this.head && (this.head = t)) : null != this.tail ? (this.tail.next = t, t.prev = this.tail, this.tail = t) : (t.prev = null, this.head = this.tail = t), this.length += 1) }, t.prototype.offset = function (t) { for (var e = 0, n = this.head; null != n;) { if (n === t) return e; e += n.length(), n = n.next } return -1 }, t.prototype.remove = function (t) { this.contains(t) && (null != t.prev && (t.prev.next = t.next), null != t.next && (t.next.prev = t.prev), t === this.head && (this.head = t.next), t === this.tail && (this.tail = t.prev), this.length -= 1) }, t.prototype.iterator = function (t) { return void 0 === t && (t = this.head), function () { var e = t; return null != t && (t = t.next), e } }, t.prototype.find = function (t, e) { void 0 === e && (e = !1); for (var n, r = this.iterator(); n = r();) { var o = n.length(); if (t < o || e && t === o && (null == n.next || 0 !== n.next.length())) return [n, t]; t -= o } return [null, 0] }, t.prototype.forEach = function (t) { for (var e, n = this.iterator(); e = n();)t(e) }, t.prototype.forEachAt = function (t, e, n) { if (!(e <= 0)) for (var r, o = this.find(t), i = o[0], l = o[1], a = t - l, s = this.iterator(i); (r = s()) && a < t + e;) { var u = r.length(); t > a ? n(r, t - a, Math.min(e, a + u - t)) : n(r, 0, Math.min(u, t + e - a)), a += u } }, t.prototype.map = function (t) { return this.reduce(function (e, n) { return e.push(t(n)), e }, []) }, t.prototype.reduce = function (t, e) { for (var n, r = this.iterator(); n = r();)e = t(e, n); return e }, t }(); e.default = r }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(17), i = n(1), l = { attributes: !0, characterData: !0, characterDataOldValue: !0, childList: !0, subtree: !0 }, a = function (t) { function e(e) { var n = t.call(this, e) || this; return n.scroll = n, n.observer = new MutationObserver(function (t) { n.update(t) }), n.observer.observe(n.domNode, l), n.attach(), n } return r(e, t), e.prototype.detach = function () { t.prototype.detach.call(this), this.observer.disconnect() }, e.prototype.deleteAt = function (e, n) { this.update(), 0 === e && n === this.length() ? this.children.forEach(function (t) { t.remove() }) : t.prototype.deleteAt.call(this, e, n) }, e.prototype.formatAt = function (e, n, r, o) { this.update(), t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { this.update(), t.prototype.insertAt.call(this, e, n, r) }, e.prototype.optimize = function (e, n) { var r = this; void 0 === e && (e = []), void 0 === n && (n = {}), t.prototype.optimize.call(this, n); for (var l = [].slice.call(this.observer.takeRecords()); l.length > 0;)e.push(l.pop()); for (var a = function (t, e) { void 0 === e && (e = !0), null != t && t !== r && null != t.domNode.parentNode && (null == t.domNode[i.DATA_KEY].mutations && (t.domNode[i.DATA_KEY].mutations = []), e && a(t.parent)) }, s = function (t) { null != t.domNode[i.DATA_KEY] && null != t.domNode[i.DATA_KEY].mutations && (t instanceof o.default && t.children.forEach(s), t.optimize(n)) }, u = e, c = 0; u.length > 0; c += 1) { if (c >= 100) throw new Error("[Parchment] Maximum optimize iterations reached"); for (u.forEach(function (t) { var e = i.find(t.target, !0); null != e && (e.domNode === t.target && ("childList" === t.type ? (a(i.find(t.previousSibling, !1)), [].forEach.call(t.addedNodes, function (t) { var e = i.find(t, !1); a(e, !1), e instanceof o.default && e.children.forEach(function (t) { a(t, !1) }) })) : "attributes" === t.type && a(e.prev)), a(e)) }), this.children.forEach(s), u = [].slice.call(this.observer.takeRecords()), l = u.slice(); l.length > 0;)e.push(l.pop()) } }, e.prototype.update = function (e, n) { var r = this; void 0 === n && (n = {}), e = e || this.observer.takeRecords(), e.map(function (t) { var e = i.find(t.target, !0); return null == e ? null : null == e.domNode[i.DATA_KEY].mutations ? (e.domNode[i.DATA_KEY].mutations = [t], e) : (e.domNode[i.DATA_KEY].mutations.push(t), null) }).forEach(function (t) { null != t && t !== r && null != t.domNode[i.DATA_KEY] && t.update(t.domNode[i.DATA_KEY].mutations || [], n) }), null != this.domNode[i.DATA_KEY].mutations && t.prototype.update.call(this, this.domNode[i.DATA_KEY].mutations, n), this.optimize(e, n) }, e.blotName = "scroll", e.defaultChild = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "DIV", e }(o.default); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { if (Object.keys(t).length !== Object.keys(e).length) return !1; for (var n in t) if (t[n] !== e[n]) return !1; return !0 } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(18), l = n(1), a = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.formats = function (n) { if (n.tagName !== e.tagName) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { var o = this; n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : (this.children.forEach(function (t) { t instanceof i.default || (t = t.wrap(e.blotName, !0)), o.attributes.copy(t) }), this.unwrap()) }, e.prototype.formatAt = function (e, n, r, o) { if (null != this.formats()[r] || l.query(r, l.Scope.ATTRIBUTE)) { this.isolate(e, n).format(r, o) } else t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n); var o = this.formats(); if (0 === Object.keys(o).length) return this.unwrap(); var i = this.next; i instanceof e && i.prev === this && r(o, i.formats()) && (i.moveChildren(this), i.remove()) }, e.blotName = "inline", e.scope = l.Scope.INLINE_BLOT, e.tagName = "SPAN", e }(i.default); e.default = a }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(18), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (n) { var r = i.query(e.blotName).tagName; if (n.tagName !== r) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { null != i.query(n, i.Scope.BLOCK) && (n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : this.replaceWith(e.blotName)) }, e.prototype.formatAt = function (e, n, r, o) { null != i.query(r, i.Scope.BLOCK) ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { if (null == r || null != i.query(n, i.Scope.INLINE)) t.prototype.insertAt.call(this, e, n, r); else { var o = this.split(e), l = i.create(n, r); o.parent.insertBefore(l, o) } }, e.prototype.update = function (e, n) { navigator.userAgent.match(/Trident/) ? this.build() : t.prototype.update.call(this, e, n) }, e.blotName = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "P", e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (t) { }, e.prototype.format = function (e, n) { t.prototype.formatAt.call(this, 0, this.length(), e, n) }, e.prototype.formatAt = function (e, n, r, o) { 0 === e && n === this.length() ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.formats = function () { return this.statics.formats(this.domNode) }, e }(o.default); e.default = i }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = n(1), l = function (t) { function e(e) { var n = t.call(this, e) || this; return n.text = n.statics.value(n.domNode), n } return r(e, t), e.create = function (t) { return document.createTextNode(t) }, e.value = function (t) { var e = t.data; return e.normalize && (e = e.normalize()), e }, e.prototype.deleteAt = function (t, e) { this.domNode.data = this.text = this.text.slice(0, t) + this.text.slice(t + e) }, e.prototype.index = function (t, e) { return this.domNode === t ? e : -1 }, e.prototype.insertAt = function (e, n, r) { null == r ? (this.text = this.text.slice(0, e) + n + this.text.slice(e), this.domNode.data = this.text) : t.prototype.insertAt.call(this, e, n, r) }, e.prototype.length = function () { return this.text.length }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n), this.text = this.statics.value(this.domNode), 0 === this.text.length ? this.remove() : this.next instanceof e && this.next.prev === this && (this.insertAt(this.length(), this.next.value()), this.next.remove()) }, e.prototype.position = function (t, e) { return void 0 === e && (e = !1), [this.domNode, t] }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = i.create(this.domNode.splitText(t)); return this.parent.insertBefore(n, this.next), this.text = this.statics.value(this.domNode), n }, e.prototype.update = function (t, e) { var n = this; t.some(function (t) { return "characterData" === t.type && t.target === n.domNode }) && (this.text = this.statics.value(this.domNode)) }, e.prototype.value = function () { return this.text }, e.blotName = "text", e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = document.createElement("div"); if (r.classList.toggle("test-class", !1), r.classList.contains("test-class")) { var o = DOMTokenList.prototype.toggle; DOMTokenList.prototype.toggle = function (t, e) { return arguments.length > 1 && !this.contains(t) == !e ? e : o.call(this, t) } } String.prototype.startsWith || (String.prototype.startsWith = function (t, e) { return e = e || 0, this.substr(e, t.length) === t }), String.prototype.endsWith || (String.prototype.endsWith = function (t, e) { var n = this.toString(); ("number" != typeof e || !isFinite(e) || Math.floor(e) !== e || e > n.length) && (e = n.length), e -= t.length; var r = n.indexOf(t, e); return -1 !== r && r === e }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", { value: function (t) { if (null === this) throw new TypeError("Array.prototype.find called on null or undefined"); if ("function" != typeof t) throw new TypeError("predicate must be a function"); for (var e, n = Object(this), r = n.length >>> 0, o = arguments[1], i = 0; i < r; i++)if (e = n[i], t.call(o, e, i, n)) return e } }), document.addEventListener("DOMContentLoaded", function () { document.execCommand("enableObjectResizing", !1, !1), document.execCommand("autoUrlDetect", !1, !1) }) }, function (t, e) { function n(t, e, n) { if (t == e) return t ? [[v, t]] : []; (n < 0 || t.length < n) && (n = null); var o = l(t, e), i = t.substring(0, o); t = t.substring(o), e = e.substring(o), o = a(t, e); var s = t.substring(t.length - o); t = t.substring(0, t.length - o), e = e.substring(0, e.length - o); var c = r(t, e); return i && c.unshift([v, i]), s && c.push([v, s]), u(c), null != n && (c = f(c, n)), c = h(c) } function r(t, e) { var r; if (!t) return [[y, e]]; if (!e) return [[d, t]]; var i = t.length > e.length ? t : e, l = t.length > e.length ? e : t, a = i.indexOf(l); if (-1 != a) return r = [[y, i.substring(0, a)], [v, l], [y, i.substring(a + l.length)]], t.length > e.length && (r[0][0] = r[2][0] = d), r; if (1 == l.length) return [[d, t], [y, e]]; var u = s(t, e); if (u) { var c = u[0], f = u[1], h = u[2], p = u[3], b = u[4], g = n(c, h), m = n(f, p); return g.concat([[v, b]], m) } return o(t, e) } function o(t, e) { for (var n = t.length, r = e.length, o = Math.ceil((n + r) / 2), l = o, a = 2 * o, s = new Array(a), u = new Array(a), c = 0; c < a; c++)s[c] = -1, u[c] = -1; s[l + 1] = 0, u[l + 1] = 0; for (var f = n - r, h = f % 2 != 0, p = 0, v = 0, b = 0, g = 0, m = 0; m < o; m++) { for (var _ = -m + p; _ <= m - v; _ += 2) { var O, w = l + _; O = _ == -m || _ != m && s[w - 1] < s[w + 1] ? s[w + 1] : s[w - 1] + 1; for (var x = O - _; O < n && x < r && t.charAt(O) == e.charAt(x);)O++, x++; if (s[w] = O, O > n) v += 2; else if (x > r) p += 2; else if (h) { var k = l + f - _; if (k >= 0 && k < a && -1 != u[k]) { var E = n - u[k]; if (O >= E) return i(t, e, O, x) } } } for (var N = -m + b; N <= m - g; N += 2) { var E, k = l + N; E = N == -m || N != m && u[k - 1] < u[k + 1] ? u[k + 1] : u[k - 1] + 1; for (var j = E - N; E < n && j < r && t.charAt(n - E - 1) == e.charAt(r - j - 1);)E++, j++; if (u[k] = E, E > n) g += 2; else if (j > r) b += 2; else if (!h) { var w = l + f - N; if (w >= 0 && w < a && -1 != s[w]) { var O = s[w], x = l + O - w; if (E = n - E, O >= E) return i(t, e, O, x) } } } } return [[d, t], [y, e]] } function i(t, e, r, o) { var i = t.substring(0, r), l = e.substring(0, o), a = t.substring(r), s = e.substring(o), u = n(i, l), c = n(a, s); return u.concat(c) } function l(t, e) { if (!t || !e || t.charAt(0) != e.charAt(0)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(i, o) == e.substring(i, o) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function a(t, e) { if (!t || !e || t.charAt(t.length - 1) != e.charAt(e.length - 1)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(t.length - o, t.length - i) == e.substring(e.length - o, e.length - i) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function s(t, e) { function n(t, e, n) { for (var r, o, i, s, u = t.substring(n, n + Math.floor(t.length / 4)), c = -1, f = ""; -1 != (c = e.indexOf(u, c + 1));) { var h = l(t.substring(n), e.substring(c)), p = a(t.substring(0, n), e.substring(0, c)); f.length < p + h && (f = e.substring(c - p, c) + e.substring(c, c + h), r = t.substring(0, n - p), o = t.substring(n + h), i = e.substring(0, c - p), s = e.substring(c + h)) } return 2 * f.length >= t.length ? [r, o, i, s, f] : null } var r = t.length > e.length ? t : e, o = t.length > e.length ? e : t; if (r.length < 4 || 2 * o.length < r.length) return null; var i, s = n(r, o, Math.ceil(r.length / 4)), u = n(r, o, Math.ceil(r.length / 2)); if (!s && !u) return null; i = u ? s && s[4].length > u[4].length ? s : u : s; var c, f, h, p; return t.length > e.length ? (c = i[0], f = i[1], h = i[2], p = i[3]) : (h = i[0], p = i[1], c = i[2], f = i[3]), [c, f, h, p, i[4]] } function u(t) { t.push([v, ""]); for (var e, n = 0, r = 0, o = 0, i = "", s = ""; n < t.length;)switch (t[n][0]) { case y: o++, s += t[n][1], n++; break; case d: r++, i += t[n][1], n++; break; case v: r + o > 1 ? (0 !== r && 0 !== o && (e = l(s, i), 0 !== e && (n - r - o > 0 && t[n - r - o - 1][0] == v ? t[n - r - o - 1][1] += s.substring(0, e) : (t.splice(0, 0, [v, s.substring(0, e)]), n++), s = s.substring(e), i = i.substring(e)), 0 !== (e = a(s, i)) && (t[n][1] = s.substring(s.length - e) + t[n][1], s = s.substring(0, s.length - e), i = i.substring(0, i.length - e))), 0 === r ? t.splice(n - o, r + o, [y, s]) : 0 === o ? t.splice(n - r, r + o, [d, i]) : t.splice(n - r - o, r + o, [d, i], [y, s]), n = n - r - o + (r ? 1 : 0) + (o ? 1 : 0) + 1) : 0 !== n && t[n - 1][0] == v ? (t[n - 1][1] += t[n][1], t.splice(n, 1)) : n++, o = 0, r = 0, i = "", s = "" }"" === t[t.length - 1][1] && t.pop(); var c = !1; for (n = 1; n < t.length - 1;)t[n - 1][0] == v && t[n + 1][0] == v && (t[n][1].substring(t[n][1].length - t[n - 1][1].length) == t[n - 1][1] ? (t[n][1] = t[n - 1][1] + t[n][1].substring(0, t[n][1].length - t[n - 1][1].length), t[n + 1][1] = t[n - 1][1] + t[n + 1][1], t.splice(n - 1, 1), c = !0) : t[n][1].substring(0, t[n + 1][1].length) == t[n + 1][1] && (t[n - 1][1] += t[n + 1][1], t[n][1] = t[n][1].substring(t[n + 1][1].length) + t[n + 1][1], t.splice(n + 1, 1), c = !0)), n++; c && u(t) } function c(t, e) { if (0 === e) return [v, t]; for (var n = 0, r = 0; r < t.length; r++) { var o = t[r]; if (o[0] === d || o[0] === v) { var i = n + o[1].length; if (e === i) return [r + 1, t]; if (e < i) { t = t.slice(); var l = e - n, a = [o[0], o[1].slice(0, l)], s = [o[0], o[1].slice(l)]; return t.splice(r, 1, a, s), [r + 1, t] } n = i } } throw new Error("cursor_pos is out of bounds!") } function f(t, e) { var n = c(t, e), r = n[1], o = n[0], i = r[o], l = r[o + 1]; if (null == i) return t; if (i[0] !== v) return t; if (null != l && i[1] + l[1] === l[1] + i[1]) return r.splice(o, 2, l, i), p(r, o, 2); if (null != l && 0 === l[1].indexOf(i[1])) { r.splice(o, 2, [l[0], i[1]], [0, i[1]]); var a = l[1].slice(i[1].length); return a.length > 0 && r.splice(o + 2, 0, [l[0], a]), p(r, o, 3) } return t } function h(t) { for (var e = !1, n = function (t) { return t.charCodeAt(0) >= 56320 && t.charCodeAt(0) <= 57343 }, r = 2; r < t.length; r += 1)t[r - 2][0] === v && function (t) { return t.charCodeAt(t.length - 1) >= 55296 && t.charCodeAt(t.length - 1) <= 56319 }(t[r - 2][1]) && t[r - 1][0] === d && n(t[r - 1][1]) && t[r][0] === y && n(t[r][1]) && (e = !0, t[r - 1][1] = t[r - 2][1].slice(-1) + t[r - 1][1], t[r][1] = t[r - 2][1].slice(-1) + t[r][1], t[r - 2][1] = t[r - 2][1].slice(0, -1)); if (!e) return t; for (var o = [], r = 0; r < t.length; r += 1)t[r][1].length > 0 && o.push(t[r]); return o } function p(t, e, n) { for (var r = e + n - 1; r >= 0 && r >= e - 1; r--)if (r + 1 < t.length) { var o = t[r], i = t[r + 1]; o[0] === i[1] && t.splice(r, 2, [o[0], o[1] + i[1]]) } return t } var d = -1, y = 1, v = 0, b = n; b.INSERT = y, b.DELETE = d, b.EQUAL = v, t.exports = b }, function (t, e) { function n(t) { var e = []; for (var n in t) e.push(n); return e } e = t.exports = "function" == typeof Object.keys ? Object.keys : n, e.shim = n }, function (t, e) { function n(t) { return "[object Arguments]" == Object.prototype.toString.call(t) } function r(t) { return t && "object" == typeof t && "number" == typeof t.length && Object.prototype.hasOwnProperty.call(t, "callee") && !Object.prototype.propertyIsEnumerable.call(t, "callee") || !1 } var o = "[object Arguments]" == function () { return Object.prototype.toString.call(arguments) }(); e = t.exports = o ? n : r, e.supported = n, e.unsupported = r }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { return Object.keys(e).reduce(function (n, r) { return null == t[r] ? n : (e[r] === t[r] ? n[r] = e[r] : Array.isArray(e[r]) ? e[r].indexOf(t[r]) < 0 && (n[r] = e[r].concat([t[r]])) : n[r] = [e[r], t[r]], n) }, {}) } function a(t) { return t.reduce(function (t, e) { if (1 === e.insert) { var n = (0, N.default)(e.attributes); return delete n.image, t.insert({ image: e.attributes.image }, n) } if (null == e.attributes || !0 !== e.attributes.list && !0 !== e.attributes.bullet || (e = (0, N.default)(e), e.attributes.list ? e.attributes.list = "ordered" : (e.attributes.list = "bullet", delete e.attributes.bullet)), "string" == typeof e.insert) { var r = e.insert.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); return t.insert(r, e.attributes) } return t.push(e) }, new h.default) } Object.defineProperty(e, "__esModule", { value: !0 }); var s = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, u = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), c = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), f = n(4), h = r(f), p = n(20), d = r(p), y = n(0), v = r(y), b = n(13), g = r(b), m = n(31), _ = r(m), O = n(3), w = r(O), x = n(14), k = r(x), E = n(21), N = r(E), j = n(12), A = r(j), q = n(2), T = r(q), P = /^[ -~]*$/, S = function () { function t(e) { i(this, t), this.scroll = e, this.delta = this.getDelta() } return c(t, [{ key: "applyDelta", value: function (t) { var e = this, n = !1; this.scroll.update(); var r = this.scroll.length(); return this.scroll.batchStart(), t = a(t), t.reduce(function (t, o) { var i = o.retain || o.delete || o.insert.length || 1, l = o.attributes || {}; if (null != o.insert) { if ("string" == typeof o.insert) { var a = o.insert; a.endsWith("\n") && n && (n = !1, a = a.slice(0, -1)), t >= r && !a.endsWith("\n") && (n = !0), e.scroll.insertAt(t, a); var c = e.scroll.line(t), f = u(c, 2), h = f[0], p = f[1], y = (0, T.default)({}, (0, O.bubbleFormats)(h)); if (h instanceof w.default) { var b = h.descendant(v.default.Leaf, p), g = u(b, 1), m = g[0]; y = (0, T.default)(y, (0, O.bubbleFormats)(m)) } l = d.default.attributes.diff(y, l) || {} } else if ("object" === s(o.insert)) { var _ = Object.keys(o.insert)[0]; if (null == _) return t; e.scroll.insertAt(t, _, o.insert[_]) } r += i } return Object.keys(l).forEach(function (n) { e.scroll.formatAt(t, i, n, l[n]) }), t + i }, 0), t.reduce(function (t, n) { return "number" == typeof n.delete ? (e.scroll.deleteAt(t, n.delete), t) : t + (n.retain || n.insert.length || 1) }, 0), this.scroll.batchEnd(), this.update(t) } }, { key: "deleteText", value: function (t, e) { return this.scroll.deleteAt(t, e), this.update((new h.default).retain(t).delete(e)) } }, { key: "formatLine", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return this.scroll.update(), Object.keys(r).forEach(function (o) { if (null == n.scroll.whitelist || n.scroll.whitelist[o]) { var i = n.scroll.lines(t, Math.max(e, 1)), l = e; i.forEach(function (e) { var i = e.length(); if (e instanceof g.default) { var a = t - e.offset(n.scroll), s = e.newlineIndex(a + l) - a + 1; e.formatAt(a, s, o, r[o]) } else e.format(o, r[o]); l -= i }) } }), this.scroll.optimize(), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "formatText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e, o, r[o]) }), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "getContents", value: function (t, e) { return this.delta.slice(t, t + e) } }, { key: "getDelta", value: function () { return this.scroll.lines().reduce(function (t, e) { return t.concat(e.delta()) }, new h.default) } }, { key: "getFormat", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = [], r = []; 0 === e ? this.scroll.path(t).forEach(function (t) { var e = u(t, 1), o = e[0]; o instanceof w.default ? n.push(o) : o instanceof v.default.Leaf && r.push(o) }) : (n = this.scroll.lines(t, e), r = this.scroll.descendants(v.default.Leaf, t, e)); var o = [n, r].map(function (t) { if (0 === t.length) return {}; for (var e = (0, O.bubbleFormats)(t.shift()); Object.keys(e).length > 0;) { var n = t.shift(); if (null == n) return e; e = l((0, O.bubbleFormats)(n), e) } return e }); return T.default.apply(T.default, o) } }, { key: "getText", value: function (t, e) { return this.getContents(t, e).filter(function (t) { return "string" == typeof t.insert }).map(function (t) { return t.insert }).join("") } }, { key: "insertEmbed", value: function (t, e, n) { return this.scroll.insertAt(t, e, n), this.update((new h.default).retain(t).insert(o({}, e, n))) } }, { key: "insertText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return e = e.replace(/\r\n/g, "\n").replace(/\r/g, "\n"), this.scroll.insertAt(t, e), Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e.length, o, r[o]) }), this.update((new h.default).retain(t).insert(e, (0, N.default)(r))) } }, { key: "isBlank", value: function () { if (0 == this.scroll.children.length) return !0; if (this.scroll.children.length > 1) return !1; var t = this.scroll.children.head; return t.statics.blotName === w.default.blotName && (!(t.children.length > 1) && t.children.head instanceof k.default) } }, { key: "removeFormat", value: function (t, e) { var n = this.getText(t, e), r = this.scroll.line(t + e), o = u(r, 2), i = o[0], l = o[1], a = 0, s = new h.default; null != i && (a = i instanceof g.default ? i.newlineIndex(l) - l + 1 : i.length() - l, s = i.delta().slice(l, l + a - 1).insert("\n")); var c = this.getContents(t, e + a), f = c.diff((new h.default).insert(n).concat(s)), p = (new h.default).retain(t).concat(f); return this.applyDelta(p) } }, { key: "update", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, r = this.delta; if (1 === e.length && "characterData" === e[0].type && e[0].target.data.match(P) && v.default.find(e[0].target)) { var o = v.default.find(e[0].target), i = (0, O.bubbleFormats)(o), l = o.offset(this.scroll), a = e[0].oldValue.replace(_.default.CONTENTS, ""), s = (new h.default).insert(a), u = (new h.default).insert(o.value()); t = (new h.default).retain(l).concat(s.diff(u, n)).reduce(function (t, e) { return e.insert ? t.insert(e.insert, i) : t.push(e) }, new h.default), this.delta = r.compose(t) } else this.delta = this.getDelta(), t && (0, A.default)(r.compose(t), this.delta) || (t = r.diff(this.delta, n)); return t } }]), t }(); e.default = S }, function (t, e) { "use strict"; function n() { } function r(t, e, n) { this.fn = t, this.context = e, this.once = n || !1 } function o() { this._events = new n, this._eventsCount = 0 } var i = Object.prototype.hasOwnProperty, l = "~"; Object.create && (n.prototype = Object.create(null), (new n).__proto__ || (l = !1)), o.prototype.eventNames = function () { var t, e, n = []; if (0 === this._eventsCount) return n; for (e in t = this._events) i.call(t, e) && n.push(l ? e.slice(1) : e); return Object.getOwnPropertySymbols ? n.concat(Object.getOwnPropertySymbols(t)) : n }, o.prototype.listeners = function (t, e) { var n = l ? l + t : t, r = this._events[n]; if (e) return !!r; if (!r) return []; if (r.fn) return [r.fn]; for (var o = 0, i = r.length, a = new Array(i); o < i; o++)a[o] = r[o].fn; return a }, o.prototype.emit = function (t, e, n, r, o, i) { var a = l ? l + t : t; if (!this._events[a]) return !1; var s, u, c = this._events[a], f = arguments.length; if (c.fn) { switch (c.once && this.removeListener(t, c.fn, void 0, !0), f) { case 1: return c.fn.call(c.context), !0; case 2: return c.fn.call(c.context, e), !0; case 3: return c.fn.call(c.context, e, n), !0; case 4: return c.fn.call(c.context, e, n, r), !0; case 5: return c.fn.call(c.context, e, n, r, o), !0; case 6: return c.fn.call(c.context, e, n, r, o, i), !0 }for (u = 1, s = new Array(f - 1); u < f; u++)s[u - 1] = arguments[u]; c.fn.apply(c.context, s) } else { var h, p = c.length; for (u = 0; u < p; u++)switch (c[u].once && this.removeListener(t, c[u].fn, void 0, !0), f) { case 1: c[u].fn.call(c[u].context); break; case 2: c[u].fn.call(c[u].context, e); break; case 3: c[u].fn.call(c[u].context, e, n); break; case 4: c[u].fn.call(c[u].context, e, n, r); break; default: if (!s) for (h = 1, s = new Array(f - 1); h < f; h++)s[h - 1] = arguments[h]; c[u].fn.apply(c[u].context, s) } } return !0 }, o.prototype.on = function (t, e, n) { var o = new r(e, n || this), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.once = function (t, e, n) { var o = new r(e, n || this, !0), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.removeListener = function (t, e, r, o) { var i = l ? l + t : t; if (!this._events[i]) return this; if (!e) return 0 == --this._eventsCount ? this._events = new n : delete this._events[i], this; var a = this._events[i]; if (a.fn) a.fn !== e || o && !a.once || r && a.context !== r || (0 == --this._eventsCount ? this._events = new n : delete this._events[i]); else { for (var s = 0, u = [], c = a.length; s < c; s++)(a[s].fn !== e || o && !a[s].once || r && a[s].context !== r) && u.push(a[s]); u.length ? this._events[i] = 1 === u.length ? u[0] : u : 0 == --this._eventsCount ? this._events = new n : delete this._events[i] } return this }, o.prototype.removeAllListeners = function (t) { var e; return t ? (e = l ? l + t : t, this._events[e] && (0 == --this._eventsCount ? this._events = new n : delete this._events[e])) : (this._events = new n, this._eventsCount = 0), this }, o.prototype.off = o.prototype.removeListener, o.prototype.addListener = o.prototype.on, o.prototype.setMaxListeners = function () { return this }, o.prefixed = l, o.EventEmitter = o, void 0 !== t && (t.exports = o) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { return t instanceof v.default || t instanceof y.BlockEmbed } Object.defineProperty(e, "__esModule", { value: !0 }); var s = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(0), h = r(f), p = n(9), d = r(p), y = n(3), v = r(y), b = n(14), g = r(b), m = n(13), _ = r(m), O = n(23), w = r(O), x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.emitter = n.emitter, Array.isArray(n.whitelist) && (r.whitelist = n.whitelist.reduce(function (t, e) { return t[e] = !0, t }, {})), r.domNode.addEventListener("DOMNodeInserted", function () { }), r.optimize(), r.enable(), r } return l(e, t), u(e, [{ key: "batchStart", value: function () { this.batch = !0 } }, { key: "batchEnd", value: function () { this.batch = !1, this.optimize() } }, { key: "deleteAt", value: function (t, n) { var r = this.line(t), o = s(r, 2), i = o[0], l = o[1], a = this.line(t + n), u = s(a, 1), f = u[0]; if (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), null != f && i !== f && l > 0) { if (i instanceof y.BlockEmbed || f instanceof y.BlockEmbed) return void this.optimize(); if (i instanceof _.default) { var h = i.newlineIndex(i.length(), !0); if (h > -1 && (i = i.split(h + 1)) === f) return void this.optimize() } else if (f instanceof _.default) { var p = f.newlineIndex(0); p > -1 && f.split(p + 1) } var d = f.children.head instanceof g.default ? null : f.children.head; i.moveChildren(f, d), i.remove() } this.optimize() } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.domNode.setAttribute("contenteditable", t) } }, { key: "formatAt", value: function (t, n, r, o) { (null == this.whitelist || this.whitelist[r]) && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o), this.optimize()) } }, { key: "insertAt", value: function (t, n, r) { if (null == r || null == this.whitelist || this.whitelist[n]) { if (t >= this.length()) if (null == r || null == h.default.query(n, h.default.Scope.BLOCK)) { var o = h.default.create(this.statics.defaultChild); this.appendChild(o), null == r && n.endsWith("\n") && (n = n.slice(0, -1)), o.insertAt(0, n, r) } else { var i = h.default.create(n, r); this.appendChild(i) } else c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); this.optimize() } } }, { key: "insertBefore", value: function (t, n) { if (t.statics.scope === h.default.Scope.INLINE_BLOT) { var r = h.default.create(this.statics.defaultChild); r.appendChild(t), t = r } c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n) } }, { key: "leaf", value: function (t) { return this.path(t).pop() || [null, -1] } }, { key: "line", value: function (t) { return t === this.length() ? this.line(t - 1) : this.descendant(a, t) } }, { key: "lines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return function t(e, n, r) { var o = [], i = r; return e.children.forEachAt(n, r, function (e, n, r) { a(e) ? o.push(e) : e instanceof h.default.Container && (o = o.concat(t(e, n, i))), i -= r }), o }(this, t, e) } }, { key: "optimize", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; !0 !== this.batch && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t, n), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_OPTIMIZE, t, n)) } }, { key: "path", value: function (t) { return c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t).slice(1) } }, { key: "update", value: function (t) { if (!0 !== this.batch) { var n = d.default.sources.USER; "string" == typeof t && (n = t), Array.isArray(t) || (t = this.observer.takeRecords()), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE, n, t), c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "update", this).call(this, t.concat([])), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_UPDATE, n, t) } } }]), e }(h.default.Scroll); x.blotName = "scroll", x.className = "ql-editor", x.tagName = "DIV", x.defaultChild = "block", x.allowedChildren = [v.default, y.BlockEmbed, w.default], e.default = x }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { return "object" === (void 0 === e ? "undefined" : x(e)) ? Object.keys(e).reduce(function (t, n) { return s(t, n, e[n]) }, t) : t.reduce(function (t, r) { return r.attributes && r.attributes[e] ? t.push(r) : t.insert(r.insert, (0, j.default)({}, o({}, e, n), r.attributes)) }, new q.default) } function u(t) { if (t.nodeType !== Node.ELEMENT_NODE) return {}; return t["__ql-computed-style"] || (t["__ql-computed-style"] = window.getComputedStyle(t)) } function c(t, e) { for (var n = "", r = t.ops.length - 1; r >= 0 && n.length < e.length; --r) { var o = t.ops[r]; if ("string" != typeof o.insert) break; n = o.insert + n } return n.slice(-1 * e.length) === e } function f(t) { return 0 !== t.childNodes.length && ["block", "list-item"].indexOf(u(t).display) > -1 } function h(t, e, n) { return t.nodeType === t.TEXT_NODE ? n.reduce(function (e, n) { return n(t, e) }, new q.default) : t.nodeType === t.ELEMENT_NODE ? [].reduce.call(t.childNodes || [], function (r, o) { var i = h(o, e, n); return o.nodeType === t.ELEMENT_NODE && (i = e.reduce(function (t, e) { return e(o, t) }, i), i = (o[W] || []).reduce(function (t, e) { return e(o, t) }, i)), r.concat(i) }, new q.default) : new q.default } function p(t, e, n) { return s(n, t, !0) } function d(t, e) { var n = P.default.Attributor.Attribute.keys(t), r = P.default.Attributor.Class.keys(t), o = P.default.Attributor.Style.keys(t), i = {}; return n.concat(r).concat(o).forEach(function (e) { var n = P.default.query(e, P.default.Scope.ATTRIBUTE); null != n && (i[n.attrName] = n.value(t), i[n.attrName]) || (n = Y[e], null == n || n.attrName !== e && n.keyName !== e || (i[n.attrName] = n.value(t) || void 0), null == (n = X[e]) || n.attrName !== e && n.keyName !== e || (n = X[e], i[n.attrName] = n.value(t) || void 0)) }), Object.keys(i).length > 0 && (e = s(e, i)), e } function y(t, e) { var n = P.default.query(t); if (null == n) return e; if (n.prototype instanceof P.default.Embed) { var r = {}, o = n.value(t); null != o && (r[n.blotName] = o, e = (new q.default).insert(r, n.formats(t))) } else "function" == typeof n.formats && (e = s(e, n.blotName, n.formats(t))); return e } function v(t, e) { return c(e, "\n") || e.insert("\n"), e } function b() { return new q.default } function g(t, e) { var n = P.default.query(t); if (null == n || "list-item" !== n.blotName || !c(e, "\n")) return e; for (var r = -1, o = t.parentNode; !o.classList.contains("ql-clipboard");)"list" === (P.default.query(o) || {}).blotName && (r += 1), o = o.parentNode; return r <= 0 ? e : e.compose((new q.default).retain(e.length() - 1).retain(1, { indent: r })) } function m(t, e) { return c(e, "\n") || (f(t) || e.length() > 0 && t.nextSibling && f(t.nextSibling)) && e.insert("\n"), e } function _(t, e) { if (f(t) && null != t.nextElementSibling && !c(e, "\n\n")) { var n = t.offsetHeight + parseFloat(u(t).marginTop) + parseFloat(u(t).marginBottom); t.nextElementSibling.offsetTop > t.offsetTop + 1.5 * n && e.insert("\n") } return e } function O(t, e) { var n = {}, r = t.style || {}; return r.fontStyle && "italic" === u(t).fontStyle && (n.italic = !0), r.fontWeight && (u(t).fontWeight.startsWith("bold") || parseInt(u(t).fontWeight) >= 700) && (n.bold = !0), Object.keys(n).length > 0 && (e = s(e, n)), parseFloat(r.textIndent || 0) > 0 && (e = (new q.default).insert("\t").concat(e)), e } function w(t, e) { var n = t.data; if ("O:P" === t.parentNode.tagName) return e.insert(n.trim()); if (0 === n.trim().length && t.parentNode.classList.contains("ql-clipboard")) return e; if (!u(t.parentNode).whiteSpace.startsWith("pre")) { var r = function (t, e) { return e = e.replace(/[^\u00a0]/g, ""), e.length < 1 && t ? " " : e }; n = n.replace(/\r\n/g, " ").replace(/\n/g, " "), n = n.replace(/\s\s+/g, r.bind(r, !0)), (null == t.previousSibling && f(t.parentNode) || null != t.previousSibling && f(t.previousSibling)) && (n = n.replace(/^\s+/, r.bind(r, !1))), (null == t.nextSibling && f(t.parentNode) || null != t.nextSibling && f(t.nextSibling)) && (n = n.replace(/\s+$/, r.bind(r, !1))) } return e.insert(n) } Object.defineProperty(e, "__esModule", { value: !0 }), e.matchText = e.matchSpacing = e.matchNewline = e.matchBlot = e.matchAttributor = e.default = void 0; var x = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, k = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), E = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), N = n(2), j = r(N), A = n(4), q = r(A), T = n(0), P = r(T), S = n(6), C = r(S), L = n(10), M = r(L), R = n(7), I = r(R), B = n(34), D = n(35), U = n(13), F = r(U), H = n(24), K = n(36), z = n(37), V = n(38), Z = (0, M.default)("quill:clipboard"), W = "__ql-matcher", G = [[Node.TEXT_NODE, w], [Node.TEXT_NODE, m], ["br", v], [Node.ELEMENT_NODE, m], [Node.ELEMENT_NODE, y], [Node.ELEMENT_NODE, _], [Node.ELEMENT_NODE, d], [Node.ELEMENT_NODE, O], ["li", g], ["b", p.bind(p, "bold")], ["i", p.bind(p, "italic")], ["style", b]], Y = [B.AlignAttribute, K.DirectionAttribute].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), X = [B.AlignStyle, D.BackgroundStyle, H.ColorStyle, K.DirectionStyle, z.FontStyle, V.SizeStyle].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), $ = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.root.addEventListener("paste", r.onPaste.bind(r)), r.container = r.quill.addContainer("ql-clipboard"), r.container.setAttribute("contenteditable", !0), r.container.setAttribute("tabindex", -1), r.matchers = [], G.concat(r.options.matchers).forEach(function (t) { var e = k(t, 2), o = e[0], i = e[1]; (n.matchVisual || i !== _) && r.addMatcher(o, i) }), r } return a(e, t), E(e, [{ key: "addMatcher", value: function (t, e) { this.matchers.push([t, e]) } }, { key: "convert", value: function (t) { if ("string" == typeof t) return this.container.innerHTML = t.replace(/\>\r?\n +\<"), this.convert(); var e = this.quill.getFormat(this.quill.selection.savedRange.index); if (e[F.default.blotName]) { var n = this.container.innerText; return this.container.innerHTML = "", (new q.default).insert(n, o({}, F.default.blotName, e[F.default.blotName])) } var r = this.prepareMatching(), i = k(r, 2), l = i[0], a = i[1], s = h(this.container, l, a); return c(s, "\n") && null == s.ops[s.ops.length - 1].attributes && (s = s.compose((new q.default).retain(s.length() - 1).delete(1))), Z.log("convert", this.container.innerHTML, s), this.container.innerHTML = "", s } }, { key: "dangerouslyPasteHTML", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : C.default.sources.API; if ("string" == typeof t) this.quill.setContents(this.convert(t), e), this.quill.setSelection(0, C.default.sources.SILENT); else { var r = this.convert(e); this.quill.updateContents((new q.default).retain(t).concat(r), n), this.quill.setSelection(t + r.length(), C.default.sources.SILENT) } } }, { key: "onPaste", value: function (t) { var e = this; if (!t.defaultPrevented && this.quill.isEnabled()) { var n = this.quill.getSelection(), r = (new q.default).retain(n.index), o = this.quill.scrollingContainer.scrollTop; this.container.focus(), this.quill.selection.update(C.default.sources.SILENT), setTimeout(function () { r = r.concat(e.convert()).delete(n.length), e.quill.updateContents(r, C.default.sources.USER), e.quill.setSelection(r.length() - n.length, C.default.sources.SILENT), e.quill.scrollingContainer.scrollTop = o, e.quill.focus() }, 1) } } }, { key: "prepareMatching", value: function () { var t = this, e = [], n = []; return this.matchers.forEach(function (r) { var o = k(r, 2), i = o[0], l = o[1]; switch (i) { case Node.TEXT_NODE: n.push(l); break; case Node.ELEMENT_NODE: e.push(l); break; default: [].forEach.call(t.container.querySelectorAll(i), function (t) { t[W] = t[W] || [], t[W].push(l) }) } }), [e, n] } }]), e }(I.default); $.DEFAULTS = { matchers: [], matchVisual: !0 }, e.default = $, e.matchAttributor = d, e.matchBlot = y, e.matchNewline = m, e.matchSpacing = _, e.matchText = w }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.ops[t.ops.length - 1]; return null != e && (null != e.insert ? "string" == typeof e.insert && e.insert.endsWith("\n") : null != e.attributes && Object.keys(e.attributes).some(function (t) { return null != f.default.query(t, f.default.Scope.BLOCK) })) } function s(t) { var e = t.reduce(function (t, e) { return t += e.delete || 0 }, 0), n = t.length() - e; return a(t) && (n -= 1), n } Object.defineProperty(e, "__esModule", { value: !0 }), e.getLastChangeIndex = e.default = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(6), p = r(h), d = n(7), y = r(d), v = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.lastRecorded = 0, r.ignoreChange = !1, r.clear(), r.quill.on(p.default.events.EDITOR_CHANGE, function (t, e, n, o) { t !== p.default.events.TEXT_CHANGE || r.ignoreChange || (r.options.userOnly && o !== p.default.sources.USER ? r.transform(e) : r.record(e, n)) }), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0 }, r.undo.bind(r)), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0, shiftKey: !0 }, r.redo.bind(r)), /Win/i.test(navigator.platform) && r.quill.keyboard.addBinding({ key: "Y", shortKey: !0 }, r.redo.bind(r)), r } return l(e, t), u(e, [{ key: "change", value: function (t, e) { if (0 !== this.stack[t].length) { var n = this.stack[t].pop(); this.stack[e].push(n), this.lastRecorded = 0, this.ignoreChange = !0, this.quill.updateContents(n[t], p.default.sources.USER), this.ignoreChange = !1; var r = s(n[t]); this.quill.setSelection(r) } } }, { key: "clear", value: function () { this.stack = { undo: [], redo: [] } } }, { key: "cutoff", value: function () { this.lastRecorded = 0 } }, { key: "record", value: function (t, e) { if (0 !== t.ops.length) { this.stack.redo = []; var n = this.quill.getContents().diff(e), r = Date.now(); if (this.lastRecorded + this.options.delay > r && this.stack.undo.length > 0) { var o = this.stack.undo.pop(); n = n.compose(o.undo), t = o.redo.compose(t) } else this.lastRecorded = r; this.stack.undo.push({ redo: t, undo: n }), this.stack.undo.length > this.options.maxStack && this.stack.undo.shift() } } }, { key: "redo", value: function () { this.change("redo", "undo") } }, { key: "transform", value: function (t) { this.stack.undo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }), this.stack.redo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }) } }, { key: "undo", value: function () { this.change("undo", "redo") } }]), e }(y.default); v.DEFAULTS = { delay: 1e3, maxStack: 100, userOnly: !1 }, e.default = v, e.getLastChangeIndex = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.IndentClass = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "add", value: function (t, n) { if ("+1" === n || "-1" === n) { var r = this.value(t) || 0; n = "+1" === n ? r + 1 : r - 1 } return 0 === n ? (this.remove(t), !0) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "add", this).call(this, t, n) } }, { key: "canAdd", value: function (t, n) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, n) || a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, parseInt(n)) } }, { key: "value", value: function (t) { return parseInt(a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t)) || void 0 } }]), e }(u.default.Attributor.Class), f = new c("indent", "ql-indent", { scope: u.default.Scope.BLOCK, whitelist: [1, 2, 3, 4, 5, 6, 7, 8] }); e.IndentClass = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(3), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "blockquote", s.tagName = "blockquote", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = n(3), s = function (t) { return t && t.__esModule ? t : { default: t } }(a), u = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "formats", value: function (t) { return this.tagName.indexOf(t.tagName) + 1 } }]), e }(s.default); u.blotName = "header", u.tagName = ["H1", "H2", "H3", "H4", "H5", "H6"], e.default = u }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.ListItem = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(0), f = r(c), h = n(3), p = r(h), d = n(23), y = r(d), v = function (t) { function e() { return i(this, e), l(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return a(e, t), s(e, [{ key: "format", value: function (t, n) { t !== b.blotName || n ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) : this.replaceWith(f.default.create(this.statics.scope)) } }, { key: "remove", value: function () { null == this.prev && null == this.next ? this.parent.remove() : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this) } }, { key: "replaceWith", value: function (t, n) { return this.parent.isolate(this.offset(this.parent), this.length()), t === this.parent.statics.blotName ? (this.parent.replaceWith(t, n), this) : (this.parent.unwrap(), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t, n)) } }], [{ key: "formats", value: function (t) { return t.tagName === this.tagName ? void 0 : u(e.__proto__ || Object.getPrototypeOf(e), "formats", this).call(this, t) } }]), e }(p.default); v.blotName = "list-item", v.tagName = "LI"; var b = function (t) { function e(t) { i(this, e); var n = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)), r = function (e) { if (e.target.parentNode === t) { var r = n.statics.formats(t), o = f.default.find(e.target); "checked" === r ? o.format("list", "unchecked") : "unchecked" === r && o.format("list", "checked") } }; return t.addEventListener("touchstart", r), t.addEventListener("mousedown", r), n } return a(e, t), s(e, null, [{ key: "create", value: function (t) { var n = "ordered" === t ? "OL" : "UL", r = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, n); return "checked" !== t && "unchecked" !== t || r.setAttribute("data-checked", "checked" === t), r } }, { key: "formats", value: function (t) { return "OL" === t.tagName ? "ordered" : "UL" === t.tagName ? t.hasAttribute("data-checked") ? "true" === t.getAttribute("data-checked") ? "checked" : "unchecked" : "bullet" : void 0 } }]), s(e, [{ key: "format", value: function (t, e) { this.children.length > 0 && this.children.tail.format(t, e) } }, { key: "formats", value: function () { return o({}, this.statics.blotName, this.statics.formats(this.domNode)) } }, { key: "insertBefore", value: function (t, n) { if (t instanceof v) u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n); else { var r = null == n ? this.length() : n.offset(this), o = this.split(r); o.parent.insertBefore(t, o) } } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && n.domNode.tagName === this.domNode.tagName && n.domNode.getAttribute("data-checked") === this.domNode.getAttribute("data-checked") && (n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { if (t.statics.blotName !== this.statics.blotName) { var n = f.default.create(this.statics.defaultChild); t.moveChildren(n), this.appendChild(n) } u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t) } }]), e }(y.default); b.blotName = "list", b.scope = f.default.Scope.BLOCK_BLOT, b.tagName = ["OL", "UL"], b.defaultChild = "list-item", b.allowedChildren = [v], e.ListItem = v, e.default = b }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(39), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "italic", s.tagName = ["EM", "I"], e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "create", value: function (t) { return "super" === t ? document.createElement("sup") : "sub" === t ? document.createElement("sub") : a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t) } }, { key: "formats", value: function (t) { return "SUB" === t.tagName ? "sub" : "SUP" === t.tagName ? "super" : void 0 } }]), e }(u.default); c.blotName = "script", c.tagName = ["SUB", "SUP"], e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "strike", s.tagName = "S", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "underline", s.tagName = "U", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = n(15), f = ["alt", "height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "match", value: function (t) { return /\.(jpe?g|gif|png)$/.test(t) || /^data:image\/.+;base64/.test(t) } }, { key: "sanitize", value: function (t) { return (0, c.sanitize)(t, ["http", "https", "data"]) ? t : "//:0" } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(u.default.Embed); h.blotName = "image", h.tagName = "IMG", e.default = h }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(3), u = n(15), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = ["height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("frameborder", "0"), n.setAttribute("allowfullscreen", !0), n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "sanitize", value: function (t) { return c.default.sanitize(t) } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(s.BlockEmbed); h.blotName = "video", h.className = "ql-video", h.tagName = "IFRAME", e.default = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.FormulaBlot = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(33), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, null, [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && (window.katex.render(t, n, { throwOnError: !1, errorColor: "#f00" }), n.setAttribute("data-value", t)), n } }, { key: "value", value: function (t) { return t.getAttribute("data-value") } }]), e }(c.default); y.blotName = "formula", y.className = "ql-formula", y.tagName = "SPAN"; var v = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); if (null == window.katex) throw new Error("Formula module requires KaTeX."); return t } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(y, !0) } }]), e }(d.default); e.FormulaBlot = y, e.default = v }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.CodeToken = e.CodeBlock = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = n(13), v = r(y), b = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "replaceWith", value: function (t) { this.domNode.textContent = this.domNode.textContent, this.attach(), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t) } }, { key: "highlight", value: function (t) { var e = this.domNode.textContent; this.cachedText !== e && ((e.trim().length > 0 || null == this.cachedText) && (this.domNode.innerHTML = t(e), this.domNode.normalize(), this.attach()), this.cachedText = e) } }]), e }(v.default); b.className = "ql-syntax"; var g = new c.default.Attributor.Class("token", "hljs", { scope: c.default.Scope.INLINE }), m = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if ("function" != typeof r.options.highlight) throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill."); var l = null; return r.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { clearTimeout(l), l = setTimeout(function () { r.highlight(), l = null }, r.options.interval) }), r.highlight(), r } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(g, !0), h.default.register(b, !0) } }]), a(e, [{ key: "highlight", value: function () { var t = this; if (!this.quill.selection.composing) { this.quill.update(h.default.sources.USER); var e = this.quill.getSelection(); this.quill.scroll.descendants(b).forEach(function (e) { e.highlight(t.options.highlight) }), this.quill.update(h.default.sources.SILENT), null != e && this.quill.setSelection(e, h.default.sources.SILENT) } } }]), e }(d.default); m.DEFAULTS = { highlight: function () { return null == window.hljs ? null : function (t) { return window.hljs.highlightAuto(t).value } }(), interval: 1e3 }, e.CodeBlock = b, e.CodeToken = g, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { var r = document.createElement("button"); r.setAttribute("type", "button"), r.classList.add("ql-" + e), null != n && (r.value = n), t.appendChild(r) } function u(t, e) { Array.isArray(e[0]) || (e = [e]), e.forEach(function (e) { var n = document.createElement("span"); n.classList.add("ql-formats"), e.forEach(function (t) { if ("string" == typeof t) s(n, t); else { var e = Object.keys(t)[0], r = t[e]; Array.isArray(r) ? c(n, e, r) : s(n, e, r) } }), t.appendChild(n) }) } function c(t, e, n) { var r = document.createElement("select"); r.classList.add("ql-" + e), n.forEach(function (t) { var e = document.createElement("option"); !1 !== t ? e.setAttribute("value", t) : e.setAttribute("selected", "selected"), r.appendChild(e) }), t.appendChild(r) } Object.defineProperty(e, "__esModule", { value: !0 }), e.addControls = e.default = void 0; var f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), p = n(4), d = r(p), y = n(0), v = r(y), b = n(6), g = r(b), m = n(10), _ = r(m), O = n(7), w = r(O), x = (0, _.default)("quill:toolbar"), k = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if (Array.isArray(r.options.container)) { var o = document.createElement("div"); u(o, r.options.container), t.container.parentNode.insertBefore(o, t.container), r.container = o } else "string" == typeof r.options.container ? r.container = document.querySelector(r.options.container) : r.container = r.options.container; if (!(r.container instanceof HTMLElement)) { var a; return a = x.error("Container required for toolbar", r.options), l(r, a) } return r.container.classList.add("ql-toolbar"), r.controls = [], r.handlers = {}, Object.keys(r.options.handlers).forEach(function (t) { r.addHandler(t, r.options.handlers[t]) }), [].forEach.call(r.container.querySelectorAll("button, select"), function (t) { r.attach(t) }), r.quill.on(g.default.events.EDITOR_CHANGE, function (t, e) { t === g.default.events.SELECTION_CHANGE && r.update(e) }), r.quill.on(g.default.events.SCROLL_OPTIMIZE, function () { var t = r.quill.selection.getRange(), e = f(t, 1), n = e[0]; r.update(n) }), r } return a(e, t), h(e, [{ key: "addHandler", value: function (t, e) { this.handlers[t] = e } }, { key: "attach", value: function (t) { var e = this, n = [].find.call(t.classList, function (t) { return 0 === t.indexOf("ql-") }); if (n) { if (n = n.slice("ql-".length), "BUTTON" === t.tagName && t.setAttribute("type", "button"), null == this.handlers[n]) { if (null != this.quill.scroll.whitelist && null == this.quill.scroll.whitelist[n]) return void x.warn("ignoring attaching to disabled format", n, t); if (null == v.default.query(n)) return void x.warn("ignoring attaching to nonexistent format", n, t) } var r = "SELECT" === t.tagName ? "change" : "click"; t.addEventListener(r, function (r) { var i = void 0; if ("SELECT" === t.tagName) { if (t.selectedIndex < 0) return; var l = t.options[t.selectedIndex]; i = !l.hasAttribute("selected") && (l.value || !1) } else i = !t.classList.contains("ql-active") && (t.value || !t.hasAttribute("value")), r.preventDefault(); e.quill.focus(); var a = e.quill.selection.getRange(), s = f(a, 1), u = s[0]; if (null != e.handlers[n]) e.handlers[n].call(e, i); else if (v.default.query(n).prototype instanceof v.default.Embed) { if (!(i = prompt("Enter " + n))) return; e.quill.updateContents((new d.default).retain(u.index).delete(u.length).insert(o({}, n, i)), g.default.sources.USER) } else e.quill.format(n, i, g.default.sources.USER); e.update(u) }), this.controls.push([n, t]) } } }, { key: "update", value: function (t) { var e = null == t ? {} : this.quill.getFormat(t); this.controls.forEach(function (n) { var r = f(n, 2), o = r[0], i = r[1]; if ("SELECT" === i.tagName) { var l = void 0; if (null == t) l = null; else if (null == e[o]) l = i.querySelector("option[selected]"); else if (!Array.isArray(e[o])) { var a = e[o]; "string" == typeof a && (a = a.replace(/\"/g, '\\"')), l = i.querySelector('option[value="' + a + '"]') } null == l ? (i.value = "", i.selectedIndex = -1) : l.selected = !0 } else if (null == t) i.classList.remove("ql-active"); else if (i.hasAttribute("value")) { var s = e[o] === i.getAttribute("value") || null != e[o] && e[o].toString() === i.getAttribute("value") || null == e[o] && !i.getAttribute("value"); i.classList.toggle("ql-active", s) } else i.classList.toggle("ql-active", null != e[o]) }) } }]), e }(w.default); k.DEFAULTS = {}, k.DEFAULTS = { container: null, handlers: { clean: function () { var t = this, e = this.quill.getSelection(); if (null != e) if (0 == e.length) { var n = this.quill.getFormat(); Object.keys(n).forEach(function (e) { null != v.default.query(e, v.default.Scope.INLINE) && t.quill.format(e, !1) }) } else this.quill.removeFormat(e, g.default.sources.USER) }, direction: function (t) { var e = this.quill.getFormat().align; "rtl" === t && null == e ? this.quill.format("align", "right", g.default.sources.USER) : t || "right" !== e || this.quill.format("align", !1, g.default.sources.USER), this.quill.format("direction", t, g.default.sources.USER) }, indent: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e), r = parseInt(n.indent || 0); if ("+1" === t || "-1" === t) { var o = "+1" === t ? 1 : -1; "rtl" === n.direction && (o *= -1), this.quill.format("indent", r + o, g.default.sources.USER) } }, link: function (t) { !0 === t && (t = prompt("Enter link URL:")), this.quill.format("link", t, g.default.sources.USER) }, list: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e); "check" === t ? "checked" === n.list || "unchecked" === n.list ? this.quill.format("list", !1, g.default.sources.USER) : this.quill.format("list", "unchecked", g.default.sources.USER) : this.quill.format("list", t, g.default.sources.USER) } } }, e.default = k, e.addControls = u }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BubbleTooltip = void 0; var a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(2), c = r(u), f = n(9), h = r(f), p = n(44), d = r(p), y = n(22), v = n(26), b = r(v), g = [["bold", "italic", "link"], [{ header: 1 }, { header: 2 }, "blockquote"]], m = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = g); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-bubble"), r } return l(e, t), s(e, [{ key: "extendToolbar", value: function (t) { this.tooltip = new _(this.quill, this.options.bounds), this.tooltip.root.appendChild(t.container), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), b.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), b.default) } }]), e }(d.default); m.DEFAULTS = (0, c.default)(!0, {}, d.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { t ? this.quill.theme.tooltip.edit() : this.quill.format("link", !1) } } } } }); var _ = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.on(h.default.events.EDITOR_CHANGE, function (t, e, n, o) { if (t === h.default.events.SELECTION_CHANGE) if (null != e && e.length > 0 && o === h.default.sources.USER) { r.show(), r.root.style.left = "0px", r.root.style.width = "", r.root.style.width = r.root.offsetWidth + "px"; var i = r.quill.getLines(e.index, e.length); if (1 === i.length) r.position(r.quill.getBounds(e)); else { var l = i[i.length - 1], a = r.quill.getIndex(l), s = Math.min(l.length() - 1, e.index + e.length - a), u = r.quill.getBounds(new y.Range(a, s)); r.position(u) } } else document.activeElement !== r.textbox && r.quill.hasFocus() && r.hide() }), r } return l(e, t), s(e, [{ key: "listen", value: function () { var t = this; a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector(".ql-close").addEventListener("click", function () { t.root.classList.remove("ql-editing") }), this.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { setTimeout(function () { if (!t.root.classList.contains("ql-hidden")) { var e = t.quill.getSelection(); null != e && t.position(t.quill.getBounds(e)) } }, 1) }) } }, { key: "cancel", value: function () { this.show() } }, { key: "position", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "position", this).call(this, t), r = this.root.querySelector(".ql-tooltip-arrow"); if (r.style.marginLeft = "", 0 === n) return n; r.style.marginLeft = -1 * n - r.offsetWidth / 2 + "px" } }]), e }(p.BaseTooltip); _.TEMPLATE = ['', '
"].join(""), e.BubbleTooltip = _, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(2), f = r(c), h = n(9), p = r(h), d = n(44), y = r(d), v = n(15), b = r(v), g = n(22), m = n(26), _ = r(m), O = [[{ header: ["1", "2", "3", !1] }], ["bold", "italic", "underline", "link"], [{ list: "ordered" }, { list: "bullet" }], ["clean"]], w = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = O); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-snow"), r } return l(e, t), u(e, [{ key: "extendToolbar", value: function (t) { t.container.classList.add("ql-snow"), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), _.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), _.default), this.tooltip = new x(this.quill, this.options.bounds), t.container.querySelector(".ql-link") && this.quill.keyboard.addBinding({ key: "K", shortKey: !0 }, function (e, n) { t.handlers.link.call(t, !n.format.link) }) } }]), e }(y.default); w.DEFAULTS = (0, f.default)(!0, {}, y.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { if (t) { var e = this.quill.getSelection(); if (null == e || 0 == e.length) return; var n = this.quill.getText(e); /^\S+@\S+\.\S+$/.test(n) && 0 !== n.indexOf("mailto:") && (n = "mailto:" + n); this.quill.theme.tooltip.edit("link", n) } else this.quill.format("link", !1) } } } } }); var x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.preview = r.root.querySelector("a.ql-preview"), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector("a.ql-action").addEventListener("click", function (e) { t.root.classList.contains("ql-editing") ? t.save() : t.edit("link", t.preview.textContent), e.preventDefault() }), this.root.querySelector("a.ql-remove").addEventListener("click", function (e) { if (null != t.linkRange) { var n = t.linkRange; t.restoreFocus(), t.quill.formatText(n, "link", !1, p.default.sources.USER), delete t.linkRange } e.preventDefault(), t.hide() }), this.quill.on(p.default.events.SELECTION_CHANGE, function (e, n, r) { if (null != e) { if (0 === e.length && r === p.default.sources.USER) { var o = t.quill.scroll.descendant(b.default, e.index), i = a(o, 2), l = i[0], s = i[1]; if (null != l) { t.linkRange = new g.Range(e.index - s, l.length()); var u = b.default.formats(l.domNode); return t.preview.textContent = u, t.preview.setAttribute("href", u), t.show(), void t.position(t.quill.getBounds(t.linkRange)) } } else delete t.linkRange; t.hide() } }) } }, { key: "show", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "show", this).call(this), this.root.removeAttribute("data-mode") } }]), e }(d.BaseTooltip); x.TEMPLATE = ['', '', '', ''].join(""), e.default = w }]).default }); -//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/Oqtane.Server/wwwroot/js/quill-blot-formatter.min.js b/Oqtane.Server/wwwroot/js/texteditors/quilljs/quill-blot-formatter.min.js similarity index 100% rename from Oqtane.Server/wwwroot/js/quill-blot-formatter.min.js rename to Oqtane.Server/wwwroot/js/texteditors/quilljs/quill-blot-formatter.min.js diff --git a/Oqtane.Server/wwwroot/js/quill-interop.js b/Oqtane.Server/wwwroot/js/texteditors/quilljs/quill-interop.js similarity index 100% rename from Oqtane.Server/wwwroot/js/quill-interop.js rename to Oqtane.Server/wwwroot/js/texteditors/quilljs/quill-interop.js diff --git a/Oqtane.Server/wwwroot/js/quill.min.js b/Oqtane.Server/wwwroot/js/texteditors/quilljs/quill.min.js similarity index 100% rename from Oqtane.Server/wwwroot/js/quill.min.js rename to Oqtane.Server/wwwroot/js/texteditors/quilljs/quill.min.js diff --git a/Oqtane.Server/wwwroot/js/quill.min.js.map b/Oqtane.Server/wwwroot/js/texteditors/quilljs/quill.min.js.map similarity index 100% rename from Oqtane.Server/wwwroot/js/quill.min.js.map rename to Oqtane.Server/wwwroot/js/texteditors/quilljs/quill.min.js.map diff --git a/Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js b/Oqtane.Server/wwwroot/js/texteditors/radzen/radzen-interop.js similarity index 100% rename from Oqtane.Server/wwwroot/Modules/Oqtane.RadzenTextEditor/Resources/js/Interops/RadzenTextEditorInterop.js rename to Oqtane.Server/wwwroot/js/texteditors/radzen/radzen-interop.js diff --git a/Oqtane.Shared/Shared/Constants.cs b/Oqtane.Shared/Shared/Constants.cs index 1cd0567c..6fc4296e 100644 --- a/Oqtane.Shared/Shared/Constants.cs +++ b/Oqtane.Shared/Shared/Constants.cs @@ -85,8 +85,10 @@ namespace Oqtane.Shared public const string DefaultSearchProviderName = "DatabaseSearchProvider"; public static readonly string[] InternalPagePaths = { "login", "register", "reset", "404" }; - public const string DefaultTextEditor = "Oqtane.Modules.Controls.QuillJSTextEditor, Oqtane.Client"; - //Obtained from https://cdnjs.com/libraries/bootstrap + + public const string DefaultTextEditor = "Oqtane.Modules.Controls.RadzenTextEditor, Oqtane.Client"; + + // obtained from https://cdnjs.com/libraries/bootstrap public const string BootstrapScriptUrl = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.7/js/bootstrap.bundle.min.js"; public const string BootstrapScriptIntegrity = "sha512-Tc0i+vRogmX4NN7tuLbQfBxa8JkfUSAxSFVzmU31nVdHyiHElPPy2cWfFacmCJKw0VqovrzKhdd2TSTMdAxp2g=="; public const string BootstrapStylesheetUrl = "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.7/css/bootstrap.min.css"; From b7398414957658abfc7e6ece6315ce94411806df Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 12:36:03 -0400 Subject: [PATCH 59/68] update application template --- .../wwwroot/css/quill/quill1.3.7.bubble.css | 1173 ----------------- .../wwwroot/css/quill/quill1.3.7.snow.css | 1170 ---------------- .../quilljs}/quill.bubble.css | 0 .../quilljs}/quill.snow.css | 0 .../texteditors/radzen/radzentexteditor.css | 22 + .../Server/wwwroot/js/quill1.3.7.min.js | 8 - .../quilljs}/quill-blot-formatter.min.js | 0 .../quilljs}/quill-interop.js | 0 .../js/{ => texteditors/quilljs}/quill.min.js | 0 .../quilljs}/quill.min.js.map | 0 .../js/texteditors/radzen/radzen-interop.js | 47 + 11 files changed, 69 insertions(+), 2351 deletions(-) delete mode 100644 Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css delete mode 100644 Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css rename Oqtane.Application/Server/wwwroot/css/{quill => texteditors/quilljs}/quill.bubble.css (100%) rename Oqtane.Application/Server/wwwroot/css/{quill => texteditors/quilljs}/quill.snow.css (100%) create mode 100644 Oqtane.Application/Server/wwwroot/css/texteditors/radzen/radzentexteditor.css delete mode 100644 Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js rename Oqtane.Application/Server/wwwroot/js/{ => texteditors/quilljs}/quill-blot-formatter.min.js (100%) rename Oqtane.Application/Server/wwwroot/js/{ => texteditors/quilljs}/quill-interop.js (100%) rename Oqtane.Application/Server/wwwroot/js/{ => texteditors/quilljs}/quill.min.js (100%) rename Oqtane.Application/Server/wwwroot/js/{ => texteditors/quilljs}/quill.min.js.map (100%) create mode 100644 Oqtane.Application/Server/wwwroot/js/texteditors/radzen/radzen-interop.js diff --git a/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css b/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css deleted file mode 100644 index 15661dda..00000000 --- a/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.bubble.css +++ /dev/null @@ -1,1173 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -.ql-container { - box-sizing: border-box; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - height: 100%; - margin: 0px; - position: relative; -} - - .ql-container.ql-disabled .ql-tooltip { - visibility: hidden; - } - - .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { - pointer-events: none; - } - -.ql-clipboard { - left: -100000px; - height: 1px; - overflow-y: hidden; - position: absolute; - top: 50%; -} - - .ql-clipboard p { - margin: 0; - padding: 0; - } - -.ql-editor { - box-sizing: border-box; - line-height: 1.42; - height: 100%; - outline: none; - overflow-y: auto; - padding: 12px 15px; - tab-size: 4; - -moz-tab-size: 4; - text-align: left; - white-space: pre-wrap; - word-wrap: break-word; -} - - .ql-editor > * { - cursor: text; - } - - .ql-editor p, - .ql-editor ol, - .ql-editor ul, - .ql-editor pre, - .ql-editor blockquote, - .ql-editor h1, - .ql-editor h2, - .ql-editor h3, - .ql-editor h4, - .ql-editor h5, - .ql-editor h6 { - margin: 0; - padding: 0; - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol, - .ql-editor ul { - padding-left: 1.5em; - } - - .ql-editor ol > li, - .ql-editor ul > li { - list-style-type: none; - } - - .ql-editor ul > li::before { - content: '\2022'; - } - - .ql-editor ul[data-checked=true], - .ql-editor ul[data-checked=false] { - pointer-events: none; - } - - .ql-editor ul[data-checked=true] > li *, - .ql-editor ul[data-checked=false] > li * { - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before, - .ql-editor ul[data-checked=false] > li::before { - color: #777; - cursor: pointer; - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before { - content: '\2611'; - } - - .ql-editor ul[data-checked=false] > li::before { - content: '\2610'; - } - - .ql-editor li::before { - display: inline-block; - white-space: nowrap; - width: 1.2em; - } - - .ql-editor li:not(.ql-direction-rtl)::before { - margin-left: -1.5em; - margin-right: 0.3em; - text-align: right; - } - - .ql-editor li.ql-direction-rtl::before { - margin-left: 0.3em; - margin-right: -1.5em; - } - - .ql-editor ol li:not(.ql-direction-rtl), - .ql-editor ul li:not(.ql-direction-rtl) { - padding-left: 1.5em; - } - - .ql-editor ol li.ql-direction-rtl, - .ql-editor ul li.ql-direction-rtl { - padding-right: 1.5em; - } - - .ql-editor ol li { - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - counter-increment: list-0; - } - - .ql-editor ol li:before { - content: counter(list-0, decimal) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-increment: list-1; - } - - .ql-editor ol li.ql-indent-1:before { - content: counter(list-1, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-2 { - counter-increment: list-2; - } - - .ql-editor ol li.ql-indent-2:before { - content: counter(list-2, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-2 { - counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-3 { - counter-increment: list-3; - } - - .ql-editor ol li.ql-indent-3:before { - content: counter(list-3, decimal) '. '; - } - - .ql-editor ol li.ql-indent-3 { - counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-4 { - counter-increment: list-4; - } - - .ql-editor ol li.ql-indent-4:before { - content: counter(list-4, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-4 { - counter-reset: list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-5 { - counter-increment: list-5; - } - - .ql-editor ol li.ql-indent-5:before { - content: counter(list-5, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-5 { - counter-reset: list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-6 { - counter-increment: list-6; - } - - .ql-editor ol li.ql-indent-6:before { - content: counter(list-6, decimal) '. '; - } - - .ql-editor ol li.ql-indent-6 { - counter-reset: list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-7 { - counter-increment: list-7; - } - - .ql-editor ol li.ql-indent-7:before { - content: counter(list-7, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-7 { - counter-reset: list-8 list-9; - } - - .ql-editor ol li.ql-indent-8 { - counter-increment: list-8; - } - - .ql-editor ol li.ql-indent-8:before { - content: counter(list-8, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-8 { - counter-reset: list-9; - } - - .ql-editor ol li.ql-indent-9 { - counter-increment: list-9; - } - - .ql-editor ol li.ql-indent-9:before { - content: counter(list-9, decimal) '. '; - } - - .ql-editor .ql-indent-1:not(.ql-direction-rtl) { - padding-left: 3em; - } - - .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { - padding-left: 4.5em; - } - - .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 3em; - } - - .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 4.5em; - } - - .ql-editor .ql-indent-2:not(.ql-direction-rtl) { - padding-left: 6em; - } - - .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { - padding-left: 7.5em; - } - - .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 6em; - } - - .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 7.5em; - } - - .ql-editor .ql-indent-3:not(.ql-direction-rtl) { - padding-left: 9em; - } - - .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { - padding-left: 10.5em; - } - - .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 9em; - } - - .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 10.5em; - } - - .ql-editor .ql-indent-4:not(.ql-direction-rtl) { - padding-left: 12em; - } - - .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { - padding-left: 13.5em; - } - - .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 12em; - } - - .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 13.5em; - } - - .ql-editor .ql-indent-5:not(.ql-direction-rtl) { - padding-left: 15em; - } - - .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { - padding-left: 16.5em; - } - - .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 15em; - } - - .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 16.5em; - } - - .ql-editor .ql-indent-6:not(.ql-direction-rtl) { - padding-left: 18em; - } - - .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { - padding-left: 19.5em; - } - - .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 18em; - } - - .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 19.5em; - } - - .ql-editor .ql-indent-7:not(.ql-direction-rtl) { - padding-left: 21em; - } - - .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { - padding-left: 22.5em; - } - - .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 21em; - } - - .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 22.5em; - } - - .ql-editor .ql-indent-8:not(.ql-direction-rtl) { - padding-left: 24em; - } - - .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { - padding-left: 25.5em; - } - - .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 24em; - } - - .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 25.5em; - } - - .ql-editor .ql-indent-9:not(.ql-direction-rtl) { - padding-left: 27em; - } - - .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { - padding-left: 28.5em; - } - - .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 27em; - } - - .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 28.5em; - } - - .ql-editor .ql-video { - display: block; - max-width: 100%; - } - - .ql-editor .ql-video.ql-align-center { - margin: 0 auto; - } - - .ql-editor .ql-video.ql-align-right { - margin: 0 0 0 auto; - } - - .ql-editor .ql-bg-black { - background-color: #000; - } - - .ql-editor .ql-bg-red { - background-color: #e60000; - } - - .ql-editor .ql-bg-orange { - background-color: #f90; - } - - .ql-editor .ql-bg-yellow { - background-color: #ff0; - } - - .ql-editor .ql-bg-green { - background-color: #008a00; - } - - .ql-editor .ql-bg-blue { - background-color: #06c; - } - - .ql-editor .ql-bg-purple { - background-color: #93f; - } - - .ql-editor .ql-color-white { - color: #fff; - } - - .ql-editor .ql-color-red { - color: #e60000; - } - - .ql-editor .ql-color-orange { - color: #f90; - } - - .ql-editor .ql-color-yellow { - color: #ff0; - } - - .ql-editor .ql-color-green { - color: #008a00; - } - - .ql-editor .ql-color-blue { - color: #06c; - } - - .ql-editor .ql-color-purple { - color: #93f; - } - - .ql-editor .ql-font-serif { - font-family: Georgia, Times New Roman, serif; - } - - .ql-editor .ql-font-monospace { - font-family: Monaco, Courier New, monospace; - } - - .ql-editor .ql-size-small { - font-size: 0.75em; - } - - .ql-editor .ql-size-large { - font-size: 1.5em; - } - - .ql-editor .ql-size-huge { - font-size: 2.5em; - } - - .ql-editor .ql-direction-rtl { - direction: rtl; - text-align: inherit; - } - - .ql-editor .ql-align-center { - text-align: center; - } - - .ql-editor .ql-align-justify { - text-align: justify; - } - - .ql-editor .ql-align-right { - text-align: right; - } - - .ql-editor.ql-blank::before { - color: rgba(0,0,0,0.6); - content: attr(data-placeholder); - font-style: italic; - left: 15px; - pointer-events: none; - position: absolute; - right: 15px; - } - -.ql-bubble.ql-toolbar:after, -.ql-bubble .ql-toolbar:after { - clear: both; - content: ''; - display: table; -} - -.ql-bubble.ql-toolbar button, -.ql-bubble .ql-toolbar button { - background: none; - border: none; - cursor: pointer; - display: inline-block; - float: left; - height: 24px; - padding: 3px 5px; - width: 28px; -} - - .ql-bubble.ql-toolbar button svg, - .ql-bubble .ql-toolbar button svg { - float: left; - height: 100%; - } - - .ql-bubble.ql-toolbar button:active:hover, - .ql-bubble .ql-toolbar button:active:hover { - outline: none; - } - -.ql-bubble.ql-toolbar input.ql-image[type=file], -.ql-bubble .ql-toolbar input.ql-image[type=file] { - display: none; -} - -.ql-bubble.ql-toolbar button:hover, -.ql-bubble .ql-toolbar button:hover, -.ql-bubble.ql-toolbar button:focus, -.ql-bubble .ql-toolbar button:focus, -.ql-bubble.ql-toolbar button.ql-active, -.ql-bubble .ql-toolbar button.ql-active, -.ql-bubble.ql-toolbar .ql-picker-label:hover, -.ql-bubble .ql-toolbar .ql-picker-label:hover, -.ql-bubble.ql-toolbar .ql-picker-label.ql-active, -.ql-bubble .ql-toolbar .ql-picker-label.ql-active, -.ql-bubble.ql-toolbar .ql-picker-item:hover, -.ql-bubble .ql-toolbar .ql-picker-item:hover, -.ql-bubble.ql-toolbar .ql-picker-item.ql-selected, -.ql-bubble .ql-toolbar .ql-picker-item.ql-selected { - color: #fff; -} - - .ql-bubble.ql-toolbar button:hover .ql-fill, - .ql-bubble .ql-toolbar button:hover .ql-fill, - .ql-bubble.ql-toolbar button:focus .ql-fill, - .ql-bubble .ql-toolbar button:focus .ql-fill, - .ql-bubble.ql-toolbar button.ql-active .ql-fill, - .ql-bubble .ql-toolbar button.ql-active .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { - fill: #fff; - } - - .ql-bubble.ql-toolbar button:hover .ql-stroke, - .ql-bubble .ql-toolbar button:hover .ql-stroke, - .ql-bubble.ql-toolbar button:focus .ql-stroke, - .ql-bubble .ql-toolbar button:focus .ql-stroke, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-bubble.ql-toolbar button:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar button:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar button:focus .ql-stroke-miter, - .ql-bubble .ql-toolbar button:focus .ql-stroke-miter, - .ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter, - .ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, - .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { - stroke: #fff; - } - -@media (pointer: coarse) { - .ql-bubble.ql-toolbar button:hover:not(.ql-active), - .ql-bubble .ql-toolbar button:hover:not(.ql-active) { - color: #ccc; - } - - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { - fill: #ccc; - } - - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, - .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { - stroke: #ccc; - } -} - -.ql-bubble { - box-sizing: border-box; -} - - .ql-bubble * { - box-sizing: border-box; - } - - .ql-bubble .ql-hidden { - display: none; - } - - .ql-bubble .ql-out-bottom, - .ql-bubble .ql-out-top { - visibility: hidden; - } - - .ql-bubble .ql-tooltip { - position: absolute; - transform: translateY(10px); - } - - .ql-bubble .ql-tooltip a { - cursor: pointer; - text-decoration: none; - } - - .ql-bubble .ql-tooltip.ql-flip { - transform: translateY(-10px); - } - - .ql-bubble .ql-formats { - display: inline-block; - vertical-align: middle; - } - - .ql-bubble .ql-formats:after { - clear: both; - content: ''; - display: table; - } - - .ql-bubble .ql-stroke { - fill: none; - stroke: #ccc; - stroke-linecap: round; - stroke-linejoin: round; - stroke-width: 2; - } - - .ql-bubble .ql-stroke-miter { - fill: none; - stroke: #ccc; - stroke-miterlimit: 10; - stroke-width: 2; - } - - .ql-bubble .ql-fill, - .ql-bubble .ql-stroke.ql-fill { - fill: #ccc; - } - - .ql-bubble .ql-empty { - fill: none; - } - - .ql-bubble .ql-even { - fill-rule: evenodd; - } - - .ql-bubble .ql-thin, - .ql-bubble .ql-stroke.ql-thin { - stroke-width: 1; - } - - .ql-bubble .ql-transparent { - opacity: 0.4; - } - - .ql-bubble .ql-direction svg:last-child { - display: none; - } - - .ql-bubble .ql-direction.ql-active svg:last-child { - display: inline; - } - - .ql-bubble .ql-direction.ql-active svg:first-child { - display: none; - } - - .ql-bubble .ql-editor h1 { - font-size: 2em; - } - - .ql-bubble .ql-editor h2 { - font-size: 1.5em; - } - - .ql-bubble .ql-editor h3 { - font-size: 1.17em; - } - - .ql-bubble .ql-editor h4 { - font-size: 1em; - } - - .ql-bubble .ql-editor h5 { - font-size: 0.83em; - } - - .ql-bubble .ql-editor h6 { - font-size: 0.67em; - } - - .ql-bubble .ql-editor a { - text-decoration: underline; - } - - .ql-bubble .ql-editor blockquote { - border-left: 4px solid #ccc; - margin-bottom: 5px; - margin-top: 5px; - padding-left: 16px; - } - - .ql-bubble .ql-editor code, - .ql-bubble .ql-editor pre { - background-color: #f0f0f0; - border-radius: 3px; - } - - .ql-bubble .ql-editor pre { - white-space: pre-wrap; - margin-bottom: 5px; - margin-top: 5px; - padding: 5px 10px; - } - - .ql-bubble .ql-editor code { - font-size: 85%; - padding: 2px 4px; - } - - .ql-bubble .ql-editor pre.ql-syntax { - background-color: #23241f; - color: #f8f8f2; - overflow: visible; - } - - .ql-bubble .ql-editor img { - max-width: 100%; - } - - .ql-bubble .ql-picker { - color: #ccc; - display: inline-block; - float: left; - font-size: 14px; - font-weight: 500; - height: 24px; - position: relative; - vertical-align: middle; - } - - .ql-bubble .ql-picker-label { - cursor: pointer; - display: inline-block; - height: 100%; - padding-left: 8px; - padding-right: 2px; - position: relative; - width: 100%; - } - - .ql-bubble .ql-picker-label::before { - display: inline-block; - line-height: 22px; - } - - .ql-bubble .ql-picker-options { - background-color: #444; - display: none; - min-width: 100%; - padding: 4px 8px; - position: absolute; - white-space: nowrap; - } - - .ql-bubble .ql-picker-options .ql-picker-item { - cursor: pointer; - display: block; - padding-bottom: 5px; - padding-top: 5px; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label { - color: #777; - z-index: 2; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill { - fill: #777; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke { - stroke: #777; - } - - .ql-bubble .ql-picker.ql-expanded .ql-picker-options { - display: block; - margin-top: -1px; - top: 100%; - z-index: 1; - } - - .ql-bubble .ql-color-picker, - .ql-bubble .ql-icon-picker { - width: 28px; - } - - .ql-bubble .ql-color-picker .ql-picker-label, - .ql-bubble .ql-icon-picker .ql-picker-label { - padding: 2px 4px; - } - - .ql-bubble .ql-color-picker .ql-picker-label svg, - .ql-bubble .ql-icon-picker .ql-picker-label svg { - right: 4px; - } - - .ql-bubble .ql-icon-picker .ql-picker-options { - padding: 4px 0px; - } - - .ql-bubble .ql-icon-picker .ql-picker-item { - height: 24px; - width: 24px; - padding: 2px 4px; - } - - .ql-bubble .ql-color-picker .ql-picker-options { - padding: 3px 5px; - width: 152px; - } - - .ql-bubble .ql-color-picker .ql-picker-item { - border: 1px solid transparent; - float: left; - height: 16px; - margin: 2px; - padding: 0px; - width: 16px; - } - - .ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { - position: absolute; - margin-top: -9px; - right: 0; - top: 50%; - width: 18px; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { - content: attr(data-label); - } - - .ql-bubble .ql-picker.ql-header { - width: 98px; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item::before { - content: 'Normal'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: 'Heading 1'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: 'Heading 2'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: 'Heading 3'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: 'Heading 4'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: 'Heading 5'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: 'Heading 6'; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - font-size: 2em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - font-size: 1.5em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - font-size: 1.17em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - font-size: 1em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - font-size: 0.83em; - } - - .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - font-size: 0.67em; - } - - .ql-bubble .ql-picker.ql-font { - width: 108px; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item::before { - content: 'Sans Serif'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - content: 'Serif'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - content: 'Monospace'; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - font-family: Georgia, Times New Roman, serif; - } - - .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - font-family: Monaco, Courier New, monospace; - } - - .ql-bubble .ql-picker.ql-size { - width: 98px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item::before { - content: 'Normal'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - content: 'Small'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - content: 'Large'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - content: 'Huge'; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - font-size: 10px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - font-size: 18px; - } - - .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - font-size: 32px; - } - - .ql-bubble .ql-color-picker.ql-background .ql-picker-item { - background-color: #fff; - } - - .ql-bubble .ql-color-picker.ql-color .ql-picker-item { - background-color: #000; - } - - .ql-bubble .ql-toolbar .ql-formats { - margin: 8px 12px 8px 0px; - } - - .ql-bubble .ql-toolbar .ql-formats:first-child { - margin-left: 12px; - } - - .ql-bubble .ql-color-picker svg { - margin: 1px; - } - - .ql-bubble .ql-color-picker .ql-picker-item.ql-selected, - .ql-bubble .ql-color-picker .ql-picker-item:hover { - border-color: #fff; - } - - .ql-bubble .ql-tooltip { - background-color: #444; - border-radius: 25px; - color: #fff; - } - - .ql-bubble .ql-tooltip-arrow { - border-left: 6px solid transparent; - border-right: 6px solid transparent; - content: " "; - display: block; - left: 50%; - margin-left: -6px; - position: absolute; - } - - .ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow { - border-bottom: 6px solid #444; - top: -6px; - } - - .ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow { - border-top: 6px solid #444; - bottom: -6px; - } - - .ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor { - display: block; - } - - .ql-bubble .ql-tooltip.ql-editing .ql-formats { - visibility: hidden; - } - - .ql-bubble .ql-tooltip-editor { - display: none; - } - - .ql-bubble .ql-tooltip-editor input[type=text] { - background: transparent; - border: none; - color: #fff; - font-size: 13px; - height: 100%; - outline: none; - padding: 10px 20px; - position: absolute; - width: 100%; - } - - .ql-bubble .ql-tooltip-editor a { - top: 10px; - position: absolute; - right: 20px; - } - - .ql-bubble .ql-tooltip-editor a:before { - color: #ccc; - content: "\D7"; - font-size: 16px; - font-weight: bold; - } - -.ql-container.ql-bubble:not(.ql-disabled) a { - position: relative; - white-space: nowrap; -} - - .ql-container.ql-bubble:not(.ql-disabled) a::before { - background-color: #444; - border-radius: 15px; - top: -5px; - font-size: 12px; - color: #fff; - content: attr(href); - font-weight: normal; - overflow: hidden; - padding: 5px 15px; - text-decoration: none; - z-index: 1; - } - - .ql-container.ql-bubble:not(.ql-disabled) a::after { - border-top: 6px solid #444; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - top: 0; - content: " "; - height: 0; - width: 0; - } - - .ql-container.ql-bubble:not(.ql-disabled) a::before, - .ql-container.ql-bubble:not(.ql-disabled) a::after { - left: 0; - margin-left: 50%; - position: absolute; - transform: translate(-50%, -100%); - transition: visibility 0s ease 200ms; - visibility: hidden; - } - - .ql-container.ql-bubble:not(.ql-disabled) a:hover::before, - .ql-container.ql-bubble:not(.ql-disabled) a:hover::after { - visibility: visible; - } diff --git a/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css b/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css deleted file mode 100644 index 31ffab18..00000000 --- a/Oqtane.Application/Server/wwwroot/css/quill/quill1.3.7.snow.css +++ /dev/null @@ -1,1170 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -.ql-container { - box-sizing: border-box; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - height: 100%; - margin: 0px; - position: relative; -} - - .ql-container.ql-disabled .ql-tooltip { - visibility: hidden; - } - - .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { - pointer-events: none; - } - -.ql-clipboard { - left: -100000px; - height: 1px; - overflow-y: hidden; - position: absolute; - top: 50%; -} - - .ql-clipboard p { - margin: 0; - padding: 0; - } - -.ql-editor { - box-sizing: border-box; - line-height: 1.42; - height: 100%; - outline: none; - overflow-y: auto; - padding: 12px 15px; - tab-size: 4; - -moz-tab-size: 4; - text-align: left; - white-space: pre-wrap; - word-wrap: break-word; -} - - .ql-editor > * { - cursor: text; - } - - .ql-editor p, - .ql-editor ol, - .ql-editor ul, - .ql-editor pre, - .ql-editor blockquote, - .ql-editor h1, - .ql-editor h2, - .ql-editor h3, - .ql-editor h4, - .ql-editor h5, - .ql-editor h6 { - margin: 0; - padding: 0; - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol, - .ql-editor ul { - padding-left: 1.5em; - } - - .ql-editor ol > li, - .ql-editor ul > li { - list-style-type: none; - } - - .ql-editor ul > li::before { - content: '\2022'; - } - - .ql-editor ul[data-checked=true], - .ql-editor ul[data-checked=false] { - pointer-events: none; - } - - .ql-editor ul[data-checked=true] > li *, - .ql-editor ul[data-checked=false] > li * { - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before, - .ql-editor ul[data-checked=false] > li::before { - color: #777; - cursor: pointer; - pointer-events: all; - } - - .ql-editor ul[data-checked=true] > li::before { - content: '\2611'; - } - - .ql-editor ul[data-checked=false] > li::before { - content: '\2610'; - } - - .ql-editor li::before { - display: inline-block; - white-space: nowrap; - width: 1.2em; - } - - .ql-editor li:not(.ql-direction-rtl)::before { - margin-left: -1.5em; - margin-right: 0.3em; - text-align: right; - } - - .ql-editor li.ql-direction-rtl::before { - margin-left: 0.3em; - margin-right: -1.5em; - } - - .ql-editor ol li:not(.ql-direction-rtl), - .ql-editor ul li:not(.ql-direction-rtl) { - padding-left: 1.5em; - } - - .ql-editor ol li.ql-direction-rtl, - .ql-editor ul li.ql-direction-rtl { - padding-right: 1.5em; - } - - .ql-editor ol li { - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - counter-increment: list-0; - } - - .ql-editor ol li:before { - content: counter(list-0, decimal) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-increment: list-1; - } - - .ql-editor ol li.ql-indent-1:before { - content: counter(list-1, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-1 { - counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-2 { - counter-increment: list-2; - } - - .ql-editor ol li.ql-indent-2:before { - content: counter(list-2, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-2 { - counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-3 { - counter-increment: list-3; - } - - .ql-editor ol li.ql-indent-3:before { - content: counter(list-3, decimal) '. '; - } - - .ql-editor ol li.ql-indent-3 { - counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-4 { - counter-increment: list-4; - } - - .ql-editor ol li.ql-indent-4:before { - content: counter(list-4, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-4 { - counter-reset: list-5 list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-5 { - counter-increment: list-5; - } - - .ql-editor ol li.ql-indent-5:before { - content: counter(list-5, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-5 { - counter-reset: list-6 list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-6 { - counter-increment: list-6; - } - - .ql-editor ol li.ql-indent-6:before { - content: counter(list-6, decimal) '. '; - } - - .ql-editor ol li.ql-indent-6 { - counter-reset: list-7 list-8 list-9; - } - - .ql-editor ol li.ql-indent-7 { - counter-increment: list-7; - } - - .ql-editor ol li.ql-indent-7:before { - content: counter(list-7, lower-alpha) '. '; - } - - .ql-editor ol li.ql-indent-7 { - counter-reset: list-8 list-9; - } - - .ql-editor ol li.ql-indent-8 { - counter-increment: list-8; - } - - .ql-editor ol li.ql-indent-8:before { - content: counter(list-8, lower-roman) '. '; - } - - .ql-editor ol li.ql-indent-8 { - counter-reset: list-9; - } - - .ql-editor ol li.ql-indent-9 { - counter-increment: list-9; - } - - .ql-editor ol li.ql-indent-9:before { - content: counter(list-9, decimal) '. '; - } - - .ql-editor .ql-indent-1:not(.ql-direction-rtl) { - padding-left: 3em; - } - - .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { - padding-left: 4.5em; - } - - .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 3em; - } - - .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 4.5em; - } - - .ql-editor .ql-indent-2:not(.ql-direction-rtl) { - padding-left: 6em; - } - - .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { - padding-left: 7.5em; - } - - .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 6em; - } - - .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 7.5em; - } - - .ql-editor .ql-indent-3:not(.ql-direction-rtl) { - padding-left: 9em; - } - - .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { - padding-left: 10.5em; - } - - .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 9em; - } - - .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 10.5em; - } - - .ql-editor .ql-indent-4:not(.ql-direction-rtl) { - padding-left: 12em; - } - - .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { - padding-left: 13.5em; - } - - .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 12em; - } - - .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 13.5em; - } - - .ql-editor .ql-indent-5:not(.ql-direction-rtl) { - padding-left: 15em; - } - - .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { - padding-left: 16.5em; - } - - .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 15em; - } - - .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 16.5em; - } - - .ql-editor .ql-indent-6:not(.ql-direction-rtl) { - padding-left: 18em; - } - - .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { - padding-left: 19.5em; - } - - .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 18em; - } - - .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 19.5em; - } - - .ql-editor .ql-indent-7:not(.ql-direction-rtl) { - padding-left: 21em; - } - - .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { - padding-left: 22.5em; - } - - .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 21em; - } - - .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 22.5em; - } - - .ql-editor .ql-indent-8:not(.ql-direction-rtl) { - padding-left: 24em; - } - - .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { - padding-left: 25.5em; - } - - .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 24em; - } - - .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 25.5em; - } - - .ql-editor .ql-indent-9:not(.ql-direction-rtl) { - padding-left: 27em; - } - - .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { - padding-left: 28.5em; - } - - .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 27em; - } - - .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 28.5em; - } - - .ql-editor .ql-video { - display: block; - max-width: 100%; - } - - .ql-editor .ql-video.ql-align-center { - margin: 0 auto; - } - - .ql-editor .ql-video.ql-align-right { - margin: 0 0 0 auto; - } - - .ql-editor .ql-bg-black { - background-color: #000; - } - - .ql-editor .ql-bg-red { - background-color: #e60000; - } - - .ql-editor .ql-bg-orange { - background-color: #f90; - } - - .ql-editor .ql-bg-yellow { - background-color: #ff0; - } - - .ql-editor .ql-bg-green { - background-color: #008a00; - } - - .ql-editor .ql-bg-blue { - background-color: #06c; - } - - .ql-editor .ql-bg-purple { - background-color: #93f; - } - - .ql-editor .ql-color-white { - color: #fff; - } - - .ql-editor .ql-color-red { - color: #e60000; - } - - .ql-editor .ql-color-orange { - color: #f90; - } - - .ql-editor .ql-color-yellow { - color: #ff0; - } - - .ql-editor .ql-color-green { - color: #008a00; - } - - .ql-editor .ql-color-blue { - color: #06c; - } - - .ql-editor .ql-color-purple { - color: #93f; - } - - .ql-editor .ql-font-serif { - font-family: Georgia, Times New Roman, serif; - } - - .ql-editor .ql-font-monospace { - font-family: Monaco, Courier New, monospace; - } - - .ql-editor .ql-size-small { - font-size: 0.75em; - } - - .ql-editor .ql-size-large { - font-size: 1.5em; - } - - .ql-editor .ql-size-huge { - font-size: 2.5em; - } - - .ql-editor .ql-direction-rtl { - direction: rtl; - text-align: inherit; - } - - .ql-editor .ql-align-center { - text-align: center; - } - - .ql-editor .ql-align-justify { - text-align: justify; - } - - .ql-editor .ql-align-right { - text-align: right; - } - - .ql-editor.ql-blank::before { - color: rgba(0,0,0,0.6); - content: attr(data-placeholder); - font-style: italic; - left: 15px; - pointer-events: none; - position: absolute; - right: 15px; - } - -.ql-snow.ql-toolbar:after, -.ql-snow .ql-toolbar:after { - clear: both; - content: ''; - display: table; -} - -.ql-snow.ql-toolbar button, -.ql-snow .ql-toolbar button { - background: none; - border: none; - cursor: pointer; - display: inline-block; - float: left; - height: 24px; - padding: 3px 5px; - width: 28px; -} - - .ql-snow.ql-toolbar button svg, - .ql-snow .ql-toolbar button svg { - float: left; - height: 100%; - } - - .ql-snow.ql-toolbar button:active:hover, - .ql-snow .ql-toolbar button:active:hover { - outline: none; - } - -.ql-snow.ql-toolbar input.ql-image[type=file], -.ql-snow .ql-toolbar input.ql-image[type=file] { - display: none; -} - -.ql-snow.ql-toolbar button:hover, -.ql-snow .ql-toolbar button:hover, -.ql-snow.ql-toolbar button:focus, -.ql-snow .ql-toolbar button:focus, -.ql-snow.ql-toolbar button.ql-active, -.ql-snow .ql-toolbar button.ql-active, -.ql-snow.ql-toolbar .ql-picker-label:hover, -.ql-snow .ql-toolbar .ql-picker-label:hover, -.ql-snow.ql-toolbar .ql-picker-label.ql-active, -.ql-snow .ql-toolbar .ql-picker-label.ql-active, -.ql-snow.ql-toolbar .ql-picker-item:hover, -.ql-snow .ql-toolbar .ql-picker-item:hover, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected { - color: #06c; -} - - .ql-snow.ql-toolbar button:hover .ql-fill, - .ql-snow .ql-toolbar button:hover .ql-fill, - .ql-snow.ql-toolbar button:focus .ql-fill, - .ql-snow .ql-toolbar button:focus .ql-fill, - .ql-snow.ql-toolbar button.ql-active .ql-fill, - .ql-snow .ql-toolbar button.ql-active .ql-fill, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, - .ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, - .ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { - fill: #06c; - } - - .ql-snow.ql-toolbar button:hover .ql-stroke, - .ql-snow .ql-toolbar button:hover .ql-stroke, - .ql-snow.ql-toolbar button:focus .ql-stroke, - .ql-snow .ql-toolbar button:focus .ql-stroke, - .ql-snow.ql-toolbar button.ql-active .ql-stroke, - .ql-snow .ql-toolbar button.ql-active .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, - .ql-snow.ql-toolbar button:hover .ql-stroke-miter, - .ql-snow .ql-toolbar button:hover .ql-stroke-miter, - .ql-snow.ql-toolbar button:focus .ql-stroke-miter, - .ql-snow .ql-toolbar button:focus .ql-stroke-miter, - .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, - .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, - .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, - .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { - stroke: #06c; - } - -@media (pointer: coarse) { - .ql-snow.ql-toolbar button:hover:not(.ql-active), - .ql-snow .ql-toolbar button:hover:not(.ql-active) { - color: #444; - } - - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { - fill: #444; - } - - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { - stroke: #444; - } -} - -.ql-snow { - box-sizing: border-box; -} - - .ql-snow * { - box-sizing: border-box; - } - - .ql-snow .ql-hidden { - display: none; - } - - .ql-snow .ql-out-bottom, - .ql-snow .ql-out-top { - visibility: hidden; - } - - .ql-snow .ql-tooltip { - position: absolute; - transform: translateY(10px); - } - - .ql-snow .ql-tooltip a { - cursor: pointer; - text-decoration: none; - } - - .ql-snow .ql-tooltip.ql-flip { - transform: translateY(-10px); - } - - .ql-snow .ql-formats { - display: inline-block; - vertical-align: middle; - } - - .ql-snow .ql-formats:after { - clear: both; - content: ''; - display: table; - } - - .ql-snow .ql-stroke { - fill: none; - stroke: #444; - stroke-linecap: round; - stroke-linejoin: round; - stroke-width: 2; - } - - .ql-snow .ql-stroke-miter { - fill: none; - stroke: #444; - stroke-miterlimit: 10; - stroke-width: 2; - } - - .ql-snow .ql-fill, - .ql-snow .ql-stroke.ql-fill { - fill: #444; - } - - .ql-snow .ql-empty { - fill: none; - } - - .ql-snow .ql-even { - fill-rule: evenodd; - } - - .ql-snow .ql-thin, - .ql-snow .ql-stroke.ql-thin { - stroke-width: 1; - } - - .ql-snow .ql-transparent { - opacity: 0.4; - } - - .ql-snow .ql-direction svg:last-child { - display: none; - } - - .ql-snow .ql-direction.ql-active svg:last-child { - display: inline; - } - - .ql-snow .ql-direction.ql-active svg:first-child { - display: none; - } - - .ql-snow .ql-editor h1 { - font-size: 2em; - } - - .ql-snow .ql-editor h2 { - font-size: 1.5em; - } - - .ql-snow .ql-editor h3 { - font-size: 1.17em; - } - - .ql-snow .ql-editor h4 { - font-size: 1em; - } - - .ql-snow .ql-editor h5 { - font-size: 0.83em; - } - - .ql-snow .ql-editor h6 { - font-size: 0.67em; - } - - .ql-snow .ql-editor a { - text-decoration: underline; - } - - .ql-snow .ql-editor blockquote { - border-left: 4px solid #ccc; - margin-bottom: 5px; - margin-top: 5px; - padding-left: 16px; - } - - .ql-snow .ql-editor code, - .ql-snow .ql-editor pre { - background-color: #f0f0f0; - border-radius: 3px; - } - - .ql-snow .ql-editor pre { - white-space: pre-wrap; - margin-bottom: 5px; - margin-top: 5px; - padding: 5px 10px; - } - - .ql-snow .ql-editor code { - font-size: 85%; - padding: 2px 4px; - } - - .ql-snow .ql-editor pre.ql-syntax { - background-color: #23241f; - color: #f8f8f2; - overflow: visible; - } - - .ql-snow .ql-editor img { - max-width: 100%; - } - - .ql-snow .ql-picker { - color: #444; - display: inline-block; - float: left; - font-size: 14px; - font-weight: 500; - height: 24px; - position: relative; - vertical-align: middle; - } - - .ql-snow .ql-picker-label { - cursor: pointer; - display: inline-block; - height: 100%; - padding-left: 8px; - padding-right: 2px; - position: relative; - width: 100%; - } - - .ql-snow .ql-picker-label::before { - display: inline-block; - line-height: 22px; - } - - .ql-snow .ql-picker-options { - background-color: #fff; - display: none; - min-width: 100%; - padding: 4px 8px; - position: absolute; - white-space: nowrap; - } - - .ql-snow .ql-picker-options .ql-picker-item { - cursor: pointer; - display: block; - padding-bottom: 5px; - padding-top: 5px; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label { - color: #ccc; - z-index: 2; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { - fill: #ccc; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { - stroke: #ccc; - } - - .ql-snow .ql-picker.ql-expanded .ql-picker-options { - display: block; - margin-top: -1px; - top: 100%; - z-index: 1; - } - - .ql-snow .ql-color-picker, - .ql-snow .ql-icon-picker { - width: 28px; - } - - .ql-snow .ql-color-picker .ql-picker-label, - .ql-snow .ql-icon-picker .ql-picker-label { - padding: 2px 4px; - } - - .ql-snow .ql-color-picker .ql-picker-label svg, - .ql-snow .ql-icon-picker .ql-picker-label svg { - right: 4px; - } - - .ql-snow .ql-icon-picker .ql-picker-options { - padding: 4px 0px; - } - - .ql-snow .ql-icon-picker .ql-picker-item { - height: 24px; - width: 24px; - padding: 2px 4px; - } - - .ql-snow .ql-color-picker .ql-picker-options { - padding: 3px 5px; - width: 152px; - } - - .ql-snow .ql-color-picker .ql-picker-item { - border: 1px solid transparent; - float: left; - height: 16px; - margin: 2px; - padding: 0px; - width: 16px; - } - - .ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { - position: absolute; - margin-top: -9px; - right: 0; - top: 50%; - width: 18px; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { - content: attr(data-label); - } - - .ql-snow .ql-picker.ql-header { - width: 98px; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label::before, - .ql-snow .ql-picker.ql-header .ql-picker-item::before { - content: 'Normal'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: 'Heading 1'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: 'Heading 2'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: 'Heading 3'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: 'Heading 4'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: 'Heading 5'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: 'Heading 6'; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - font-size: 2em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - font-size: 1.5em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - font-size: 1.17em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - font-size: 1em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - font-size: 0.83em; - } - - .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - font-size: 0.67em; - } - - .ql-snow .ql-picker.ql-font { - width: 108px; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label::before, - .ql-snow .ql-picker.ql-font .ql-picker-item::before { - content: 'Sans Serif'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - content: 'Serif'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - content: 'Monospace'; - } - - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - font-family: Georgia, Times New Roman, serif; - } - - .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - font-family: Monaco, Courier New, monospace; - } - - .ql-snow .ql-picker.ql-size { - width: 98px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label::before, - .ql-snow .ql-picker.ql-size .ql-picker-item::before { - content: 'Normal'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - content: 'Small'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - content: 'Large'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - content: 'Huge'; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - font-size: 10px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - font-size: 18px; - } - - .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - font-size: 32px; - } - - .ql-snow .ql-color-picker.ql-background .ql-picker-item { - background-color: #fff; - } - - .ql-snow .ql-color-picker.ql-color .ql-picker-item { - background-color: #000; - } - -.ql-toolbar.ql-snow { - border: 1px solid #ccc; - box-sizing: border-box; - font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; - padding: 8px; -} - - .ql-toolbar.ql-snow .ql-formats { - margin-right: 15px; - } - - .ql-toolbar.ql-snow .ql-picker-label { - border: 1px solid transparent; - } - - .ql-toolbar.ql-snow .ql-picker-options { - border: 1px solid transparent; - box-shadow: rgba(0,0,0,0.2) 0 2px 8px; - } - - .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { - border-color: #ccc; - } - - .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { - border-color: #ccc; - } - - .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, - .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { - border-color: #000; - } - - .ql-toolbar.ql-snow + .ql-container.ql-snow { - border-top: 0px; - } - -.ql-snow .ql-tooltip { - background-color: #fff; - border: 1px solid #ccc; - box-shadow: 0px 0px 5px #ddd; - color: #444; - padding: 5px 12px; - white-space: nowrap; -} - - .ql-snow .ql-tooltip::before { - content: "Visit URL:"; - line-height: 26px; - margin-right: 8px; - } - - .ql-snow .ql-tooltip input[type=text] { - display: none; - border: 1px solid #ccc; - font-size: 13px; - height: 26px; - margin: 0px; - padding: 3px 5px; - width: 170px; - } - - .ql-snow .ql-tooltip a.ql-preview { - display: inline-block; - max-width: 200px; - overflow-x: hidden; - text-overflow: ellipsis; - vertical-align: top; - } - - .ql-snow .ql-tooltip a.ql-action::after { - border-right: 1px solid #ccc; - content: 'Edit'; - margin-left: 16px; - padding-right: 8px; - } - - .ql-snow .ql-tooltip a.ql-remove::before { - content: 'Remove'; - margin-left: 8px; - } - - .ql-snow .ql-tooltip a { - line-height: 26px; - } - - .ql-snow .ql-tooltip.ql-editing a.ql-preview, - .ql-snow .ql-tooltip.ql-editing a.ql-remove { - display: none; - } - - .ql-snow .ql-tooltip.ql-editing input[type=text] { - display: inline-block; - } - - .ql-snow .ql-tooltip.ql-editing a.ql-action::after { - border-right: 0px; - content: 'Save'; - padding-right: 0px; - } - - .ql-snow .ql-tooltip[data-mode=link]::before { - content: "Enter link:"; - } - - .ql-snow .ql-tooltip[data-mode=formula]::before { - content: "Enter formula:"; - } - - .ql-snow .ql-tooltip[data-mode=video]::before { - content: "Enter video:"; - } - -.ql-snow a { - color: #06c; -} - -.ql-container.ql-snow { - border: 1px solid #ccc; -} diff --git a/Oqtane.Application/Server/wwwroot/css/quill/quill.bubble.css b/Oqtane.Application/Server/wwwroot/css/texteditors/quilljs/quill.bubble.css similarity index 100% rename from Oqtane.Application/Server/wwwroot/css/quill/quill.bubble.css rename to Oqtane.Application/Server/wwwroot/css/texteditors/quilljs/quill.bubble.css diff --git a/Oqtane.Application/Server/wwwroot/css/quill/quill.snow.css b/Oqtane.Application/Server/wwwroot/css/texteditors/quilljs/quill.snow.css similarity index 100% rename from Oqtane.Application/Server/wwwroot/css/quill/quill.snow.css rename to Oqtane.Application/Server/wwwroot/css/texteditors/quilljs/quill.snow.css diff --git a/Oqtane.Application/Server/wwwroot/css/texteditors/radzen/radzentexteditor.css b/Oqtane.Application/Server/wwwroot/css/texteditors/radzen/radzentexteditor.css new file mode 100644 index 00000000..e142053b --- /dev/null +++ b/Oqtane.Application/Server/wwwroot/css/texteditors/radzen/radzentexteditor.css @@ -0,0 +1,22 @@ +.rz-text-editor { + outline: none !important; +} + +.rz-html-editor-dropdown-items, +.rz-popup, +.rz-editor-dialog-wrapper { + z-index: 9999 !important; +} + +.rz-html-editor-dropdown-items .rz-html-editor-dropdown-item, +.rz-html-editor-dropdown-items .rz-html-editor-dropdown-item > * { + color: var(--rz-editor-button-color); +} +.rz-text-editor .rz-html-editor-dropdown .rz-html-editor-dropdown-value, +.rz-text-editor .rz-html-editor-dropdown .rz-html-editor-dropdown-trigger, +.rz-text-editor .rz-html-editor-colorpicker .rz-html-editor-color { + color: var(--rz-editor-button-color); +} +.rz-text-editor .rz-colorpicker.rz-state-disabled { + border: none !important; +} \ No newline at end of file diff --git a/Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js b/Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js deleted file mode 100644 index c0d84f88..00000000 --- a/Oqtane.Application/Server/wwwroot/js/quill1.3.7.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ - * Copyright (c) 2014, Jason Chen - * Copyright (c) 2013, salesforce.com - */ -!function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.Quill = e() : t.Quill = e() }("undefined" != typeof self ? self : this, function () { return function (t) { function e(r) { if (n[r]) return n[r].exports; var o = n[r] = { i: r, l: !1, exports: {} }; return t[r].call(o.exports, o, o.exports, e), o.l = !0, o.exports } var n = {}; return e.m = t, e.c = n, e.d = function (t, n, r) { e.o(t, n) || Object.defineProperty(t, n, { configurable: !1, enumerable: !0, get: r }) }, e.n = function (t) { var n = t && t.__esModule ? function () { return t.default } : function () { return t }; return e.d(n, "a", n), n }, e.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, e.p = "", e(e.s = 45) }([function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(17), o = n(18), i = n(19), l = n(48), a = n(49), s = n(50), u = n(51), c = n(52), f = n(11), h = n(29), p = n(30), d = n(28), y = n(1), v = { Scope: y.Scope, create: y.create, find: y.find, query: y.query, register: y.register, Container: r.default, Format: o.default, Leaf: i.default, Embed: u.default, Scroll: l.default, Block: s.default, Inline: a.default, Text: c.default, Attributor: { Attribute: f.default, Class: h.default, Style: p.default, Store: d.default } }; e.default = v }, function (t, e, n) { "use strict"; function r(t, e) { var n = i(t); if (null == n) throw new s("Unable to create " + t + " blot"); var r = n; return new r(t instanceof Node || t.nodeType === Node.TEXT_NODE ? t : r.create(e), e) } function o(t, n) { return void 0 === n && (n = !1), null == t ? null : null != t[e.DATA_KEY] ? t[e.DATA_KEY].blot : n ? o(t.parentNode, n) : null } function i(t, e) { void 0 === e && (e = p.ANY); var n; if ("string" == typeof t) n = h[t] || u[t]; else if (t instanceof Text || t.nodeType === Node.TEXT_NODE) n = h.text; else if ("number" == typeof t) t & p.LEVEL & p.BLOCK ? n = h.block : t & p.LEVEL & p.INLINE && (n = h.inline); else if (t instanceof HTMLElement) { var r = (t.getAttribute("class") || "").split(/\s+/); for (var o in r) if (n = c[r[o]]) break; n = n || f[t.tagName] } return null == n ? null : e & p.LEVEL & n.scope && e & p.TYPE & n.scope ? n : null } function l() { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; if (t.length > 1) return t.map(function (t) { return l(t) }); var n = t[0]; if ("string" != typeof n.blotName && "string" != typeof n.attrName) throw new s("Invalid definition"); if ("abstract" === n.blotName) throw new s("Cannot register abstract class"); if (h[n.blotName || n.attrName] = n, "string" == typeof n.keyName) u[n.keyName] = n; else if (null != n.className && (c[n.className] = n), null != n.tagName) { Array.isArray(n.tagName) ? n.tagName = n.tagName.map(function (t) { return t.toUpperCase() }) : n.tagName = n.tagName.toUpperCase(); var r = Array.isArray(n.tagName) ? n.tagName : [n.tagName]; r.forEach(function (t) { null != f[t] && null != n.className || (f[t] = n) }) } return n } var a = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var s = function (t) { function e(e) { var n = this; return e = "[Parchment] " + e, n = t.call(this, e) || this, n.message = e, n.name = n.constructor.name, n } return a(e, t), e }(Error); e.ParchmentError = s; var u = {}, c = {}, f = {}, h = {}; e.DATA_KEY = "__blot"; var p; !function (t) { t[t.TYPE = 3] = "TYPE", t[t.LEVEL = 12] = "LEVEL", t[t.ATTRIBUTE = 13] = "ATTRIBUTE", t[t.BLOT = 14] = "BLOT", t[t.INLINE = 7] = "INLINE", t[t.BLOCK = 11] = "BLOCK", t[t.BLOCK_BLOT = 10] = "BLOCK_BLOT", t[t.INLINE_BLOT = 6] = "INLINE_BLOT", t[t.BLOCK_ATTRIBUTE = 9] = "BLOCK_ATTRIBUTE", t[t.INLINE_ATTRIBUTE = 5] = "INLINE_ATTRIBUTE", t[t.ANY = 15] = "ANY" }(p = e.Scope || (e.Scope = {})), e.create = r, e.find = o, e.query = i, e.register = l }, function (t, e) { "use strict"; var n = Object.prototype.hasOwnProperty, r = Object.prototype.toString, o = Object.defineProperty, i = Object.getOwnPropertyDescriptor, l = function (t) { return "function" == typeof Array.isArray ? Array.isArray(t) : "[object Array]" === r.call(t) }, a = function (t) { if (!t || "[object Object]" !== r.call(t)) return !1; var e = n.call(t, "constructor"), o = t.constructor && t.constructor.prototype && n.call(t.constructor.prototype, "isPrototypeOf"); if (t.constructor && !e && !o) return !1; var i; for (i in t); return void 0 === i || n.call(t, i) }, s = function (t, e) { o && "__proto__" === e.name ? o(t, e.name, { enumerable: !0, configurable: !0, value: e.newValue, writable: !0 }) : t[e.name] = e.newValue }, u = function (t, e) { if ("__proto__" === e) { if (!n.call(t, e)) return; if (i) return i(t, e).value } return t[e] }; t.exports = function t() { var e, n, r, o, i, c, f = arguments[0], h = 1, p = arguments.length, d = !1; for ("boolean" == typeof f && (d = f, f = arguments[1] || {}, h = 2), (null == f || "object" != typeof f && "function" != typeof f) && (f = {}); h < p; ++h)if (null != (e = arguments[h])) for (n in e) r = u(f, n), o = u(e, n), f !== o && (d && o && (a(o) || (i = l(o))) ? (i ? (i = !1, c = r && l(r) ? r : []) : c = r && a(r) ? r : {}, s(f, { name: n, newValue: t(d, c, o) })) : void 0 !== o && s(f, { name: n, newValue: o })); return f } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return null == t ? e : ("function" == typeof t.formats && (e = (0, f.default)(e, t.formats())), null == t.parent || "scroll" == t.parent.blotName || t.parent.statics.scope !== t.statics.scope ? e : a(t.parent, e)) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BlockEmbed = e.bubbleFormats = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(2), f = r(c), h = n(4), p = r(h), d = n(0), y = r(d), v = n(14), b = r(v), g = n(5), m = r(g), _ = n(8), O = r(_), w = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "attach", value: function () { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "attach", this).call(this), this.attributes = new y.default.Attributor.Store(this.domNode) } }, { key: "delta", value: function () { return (new p.default).insert(this.value(), (0, f.default)(this.formats(), this.attributes.values())) } }, { key: "format", value: function (t, e) { var n = y.default.query(t, y.default.Scope.BLOCK_ATTRIBUTE); null != n && this.attributes.attribute(n, e) } }, { key: "formatAt", value: function (t, e, n, r) { this.format(n, r) } }, { key: "insertAt", value: function (t, n, r) { if ("string" == typeof n && n.endsWith("\n")) { var o = y.default.create(x.blotName); this.parent.insertBefore(o, 0 === t ? this : this.next), o.insertAt(0, n.slice(0, -1)) } else u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r) } }]), e }(y.default.Embed); w.scope = y.default.Scope.BLOCK_BLOT; var x = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.cache = {}, n } return l(e, t), s(e, [{ key: "delta", value: function () { return null == this.cache.delta && (this.cache.delta = this.descendants(y.default.Leaf).reduce(function (t, e) { return 0 === e.length() ? t : t.insert(e.value(), a(e)) }, new p.default).insert("\n", a(this))), this.cache.delta } }, { key: "deleteAt", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), this.cache = {} } }, { key: "formatAt", value: function (t, n, r, o) { n <= 0 || (y.default.query(r, y.default.Scope.BLOCK) ? t + n === this.length() && this.format(r, o) : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, Math.min(n, this.length() - t - 1), r, o), this.cache = {}) } }, { key: "insertAt", value: function (t, n, r) { if (null != r) return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); if (0 !== n.length) { var o = n.split("\n"), i = o.shift(); i.length > 0 && (t < this.length() - 1 || null == this.children.tail ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, Math.min(t, this.length() - 1), i) : this.children.tail.insertAt(this.children.tail.length(), i), this.cache = {}); var l = this; o.reduce(function (t, e) { return l = l.split(t, !0), l.insertAt(0, e), e.length }, t + i.length) } } }, { key: "insertBefore", value: function (t, n) { var r = this.children.head; u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n), r instanceof b.default && r.remove(), this.cache = {} } }, { key: "length", value: function () { return null == this.cache.length && (this.cache.length = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "length", this).call(this) + 1), this.cache.length } }, { key: "moveChildren", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "moveChildren", this).call(this, t, n), this.cache = {} } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.cache = {} } }, { key: "path", value: function (t) { return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t, !0) } }, { key: "removeChild", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "removeChild", this).call(this, t), this.cache = {} } }, { key: "split", value: function (t) { var n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; if (n && (0 === t || t >= this.length() - 1)) { var r = this.clone(); return 0 === t ? (this.parent.insertBefore(r, this), this) : (this.parent.insertBefore(r, this.next), r) } var o = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "split", this).call(this, t, n); return this.cache = {}, o } }]), e }(y.default.Block); x.blotName = "block", x.tagName = "P", x.defaultChild = "break", x.allowedChildren = [m.default, y.default.Embed, O.default], e.bubbleFormats = a, e.BlockEmbed = w, e.default = x }, function (t, e, n) { var r = n(54), o = n(12), i = n(2), l = n(20), a = String.fromCharCode(0), s = function (t) { Array.isArray(t) ? this.ops = t : null != t && Array.isArray(t.ops) ? this.ops = t.ops : this.ops = [] }; s.prototype.insert = function (t, e) { var n = {}; return 0 === t.length ? this : (n.insert = t, null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n)) }, s.prototype.delete = function (t) { return t <= 0 ? this : this.push({ delete: t }) }, s.prototype.retain = function (t, e) { if (t <= 0) return this; var n = { retain: t }; return null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n) }, s.prototype.push = function (t) { var e = this.ops.length, n = this.ops[e - 1]; if (t = i(!0, {}, t), "object" == typeof n) { if ("number" == typeof t.delete && "number" == typeof n.delete) return this.ops[e - 1] = { delete: n.delete + t.delete }, this; if ("number" == typeof n.delete && null != t.insert && (e -= 1, "object" != typeof (n = this.ops[e - 1]))) return this.ops.unshift(t), this; if (o(t.attributes, n.attributes)) { if ("string" == typeof t.insert && "string" == typeof n.insert) return this.ops[e - 1] = { insert: n.insert + t.insert }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this; if ("number" == typeof t.retain && "number" == typeof n.retain) return this.ops[e - 1] = { retain: n.retain + t.retain }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this } } return e === this.ops.length ? this.ops.push(t) : this.ops.splice(e, 0, t), this }, s.prototype.chop = function () { var t = this.ops[this.ops.length - 1]; return t && t.retain && !t.attributes && this.ops.pop(), this }, s.prototype.filter = function (t) { return this.ops.filter(t) }, s.prototype.forEach = function (t) { this.ops.forEach(t) }, s.prototype.map = function (t) { return this.ops.map(t) }, s.prototype.partition = function (t) { var e = [], n = []; return this.forEach(function (r) { (t(r) ? e : n).push(r) }), [e, n] }, s.prototype.reduce = function (t, e) { return this.ops.reduce(t, e) }, s.prototype.changeLength = function () { return this.reduce(function (t, e) { return e.insert ? t + l.length(e) : e.delete ? t - e.delete : t }, 0) }, s.prototype.length = function () { return this.reduce(function (t, e) { return t + l.length(e) }, 0) }, s.prototype.slice = function (t, e) { t = t || 0, "number" != typeof e && (e = 1 / 0); for (var n = [], r = l.iterator(this.ops), o = 0; o < e && r.hasNext();) { var i; o < t ? i = r.next(t - o) : (i = r.next(e - o), n.push(i)), o += l.length(i) } return new s(n) }, s.prototype.compose = function (t) { var e = l.iterator(this.ops), n = l.iterator(t.ops), r = [], i = n.peek(); if (null != i && "number" == typeof i.retain && null == i.attributes) { for (var a = i.retain; "insert" === e.peekType() && e.peekLength() <= a;)a -= e.peekLength(), r.push(e.next()); i.retain - a > 0 && n.next(i.retain - a) } for (var u = new s(r); e.hasNext() || n.hasNext();)if ("insert" === n.peekType()) u.push(n.next()); else if ("delete" === e.peekType()) u.push(e.next()); else { var c = Math.min(e.peekLength(), n.peekLength()), f = e.next(c), h = n.next(c); if ("number" == typeof h.retain) { var p = {}; "number" == typeof f.retain ? p.retain = c : p.insert = f.insert; var d = l.attributes.compose(f.attributes, h.attributes, "number" == typeof f.retain); if (d && (p.attributes = d), u.push(p), !n.hasNext() && o(u.ops[u.ops.length - 1], p)) { var y = new s(e.rest()); return u.concat(y).chop() } } else "number" == typeof h.delete && "number" == typeof f.retain && u.push(h) } return u.chop() }, s.prototype.concat = function (t) { var e = new s(this.ops.slice()); return t.ops.length > 0 && (e.push(t.ops[0]), e.ops = e.ops.concat(t.ops.slice(1))), e }, s.prototype.diff = function (t, e) { if (this.ops === t.ops) return new s; var n = [this, t].map(function (e) { return e.map(function (n) { if (null != n.insert) return "string" == typeof n.insert ? n.insert : a; var r = e === t ? "on" : "with"; throw new Error("diff() called " + r + " non-document") }).join("") }), i = new s, u = r(n[0], n[1], e), c = l.iterator(this.ops), f = l.iterator(t.ops); return u.forEach(function (t) { for (var e = t[1].length; e > 0;) { var n = 0; switch (t[0]) { case r.INSERT: n = Math.min(f.peekLength(), e), i.push(f.next(n)); break; case r.DELETE: n = Math.min(e, c.peekLength()), c.next(n), i.delete(n); break; case r.EQUAL: n = Math.min(c.peekLength(), f.peekLength(), e); var a = c.next(n), s = f.next(n); o(a.insert, s.insert) ? i.retain(n, l.attributes.diff(a.attributes, s.attributes)) : i.push(s).delete(n) }e -= n } }), i.chop() }, s.prototype.eachLine = function (t, e) { e = e || "\n"; for (var n = l.iterator(this.ops), r = new s, o = 0; n.hasNext();) { if ("insert" !== n.peekType()) return; var i = n.peek(), a = l.length(i) - n.peekLength(), u = "string" == typeof i.insert ? i.insert.indexOf(e, a) - a : -1; if (u < 0) r.push(n.next()); else if (u > 0) r.push(n.next(u)); else { if (!1 === t(r, n.next(1).attributes || {}, o)) return; o += 1, r = new s } } r.length() > 0 && t(r, {}, o) }, s.prototype.transform = function (t, e) { if (e = !!e, "number" == typeof t) return this.transformPosition(t, e); for (var n = l.iterator(this.ops), r = l.iterator(t.ops), o = new s; n.hasNext() || r.hasNext();)if ("insert" !== n.peekType() || !e && "insert" === r.peekType()) if ("insert" === r.peekType()) o.push(r.next()); else { var i = Math.min(n.peekLength(), r.peekLength()), a = n.next(i), u = r.next(i); if (a.delete) continue; u.delete ? o.push(u) : o.retain(i, l.attributes.transform(a.attributes, u.attributes, e)) } else o.retain(l.length(n.next())); return o.chop() }, s.prototype.transformPosition = function (t, e) { e = !!e; for (var n = l.iterator(this.ops), r = 0; n.hasNext() && r <= t;) { var o = n.peekLength(), i = n.peekType(); n.next(), "delete" !== i ? ("insert" === i && (r < t || !e) && (t += o), r += o) : t -= Math.min(o, t - r) } return t }, t.exports = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(8), c = r(u), f = n(0), h = r(f), p = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "formatAt", value: function (t, n, r, o) { if (e.compare(this.statics.blotName, r) < 0 && h.default.query(r, h.default.Scope.BLOT)) { var i = this.isolate(t, n); o && i.wrap(r, o) } else s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o) } }, { key: "optimize", value: function (t) { if (s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.parent instanceof e && e.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { var n = this.parent.isolate(this.offset(), this.length()); this.moveChildren(n), n.wrap(this) } } }], [{ key: "compare", value: function (t, n) { var r = e.order.indexOf(t), o = e.order.indexOf(n); return r >= 0 || o >= 0 ? r - o : t === n ? 0 : t < n ? -1 : 1 } }]), e }(h.default.Inline); p.allowedChildren = [p, h.default.Embed, c.default], p.order = ["cursor", "inline", "underline", "strike", "italic", "bold", "script", "link", "code"], e.default = p }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (e = (0, N.default)(!0, { container: t, modules: { clipboard: !0, keyboard: !0, history: !0 } }, e), e.theme && e.theme !== S.DEFAULTS.theme) { if (e.theme = S.import("themes/" + e.theme), null == e.theme) throw new Error("Invalid theme " + e.theme + ". Did you register it?") } else e.theme = T.default; var n = (0, N.default)(!0, {}, e.theme.DEFAULTS);[n, e].forEach(function (t) { t.modules = t.modules || {}, Object.keys(t.modules).forEach(function (e) { !0 === t.modules[e] && (t.modules[e] = {}) }) }); var r = Object.keys(n.modules).concat(Object.keys(e.modules)), o = r.reduce(function (t, e) { var n = S.import("modules/" + e); return null == n ? P.error("Cannot load " + e + " module. Are you sure you registered it?") : t[e] = n.DEFAULTS || {}, t }, {}); return null != e.modules && e.modules.toolbar && e.modules.toolbar.constructor !== Object && (e.modules.toolbar = { container: e.modules.toolbar }), e = (0, N.default)(!0, {}, S.DEFAULTS, { modules: o }, n, e), ["bounds", "container", "scrollingContainer"].forEach(function (t) { "string" == typeof e[t] && (e[t] = document.querySelector(e[t])) }), e.modules = Object.keys(e.modules).reduce(function (t, n) { return e.modules[n] && (t[n] = e.modules[n]), t }, {}), e } function a(t, e, n, r) { if (this.options.strict && !this.isEnabled() && e === g.default.sources.USER) return new d.default; var o = null == n ? null : this.getSelection(), i = this.editor.delta, l = t(); if (null != o && (!0 === n && (n = o.index), null == r ? o = u(o, l, e) : 0 !== r && (o = u(o, n, r, e)), this.setSelection(o, g.default.sources.SILENT)), l.length() > 0) { var a, s = [g.default.events.TEXT_CHANGE, l, i, e]; if ((a = this.emitter).emit.apply(a, [g.default.events.EDITOR_CHANGE].concat(s)), e !== g.default.sources.SILENT) { var c; (c = this.emitter).emit.apply(c, s) } } return l } function s(t, e, n, r, o) { var i = {}; return "number" == typeof t.index && "number" == typeof t.length ? "number" != typeof e ? (o = r, r = n, n = e, e = t.length, t = t.index) : (e = t.length, t = t.index) : "number" != typeof e && (o = r, r = n, n = e, e = 0), "object" === (void 0 === n ? "undefined" : c(n)) ? (i = n, o = r) : "string" == typeof n && (null != r ? i[n] = r : o = n), o = o || g.default.sources.API, [t, e, i, o] } function u(t, e, n, r) { if (null == t) return null; var o = void 0, i = void 0; if (e instanceof d.default) { var l = [t.index, t.index + t.length].map(function (t) { return e.transformPosition(t, r !== g.default.sources.USER) }), a = f(l, 2); o = a[0], i = a[1] } else { var s = [t.index, t.index + t.length].map(function (t) { return t < e || t === e && r === g.default.sources.USER ? t : n >= 0 ? t + n : Math.max(e, t + n) }), u = f(s, 2); o = u[0], i = u[1] } return new x.Range(o, i - o) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.overload = e.expandConfig = void 0; var c = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(); n(53); var p = n(4), d = r(p), y = n(57), v = r(y), b = n(9), g = r(b), m = n(7), _ = r(m), O = n(0), w = r(O), x = n(22), k = r(x), E = n(2), N = r(E), j = n(10), A = r(j), q = n(32), T = r(q), P = (0, A.default)("quill"), S = function () { function t(e) { var n = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (i(this, t), this.options = l(e, r), this.container = this.options.container, null == this.container) return P.error("Invalid Quill container", e); this.options.debug && t.debug(this.options.debug); var o = this.container.innerHTML.trim(); this.container.classList.add("ql-container"), this.container.innerHTML = "", this.container.__quill = this, this.root = this.addContainer("ql-editor"), this.root.classList.add("ql-blank"), this.root.setAttribute("data-gramm", !1), this.scrollingContainer = this.options.scrollingContainer || this.root, this.emitter = new g.default, this.scroll = w.default.create(this.root, { emitter: this.emitter, whitelist: this.options.formats }), this.editor = new v.default(this.scroll), this.selection = new k.default(this.scroll, this.emitter), this.theme = new this.options.theme(this, this.options), this.keyboard = this.theme.addModule("keyboard"), this.clipboard = this.theme.addModule("clipboard"), this.history = this.theme.addModule("history"), this.theme.init(), this.emitter.on(g.default.events.EDITOR_CHANGE, function (t) { t === g.default.events.TEXT_CHANGE && n.root.classList.toggle("ql-blank", n.editor.isBlank()) }), this.emitter.on(g.default.events.SCROLL_UPDATE, function (t, e) { var r = n.selection.lastRange, o = r && 0 === r.length ? r.index : void 0; a.call(n, function () { return n.editor.update(null, e, o) }, t) }); var s = this.clipboard.convert("
" + o + "


"); this.setContents(s), this.history.clear(), this.options.placeholder && this.root.setAttribute("data-placeholder", this.options.placeholder), this.options.readOnly && this.disable() } return h(t, null, [{ key: "debug", value: function (t) { !0 === t && (t = "log"), A.default.level(t) } }, { key: "find", value: function (t) { return t.__quill || w.default.find(t) } }, { key: "import", value: function (t) { return null == this.imports[t] && P.error("Cannot import " + t + ". Are you sure it was registered?"), this.imports[t] } }, { key: "register", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; if ("string" != typeof t) { var o = t.attrName || t.blotName; "string" == typeof o ? this.register("formats/" + o, t, e) : Object.keys(t).forEach(function (r) { n.register(r, t[r], e) }) } else null == this.imports[t] || r || P.warn("Overwriting " + t + " with", e), this.imports[t] = e, (t.startsWith("blots/") || t.startsWith("formats/")) && "abstract" !== e.blotName ? w.default.register(e) : t.startsWith("modules") && "function" == typeof e.register && e.register() } }]), h(t, [{ key: "addContainer", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; if ("string" == typeof t) { var n = t; t = document.createElement("div"), t.classList.add(n) } return this.container.insertBefore(t, e), t } }, { key: "blur", value: function () { this.selection.setRange(null) } }, { key: "deleteText", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.deleteText(t, e) }, n, t, -1 * e) } }, { key: "disable", value: function () { this.enable(!1) } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.scroll.enable(t), this.container.classList.toggle("ql-disabled", !t) } }, { key: "focus", value: function () { var t = this.scrollingContainer.scrollTop; this.selection.focus(), this.scrollingContainer.scrollTop = t, this.scrollIntoView() } }, { key: "format", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : g.default.sources.API; return a.call(this, function () { var r = n.getSelection(!0), i = new d.default; if (null == r) return i; if (w.default.query(t, w.default.Scope.BLOCK)) i = n.editor.formatLine(r.index, r.length, o({}, t, e)); else { if (0 === r.length) return n.selection.format(t, e), i; i = n.editor.formatText(r.index, r.length, o({}, t, e)) } return n.setSelection(r, g.default.sources.SILENT), i }, r) } }, { key: "formatLine", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatLine(t, e, l) }, o, t, 0) } }, { key: "formatText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatText(t, e, l) }, o, t, 0) } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = void 0; n = "number" == typeof t ? this.selection.getBounds(t, e) : this.selection.getBounds(t.index, t.length); var r = this.container.getBoundingClientRect(); return { bottom: n.bottom - r.top, height: n.height, left: n.left - r.left, right: n.right - r.left, top: n.top - r.top, width: n.width } } }, { key: "getContents", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getContents(t, e) } }, { key: "getFormat", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.getSelection(!0), e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; return "number" == typeof t ? this.editor.getFormat(t, e) : this.editor.getFormat(t.index, t.length) } }, { key: "getIndex", value: function (t) { return t.offset(this.scroll) } }, { key: "getLength", value: function () { return this.scroll.length() } }, { key: "getLeaf", value: function (t) { return this.scroll.leaf(t) } }, { key: "getLine", value: function (t) { return this.scroll.line(t) } }, { key: "getLines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return "number" != typeof t ? this.scroll.lines(t.index, t.length) : this.scroll.lines(t, e) } }, { key: "getModule", value: function (t) { return this.theme.modules[t] } }, { key: "getSelection", value: function () { return arguments.length > 0 && void 0 !== arguments[0] && arguments[0] && this.focus(), this.update(), this.selection.getRange()[0] } }, { key: "getText", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getText(t, e) } }, { key: "hasFocus", value: function () { return this.selection.hasFocus() } }, { key: "insertEmbed", value: function (e, n, r) { var o = this, i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : t.sources.API; return a.call(this, function () { return o.editor.insertEmbed(e, n, r) }, i, e) } }, { key: "insertText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, 0, n, r, o), c = f(u, 4); return t = c[0], l = c[2], o = c[3], a.call(this, function () { return i.editor.insertText(t, e, l) }, o, t, e.length) } }, { key: "isEnabled", value: function () { return !this.container.classList.contains("ql-disabled") } }, { key: "off", value: function () { return this.emitter.off.apply(this.emitter, arguments) } }, { key: "on", value: function () { return this.emitter.on.apply(this.emitter, arguments) } }, { key: "once", value: function () { return this.emitter.once.apply(this.emitter, arguments) } }, { key: "pasteHTML", value: function (t, e, n) { this.clipboard.dangerouslyPasteHTML(t, e, n) } }, { key: "removeFormat", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.removeFormat(t, e) }, n, t) } }, { key: "scrollIntoView", value: function () { this.selection.scrollIntoView(this.scrollingContainer) } }, { key: "setContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { t = new d.default(t); var n = e.getLength(), r = e.editor.deleteText(0, n), o = e.editor.applyDelta(t), i = o.ops[o.ops.length - 1]; return null != i && "string" == typeof i.insert && "\n" === i.insert[i.insert.length - 1] && (e.editor.deleteText(e.getLength() - 1, 1), o.delete(1)), r.compose(o) }, n) } }, { key: "setSelection", value: function (e, n, r) { if (null == e) this.selection.setRange(null, n || t.sources.API); else { var o = s(e, n, r), i = f(o, 4); e = i[0], n = i[1], r = i[3], this.selection.setRange(new x.Range(e, n), r), r !== g.default.sources.SILENT && this.selection.scrollIntoView(this.scrollingContainer) } } }, { key: "setText", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API, n = (new d.default).insert(t); return this.setContents(n, e) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : g.default.sources.USER, e = this.scroll.update(t); return this.selection.update(t), e } }, { key: "updateContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { return t = new d.default(t), e.editor.applyDelta(t, n) }, n, !0) } }]), t }(); S.DEFAULTS = { bounds: null, formats: null, modules: {}, placeholder: "", readOnly: !1, scrollingContainer: null, strict: !0, theme: "default" }, S.events = g.default.events, S.sources = g.default.sources, S.version = "1.3.7", S.imports = { delta: d.default, parchment: w.default, "core/module": _.default, "core/theme": T.default }, e.expandConfig = l, e.overload = s, e.default = S }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; r(this, t), this.quill = e, this.options = n }; o.DEFAULTS = {}, e.default = o }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(0), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default.Text); e.default = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(58), c = r(u), f = n(10), h = r(f), p = (0, h.default)("quill:events");["selectionchange", "mousedown", "mouseup", "click"].forEach(function (t) { document.addEventListener(t, function () { for (var t = arguments.length, e = Array(t), n = 0; n < t; n++)e[n] = arguments[n];[].slice.call(document.querySelectorAll(".ql-container")).forEach(function (t) { if (t.__quill && t.__quill.emitter) { var n; (n = t.__quill.emitter).handleDOM.apply(n, e) } }) }) }); var d = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); return t.listeners = {}, t.on("error", p.error), t } return l(e, t), a(e, [{ key: "emit", value: function () { p.log.apply(p, arguments), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "emit", this).apply(this, arguments) } }, { key: "handleDOM", value: function (t) { for (var e = arguments.length, n = Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)n[r - 1] = arguments[r]; (this.listeners[t.type] || []).forEach(function (e) { var r = e.node, o = e.handler; (t.target === r || r.contains(t.target)) && o.apply(void 0, [t].concat(n)) }) } }, { key: "listenDOM", value: function (t, e, n) { this.listeners[t] || (this.listeners[t] = []), this.listeners[t].push({ node: e, handler: n }) } }]), e }(c.default); d.events = { EDITOR_CHANGE: "editor-change", SCROLL_BEFORE_UPDATE: "scroll-before-update", SCROLL_OPTIMIZE: "scroll-optimize", SCROLL_UPDATE: "scroll-update", SELECTION_CHANGE: "selection-change", TEXT_CHANGE: "text-change" }, d.sources = { API: "api", SILENT: "silent", USER: "user" }, e.default = d }, function (t, e, n) { "use strict"; function r(t) { if (i.indexOf(t) <= i.indexOf(l)) { for (var e, n = arguments.length, r = Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++)r[o - 1] = arguments[o]; (e = console)[t].apply(e, r) } } function o(t) { return i.reduce(function (e, n) { return e[n] = r.bind(console, n, t), e }, {}) } Object.defineProperty(e, "__esModule", { value: !0 }); var i = ["error", "warn", "log", "info"], l = "warn"; r.level = o.level = function (t) { l = t }, e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t, e, n) { void 0 === n && (n = {}), this.attrName = t, this.keyName = e; var o = r.Scope.TYPE & r.Scope.ATTRIBUTE; null != n.scope ? this.scope = n.scope & r.Scope.LEVEL | o : this.scope = r.Scope.ATTRIBUTE, null != n.whitelist && (this.whitelist = n.whitelist) } return t.keys = function (t) { return [].map.call(t.attributes, function (t) { return t.name }) }, t.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.setAttribute(this.keyName, e), !0) }, t.prototype.canAdd = function (t, e) { return null != r.query(t, r.Scope.BLOT & (this.scope | r.Scope.TYPE)) && (null == this.whitelist || ("string" == typeof e ? this.whitelist.indexOf(e.replace(/["']/g, "")) > -1 : this.whitelist.indexOf(e) > -1)) }, t.prototype.remove = function (t) { t.removeAttribute(this.keyName) }, t.prototype.value = function (t) { var e = t.getAttribute(this.keyName); return this.canAdd(t, e) && e ? e : "" }, t }(); e.default = o }, function (t, e, n) { function r(t) { return null === t || void 0 === t } function o(t) { return !(!t || "object" != typeof t || "number" != typeof t.length) && ("function" == typeof t.copy && "function" == typeof t.slice && !(t.length > 0 && "number" != typeof t[0])) } function i(t, e, n) { var i, c; if (r(t) || r(e)) return !1; if (t.prototype !== e.prototype) return !1; if (s(t)) return !!s(e) && (t = l.call(t), e = l.call(e), u(t, e, n)); if (o(t)) { if (!o(e)) return !1; if (t.length !== e.length) return !1; for (i = 0; i < t.length; i++)if (t[i] !== e[i]) return !1; return !0 } try { var f = a(t), h = a(e) } catch (t) { return !1 } if (f.length != h.length) return !1; for (f.sort(), h.sort(), i = f.length - 1; i >= 0; i--)if (f[i] != h[i]) return !1; for (i = f.length - 1; i >= 0; i--)if (c = f[i], !u(t[c], e[c], n)) return !1; return typeof t == typeof e } var l = Array.prototype.slice, a = n(55), s = n(56), u = t.exports = function (t, e, n) { return n || (n = {}), t === e || (t instanceof Date && e instanceof Date ? t.getTime() === e.getTime() : !t || !e || "object" != typeof t && "object" != typeof e ? n.strict ? t === e : t == e : i(t, e, n)) } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Code = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(4), f = r(c), h = n(0), p = r(h), d = n(3), y = r(d), v = n(5), b = r(v), g = n(8), m = r(g), _ = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(b.default); _.blotName = "code", _.tagName = "CODE"; var O = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "delta", value: function () { var t = this, e = this.domNode.textContent; return e.endsWith("\n") && (e = e.slice(0, -1)), e.split("\n").reduce(function (e, n) { return e.insert(n).insert("\n", t.formats()) }, new f.default) } }, { key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) { var r = this.descendant(m.default, this.length() - 1), o = a(r, 1), i = o[0]; null != i && i.deleteAt(i.length() - 1, 1), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } } }, { key: "formatAt", value: function (t, n, r, o) { if (0 !== n && null != p.default.query(r, p.default.Scope.BLOCK) && (r !== this.statics.blotName || o !== this.statics.formats(this.domNode))) { var i = this.newlineIndex(t); if (!(i < 0 || i >= t + n)) { var l = this.newlineIndex(t, !0) + 1, a = i - l + 1, s = this.isolate(l, a), u = s.next; s.format(r, o), u instanceof e && u.formatAt(0, t - l + n - a, r, o) } } } }, { key: "insertAt", value: function (t, e, n) { if (null == n) { var r = this.descendant(m.default, t), o = a(r, 2), i = o[0], l = o[1]; i.insertAt(l, e) } } }, { key: "length", value: function () { var t = this.domNode.textContent.length; return this.domNode.textContent.endsWith("\n") ? t : t + 1 } }, { key: "newlineIndex", value: function (t) { if (arguments.length > 1 && void 0 !== arguments[1] && arguments[1]) return this.domNode.textContent.slice(0, t).lastIndexOf("\n"); var e = this.domNode.textContent.slice(t).indexOf("\n"); return e > -1 ? t + e : -1 } }, { key: "optimize", value: function (t) { this.domNode.textContent.endsWith("\n") || this.appendChild(p.default.create("text", "\n")), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === n.statics.formats(n.domNode) && (n.optimize(t), n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t), [].slice.call(this.domNode.querySelectorAll("*")).forEach(function (t) { var e = p.default.find(t); null == e ? t.parentNode.removeChild(t) : e instanceof p.default.Embed ? e.remove() : e.unwrap() }) } }], [{ key: "create", value: function (t) { var n = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("spellcheck", !1), n } }, { key: "formats", value: function () { return !0 } }]), e }(y.default); O.blotName = "code-block", O.tagName = "PRE", O.TAB = " ", e.Code = _, e.default = O }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "insertInto", value: function (t, n) { 0 === t.children.length ? a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertInto", this).call(this, t, n) : this.remove() } }, { key: "length", value: function () { return 0 } }, { key: "value", value: function () { return "" } }], [{ key: "value", value: function () { } }]), e }(u.default.Embed); c.blotName = "break", c.tagName = "BR", e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function l(t, e) { var n = document.createElement("a"); n.href = t; var r = n.href.slice(0, n.href.indexOf(":")); return e.indexOf(r) > -1 } Object.defineProperty(e, "__esModule", { value: !0 }), e.sanitize = e.default = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(5), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), a(e, [{ key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); n = this.constructor.sanitize(n), this.domNode.setAttribute("href", n) } }], [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return t = this.sanitize(t), n.setAttribute("href", t), n.setAttribute("rel", "noopener noreferrer"), n.setAttribute("target", "_blank"), n } }, { key: "formats", value: function (t) { return t.getAttribute("href") } }, { key: "sanitize", value: function (t) { return l(t, this.PROTOCOL_WHITELIST) ? t : this.SANITIZED_URL } }]), e }(c.default); f.blotName = "link", f.tagName = "A", f.SANITIZED_URL = "about:blank", f.PROTOCOL_WHITELIST = ["http", "https", "mailto", "tel"], e.default = f, e.sanitize = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { t.setAttribute(e, !("true" === t.getAttribute(e))) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = n(25), u = r(s), c = n(106), f = r(c), h = 0, p = function () { function t(e) { var n = this; o(this, t), this.select = e, this.container = document.createElement("span"), this.buildPicker(), this.select.style.display = "none", this.select.parentNode.insertBefore(this.container, this.select), this.label.addEventListener("mousedown", function () { n.togglePicker() }), this.label.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: n.togglePicker(); break; case u.default.keys.ESCAPE: n.escape(), t.preventDefault() } }), this.select.addEventListener("change", this.update.bind(this)) } return a(t, [{ key: "togglePicker", value: function () { this.container.classList.toggle("ql-expanded"), i(this.label, "aria-expanded"), i(this.options, "aria-hidden") } }, { key: "buildItem", value: function (t) { var e = this, n = document.createElement("span"); return n.tabIndex = "0", n.setAttribute("role", "button"), n.classList.add("ql-picker-item"), t.hasAttribute("value") && n.setAttribute("data-value", t.getAttribute("value")), t.textContent && n.setAttribute("data-label", t.textContent), n.addEventListener("click", function () { e.selectItem(n, !0) }), n.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: e.selectItem(n, !0), t.preventDefault(); break; case u.default.keys.ESCAPE: e.escape(), t.preventDefault() } }), n } }, { key: "buildLabel", value: function () { var t = document.createElement("span"); return t.classList.add("ql-picker-label"), t.innerHTML = f.default, t.tabIndex = "0", t.setAttribute("role", "button"), t.setAttribute("aria-expanded", "false"), this.container.appendChild(t), t } }, { key: "buildOptions", value: function () { var t = this, e = document.createElement("span"); e.classList.add("ql-picker-options"), e.setAttribute("aria-hidden", "true"), e.tabIndex = "-1", e.id = "ql-picker-options-" + h, h += 1, this.label.setAttribute("aria-controls", e.id), this.options = e, [].slice.call(this.select.options).forEach(function (n) { var r = t.buildItem(n); e.appendChild(r), !0 === n.selected && t.selectItem(r) }), this.container.appendChild(e) } }, { key: "buildPicker", value: function () { var t = this;[].slice.call(this.select.attributes).forEach(function (e) { t.container.setAttribute(e.name, e.value) }), this.container.classList.add("ql-picker"), this.label = this.buildLabel(), this.buildOptions() } }, { key: "escape", value: function () { var t = this; this.close(), setTimeout(function () { return t.label.focus() }, 1) } }, { key: "close", value: function () { this.container.classList.remove("ql-expanded"), this.label.setAttribute("aria-expanded", "false"), this.options.setAttribute("aria-hidden", "true") } }, { key: "selectItem", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = this.container.querySelector(".ql-selected"); if (t !== n && (null != n && n.classList.remove("ql-selected"), null != t && (t.classList.add("ql-selected"), this.select.selectedIndex = [].indexOf.call(t.parentNode.children, t), t.hasAttribute("data-value") ? this.label.setAttribute("data-value", t.getAttribute("data-value")) : this.label.removeAttribute("data-value"), t.hasAttribute("data-label") ? this.label.setAttribute("data-label", t.getAttribute("data-label")) : this.label.removeAttribute("data-label"), e))) { if ("function" == typeof Event) this.select.dispatchEvent(new Event("change")); else if ("object" === ("undefined" == typeof Event ? "undefined" : l(Event))) { var r = document.createEvent("Event"); r.initEvent("change", !0, !0), this.select.dispatchEvent(r) } this.close() } } }, { key: "update", value: function () { var t = void 0; if (this.select.selectedIndex > -1) { var e = this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex]; t = this.select.options[this.select.selectedIndex], this.selectItem(e) } else this.selectItem(null); var n = null != t && t !== this.select.querySelector("option[selected]"); this.label.classList.toggle("ql-active", n) } }]), t }(); e.default = p }, function (t, e, n) { "use strict"; function r(t) { var e = a.find(t); if (null == e) try { e = a.create(t) } catch (n) { e = a.create(a.Scope.INLINE), [].slice.call(t.childNodes).forEach(function (t) { e.domNode.appendChild(t) }), t.parentNode && t.parentNode.replaceChild(e.domNode, t), e.attach() } return e } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(47), l = n(27), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.build(), n } return o(e, t), e.prototype.appendChild = function (t) { this.insertBefore(t) }, e.prototype.attach = function () { t.prototype.attach.call(this), this.children.forEach(function (t) { t.attach() }) }, e.prototype.build = function () { var t = this; this.children = new i.default, [].slice.call(this.domNode.childNodes).reverse().forEach(function (e) { try { var n = r(e); t.insertBefore(n, t.children.head || void 0) } catch (t) { if (t instanceof a.ParchmentError) return; throw t } }) }, e.prototype.deleteAt = function (t, e) { if (0 === t && e === this.length()) return this.remove(); this.children.forEachAt(t, e, function (t, e, n) { t.deleteAt(e, n) }) }, e.prototype.descendant = function (t, n) { var r = this.children.find(n), o = r[0], i = r[1]; return null == t.blotName && t(o) || null != t.blotName && o instanceof t ? [o, i] : o instanceof e ? o.descendant(t, i) : [null, -1] }, e.prototype.descendants = function (t, n, r) { void 0 === n && (n = 0), void 0 === r && (r = Number.MAX_VALUE); var o = [], i = r; return this.children.forEachAt(n, r, function (n, r, l) { (null == t.blotName && t(n) || null != t.blotName && n instanceof t) && o.push(n), n instanceof e && (o = o.concat(n.descendants(t, r, i))), i -= l }), o }, e.prototype.detach = function () { this.children.forEach(function (t) { t.detach() }), t.prototype.detach.call(this) }, e.prototype.formatAt = function (t, e, n, r) { this.children.forEachAt(t, e, function (t, e, o) { t.formatAt(e, o, n, r) }) }, e.prototype.insertAt = function (t, e, n) { var r = this.children.find(t), o = r[0], i = r[1]; if (o) o.insertAt(i, e, n); else { var l = null == n ? a.create("text", e) : a.create(e, n); this.appendChild(l) } }, e.prototype.insertBefore = function (t, e) { if (null != this.statics.allowedChildren && !this.statics.allowedChildren.some(function (e) { return t instanceof e })) throw new a.ParchmentError("Cannot insert " + t.statics.blotName + " into " + this.statics.blotName); t.insertInto(this, e) }, e.prototype.length = function () { return this.children.reduce(function (t, e) { return t + e.length() }, 0) }, e.prototype.moveChildren = function (t, e) { this.children.forEach(function (n) { t.insertBefore(n, e) }) }, e.prototype.optimize = function (e) { if (t.prototype.optimize.call(this, e), 0 === this.children.length) if (null != this.statics.defaultChild) { var n = a.create(this.statics.defaultChild); this.appendChild(n), n.optimize(e) } else this.remove() }, e.prototype.path = function (t, n) { void 0 === n && (n = !1); var r = this.children.find(t, n), o = r[0], i = r[1], l = [[this, t]]; return o instanceof e ? l.concat(o.path(i, n)) : (null != o && l.push([o, i]), l) }, e.prototype.removeChild = function (t) { this.children.remove(t) }, e.prototype.replace = function (n) { n instanceof e && n.moveChildren(this), t.prototype.replace.call(this, n) }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = this.clone(); return this.parent.insertBefore(n, this.next), this.children.forEachAt(t, this.length(), function (t, r, o) { t = t.split(r, e), n.appendChild(t) }), n }, e.prototype.unwrap = function () { this.moveChildren(this.parent, this.next), this.remove() }, e.prototype.update = function (t, e) { var n = this, o = [], i = []; t.forEach(function (t) { t.target === n.domNode && "childList" === t.type && (o.push.apply(o, t.addedNodes), i.push.apply(i, t.removedNodes)) }), i.forEach(function (t) { if (!(null != t.parentNode && "IFRAME" !== t.tagName && document.body.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY)) { var e = a.find(t); null != e && (null != e.domNode.parentNode && e.domNode.parentNode !== n.domNode || e.detach()) } }), o.filter(function (t) { return t.parentNode == n.domNode }).sort(function (t, e) { return t === e ? 0 : t.compareDocumentPosition(e) & Node.DOCUMENT_POSITION_FOLLOWING ? 1 : -1 }).forEach(function (t) { var e = null; null != t.nextSibling && (e = a.find(t.nextSibling)); var o = r(t); o.next == e && null != o.next || (null != o.parent && o.parent.removeChild(n), n.insertBefore(o, e || void 0)) }) }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(11), i = n(28), l = n(17), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.attributes = new i.default(n.domNode), n } return r(e, t), e.formats = function (t) { return "string" == typeof this.tagName || (Array.isArray(this.tagName) ? t.tagName.toLowerCase() : void 0) }, e.prototype.format = function (t, e) { var n = a.query(t); n instanceof o.default ? this.attributes.attribute(n, e) : e && (null == n || t === this.statics.blotName && this.formats()[t] === e || this.replaceWith(t, e)) }, e.prototype.formats = function () { var t = this.attributes.values(), e = this.statics.formats(this.domNode); return null != e && (t[this.statics.blotName] = e), t }, e.prototype.replaceWith = function (e, n) { var r = t.prototype.replaceWith.call(this, e, n); return this.attributes.copy(r), r }, e.prototype.update = function (e, n) { var r = this; t.prototype.update.call(this, e, n), e.some(function (t) { return t.target === r.domNode && "attributes" === t.type }) && this.attributes.build() }, e.prototype.wrap = function (n, r) { var o = t.prototype.wrap.call(this, n, r); return o instanceof e && o.statics.scope === this.statics.scope && this.attributes.move(o), o }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(27), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.value = function (t) { return !0 }, e.prototype.index = function (t, e) { return this.domNode === t || this.domNode.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY ? Math.min(e, 1) : -1 }, e.prototype.position = function (t, e) { var n = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); return t > 0 && (n += 1), [this.parent.domNode, n] }, e.prototype.value = function () { var t; return t = {}, t[this.statics.blotName] = this.statics.value(this.domNode) || !0, t }, e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { function r(t) { this.ops = t, this.index = 0, this.offset = 0 } var o = n(12), i = n(2), l = { attributes: { compose: function (t, e, n) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var r = i(!0, {}, e); n || (r = Object.keys(r).reduce(function (t, e) { return null != r[e] && (t[e] = r[e]), t }, {})); for (var o in t) void 0 !== t[o] && void 0 === e[o] && (r[o] = t[o]); return Object.keys(r).length > 0 ? r : void 0 }, diff: function (t, e) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var n = Object.keys(t).concat(Object.keys(e)).reduce(function (n, r) { return o(t[r], e[r]) || (n[r] = void 0 === e[r] ? null : e[r]), n }, {}); return Object.keys(n).length > 0 ? n : void 0 }, transform: function (t, e, n) { if ("object" != typeof t) return e; if ("object" == typeof e) { if (!n) return e; var r = Object.keys(e).reduce(function (n, r) { return void 0 === t[r] && (n[r] = e[r]), n }, {}); return Object.keys(r).length > 0 ? r : void 0 } } }, iterator: function (t) { return new r(t) }, length: function (t) { return "number" == typeof t.delete ? t.delete : "number" == typeof t.retain ? t.retain : "string" == typeof t.insert ? t.insert.length : 1 } }; r.prototype.hasNext = function () { return this.peekLength() < 1 / 0 }, r.prototype.next = function (t) { t || (t = 1 / 0); var e = this.ops[this.index]; if (e) { var n = this.offset, r = l.length(e); if (t >= r - n ? (t = r - n, this.index += 1, this.offset = 0) : this.offset += t, "number" == typeof e.delete) return { delete: t }; var o = {}; return e.attributes && (o.attributes = e.attributes), "number" == typeof e.retain ? o.retain = t : "string" == typeof e.insert ? o.insert = e.insert.substr(n, t) : o.insert = e.insert, o } return { retain: 1 / 0 } }, r.prototype.peek = function () { return this.ops[this.index] }, r.prototype.peekLength = function () { return this.ops[this.index] ? l.length(this.ops[this.index]) - this.offset : 1 / 0 }, r.prototype.peekType = function () { return this.ops[this.index] ? "number" == typeof this.ops[this.index].delete ? "delete" : "number" == typeof this.ops[this.index].retain ? "retain" : "insert" : "retain" }, r.prototype.rest = function () { if (this.hasNext()) { if (0 === this.offset) return this.ops.slice(this.index); var t = this.offset, e = this.index, n = this.next(), r = this.ops.slice(this.index); return this.offset = t, this.index = e, [n].concat(r) } return [] }, t.exports = l }, function (t, e) { var n = function () { "use strict"; function t(t, e) { return null != e && t instanceof e } function e(n, r, o, i, c) { function f(n, o) { if (null === n) return null; if (0 === o) return n; var y, v; if ("object" != typeof n) return n; if (t(n, a)) y = new a; else if (t(n, s)) y = new s; else if (t(n, u)) y = new u(function (t, e) { n.then(function (e) { t(f(e, o - 1)) }, function (t) { e(f(t, o - 1)) }) }); else if (e.__isArray(n)) y = []; else if (e.__isRegExp(n)) y = new RegExp(n.source, l(n)), n.lastIndex && (y.lastIndex = n.lastIndex); else if (e.__isDate(n)) y = new Date(n.getTime()); else { if (d && Buffer.isBuffer(n)) return y = Buffer.allocUnsafe ? Buffer.allocUnsafe(n.length) : new Buffer(n.length), n.copy(y), y; t(n, Error) ? y = Object.create(n) : void 0 === i ? (v = Object.getPrototypeOf(n), y = Object.create(v)) : (y = Object.create(i), v = i) } if (r) { var b = h.indexOf(n); if (-1 != b) return p[b]; h.push(n), p.push(y) } t(n, a) && n.forEach(function (t, e) { var n = f(e, o - 1), r = f(t, o - 1); y.set(n, r) }), t(n, s) && n.forEach(function (t) { var e = f(t, o - 1); y.add(e) }); for (var g in n) { var m; v && (m = Object.getOwnPropertyDescriptor(v, g)), m && null == m.set || (y[g] = f(n[g], o - 1)) } if (Object.getOwnPropertySymbols) for (var _ = Object.getOwnPropertySymbols(n), g = 0; g < _.length; g++) { var O = _[g], w = Object.getOwnPropertyDescriptor(n, O); (!w || w.enumerable || c) && (y[O] = f(n[O], o - 1), w.enumerable || Object.defineProperty(y, O, { enumerable: !1 })) } if (c) for (var x = Object.getOwnPropertyNames(n), g = 0; g < x.length; g++) { var k = x[g], w = Object.getOwnPropertyDescriptor(n, k); w && w.enumerable || (y[k] = f(n[k], o - 1), Object.defineProperty(y, k, { enumerable: !1 })) } return y } "object" == typeof r && (o = r.depth, i = r.prototype, c = r.includeNonEnumerable, r = r.circular); var h = [], p = [], d = "undefined" != typeof Buffer; return void 0 === r && (r = !0), void 0 === o && (o = 1 / 0), f(n, o) } function n(t) { return Object.prototype.toString.call(t) } function r(t) { return "object" == typeof t && "[object Date]" === n(t) } function o(t) { return "object" == typeof t && "[object Array]" === n(t) } function i(t) { return "object" == typeof t && "[object RegExp]" === n(t) } function l(t) { var e = ""; return t.global && (e += "g"), t.ignoreCase && (e += "i"), t.multiline && (e += "m"), e } var a; try { a = Map } catch (t) { a = function () { } } var s; try { s = Set } catch (t) { s = function () { } } var u; try { u = Promise } catch (t) { u = function () { } } return e.clonePrototype = function (t) { if (null === t) return null; var e = function () { }; return e.prototype = t, new e }, e.__objToStr = n, e.__isDate = r, e.__isArray = o, e.__isRegExp = i, e.__getRegExpFlags = l, e }(); "object" == typeof t && t.exports && (t.exports = n) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t) { if (Array.isArray(t)) { for (var e = 0, n = Array(t.length); e < t.length; e++)n[e] = t[e]; return n } return Array.from(t) } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { try { e.parentNode } catch (t) { return !1 } return e instanceof Text && (e = e.parentNode), t.contains(e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Range = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(0), c = r(u), f = n(21), h = r(f), p = n(12), d = r(p), y = n(9), v = r(y), b = n(10), g = r(b), m = (0, g.default)("quill:selection"), _ = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; i(this, t), this.index = e, this.length = n }, O = function () { function t(e, n) { var r = this; i(this, t), this.emitter = n, this.scroll = e, this.composing = !1, this.mouseDown = !1, this.root = this.scroll.domNode, this.cursor = c.default.create("cursor", this), this.lastRange = this.savedRange = new _(0, 0), this.handleComposition(), this.handleDragging(), this.emitter.listenDOM("selectionchange", document, function () { r.mouseDown || setTimeout(r.update.bind(r, v.default.sources.USER), 1) }), this.emitter.on(v.default.events.EDITOR_CHANGE, function (t, e) { t === v.default.events.TEXT_CHANGE && e.length() > 0 && r.update(v.default.sources.SILENT) }), this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE, function () { if (r.hasFocus()) { var t = r.getNativeRange(); null != t && t.start.node !== r.cursor.textNode && r.emitter.once(v.default.events.SCROLL_UPDATE, function () { try { r.setNativeRange(t.start.node, t.start.offset, t.end.node, t.end.offset) } catch (t) { } }) } }), this.emitter.on(v.default.events.SCROLL_OPTIMIZE, function (t, e) { if (e.range) { var n = e.range, o = n.startNode, i = n.startOffset, l = n.endNode, a = n.endOffset; r.setNativeRange(o, i, l, a) } }), this.update(v.default.sources.SILENT) } return s(t, [{ key: "handleComposition", value: function () { var t = this; this.root.addEventListener("compositionstart", function () { t.composing = !0 }), this.root.addEventListener("compositionend", function () { if (t.composing = !1, t.cursor.parent) { var e = t.cursor.restore(); if (!e) return; setTimeout(function () { t.setNativeRange(e.startNode, e.startOffset, e.endNode, e.endOffset) }, 1) } }) } }, { key: "handleDragging", value: function () { var t = this; this.emitter.listenDOM("mousedown", document.body, function () { t.mouseDown = !0 }), this.emitter.listenDOM("mouseup", document.body, function () { t.mouseDown = !1, t.update(v.default.sources.USER) }) } }, { key: "focus", value: function () { this.hasFocus() || (this.root.focus(), this.setRange(this.savedRange)) } }, { key: "format", value: function (t, e) { if (null == this.scroll.whitelist || this.scroll.whitelist[t]) { this.scroll.update(); var n = this.getNativeRange(); if (null != n && n.native.collapsed && !c.default.query(t, c.default.Scope.BLOCK)) { if (n.start.node !== this.cursor.textNode) { var r = c.default.find(n.start.node, !1); if (null == r) return; if (r instanceof c.default.Leaf) { var o = r.split(n.start.offset); r.parent.insertBefore(this.cursor, o) } else r.insertBefore(this.cursor, n.start.node); this.cursor.attach() } this.cursor.format(t, e), this.scroll.optimize(), this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length), this.update() } } } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = this.scroll.length(); t = Math.min(t, n - 1), e = Math.min(t + e, n - 1) - t; var r = void 0, o = this.scroll.leaf(t), i = a(o, 2), l = i[0], s = i[1]; if (null == l) return null; var u = l.position(s, !0), c = a(u, 2); r = c[0], s = c[1]; var f = document.createRange(); if (e > 0) { f.setStart(r, s); var h = this.scroll.leaf(t + e), p = a(h, 2); if (l = p[0], s = p[1], null == l) return null; var d = l.position(s, !0), y = a(d, 2); return r = y[0], s = y[1], f.setEnd(r, s), f.getBoundingClientRect() } var v = "left", b = void 0; return r instanceof Text ? (s < r.data.length ? (f.setStart(r, s), f.setEnd(r, s + 1)) : (f.setStart(r, s - 1), f.setEnd(r, s), v = "right"), b = f.getBoundingClientRect()) : (b = l.domNode.getBoundingClientRect(), s > 0 && (v = "right")), { bottom: b.top + b.height, height: b.height, left: b[v], right: b[v], top: b.top, width: 0 } } }, { key: "getNativeRange", value: function () { var t = document.getSelection(); if (null == t || t.rangeCount <= 0) return null; var e = t.getRangeAt(0); if (null == e) return null; var n = this.normalizeNative(e); return m.info("getNativeRange", n), n } }, { key: "getRange", value: function () { var t = this.getNativeRange(); return null == t ? [null, null] : [this.normalizedToRange(t), t] } }, { key: "hasFocus", value: function () { return document.activeElement === this.root } }, { key: "normalizedToRange", value: function (t) { var e = this, n = [[t.start.node, t.start.offset]]; t.native.collapsed || n.push([t.end.node, t.end.offset]); var r = n.map(function (t) { var n = a(t, 2), r = n[0], o = n[1], i = c.default.find(r, !0), l = i.offset(e.scroll); return 0 === o ? l : i instanceof c.default.Container ? l + i.length() : l + i.index(r, o) }), i = Math.min(Math.max.apply(Math, o(r)), this.scroll.length() - 1), l = Math.min.apply(Math, [i].concat(o(r))); return new _(l, i - l) } }, { key: "normalizeNative", value: function (t) { if (!l(this.root, t.startContainer) || !t.collapsed && !l(this.root, t.endContainer)) return null; var e = { start: { node: t.startContainer, offset: t.startOffset }, end: { node: t.endContainer, offset: t.endOffset }, native: t }; return [e.start, e.end].forEach(function (t) { for (var e = t.node, n = t.offset; !(e instanceof Text) && e.childNodes.length > 0;)if (e.childNodes.length > n) e = e.childNodes[n], n = 0; else { if (e.childNodes.length !== n) break; e = e.lastChild, n = e instanceof Text ? e.data.length : e.childNodes.length + 1 } t.node = e, t.offset = n }), e } }, { key: "rangeToNative", value: function (t) { var e = this, n = t.collapsed ? [t.index] : [t.index, t.index + t.length], r = [], o = this.scroll.length(); return n.forEach(function (t, n) { t = Math.min(o - 1, t); var i = void 0, l = e.scroll.leaf(t), s = a(l, 2), u = s[0], c = s[1], f = u.position(c, 0 !== n), h = a(f, 2); i = h[0], c = h[1], r.push(i, c) }), r.length < 2 && (r = r.concat(r)), r } }, { key: "scrollIntoView", value: function (t) { var e = this.lastRange; if (null != e) { var n = this.getBounds(e.index, e.length); if (null != n) { var r = this.scroll.length() - 1, o = this.scroll.line(Math.min(e.index, r)), i = a(o, 1), l = i[0], s = l; if (e.length > 0) { var u = this.scroll.line(Math.min(e.index + e.length, r)); s = a(u, 1)[0] } if (null != l && null != s) { var c = t.getBoundingClientRect(); n.top < c.top ? t.scrollTop -= c.top - n.top : n.bottom > c.bottom && (t.scrollTop += n.bottom - c.bottom) } } } } }, { key: "setNativeRange", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : t, r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : e, o = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; if (m.info("setNativeRange", t, e, n, r), null == t || null != this.root.parentNode && null != t.parentNode && null != n.parentNode) { var i = document.getSelection(); if (null != i) if (null != t) { this.hasFocus() || this.root.focus(); var l = (this.getNativeRange() || {}).native; if (null == l || o || t !== l.startContainer || e !== l.startOffset || n !== l.endContainer || r !== l.endOffset) { "BR" == t.tagName && (e = [].indexOf.call(t.parentNode.childNodes, t), t = t.parentNode), "BR" == n.tagName && (r = [].indexOf.call(n.parentNode.childNodes, n), n = n.parentNode); var a = document.createRange(); a.setStart(t, e), a.setEnd(n, r), i.removeAllRanges(), i.addRange(a) } } else i.removeAllRanges(), this.root.blur(), document.body.focus() } } }, { key: "setRange", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : v.default.sources.API; if ("string" == typeof e && (n = e, e = !1), m.info("setRange", t), null != t) { var r = this.rangeToNative(t); this.setNativeRange.apply(this, o(r).concat([e])) } else this.setNativeRange(null); this.update(n) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : v.default.sources.USER, e = this.lastRange, n = this.getRange(), r = a(n, 2), o = r[0], i = r[1]; if (this.lastRange = o, null != this.lastRange && (this.savedRange = this.lastRange), !(0, d.default)(e, this.lastRange)) { var l; !this.composing && null != i && i.native.collapsed && i.start.node !== this.cursor.textNode && this.cursor.restore(); var s = [v.default.events.SELECTION_CHANGE, (0, h.default)(this.lastRange), (0, h.default)(e), t]; if ((l = this.emitter).emit.apply(l, [v.default.events.EDITOR_CHANGE].concat(s)), t !== v.default.sources.SILENT) { var u; (u = this.emitter).emit.apply(u, s) } } } }]), t }(); e.Range = _, e.default = O }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = n(0), s = r(a), u = n(3), c = r(u), f = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(s.default.Container); f.allowedChildren = [c.default, u.BlockEmbed, f], e.default = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.ColorStyle = e.ColorClass = e.ColorAttributor = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t); return n.startsWith("rgb(") ? (n = n.replace(/^[^\d]+/, "").replace(/[^\d]+$/, ""), "#" + n.split(",").map(function (t) { return ("00" + parseInt(t).toString(16)).slice(-2) }).join("")) : n } }]), e }(u.default.Attributor.Style), f = new u.default.Attributor.Class("color", "ql-color", { scope: u.default.Scope.INLINE }), h = new c("color", "color", { scope: u.default.Scope.INLINE }); e.ColorAttributor = c, e.ColorClass = f, e.ColorStyle = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e) { var n, r = t === D.keys.LEFT ? "prefix" : "suffix"; return n = { key: t, shiftKey: e, altKey: null }, o(n, r, /^$/), o(n, "handler", function (n) { var r = n.index; t === D.keys.RIGHT && (r += n.length + 1); var o = this.quill.getLeaf(r); return !(b(o, 1)[0] instanceof T.default.Embed) || (t === D.keys.LEFT ? e ? this.quill.setSelection(n.index - 1, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index - 1, S.default.sources.USER) : e ? this.quill.setSelection(n.index, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index + n.length + 1, S.default.sources.USER), !1) }), n } function u(t, e) { if (!(0 === t.index || this.quill.getLength() <= 1)) { var n = this.quill.getLine(t.index), r = b(n, 1), o = r[0], i = {}; if (0 === e.offset) { var l = this.quill.getLine(t.index - 1), a = b(l, 1), s = a[0]; if (null != s && s.length() > 1) { var u = o.formats(), c = this.quill.getFormat(t.index - 1, 1); i = A.default.attributes.diff(u, c) || {} } } var f = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix) ? 2 : 1; this.quill.deleteText(t.index - f, f, S.default.sources.USER), Object.keys(i).length > 0 && this.quill.formatLine(t.index - f, f, i, S.default.sources.USER), this.quill.focus() } } function c(t, e) { var n = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix) ? 2 : 1; if (!(t.index >= this.quill.getLength() - n)) { var r = {}, o = 0, i = this.quill.getLine(t.index), l = b(i, 1), a = l[0]; if (e.offset >= a.length() - 1) { var s = this.quill.getLine(t.index + 1), u = b(s, 1), c = u[0]; if (c) { var f = a.formats(), h = this.quill.getFormat(t.index, 1); r = A.default.attributes.diff(f, h) || {}, o = c.length() } } this.quill.deleteText(t.index, n, S.default.sources.USER), Object.keys(r).length > 0 && this.quill.formatLine(t.index + o - 1, n, r, S.default.sources.USER) } } function f(t) { var e = this.quill.getLines(t), n = {}; if (e.length > 1) { var r = e[0].formats(), o = e[e.length - 1].formats(); n = A.default.attributes.diff(o, r) || {} } this.quill.deleteText(t, S.default.sources.USER), Object.keys(n).length > 0 && this.quill.formatLine(t.index, 1, n, S.default.sources.USER), this.quill.setSelection(t.index, S.default.sources.SILENT), this.quill.focus() } function h(t, e) { var n = this; t.length > 0 && this.quill.scroll.deleteAt(t.index, t.length); var r = Object.keys(e.format).reduce(function (t, n) { return T.default.query(n, T.default.Scope.BLOCK) && !Array.isArray(e.format[n]) && (t[n] = e.format[n]), t }, {}); this.quill.insertText(t.index, "\n", r, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.focus(), Object.keys(e.format).forEach(function (t) { null == r[t] && (Array.isArray(e.format[t]) || "link" !== t && n.quill.format(t, e.format[t], S.default.sources.USER)) }) } function p(t) { return { key: D.keys.TAB, shiftKey: !t, format: { "code-block": !0 }, handler: function (e) { var n = T.default.query("code-block"), r = e.index, o = e.length, i = this.quill.scroll.descendant(n, r), l = b(i, 2), a = l[0], s = l[1]; if (null != a) { var u = this.quill.getIndex(a), c = a.newlineIndex(s, !0) + 1, f = a.newlineIndex(u + s + o), h = a.domNode.textContent.slice(c, f).split("\n"); s = 0, h.forEach(function (e, i) { t ? (a.insertAt(c + s, n.TAB), s += n.TAB.length, 0 === i ? r += n.TAB.length : o += n.TAB.length) : e.startsWith(n.TAB) && (a.deleteAt(c + s, n.TAB.length), s -= n.TAB.length, 0 === i ? r -= n.TAB.length : o -= n.TAB.length), s += e.length + 1 }), this.quill.update(S.default.sources.USER), this.quill.setSelection(r, o, S.default.sources.SILENT) } } } } function d(t) { return { key: t[0].toUpperCase(), shortKey: !0, handler: function (e, n) { this.quill.format(t, !n.format[t], S.default.sources.USER) } } } function y(t) { if ("string" == typeof t || "number" == typeof t) return y({ key: t }); if ("object" === (void 0 === t ? "undefined" : v(t)) && (t = (0, _.default)(t, !1)), "string" == typeof t.key) if (null != D.keys[t.key.toUpperCase()]) t.key = D.keys[t.key.toUpperCase()]; else { if (1 !== t.key.length) return null; t.key = t.key.toUpperCase().charCodeAt(0) } return t.shortKey && (t[B] = t.shortKey, delete t.shortKey), t } Object.defineProperty(e, "__esModule", { value: !0 }), e.SHORTKEY = e.default = void 0; var v = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, b = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), g = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), m = n(21), _ = r(m), O = n(12), w = r(O), x = n(2), k = r(x), E = n(4), N = r(E), j = n(20), A = r(j), q = n(0), T = r(q), P = n(6), S = r(P), C = n(10), L = r(C), M = n(7), R = r(M), I = (0, L.default)("quill:keyboard"), B = /Mac/i.test(navigator.platform) ? "metaKey" : "ctrlKey", D = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.bindings = {}, Object.keys(r.options.bindings).forEach(function (e) { ("list autofill" !== e || null == t.scroll.whitelist || t.scroll.whitelist.list) && r.options.bindings[e] && r.addBinding(r.options.bindings[e]) }), r.addBinding({ key: e.keys.ENTER, shiftKey: null }, h), r.addBinding({ key: e.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () { }), /Firefox/i.test(navigator.userAgent) ? (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0 }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0 }, c)) : (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0, prefix: /^.?$/ }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0, suffix: /^.?$/ }, c)), r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.DELETE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: !0, offset: 0 }, u), r.listen(), r } return a(e, t), g(e, null, [{ key: "match", value: function (t, e) { return e = y(e), !["altKey", "ctrlKey", "metaKey", "shiftKey"].some(function (n) { return !!e[n] !== t[n] && null !== e[n] }) && e.key === (t.which || t.keyCode) } }]), g(e, [{ key: "addBinding", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = y(t); if (null == r || null == r.key) return I.warn("Attempted to add invalid keyboard binding", r); "function" == typeof e && (e = { handler: e }), "function" == typeof n && (n = { handler: n }), r = (0, k.default)(r, e, n), this.bindings[r.key] = this.bindings[r.key] || [], this.bindings[r.key].push(r) } }, { key: "listen", value: function () { var t = this; this.quill.root.addEventListener("keydown", function (n) { if (!n.defaultPrevented) { var r = n.which || n.keyCode, o = (t.bindings[r] || []).filter(function (t) { return e.match(n, t) }); if (0 !== o.length) { var i = t.quill.getSelection(); if (null != i && t.quill.hasFocus()) { var l = t.quill.getLine(i.index), a = b(l, 2), s = a[0], u = a[1], c = t.quill.getLeaf(i.index), f = b(c, 2), h = f[0], p = f[1], d = 0 === i.length ? [h, p] : t.quill.getLeaf(i.index + i.length), y = b(d, 2), g = y[0], m = y[1], _ = h instanceof T.default.Text ? h.value().slice(0, p) : "", O = g instanceof T.default.Text ? g.value().slice(m) : "", x = { collapsed: 0 === i.length, empty: 0 === i.length && s.length() <= 1, format: t.quill.getFormat(i), offset: u, prefix: _, suffix: O }; o.some(function (e) { if (null != e.collapsed && e.collapsed !== x.collapsed) return !1; if (null != e.empty && e.empty !== x.empty) return !1; if (null != e.offset && e.offset !== x.offset) return !1; if (Array.isArray(e.format)) { if (e.format.every(function (t) { return null == x.format[t] })) return !1 } else if ("object" === v(e.format) && !Object.keys(e.format).every(function (t) { return !0 === e.format[t] ? null != x.format[t] : !1 === e.format[t] ? null == x.format[t] : (0, w.default)(e.format[t], x.format[t]) })) return !1; return !(null != e.prefix && !e.prefix.test(x.prefix)) && (!(null != e.suffix && !e.suffix.test(x.suffix)) && !0 !== e.handler.call(t, i, x)) }) && n.preventDefault() } } } }) } }]), e }(R.default); D.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, ESCAPE: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }, D.DEFAULTS = { bindings: { bold: d("bold"), italic: d("italic"), underline: d("underline"), indent: { key: D.keys.TAB, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "+1", S.default.sources.USER) } }, outdent: { key: D.keys.TAB, shiftKey: !0, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "-1", S.default.sources.USER) } }, "outdent backspace": { key: D.keys.BACKSPACE, collapsed: !0, shiftKey: null, metaKey: null, ctrlKey: null, altKey: null, format: ["indent", "list"], offset: 0, handler: function (t, e) { null != e.format.indent ? this.quill.format("indent", "-1", S.default.sources.USER) : null != e.format.list && this.quill.format("list", !1, S.default.sources.USER) } }, "indent code-block": p(!0), "outdent code-block": p(!1), "remove tab": { key: D.keys.TAB, shiftKey: !0, collapsed: !0, prefix: /\t$/, handler: function (t) { this.quill.deleteText(t.index - 1, 1, S.default.sources.USER) } }, tab: { key: D.keys.TAB, handler: function (t) { this.quill.history.cutoff(); var e = (new N.default).retain(t.index).delete(t.length).insert("\t"); this.quill.updateContents(e, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index + 1, S.default.sources.SILENT) } }, "list empty enter": { key: D.keys.ENTER, collapsed: !0, format: ["list"], empty: !0, handler: function (t, e) { this.quill.format("list", !1, S.default.sources.USER), e.format.indent && this.quill.format("indent", !1, S.default.sources.USER) } }, "checklist enter": { key: D.keys.ENTER, collapsed: !0, format: { list: "checked" }, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (0, k.default)({}, r.formats(), { list: "checked" }), l = (new N.default).retain(t.index).insert("\n", i).retain(r.length() - o - 1).retain(1, { list: "unchecked" }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "header enter": { key: D.keys.ENTER, collapsed: !0, format: ["header"], suffix: /^$/, handler: function (t, e) { var n = this.quill.getLine(t.index), r = b(n, 2), o = r[0], i = r[1], l = (new N.default).retain(t.index).insert("\n", e.format).retain(o.length() - i - 1).retain(1, { header: null }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "list autofill": { key: " ", collapsed: !0, format: { list: !1 }, prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, handler: function (t, e) { var n = e.prefix.length, r = this.quill.getLine(t.index), o = b(r, 2), i = o[0], l = o[1]; if (l > n) return !0; var a = void 0; switch (e.prefix.trim()) { case "[]": case "[ ]": a = "unchecked"; break; case "[x]": a = "checked"; break; case "-": case "*": a = "bullet"; break; default: a = "ordered" }this.quill.insertText(t.index, " ", S.default.sources.USER), this.quill.history.cutoff(); var s = (new N.default).retain(t.index - l).delete(n + 1).retain(i.length() - 2 - l).retain(1, { list: a }); this.quill.updateContents(s, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index - n, S.default.sources.SILENT) } }, "code exit": { key: D.keys.ENTER, collapsed: !0, format: ["code-block"], prefix: /\n\n$/, suffix: /^\s+$/, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (new N.default).retain(t.index + r.length() - o - 2).retain(1, { "code-block": null }).delete(1); this.quill.updateContents(i, S.default.sources.USER) } }, "embed left": s(D.keys.LEFT, !1), "embed left shift": s(D.keys.LEFT, !0), "embed right": s(D.keys.RIGHT, !1), "embed right shift": s(D.keys.RIGHT, !0) } }, e.default = D, e.SHORTKEY = B }, function (t, e, n) { "use strict"; t.exports = { align: { "": n(75), center: n(76), right: n(77), justify: n(78) }, background: n(79), blockquote: n(80), bold: n(81), clean: n(82), code: n(40), "code-block": n(40), color: n(83), direction: { "": n(84), rtl: n(85) }, float: { center: n(86), full: n(87), left: n(88), right: n(89) }, formula: n(90), header: { 1: n(91), 2: n(92) }, italic: n(93), image: n(94), indent: { "+1": n(95), "-1": n(96) }, link: n(97), list: { ordered: n(98), bullet: n(99), check: n(100) }, script: { sub: n(101), super: n(102) }, strike: n(103), underline: n(104), video: n(105) } }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t) { this.domNode = t, this.domNode[r.DATA_KEY] = { blot: this } } return Object.defineProperty(t.prototype, "statics", { get: function () { return this.constructor }, enumerable: !0, configurable: !0 }), t.create = function (t) { if (null == this.tagName) throw new r.ParchmentError("Blot definition missing tagName"); var e; return Array.isArray(this.tagName) ? ("string" == typeof t && (t = t.toUpperCase(), parseInt(t).toString() === t && (t = parseInt(t))), e = "number" == typeof t ? document.createElement(this.tagName[t - 1]) : this.tagName.indexOf(t) > -1 ? document.createElement(t) : document.createElement(this.tagName[0])) : e = document.createElement(this.tagName), this.className && e.classList.add(this.className), e }, t.prototype.attach = function () { null != this.parent && (this.scroll = this.parent.scroll) }, t.prototype.clone = function () { var t = this.domNode.cloneNode(!1); return r.create(t) }, t.prototype.detach = function () { null != this.parent && this.parent.removeChild(this), delete this.domNode[r.DATA_KEY] }, t.prototype.deleteAt = function (t, e) { this.isolate(t, e).remove() }, t.prototype.formatAt = function (t, e, n, o) { var i = this.isolate(t, e); if (null != r.query(n, r.Scope.BLOT) && o) i.wrap(n, o); else if (null != r.query(n, r.Scope.ATTRIBUTE)) { var l = r.create(this.statics.scope); i.wrap(l), l.format(n, o) } }, t.prototype.insertAt = function (t, e, n) { var o = null == n ? r.create("text", e) : r.create(e, n), i = this.split(t); this.parent.insertBefore(o, i) }, t.prototype.insertInto = function (t, e) { void 0 === e && (e = null), null != this.parent && this.parent.children.remove(this); var n = null; t.children.insertBefore(this, e), null != e && (n = e.domNode), this.domNode.parentNode == t.domNode && this.domNode.nextSibling == n || t.domNode.insertBefore(this.domNode, n), this.parent = t, this.attach() }, t.prototype.isolate = function (t, e) { var n = this.split(t); return n.split(e), n }, t.prototype.length = function () { return 1 }, t.prototype.offset = function (t) { return void 0 === t && (t = this.parent), null == this.parent || this == t ? 0 : this.parent.children.offset(this) + this.parent.offset(t) }, t.prototype.optimize = function (t) { null != this.domNode[r.DATA_KEY] && delete this.domNode[r.DATA_KEY].mutations }, t.prototype.remove = function () { null != this.domNode.parentNode && this.domNode.parentNode.removeChild(this.domNode), this.detach() }, t.prototype.replace = function (t) { null != t.parent && (t.parent.insertBefore(this, t.next), t.remove()) }, t.prototype.replaceWith = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return n.replace(this), n }, t.prototype.split = function (t, e) { return 0 === t ? this : this.next }, t.prototype.update = function (t, e) { }, t.prototype.wrap = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return null != this.parent && this.parent.insertBefore(n, this.next), n.appendChild(this), n }, t.blotName = "abstract", t }(); e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(11), o = n(29), i = n(30), l = n(1), a = function () { function t(t) { this.attributes = {}, this.domNode = t, this.build() } return t.prototype.attribute = function (t, e) { e ? t.add(this.domNode, e) && (null != t.value(this.domNode) ? this.attributes[t.attrName] = t : delete this.attributes[t.attrName]) : (t.remove(this.domNode), delete this.attributes[t.attrName]) }, t.prototype.build = function () { var t = this; this.attributes = {}; var e = r.default.keys(this.domNode), n = o.default.keys(this.domNode), a = i.default.keys(this.domNode); e.concat(n).concat(a).forEach(function (e) { var n = l.query(e, l.Scope.ATTRIBUTE); n instanceof r.default && (t.attributes[n.attrName] = n) }) }, t.prototype.copy = function (t) { var e = this; Object.keys(this.attributes).forEach(function (n) { var r = e.attributes[n].value(e.domNode); t.format(n, r) }) }, t.prototype.move = function (t) { var e = this; this.copy(t), Object.keys(this.attributes).forEach(function (t) { e.attributes[t].remove(e.domNode) }), this.attributes = {} }, t.prototype.values = function () { var t = this; return Object.keys(this.attributes).reduce(function (e, n) { return e[n] = t.attributes[n].value(t.domNode), e }, {}) }, t }(); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { return (t.getAttribute("class") || "").split(/\s+/).filter(function (t) { return 0 === t.indexOf(e + "-") }) } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("class") || "").split(/\s+/).map(function (t) { return t.split("-").slice(0, -1).join("-") }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (this.remove(t), t.classList.add(this.keyName + "-" + e), !0) }, e.prototype.remove = function (t) { r(t, this.keyName).forEach(function (e) { t.classList.remove(e) }), 0 === t.classList.length && t.removeAttribute("class") }, e.prototype.value = function (t) { var e = r(t, this.keyName)[0] || "", n = e.slice(this.keyName.length + 1); return this.canAdd(t, n) ? n : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { var e = t.split("-"), n = e.slice(1).map(function (t) { return t[0].toUpperCase() + t.slice(1) }).join(""); return e[0] + n } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("style") || "").split(";").map(function (t) { return t.split(":")[0].trim() }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.style[r(this.keyName)] = e, !0) }, e.prototype.remove = function (t) { t.style[r(this.keyName)] = "", t.getAttribute("style") || t.removeAttribute("style") }, e.prototype.value = function (t) { var e = t.style[r(this.keyName)]; return this.canAdd(t, e) ? e : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(8), p = r(h), d = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.selection = n, r.textNode = document.createTextNode(e.CONTENTS), r.domNode.appendChild(r.textNode), r._length = 0, r } return l(e, t), u(e, null, [{ key: "value", value: function () { } }]), u(e, [{ key: "detach", value: function () { null != this.parent && this.parent.removeChild(this) } }, { key: "format", value: function (t, n) { if (0 !== this._length) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); for (var r = this, o = 0; null != r && r.statics.scope !== f.default.Scope.BLOCK_BLOT;)o += r.offset(r.parent), r = r.parent; null != r && (this._length = e.CONTENTS.length, r.optimize(), r.formatAt(o, e.CONTENTS.length, t, n), this._length = 0) } }, { key: "index", value: function (t, n) { return t === this.textNode ? 0 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "length", value: function () { return this._length } }, { key: "position", value: function () { return [this.textNode, this.textNode.data.length] } }, { key: "remove", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this), this.parent = null } }, { key: "restore", value: function () { if (!this.selection.composing && null != this.parent) { var t = this.textNode, n = this.selection.getNativeRange(), r = void 0, o = void 0, i = void 0; if (null != n && n.start.node === t && n.end.node === t) { var l = [t, n.start.offset, n.end.offset]; r = l[0], o = l[1], i = l[2] } for (; null != this.domNode.lastChild && this.domNode.lastChild !== this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); if (this.textNode.data !== e.CONTENTS) { var s = this.textNode.data.split(e.CONTENTS).join(""); this.next instanceof p.default ? (r = this.next.domNode, this.next.insertAt(0, s), this.textNode.data = e.CONTENTS) : (this.textNode.data = s, this.parent.insertBefore(f.default.create(this.textNode), this), this.textNode = document.createTextNode(e.CONTENTS), this.domNode.appendChild(this.textNode)) } if (this.remove(), null != o) { var u = [o, i].map(function (t) { return Math.max(0, Math.min(r.data.length, t - 1)) }), c = a(u, 2); return o = c[0], i = c[1], { startNode: r, startOffset: o, endNode: r, endOffset: i } } } } }, { key: "update", value: function (t, e) { var n = this; if (t.some(function (t) { return "characterData" === t.type && t.target === n.textNode })) { var r = this.restore(); r && (e.range = r) } } }, { key: "value", value: function () { return "" } }]), e }(f.default.Embed); d.blotName = "cursor", d.className = "ql-cursor", d.tagName = "span", d.CONTENTS = "\ufeff", e.default = d }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { r(this, t), this.quill = e, this.options = n, this.modules = {} } return o(t, [{ key: "init", value: function () { var t = this; Object.keys(this.options.modules).forEach(function (e) { null == t.modules[e] && t.addModule(e) }) } }, { key: "addModule", value: function (t) { var e = this.quill.constructor.import("modules/" + t); return this.modules[t] = new e(this.quill, this.options.modules[t] || {}), this.modules[t] } }]), t }(); i.DEFAULTS = { modules: {} }, i.themes = { default: i }, e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(8), h = r(f), p = "\ufeff", d = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.contentNode = document.createElement("span"), n.contentNode.setAttribute("contenteditable", !1), [].slice.call(n.domNode.childNodes).forEach(function (t) { n.contentNode.appendChild(t) }), n.leftGuard = document.createTextNode(p), n.rightGuard = document.createTextNode(p), n.domNode.appendChild(n.leftGuard), n.domNode.appendChild(n.contentNode), n.domNode.appendChild(n.rightGuard), n } return l(e, t), a(e, [{ key: "index", value: function (t, n) { return t === this.leftGuard ? 0 : t === this.rightGuard ? 1 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "restore", value: function (t) { var e = void 0, n = void 0, r = t.data.split(p).join(""); if (t === this.leftGuard) if (this.prev instanceof h.default) { var o = this.prev.length(); this.prev.insertAt(o, r), e = { startNode: this.prev.domNode, startOffset: o + r.length } } else n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this), e = { startNode: n, startOffset: r.length }; else t === this.rightGuard && (this.next instanceof h.default ? (this.next.insertAt(0, r), e = { startNode: this.next.domNode, startOffset: r.length }) : (n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this.next), e = { startNode: n, startOffset: r.length })); return t.data = p, e } }, { key: "update", value: function (t, e) { var n = this; t.forEach(function (t) { if ("characterData" === t.type && (t.target === n.leftGuard || t.target === n.rightGuard)) { var r = n.restore(t.target); r && (e.range = r) } }) } }]), e }(c.default.Embed); e.default = d }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.AlignStyle = e.AlignClass = e.AlignAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["right", "center", "justify"] }, l = new o.default.Attributor.Attribute("align", "align", i), a = new o.default.Attributor.Class("align", "ql-align", i), s = new o.default.Attributor.Style("align", "text-align", i); e.AlignAttribute = l, e.AlignClass = a, e.AlignStyle = s }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.BackgroundStyle = e.BackgroundClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = n(24), l = new o.default.Attributor.Class("background", "ql-bg", { scope: o.default.Scope.INLINE }), a = new i.ColorAttributor("background", "background-color", { scope: o.default.Scope.INLINE }); e.BackgroundClass = l, e.BackgroundStyle = a }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.DirectionStyle = e.DirectionClass = e.DirectionAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["rtl"] }, l = new o.default.Attributor.Attribute("direction", "dir", i), a = new o.default.Attributor.Class("direction", "ql-direction", i), s = new o.default.Attributor.Style("direction", "direction", i); e.DirectionAttribute = l, e.DirectionClass = a, e.DirectionStyle = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.FontClass = e.FontStyle = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = { scope: u.default.Scope.INLINE, whitelist: ["serif", "monospace"] }, f = new u.default.Attributor.Class("font", "ql-font", c), h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t).replace(/["']/g, "") } }]), e }(u.default.Attributor.Style), p = new h("font", "font-family", c); e.FontStyle = p, e.FontClass = f }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.SizeStyle = e.SizeClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = new o.default.Attributor.Class("size", "ql-size", { scope: o.default.Scope.INLINE, whitelist: ["small", "large", "huge"] }), l = new o.default.Attributor.Style("size", "font-size", { scope: o.default.Scope.INLINE, whitelist: ["10px", "18px", "32px"] }); e.SizeClass = i, e.SizeStyle = l }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "optimize", value: function (t) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.domNode.tagName !== this.statics.tagName[0] && this.replaceWith(this.statics.blotName) } }], [{ key: "create", value: function () { return a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this) } }, { key: "formats", value: function () { return !0 } }]), e }(u.default); c.blotName = "bold", c.tagName = ["STRONG", "B"], e.default = c }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.label.innerHTML = n, i.container.classList.add("ql-color-picker"), [].slice.call(i.container.querySelectorAll(".ql-picker-item"), 0, 7).forEach(function (t) { t.classList.add("ql-primary") }), i } return i(e, t), l(e, [{ key: "buildItem", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "buildItem", this).call(this, t); return n.style.backgroundColor = t.getAttribute("value") || "", n } }, { key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n); var r = this.label.querySelector(".ql-color-label"), o = t ? t.getAttribute("data-value") || "" : ""; r && ("line" === r.tagName ? r.style.stroke = o : r.style.fill = o) } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.container.classList.add("ql-icon-picker"), [].forEach.call(i.container.querySelectorAll(".ql-picker-item"), function (t) { t.innerHTML = n[t.getAttribute("data-value") || ""] }), i.defaultItem = i.container.querySelector(".ql-selected"), i.selectItem(i.defaultItem), i } return i(e, t), l(e, [{ key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n), t = t || this.defaultItem, this.label.innerHTML = t.innerHTML } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { var o = this; r(this, t), this.quill = e, this.boundsContainer = n || document.body, this.root = e.addContainer("ql-tooltip"), this.root.innerHTML = this.constructor.TEMPLATE, this.quill.root === this.quill.scrollingContainer && this.quill.root.addEventListener("scroll", function () { o.root.style.marginTop = -1 * o.quill.root.scrollTop + "px" }), this.hide() } return o(t, [{ key: "hide", value: function () { this.root.classList.add("ql-hidden") } }, { key: "position", value: function (t) { var e = t.left + t.width / 2 - this.root.offsetWidth / 2, n = t.bottom + this.quill.root.scrollTop; this.root.style.left = e + "px", this.root.style.top = n + "px", this.root.classList.remove("ql-flip"); var r = this.boundsContainer.getBoundingClientRect(), o = this.root.getBoundingClientRect(), i = 0; if (o.right > r.right && (i = r.right - o.right, this.root.style.left = e + i + "px"), o.left < r.left && (i = r.left - o.left, this.root.style.left = e + i + "px"), o.bottom > r.bottom) { var l = o.bottom - o.top, a = t.bottom - t.top + l; this.root.style.top = n - a + "px", this.root.classList.add("ql-flip") } return i } }, { key: "show", value: function () { this.root.classList.remove("ql-editing"), this.root.classList.remove("ql-hidden") } }]), t }(); e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); return e ? (e[1] || "https") + "://www.youtube.com/embed/" + e[2] + "?showinfo=0" : (e = t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) ? (e[1] || "https") + "://player.vimeo.com/video/" + e[2] + "/" : t } function s(t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; e.forEach(function (e) { var r = document.createElement("option"); e === n ? r.setAttribute("selected", "selected") : r.setAttribute("value", e), t.appendChild(r) }) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BaseTooltip = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(2), h = r(f), p = n(4), d = r(p), y = n(9), v = r(y), b = n(25), g = r(b), m = n(32), _ = r(m), O = n(41), w = r(O), x = n(42), k = r(x), E = n(16), N = r(E), j = n(43), A = r(j), q = [!1, "center", "right", "justify"], T = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"], P = [!1, "serif", "monospace"], S = ["1", "2", "3", !1], C = ["small", !1, "large", "huge"], L = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)), l = function e(n) { if (!document.body.contains(t.root)) return document.body.removeEventListener("click", e); null == r.tooltip || r.tooltip.root.contains(n.target) || document.activeElement === r.tooltip.textbox || r.quill.hasFocus() || r.tooltip.hide(), null != r.pickers && r.pickers.forEach(function (t) { t.container.contains(n.target) || t.close() }) }; return t.emitter.listenDOM("click", document.body, l), r } return l(e, t), u(e, [{ key: "addModule", value: function (t) { var n = c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "addModule", this).call(this, t); return "toolbar" === t && this.extendToolbar(n), n } }, { key: "buildButtons", value: function (t, e) { t.forEach(function (t) { (t.getAttribute("class") || "").split(/\s+/).forEach(function (n) { if (n.startsWith("ql-") && (n = n.slice("ql-".length), null != e[n])) if ("direction" === n) t.innerHTML = e[n][""] + e[n].rtl; else if ("string" == typeof e[n]) t.innerHTML = e[n]; else { var r = t.value || ""; null != r && e[n][r] && (t.innerHTML = e[n][r]) } }) }) } }, { key: "buildPickers", value: function (t, e) { var n = this; this.pickers = t.map(function (t) { if (t.classList.contains("ql-align")) return null == t.querySelector("option") && s(t, q), new k.default(t, e.align); if (t.classList.contains("ql-background") || t.classList.contains("ql-color")) { var n = t.classList.contains("ql-background") ? "background" : "color"; return null == t.querySelector("option") && s(t, T, "background" === n ? "#ffffff" : "#000000"), new w.default(t, e[n]) } return null == t.querySelector("option") && (t.classList.contains("ql-font") ? s(t, P) : t.classList.contains("ql-header") ? s(t, S) : t.classList.contains("ql-size") && s(t, C)), new N.default(t) }); var r = function () { n.pickers.forEach(function (t) { t.update() }) }; this.quill.on(v.default.events.EDITOR_CHANGE, r) } }]), e }(_.default); L.DEFAULTS = (0, h.default)(!0, {}, _.default.DEFAULTS, { modules: { toolbar: { handlers: { formula: function () { this.quill.theme.tooltip.edit("formula") }, image: function () { var t = this, e = this.container.querySelector("input.ql-image[type=file]"); null == e && (e = document.createElement("input"), e.setAttribute("type", "file"), e.setAttribute("accept", "image/png, image/gif, image/jpeg, image/bmp, image/x-icon"), e.classList.add("ql-image"), e.addEventListener("change", function () { if (null != e.files && null != e.files[0]) { var n = new FileReader; n.onload = function (n) { var r = t.quill.getSelection(!0); t.quill.updateContents((new d.default).retain(r.index).delete(r.length).insert({ image: n.target.result }), v.default.sources.USER), t.quill.setSelection(r.index + 1, v.default.sources.SILENT), e.value = "" }, n.readAsDataURL(e.files[0]) } }), this.container.appendChild(e)), e.click() }, video: function () { this.quill.theme.tooltip.edit("video") } } } } }); var M = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.textbox = r.root.querySelector('input[type="text"]'), r.listen(), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; this.textbox.addEventListener("keydown", function (e) { g.default.match(e, "enter") ? (t.save(), e.preventDefault()) : g.default.match(e, "escape") && (t.cancel(), e.preventDefault()) }) } }, { key: "cancel", value: function () { this.hide() } }, { key: "edit", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "link", e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; this.root.classList.remove("ql-hidden"), this.root.classList.add("ql-editing"), null != e ? this.textbox.value = e : t !== this.root.getAttribute("data-mode") && (this.textbox.value = ""), this.position(this.quill.getBounds(this.quill.selection.savedRange)), this.textbox.select(), this.textbox.setAttribute("placeholder", this.textbox.getAttribute("data-" + t) || ""), this.root.setAttribute("data-mode", t) } }, { key: "restoreFocus", value: function () { var t = this.quill.scrollingContainer.scrollTop; this.quill.focus(), this.quill.scrollingContainer.scrollTop = t } }, { key: "save", value: function () { var t = this.textbox.value; switch (this.root.getAttribute("data-mode")) { case "link": var e = this.quill.root.scrollTop; this.linkRange ? (this.quill.formatText(this.linkRange, "link", t, v.default.sources.USER), delete this.linkRange) : (this.restoreFocus(), this.quill.format("link", t, v.default.sources.USER)), this.quill.root.scrollTop = e; break; case "video": t = a(t); case "formula": if (!t) break; var n = this.quill.getSelection(!0); if (null != n) { var r = n.index + n.length; this.quill.insertEmbed(r, this.root.getAttribute("data-mode"), t, v.default.sources.USER), "formula" === this.root.getAttribute("data-mode") && this.quill.insertText(r + 1, " ", v.default.sources.USER), this.quill.setSelection(r + 2, v.default.sources.USER) } }this.textbox.value = "", this.hide() } }]), e }(A.default); e.BaseTooltip = M, e.default = L }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(46), i = r(o), l = n(34), a = n(36), s = n(62), u = n(63), c = r(u), f = n(64), h = r(f), p = n(65), d = r(p), y = n(35), v = n(24), b = n(37), g = n(38), m = n(39), _ = r(m), O = n(66), w = r(O), x = n(15), k = r(x), E = n(67), N = r(E), j = n(68), A = r(j), q = n(69), T = r(q), P = n(70), S = r(P), C = n(71), L = r(C), M = n(13), R = r(M), I = n(72), B = r(I), D = n(73), U = r(D), F = n(74), H = r(F), K = n(26), z = r(K), V = n(16), Z = r(V), W = n(41), G = r(W), Y = n(42), X = r(Y), $ = n(43), Q = r($), J = n(107), tt = r(J), et = n(108), nt = r(et); i.default.register({ "attributors/attribute/direction": a.DirectionAttribute, "attributors/class/align": l.AlignClass, "attributors/class/background": y.BackgroundClass, "attributors/class/color": v.ColorClass, "attributors/class/direction": a.DirectionClass, "attributors/class/font": b.FontClass, "attributors/class/size": g.SizeClass, "attributors/style/align": l.AlignStyle, "attributors/style/background": y.BackgroundStyle, "attributors/style/color": v.ColorStyle, "attributors/style/direction": a.DirectionStyle, "attributors/style/font": b.FontStyle, "attributors/style/size": g.SizeStyle }, !0), i.default.register({ "formats/align": l.AlignClass, "formats/direction": a.DirectionClass, "formats/indent": s.IndentClass, "formats/background": y.BackgroundStyle, "formats/color": v.ColorStyle, "formats/font": b.FontClass, "formats/size": g.SizeClass, "formats/blockquote": c.default, "formats/code-block": R.default, "formats/header": h.default, "formats/list": d.default, "formats/bold": _.default, "formats/code": M.Code, "formats/italic": w.default, "formats/link": k.default, "formats/script": N.default, "formats/strike": A.default, "formats/underline": T.default, "formats/image": S.default, "formats/video": L.default, "formats/list/item": p.ListItem, "modules/formula": B.default, "modules/syntax": U.default, "modules/toolbar": H.default, "themes/bubble": tt.default, "themes/snow": nt.default, "ui/icons": z.default, "ui/picker": Z.default, "ui/icon-picker": X.default, "ui/color-picker": G.default, "ui/tooltip": Q.default }, !0), e.default = i.default }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(0), i = r(o), l = n(6), a = r(l), s = n(3), u = r(s), c = n(14), f = r(c), h = n(23), p = r(h), d = n(31), y = r(d), v = n(33), b = r(v), g = n(5), m = r(g), _ = n(59), O = r(_), w = n(8), x = r(w), k = n(60), E = r(k), N = n(61), j = r(N), A = n(25), q = r(A); a.default.register({ "blots/block": u.default, "blots/block/embed": s.BlockEmbed, "blots/break": f.default, "blots/container": p.default, "blots/cursor": y.default, "blots/embed": b.default, "blots/inline": m.default, "blots/scroll": O.default, "blots/text": x.default, "modules/clipboard": E.default, "modules/history": j.default, "modules/keyboard": q.default }), i.default.register(u.default, f.default, y.default, m.default, O.default, x.default), e.default = a.default }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = function () { function t() { this.head = this.tail = null, this.length = 0 } return t.prototype.append = function () { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; this.insertBefore(t[0], null), t.length > 1 && this.append.apply(this, t.slice(1)) }, t.prototype.contains = function (t) { for (var e, n = this.iterator(); e = n();)if (e === t) return !0; return !1 }, t.prototype.insertBefore = function (t, e) { t && (t.next = e, null != e ? (t.prev = e.prev, null != e.prev && (e.prev.next = t), e.prev = t, e === this.head && (this.head = t)) : null != this.tail ? (this.tail.next = t, t.prev = this.tail, this.tail = t) : (t.prev = null, this.head = this.tail = t), this.length += 1) }, t.prototype.offset = function (t) { for (var e = 0, n = this.head; null != n;) { if (n === t) return e; e += n.length(), n = n.next } return -1 }, t.prototype.remove = function (t) { this.contains(t) && (null != t.prev && (t.prev.next = t.next), null != t.next && (t.next.prev = t.prev), t === this.head && (this.head = t.next), t === this.tail && (this.tail = t.prev), this.length -= 1) }, t.prototype.iterator = function (t) { return void 0 === t && (t = this.head), function () { var e = t; return null != t && (t = t.next), e } }, t.prototype.find = function (t, e) { void 0 === e && (e = !1); for (var n, r = this.iterator(); n = r();) { var o = n.length(); if (t < o || e && t === o && (null == n.next || 0 !== n.next.length())) return [n, t]; t -= o } return [null, 0] }, t.prototype.forEach = function (t) { for (var e, n = this.iterator(); e = n();)t(e) }, t.prototype.forEachAt = function (t, e, n) { if (!(e <= 0)) for (var r, o = this.find(t), i = o[0], l = o[1], a = t - l, s = this.iterator(i); (r = s()) && a < t + e;) { var u = r.length(); t > a ? n(r, t - a, Math.min(e, a + u - t)) : n(r, 0, Math.min(u, t + e - a)), a += u } }, t.prototype.map = function (t) { return this.reduce(function (e, n) { return e.push(t(n)), e }, []) }, t.prototype.reduce = function (t, e) { for (var n, r = this.iterator(); n = r();)e = t(e, n); return e }, t }(); e.default = r }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(17), i = n(1), l = { attributes: !0, characterData: !0, characterDataOldValue: !0, childList: !0, subtree: !0 }, a = function (t) { function e(e) { var n = t.call(this, e) || this; return n.scroll = n, n.observer = new MutationObserver(function (t) { n.update(t) }), n.observer.observe(n.domNode, l), n.attach(), n } return r(e, t), e.prototype.detach = function () { t.prototype.detach.call(this), this.observer.disconnect() }, e.prototype.deleteAt = function (e, n) { this.update(), 0 === e && n === this.length() ? this.children.forEach(function (t) { t.remove() }) : t.prototype.deleteAt.call(this, e, n) }, e.prototype.formatAt = function (e, n, r, o) { this.update(), t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { this.update(), t.prototype.insertAt.call(this, e, n, r) }, e.prototype.optimize = function (e, n) { var r = this; void 0 === e && (e = []), void 0 === n && (n = {}), t.prototype.optimize.call(this, n); for (var l = [].slice.call(this.observer.takeRecords()); l.length > 0;)e.push(l.pop()); for (var a = function (t, e) { void 0 === e && (e = !0), null != t && t !== r && null != t.domNode.parentNode && (null == t.domNode[i.DATA_KEY].mutations && (t.domNode[i.DATA_KEY].mutations = []), e && a(t.parent)) }, s = function (t) { null != t.domNode[i.DATA_KEY] && null != t.domNode[i.DATA_KEY].mutations && (t instanceof o.default && t.children.forEach(s), t.optimize(n)) }, u = e, c = 0; u.length > 0; c += 1) { if (c >= 100) throw new Error("[Parchment] Maximum optimize iterations reached"); for (u.forEach(function (t) { var e = i.find(t.target, !0); null != e && (e.domNode === t.target && ("childList" === t.type ? (a(i.find(t.previousSibling, !1)), [].forEach.call(t.addedNodes, function (t) { var e = i.find(t, !1); a(e, !1), e instanceof o.default && e.children.forEach(function (t) { a(t, !1) }) })) : "attributes" === t.type && a(e.prev)), a(e)) }), this.children.forEach(s), u = [].slice.call(this.observer.takeRecords()), l = u.slice(); l.length > 0;)e.push(l.pop()) } }, e.prototype.update = function (e, n) { var r = this; void 0 === n && (n = {}), e = e || this.observer.takeRecords(), e.map(function (t) { var e = i.find(t.target, !0); return null == e ? null : null == e.domNode[i.DATA_KEY].mutations ? (e.domNode[i.DATA_KEY].mutations = [t], e) : (e.domNode[i.DATA_KEY].mutations.push(t), null) }).forEach(function (t) { null != t && t !== r && null != t.domNode[i.DATA_KEY] && t.update(t.domNode[i.DATA_KEY].mutations || [], n) }), null != this.domNode[i.DATA_KEY].mutations && t.prototype.update.call(this, this.domNode[i.DATA_KEY].mutations, n), this.optimize(e, n) }, e.blotName = "scroll", e.defaultChild = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "DIV", e }(o.default); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { if (Object.keys(t).length !== Object.keys(e).length) return !1; for (var n in t) if (t[n] !== e[n]) return !1; return !0 } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(18), l = n(1), a = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.formats = function (n) { if (n.tagName !== e.tagName) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { var o = this; n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : (this.children.forEach(function (t) { t instanceof i.default || (t = t.wrap(e.blotName, !0)), o.attributes.copy(t) }), this.unwrap()) }, e.prototype.formatAt = function (e, n, r, o) { if (null != this.formats()[r] || l.query(r, l.Scope.ATTRIBUTE)) { this.isolate(e, n).format(r, o) } else t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n); var o = this.formats(); if (0 === Object.keys(o).length) return this.unwrap(); var i = this.next; i instanceof e && i.prev === this && r(o, i.formats()) && (i.moveChildren(this), i.remove()) }, e.blotName = "inline", e.scope = l.Scope.INLINE_BLOT, e.tagName = "SPAN", e }(i.default); e.default = a }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(18), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (n) { var r = i.query(e.blotName).tagName; if (n.tagName !== r) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { null != i.query(n, i.Scope.BLOCK) && (n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : this.replaceWith(e.blotName)) }, e.prototype.formatAt = function (e, n, r, o) { null != i.query(r, i.Scope.BLOCK) ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { if (null == r || null != i.query(n, i.Scope.INLINE)) t.prototype.insertAt.call(this, e, n, r); else { var o = this.split(e), l = i.create(n, r); o.parent.insertBefore(l, o) } }, e.prototype.update = function (e, n) { navigator.userAgent.match(/Trident/) ? this.build() : t.prototype.update.call(this, e, n) }, e.blotName = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "P", e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (t) { }, e.prototype.format = function (e, n) { t.prototype.formatAt.call(this, 0, this.length(), e, n) }, e.prototype.formatAt = function (e, n, r, o) { 0 === e && n === this.length() ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.formats = function () { return this.statics.formats(this.domNode) }, e }(o.default); e.default = i }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = n(1), l = function (t) { function e(e) { var n = t.call(this, e) || this; return n.text = n.statics.value(n.domNode), n } return r(e, t), e.create = function (t) { return document.createTextNode(t) }, e.value = function (t) { var e = t.data; return e.normalize && (e = e.normalize()), e }, e.prototype.deleteAt = function (t, e) { this.domNode.data = this.text = this.text.slice(0, t) + this.text.slice(t + e) }, e.prototype.index = function (t, e) { return this.domNode === t ? e : -1 }, e.prototype.insertAt = function (e, n, r) { null == r ? (this.text = this.text.slice(0, e) + n + this.text.slice(e), this.domNode.data = this.text) : t.prototype.insertAt.call(this, e, n, r) }, e.prototype.length = function () { return this.text.length }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n), this.text = this.statics.value(this.domNode), 0 === this.text.length ? this.remove() : this.next instanceof e && this.next.prev === this && (this.insertAt(this.length(), this.next.value()), this.next.remove()) }, e.prototype.position = function (t, e) { return void 0 === e && (e = !1), [this.domNode, t] }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = i.create(this.domNode.splitText(t)); return this.parent.insertBefore(n, this.next), this.text = this.statics.value(this.domNode), n }, e.prototype.update = function (t, e) { var n = this; t.some(function (t) { return "characterData" === t.type && t.target === n.domNode }) && (this.text = this.statics.value(this.domNode)) }, e.prototype.value = function () { return this.text }, e.blotName = "text", e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = document.createElement("div"); if (r.classList.toggle("test-class", !1), r.classList.contains("test-class")) { var o = DOMTokenList.prototype.toggle; DOMTokenList.prototype.toggle = function (t, e) { return arguments.length > 1 && !this.contains(t) == !e ? e : o.call(this, t) } } String.prototype.startsWith || (String.prototype.startsWith = function (t, e) { return e = e || 0, this.substr(e, t.length) === t }), String.prototype.endsWith || (String.prototype.endsWith = function (t, e) { var n = this.toString(); ("number" != typeof e || !isFinite(e) || Math.floor(e) !== e || e > n.length) && (e = n.length), e -= t.length; var r = n.indexOf(t, e); return -1 !== r && r === e }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", { value: function (t) { if (null === this) throw new TypeError("Array.prototype.find called on null or undefined"); if ("function" != typeof t) throw new TypeError("predicate must be a function"); for (var e, n = Object(this), r = n.length >>> 0, o = arguments[1], i = 0; i < r; i++)if (e = n[i], t.call(o, e, i, n)) return e } }), document.addEventListener("DOMContentLoaded", function () { document.execCommand("enableObjectResizing", !1, !1), document.execCommand("autoUrlDetect", !1, !1) }) }, function (t, e) { function n(t, e, n) { if (t == e) return t ? [[v, t]] : []; (n < 0 || t.length < n) && (n = null); var o = l(t, e), i = t.substring(0, o); t = t.substring(o), e = e.substring(o), o = a(t, e); var s = t.substring(t.length - o); t = t.substring(0, t.length - o), e = e.substring(0, e.length - o); var c = r(t, e); return i && c.unshift([v, i]), s && c.push([v, s]), u(c), null != n && (c = f(c, n)), c = h(c) } function r(t, e) { var r; if (!t) return [[y, e]]; if (!e) return [[d, t]]; var i = t.length > e.length ? t : e, l = t.length > e.length ? e : t, a = i.indexOf(l); if (-1 != a) return r = [[y, i.substring(0, a)], [v, l], [y, i.substring(a + l.length)]], t.length > e.length && (r[0][0] = r[2][0] = d), r; if (1 == l.length) return [[d, t], [y, e]]; var u = s(t, e); if (u) { var c = u[0], f = u[1], h = u[2], p = u[3], b = u[4], g = n(c, h), m = n(f, p); return g.concat([[v, b]], m) } return o(t, e) } function o(t, e) { for (var n = t.length, r = e.length, o = Math.ceil((n + r) / 2), l = o, a = 2 * o, s = new Array(a), u = new Array(a), c = 0; c < a; c++)s[c] = -1, u[c] = -1; s[l + 1] = 0, u[l + 1] = 0; for (var f = n - r, h = f % 2 != 0, p = 0, v = 0, b = 0, g = 0, m = 0; m < o; m++) { for (var _ = -m + p; _ <= m - v; _ += 2) { var O, w = l + _; O = _ == -m || _ != m && s[w - 1] < s[w + 1] ? s[w + 1] : s[w - 1] + 1; for (var x = O - _; O < n && x < r && t.charAt(O) == e.charAt(x);)O++, x++; if (s[w] = O, O > n) v += 2; else if (x > r) p += 2; else if (h) { var k = l + f - _; if (k >= 0 && k < a && -1 != u[k]) { var E = n - u[k]; if (O >= E) return i(t, e, O, x) } } } for (var N = -m + b; N <= m - g; N += 2) { var E, k = l + N; E = N == -m || N != m && u[k - 1] < u[k + 1] ? u[k + 1] : u[k - 1] + 1; for (var j = E - N; E < n && j < r && t.charAt(n - E - 1) == e.charAt(r - j - 1);)E++, j++; if (u[k] = E, E > n) g += 2; else if (j > r) b += 2; else if (!h) { var w = l + f - N; if (w >= 0 && w < a && -1 != s[w]) { var O = s[w], x = l + O - w; if (E = n - E, O >= E) return i(t, e, O, x) } } } } return [[d, t], [y, e]] } function i(t, e, r, o) { var i = t.substring(0, r), l = e.substring(0, o), a = t.substring(r), s = e.substring(o), u = n(i, l), c = n(a, s); return u.concat(c) } function l(t, e) { if (!t || !e || t.charAt(0) != e.charAt(0)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(i, o) == e.substring(i, o) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function a(t, e) { if (!t || !e || t.charAt(t.length - 1) != e.charAt(e.length - 1)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(t.length - o, t.length - i) == e.substring(e.length - o, e.length - i) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function s(t, e) { function n(t, e, n) { for (var r, o, i, s, u = t.substring(n, n + Math.floor(t.length / 4)), c = -1, f = ""; -1 != (c = e.indexOf(u, c + 1));) { var h = l(t.substring(n), e.substring(c)), p = a(t.substring(0, n), e.substring(0, c)); f.length < p + h && (f = e.substring(c - p, c) + e.substring(c, c + h), r = t.substring(0, n - p), o = t.substring(n + h), i = e.substring(0, c - p), s = e.substring(c + h)) } return 2 * f.length >= t.length ? [r, o, i, s, f] : null } var r = t.length > e.length ? t : e, o = t.length > e.length ? e : t; if (r.length < 4 || 2 * o.length < r.length) return null; var i, s = n(r, o, Math.ceil(r.length / 4)), u = n(r, o, Math.ceil(r.length / 2)); if (!s && !u) return null; i = u ? s && s[4].length > u[4].length ? s : u : s; var c, f, h, p; return t.length > e.length ? (c = i[0], f = i[1], h = i[2], p = i[3]) : (h = i[0], p = i[1], c = i[2], f = i[3]), [c, f, h, p, i[4]] } function u(t) { t.push([v, ""]); for (var e, n = 0, r = 0, o = 0, i = "", s = ""; n < t.length;)switch (t[n][0]) { case y: o++, s += t[n][1], n++; break; case d: r++, i += t[n][1], n++; break; case v: r + o > 1 ? (0 !== r && 0 !== o && (e = l(s, i), 0 !== e && (n - r - o > 0 && t[n - r - o - 1][0] == v ? t[n - r - o - 1][1] += s.substring(0, e) : (t.splice(0, 0, [v, s.substring(0, e)]), n++), s = s.substring(e), i = i.substring(e)), 0 !== (e = a(s, i)) && (t[n][1] = s.substring(s.length - e) + t[n][1], s = s.substring(0, s.length - e), i = i.substring(0, i.length - e))), 0 === r ? t.splice(n - o, r + o, [y, s]) : 0 === o ? t.splice(n - r, r + o, [d, i]) : t.splice(n - r - o, r + o, [d, i], [y, s]), n = n - r - o + (r ? 1 : 0) + (o ? 1 : 0) + 1) : 0 !== n && t[n - 1][0] == v ? (t[n - 1][1] += t[n][1], t.splice(n, 1)) : n++, o = 0, r = 0, i = "", s = "" }"" === t[t.length - 1][1] && t.pop(); var c = !1; for (n = 1; n < t.length - 1;)t[n - 1][0] == v && t[n + 1][0] == v && (t[n][1].substring(t[n][1].length - t[n - 1][1].length) == t[n - 1][1] ? (t[n][1] = t[n - 1][1] + t[n][1].substring(0, t[n][1].length - t[n - 1][1].length), t[n + 1][1] = t[n - 1][1] + t[n + 1][1], t.splice(n - 1, 1), c = !0) : t[n][1].substring(0, t[n + 1][1].length) == t[n + 1][1] && (t[n - 1][1] += t[n + 1][1], t[n][1] = t[n][1].substring(t[n + 1][1].length) + t[n + 1][1], t.splice(n + 1, 1), c = !0)), n++; c && u(t) } function c(t, e) { if (0 === e) return [v, t]; for (var n = 0, r = 0; r < t.length; r++) { var o = t[r]; if (o[0] === d || o[0] === v) { var i = n + o[1].length; if (e === i) return [r + 1, t]; if (e < i) { t = t.slice(); var l = e - n, a = [o[0], o[1].slice(0, l)], s = [o[0], o[1].slice(l)]; return t.splice(r, 1, a, s), [r + 1, t] } n = i } } throw new Error("cursor_pos is out of bounds!") } function f(t, e) { var n = c(t, e), r = n[1], o = n[0], i = r[o], l = r[o + 1]; if (null == i) return t; if (i[0] !== v) return t; if (null != l && i[1] + l[1] === l[1] + i[1]) return r.splice(o, 2, l, i), p(r, o, 2); if (null != l && 0 === l[1].indexOf(i[1])) { r.splice(o, 2, [l[0], i[1]], [0, i[1]]); var a = l[1].slice(i[1].length); return a.length > 0 && r.splice(o + 2, 0, [l[0], a]), p(r, o, 3) } return t } function h(t) { for (var e = !1, n = function (t) { return t.charCodeAt(0) >= 56320 && t.charCodeAt(0) <= 57343 }, r = 2; r < t.length; r += 1)t[r - 2][0] === v && function (t) { return t.charCodeAt(t.length - 1) >= 55296 && t.charCodeAt(t.length - 1) <= 56319 }(t[r - 2][1]) && t[r - 1][0] === d && n(t[r - 1][1]) && t[r][0] === y && n(t[r][1]) && (e = !0, t[r - 1][1] = t[r - 2][1].slice(-1) + t[r - 1][1], t[r][1] = t[r - 2][1].slice(-1) + t[r][1], t[r - 2][1] = t[r - 2][1].slice(0, -1)); if (!e) return t; for (var o = [], r = 0; r < t.length; r += 1)t[r][1].length > 0 && o.push(t[r]); return o } function p(t, e, n) { for (var r = e + n - 1; r >= 0 && r >= e - 1; r--)if (r + 1 < t.length) { var o = t[r], i = t[r + 1]; o[0] === i[1] && t.splice(r, 2, [o[0], o[1] + i[1]]) } return t } var d = -1, y = 1, v = 0, b = n; b.INSERT = y, b.DELETE = d, b.EQUAL = v, t.exports = b }, function (t, e) { function n(t) { var e = []; for (var n in t) e.push(n); return e } e = t.exports = "function" == typeof Object.keys ? Object.keys : n, e.shim = n }, function (t, e) { function n(t) { return "[object Arguments]" == Object.prototype.toString.call(t) } function r(t) { return t && "object" == typeof t && "number" == typeof t.length && Object.prototype.hasOwnProperty.call(t, "callee") && !Object.prototype.propertyIsEnumerable.call(t, "callee") || !1 } var o = "[object Arguments]" == function () { return Object.prototype.toString.call(arguments) }(); e = t.exports = o ? n : r, e.supported = n, e.unsupported = r }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { return Object.keys(e).reduce(function (n, r) { return null == t[r] ? n : (e[r] === t[r] ? n[r] = e[r] : Array.isArray(e[r]) ? e[r].indexOf(t[r]) < 0 && (n[r] = e[r].concat([t[r]])) : n[r] = [e[r], t[r]], n) }, {}) } function a(t) { return t.reduce(function (t, e) { if (1 === e.insert) { var n = (0, N.default)(e.attributes); return delete n.image, t.insert({ image: e.attributes.image }, n) } if (null == e.attributes || !0 !== e.attributes.list && !0 !== e.attributes.bullet || (e = (0, N.default)(e), e.attributes.list ? e.attributes.list = "ordered" : (e.attributes.list = "bullet", delete e.attributes.bullet)), "string" == typeof e.insert) { var r = e.insert.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); return t.insert(r, e.attributes) } return t.push(e) }, new h.default) } Object.defineProperty(e, "__esModule", { value: !0 }); var s = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, u = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), c = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), f = n(4), h = r(f), p = n(20), d = r(p), y = n(0), v = r(y), b = n(13), g = r(b), m = n(31), _ = r(m), O = n(3), w = r(O), x = n(14), k = r(x), E = n(21), N = r(E), j = n(12), A = r(j), q = n(2), T = r(q), P = /^[ -~]*$/, S = function () { function t(e) { i(this, t), this.scroll = e, this.delta = this.getDelta() } return c(t, [{ key: "applyDelta", value: function (t) { var e = this, n = !1; this.scroll.update(); var r = this.scroll.length(); return this.scroll.batchStart(), t = a(t), t.reduce(function (t, o) { var i = o.retain || o.delete || o.insert.length || 1, l = o.attributes || {}; if (null != o.insert) { if ("string" == typeof o.insert) { var a = o.insert; a.endsWith("\n") && n && (n = !1, a = a.slice(0, -1)), t >= r && !a.endsWith("\n") && (n = !0), e.scroll.insertAt(t, a); var c = e.scroll.line(t), f = u(c, 2), h = f[0], p = f[1], y = (0, T.default)({}, (0, O.bubbleFormats)(h)); if (h instanceof w.default) { var b = h.descendant(v.default.Leaf, p), g = u(b, 1), m = g[0]; y = (0, T.default)(y, (0, O.bubbleFormats)(m)) } l = d.default.attributes.diff(y, l) || {} } else if ("object" === s(o.insert)) { var _ = Object.keys(o.insert)[0]; if (null == _) return t; e.scroll.insertAt(t, _, o.insert[_]) } r += i } return Object.keys(l).forEach(function (n) { e.scroll.formatAt(t, i, n, l[n]) }), t + i }, 0), t.reduce(function (t, n) { return "number" == typeof n.delete ? (e.scroll.deleteAt(t, n.delete), t) : t + (n.retain || n.insert.length || 1) }, 0), this.scroll.batchEnd(), this.update(t) } }, { key: "deleteText", value: function (t, e) { return this.scroll.deleteAt(t, e), this.update((new h.default).retain(t).delete(e)) } }, { key: "formatLine", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return this.scroll.update(), Object.keys(r).forEach(function (o) { if (null == n.scroll.whitelist || n.scroll.whitelist[o]) { var i = n.scroll.lines(t, Math.max(e, 1)), l = e; i.forEach(function (e) { var i = e.length(); if (e instanceof g.default) { var a = t - e.offset(n.scroll), s = e.newlineIndex(a + l) - a + 1; e.formatAt(a, s, o, r[o]) } else e.format(o, r[o]); l -= i }) } }), this.scroll.optimize(), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "formatText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e, o, r[o]) }), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "getContents", value: function (t, e) { return this.delta.slice(t, t + e) } }, { key: "getDelta", value: function () { return this.scroll.lines().reduce(function (t, e) { return t.concat(e.delta()) }, new h.default) } }, { key: "getFormat", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = [], r = []; 0 === e ? this.scroll.path(t).forEach(function (t) { var e = u(t, 1), o = e[0]; o instanceof w.default ? n.push(o) : o instanceof v.default.Leaf && r.push(o) }) : (n = this.scroll.lines(t, e), r = this.scroll.descendants(v.default.Leaf, t, e)); var o = [n, r].map(function (t) { if (0 === t.length) return {}; for (var e = (0, O.bubbleFormats)(t.shift()); Object.keys(e).length > 0;) { var n = t.shift(); if (null == n) return e; e = l((0, O.bubbleFormats)(n), e) } return e }); return T.default.apply(T.default, o) } }, { key: "getText", value: function (t, e) { return this.getContents(t, e).filter(function (t) { return "string" == typeof t.insert }).map(function (t) { return t.insert }).join("") } }, { key: "insertEmbed", value: function (t, e, n) { return this.scroll.insertAt(t, e, n), this.update((new h.default).retain(t).insert(o({}, e, n))) } }, { key: "insertText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return e = e.replace(/\r\n/g, "\n").replace(/\r/g, "\n"), this.scroll.insertAt(t, e), Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e.length, o, r[o]) }), this.update((new h.default).retain(t).insert(e, (0, N.default)(r))) } }, { key: "isBlank", value: function () { if (0 == this.scroll.children.length) return !0; if (this.scroll.children.length > 1) return !1; var t = this.scroll.children.head; return t.statics.blotName === w.default.blotName && (!(t.children.length > 1) && t.children.head instanceof k.default) } }, { key: "removeFormat", value: function (t, e) { var n = this.getText(t, e), r = this.scroll.line(t + e), o = u(r, 2), i = o[0], l = o[1], a = 0, s = new h.default; null != i && (a = i instanceof g.default ? i.newlineIndex(l) - l + 1 : i.length() - l, s = i.delta().slice(l, l + a - 1).insert("\n")); var c = this.getContents(t, e + a), f = c.diff((new h.default).insert(n).concat(s)), p = (new h.default).retain(t).concat(f); return this.applyDelta(p) } }, { key: "update", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, r = this.delta; if (1 === e.length && "characterData" === e[0].type && e[0].target.data.match(P) && v.default.find(e[0].target)) { var o = v.default.find(e[0].target), i = (0, O.bubbleFormats)(o), l = o.offset(this.scroll), a = e[0].oldValue.replace(_.default.CONTENTS, ""), s = (new h.default).insert(a), u = (new h.default).insert(o.value()); t = (new h.default).retain(l).concat(s.diff(u, n)).reduce(function (t, e) { return e.insert ? t.insert(e.insert, i) : t.push(e) }, new h.default), this.delta = r.compose(t) } else this.delta = this.getDelta(), t && (0, A.default)(r.compose(t), this.delta) || (t = r.diff(this.delta, n)); return t } }]), t }(); e.default = S }, function (t, e) { "use strict"; function n() { } function r(t, e, n) { this.fn = t, this.context = e, this.once = n || !1 } function o() { this._events = new n, this._eventsCount = 0 } var i = Object.prototype.hasOwnProperty, l = "~"; Object.create && (n.prototype = Object.create(null), (new n).__proto__ || (l = !1)), o.prototype.eventNames = function () { var t, e, n = []; if (0 === this._eventsCount) return n; for (e in t = this._events) i.call(t, e) && n.push(l ? e.slice(1) : e); return Object.getOwnPropertySymbols ? n.concat(Object.getOwnPropertySymbols(t)) : n }, o.prototype.listeners = function (t, e) { var n = l ? l + t : t, r = this._events[n]; if (e) return !!r; if (!r) return []; if (r.fn) return [r.fn]; for (var o = 0, i = r.length, a = new Array(i); o < i; o++)a[o] = r[o].fn; return a }, o.prototype.emit = function (t, e, n, r, o, i) { var a = l ? l + t : t; if (!this._events[a]) return !1; var s, u, c = this._events[a], f = arguments.length; if (c.fn) { switch (c.once && this.removeListener(t, c.fn, void 0, !0), f) { case 1: return c.fn.call(c.context), !0; case 2: return c.fn.call(c.context, e), !0; case 3: return c.fn.call(c.context, e, n), !0; case 4: return c.fn.call(c.context, e, n, r), !0; case 5: return c.fn.call(c.context, e, n, r, o), !0; case 6: return c.fn.call(c.context, e, n, r, o, i), !0 }for (u = 1, s = new Array(f - 1); u < f; u++)s[u - 1] = arguments[u]; c.fn.apply(c.context, s) } else { var h, p = c.length; for (u = 0; u < p; u++)switch (c[u].once && this.removeListener(t, c[u].fn, void 0, !0), f) { case 1: c[u].fn.call(c[u].context); break; case 2: c[u].fn.call(c[u].context, e); break; case 3: c[u].fn.call(c[u].context, e, n); break; case 4: c[u].fn.call(c[u].context, e, n, r); break; default: if (!s) for (h = 1, s = new Array(f - 1); h < f; h++)s[h - 1] = arguments[h]; c[u].fn.apply(c[u].context, s) } } return !0 }, o.prototype.on = function (t, e, n) { var o = new r(e, n || this), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.once = function (t, e, n) { var o = new r(e, n || this, !0), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.removeListener = function (t, e, r, o) { var i = l ? l + t : t; if (!this._events[i]) return this; if (!e) return 0 == --this._eventsCount ? this._events = new n : delete this._events[i], this; var a = this._events[i]; if (a.fn) a.fn !== e || o && !a.once || r && a.context !== r || (0 == --this._eventsCount ? this._events = new n : delete this._events[i]); else { for (var s = 0, u = [], c = a.length; s < c; s++)(a[s].fn !== e || o && !a[s].once || r && a[s].context !== r) && u.push(a[s]); u.length ? this._events[i] = 1 === u.length ? u[0] : u : 0 == --this._eventsCount ? this._events = new n : delete this._events[i] } return this }, o.prototype.removeAllListeners = function (t) { var e; return t ? (e = l ? l + t : t, this._events[e] && (0 == --this._eventsCount ? this._events = new n : delete this._events[e])) : (this._events = new n, this._eventsCount = 0), this }, o.prototype.off = o.prototype.removeListener, o.prototype.addListener = o.prototype.on, o.prototype.setMaxListeners = function () { return this }, o.prefixed = l, o.EventEmitter = o, void 0 !== t && (t.exports = o) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { return t instanceof v.default || t instanceof y.BlockEmbed } Object.defineProperty(e, "__esModule", { value: !0 }); var s = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(0), h = r(f), p = n(9), d = r(p), y = n(3), v = r(y), b = n(14), g = r(b), m = n(13), _ = r(m), O = n(23), w = r(O), x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.emitter = n.emitter, Array.isArray(n.whitelist) && (r.whitelist = n.whitelist.reduce(function (t, e) { return t[e] = !0, t }, {})), r.domNode.addEventListener("DOMNodeInserted", function () { }), r.optimize(), r.enable(), r } return l(e, t), u(e, [{ key: "batchStart", value: function () { this.batch = !0 } }, { key: "batchEnd", value: function () { this.batch = !1, this.optimize() } }, { key: "deleteAt", value: function (t, n) { var r = this.line(t), o = s(r, 2), i = o[0], l = o[1], a = this.line(t + n), u = s(a, 1), f = u[0]; if (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), null != f && i !== f && l > 0) { if (i instanceof y.BlockEmbed || f instanceof y.BlockEmbed) return void this.optimize(); if (i instanceof _.default) { var h = i.newlineIndex(i.length(), !0); if (h > -1 && (i = i.split(h + 1)) === f) return void this.optimize() } else if (f instanceof _.default) { var p = f.newlineIndex(0); p > -1 && f.split(p + 1) } var d = f.children.head instanceof g.default ? null : f.children.head; i.moveChildren(f, d), i.remove() } this.optimize() } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.domNode.setAttribute("contenteditable", t) } }, { key: "formatAt", value: function (t, n, r, o) { (null == this.whitelist || this.whitelist[r]) && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o), this.optimize()) } }, { key: "insertAt", value: function (t, n, r) { if (null == r || null == this.whitelist || this.whitelist[n]) { if (t >= this.length()) if (null == r || null == h.default.query(n, h.default.Scope.BLOCK)) { var o = h.default.create(this.statics.defaultChild); this.appendChild(o), null == r && n.endsWith("\n") && (n = n.slice(0, -1)), o.insertAt(0, n, r) } else { var i = h.default.create(n, r); this.appendChild(i) } else c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); this.optimize() } } }, { key: "insertBefore", value: function (t, n) { if (t.statics.scope === h.default.Scope.INLINE_BLOT) { var r = h.default.create(this.statics.defaultChild); r.appendChild(t), t = r } c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n) } }, { key: "leaf", value: function (t) { return this.path(t).pop() || [null, -1] } }, { key: "line", value: function (t) { return t === this.length() ? this.line(t - 1) : this.descendant(a, t) } }, { key: "lines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return function t(e, n, r) { var o = [], i = r; return e.children.forEachAt(n, r, function (e, n, r) { a(e) ? o.push(e) : e instanceof h.default.Container && (o = o.concat(t(e, n, i))), i -= r }), o }(this, t, e) } }, { key: "optimize", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; !0 !== this.batch && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t, n), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_OPTIMIZE, t, n)) } }, { key: "path", value: function (t) { return c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t).slice(1) } }, { key: "update", value: function (t) { if (!0 !== this.batch) { var n = d.default.sources.USER; "string" == typeof t && (n = t), Array.isArray(t) || (t = this.observer.takeRecords()), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE, n, t), c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "update", this).call(this, t.concat([])), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_UPDATE, n, t) } } }]), e }(h.default.Scroll); x.blotName = "scroll", x.className = "ql-editor", x.tagName = "DIV", x.defaultChild = "block", x.allowedChildren = [v.default, y.BlockEmbed, w.default], e.default = x }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { return "object" === (void 0 === e ? "undefined" : x(e)) ? Object.keys(e).reduce(function (t, n) { return s(t, n, e[n]) }, t) : t.reduce(function (t, r) { return r.attributes && r.attributes[e] ? t.push(r) : t.insert(r.insert, (0, j.default)({}, o({}, e, n), r.attributes)) }, new q.default) } function u(t) { if (t.nodeType !== Node.ELEMENT_NODE) return {}; return t["__ql-computed-style"] || (t["__ql-computed-style"] = window.getComputedStyle(t)) } function c(t, e) { for (var n = "", r = t.ops.length - 1; r >= 0 && n.length < e.length; --r) { var o = t.ops[r]; if ("string" != typeof o.insert) break; n = o.insert + n } return n.slice(-1 * e.length) === e } function f(t) { return 0 !== t.childNodes.length && ["block", "list-item"].indexOf(u(t).display) > -1 } function h(t, e, n) { return t.nodeType === t.TEXT_NODE ? n.reduce(function (e, n) { return n(t, e) }, new q.default) : t.nodeType === t.ELEMENT_NODE ? [].reduce.call(t.childNodes || [], function (r, o) { var i = h(o, e, n); return o.nodeType === t.ELEMENT_NODE && (i = e.reduce(function (t, e) { return e(o, t) }, i), i = (o[W] || []).reduce(function (t, e) { return e(o, t) }, i)), r.concat(i) }, new q.default) : new q.default } function p(t, e, n) { return s(n, t, !0) } function d(t, e) { var n = P.default.Attributor.Attribute.keys(t), r = P.default.Attributor.Class.keys(t), o = P.default.Attributor.Style.keys(t), i = {}; return n.concat(r).concat(o).forEach(function (e) { var n = P.default.query(e, P.default.Scope.ATTRIBUTE); null != n && (i[n.attrName] = n.value(t), i[n.attrName]) || (n = Y[e], null == n || n.attrName !== e && n.keyName !== e || (i[n.attrName] = n.value(t) || void 0), null == (n = X[e]) || n.attrName !== e && n.keyName !== e || (n = X[e], i[n.attrName] = n.value(t) || void 0)) }), Object.keys(i).length > 0 && (e = s(e, i)), e } function y(t, e) { var n = P.default.query(t); if (null == n) return e; if (n.prototype instanceof P.default.Embed) { var r = {}, o = n.value(t); null != o && (r[n.blotName] = o, e = (new q.default).insert(r, n.formats(t))) } else "function" == typeof n.formats && (e = s(e, n.blotName, n.formats(t))); return e } function v(t, e) { return c(e, "\n") || e.insert("\n"), e } function b() { return new q.default } function g(t, e) { var n = P.default.query(t); if (null == n || "list-item" !== n.blotName || !c(e, "\n")) return e; for (var r = -1, o = t.parentNode; !o.classList.contains("ql-clipboard");)"list" === (P.default.query(o) || {}).blotName && (r += 1), o = o.parentNode; return r <= 0 ? e : e.compose((new q.default).retain(e.length() - 1).retain(1, { indent: r })) } function m(t, e) { return c(e, "\n") || (f(t) || e.length() > 0 && t.nextSibling && f(t.nextSibling)) && e.insert("\n"), e } function _(t, e) { if (f(t) && null != t.nextElementSibling && !c(e, "\n\n")) { var n = t.offsetHeight + parseFloat(u(t).marginTop) + parseFloat(u(t).marginBottom); t.nextElementSibling.offsetTop > t.offsetTop + 1.5 * n && e.insert("\n") } return e } function O(t, e) { var n = {}, r = t.style || {}; return r.fontStyle && "italic" === u(t).fontStyle && (n.italic = !0), r.fontWeight && (u(t).fontWeight.startsWith("bold") || parseInt(u(t).fontWeight) >= 700) && (n.bold = !0), Object.keys(n).length > 0 && (e = s(e, n)), parseFloat(r.textIndent || 0) > 0 && (e = (new q.default).insert("\t").concat(e)), e } function w(t, e) { var n = t.data; if ("O:P" === t.parentNode.tagName) return e.insert(n.trim()); if (0 === n.trim().length && t.parentNode.classList.contains("ql-clipboard")) return e; if (!u(t.parentNode).whiteSpace.startsWith("pre")) { var r = function (t, e) { return e = e.replace(/[^\u00a0]/g, ""), e.length < 1 && t ? " " : e }; n = n.replace(/\r\n/g, " ").replace(/\n/g, " "), n = n.replace(/\s\s+/g, r.bind(r, !0)), (null == t.previousSibling && f(t.parentNode) || null != t.previousSibling && f(t.previousSibling)) && (n = n.replace(/^\s+/, r.bind(r, !1))), (null == t.nextSibling && f(t.parentNode) || null != t.nextSibling && f(t.nextSibling)) && (n = n.replace(/\s+$/, r.bind(r, !1))) } return e.insert(n) } Object.defineProperty(e, "__esModule", { value: !0 }), e.matchText = e.matchSpacing = e.matchNewline = e.matchBlot = e.matchAttributor = e.default = void 0; var x = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, k = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), E = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), N = n(2), j = r(N), A = n(4), q = r(A), T = n(0), P = r(T), S = n(6), C = r(S), L = n(10), M = r(L), R = n(7), I = r(R), B = n(34), D = n(35), U = n(13), F = r(U), H = n(24), K = n(36), z = n(37), V = n(38), Z = (0, M.default)("quill:clipboard"), W = "__ql-matcher", G = [[Node.TEXT_NODE, w], [Node.TEXT_NODE, m], ["br", v], [Node.ELEMENT_NODE, m], [Node.ELEMENT_NODE, y], [Node.ELEMENT_NODE, _], [Node.ELEMENT_NODE, d], [Node.ELEMENT_NODE, O], ["li", g], ["b", p.bind(p, "bold")], ["i", p.bind(p, "italic")], ["style", b]], Y = [B.AlignAttribute, K.DirectionAttribute].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), X = [B.AlignStyle, D.BackgroundStyle, H.ColorStyle, K.DirectionStyle, z.FontStyle, V.SizeStyle].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), $ = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.root.addEventListener("paste", r.onPaste.bind(r)), r.container = r.quill.addContainer("ql-clipboard"), r.container.setAttribute("contenteditable", !0), r.container.setAttribute("tabindex", -1), r.matchers = [], G.concat(r.options.matchers).forEach(function (t) { var e = k(t, 2), o = e[0], i = e[1]; (n.matchVisual || i !== _) && r.addMatcher(o, i) }), r } return a(e, t), E(e, [{ key: "addMatcher", value: function (t, e) { this.matchers.push([t, e]) } }, { key: "convert", value: function (t) { if ("string" == typeof t) return this.container.innerHTML = t.replace(/\>\r?\n +\<"), this.convert(); var e = this.quill.getFormat(this.quill.selection.savedRange.index); if (e[F.default.blotName]) { var n = this.container.innerText; return this.container.innerHTML = "", (new q.default).insert(n, o({}, F.default.blotName, e[F.default.blotName])) } var r = this.prepareMatching(), i = k(r, 2), l = i[0], a = i[1], s = h(this.container, l, a); return c(s, "\n") && null == s.ops[s.ops.length - 1].attributes && (s = s.compose((new q.default).retain(s.length() - 1).delete(1))), Z.log("convert", this.container.innerHTML, s), this.container.innerHTML = "", s } }, { key: "dangerouslyPasteHTML", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : C.default.sources.API; if ("string" == typeof t) this.quill.setContents(this.convert(t), e), this.quill.setSelection(0, C.default.sources.SILENT); else { var r = this.convert(e); this.quill.updateContents((new q.default).retain(t).concat(r), n), this.quill.setSelection(t + r.length(), C.default.sources.SILENT) } } }, { key: "onPaste", value: function (t) { var e = this; if (!t.defaultPrevented && this.quill.isEnabled()) { var n = this.quill.getSelection(), r = (new q.default).retain(n.index), o = this.quill.scrollingContainer.scrollTop; this.container.focus(), this.quill.selection.update(C.default.sources.SILENT), setTimeout(function () { r = r.concat(e.convert()).delete(n.length), e.quill.updateContents(r, C.default.sources.USER), e.quill.setSelection(r.length() - n.length, C.default.sources.SILENT), e.quill.scrollingContainer.scrollTop = o, e.quill.focus() }, 1) } } }, { key: "prepareMatching", value: function () { var t = this, e = [], n = []; return this.matchers.forEach(function (r) { var o = k(r, 2), i = o[0], l = o[1]; switch (i) { case Node.TEXT_NODE: n.push(l); break; case Node.ELEMENT_NODE: e.push(l); break; default: [].forEach.call(t.container.querySelectorAll(i), function (t) { t[W] = t[W] || [], t[W].push(l) }) } }), [e, n] } }]), e }(I.default); $.DEFAULTS = { matchers: [], matchVisual: !0 }, e.default = $, e.matchAttributor = d, e.matchBlot = y, e.matchNewline = m, e.matchSpacing = _, e.matchText = w }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.ops[t.ops.length - 1]; return null != e && (null != e.insert ? "string" == typeof e.insert && e.insert.endsWith("\n") : null != e.attributes && Object.keys(e.attributes).some(function (t) { return null != f.default.query(t, f.default.Scope.BLOCK) })) } function s(t) { var e = t.reduce(function (t, e) { return t += e.delete || 0 }, 0), n = t.length() - e; return a(t) && (n -= 1), n } Object.defineProperty(e, "__esModule", { value: !0 }), e.getLastChangeIndex = e.default = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(6), p = r(h), d = n(7), y = r(d), v = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.lastRecorded = 0, r.ignoreChange = !1, r.clear(), r.quill.on(p.default.events.EDITOR_CHANGE, function (t, e, n, o) { t !== p.default.events.TEXT_CHANGE || r.ignoreChange || (r.options.userOnly && o !== p.default.sources.USER ? r.transform(e) : r.record(e, n)) }), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0 }, r.undo.bind(r)), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0, shiftKey: !0 }, r.redo.bind(r)), /Win/i.test(navigator.platform) && r.quill.keyboard.addBinding({ key: "Y", shortKey: !0 }, r.redo.bind(r)), r } return l(e, t), u(e, [{ key: "change", value: function (t, e) { if (0 !== this.stack[t].length) { var n = this.stack[t].pop(); this.stack[e].push(n), this.lastRecorded = 0, this.ignoreChange = !0, this.quill.updateContents(n[t], p.default.sources.USER), this.ignoreChange = !1; var r = s(n[t]); this.quill.setSelection(r) } } }, { key: "clear", value: function () { this.stack = { undo: [], redo: [] } } }, { key: "cutoff", value: function () { this.lastRecorded = 0 } }, { key: "record", value: function (t, e) { if (0 !== t.ops.length) { this.stack.redo = []; var n = this.quill.getContents().diff(e), r = Date.now(); if (this.lastRecorded + this.options.delay > r && this.stack.undo.length > 0) { var o = this.stack.undo.pop(); n = n.compose(o.undo), t = o.redo.compose(t) } else this.lastRecorded = r; this.stack.undo.push({ redo: t, undo: n }), this.stack.undo.length > this.options.maxStack && this.stack.undo.shift() } } }, { key: "redo", value: function () { this.change("redo", "undo") } }, { key: "transform", value: function (t) { this.stack.undo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }), this.stack.redo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }) } }, { key: "undo", value: function () { this.change("undo", "redo") } }]), e }(y.default); v.DEFAULTS = { delay: 1e3, maxStack: 100, userOnly: !1 }, e.default = v, e.getLastChangeIndex = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.IndentClass = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "add", value: function (t, n) { if ("+1" === n || "-1" === n) { var r = this.value(t) || 0; n = "+1" === n ? r + 1 : r - 1 } return 0 === n ? (this.remove(t), !0) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "add", this).call(this, t, n) } }, { key: "canAdd", value: function (t, n) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, n) || a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, parseInt(n)) } }, { key: "value", value: function (t) { return parseInt(a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t)) || void 0 } }]), e }(u.default.Attributor.Class), f = new c("indent", "ql-indent", { scope: u.default.Scope.BLOCK, whitelist: [1, 2, 3, 4, 5, 6, 7, 8] }); e.IndentClass = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(3), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "blockquote", s.tagName = "blockquote", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = n(3), s = function (t) { return t && t.__esModule ? t : { default: t } }(a), u = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "formats", value: function (t) { return this.tagName.indexOf(t.tagName) + 1 } }]), e }(s.default); u.blotName = "header", u.tagName = ["H1", "H2", "H3", "H4", "H5", "H6"], e.default = u }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.ListItem = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(0), f = r(c), h = n(3), p = r(h), d = n(23), y = r(d), v = function (t) { function e() { return i(this, e), l(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return a(e, t), s(e, [{ key: "format", value: function (t, n) { t !== b.blotName || n ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) : this.replaceWith(f.default.create(this.statics.scope)) } }, { key: "remove", value: function () { null == this.prev && null == this.next ? this.parent.remove() : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this) } }, { key: "replaceWith", value: function (t, n) { return this.parent.isolate(this.offset(this.parent), this.length()), t === this.parent.statics.blotName ? (this.parent.replaceWith(t, n), this) : (this.parent.unwrap(), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t, n)) } }], [{ key: "formats", value: function (t) { return t.tagName === this.tagName ? void 0 : u(e.__proto__ || Object.getPrototypeOf(e), "formats", this).call(this, t) } }]), e }(p.default); v.blotName = "list-item", v.tagName = "LI"; var b = function (t) { function e(t) { i(this, e); var n = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)), r = function (e) { if (e.target.parentNode === t) { var r = n.statics.formats(t), o = f.default.find(e.target); "checked" === r ? o.format("list", "unchecked") : "unchecked" === r && o.format("list", "checked") } }; return t.addEventListener("touchstart", r), t.addEventListener("mousedown", r), n } return a(e, t), s(e, null, [{ key: "create", value: function (t) { var n = "ordered" === t ? "OL" : "UL", r = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, n); return "checked" !== t && "unchecked" !== t || r.setAttribute("data-checked", "checked" === t), r } }, { key: "formats", value: function (t) { return "OL" === t.tagName ? "ordered" : "UL" === t.tagName ? t.hasAttribute("data-checked") ? "true" === t.getAttribute("data-checked") ? "checked" : "unchecked" : "bullet" : void 0 } }]), s(e, [{ key: "format", value: function (t, e) { this.children.length > 0 && this.children.tail.format(t, e) } }, { key: "formats", value: function () { return o({}, this.statics.blotName, this.statics.formats(this.domNode)) } }, { key: "insertBefore", value: function (t, n) { if (t instanceof v) u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n); else { var r = null == n ? this.length() : n.offset(this), o = this.split(r); o.parent.insertBefore(t, o) } } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && n.domNode.tagName === this.domNode.tagName && n.domNode.getAttribute("data-checked") === this.domNode.getAttribute("data-checked") && (n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { if (t.statics.blotName !== this.statics.blotName) { var n = f.default.create(this.statics.defaultChild); t.moveChildren(n), this.appendChild(n) } u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t) } }]), e }(y.default); b.blotName = "list", b.scope = f.default.Scope.BLOCK_BLOT, b.tagName = ["OL", "UL"], b.defaultChild = "list-item", b.allowedChildren = [v], e.ListItem = v, e.default = b }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(39), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "italic", s.tagName = ["EM", "I"], e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "create", value: function (t) { return "super" === t ? document.createElement("sup") : "sub" === t ? document.createElement("sub") : a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t) } }, { key: "formats", value: function (t) { return "SUB" === t.tagName ? "sub" : "SUP" === t.tagName ? "super" : void 0 } }]), e }(u.default); c.blotName = "script", c.tagName = ["SUB", "SUP"], e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "strike", s.tagName = "S", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "underline", s.tagName = "U", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = n(15), f = ["alt", "height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "match", value: function (t) { return /\.(jpe?g|gif|png)$/.test(t) || /^data:image\/.+;base64/.test(t) } }, { key: "sanitize", value: function (t) { return (0, c.sanitize)(t, ["http", "https", "data"]) ? t : "//:0" } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(u.default.Embed); h.blotName = "image", h.tagName = "IMG", e.default = h }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(3), u = n(15), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = ["height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("frameborder", "0"), n.setAttribute("allowfullscreen", !0), n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "sanitize", value: function (t) { return c.default.sanitize(t) } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(s.BlockEmbed); h.blotName = "video", h.className = "ql-video", h.tagName = "IFRAME", e.default = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.FormulaBlot = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(33), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, null, [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && (window.katex.render(t, n, { throwOnError: !1, errorColor: "#f00" }), n.setAttribute("data-value", t)), n } }, { key: "value", value: function (t) { return t.getAttribute("data-value") } }]), e }(c.default); y.blotName = "formula", y.className = "ql-formula", y.tagName = "SPAN"; var v = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); if (null == window.katex) throw new Error("Formula module requires KaTeX."); return t } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(y, !0) } }]), e }(d.default); e.FormulaBlot = y, e.default = v }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.CodeToken = e.CodeBlock = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = n(13), v = r(y), b = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "replaceWith", value: function (t) { this.domNode.textContent = this.domNode.textContent, this.attach(), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t) } }, { key: "highlight", value: function (t) { var e = this.domNode.textContent; this.cachedText !== e && ((e.trim().length > 0 || null == this.cachedText) && (this.domNode.innerHTML = t(e), this.domNode.normalize(), this.attach()), this.cachedText = e) } }]), e }(v.default); b.className = "ql-syntax"; var g = new c.default.Attributor.Class("token", "hljs", { scope: c.default.Scope.INLINE }), m = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if ("function" != typeof r.options.highlight) throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill."); var l = null; return r.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { clearTimeout(l), l = setTimeout(function () { r.highlight(), l = null }, r.options.interval) }), r.highlight(), r } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(g, !0), h.default.register(b, !0) } }]), a(e, [{ key: "highlight", value: function () { var t = this; if (!this.quill.selection.composing) { this.quill.update(h.default.sources.USER); var e = this.quill.getSelection(); this.quill.scroll.descendants(b).forEach(function (e) { e.highlight(t.options.highlight) }), this.quill.update(h.default.sources.SILENT), null != e && this.quill.setSelection(e, h.default.sources.SILENT) } } }]), e }(d.default); m.DEFAULTS = { highlight: function () { return null == window.hljs ? null : function (t) { return window.hljs.highlightAuto(t).value } }(), interval: 1e3 }, e.CodeBlock = b, e.CodeToken = g, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { var r = document.createElement("button"); r.setAttribute("type", "button"), r.classList.add("ql-" + e), null != n && (r.value = n), t.appendChild(r) } function u(t, e) { Array.isArray(e[0]) || (e = [e]), e.forEach(function (e) { var n = document.createElement("span"); n.classList.add("ql-formats"), e.forEach(function (t) { if ("string" == typeof t) s(n, t); else { var e = Object.keys(t)[0], r = t[e]; Array.isArray(r) ? c(n, e, r) : s(n, e, r) } }), t.appendChild(n) }) } function c(t, e, n) { var r = document.createElement("select"); r.classList.add("ql-" + e), n.forEach(function (t) { var e = document.createElement("option"); !1 !== t ? e.setAttribute("value", t) : e.setAttribute("selected", "selected"), r.appendChild(e) }), t.appendChild(r) } Object.defineProperty(e, "__esModule", { value: !0 }), e.addControls = e.default = void 0; var f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), p = n(4), d = r(p), y = n(0), v = r(y), b = n(6), g = r(b), m = n(10), _ = r(m), O = n(7), w = r(O), x = (0, _.default)("quill:toolbar"), k = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if (Array.isArray(r.options.container)) { var o = document.createElement("div"); u(o, r.options.container), t.container.parentNode.insertBefore(o, t.container), r.container = o } else "string" == typeof r.options.container ? r.container = document.querySelector(r.options.container) : r.container = r.options.container; if (!(r.container instanceof HTMLElement)) { var a; return a = x.error("Container required for toolbar", r.options), l(r, a) } return r.container.classList.add("ql-toolbar"), r.controls = [], r.handlers = {}, Object.keys(r.options.handlers).forEach(function (t) { r.addHandler(t, r.options.handlers[t]) }), [].forEach.call(r.container.querySelectorAll("button, select"), function (t) { r.attach(t) }), r.quill.on(g.default.events.EDITOR_CHANGE, function (t, e) { t === g.default.events.SELECTION_CHANGE && r.update(e) }), r.quill.on(g.default.events.SCROLL_OPTIMIZE, function () { var t = r.quill.selection.getRange(), e = f(t, 1), n = e[0]; r.update(n) }), r } return a(e, t), h(e, [{ key: "addHandler", value: function (t, e) { this.handlers[t] = e } }, { key: "attach", value: function (t) { var e = this, n = [].find.call(t.classList, function (t) { return 0 === t.indexOf("ql-") }); if (n) { if (n = n.slice("ql-".length), "BUTTON" === t.tagName && t.setAttribute("type", "button"), null == this.handlers[n]) { if (null != this.quill.scroll.whitelist && null == this.quill.scroll.whitelist[n]) return void x.warn("ignoring attaching to disabled format", n, t); if (null == v.default.query(n)) return void x.warn("ignoring attaching to nonexistent format", n, t) } var r = "SELECT" === t.tagName ? "change" : "click"; t.addEventListener(r, function (r) { var i = void 0; if ("SELECT" === t.tagName) { if (t.selectedIndex < 0) return; var l = t.options[t.selectedIndex]; i = !l.hasAttribute("selected") && (l.value || !1) } else i = !t.classList.contains("ql-active") && (t.value || !t.hasAttribute("value")), r.preventDefault(); e.quill.focus(); var a = e.quill.selection.getRange(), s = f(a, 1), u = s[0]; if (null != e.handlers[n]) e.handlers[n].call(e, i); else if (v.default.query(n).prototype instanceof v.default.Embed) { if (!(i = prompt("Enter " + n))) return; e.quill.updateContents((new d.default).retain(u.index).delete(u.length).insert(o({}, n, i)), g.default.sources.USER) } else e.quill.format(n, i, g.default.sources.USER); e.update(u) }), this.controls.push([n, t]) } } }, { key: "update", value: function (t) { var e = null == t ? {} : this.quill.getFormat(t); this.controls.forEach(function (n) { var r = f(n, 2), o = r[0], i = r[1]; if ("SELECT" === i.tagName) { var l = void 0; if (null == t) l = null; else if (null == e[o]) l = i.querySelector("option[selected]"); else if (!Array.isArray(e[o])) { var a = e[o]; "string" == typeof a && (a = a.replace(/\"/g, '\\"')), l = i.querySelector('option[value="' + a + '"]') } null == l ? (i.value = "", i.selectedIndex = -1) : l.selected = !0 } else if (null == t) i.classList.remove("ql-active"); else if (i.hasAttribute("value")) { var s = e[o] === i.getAttribute("value") || null != e[o] && e[o].toString() === i.getAttribute("value") || null == e[o] && !i.getAttribute("value"); i.classList.toggle("ql-active", s) } else i.classList.toggle("ql-active", null != e[o]) }) } }]), e }(w.default); k.DEFAULTS = {}, k.DEFAULTS = { container: null, handlers: { clean: function () { var t = this, e = this.quill.getSelection(); if (null != e) if (0 == e.length) { var n = this.quill.getFormat(); Object.keys(n).forEach(function (e) { null != v.default.query(e, v.default.Scope.INLINE) && t.quill.format(e, !1) }) } else this.quill.removeFormat(e, g.default.sources.USER) }, direction: function (t) { var e = this.quill.getFormat().align; "rtl" === t && null == e ? this.quill.format("align", "right", g.default.sources.USER) : t || "right" !== e || this.quill.format("align", !1, g.default.sources.USER), this.quill.format("direction", t, g.default.sources.USER) }, indent: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e), r = parseInt(n.indent || 0); if ("+1" === t || "-1" === t) { var o = "+1" === t ? 1 : -1; "rtl" === n.direction && (o *= -1), this.quill.format("indent", r + o, g.default.sources.USER) } }, link: function (t) { !0 === t && (t = prompt("Enter link URL:")), this.quill.format("link", t, g.default.sources.USER) }, list: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e); "check" === t ? "checked" === n.list || "unchecked" === n.list ? this.quill.format("list", !1, g.default.sources.USER) : this.quill.format("list", "unchecked", g.default.sources.USER) : this.quill.format("list", t, g.default.sources.USER) } } }, e.default = k, e.addControls = u }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BubbleTooltip = void 0; var a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(2), c = r(u), f = n(9), h = r(f), p = n(44), d = r(p), y = n(22), v = n(26), b = r(v), g = [["bold", "italic", "link"], [{ header: 1 }, { header: 2 }, "blockquote"]], m = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = g); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-bubble"), r } return l(e, t), s(e, [{ key: "extendToolbar", value: function (t) { this.tooltip = new _(this.quill, this.options.bounds), this.tooltip.root.appendChild(t.container), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), b.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), b.default) } }]), e }(d.default); m.DEFAULTS = (0, c.default)(!0, {}, d.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { t ? this.quill.theme.tooltip.edit() : this.quill.format("link", !1) } } } } }); var _ = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.on(h.default.events.EDITOR_CHANGE, function (t, e, n, o) { if (t === h.default.events.SELECTION_CHANGE) if (null != e && e.length > 0 && o === h.default.sources.USER) { r.show(), r.root.style.left = "0px", r.root.style.width = "", r.root.style.width = r.root.offsetWidth + "px"; var i = r.quill.getLines(e.index, e.length); if (1 === i.length) r.position(r.quill.getBounds(e)); else { var l = i[i.length - 1], a = r.quill.getIndex(l), s = Math.min(l.length() - 1, e.index + e.length - a), u = r.quill.getBounds(new y.Range(a, s)); r.position(u) } } else document.activeElement !== r.textbox && r.quill.hasFocus() && r.hide() }), r } return l(e, t), s(e, [{ key: "listen", value: function () { var t = this; a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector(".ql-close").addEventListener("click", function () { t.root.classList.remove("ql-editing") }), this.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { setTimeout(function () { if (!t.root.classList.contains("ql-hidden")) { var e = t.quill.getSelection(); null != e && t.position(t.quill.getBounds(e)) } }, 1) }) } }, { key: "cancel", value: function () { this.show() } }, { key: "position", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "position", this).call(this, t), r = this.root.querySelector(".ql-tooltip-arrow"); if (r.style.marginLeft = "", 0 === n) return n; r.style.marginLeft = -1 * n - r.offsetWidth / 2 + "px" } }]), e }(p.BaseTooltip); _.TEMPLATE = ['', '
', '', '', "
"].join(""), e.BubbleTooltip = _, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(2), f = r(c), h = n(9), p = r(h), d = n(44), y = r(d), v = n(15), b = r(v), g = n(22), m = n(26), _ = r(m), O = [[{ header: ["1", "2", "3", !1] }], ["bold", "italic", "underline", "link"], [{ list: "ordered" }, { list: "bullet" }], ["clean"]], w = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = O); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-snow"), r } return l(e, t), u(e, [{ key: "extendToolbar", value: function (t) { t.container.classList.add("ql-snow"), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), _.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), _.default), this.tooltip = new x(this.quill, this.options.bounds), t.container.querySelector(".ql-link") && this.quill.keyboard.addBinding({ key: "K", shortKey: !0 }, function (e, n) { t.handlers.link.call(t, !n.format.link) }) } }]), e }(y.default); w.DEFAULTS = (0, f.default)(!0, {}, y.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { if (t) { var e = this.quill.getSelection(); if (null == e || 0 == e.length) return; var n = this.quill.getText(e); /^\S+@\S+\.\S+$/.test(n) && 0 !== n.indexOf("mailto:") && (n = "mailto:" + n); this.quill.theme.tooltip.edit("link", n) } else this.quill.format("link", !1) } } } } }); var x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.preview = r.root.querySelector("a.ql-preview"), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector("a.ql-action").addEventListener("click", function (e) { t.root.classList.contains("ql-editing") ? t.save() : t.edit("link", t.preview.textContent), e.preventDefault() }), this.root.querySelector("a.ql-remove").addEventListener("click", function (e) { if (null != t.linkRange) { var n = t.linkRange; t.restoreFocus(), t.quill.formatText(n, "link", !1, p.default.sources.USER), delete t.linkRange } e.preventDefault(), t.hide() }), this.quill.on(p.default.events.SELECTION_CHANGE, function (e, n, r) { if (null != e) { if (0 === e.length && r === p.default.sources.USER) { var o = t.quill.scroll.descendant(b.default, e.index), i = a(o, 2), l = i[0], s = i[1]; if (null != l) { t.linkRange = new g.Range(e.index - s, l.length()); var u = b.default.formats(l.domNode); return t.preview.textContent = u, t.preview.setAttribute("href", u), t.show(), void t.position(t.quill.getBounds(t.linkRange)) } } else delete t.linkRange; t.hide() } }) } }, { key: "show", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "show", this).call(this), this.root.removeAttribute("data-mode") } }]), e }(d.BaseTooltip); x.TEMPLATE = ['', '', '', ''].join(""), e.default = w }]).default }); -//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/Oqtane.Application/Server/wwwroot/js/quill-blot-formatter.min.js b/Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill-blot-formatter.min.js similarity index 100% rename from Oqtane.Application/Server/wwwroot/js/quill-blot-formatter.min.js rename to Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill-blot-formatter.min.js diff --git a/Oqtane.Application/Server/wwwroot/js/quill-interop.js b/Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill-interop.js similarity index 100% rename from Oqtane.Application/Server/wwwroot/js/quill-interop.js rename to Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill-interop.js diff --git a/Oqtane.Application/Server/wwwroot/js/quill.min.js b/Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill.min.js similarity index 100% rename from Oqtane.Application/Server/wwwroot/js/quill.min.js rename to Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill.min.js diff --git a/Oqtane.Application/Server/wwwroot/js/quill.min.js.map b/Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill.min.js.map similarity index 100% rename from Oqtane.Application/Server/wwwroot/js/quill.min.js.map rename to Oqtane.Application/Server/wwwroot/js/texteditors/quilljs/quill.min.js.map diff --git a/Oqtane.Application/Server/wwwroot/js/texteditors/radzen/radzen-interop.js b/Oqtane.Application/Server/wwwroot/js/texteditors/radzen/radzen-interop.js new file mode 100644 index 00000000..e92c7150 --- /dev/null +++ b/Oqtane.Application/Server/wwwroot/js/texteditors/radzen/radzen-interop.js @@ -0,0 +1,47 @@ +var Oqtane = Oqtane || {}; + +Oqtane.RadzenTextEditor = { + initialize: function (editor) { + if (typeof Radzen.openPopup === "function" && Radzen.openPopup !== Oqtane.RadzenTextEditor.openPopup) { + Oqtane.RadzenTextEditor.radzenOpenPopup = Radzen.openPopup; + Radzen.openPopup = Oqtane.RadzenTextEditor.openPopup; + } + }, + openPopup: function () { + Oqtane.RadzenTextEditor.radzenOpenPopup.apply(this, arguments); + var id = arguments[1]; + var popup = document.getElementById(id); + if (popup) { + Oqtane.RadzenTextEditor.updateButtonStyles(popup); + } + }, + setBackgroundColor: function (editor, color) { + editor.getElementsByClassName("rz-html-editor-content")[0].style.backgroundColor = color; + }, + updateDialogLayout: function (editor) { + var dialogs = editor.parentElement.getElementsByClassName('rz-dialog-wrapper'); + for (var dialog of dialogs) { + document.body.appendChild(dialog); + dialog.classList.add('rz-editor-dialog-wrapper', 'text-dark'); + + this.updateButtonStyles(dialog); + } + }, + updateButtonStyles: function (parent) { + var primaryBtns = parent.getElementsByClassName('rz-primary'); + if (primaryBtns) { + for (var btn of primaryBtns) { + btn.classList.remove('rz-button', 'rz-primary'); + btn.classList.add('btn', 'btn-primary'); + } + } + + var secondaryBtns = parent.getElementsByClassName('rz-secondary'); + if (secondaryBtns) { + for (var btn of secondaryBtns) { + btn.classList.remove('rz-button', 'rz-secondary'); + btn.classList.add('btn', 'btn-secondary'); + } + } + } +} \ No newline at end of file From 3e12910fbd8c7dfd21d8635e6b97e0788e4633af Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 13:12:39 -0400 Subject: [PATCH 60/68] allow installer logo to be overridden --- Oqtane.Client/Installer/Installer.razor | 2 +- Oqtane.Server/wwwroot/installer-logo.png | Bin 0 -> 73751 bytes Oqtane.Server/wwwroot/oqtane-black.png | Bin 94624 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 Oqtane.Server/wwwroot/installer-logo.png delete mode 100644 Oqtane.Server/wwwroot/oqtane-black.png diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index c5becbb0..e4c6f983 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -14,7 +14,7 @@
- +
@SharedLocalizer["Version"] @Constants.Version (.NET @Environment.Version.Major)
diff --git a/Oqtane.Server/wwwroot/installer-logo.png b/Oqtane.Server/wwwroot/installer-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..03942d55f1fdc860e5b0b4a9b1ffc8486102193a GIT binary patch literal 73751 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�D4}(U{_O+asSHN$sj*DLQrD1%@Ik0kJWRB zI8e03J?W*8(pI4^u?0Ah)~}7^-gwYtE61UsB`{eY@RLXzZ8m9uEj!qf)a!FTrWbv$dwKTWy*Ys{1=7Q7R)5@NSj7gmTA`U|5B>tbxMr26Y=avw~d z`Q44;|7Pk&Z*=L^*rPswb)xFc1@?|rGe2`muBRx>GjWT_hiyUKG}>k`51@2MW=Z~~ zup;!PM_W~I6yG{f7HiNfjH5fQ{3S8M=(&tmtz1l^C8PP(QFP}~lkEXm5s#Hop%3Jh zzV(ljNI?%2meZhb`Zwy3kYafCmL`V=T(@(%zogL(E}6-J2X!8v&F$l^OMg4SiXj4H zr}4`4=Wv|*Ua!jEu_o{^VP@cqAQ58l%KY_0Np@60((K84-p-O=$SXXzEjAoX<<@|b zae!JG$Q~C4+6ow=phsMI^s!f2%b&ot*q$S@$Sl&>Uy-4V2QT$?sZH~C3_TTve}j%r zN)o4~3K}y|sNGjRCr6V_yo&O)G32=#5g4zPJ&dR@JG)lTolhqe=V8k6W#iapCQ z_f$l8@!rkE6ys5!9zOUf-#2?A>Oki}Q5Hq>^u3GDW1OtiiBWO0+Po31-ed8chqhQu z8GgGLzgN;);d#{O7>&+{P)*sj5}r2snFaxg2lAB2#K9V{kw4Yg*a+w9GFO(cmk~?i zd13|@q?DFl3*Wd&7AV&}{&KR-B$2Z(b%8X!&Zf^odiMrr6uA#L+a^u_{+>=qV^?%J zUx}jGV(*(#+e(Gxdy*g%U)y69)P%afjfT8JGM$W1vs+e39L*!!JQBdAO zcphy5#VrE%k|6CmvwIG~?(VpM26fNhkuTM^nE2>qdfM@_Urf+SfD)0hSP#U+3`pEm z(N@OLc6G|k zU_K!Y0Bu&!2t~MgVE`NhQ4)@Uti6+N)sE%mETGK%1a4ITFc^Fg3BJaEZ%sT+^s*t+ zI?PAf3h$u()nTJ+#`jWp$MJY7;_xE9U{MyajRpo^cRH4;LLhLu`udi2i_c|Z$EY0w z`K!`ON^tGVD%hu3vgj`VEMYFaaeFnIH3Ewm)2bh)*i;^R3%9rBMI?R6rncMGxg+Tc zD@p2lGq&Cd(Dej9P7kXC=d6}9m<~0!hgiOdQBdvbqX^HhexzO?%cu6{N!1;JMPT#Y zS`2;o<}>67Rsp40A;F*buq7*LTyg1@-(zXzF9asNN$io&HR(t@d*c}+u4SKlj(f3m zT$Q!7wW}8UIN+&5_MMQ=q=}XfABh-Vat<8)o2}zIK)peYyoYF4>A0r z`eOL{958<{au(*Ono;k%in8Irc=0ipkBnb0s=Qw6dEQIwal!c6rx;FV1Sz!f{d-Ys zdBM(Z4_$5wxAIV)XSTWjsyo^1Kp4IOI5CCgE~ut+RgIb{WGPc2H05+ zS+|~onJ=i($ho}+L59_-6zzMBS{3_0=I5?e?EW)qHIn&>Kd1GZoyHIJL6=Ga&%X7U69F&28};Yl1=^}Q(Sk-emc`aKE9 zLG5KqmP_5&9^`f0DyCGq@@3s`S)3UQgGvJbR3EqdI~e&9Qsq*I0}I|~kia3Tk1ShS zzP`Sude#eBbSl&zE!6kv8H+Bf`ACtXlCt)iiR~rM;vGn(jd`*$YD0zHdFaQQJc22T zkmir`zE3R8y}YaE*B0A4b)?C{zQPbk+mO*3JTujCZ!27?M1Zre*&e^ zfVYd`y1_|UyoaT``>QRaUc2@EdxQb+m7h$>cf)PU6F!3L0WMVmwORsO5w-2AXVzyu zHxs`5F{O9~K28_joIJaAG;g$e>iTixG{z?V$Gpq$?biX_o&d5;ko@O{b^zqRP z__=eErK3lhQSu%*bpFb@Gij^_dTCzhP=^-WyA*PbT63&4&FamJu@*Y$p1()pm|;j* zcwlw+Ts^0`8;~gA41oxR4@A5peJXMG(!oi^i3c4LgMy(NkG&W~tmp4gssF%t6mTaG^H6xT@4XvbZ z4Ann}O#IaNI5x~ifM(Ysp1(t|Gy;E%L-kb7m;IB1OQt8=D=KX+i;Bm^Ya{qJY(IFCz(w5a;kMbXtT`PeqzeL-Y0r+HJcli?WvBC>pDU3c*>9bpJj zdRRTI8~r#Zl>wXoyhezhN(V#ybo%m6Tf)Xi&t9iGHsPqn_l=FxpQfj^ygzg{UB#k| zKCCsleaA~>Z#`^Q>($E9m3rXfl5smyjRWlxZ{SFgQG)zJA#sm}358`+`s=iL(g>3` zR7Ra|+{nehOSEEDv=#7W?j)ZoxX%Tck-7qL8#U~ug#O05B8_>6E<}wlKCYoUY>R)~ z49t$aNA+i$O)oRrP$}dm|NPj_eu(j1@13lA+;yuzvf5I^azGdYXPyInT2Ir&>B+DT z3ox`43!990L-+T5*6qhgNniToingE7vQUt5;31pd0@73e{@*X2tq zHOwq|=E%?PpiqQk8*b_qqZsLoBtL_+L!>kq5+7Ur>(6iw;|mMypuOV*Cx)icWsK7u zJams?d;pc^X&zhs*0B73MWnVd`mB|bI!tItI>`>t229`oqwc^mXO>L*JnTX0oo^Cq z9I~4V4UQ@TlqRT`em2Egddh{N6&LS+GmN^MBh0eiK&z#zelNG1;{V|5RX~V{cM#p} z;UxFH4piVDKc@7HQ_{Vwd6QC3zmTKYdY+epW^K6mUh9CtTRt1S4m>D{UHUIuVFngO z9swt~!p!=KZV-=?jha(U#c56lD;H0 zry3t5swLbblKw?V0Ct37NZ%P=QK(}oPwQNkG@RIs-A48V=l`CYYKaD^_Rr;yGBPKx zUPm=v;G8(;@Sy8Mpzr=9SnM>0z?FgAyN-x zUYlb-EhR4vn?dOW((UYQaGjv&v9i{)#+yvP(I|R#aH8WY@`6MX4Dl;<%_%O=)QF2Q{S_XKf5f+$jd8;xKPxeTm8L% zLH%O?=P8Ofet9d$9f8hl4yv&&4Hwr7A(;m65)Jcp z?xsF_q*2x(+4?BJxOE}IMkL;%%0epCW+{N{4^X!j;KPJLkcK&Hk5=$?!BPTW2z!VO z!>`j2(|ee-v}`&7kF?Q^BJnWO6|ToNZPIfy4s=~X?K<3?fVKE-YMy+v=zJfYh*s0j zr@Sed2Iz;sPgAfq@#2esI0s~;4(3dnO_yg(DR<<`ip&sWofmJaZZCwtEBxEOlAgDL zf?(Y@=;Xhh`t->aQ&r|{Eq+_b@1n})zx$}?{Y+c8^xS~=F+#J!hfWxM zVE{%U0}fq4jeom8u3trGB+HRlLG<#L0>|BG>dp^L-T-JiT>22F1j`%??Amu-UY2Kr zvE6-3+^Q`=>J$v~AJ>6pN{#xXM)LZux|#LOwf9E3ek)oWgp=bHEO&hEv4va!&4OYZ z(?U0^J1u(h)}K``W;mxA_rot{>=vr-nE-)mzQEM@+|7!+J}9_9Fxg3Oq=o?#qgA;2 z?L*;UMyGH|g~HMawEHVK+$UaKj2k7eFPq{_s6g=Cgr~ z*}SakFK4LcO&dH59xR!H$G0=bCys;yBuz?eaY4$)?k^1U4ZDr!`pSRo*nh$pomo$c z@^LyTyT!`95VpMN-)UN90T+(i;J5zN*h|LE0+84lW(*64;*x+Wo$9e5v#|bCO$rYN z4s@l~k?QKjAeCt=9TS{QA#mX!*P)!7NFgrKL*g=45qfhrwhlR)uZ%an;NL%mN#sEZp; zZsv+cKd=Mm1e{u^3ofE&BdG61-E08zn$1fyo558tz!KkuuExFNpm$2?gRg;WbYQ?c zkHSe4y@OZO%N)*~R%!zlP zvGUO6d0$27fZ0=`jGp|e>f-R0{v_I`1&?*bqzwkh)RvU+=J(6dp;yxMwFUKg4ix54Do5OZB$% z4#E90)3W>NzjLu}(bbpf^9&r^P@&Lir~TUY&r=s|mG_hwCClW{?3%&4dfwx+w2LAP zo#0#K6&B({UXT!F&Y@v0Zr^`(si-gQCesfDHL(W_#zAGMd1kzJ87ue(3B#YZt$v=p zFvln`ir9X9=eM&o4KbN_s~^taxa$w;gljh-Sn~h>={L+lci{PTe);;cUF+M2z|E?H zpX7E8e!v|3fH~v`9Dsw=fE>xHAU|WUh48!%z$I_`0dYFFW9V{Do|M?>Q-b$5<92(t3we*@A*2Rc}XuN@)&mJBZONLfOf0hicxc+8-oB+ zKA1QN{N)U4kJm6HH1_d?G*++qzgE^dQ4H|JsBk>F_f7>+YSp5?3wg>pqoR zV}gJ>Ug?BfHHuDca<2x^KSU_`b=#|o)<$^OSG_(Z_dBwN;<<6I7Hr7_Pe*pMtPlV# zNmBZ97PuRQjn}ITbam*)9_qdbrw*q{%G&Us=Mra~^KG|}-)-X6^vnJ4;O?x?zEGE( zPDiT1bj3N8jePd>c@f*P_tQBorZL`jBXi_LkAVQQ+h8JF5&I`UT&R|A^SWVFV{>(- ze=xJ881dwMQuKF+TYT2SjB=75_c`%s3l6jhEjo#+D@m){xMD^VKC25vQhJJC*Jdho3%CbU2)0Na-pFDx|FS4P3o-=qsis^TF0%&1fW$n`In zk=)HXwCHL7K@5&w4)mGFNXTXT?efz-Hi*HzGY;Oo`v3n5gP)`50S7%|Wq81dkvMP% zNCwPD-F(V4$oCVJ3;!5|JZ*^Oe-I2_$vy)8_zIQ#p1}Xad;Q=CYIJ_dH2lfT@S8_az6$y>`No1?F zDG$eWcT8Scx5sXBan(~|d{nfP^;5`-Y(an0X%q#0urY+ZQwe90*um$NW^0a8SMhkW z@4nf!qY+>u94v{~i`A~6KtUzLH5l4o45OIJ>m;TlVNA@-i^oBB>f2np`YO7T&C}>ESqtz0i^vWj)wz6}n%1Ki ze&@xk;hh=HIHd05;ZOEFXt)#CA5i;Cxh&B|Ic0IBOi9E6i2=hNY|P&vWr(!u0Wb!u z;DeSgjFTzVF}Xryi4$!y%{P{YIVp3m;wj@Ncyh&bYBZ=e+%st89QMEXpG?60-T3^{ zG`|-oNhh^FTViHkG(inXk;J4EN7=oRHRI9=kuv7O);Dj`i?IUy>4Pvtcl_{q3`{iv z9#F>DcKi??*UT0nz%3zwAO4;l5~Oefa%Dp=-8T+mYuPLML$>B&@~odwNu z;GX}VJPUFzz`T%qKmkDuOxP+5RT9(oQs946kaHMEnVi!btlKA*%XjkPXM|JNzx4J$Jbu9KM|OX@>a0&}ps^wfFCser0oIjm7UUc)NRpScCM3=z zQ7gqb#`P>+fr}7lphRkYp3w5SD1HC4tiYhXBHZT_hIn6aH0wlYkdJs%Nj-)itC4Kx zGCDnU(%HG?pJ#FHCCz&g&jk{WJF;w;zE5?+(@+Bd4#c=gcnd&z;5P@}7Z0JkoxxKGf@lbL? z(mLOyO#jsm!3)7|WoWiM=kFG#zg6BFPLRRw(L&zFK(P6p+v#4eGTbVW724%Da)+zD zX9#yEY4=V9_rmYSQqi8b#^z$udfo1}Ad?T7?yi;1CB$p4)FLb=xNJeZNBF~@8k-}w zbN}zzzFpWwetyi$d__jWcvGYG=c%R>4FOG+J8PBMOb)cF(UHqMzm(oE3ommmT-5H~ zV%_dCSwkoMDDn|tXNK7&a%PJsr-+2~3dQ5niEk&Qz0dJcAKys&AP5}BxMb&{26XUK zzYZ!?2p}4~fC$KmmL8aRh%clFi}e#|F9k2&Eku{`WcAa6#2gawpaKp(a_Niah$ z4H&No=MNBYZwz>^{<{IP0tA2|Z7-Nc1~{1-VRAS;hs8bXtHm5TE;e3I`2JR$F>TOk z>LV9(-dMDF43SRlbX)A9V7Z_35{g>N@X9{8I#CenTG#}|561RWf%z+PIJZ8aOy7S9 z{dBpqdpebjJ*=vsPN-0TPL9I-KqxwC`}-lft?3hHc}BD4^^L>^S1Oyti~uU*s3syH+>bh&gcR;m$CI zx@^~C(#IR|IsKA`IYYOZ*=v{+CwIsR@EF%W7fmGyqRddw=ulZ%-h2*H(Fso0mB0*k zsj?MO2j=S9soU#j^D7h%nYS}|;a4kWSih*%JMRBurua5fPlWfR(f&WZV$NcmpnLMI zu^vLJk1>y*ys0E6Wi$(+WNgq3-9~ zREcsBj)~@ttVz;B8&mk3CSAQ%Fd@NXu;wAljUstqmc;rxk*4Bek8FZ7m&3nDG4Q5! zQFB;QXo`z;sBv^sCzxX0QL1=T{%)PE74|@c15@u2iSUhgS*ny$bH>Lx0@NfOa4Kp5 z78WE4Z)8Z{v$6Q(m(r;F(w*bIoT$D)f(|!U9?Eduh+(-8%@PxSN0r}!CGciH_=?md zTHpo{6pA2{8W(3yRb0Rq*BT~LW-UsGW_syYyOBnw1cdX=Ug?xV`>Vgo9~y|*vtY=X zoqe&t9B4@SOBC@*i2`mMb|+7LAxS3GR3pFf?aCFyRCue1{J!oGFbDb?D|6DmeULlZ z*IazqlF}0bfU?rsVRg=T6wzHJUf(ss)uvb;#D~rv^F9pzXknUo8ef=PN0IX+KfZ{X zW9Jf`nq*MO<^@>AvyDp4ei{nu8S-!QoqbnGO`2bI45c1Qc6+TSk|~}W)K(t=|hD~?%h^Fl}45u=DZ1f+TXdwzRikEFgg7GBlUa%UW&4X&D*%cNs`HmKic<% zBCmWs{`V@mI}$E-98*talR{zQ%VQWcjq_E{^VHw;tBL8fi?6M@$rM(a8zS!q_ndCR z?Oh7R+>bZYnm{?JKoH;cOe{qMUr6`u#K9So z1+>E0BdDBdIAyF$9?W^)Xo=mV((`&KF>*g+%_Ye3(O=(3F26n(W_kN^JXCajN2g*$ zrW3xKRd@U2y$QL5gY(J3PBmVNSAV8DGNM@KQ`@%xk#k3|8(#_&Bo~iHh1%$J8S%em zvT%B|wu24MB1W5h@5=ui<1MiS_6|M-KD?KjT zO&tHdFL&Q1M-lc|8IdF(`Y9eG*JW}c1$sfi$&8MT-E8kZmk-$hFapB#McXEi5xWTs z=+dmcC)i8+gf`$G+gL0Q5!}8iohKnzAKAi7E3$v%`b>^DYATh?vo01-?qO5LZ}Nu{R8$#MkjqGiQDX_@ zc`Rq!Bo0XL|7%r96{K!7HDF?_x;B?UE%@MchWjq}RoWTt<9Q2i+%A>XbJI3UGMR4! zhc=I6A8BJR{hT3(66zvc_ zUulYA;%(u2dDvdDKH;MArHqk?P(!*FbGj-TCWF!T?>>-q_H9fjn{dvL{^eI{NuD1-Kd4(wu=< z4s8-(D`Ozu<{@h>}pZ2?zXTw6-S?7;C~FQ=#lh3XxQb%J=#`M91~q3LsHZ``88B{Xd${0~+i8{o}ViLUu;V$_gPoR_L~FWZl_& zXC-7rX7*lpM6z$2kd?~Fh!C<@RAeO@2&w<|{hjkar*ocjo}S0Jzn|~tbA7Js{eHc- z?iWFzW}6iHo~TirYs<+bZcjYYs&k+#R3u0mTV_$q?a_3RfN6_&@IqZy;VQATMC`*8 z2dq}g8!@cQ@5eDe-6T}C==Mwr%bJ3yhXbl-QZ;dz|H1Xd@Q%($vQI=tgX6Duwd`B| z7Il=wRuk0@re!QtWE=qQeD~u?Q|~f>xh$my4`eZT4HYfH`6aEn~nB8prr};bSf$;21*AMoZ)@Zka<;L+C3YZ6M(!BhFkbRK~a^hmB?wYJm@B@AHD_XQTkH496i= zE;S@hL*Rf8TycGWf`nup7Tc0*HK~QUIl@?E7B=NXus5m0xl)(8qA*_X?xSq4qC5!0 ztvv))({+hOeV7a$2u zkjRcqkPho>$qutDgdcX$p^j07%l#EGTioh>T6hkDf4AknVLHlbiyzG+Xt6pakz@=y{zL#h&jClw0iyzV6q3&W+;d5hdH&1{8S?2QXX+`+;$7#{aE;mG zEzGEChwbaT9;B$Zrl70LY<$YhikhfbS|{kb!PV>WE^r(E^SMwk<{v}XnnpCcIzLjH zO}rl@!4$|7rlCmz+!$BhGxxMnV>=qB&QBpUpYQn>+co}&8b*biVc$+8O7@+*1t)o< zML18^WR{?F)IH&6MBBPvf)a}X(vB_$28*C-dZd$nHpFd`lw4J>O~v%nKK0{%I?_9n zvNn_*kOz9xZX{KW{(D1QOD!Sl9`r|r_@DS#g0+i=h}G# z^6gifE?%)-y3IsgmZ(P#X2z{$t|Fjk&^rMx*e+ty*Dc>ZQYbNij}+Ek8)W2Efe_AG z0tjdr!K=TA`L>Egxm2&NEBJtIw<#D*q5)9bL+8Tbokf={B-jN5q>mB$Zf~G#p~G2F zOBVic;Qr$=@=@j6nI{c;ZIR^3W^Y{&O3vRQ3xB1rGy>M4?}#u%WckmR|NOQ}8X)}w zT1oJ1&mw@#K7_n;_qpYzire@3SRB6j%I&-Y9bF{EPtG*OJ2I@F2Ym~Kto%k=#!sNJ zmg6Fst2{Ru`%)&#n$1dU4hUV@TKG*Qkn|@nT=j0sF91E*1H`Lb+X6@Ycm;PZ=er zm{>)}1${TMyx~m2C5-#mk6BzNJ0HS6NCv(Nz(8$d*0VnoUj|yvlPi9ib*595)qooE>1O-ss4Ev43MrH~-VHoYazuriB_c3B3Ftgos@tx6@eUY_5YCn&&j*Pb5Ucn;raD$^D`v`uP0m)JKAr%c-> z9R44h*t<+$tCN^619+hZDl*B5sVOP2K8g1?>R*0J>zqV#HRr|<(OCuBR~yBN;NLQa zMmF2Ce@0vffb`Nsmd}mWrY0&a!4npT?fT{AZm?&c&>ItwWS-{9XLz74$KCCuez+;j z)qCSz;0f{``Y-v-904$Anzjp8FvQ?d!S2fgFE>RVQ8G%n{jUN}?HM4j!MUTl5ccOy z*l$cuiW*hxzY62(|J`7L`x7b&JX6y8u;uQ*eBCl*oL%o9UQ>TeXFH#sQd_ z9N@AE`~@9j0x&&)^OuF}^Ox3Fpts%zmdg={;pAbbiq0k_tQo0}Vu-_ym{QMQ9mVDp06!~K1Pqabmf=Ip1txBJgu zv?4GaM?ynGA$LUvz7tLhFTO4!fZB$SnGPv|Nh7;gIDf$0&$N~$leI5=anp8+w4RXM zP#$HgM{N2G8a+b?sG42q#C?J%I`m@c8zG@^qWBji-WF-H_=2=ro-acOGUq|L35pNo zty+cIPTpe}aKTo1kzhI~k4NyAy&4`jlGM;*DLRuo;`|uZ)gya|5w!AbT`1a?D-n|| zzHIh_k*H68aL@0u9v+urRBfcF^~lOk8AI%e{`6&rYDmX4t8Z`p_#adFrSG}EcZlD$ z;jo`Vb8moFHSOgWBSCyO%Mg(=u z`oQlqj1W;sDxwGZ7Nwo;S6GThF7J|6+{S-ifS?v~6d_h?-Z{>gF$R|$`Gk?CF*@qe zCu~_-Jf2t6yiJ@RMwoK;7Za&^P*yX@fY1^6+Lm3uAyxOk6id)=U@!hF-DMDzbqqgz zixY|8$niyaL6iCo=$N_*-h?P%`F)|FYh9>4_-EW~2l0t8=B4+|(_!&Y!|%m;Iok zXi(SV^Zv7$PjyMv1r^RpMVbsEZyPkx{vovP0G*+KhN00?bUl1t_iQiGq=4f<5%ah6 zmv7y@#V|s$e`@?$cD#*NxzTN^Dd+XN?ftW3T}SFXR5_InIu2*01C0|CUxlfjoG1ADl+yKlP!E)&XEhjm0oMY$6iI0gQl%Fo|?gA}11kmK5 zyx)fbb?DO>c_b%eWPASr+M6F-BZyt1ojNI`>GdX$zuwSYvev6vR{3#q5Q!U92cY(J+v8M%lIE z?4R&~PaK8WfvLb8U{y;XI=B$PYoTZ4qo9Pe18uYy05tayx{yhwAz@NO8cw2k)sEyL zt?jjSb=l-zbAed?rwNf$Mf;Lj>Z^fw!Zr|6` z?Oj*()iG=<92Uo};%v}&sr%>qwFrnT35=SG6TaX-`o9pFm$EIsoiiB6qa_&CQIA}{{mQpD7H)8|xywGMXBn2%i9c2SEY0@l!*}Zk zhsvJ^Q@t_pG*H6AbskVs61bS^N#25+2he%%f#s9)iEg#>a><4O_0csV6cNOmV&CeZ z9F2uFf#5$r-{@F^E)xhbKdbbo{u~N|OKwYv z$tS?T28xr7t*wlLqv2a`;W{Y0IFQrQQ&i9N&_SR${PN|MlA0(s0XjtrR8QW|Qd;iq z!;_!L9Fh_#5N9D`9y)!qcbsBrYwG~(OSS|Kq651y((y?A17Sib-KkUmY)|nG0p^#m1mTp%a&<91c0&*ar&v&+9|s_)Zd+Ou3hq5i z@)Y714>~Wt>8<3G>D0S$ran*vMH{7?g)4Q?$9+&$)oRquEt8_E|9V)-h~?w_Tpv=l z+{#6HZk9@}a!-}%dO$N2dXxj&41zl5yojp`qU+0lMA}e~rDvj|9 zbzqwsd%xL~cvts>Un|y{Tz{00ps+x^CH`&){K>i7k$$%$OZ>;6V{D(5rG2t@~$DEnF7tj!F9~;@jWyi!eVYR!Z zxmjJpjoH$XGqV`g5Uvw0HZp@6ECV)su!id~A~ zY*e8DzJ@S-b3dpSQ2&NmT6l^Ro7!r`92{b6+chE^@c9*e7qwu%a8Sp0{O5OE89!FD zXv6n=U83*sINoILU4VTjNOa`geXLeL`|P^jC9}&D%Iih4{fv5SCiC}l^OD$qm>cai z53pR;6ug}G(+z-j1dl|;((NxZQi4Bl1*YTnK+by)Y9y#$(y^pCtnBIz-)LENM8|@W z>V6FysY&=<1A>=A;`h#tO^;s7`Q9IVUhd9kvX0JPmy$j8e50Ln!y4Q~;lHBRejW`2 z70onjXpO=tleXB?v;+FNDZm$RM|EAo^Ioaa``Aq>Cr&CJ;CU^`_e1wf^&qR%z^JW& zU+ts|<`yNp{3nl3!+z!ah|H`s&j=j8FfbGTuTb@+z!l%b#tP4pMqB$t`U~gPYYg}} ziYSHa?hyzCW<~{*qyB)9_YjWCMKS>@e^Qdj>$K=Dla3!uKY@!l3Y@znTJFe&kNPfq z|C$d!*!eJ-9Pd@K%dO|?QW`UxvZPBLadxmG+oktBWwekX88J1>a~L^%^kM;` zpeRJ8&Bf?*U-@7oGIF4%#USB>w_EUjfZo|6MQMm;PZYq-iAjvAL+bM-(rG3l!As`> zE)Almt#~F3ry6}d#I<$#EINSa_lm*d+xqhdYYg0`DUz! zI~Eh8U}$V}4Zs|Z!puaFW@ePL;%8cI^3?d`gwVb(ou`>$`R4K(j(LR(u^>0m`1>a8k46zN)NbcGn;S4zy(lJ8a}BBHPCp~v z{-xfuXLTW=a&BD zTpJez+WX@RbW=7HGcqc8Ocxhkbl$E(()R99&*sHOk94LphEt!isu7CR!ac= z(S<5S7cz%4WTv9oeFvoyTlJuCv!w;`V@tP3i86PWrtI7`lCvBf;_2nrBZ6GTo~+W{ zXqcE?t`WVytLl&qGbWW(?tlD%< znlHn)0`!K5PwcMGw9I)J3SdHx)kw~*#?1W5ka4H6<#f_zm%RCl@|LoY;!PTQ zXSSo#P^g*097ak?li<@7vf?b>bt1Y>{nSMD;zFbWN3K~btL8gWUMXLXt~k1ouzC|Y z=^2jwf1kr9?nv8B#*;IP>`cZggp;Z;Kg_}ihM>ux77HkH5mP(1)uo>|@G6N44S#Tr zNo$BuS%m(2$$w8|1tfkDp!Q%%9>Q#D?Z?R}C<9wIlE%ZUs+w`1k-=h)Qdp?ER*s30 zRB~xT3YGQ|-A&0TT2c!#l}}WZ@dYOJbQ`S{yk_1;Mhw`ui;u(|8lhkbCO|nhm@aZX zqXa@B$j!Qd@k@yVWVFuk!i zUsY5npd}JL3;PB1*!7>-&^g89g!rQXhBrhLTO#KAzLdK#g01e<`+yOJdI^A5b7b!f0HBQtqs5N3F#P*zM1IQ#0eO#cr22Vwmys8&PjLk4=c! zZB1QlDh?9JjVUOMUAHDHrR>;KXtT5~xwyMWLS}CdgfiEF^Cx{sYIy>;K*hb>!hvbL zchS47=fo$Gt>&Y0qm2Ng+ktp>7? zY-B`mPCmfh%%%~>l@8|ch6C#R~ZES2*91FO=!V7|H2g{;73Ow$-iTe=*?+fVX z`)*k2^G5hhG%4SE`R!T=f8SR1;QBSzz$ zuePaNurq8;04)({N_1t{7`G9u??$`svwv=M{L`AOjs-?ZD^$#{2-PtIdrl1u^febQ z>#qL~ng}MWTbCfeH|-Urt0B_rgXr2K2t#c%?d4Xk6y~du&I{&bxm?%yPWURbH9`3M z*#?JXm`Q1|bYm_tQg(y(ok#I_g9nnodA$fESMB&rt(n!v$1ZrD63Wv&P~&#N=^3;# zAABG~)d6oY82X};UAb)^sj@*s1ja*z*MH-YSOg|0ht99V=MGJ4l0a)~tH~9B+~(Zi zgWzM2=2JWl3&8=r<=_AfkEp?f%MAZh?s?txc&Rt)9?0oHxzEg_O^A^@j}sOQTsLD?{h> zqgwwKMqK9DFPOOAxgKfNIMh^yN*76xNKg5}i4C9LCl2?{a`Gcoo&i>}*a-xF=0bAq z=xD8>&}RbMBwXW}8Im3J`>BLKabLyfXrrG#S0heLN_@gZKBGPi_0aR+BOfwb{uI?N zc0{@cVc*E3vGg5RdoJ$K?4f*wFlvj}^ zqXZ;01y2QX2nQWdp+_ZejO=R?l+?R5#VJ$QHmI zTp((XF;VRhIrf4<>&Xd$sQCc`UXumBU4XxT7T8?s zC2VuO+Q_w=&1pdWyrGi2ER_(VkTK+ zYZLZd3)mkuxGQrn#0N+3)pN^b>?3{U_V#upfPXh2;L7;FLf%)O+yC3pdCh<9Qgr%} zPMG_nF!O8Tdmqp-*1jJL2pmsQ z_llU&o&Ts}fb)`M+X;rC*4Ib}bPU;nW-^u{cUi4NVQDJcK_WCt^h9_Gi6*(K7I zzs{4s3wyhR7R@HonEgu$ z9e8xpV&bE1Qk(O}cQY49th1l88JFsGV@<~L?&xTq?8Ge0x(d@-c~p-fut(VXrD+J9 zV0kfiY4qa)coLJ|ayD9@J%8NeQO5=q^;H+;728d1T?{vhmJUq}SnQ{k&)?q#Po6t8 zp5Jf&vQ-Z_v(ZiiGsQ*E|G-jM!WOTZ;8NN+`C;~evG1+j$-0q|$c-EcJTetR+t@7E z|8Ov424a}Y?c34tTkHIfepzo;*5no@&trPs&_$G|WakFO13KYv`XUtziC!|~EoCf; zw&SUr&G{7*&4Wb~A(Nt2D^(*s5p_pU$aO>as#-7sO}rE@w_fRPl04u1*OFMh(WPF6 zrliaL7gRX^L(+D49kBPP)9|WGgZ37*`jhM+R)4@Y=p*);I>wI5Pd8kz_#u6L2wNY!SLOwyK}%fA8`i`cA3_ z4ub&{rJpBehu%a0L$LKsjak10C?U8^>;TkW4;R%1P<5};q3_MfrO;(5mbkn)w~whj zq(+l#liR)T=GLa>_|xjA@v4jB7oGGMo52FQ>sz)jR8=81`~sYCz|Wq!FA zjQ34ZL_<aR=1vOtlo1nku&oq%FFYXH{;V+!9ZC zNEB`lNV?52m9tVPw#N+)xy~Y0NaVvd60-n#HcV(@JdQ4i&za@k>T9EO&u7uyt#pnX zWJGl5DR?H&u;t+=Tz$Io#E7=|W8({Q?pa-LKZ`0W7HCYzu@@#S?D&ILwcc$?=u*Mx z#HV=Gx{9)1tBZ8S2j`1*E`7*Uz10$}fD!!JUbkMZS75EMS(>Q|8AUoBEirD*<`z@| zKp{VdKKw_hvO~FuQ_t&%VA$UhPdOV%E=JSove*9B{b3OHid1<=uM^+G`Qr?R%8l1W zX3jS1aY5?^-zB;!Te@E5j+(#AHjEgY6Zg|!opuW;kxCb*>&F8JXV%80nFu44y}=t$ zfjW-)=#fcF2(V~s)I%k}{JnFO(1f+|!Lh*HfYg<9!$Gbo+N#(j$@#zFu@LW&-n-RJ zS^V#!0vaUBY3E0z6HM)@o-&~1#L!HkusN7#i&|}kf|*jS**qF(J!chv7ybZ$q0Dc9 zvo}E}rXDB3i}!F)j4clITs3%bgpST*p5hrxPXFv{k+p`L?|I>NedDT-7;h>}3gC*& z<>Tqrgmg?4Gvk_{iMOwdA>QUS-Dga53~@@RjjfuO0gGunm#3NW{70`n=8I?{7^RK{VqR_47~U@l>%s>O7?R8pU+Q zE(Nhn5oF&(1+qWz;XUZkzk$eq2(To7VA5e=hH%HlCx*5-Yx=S5-7?w0AFD5m1sGoy z3kXeF8(3WzNgzQ*!_^R?8Fe*h{9rQO6Z7eRBJd`#mBCe(?5x6Gc*y7eWa}hTeVG@T zbW8rm*=l|nhGg|px2D9RXmO$Z4{V;I8YAX&M3m(W!DjH}!?Yt_y<$&n!&*`&({xf^ z`1d~WcZeEbO}+qSNdF`5Ldk*e#WmxoSh>BM35MtTiknE%y{gWQ`1|`i>&ovmadU27 z5cQ)nO=O~p1x4p?B1jOrb^r;!qi0ZxLyZEBn(vAuH(kyssw8ttJTFY7F_YJ9AIdu? ztCn#&LnO#EB3+R{__jQ~M_y1&4wQltLiK0cYOe}E(4m_3pL=BPP*dw*mdj^ zXC2q}0qG+1%I;Cu3q>}apkW?k)tdg#?%?;RO(-UYn8?q2Ff#~7Od?E1Mu1TVX$mbB z>BrQtKP5h(@@TUGjB=bEiyas7!*{fUpT-^7cmKn(NN~UW`-TEV(<9~q zEpx4$9boo`Zd)u1A-|jtJjQ0DRt+M^Zv}I;EqK4Q6fTr+=!GmWbYn^Bw0tBl1=CdN zXn$Jndv!2hjckjUF5JvCE)FIch0V=OppGd-NFCpT6?f^-`VIFl51CC=L`My!9_pqH zrW|@WG;>m$Ss#S3GjlI|Uo<>XTTM{cd-AnI&g-*5r)%y9WJJ>nMt*jtnmc`IGlem$gkS?E85|_0 z9eG;9S!VBg|5jJiXJ1JY`&JPv7i;_OO$Cod%#tS=46yVU2&roHA;lc@+ubmc?=2}( zt;f70`pW6B^B_W#UoO)B~+#OB5}xvVYGjpH<#bGZ60ft+U%Z=vu#o zb(K#5R%M7z#dYE` zhAy`1?8n9wxc}ymzp%<6Q$$&BcnQDff|4NJcNG4~Bmyg$K3>%e&V+9OOf|Xw*jU?} zVK4|P%HEyUnl`x9K%*Og4>FT=*RGCDp zGpz<;N7QQ|mfS9LmGfr0!)<10V_4l#c~d=~dssZ<;p=oQJ4i0dflMnC!Uz-sr&AwB zAvvI5{pBqo`LP9bEQ7al%g&wYcg3L}XpufSkEPws`Bw1Fs?Z=)j8kQw(r|ZD&>kK0 zA?AU0g6e7l_Ljr<{CY^mq4wVl2+_#1q%j>Gxa zb}PJ*@xC# zN?f^{;;^H4)m)%>!@*CLS6dYuU!QrG_xb#%LVX2w9wR>Y(mPVGdRp8}1xsB_!xuViQv!O1=;^ERFY%7%I?{*KQN0TtfFgMLsZ&xs9w~KnXeTiSt zg6hHE2Q814tni2tuV<*Vv(f0Ik`%cra#V4;xv+8$Pz7OryOL$$X@D$MghFFuWRwvf zw0`~OQ03mE;ym7Sr5d~pd6MJ*HVVn5IDUOy<#7v9KYDSS>pE7;z$E((drU#A|9kag z_B}6?A%xYcwLKGjH{@f&t*gUrS*0b89dqwwh6D z?$LlyCh&%Jp6=Y~gJVVIkU>vj9K4@|9=7U4|K@EY2`MQRQP+q~gr^#XPa!y^o~XKj zg?e_!A2#p$pYP;*z|Lsx4FanP$up)zYT5#0KPb#3&5b-Qw?}0O)AkG`FWZ>xKBPsL z-k2CBPA4o8vTiRoD^0%tPNsmjOC$G zug^UF2@YP3%`T#|xZvoG+KAWP3B_HI%s_#BB8c1PuNEGy)vGaFz(!Y(_Q=mJ^SxSI zBvE0IjSWh(mCK_hCPwqYn(s6k4;}V(@^IjWMk42?1qf7BPvlmPGNORK}u%pgG58WOWLU?jL z97iM02$OF50$9^*z%wS0K##+=e7eERZLZoYA28+pE8-et&@BZ!JN+jU;P)@zE6_peKg6l8*%1KuA3)`;ek zt{`dK^{V3Yd}ID=C{9r2O)esUwQpNnggs(x=8D8(C-k5ghduNYTm$_O#bPLG?+n-L zET{AkzN635?U`!E&y#;-?AYxdeY7XiNMK7>z#b9f2jsVWZMo(9H3eS`=#g^~UN)(t zS_DbyH*L}9s*rBW1I-GqXTETn2Pto5o4@wfD=aHfKz|-7=qTFQ7D-w?`~s%bSqzu?}TtxH-P^f@IUCDldm_Bux*N+ zDbc4k&cIf;joOETE+Yr3*cJ)DEkm$BQKt)sM{IV0a4tXihi2Pm+2ix0O8EQ ziur$?{ffND;8G`o@`GBwBu#n25QVY?YV-Wl(EZDI;6j8Ur=v%!mf}=B`RjuSxvi~c zb-6sAF{?KUtgYFNv$DmHW6~H%8%cE4e;9E^$*t_-=55RAI)(77@bGxwYt$|LvbOW_ zl<+Yk2-o7JuWV^;wMf3P%E=M~rq}K&qv{o4WhMWGYOqHnYR@!_$+q$iTk_BLWaF%F zobNxr`4=eoDV1#QTtdbKaV{EicE7=P>1>BMeLbWX>Tirq>-xXor~|&zKEKjY{0Zzb z2PHR}R$kE$<|^w(Un7$(^0MNR;P@2~r}ooa|IqwiApq?9UE$#S~Rml*+sTmYxMf;^xwVi?u9GSrA{Gc?%9-xo$>La%l67aN78 zol;7iCKf7WSTf{%?scQ*F>#2d-9g8}?n==Kg?0q;NcZ8&W(qWN;PSMzzlfzJgzW{2 zDbr>*CXe~1L01;ivp3T7+$_uD{Jy(TB&$oJ^Z^ZVNm8eJjkon&aAmA!CZ8EtaGeC5 z((&Z+rcS18WmG(mrP_>a8NuaZn5p(vF)}@_2G_XZ^ZYFXzpf;TbUKl3aKPRj?myrf zKqlz)kZd#m_&9Qa$uA3K92QxXBhtPLSN9d0jJ* z@1uA`GG@M>h7(b>k$D2Zc^%1<109Pptisb0>Uhv7L3^eH&MXTgMaX()A1*DCDd}#6 zf*B7TN;_4r`pFFTHQ9SYqJ$8VWzifItDeMCpKdSrBnDA`&m$yLtLHvWV`52Zw8bRn z`brLRlE|8=>8@18ayn@AyHMTDT9t{n)Grl#tsbw-YqgjrV5)5twrv3~RJg0%akk^T z6y+IC*=!FVjr_Q*o{s{l?Ek$3M24TzMYcuOYd}~11eE4zo^;GTMz!zeSxk-w!WpfC zzqNb@G`@VE3lP*&eHZDe^_~;>&sau$JtTOqA|hiqJeHt!VQH^0Svu(;=#>|^r!T{} zqkQ|JiS>7W`uIX8GrJoh`o5X+tnYO)&T`xEva60Ab;YMpd=22eX@wd~xw#*2xrON< z7^6$omu|D-f1u`rN=i#*QK4i)xP@16-zQ~(9!(GE(?No&{)}ltJMK4;-0Ndou@?~KH-j+f5S){{e z?PAT!T&EcW+zUJSGWOxx-3__bc1Wu7AE?V|iWyv;suwaoJ{hL^e$S9m;zMnc+VJWs!F{mDFSPem zOAP)$h_?@3T1YE(wcN1Z8VQvAlAT)OEyY#ZianBp;0qtbjDwVn7+!4H z5!ZEf4`|IJ;l_Fh_1+TUwm+EjkggHXf~pbZ^#K)&IoOM7Jb3aM(_p=@iR)pR-?v}? zEv(2+OeYN|&=BK}xrB$(Ffc*CkwEpDOgA?NzT21%^%foX7T9Jta8Sb7d{WZ@Io z%4WYp9xMWrAH;xT98BdP@&Hstsb%QV8j>APJY8#Xjv1}rRC!ZNR#!{&aG2w~tgKI{ zrOjpzW|XhwgZH|WftD7&~sDY<5tEm*^>KpFX|AEA4BlpX&zq>*+k% zyF%fQnRpsLKI5qPR%My}^nyqlK{-w($4dSz(bYE)V9W|jf9(|F#6 zw@&Z@Ac#>n*pCVh;Q~krSYukYSsFm%e2Ev%l^{9mIiOjzMJ*>Qfkhu*lWiKrRPn70 zRNN#V$JQG6AeGv3*uT@i?sd=m;ZB~a!b=~~(a~|N!Ah@N&HxcpFi$0b;m*q~&@?@S zPk$H8rNHy$4x%vslbA{KUH zPIfzO5bo-Ckjea>sWD?946iR1sD)jzKZ(7uQsw+)oxJ!P&9KaI_SD^S36+@#DU+H+ zVn#;nbxd@oN!6}w10v@HE?rwKjEIi#v98j7^F?1t8^qtjNUo`I$yFx`NJRCJX7`w_ zCqN=i_YqFsHj?5EW3HGAmzl{d(qN(z*{FBs|yo&3a*@{m#V3NkXrHbKbnqKmgf@Ngyi0+I0~*$*tbnX zYg%D2q1Um23;Gnipq{NSikzIn(`#T_51^-T=slXefa2yF;>8un9E^hF;3MUR!CVcd=+VPA%CcV}_OKl93fc$o6IzuQSJ?MsODi+v; zD!6(R(!rJyp+>rgvxv8f3*cJjJeVPf@M1;lqEF&BOl7G30|H`oCZOxw)ZO)!O7~H} zI0-kQ6v0CW!cfIZPhN?1*+26Ul#;sS;=1JHG$;``Lp%eKc_hHDe1OW0-vR}Qu*(o$ z9fph}kC3(A581H~4^B=61)V5MOvD!huf^)!_kP!2fhNES zKFA;Q`h%XW|JB@VBKLp~5UgH35YJGHbZmaYl$iwHiwPmThY=%QhkV@CY??)IP1U!; zm&$qU_kEwTRo}|96;}jDwEev0P!&Lp7;&z?)=QgG1HyEH1j0yF#;q`ydTGAXQWt5p zwx6(~p`(g4Q_HHVc&4?v%_QA_LhHo)FJu(`fXz&hH!2S9!gT1QbZknqu=`6VGlqDV zN!AcId2V~&pE%O*#Wd_F{jQM9XOPDK69^@7;{MQWTW^<>hDCz|9&YAvP4`;3-5L+? z*+~k#g(&Pl8Q?4qCMSswaE$aSj}ofp~z5g8P33J ze$Q1s^@XP%|EX`?i5vaR!Ff zs@w+bl7B&rWsIcN%VrCkeF}paOb<9RsjpIl+0w~uS|&q;*>0^RHkja_2X{tg-*g`?r-=hJ#dG9)3J;ru-vag@`n=eXYckzSN25A zgBFvbN6c-woa7*nIOJZKsDvZRlVA9K0Fa`2HiV0t|)cZpS)z7*Z zzK7&;^P821LolURfqBQ%UC736L~<`dl?b4ty4%ku$r;rMfT0Mza2Sh zP2ctw&yixaL>v-whIpsi5E0`Tat}ioh>U8k*CVI7@TG?1_uTY67UJ)vH5C8TLG!5p zE7?s2aO>wFOGDJtiYoJJI@e#asAP$|_awtViLnOa=?N02wBIXNxICNt0dZZnACaz> z^keE?{%8GcXsG*jCc2!Tb;FG1G6-Sh7Dhu4u8zW%v-=O~#2%PFK5(qoF~G5zH3(O$ zw+j#Dy5xRQosi^zTqfHsIr6>CHKk`pbV71LXM$=)?q(Tnu>f9p)}!SQG93Do;-7$CJqJNEAXRR9+0xY3i-ITX!gR7qhJfDBDO)0 zGkXj);TVWPrdbBu;1dK>7z%riAXK-pUNThvi-QC=-|wf^lT?T-dH&}p!778~AS3qU zi%Oxvl-X8AHR=g!(`PnPFB@K|g`<3mtL7>BXL2d@!&BI{mcfniBhG4~$xg*J86IdGzkRbbK53LcS%8La=QC<{Wi;%I6`i;j~-^lrG+8{sTf94Dq8b!;9 z9-{*SSOIjB!AG&ziG+6|$M`!~U&H=jUKM}{SR`g1tn1ZRm1W{Ak0F(VFLSTp-%-Id zl*nnz;M}E8DDI7>Jw?^CqJju)d3dx{>#3632vJ=RNY3zPa=BruF4I4fHo)U@-+Yb$ zP7OF3kl}`AQ){b=^yAajFKj3^E0DK<$?_hwAbJ6(Kj|UuzP-EK3gvXUYp(7K7%b0u zh;l`dopkX;?R~1&Bd6=?4EeqFrss{~dS?-JEC*_Z2|fGb#S0E(!)gNI6uFU6YkP85 zS91v1bIyDB(oKE;{07uABlaiG<0})Z%n7D+0`1y#{z@GIMBx+bKQ}>Xbp+_j3UplU zhc~u`zF;1B05V7z!oMu6vFWrvfr5A^BqZd(P-qRD!F7<7BCa!0;+ktQzl%6WjTT!khiLTDGK>Jh>Fvc-Ia@9JQd^+r-h53)gx zg_!OX>F+_h^zRR0|3a1#`3I<%>kc=|3l6SnD2r)(y{Ct3L_~>T2ZnKB< zW6#{OzsS!5mf0vmvHH5j>EqX)tw55BL2^PMM79&`vOY2uBgNE2P3OKr24E1F;q$I^ z{I(aVYL4GTdK(WqpU{iCyhqa;IeOl4*GKF&%RTub~ZID`w{3nBybj za)JgeAQXtZK}aKYWX)yzcrT(TtDXGrP*tCFZ&! z8dW%WGf0dD2W^iQExi4G!1SoXwFGPjjS;s~QTqduI zTRzY+;al3}mSqM1MsuakKpS)ZHTc1En&vzv%N~zk z@v!w#>zIEXJ#rl*$X^^;;v2HG7fW>pzheButIWMJ?Ov zVUtOEgljY*|1OTIAqhYH-oIJ)Oy-k&4drciPQ2k&CIqe#&?5^ZK@AF`z-+c$Ra6^WEC8@WF1F;?fWzdy0?LK2i_h;m zR8^Ig;!eTGClL1PcW$p@p+Q3YDW_fGDT#&lyO>^uVdu}uJ*+05p=UMa*1QI8T`Gi* ziO{bwu(iy%^{XGBZ?Bul6R)jCa^ht+3L{seC>VzI1$c=f!l_6j%SP9qeFZ3+Yp!NL zHn`E=JGoR_5btCLyi*7ZtU{BkXt`<$f_G3FoXI&Z=dBP)+d7=IPq!x(_jjp~w;9!k9c?sa z&Y`1l;pu4@44sj00Yr96&sGblz|6XB$KFfo2qkb!>10A@yxH7HXM!;recfZR%>Z(X znJWz`fud>J5gfP^?C>TfnwnkOG*#*EJ)|*q<+-IO9$Pt!D4S;y+;5-cNbcv0l!h}u z5b#GoJdkX_?tN8x(Mho|fIg*w=I8*7;4dH?R6g;km(7Z0?*F^M0u_Uk8BD_Z?*>La zP~rPY9%iN&TU8?d_Qy!e4e$}@WMg&d(Kp_%|KxyNy({zZ>3LZEFDg#F)Vi{Y67-Uw zO|^u{SwBSoWx_{zUeB$)a~5<;kfJ(Af{$=_mgv(gQRZ=CK+f%BeXtkamNVk z%bd)KQZH%v=9n{7h8o=>2Lx}Hb-^aU#jl&^0vX#D-M0FqgakvohZgO1kF%UKo0JG| zsS5oM!3koN8Ehre`s92(l7KGagw<9Gpey-LO99KZR?8o~!a!zPqYO$ z8FKjA{M)zr0b0d(s@&!;v2>&hztEQOL#=eA zS@%wETln^3n|D1>l#XvEv#8bsso7K!V&>v){dl^$`!+7d*b1V_&z#$woK4F2H(c?? zH1&^9ng}}W!5}hz5m4#*uy^Zy4|=5!Gz(+y2e4}WUtBku5;-_}EalFOq@($ORRU4; z)z*%%{pXnn_&zG&!EUyD3MOzH6fv@3u2;pYq5)>Q1t8^zkoGQ>IT(j*3xPid`Q3@d zXvrtlc`evEW+EAt&eNy}GeRsXGO>EN3_6a=m8(KgoO26N36qhOnf446ZY2za zY&y*;t1+{9Vo{#>f=0JeMuKPbXGNnHm{SS18cQ^2Xs6LjGLEuo|i5oB3I7n?hM z_S0SHPeZjW51KJeaM8EdY1c#&su>WM>GS4mV=Rx%CnRAXC_T^e;Vnp;H8}hXH(|+- z1}R)1L4AGNaa^?x?WSkQ8T(*5o%QV_?+1Rcy{*Gmx;x_kBIGI!@3h#`@&Khza)d>O zbdvDIu^U5!Rr&j2jR{E$ggKmo@PPr%(aL#_heTFH%>e4dkgXhFE2Nf{eq5Wy90*^q z^|$V|j_=8LOtY>0%?@GuFd>2;rr^@5C>Mo(Ioyj7!Db9X1#4xxrhM>>B^TBGQi~5XijDJh z%dw)_&A|FFRe~@45L+q9{lKrA9v4^6@iUU6VfZWW`{(Ow@@4$i|h!X-cmPgQH)Ec6Fqhu=raeW(TC z%eAs;vQt)7Js4Vpr>5AvaurO8y^@u5x6F?g<=>Gjaq)6#oCvIJ!hKn48 zJ^^GSmxH5fq=i(?AUx}L&VP3MMfAQlW1GpZSd7uvPqW3w8{JAiUO7X z#;MCo*V9W0wmQ%NG^(E3y8=7q3fxD^QZFi9fX>0T-c@_>v>`1NOOVd5JsVYg(TT@9 zsaO%ak9ZL$b{)`_aIexTGK`?u$%xpwQoH+vdZ4>U{=sKRB{kdA?{&{YhWn zsF_(uT<7P_{$LRB)&m-P5PaTGbZ?CeT4WjB1Triy>{A=t+YI2u`B*;xAN12<^G?=M zr?i>@_7w6%QTL5w<^vr$~PJ%D0FpddN%E0pcZG8^65jHP~)1ds}Zw?PS zEp9UhuhQB0ZPR8%_tFOP<53veJw+;ec)`jJ$b2gjiYN0F@ffzH$OgJUD`ZMyqHQY= zfC-R}Dtrag@H&8>n4g^PhF!_i<%j3O^;Ata7;51xMEUQ7jEz#OsvdjOHZVIqDUOw# zi)M?=5-lRZzR=eTc-``Z9CaI9FSp^7Gx-fF0s}#FMN1)9cYQ_@L!(-z*V=;a>Mt*- za%xJ$Ce+Ff4QwR-bQ&%#)BmQPhBjLm;8@rk6F1#}Z_#Hzegcgf62PBtAg~Kz5DySt zyLQdu|5`flc&hvNj~{yr+1nwTWbcq;ob2pTlpR7uMz(Aj5hB?;PAJNXva@%RQCWqu zGJn^(zrR23KkmnUKb-Y>zu(vUx?Zp6>(a$eRl{`4E~a5G@D{ zjSjf3RKQ~K|G4H8=iOAL3;=~A?DSy8yUC6u17@obE4Xm{^&lZ$w3&b6>sP%?$PJ4) zPjW;(4^8YOw5GWIp{jPBaP^(u<>ofW9+?aPT~~@wuWe@P5Tq!cD~weoo-}7YoJ5*8 zS=XF`JZMuElJ_of zE~>(BkSr8zX5;(x2hgY2d_4ZPN7)a<4L6-e@M&LuK)n>S4WY;HW_}kY)y9J0(=9Z; zD`TucLEyn*EoxS+cd~Koy!k!gd`N+?;`HUa_azJ6-x|Br^JSem7Qd=v@peSwzK~db zVM+{zr#_S&sAnoK4f4mSa-YXFtts=6Z?28`U)q;OaPwQ9{(XIni=cXnMggS;H{Z1A z-F*IohG5KPrUs&WnbGaiuS>FV1^u_|T&CE$x*P=@UQi+B1NS$lVXBwXdh(}#5E5eH z@P*FO)xBCVua}MR?{Jr5r6dB9CiM6~8Ds~S@9oN4r)X^JuMf(@Dq-ul1}%%xEaQ+I zPytPlw16>PnR3u5nPL@WJMcAvX;%g=W7t2i7trDO8mP%YNUAj{l&1wYhQA^^q{}~s z-?66|{>&eU&q-cuX78;3#_Psy#GWnptg}&gk=U;%zEI7?UNsso}mK)(lqqd6{ zD2yvm_k%9Zv|sDr+%NDeI{{=5B0T5bm%r_DPm249EE;ox^Bw$Xu3b}L=7p{>T)jJN zsnlK$mnM12zW;a(l7$p4d^kLb#B4+PXRluri!qm0w=YW1r=U7uDAXfbd!MSi zB32h%uAIWlsgA=5v0NF-K${oGc1uwG@#KE`R(K@?oG*sp`dzKN0Txzl{ki57KDJg> zyuzaaPQ-HRo1&~3$vL9Swjijd#bVXO*&Ie1&mwk>&&h_iQCoeYn4|D$=_ zM8xQ2iC=<_ducH&g3oA}PWmfS!n@%9ealw-8GL(t1`obe&2Q|515zFKd;qsSc;fL; zk=;|4HNQd-q?Xyi{f@7pjA`UF=MHNpxk8$e2;)Rh6ner+w1f_f?}LTlgG5+tj5L)u zC-s!7q%+Z)g2w&bN48|)s9blP-v^}?>t&=|#Sd@SJzHH{dl?fSO*B!rdKh8^VEZ3E zD&drykKFuMwYKYhTLVqdB^mkVGYFux9|X?T{Xcmm8#G znBG-o@p=hM(O!pUt_&?IEJ*pnqUST##TXU6R%1cz(+GnWi2K`=J$}OK2i0#zM#ijA z3xt(7NUFozrEaXA*e53t?}A}1W=0r#&2QH$DhDJ!%W^9@^rb)g&&P{T-*CXyfh^Xp z!=0w7%wnRXIZk%;p`XT37@`$OxsHm{y=K9BE8ljj4;ctkGY7rS zdD+*=@etEb+{v2s$AZz~c{FM~e7f1R#{enKy$V|t5Xz+A%kO#SOBWkT@NxVLV({Af>7v# z!Ab_LFE$(NEp*)~K_GD36`F!qY^Ii{DGhfotOy-hklaY2HtXo6t1UBB8o?kkO&E2D ziHRv>>s%{rxNd_+-SLatEg{Ma@>iK!v+=l62@uE^L-9~nBQ$8=F!1ER)k21trdo^l zaN`J2qYRyk^zrZFG5@77>KjB*<${%J6Cy3pSdYSYFo>IcTK0ly8QXiFTOT?&Q``Uo z1LJNeFL}~>_2vHhE8Yxz@gGXw-OLNw0ezytKn0+jK7(WlMQE}<1;-N~q-PB<>gj(K zjx?+CJUy`OzsYe+?;GhKJMK4 z4>WQ4pPe!LKHB>0suiF?u$8zuKrherIIE-ks#CL)u@$Le#VSXS^hlL#pHCH?non8? z{M|Z`E(-=sn3y@V9<*#_!A}p%6Yg)n{!p{}Y(=mYQlxT24F+rM)-8_z%wy0&BL!uY zrQ2wc_99{oFjmKKC2rv{9!Un=Q^&FH4pLi@5BqAhdjYJJkBdZj z%{h!`RO3cs>Qf4g+A>C%Ms`7Y5& zh;p718Z_wMSDW%Bj#2|%#_s<92W;B`8%FyNGF5n$LE-wWfZupn&#-dP&5?MJUod~v zxbC-WeC?J2)r+brM@*}b-SG{rR%s*r(3=7dR}nmLA*TT|pU*ms?)a^}doP*l>tBE^ z8ZvO*rpq^piMd?=K!dae<$8;lOJjX?WYO@}h0>{$mDC0&>O`wJxfp&_y^oFlCX8uf zD{Gns1N#I@&12OI8Yw?B;1|7+Bt|w(M^Z$qerGoNJY6(tnfEw9E^`Xsm>@a#AO$<}NuQnmL}P z2*so7tEy83la6pG&jv|Y8o2i2V?Ul;+NIbN@IzZ15OW0#YoOevt!_`*_$7uwc7`^z z2!fwtX>R)m2N6`b$Q0t?@WETg#LvlBpaOy6S?3}Ug2@0--W-Gtgu~te13=!944oU4 ziAmz3+KA*x>)(N^#j^w=KKW7MP3zLvo+wn zHK={R%#3d}*9WB(gw=rCu>;iU=1O26AA^XG#DJEsW$75A4RYzFGJ8Ds9K(k()=y*e zJ*t1Z@{fxktUkn$6}t!+X`~3p73@JJ){3<~{`W%IWc2Uw>#{)ilN{<+cw(S}c_jKv zKgCHnffsXuls>Gp$1O56C79#eMVqJ7GS6*Cbn+6bp2)bqnL7sZ@r!8)6iUVBR1Jb_ z&cT`@M3Ru4n?U|*9AeZEXifP#!&*&N#C3Y;CU!&s*jyLjUO#^TMkbj$w;2rZnev=b zg}_N6h3+N51VU>ztj2?aP1}7E2@v!eubF?CClrkYr&U)5N6o2^{!KxU&{GR~Twjy_ z@ssLffw1n=nZU1J*W9=M3T!tzD)2lBqV6qdTWc=Tcgzi0b&_~Em8N*R5rWE(x)WI# zlwjsnAhQs3{{h&aKBWuX;ABn=2Q3XK%5s8_QK9V(2XKLc;@5L|HVo{-*zk8O%JLsv zX>>zQH*RgcP<-h9s>CJO2pw?NP!{jATX0&ULV$Y3^LOe+_y_ZP`$B?i#9Y^2KA9OE z6(7Ds@!)W>J<9IaY{Pmq12yAWCTl`9d#Fv`($h5Ra5w=_<9N<+Z+KvOCSR zs5(d$JjQkn3RmZhoNX>hzD3~qszKb(>t~o0YB58ubvjRT+mUy%!RVAK;mZEFD^3g7 zKW;%)44-c*1i%H|*m~{*w1-`cjzk&BAKAswH@pBKHZi`dL@JD?t-*QrLsw=#{VMdW zmSN8?NVlyLbw!mI`_Gp}erTCfuOUuYG2I55#i+0PU5Uh0*zB`QP<%SisIc|LMOZht zeuNRRm%-vu#qKEaD6CIfg;T}l`w{Suhke2Mr^qHb9plcgrQBlb+&H%Bny>R@=zJ^(j1Jp1-}OM- z0}Xfc_&CJma|%uK4P}`bIh+@1$A0Zu3GJ>A%3B^vR%XtiZyJqm9UK?J{B`5%zm>G* zH}emy7GX&H63}1JgI6mzuFy^Ql4UIvjpz(J2`4+aHz8Rq-NBu!*9ppR-Hn%z*(a*jj6O>4zBW=0AQ}Qr=cOAQvzfB9_p;}8zLVBFZ|57VUaz`CP6Gr;+vv{4 zqXjnx{-eLpa*YMO%N#Vwi+5}3#+BTZxY)IsT|`Db4g4eHit%GNo3>lAip41`EvF(> zh&P$=?Kc8koa-hgc!?LysMc9J(u?fIQJ6AW*{~1lg=c#`!!ow54=*CrI~P5H;<2?5 z0&*SRJlHQjL^0fSh9nb6f^V>J7R}s{;IqQL)&lJS$jAh5Jsf4gxx@CLCPBe$C=Yv6 z8mL!7UI41{hDn1ax{3NlqJ{%UA$5< zv1JuVs-2E@*Oahl*9kmmJ=m1I0PrLB0PzRjK>mijI+7ZyEQNuWH2y_6+_dT#SMFbn z&k+&!5mD3>*`DL>b^8ODT^U{EbWGuIfEg;Am;{#U<<8!RNJSLZDt-bpHFtR6U^oa@ z7*`3tc@IDL5*ns8!{{yoD{c0}cD`;$S`WvR?|X;B^G1Ch0^c=q1}7!JL)(hA&TqW~ z&1ouRw3LI^JC+8)Ggwui`grJPWp#4NQlmzqB1`aNWO{bV1aF0b*I(F25QG`tAifj9 zQ(=0e^qRjy?zzrzFn`?b#e2P8-z|zTp(_=x*(Izlaa3e&vF+(hSubY@k;1u;@2f8&jl7y`Tz4f*n3H`=G-yUY2>J!h6x z{gz~i4Y9tlxzW+lcOaJ9%Z18v2c#IBAz(jc#P;&&z;l(Ng$+A`*$k8&QgW>87L5eE zo08larXJuFYgqD!LlX_jdDsPx{h)&gR;E!hgpv_D&V1+69sfa- z3r8`mv$-^T^PV$Ox5viYt%wVtx$wJwOwY8~h^ZmE+_Vzf-HYIZi!`Y;bumJhQiW?J zCRY!sS`iQLvy#TkyGv}d;zkXAB7Vw|Jln9-`aDP49is$G3<>-Y(}AxyowEtyN@Huw z6ebvixy+4HTy2QE`m*JsCVqmwwjxKO5r2!?o{FM_7T2h<%~T)+gBKF9da5j7QN00> zSQv+8pkO~bs6rs#O83-n`Sv}9a8JX8oq#Yh!Nlg(&Q%nJOXjO=>xT(d|Q^RdOLJt`-&1 zVS9e^@9(jm{94g8Xf5tT+*h^rgBb@?e%kP}vq#|82mc-L;s{_F9iBb{&4KOf8A9Kx zxd2Z4+#6-R+{d5u^M^J*zuDuUz#Yfw&_d_Q5h80&&999_h_h2fsqMhL?9~>uuyqxo zg&u{K{QtNa`0Emc^uoOYhTiaa! zBJ{}Mg3H4TmbZ(|&@(@M$*)v@R{$6GpuWl->uPA*y z#4y4Hb^_V560?rg^+Lm2@6a3u@RH6`G)jK|Ex$qml)(pW}ss)d3G7C*Yt>Z0Or$o%&mX zirB4gm-s3Oz{>FMc4U>fjJ8K-)Nlo_*q=+_yk1oI=h-+`{CbPMFg$hCYTWN6zqO!O zEZWW-%vQOjKQE;^EbY;jT=TiQa<9*gQwxtF&fbu;m5AsvkV}KJOZH$yb+84knP4as z12)f3+s-qO!NqHFc7E1&KJ@%*h%(gWYEXhfGv?-(XV2Z}C=fn2uh!zi`=1Z1o=-_q zz`s$0Ufnz=<@dp{>eABK3Iio*s)3LAxWG zzrlh$jpY^Y0mr9`33{W$e-Pj>AT{4`C2-wpy2JakpDsQ?;Z z`QPao>>Z*A6;pH;!58N&IbqVjqcr4l#*BEk29M}wH7_z|m~H24v)!a`_RSR*?UEhM~|pioqtGL*YRcty&pY|FH~sz{yMzD_-ljPO}Ehs=@O2zA8QhrQFKT z!JIc1Q+qe9t^L{h6jMmOYa>!^c!y}i9u$xhZ8xyZiHBDjYZj$*aj8RF9O6#slDlo- zF!qBs*4Hz@#@z)>r_p~y&g~Cm5y}zabE^hdE;sx%aMvF8wb|d>iv?Xo|9hBm2SSGF zvjZvJjZbVWlP{Cff{cnfI?%jYq9;0dk(GQqCKymP*L<^@hEn29ivE?fCb-CCD%prgw*N zVn{dCCo%=~-4M-b(z+BUWU8O1`0tuqyax}yN@e^3kkHKEdMgHB~AJNsa7 z{r(Q7+ct?2RfCKjCG`gExlZnZX>1hFr@w#VjtNkv4*uL_Eh=*c$NKbl*kJEfp8ukH zg5U&!dBG?&{I?fZdeauVqcmj1QuP{>V>U}q_z5rb-?7)US^BPk!~56{L98th!T%V3 zYV(ZmaG)fCR12mt_uZ#!I~swJwFf7=34|kE{o6kQjflI3{>w^fdpRr!77Wx%mVwvn+VZ<$g94`aS8}(kRl8y@|@fZhWW2rNr3e z*GsCaWKYLt)w})(j5bbuaZ;L2P(@RuZVwYqfuNxoVf)@Co2{av5j*XE3E-H~*Dhnc z;38=#8{02vX<>t2&LYettMb5ce+uJ@*XiDD(ROC9eN0IeTE1v$dCS(eFt~i;`SthH z)5okqREZDCJf=7C5y^Ipd7!d_)mR6=){OGW_O-ciB}ekwH?B9uXf?EohfL{^VoviAY54g=GD zIQHhCAgYJZdjW8Z+y=YF`uarWNBC#sp4~gok920~mtnlM3#3F^9`nzj=$nQR%pE&3 zZ@zFTzu(qPkhpvTbW`a$w?=oQIesH?9ht8}sP}xF`*fW6d^BEkDAkAL7fm{2J`C|F zV5Yu4I5?P_dUfj+FAWJBVjQF+-+^mO1v4)s#7Yz!rJSCg&gmHM!$ZFTgtN2kYm{>K zm$=Po<@A;eJ6?_HIL@~ATWP-4g5}nSke5y6^J}nd057yvlXau}*Y_3+&@U3n8LY_C z(OBEqxZ%lLz`x911dYG+FcVC1_cApchY-svW%mJp_WlTnW+s8s7Y{i0d>2a?{)bZ` zhYD0J;cvFVMcM`{3keJfX@jW4r~-a9Tjo;BYSJ-DFU^v$rN8P(u4EW@tz7A5{hJID z~eoN%gETO{X+^`3+R=Yy5JH~72P98fno!q2Xy&T9aSLI5a}1cptL)D2otrFWEIX@%6?>-Y#=vHjHH7G;on@h z4s)cX{fo^i>1=T&u135tee~L$2rr1-E=sQfDHM4 zz#3IrW!X@X;r*2v1{HkR&`_*T2ORnYA7NDwudPLmgM(k_}fcA-Fn37FFOQ zE(ti?BsR3A76>T5#PFvq;ywLf*Fm^{x7O)pYGH-c3Tec%B=tMY9tE>k>^?+tqO3K@ z>fJwsa~lbR%V&4*-AleMuw2#ShDSqAIz_iZIv{x4_Cl+^$nTFGqhYBe6od3d)Lo2< zpYT)|l6a7CFWLn~?a`3jPgV*Und+;j(sw}Dg-u|`^;yrzyX}cijnCagPIp;7J*i0h(9xgv zU&>y6L41?cy>XeA6tt5?+5!{SqNUx-UeyNt{NKGThLM@FR@Xu7bfp5Uw|Fp+8Fa+D ztpMO&ZB$NN#enM*?Ff&v<4~T>EbOj-fRQg6IgG`D3_+Q)?3`}vl1&Ja%9U6{{9hPQ z&pA_79cg6{&1K9c&k82!2}gczA0i~zLwLe2ug3S|iP1VNuK4a{O8^v;cT#yn0s~Cl z`DtH5cB|K}$d%jtQB=I5?ABLwv1+u}7kPD7Ngj7@JTZ5-O=FEYyfHiW8JR0dwc@Q3 za&hJl0Gjp+&1Y@#5bx4Q4XaJ1#w4ZsG2`%2Vbm}oMh?l{GzgU(<*~rdjlFCb@ZloB z^8u1Bf5A%OV&QM;=Yoi7k$w!k1p}ar#=B&D*i8L;8_+_frqz$3?F2TG+EXL?;`B?M zVtsI?jA-#-w5Rrbt9-(Y{HYPdP*y$F;`vlEwnpENQOquxp+k8gLJeq9O9*X4+G4?C zVbB_+8_@?V-}>_Nue$;5r8sX5Uk}=*eEyHpPi@`EJo8bHVt7q_Yu#s?AxO3UXBqIj~DcWm+bBJ2yxg1R5? z$K`Pm4p8~3rm6tsuv;sWSLiDdSdgIfg9Xt)~+|HMV}D=Nl) zZPuGbLF(3ALk9bxJoGize6pKsSU|+6S30JyhI)|e`tMK`wXSH15?E8rF*mH{Go2IU zP(w3)NMettsFz4hTtkSJSc|@4gEI6Nw%Fo-isrug*q+}x+ce%B#>~Um`Mi`{ zE&QnsdEeFVuZopF3ZrE)ch3FUaOuu+=#Ul>2?-Pbtml2<-*i*1*^b*FU8Q6P&r1zKWC7) zyz!&Qo9nNp?l#odKMPZ7|KqP{^0?EmVeS|F##Ln%=#^&v;-VD7M4cFGL&;EbbX;-f z-zs`iTcJRO-_Es?Qq(qaD#MW%_~I?8>I#%!#xU$35FK2 z7V?s6Jc}*MQHw#YyK4}u?%%!0BDsG%GA}`qTA1y7_<@j|?BzaU)SDQcN#)MO1sjAd zgW8k9vFQXCX4?t;uc49b19Mjb^7H)tMBc%D8~H+E447$jW_FwcewB1k`9xF#soI#lPIWxZ!>-3OKQm!ihdmw(}$@>?J}H~^u$X*tOsGdO5UF=`orF?-Ae9jRL&tmuz`Dl7jQCGK%2@e^yeC5utqhnC}v@ z+rd`(t8L$%e6LqxMo*ny+8D9N;oF-VB6~?wB-*E<<7oYOYT0PhO~mcTAC2dEIJTN6 z-$o!fjE2 zYStEiS?7eb;8a6l)Q+^gRlCMCRwzigY&6Lw3-QOv@CY5Vv;423d?br*$OScuC;r~~ zqF!6J(*AKaW%Ej}>C-g6Hp!JA2u7BO{zi!qDK`AKI^(uZG??>Qh7%)zPP& z5K(mTXWMyPUv~-&{e#A!gTH_LdAGw2r?{y_>`B1=D_O%?A`-Uwza@zfOs0O!PG{ne zf7!ShmlFHBTpJ~0P8bfn%(CqjT-Xtc*GoSm4OmRKi)(bfM73t5&z=lCsYrB}pX6YDMTMdCa%JZC0d3nd>Za5*2~Jg><(@`?g@<2-fV@O{S2uG;WP|F@0_~dlZd1mo|qs2drK&`6$JL4p0b(^ z7B7pl2`#~^w?E0YaTC)MRXP}EQS)Ndqn~T=Do-ZaYvmr=WTuZM>BW6^=se?e(j&|@ zc%@F*vQ&k}L1dXdG=SPgxrb|d7sEx~r^FRjl{5}xK#3wzt@ zX|%gW$IICf3|)_oe!?Fr^U(~Ql^A17&1l!K-12VcU-@a-uO8~*1$D<>FIm~%4^E?Y zDi6}bu4`K&EWZ6*DY{g%X3r%cpe-OF9IPu9CP~#J_VW$OCoFMYP7c|!gt4m(q`dq{ zqbp&9yB9yj!#gkZNVVA+lcFeBi_0DH@I+@x6{G2`{UBVykS#=CT;p@nI=4%Ex+8x4 z^Lio@VhYhO2}RDE$Gj<&mQj`rzs(gX&WfVQ)rPNNx7Nm zUq@L;_Y`R<&!FRm6W%6eP9&w~(&%WqNvhZdXza&+P2+gEHMbo?O0GWFOF8my?F@g0 ztsiAagkepAL_*J>Cq&-iEg9r3F)E(~ z6~h|`fE87=&uA19h`)y`jA+ve%|_~V(cUCB1?dRX))m&l-PaM0*Ql-yPRZeYRh4g* zpVk^OV`y3fWve5YEDkaRta*DS1kP z53YVbga*C8;GfbFQ}!`()6*smGMbHPbN7rmQWe77gi@As&A2;vJ|)p6CMYxEw}?jF zxzbHJpmJR!G=@AYf!|9l*C{&U>zJQx-IAVKQkO+Y24m5_>Ucxj=jVcQIv%w>?bLFd zrG*l~oP3(is;3?2n)z*XZVKyv>2;`+snsH(Q`#^IcjB+7Sh6(?Yz#y*AM=NUvIMSfBme*)bOJHVEn47 z%^cGqQ~rR(0QD0^nt!Ec%*3=iffF4*??p#-h?Fj{eQ|LauuH3=QsqA7ZNhzTM)4wo zP=S|QU$WxW(*0rEC@qHh*Ejic#xtbf)63~234JI=Z@FIde&Ta;oiFamlfOUovQ<_{ zwH}!V-pC3Kn<{h?*Fei^kWIfCzr}O!L@w66$^6C0y|)P?_fxM5*E#VjxVTqRtS}Kx zezh)H{pPJDuOY5_+S7LJkIo;}fa_D-Z5~UNWog&(ZuNf7%;Kos{NPMZ-6(q^>3s>wR5XLiaEJm-jDtAS0*EPFoN|3LC=jk2 zB8j~G^M^q57)&Afi2K8XQK84k@tJDkUh9cGyC;VBgIGIDo13K&f^%J{tv!`P^* z83h8rZ3KkxcC|(lBQN;QTTVwgaw}i zUDl$()#Rt>yGWR78~$xgL-P8rky= zG71R@iG5uD92;jNFwWX#?WaP#IA|}PckAp=W*!K&=Liv44KSpDJxrSeZC`$2As$u{ z*`FaIgmoM$fzU{_*t(OLK5;3HabIN18AR5;zPOgToqPmHzAgLcP}+DQYB?VxWXtC( zCRuf*5$TZ$k9&JAQoD-ptGCBIAKB_Lbn_EE{fn6EBQc-5(dKza1EcpUbfNG7^IOU9 z0jvFRk0DO{5usP`dp&{gv|Q@PSRcT{)4i!cEXfHfduS3djfz488@yaUKIaNCT)z1{ z8`wP@qT8Aq7h8r%?+c8+9>gb8PO-Cf|HLNVK-W;*7xOF{bEk75?MB++jO_)1?Q_Cb zzEl;Awzy5a`J!EWXb|Pb31KYHlba)_Bj;}Z7j|!UZl#Ehs(zmN1`kx8@)x0Yk9lr4kLVH&;ucwlYO4)k9T$UqD z6H1jidVVujIE6gr{HME0W5U<8f$Qx~(|^1R$->rHqM~kg7hcItidq;$?=fVR@svSr#WRtc-SP74i02hmEF*I% z=7!31P8Jz}M17M!dWv;2vIlLePGJqJU=;mLRH(=DR3%AH*)9G`n8%yf7(l14w41Q}44vWdr>(Ku?touBhw32B* zYfl-Tuxp#YzbsxQhIh-so($nsXB5}^+nOQ_)nK1{jebC2Y+;vu`}pKu^DS47s5Oom zlQboc;N;&qEBbd{jXydGY_B1JIi^Mx(1@7$n0Q&P{VduTeb|4fvuNTb-Rftbr7phjFKMy`<`iq?fGA(E7>BRc9U*j8-_?J z66l21nu{~TO%oDmOhX}=qz%*!-7}}k3W^uiKW>+H3**zXZ zuI*T6QlfC@N_Fc+#3oPibNqp#!; z5(kf>5c7mb_d;&umY-_Dgb6>bB{%@jUoT_H(PHFx9;??O2-l_F-@GRhx0|~a)GfbR z+bIaG`g?W7#Zj*J`rd9CnGmbau|7+v9u*d}L6-ykL$kvdWPjapbV95lhn*a(`pW-` zjzAoJ4RS=(UT&Aub!n2p#s<&+lSj*V~f1EgNN1vg{M`xO< zm!U~vgorP1|DI31@#6mWN3hnN#qzOpef#LZ$&4+r63=*u{qEz{7oJ(5%XD4b)J{gvx@(o~!_E0KO;L82Hbn(=>Rwtu?M_3aZP^0JQ7 z(@q0sT(zQ=uM@XZqQWmtua8`;qmM^gq#^Qu-3vLkvWJam7ZR|6ntF|Sd<2oq3&;;W z&vqOlbC}>tz=2?u3x|OmEvbq5N*_iz9?8lXY2bx!z(oX<8)MD^1Xe3@tM$u1NNVn4 zx0P|Avrr=tF!Kl5x5#DXI4U(22rK}?AxVa)jpfPFR2%#2xnHMmZ9ZuvSQ~mNRNpcB zNc({yRb@Lx;!HQ`dGblqeZHjzDSqKslmjuOam2&?>5sNiH_C>X_ox$^wLUe5CN%Up zPWis1;0%{S5s&P>X*+cv_-|og4b)T}-txIvrfomim5ZTr8@f#1f%{{8{rvH-D~H#l zLOYI%&*T+o3cUt9W*s4fujOdr!ok7h@TwotyX4EEc{8V5&TVIrfq}@TQyA0?V<%U>0DJ2LMbWF1e?uYkK0`NO zF@Stt?PYt7>`}gZv>pUjV_kH*db#oqneHAflukzOA1qRhyKen>`R6hj;YFWDolego zHH{@QZNYPscJh}Dd~L()qhmO>iW;@@=OCZ=o%igdID__CyD{L#y_ z9j*njyxENIL2*h;eZNIb$I&b*$(qZvN8liB1U?@78F&qM{NJC^7E*HI!v+eJ+!wRD zfhUJMV!=l~tE;O|*poF!53U!}>>eD%!zI@M5P41iDko+p8m76!Z5pL zD~Ql3BA%SP*QWFX))q1LA@Yc^m1CuR2Jrv)AXgFx65G%ZE@IQmdcPU>kO#ck&IPeU zG!fqw%Wa>>^}00Pq|IC!(s`k*bbz%TPk7nnnMB4bl`o9}Ua~Knnt+egt z5ob7rRaAujM9$qG7-Ed3S z&ymLFT!T3vEM9|ZQ?Mh2!HpCwLC}?N;HD*=(0Z0m12S@ero;ByW4Q0!>G*nr7dPl{ z&VsOyuWvD+by}@RG-{l^-mWv$nZJtVCB*yv@Cy}T-9^&L&51&RV_nISu1xj_3(d6Z z@Epyb9CsR2Nf13rOcK1uKuLB4d@G~~Hk`34u&Osg<}SPv7?h~uKe}pylthOY56reY zV3^>>CaGC(98ZM{gBD?_p|NCm74?hf#)q^W;ri>g z6|0B+&ps7YyYgp0os<*_?4s5z!fN4R8cGQ!H+ZQ_Fk7?(abzvD_4{C=Ee>JSMn-)J zRN&1@oxASAfYR{L!cT=Y;K-WoWLWlv*3UqA7ipCTn&rOdFgt%DhYk` zwt$HiK4+{%khC3s2?v4(JW9RT!$J=H_u8*d&z>%NH@VK8TEn$%21t2)2u^{>7);CL z5kD!kK?|b?XDfMI%km}Ji}#8gEV$!raWv`}1quU(N(N-GpUQ_Z-S%ag*>qK-VkKRH zJQ97s7?$CSN1zio0*z`sxD{2#oa^R8M8MNlW-KTMq=J8-I+c43vbswMPLbjwFm@71 z$kOE+MKll?<-pHG+L{~7lPZSHsG1%txCfJovwTLuA!vM-=>Yp5Kqb?!Ex}eo--T!{OTZEFgyPS1_ zlu%7B6tq?9lSze?@caGc5H4UjSei6`L`MiyD%gp+Ac_#Iaf=|#=4S;Z5DAw$8qL%> z&PiP%8CYx)fve%NJjI(mjl+4{!6=dQ%-#KZbv{)%a>Ym4k|z3$m*&l#H!;|SnLXVx zE!gpaKcma=l89oq+U*7sGtPw=!)j&Su~aM*Y8TLoXx%);89>RN??!C_8ycKSVB_rr zOeHV&sZs}2D_H*2V%XjI*jv!HlC`0l_bsB~6XzS}_M!=*>Cwpgrv9m1u>X=2^R3LI{&u)#vPXdKc!)IRP3D?bUBAh-6#+Z6O5cfV;*ur56PU>auo^$@(I{PeWd$kN^U!df?(JdS z!=z@`UML@!x?e%WpaqU2saVWcTrZ|pDQjSQvWz3CK51#3!*0VAfviktuPWG_BqYl& zfozuQUa{(UlWNnezQboP89!EhYjT$OcYEH{@PF$jAi=+gzjz$cPKaPe$ZiKyAx;p( zVOt6~`2>jO?Q>PcHmEEYu*sn39Ty&fb`$FYb=5eCCkM}DMTHvRX}~ww`5t;&uVFVK ztNxJJ!CcR%v30ajU{;?cQ5|>BV}ra3o|UT5fEt`oHbjuW53WjSx;FqM2O#;PR1uIq zW9NS|+YUPyYeCSFVk8J|{hEz@m+YS8;8=c6JpEv8MPWCJHoFdOT)qhvz_$IjAwO`|u7hum^w@ zsUeI|g^kWYnEu~p!4R7ou_y4jy_>K$?Y8sdww%(u09P+4i3i}-bab0nncS@}BKpVl&M<=xC{!qDl$`E@C*YNGSXT z3egTdgf|BKvSwB0i%p=Co4@ydCt9sv4#0L3u6y@mT}il9OiXHL+~D~Ggc$;14jsI; z81AH=!_%|yii(E`S|3NQ3-L&w7_@+{3FCvAVMGh z{b7N%u6_ro>j3yGs4eUCEN09;6b~;Z5inU*n@`NI(L}WK zVdvGih!<6J)TljdrK}xz44E3ef=G!3nZ{qyvb(aVxKD7qx%CyMPGnG85ugl7op;MK;xfuO!%+mAK2%JF z4W0Q+O|DD*q~q>%+&3u4?~b~2P^53SB-xWsBa7QJ{PJ6L${(aS(wJ`F!@ChXxN3rZ z)5YCoRKkb5&Suvz-yI9TB7op>rQw?<9;B=#r;pl{8-HoC{@e&sn{LU4y?7#3l zjAL&#DIg;Nx4d!XMD!Mz@ZL2ybJCLbLNsO{)MxY9Ozb`^k@uluUR*_m0~dbvj*0z^ zp1)dUO9^g4bNa~?$zFJJ1HOIJo?MgC_4KM`*0~a+du8WM5kqmaNP)Ba zTeO7KwE9Ke6N#5!89iibrQ^x#qVfB~xNR;Z`CJnoR3X6NNV9#3YI`|zUAiCRmfhLxqIAbWCY1wWe3te^&y z^(Y8uf;^SKf}xk|WkEm+`P`q9M)AP=CAJsOtJ<|P5_LTcw_6g|-bcNdnO@&a7nL+L z6Fx~mTA5h)y#230dO`RCd8sg}Ih~8?)&=I9GVJNd-9@JcAFe=s7h>^EX~|9ILGM%} z!9(_K3GL{chP2E|Ip#ztq4Kn_%dcrUs!er?CSnch;~eFl&XB9V)~?AuG()UQ);edf z?IoP)zuKcJ<0y)!Ef%-sZ2qD{CjDO#IBf@%kdlDw31}Cs)EMWHaS!wbqrnW8ScYQm zvYyG0F*(sgDl2h46vcu(3O%(qx+(@@Xdn!*O#p+!PcY3cu`p~fDb4Ashz+?^+pz85 z6}Q2%77_lq9VgK~M@}a8zeia=o=vaTww;lTE7JZW<^hk5sN{fpevGr>h;T7kOMKrQ zFL5E4f_U-c@wDlwMcB4FI*nqIn%BPh$fi7NvS@x1!<>5q(?j>IGKy#dZIYr$-BCcx ziK>k8p`HEn{XfXI@F3Qqi0yNs>r&KbO z(123LC`u&}?|FNky`N{>d-wjo<9)y5JHF$n2}fzGZz?jcex?pwY5^`r;NDy5~o-1MY3X{=RV8@R&V z)5|O}$bCbkrHyN(kE^zuw1Ga4ZiEg_;O8FVEEVDB>mRHWp(j0gULE{RzE+Z!n%pJC zM^D;_Tu_R-)=FwcK#;qXhN6aotFnr^l%}?#iiV21mWsTTsvr*x%t0d7-O<_?LV*mAMe-C?>}BTIAmoQOz@{k|KpLtHroT;m8{)^144sb z-B*U;Q5O8Crw{S+_-kURGl0WvGa*nkDZeAYS|Lq*=I+)RFYJWe+-}an(4lErv=Md-r(OLe! z@88bj=Bncn5aj0^qVMJBywzPP(0{A0(qCWxZO?yBD4i7nz5zkFEq8r2U8Vo@_1}(~ zoMbwy{ewfC{axKxo9N>UMK3Qm9d}n1Ep2U0Ed>uvEe!=t4|Nv>ZC7<|1vlqq%E}t9 zDr#=(s*^@syY}yg|J$ie0$fAMLizL5ZaB5JrlyCMvWljHyStkTPN?p#pzY%7tl*)g zuA=VZp{(VuvFsnG{@daIcItIOUT|{GzJJ??-2MO4OZyn-<`xBqR*V&YD^ zu?_Cq{`K2`Z1DA(bVq^CLBZ~1vFSup zw}0K%Kac$LFt2|f!2g+*|2Y5O4*&1h2={dN|Jj22<5ZJ-{r8gu2Y7^pI|sQNZN;4U z-z@V#PWZ1!Og*!%67l)IUjHwQL9lb!|JewrXlZD9xVfq+xNEyOD`+<(^6Mh z=B}xws;1(s?6wSk=>KE{rnsa3Pe$Ocx$Elb?7!9BO<(CB5A}~P{{J*+|1-b$Yta7m zK!2>ie|3WY@ZJCJG<6AR(1F9n;&+~ObSk<^|MuNq)8&u-sl;*mhW@cXP@$TZmXeAx z{{4CE-?vXa*6x3E?BBOfJ@&6dH~M>p=p)=s-s+UE|8^9?Hh)Cl4S?b9`pYyl)HHOJ zrhYy32rI7$cVDWB7s6yPasCLfe;zb-%YQu5?ynU7nx#^pMU&iuAkdy%GO`znqrWjfBa>x zpWA23)?enDVvwJI{AI46+h@wwU*?)(ke`42Wv-vwXUf)J=9*%VpMU&iuAkdy%GO`z znqrWjfBa>xpWA23)?enDVvwJI{AI46+h@wwU*?)(ke`42Wv-vwXUf)J=9*%VpMU&i zuAkdy%GO`znqrWjfBa>xpWA23)?enDVvwJI{AI46+h@wwU*?)(ke`42Wv-vwXUf)J z=9*%VpMU&iuAkdy%GO`znqrWjfBa>xpWA23)?enDVvwJI{AI46+h@wwU*?)(ke`42 zWv-vwXUf)J=9*%VpMU&iuAkdy%GO`znqrWjfBa>xpWA23)?enDVvwJI{AI46+h@ww zU*?)(ke`42skwOmYOi(oM^9}ynrGLUEgeVWt(2>o^;#B|$VDtH@d+#}BNO=D%fb?> z%);`H#=@d=oP|X!;NX_KrYx))2UnXI*+jhPZw=q<(EP(-TyxG|v50p1u*t9#N9LneC<>loO5D<9tF+yN)&RDQ)rLN+!l+%_aL}hupUz&tE;cXb^LkG|KMuMfOK51QVTM(_ z*+S!u8)rUkYT98X$6jR5-`d(*-`L1Op|jw20FL=C;2J`WGGCEuki zJIOD7fEyRRR$NR;sY+j|KbJn2bE zT;E1V6E0s?iinC@VQ9$m`|rOS8XHr7zkAon!h&z%qD4kVMyw*DqQ)WBe^zeAQbcAD^WiU0pk12D0bw z8M201)~v8TOh0qxOzd>_=1qwuOPA7N-Go~#0!eJxQttHP<;#rhY%Wt%)7RfVz771; zvHC{zh$;s3x4nCJ{`MQUnWg2f&!0og)~!pzL*1{f-PO{v`F>4J;<nuJ_4C9XUbV*`-OG^PPkJmvZOpmK{j34d-kCkY+xH18A&~JMqu{r+2mJFPEP8vV_YIU955b( zDvy;YCA>Snx|2-EjEwmh_+5Bf^6T9@?~D2Q9HPk_cs6x${zyk}b@5pe66^=e*fDxI z%rM`UE#X%D_;~D%kX~Wk?>(8Eogb?tlMczQyIts7MT?G(uC=hVG!6(*!UB9fG(zqN zYZnU=OW^k4pmKe02+l(mP-bRkeNz)Bw!-F~>f*;wo!UvKv-b4%(l1<)!A@42HgRca zXfRz04VN4tbJr@zCZad%*y}fUlgawUI>o_wd?P6naj-3F;MU22ifM3egU?)3ZslIC;K9u6`L_4wuEIi@NT>$sjH`#ERz|<;!kTo4 zUR+$PO{`S^@p@2oyH(OO&k zVMbKcXxy`xFDHWEzbHz->{R|;ZRyfn12(1s)^wT5tVgA{ZyO&^!}Lzr0PntXP5XX9bMP}VFta{Iv{StBgI zlQm8vj9p1dUnom;bz3}X?H?lshljb8lrFDiOSX`yo0fOtgg8xk7MTVn(%VECSe@%> z{Cs>CY@$Ks@|;vyQ;q>+sMGib1SpBdbj(oV0yC_-IGUJDmhbh6dygQJL`FsJ<7~>= zko{p6b;XJmh)ZWLUE<-e#i;Vg7uov>F?e`*;*B$y$x0Ow>*5pPcr0Y@j0|;WWM;C# zed~_)Uk&Vkrc%y~9BvJ7&%fTbW7jUuh|iB#wHGxzt)SnfDaYS+`LT_jSoQX8e}8`k z2a5uW=P{)%vB`!~=XKeSIy2w(^u(8z>c}l!nt&leFbJmPA_Tqb>*J@`u3J|(mo4|g z1x{~o@6Qw*6JJ)gTxj?2%Q>5RdgS2BcWhRy>|^S{{qx8#JE_M{#YB^1q|QlFWTc*4 zi=c~THYAbxtx+x68u{^bBTgN;(-Ixd)~j-;HGX? zZ1$ufz-BNbvDD6HXKxi}AYL=?++l;)I;Fc^_^J07M>g9PEABY5+J=RFoy)pZNh!dI zcED^QH$VSr&b&Q)cu1&!{5V65N}B$+?V~UQ(^t+uw-Rz>OwY`)z3x$oS)LCv@x7JZacbn`O z>aJS>5Wqtf@IM zZMNZB3yW*4tgL=BX3X#qq-)HjN*^#&V)TUQ@Z@0x6X)31q0|(`4on2kTLF2ye*VR=ncugyO_WstbTbWHwO`7{ykEW-;dj9a?!+dvlcgC~B zhYz#Bw;_Ja;`4B#@e2yR5~GENg~6l%5KT?CI7KtByzuUjDyDGqT{*_Vg9p3VZJnLl z1B5Z)VhAGjy`SxvOXTFJA`DDbDP3I&vxQI8Y10yo%bCXWN<-+44GqCt=!vu#PfusQ&%& ziJSSp$8SU&{qW%f!fB$S<2(4311)Q5dLtc&IN5x>y?JmFI$|IWg-gR29x>m_nhZoq zmK-}JlOEdttZ*gU(gh3HPMtc%Y;FCqpFUGUVlO4R#v_w^l|M6i^|oyv;fk1UcE`mUco266J7I!w&^6T6*<)g2OxfTf&o%pzxMX1wZ=c`9D=(Uy zNXfl^eUlOta@b#vVQ+5_*M&78kW|*kd{|R+ zT8zrZ#%ATt5mK_g_`Dx3 z8}14#6sTT~v1`|^vt?ybq72-qS(Y_{Yk(MJ40T~AQ`Tf086K`l0y@mHGbw3>t!QRP<0(slk4j5R z_i`Qu8xTlJFy<P|6 z+upE;goLo9RIza;;0^%JtzZJ*p1!^n>t#ffvsq#2c=N0$ym^NYiy)L5(-R-Pna!K` z=+UDn3Rb5rmC6mLn|j~?z3u$o)&Bk;JPZsfo#)J%<4XTB>wsCyZh4K`BPB;=KSt;R zG>A~uj&V=VlVXZXNbJOHC=-z1ZE{YGih*y4-)LpUg2@P164*@U8b7CKP{RT+tLz54 zp_HMaAv1>6HZ=4LTq=g@9Pxk7G#ZPi`U`d1`kbeBOm9z5mVKrPwQjZSw&CH!dTh2^ zw!GTGy#4kgPHtzHBSsA>iMAw8I06u3fSc-4I1BD}zM5LFCGE@S&yUFRXAh_tk>SY; z?yjwwmY2CI1>P~VvCip$Czlo&w#XUogyB2r?05M;oOg@jAi&&`D! zBh$(_L&!2+KL(G``(%-)w|A*4ZF^*-F=qd{_>GQ^<(@R>LMpHyJkxkC3-5?T4f|0; zse0bL@87?V^2pCiNuu!HDxFW_`VA)%|IRU&C@OLSRo59z=<0rXx`CIHTUfZwlD5*s zoH((azDS50 zi=vKl)NJ97GiT<}@FeN!f}p>H-`=LI0GR^hNT4S^4V}+CXC-$vK2f(E0cwT2d*@uX zzMjXKoNQ|{te9DAj`49e0q?E10a(j;W-rfRr`$S4W@PHYgA{g3`~G;u3^qGEJ5IKx zDk_iVXjmtJ)K*vu)2B}tnls18h79oH#a;^X<#A274Bv)f&(JBuwZBO_xaD{sk1X-yGF+U~n=yqMkr0jua6ZEbf^axY%wZfR{b zk`mIjV!{)bDlxtN{W*CORr#sy?d=Wm8d_T1pbQ)sDUj^nD9N{I^4xjXuBnS)CLmhF zmy~YHDku=(uwA>BpGV$pm$wWf)y~h626bXKe_liOx>qU;PA)FQjdvWP^HNsPHFR|e z55-dfmIl}9acwHtY?R!vkK?F`G=Z%5@83VpDeuNPo7FZZMo;(0=LTgB4LE$%|!8`1&om}zQT=TUfB!26eLYiT{wzTy9}_Uh@F|h8(-)DehAwJ_cUJCC>fDrA-;lqXy z4hTUC4b`}TkzKix<9_F-<(#6{YBX+!qSH<8iSNyod=!GK&*taz1I8fU2B|GxyqFc- z5Du;9${Pz}|Lp`9$8Dr#WoOs%%0u%3qz3wQ^YAb>H|K#eb8hvTH4e&f`+bN-%M}z9 z_EDM+ELc^rO-rKr#S44og&{g~F{vZjG&!k&GKBiyxpOC+J+GiZ5qyvxF7Lyv)4bG# zgar6G;4u=>w`@tFB;RT8;ef|1aw1^0m*c2~OxXe&2PbDOfYpie4S#seB}z)bJsqQp zqEt84?M}4Ey&>GZyep~q+3{UkFPBcs<ZZQ+U%@Z9obca0&c)c*4A!FKcg~JrTuwk=MOSI&IqMu=3f7+?!QWg>GuG)kD^K1SlmoVP6fDvErht)F_C*L z*1=I@TFEIWtQ@td5t9(;h6KeT4 z4ww~}-MA55Qco)lA84DvjNS-dpvi#tfz!&#%R{IulVU)?BMhO`j_GpsIdPWx`S}GxS^`NQ^$&$- z_3On_oZZc43!fUpX6x(QuTJai?3~Rff4+E{-JTUk-y*cyY}!<3U$EjuSj)VKaPYR% z45%2F1c6GP@gFb?VJVsRj#stXG{eeDil%%VZm~B$)*$}NZC)iNWR}B6j(~;l0``|% zyf}?hexGS@bNr%X)nXik>Hs|n&6>px!IUVpFuf^TvT=r?lT+JG5{v*Uc~|Y1z+tdB zbWH?*KF&#}ml^~+{?GQB%|Y(y^R5tc-(sUe&~1-#TKsc){7V4 zM-w?WtXZ?h&&zA^`}vG6&ZGAEyC9%K&|!fPi9mHVe$k|iV8I6Nx(wP8-8^f@rAtdN z`5WRJpFE+6DLHKxqAoe&4MzLGO@x}2m6dwp1k~P%0yf^>mqFL*pU1_1T3@H zv5D@G2keFuft*rb#|qt3eBUn9@ZSA39s`zUW?Fa}FA)aN+!hGI9{_2(c!Gv%A3ZXe z<6c{2azlvl$94o}xXs$y+DWVkD01My0WU)BIiSp9Jg~U%XzYo`+g355i6A614BD0r9fChOpveZWwUj4U0`BrYHV*0uX-A?K}=0^fn&mkY|9LSg~0zFF1^f5 zl8pUro~(u>!)8h2z#Jm`EE^pjF!1y62=mFf_4N1OO`>}0Gh{Wy_cgAd)o_Xe9Kk%$ zjqwQe3pn{W{?H6?o6yH5VLsR^KO4iSgvgle6c}z1dGca`I$UbNoyZ5p{loOCjwP z7mNDI*f~1x8=v?rapdZPWy``IQfVtqO)DTK-0Uv31djt~JA3-U(5FwIDZF+%RBkFT z0;KQAI(p-a7dlE1wiHk4MSYzl$%@>0H*emI63A<5Y0;)<+2$hDQj*e`!n;jO*_O)6 zZWWz$Kk{zTCh;pXAA7L!KHsZ8gRpiI;YZKGQBLD!#k6y_gf|_V)Z{2I5CHYn_$=!j z+yd*vt9AOk2w9a2Xb|;kcnOZ$PG2b{^t$ud7E?ObKgYn$q5YG}!NfS7%+G+<($Mr- zI%f+umwam2xs!c3iFslU6}b4*&=A-KY*GL6B`@Y8J{x5|?%{wob7BTjuQ*wg0Zrf( zA|fJKI1@?+n30gv_&J*rdBx6_l+1>GFnN03y~FN2i4;UhKySk>TO{qTgBWGw`Bc=z z7*JC7?%S8a#jeCj-M)RhDJw7izA^JsZZ5pT{o0LCJD?|l_qAQ+c6D`4nZujc)6>%p zZy|8)+BJ*O^5SdPm~c6Oveyda)zpUe(-Th(cycpRT|zqs+tdDxEO5#q8wlT((2Ep- zoMIIMxq%LeE>P=K6i*(epU9kDEXgL)t(r8u#@hrWwYJ5u~D5iU(KPEtTj0X(fVy{m}+&pYy{!+$afs(ieVZT zaIsUNNYx`Pgv3ivZ4eS)-bLbYfLOMK#qtRXl0;DMrpvbh5itW&s_v{&Drb)yA4<=F z)Cf7M{d9Pnk5q}GW-G1IWh@~j-_tujMT0yZid;ygP<^g_)P01M-W3hgN%@= zqslMirUKIeJ*4P<;s%a_2PE<=yC}ujH69~5pfgFdE?*uvLqerIw|vLFJ=Z!6OII$) zu+DKfmzi0$H~$ti%!*I&1pSep9>^ML*69sPz{wc9xh*tVxzZ>o=!y~Zc6(qjg*V}r z;i^?!63fH*9#&U(a}e9g)8=n|8X6J;6o2%nDB-=%Aavry&Jz03v!3}vo6McmH=cTH z;B*kup`Z5NW09OD?Oj=J*IUeGQvA7gmnmI&OWe}+C1eS?Xx7MCg z;ildnN#YK}%;fooJcS5Ve4mFnnW#unX@&LAB6A2a4~izd$!SZj92*`4b>zBU_hzR< z4~MsOc5$HqF`2AdwZhzdj}r}vpS< zkm)O^gr%iN`=4L!K3CDUX-HwlJl%*v@kC?0A41ftP%b`6F{OoflPngd%uXkwk%$mb zB?p*0u1-*(2;@%B^-LGlG(hP|x1V~8Putc*g$bW&FGMxZ5}vocV|oJpOHXFXxmf_6 zXT->tfc`Sa6&c_hMhk^A8rp+dd6Vzn#&U!5YhW<3i3?=MC@!oc(8ZCsm$@2hYHB>x z`Sa&*a-6h6n!bJ0BGUAkh&R)ae?u%l z&;$AUgOS74WmyA~LG|=vTFZ%;vJwIYAHSCf^nyGDk6g^nZQzwBw2*i49AtO}`4|jp zzav`{R_j$M1{6{r`N`{nS)RReMfk#n3$GD!k*4)v%|+q{8bt=ac8X}{_y+TlB=mks zgZ&iZm_>>0;wlN7o>qNSq0IeJeB@})sgowsD&6xL7ua%z}5J}$%l0gE+B(vBEP=_#0nphNa-u-K9fLl=^z48bl0A4;LYn!kDE9C=~yL{)&%4iBA~fkV1-UFHcrRgyHB4nW2ivo>LxRbwQGw$ ze*8EQk$P-eoC58En<~Vh)I*07M7hprZF3Q4KxhHQsHKSFUX`Sw2Zc#0VE_}2S&=*1 z_4R8QOl+MaN7i)x03M4}SU`CJcLp>E;^LzLn_F312fd<)j*o3mi2pLuoqoqPMQ_(K z4glDC%#ZgpZ+7Tgzz3@T+)^zu7XUUJz;j#}euL~08yRJ^q#ntuJ z%a?PoYNb?FKNV1ryy1Y*1WMrG@bVPX*dOR^=1$`bC)&Q06!<5>>RL3`BvhF5N$SZ)|F+X`n+{wfz~{SL;k!kiyh~6kBK)y2CBOa*X|Rmva({%szS93@QkB z_oVvw~L^%lZo20-+c(=L|L9OyM2+xMDu5XbnVW&*$?uDKt z*U_d%vL~64&t?(8i2x1}4nFCbkdRQl4+^_MoSyMY3r4CcHonVOg5;Z z)4_z`ZbEqFDe`W^ccYooLflweY*>LkD|de0j$|^?5FzEAiT?CpIVXVvH<>UQ1pI5t zh9}tHQFv$Pbt7-0(Pl-9`FK~1leKTR>={U7(-7R@Apjhz@)^&4MW|5r2#&=p#iA4W zxPaJMjtI%;v$K&lphF}V=g-@}Utrek*>qGrWX2y!O{FQrFml}_R6T*ZBw-3k2a*13 zY;0`JJ^ATa``+NS>Bp)&qYl_BqXr1BVwjI`sc^o$;^Jiq@u6?;@nbR{pG=l&MSoKU z5xqt5F;*71FH(glFxmO(QxIw&%pB+ZS+yaW4CH0FW(_YvNDw+uFhr_dUbmD42X;Q3 z8M1+C%rv%V_E2(5OU3s~Xa{YgC;C1~n?@4LvLpsMM?_GSh-QLh5AEvn@VQhiiCQ_@ z{QHn?Fae_LCN)yTX=L7EqaOGO$Y(Gc29}gap;8LF>GBh^O~TpD<&iV}TW+vo5_%e# z!d_C<=L-sI_f~h>LzG{WW$ksVd+2dy5Td0AD?YAeYx?-Ms{L7^s~kgd^Nq7&R89Yu z_{tye1CUoB;0<#%e_iY*GMYNqwhwhFiDK=dI8D;Ekb2!fnvr_0D-Fpa0b~v9b2b8Y zOZe{DY*NZx0;vWC9Rjzx7p5w<0%8G>V$~62eg5(#qskbuMg-n+l@dXGjOYCvBp3`# zW7M9}^HF91?y`f6K#;T9xG|%ey_9*|rI6H}08JyU3rGQFex<|mM@VlBDjqQNU?qt` z5C$Py+NDNswG1my+WtYeSLjTep?q8>EElWR&3rZu~0_F7(M~H-Qyx6 zBFEj_-P3j^CeklozP#GdFn)DlAj1n7($2_;zTMIBbeh>h)yEv7!fwh(AGmn{SBZKT zy)e$Qwv#(zzNTcef4-Gm-VyVxeWsa((DwE_IXOAr6Dc{FmgbePV@I2}ukT(YcYF?; zcM4=!-B_fd(O8Sfp@ZU$WgxhA*49tl zQ(gw{sQ^~Ef1$9~N??}lv9T2#$nqdjyym{!rz=2yGb40k-Qka)Km$k0 zkDE9p#9<^v&v4>fR>);g{Jp}y4LV;1FX=;~v0zhfV;NPx$&x~6fC}_0ELjqyh@Zs@ z3awk#uWvV%IV5PE^Yl)LPHRGSXCyqaWFfWx)zhaU=dE*$fky5i(n`bd#y|?2tgR3F zgoIr4fi~d)%`4;7DT!g!uGK-@N{5r408o_T;|$(uA+xI9^V&r$XzIL_W52tpzQwwZ zDMzk3I4GzES!COH6y%I|0J1`8^Yr)M1)Pds#lHUj`cF|UcJZ;Nb%gGj<(vuI59&ucXKc`y;qx;m!}8Zrr6utTToI`;t$dH^j(+jnDAnX$NJ=i zxck3FS8ycVQF;IFo$5@U#0GHH@jeRg_V_1U@^0GSnkPjv)PE$zZ``mUf#jv8!_Olv z6!E2T6Df(YZ+-GaIMX`k-Hpu!7cX2eMWSD!;L@do!rbiIiN@=LOImF8)0IH#?m~)R z9aN$l6&$6&3ShgiVN|`Gt}TdP~&0 z4u~HE1Dd&)FK=<$y!ocN^npCR@DDAPiN@`FrN*uv7AIvzoNVx2x4^xT@j|YE@L%g3gg9uR z>f$v!m{0t4bl9je$bYFXSa1g^rKc{Qo}NFRJ)^?etmz0U*)1=+v;--Qa@2v8Ap)eB zX3j)qfH05}?)EaG-A0$f8}>Ois+enL7|jezOQ3rRt=HXe-_Gdo?3~$!pU(I1=ZcAo zpAeZj^N8r|*=aMUPd_kc?p()%Cr<1^#pOk_)vIq+-M!l$6CJ%rKte0E`@;t(9J^6e zSa?UuZ@-;|ChU%78j2(hyfgIW%&J!{AAHL*AS|nCXdF3}mS&fhmbMz_nJ+6NV~u6t zi3IrPj*gBO!2b7I%fc(Yk);t~NX(sE`EhtSPFGz$WTCu#e+Wuep3>R4IKTEkZ|HpU z=E?QAiSc$eE`h!CbV58^?%Z*GQeEA5J|(4Ywxnb_F9Kx>2Rpm&bRnTZ8!M}NHMqca zl3IbU`+?$2F=W~mQNtf{aJ}?4EdCPwVSwtw{XUN$KRzulTD>~_fgh^)sn^ zctn{@zR6miQbxg+2Op>FZu|VU4WJkwy1S2oMGQ(GxR`zO=9rtg`NIz6pDa-~maZK! z_&O0#*Ps|To6IF35%FoT{mv%1Un^ySm1$a^(4@4c``Hw2L_D3*%6+uS@Hiedpx6w1DWp(ZvU!_NirL2|Bk zP=^w@aU8Fp;KV9qQ>q}@D)}MNx2v*p!j+ve|7g|QwSDuES0hv$Zu#z%GTkUakH2uf?hq`Jeo)`PQ+=_*j{_WehXmLr&iPf>O<6HJ5 zCvT~#uJ%DF$p{@QoreNIvV*^~?K_cVN1yJ|6awfg~VLlDLB?c_sG=rx`Kv zWB75FwIeBBM0NJd0bZ)?x-*+Q-@W_Zd-{!ew)>rQEF)Vz_NEDxARQvAeW$?;Dw5rR z+Nc_PM6q47CRroRqIm1o=Y0@NZsQ625MD|ltfq*Gh_w8+d-wKc%(!)!D3bjxB|~*6 z$^PyMr9Cb*Fz{PMUsHa1e{0$BRV=q?xQQ>#7(78dRlw`O8}n4tEFdpD%y{g106C30 z>2+MtY*EyP!V^gM3iJ6mj!u@qK+r;#P@S8ay)GTf9;tmNH9&x6q@I&*NEITP5R{)3IkIVP8*Fl^&)kbaZ1vO4P!qYVH! zCIUwX(!ufK?60^zSce+1k>`kH-K2a4e0nGu=URKZOW1Nf-dcQegvZqdCNQhav#42X%E^&~8zvL2AKK9sEMR762zQVP)8BY37@tk_#Bg z?;twQfP6bZttB=SasK@Fbf60Z39UfGvTbio^HEUV1ZWkdd2d7OaA=ox9;QUo zqepx{=8R1AjQjcf7eK{pz!Hjf*u2>y=kn!M^t*3AqHKCcWu?JRz$lbtqP@WHf_>auIS1YvA`m@OHC!KKX7 z*dID$KL+BsK&DXOFht2MFaI&jAy1(*OHQ)gzT#f(56R%oJjxm#uwSG|0NX{t&Mb+> zFcTFL=e62YQD*A}u3L;Q5($B%IknZ*QA?zy-wYrajBi7}<^_!C1MpmAYirwMxcn81 zpSSm=BA^k}4tgud%cBCn*j`pv)-N*hdkR+bR*;aT$iKXSyEz3sYL4t0m*708L=que z4=XZ24%t}qvd=^kb@F1PH}maBIa1`KPE(o17s4Be9MAW*4RRtVkTO0dANzqNPa-p8L|RBT?b)*jISVv%7%q>PLqRTU zegg(K3Sf7C)!QLg7Z)88bz2dr@@r0N`W#bm_-a_Gsl)xf6m!N_`T$FMT@rG_pP!v0 z-3H)w9)inOtz3Cp`O3<=>$tSErlw}KV_BFHCN4;i;f4(}c+ybo-|^y;$JOUCt5>g{ z^tY8@Mg|U4YKw6}M%hOYl^5PCjE()_f%QPE9!MQ9V@3E|1TI+5C4WBnh9VJKFH`a= zD)h@ID>{%{M=z7*DJ@n+j20O8;Wn+!TY#iOw{GpO^nY<}by-lSd48d+(yW&X%-gpq ztj`4DrbhjtRZeI}e;a&tD<;cLC8GyfCyT0&+AK+g zaDhPm?FUQll`Bu22inR9+TLg9$BcfBx%c*?#5_teI|LAv5lMm6Len_Kw9ak3;8GZ| zIws~v7w}9Tq_XXsH@D0L=$XjhQaLY%r{tv=|0ngH*RRj&0Y(X;!Dt;SmWy#W1VeBg zdT?#yk|UnOy=lyY=2;LLvMo=m&Z3g?DBcHV)SzdpR> zx_|5U^8EbwJK|$fQ6u$9X158?JyhYNiw8>dA2q-t@E>bcRaFma2DFW3%unZayU@Wp zvHg|Ip$8fFn?ho4(Ug&jy1>for35(@qKdl=!vZ<(W5^0bH8nRUgT@)O6#JcQx_9s1 zYr6|vi~E`{PlzYns!zR8g(AJf=8H%@4`~7;a;;Bu!L6rH4+q=WJUw(T`aKCM%~e&a zN&{Z$S0hC@Yu>zFKmtHhxR@a*x2C$f35+q1myd5O8}nEY>#;$9)9{;eHPpdDFInH$ z*EbpqBr@k%_1Z>H^{+04&rBp4sV7RK_(^USMMM?X6^Xj2PKs?&)bkuoV>Z_7*KZ4& z82_;)&%Vgq=aKMuc|-~VMG<1u3;4#dn_KJ7Oe7{HO>iXNErydjzjNo#eP)F}WYeQ5 zm}#h7o0!E!n_m}Tv^Y>k`oPyY0q*WuYuBuq!4m&Kl9gI|x@;?jS37Kxp5ENk?@pgM zVN8lu*MdXuGtL-91I9t{fHlP5M8Mw+3G@svLHx6iii&!FMlUKBvUp5d)!W4jg?C^6 zuwU)`>a!V>)v&j2870s|k($bkhgiyvu#0|=jLE9!o{&-})N0uv`N)Md7s}(l^a7K| z`2_^T^B6bA=~m5q(t zQSjWG?$t*tXX((!IXxI{mkSE^pAe+pr*{Rj_J!qg&B?Ofe)jCy_+G4(+7lW+u|o{w zE6#Uz1?1-Da+s~PL*Y5x+qtdhERjO(ZOBHoG!y?9p`S_*RHwW`z9Sd(Brj>#uGhG8 zJZR}I%WO3Y8{5Q9puu#>o$ekRHf(rbdwO|*yPKQt!?z#bY+TZK1z|*l)Xl+{*T-(J zT*mMZ5THVR4#Ljar%s=q_~>AFu);Ap$FVe|w~j1>aP&~jz?|8Ry1*ucox%1bNmTMZ zsRXSb7-q|R{rYtafxOX|+d9Z^2s=*S&W40f6vZc6tjf;H%JAt$`>Y3k=0N9Jjhdml z4=`eORN+|obr;|;0&4O9CN>xfkS)rSxEyT-FS5q{Ne{zAl(h_{Pwa$$%HZcmIT_{$ zkG#%l|9sork0{o>9Po_Mz8o!HuXOW5m>*dajdvGZyvTyV0LFmeawW=V_HGlG<=WaY z0gv|e8pQ^DegATp_0WU8jjcw%?KE3>?&XIAUl(&DaA|p{&MHFWfa46;txNH7bL-e}FWL_pU;uDj zB7(+!%l7jSu(F3gw2lr$*$IZoYS@Fp#wjgb>N@=OtG}0@pT@~)kf673iO+JVh`-k0 z8cUq)Guo;>+- z&T!CcxR^$iX;;`fIaRz#5g@5$g0%b-?el8|`1$n)5Gm8QxXvE5jLmi^_8n1Kw(M&m zu=ozFs7~Y$dP2VMV4|6zRCW^8MP8JLii33k#W$Tp9=;9YE4ot4!H9ODuWq6UY{a2b zjM`h zo-qPe4K^|P-QBeUO@UvIojG&HM&?k-nX0#qWhEssXf7FL)U_kp0&ha`=^dQ zuNE<`+2>E=OjvxasHi;j@~fxdbmKNqTfeMgBRB-Wm9&`xe4&0W5fQBcD=icf(>W~l z%OAeleu&a;T|UI=1Ml=@aPS*)?dJ1EcpMQf*Hhd0X=^Pl#rg8Kp4rZcd_1m!YUIR< ziV80{QL5GY^{jlHcObTxJbL+ZwDU_}^Tg+~1N$9(k;QDo4$fvuP;$kQ+cz7?bYCdE zx*r_9Y-D?Q|Fe(Mbi=`wJR_(aBu$v`W{i@1ZE8ktlGc$`JCCaM|K`?9UBG#Q-XWfMaHaPLbs>+ z$OmdyPtQd}+%juByI!O0hP4CiR0JV4ZYrVy<|-P}p{`iEsoLFy(o(62@}2MzJ7Unz z{{Arz=+L>1@79)*>e@u44__@q-Fn+sRFjSM#+GN`n}8n&NY6z^etwM(ViH7b$xAxSf*$|1iib=D-~^clSk+EXt@k*Euab8be=Sc~StTVTXuy_OWLe5W1fCqvq?NGnjZSn}HJpf)+Po;hj8uI3&?Bdo(O0 zX%iV=$UhDd->8~x`@c<@rOs2#)XSjf9k9*!bnSQkUMOD#JosC+p;~D zrLSR~K_b*8!bXrHM7AuQ6QGtyLZE7~fk9k!-5I@C6HZ(6Ljo>9rijv3P^dA`*PjRa zPgX2xHI@@W&$6BU`t`Ro!#Mkl=62LPdUVaS zGJ>>FfHLBt%5ER_&%>XdbaiyxgmI;jA$VTSi6x4nNXU;sRJVtQhSKfJBfm&?>0QTS z_lN#hg);?jRvd#_8zw~H`^<}63=e@V%9aYicrt`KdmK`d&f^(OQADB|LgM~N+p znvCJxBwwN@Fr`wa;6wA?{aE8+M6en8{+%;w`*u1y|4DNi+8IzWhfc05$VYY}f705} zykEU&y|z6ih;6_5FtrPjI3P zh#N%#3j~sUo`d1*-C1xYfoG(|&(}BA|BJ!P7ca)oACe5{<|1+*q=HXBAYsMX6}lvb zbv``enHqQf>eYr9&!2mNI}{Y*+@jPiqa!05$(x!#au6&PuaBxwjJkcNg{PcLM!oNptzUr}WnS#Rm zmHO!enO1TZLNvYcZ*PaXp#Q|no{4Z-Pmq3bgs#59k|poXC~iP)cBbR=<~+Mh$Ls#5 zn;?v4!$roGg}r|i>Py@x|SYJO-( zMY9zu#Za2RHzft7B85~wfCxDTvKfITE%%}6HWLqBu}N(vw|-YL#5;x7%(ahdY93Rm z)U$C5G{rj7A%g5ZmkQ_?~l^Z39prNbg_7mw72*1a1|r&Va^R>C8n`uORS&fE6(ZA*Z0D=uF2 zbZ~Z_|L2=Nuoimy`*)JeBwm|>qEhs2AQL(J1#$(B<(#Ptynwv?6@i<$zyc;BBO;>b zOrQSoGUVf9fV6cB7cM*nbx0@e)G6Hq$B%2BNljH2oik^-@XVPSD2I5CRMZRj$fu%n z=f>zFX<+K%(UnXv!a`ZuEy*bsr>?JcpvP>9SKyFodFsuV23Whys>b1A6=xKMIJf z@9|TEzxTX;O>?)fcto|gf02w@`6|I$qbH+}T_Z1e52)|#6~n&jAgC`X~C z?x*_;NWBVBH+qw%!E=#M2;r-Ofmq3VDAcyrGLdoG%X)P25%U_sY12kJ{0D?@wn`h7 z`M2s2KNrWx&;J9RHe*LDWVYb0RZBK2BFDQH0kCWplFHLdHajVZ@FW6!?gfq!SaRgM z@9NbLP69T>JqLBz3PkWj+^D%cLh3o>KS6YEU#YB&TNe;;`2o7JF_puxHoy1B);Pi4 zIWCr$-#kt5e)=c}dMjA~!#BXv69tZCA1=BUR=j@$iD6O$xZ>4tApmclFj#GA8Eb&@ z%tlC9`!8OU3qpVHTD)v#(c;Cs4<9&i3mNoxb=B3&Pairo6oRzaC<@NfAv*PzLErEh zSefwyqf~@+pe%q;0Yobx0)lWb@+z~a7?K21;DgE<6sDnFp0vSP+1hfVQH$9b)Cz&+ zavrttP17T_7au|vn|43TI7uEDu0p|pw6z%kO~<{uvF+_Dygz1q=)&5Q`Yl*d>C60H zeEtg3yM=7?!CHu`Lwf5F$!%N#9!kMwCLp|2q-@^2c^n$-81&5S>%;xehrVM_wme6} z`4Frd>-_fKz6o_sEuxJ;%PUWVbDutUEZwzFsPsVA0%`6I0!df1fXNplTmX0J z=>zC4Lq-doV@lFXm-d;VdBX|{^g3&6>%&P&RVuC(m5GUW70`p*4Sqf&IXU^d=**cV zxQ>pyhsOu>yS)V9yQZe7=pO~Xb2K$IRRI`vKLX}Sq~fk^gMcG|R8Aj0bfCf;* z3TvZmWz{~@w-;@5H6djB`+9l?Vixxy^f$rV=Rp_@gYR9MV{^$B-CHNk7V02ZxET$} zPO51)%dT7rT7@#hVkmSq2nFNlZa%)9@T{M;PQG*% zMNNG^=_|QGZSt-Gn5jd%;q!QhHK(oJGH?i#ymk@>B8>a59Y3$M*!|B3cY?CvSUX`T{={f z&ts-Bc&QPoK*o9>dc(uo1bTG8Gl-Cn-!VMb2f7qLVPbj_HSq_^Cfkr;h()2+(N@%6 zBNPii>K@Y55U=?Pm2Z?3qtH~-7@>W((8B`X{Jwh;=KRtu>t0p5A)^#cy?D#Vvm7hA zu^XHHO(AISw~!I6`u+EoXHa*dU?;ruDWS2~tlxtTNV6vZls5ADi^Jc)_)^^(ZR}L+`&1cX<@D*NEw{0+Adot~Z^SBe-Oi1+&dY__V=$_H=r z64R2mI^A`Frq`^buRs2Tz~+jR)rN!yfcvx&2@5W)Kb^#fH-R^d0AdxEE={hkt<^t% z>{z%I@Nyi~jx}hpZiB~aMfbwX8N$NFIKc<`rAvcvxfG6~=jRmYZunMrcRx_ImnTl0 z>YpVhc7498YEUck<4x>bTuSR!uYP{w@ZqP0A-&d_@kNkCucI?C6G>Qf8c!n)#}K*E z&=+}MDd@gN&^Il-$pEwv(k+pgQ5TL>_+6Zg{oc)R6dhlOXr$EK*r-j~W|6%{Y~A4> z6_1XX-}da;v0&Byc)ax2Nj6QUD|&-+Z-;Pcm@I4=|)!k{HTZPIWpm^ET>TE~#15m%mNVd>+O ztBLo5pt%@tnNmjoF;)wTE-~EkfbW9B-GN%CN zSH+OlVNy*7RCot|bDg-3PXfzQDC#jN|JDlX;D#wzpcW04kRm*2;l#S{0!Mcp{?tYT zIS&mA`d)bB#y77ti=!`5q_oF8>jkM#f|2k>1q#9evSR4)<|S{i5*O!z7zLV)In0w718|YRhY)9GK+M?kp(7HBmu8Zsor744H$j}|KUrg17tk>@aur?WXHl1g zPM61LT-1WczHI}hh|kGcJPY+N_go6EERdFNt8ke690`zIes1n>;dnC*cbbJF8aACU z0A*#RrM}Z!(EpoS-ATHPq39t6?hL;Pmx7n-NT4F*z^ItcdX!f4BaeEp#^WX4A5-8_ zNPUTH!wUF84CEJ*(UKf!dbgM4OCLPwHDIUE9UUBe_UN9fvjB=p;K~~t8@oZ$puy>3 z?qi2jQw`}{{dF-*f?n;t>oOBX7~eix2D~HkE~%m?{xTRHZo>#OyVxm4t0CF=Y}$0J z+%!`Ki2>+Hbj-??tr%q7*uHrj38(zqu-qUwl9$OqszI@m0;;+;f&5fpI>`bccH+ef zV`m2*xT(k?rXE@bY<30my-DPIbW$LZg$@ri;F4E*kn|Rc^}+#6)BwJ3`0$4SreA8s zq^kkhOUbeEPBD}+!%TC4;BNv4KFRI==9P4&% z|Bhyw6&XtNC<&zzmF9V*Qb-w6s1!+tG*i+blB7WcLQ+wt6m?V5KoU}>2o*Ag-{)*S z?;r2BJ?pu*wbs45xvuZ`Jda~P_Wg65%afu;UT`#x%NAX-==8#> zT?7Jy5ac1j5Tcvra?o9VL$QOfvkHSTV@m-j6a#j+Wb}}eko&5utJ_)vHs>qO;r!EmFx*a-o;#Wi)MX!6YV%;KoFl@5-Qbcid1G_=k z^VZk&u=ml3Tt<4&e;J$VKG@R2Lf8FLg+uxK(RQPEnh}WL2$$nsm^tF?bAGIrV(a@R z5zM{^;?C+keW1>3v#4wG-BRXqTp_{odV;@ni?99OQZFfIekJ|*TABa*48C)*3>P#CoA!wj7>{RJ3P(4>dCiB z?fA?-@g6u4R%y28)*0ZHT2ubx$NhPy4_?YSs$}cg4*W~HbSMH6R!4!ULyxd1xI>A% z8&DE#hTml6jdH2Y?@OjWZ=H^X<&A9LzKa<-J-s`v5s?T>}54SOp-ybxr_(WrOh`%2m0%lUDBSIp-_SVtk-oL_jjYS@WW zrv#)UF7d?4lceV9mIMG0SNQ{O!o{YER%T|w*x;(0NmwnQR&^c5nU$J*)X=9fQenYxSKq*Z^vI;}h~1Ebd{fG{YCN{YmTDSdy62wUmY@{)8v4dIsI#YZN6fB~RJoO9nk<nMDKtt#cU-TJFf(QTMxGpMN{zP*W;b5g$=Gu;`{PE+n z{+czzA*ed<0cm9acVA9~Npc3Yb7^x^)83X5uIDK)D!+WOHTt9;y5V8fS%&G$9NM*g z?iz7=?!{Qr47|i&5M3BdY+W#@*Kcy-e{%wU2utP%98y1mVSVYm*mCb)e7tit{Y|=e zz%K3si|kzl#lTAbL!?oV{R=b*r|rdyg1IGro7=0OHZ(lKZ7TnfXXi1h&O6&^-@Glj zD_eRVp5^^8Iy&s!%PqiY5dTLR$2FCQKuq1i`@4gSv><6f*1B=)?&(!jRkarI{Ps{d zDa(xg0sbOi#^~+2o;xf3F916I&qq@Nebo1E4Gj+0r5n#s_g{?EFrd&^<`le%X;tD3 z7DEC@ZbF8KLfKae&50BD4caqNy# z>RBS?`16^}GBK5f;&VW}y(-LJ<}E+m8n*KGq#MD(e?b0>Z%TSgyvd3&@;k->8CYrX z!1XXB4#q4;B=}}rU7#!oSjM)tw!9M|Aw+sQpe97@$em=ncW)JVnmy(i>Du}!r&iHZe>igJkdq;OG1^6B+>4j}Ffj1jh+r^=6HP&o z6ka#d5t3vvlYGW);J4qk)R^F`D>DFTk$x287!E!e?Z5;Igv{{J&>y!vJklQ8pGZX~ zZSl$|U6h-fyJSy+Ip;p!%_NDepFblig%$OQa?7Ue+$z+l;}BBJq@Spqg&CF20pn3H zl?HYA^qO=HGyW@Ynzrz9W}oC@%8)hh3w1+v=+JLD)Iuuf7j9ie)k=eATUY*pz~)T> z^Ptk4DZX#U>0o$5t3qF?IeM_5b_&C%cc9gTW$xmnckkS@m1w>Xt>WhVtgIvX zUFvQiuoA)Sq4W1=d#9GVY{!}p`bJ6mMh7~!wbmyTp4ZBKn1(E2``7WHMxmi{rYv}C>PkH{Xf4XO*M7vhk^FV`mjG3 zFfAVUxjxcx_3FL=(Z+QN<)p-n&*w3HppC-o=H})?+IllQtdp$Z;HJBIaxXUa;`gs#cg>5cKq$)cId{%b zu1kjr+|?zbl4E##zw-^Hz!!QV1XOPZ~?vLeAX@ZvCe+>k+ONY=k~K##Bp>B zVhqdycWZh_zV|EP10>dp`kNY^s+BwS%AO5$cn{FEugcfhnwgmF96M}SQ86)BBNDIk zc{;ez@s|NJ?u7TKMu1SS2p*7c^jYb33fnC$XZn8{(l%X9&A5s8EHx!H)g`1kU%tjq zxG=4A?iJ_4d-ITV8+7pb=9ye|Qle}lBBy61)!P`B6!(Te3o-3i)6~2VZ`O9QXwMO{ zEO|?&*rB?cdnTPiz_+J%8dGG2L_Hg&9AE0erKZL*Bt$Ow`1~o!yR&inuA&!XowRj$ zaPrIl92cNOs$7zkuzH?|5UrjYyuB&X2HTHQu58_Dz8>wh*Z^@el)&@;&kVs|A694B5x44>UhJ z7zjM%$cJsw{uCpO%LR~DeB~Ww0Y#T*itCHM&-|Zlo}L&M*i+7Rve7Up0yD57pb=A+ zecb+_s++8&3Jx{m)sYupZaD#E#M$sikEYz79ov|OoO@@XDMJkxyKj)|^FrI{90$LP zQHC@Z?&Ce>XBPO1Rk^Q?dx*_!|ph_xZ&fk$Upvw|gy8@@0 z?$g`;)-cWgLX6!E4Y?6Dzq)L%!lq~MzPzHMT($DHT}!(3TrC`fw0L6Bv2*8yzH)M; z^j_X)fP;*~3}=Tvp_2Pt-2NT`CQ)coP0h`1(TLztw{Ke#M$&{dd8MbIzR5#_M}a4=Zt?Q=N5-6OR+$jMzuz-?U2`{pZ8xxkM>U;L&? zkzbOEPe8r+Q$<|Ub~5AOhwzyDD(+sz$n_DRMehrYf&QAQUK`YfeEpZ|>YjY8{3TpY z0FMT`{M|_^{N49acg;%v>?vFh=qZ-pVNSM=bwPZK4pi@reU5J#$Gm-#KVV}FBoIXY zzIxscqVjC?oTlbCjd8xPpj@es>rZyb5@xG$;;Gjzu@Ulr2#6?UFYd?0Oc{gP zCrH!%XDo#@qDLI5WhsFMdkno(M||((m3qyz!^-_H5U8L-6IPuxe8h;QDi5mu!wZ7g z+_aCnfwIj`Z=f2s&|ONaIlQGpskLFPaO7~D^J33&+w*v7Hwe531#(um=dBV>bc_-- zXfHzZr>b5U%P;Zep+}q%Bhp$kzWnDLy?bKo4^pieDGP?|qMie%Pc|WLT(c=-6E$to zV=l&fgBLk7?lTpJ+S#kCzI}W5>f5hSWjo^o^fG=1<87laytK5=~OBaTTjN-|3!tXm%)AHNA0mqh7OH$FE3c%%H3=4G_4 zEnA^UQ^XNlWUyjI=EE+=E$3gEl@5)z*O+}R6VOS!<9d=DCK#I!xW4JmwdwEeow+SN z{R-3ENt&9q(X_R?2R4Ly-zelt5xM6M9Xb%+V$#Wx1_BIWl-l>|yvJq7r})1*Rlo^k z?lIbf_vcO3r|1e7hv}^ryLU&;xRBQIKq7`-cWPH`X-tND(Bg9iKC&=AkK}^pxnBB0 zV4zM#(AT|-k)xdcwzQm_x+sfTZ7P~bkL%~>Y}zys0bNA-LF+xymcc|#r`A*w@b$l( zoJK`;Kb78HIy|7W_7reI|Bj((zHy0|roTzxysQTB;q5fo{`F>XNQYpLw!*@(}G24h~W!{^^yNxal|gaw5E~b3}Q5R zpH7H3lv)2rJ{KJWKFdZ<7) zeCJkiaPyRWfV9@pzWbdI<*$S%==SEO3uCAEThLTugJ5pFVA+oL6U95?Yx-pCZhR6-A)( z4k)Cg-J{p zz1$?Fzq`XEG_keq#h-r?Vu9fX-gy1Rc6jo?gM2zHvb2UB+!ILw>ufj~(mEjc87m!Y``f{MG#( zA~|-{s27xqKfgDx_!y6CCD3=VS^2E+xoTPiN9330>V%_h%?WKAjxhE@bB^iiF{;&&x+jcNMvI8N5fuf^%u~aEv7wuR z&P|uwiA=OOukGzQEO^?*Ya<9;c!kBa-9XWrIg-Rj(V2jNmXFw#W%ItrMMV6}MinrJ%vl@F-A*GfWBMDPVCl!t+8dl?X;J3AV4Km0)xp;&I z_VHH!L4hh}4=b2Sxh!0^Oo!a{0IGoC0WYS>2{isj34y=Nd!SJB3}G@YIU}QbiD`-w zPTysOVt$Hg5MD_RlwQ4iOE_s8J$&%$P?E9IVoVuzJwByEf+oJ z?!ia^G-OG8fH568hfzL798tjf)*_mNNpN2uHkZF6k}(&HBh=k*JpQ)$TIQfI<;90* z1)1X(QA|0Qij~TT!TsZIord;tTSIw)V8r`g)<@^e|7|VtA+?f%^;zz42uG)jK0}4K zTqWfIj0B^Sf=5^dXS?lbzOt~hHkE@+->lY?1Qc_sme3(R zb+Lmp5-?$_h=8t)>MOXiybB^{!?1Dwuptw@%DQD$&b>o(?3I4bpDE*T?0zm${f%>w zMfu#cSKeOzy=Mm;o|i50Ll#;G?$Fc^JWU}yqWy+B4O1siE}Ic-&aC?r&dP&pLniK9 z?glg`2w{q#3|+V%#Y7HB?{6QTYwB;{6%XSTu7AFHXA{6Is1juYRViYS!q35@uJEtM zf;Ilg^dBn!-~BK){E4J^(80<#r0TRvATh>_TB50Nl3(^y5l@8N2i*@`nX4iV41bFq zDKzlr#kJqxjnbqA7mJ>dC9Z^oNE7PcwhQt}Dec@!OFL$OYI*jGQ_a-A8M_YvvFR~@^c=RX%U377^D2?Omky7e?a$p zb|(kn_U}n&ElM{KgwVCGnHvY+xZ$>XOh=%|9IGNgT%!d`hkKDGd;X$D?ej_^c0U`2 zgU^*?d_@=TtY*#0llyyJnggL;n$Cbe$aU^D8mHSifxf;CZwJ`*Z8M?~so=O>lA4+- zo-FRzH>XM{%3S|e^EF~?ks7+ucywQ>E>co3JXvDX*MNf@=EM7^gQu~s>-qSu$Ew5O66%@g(rS7Pl?8A&HWOeJz*f{FG^QBem>bkv<4`1>qO zp6Csch%^Y@zeR~b62skz3s90$7fsRLDdlGs^ec=uRqG z+q7(*JFpe6jKki!@BTBA?r<=<=a>k)o8R#iTwu+HFkAHBSYXB^N@Uwc_LaI3ikQPk zUD6Rra-7hXF7GSxvrLRV5U;@R1BjY)6A)B(_O%V$_6V#npzcYNUQ7PlNx}^>8bgJh zTp&O9B>zhMaxK3%zt%8}*;Sk&3|36dE|hEg4Qd}m`!F@&?!!sP0O-Jn2qkduoZvf> z0a~dSNe#4&|r!~|?@`K8=q_q-FERPZZ!DxJqBB1soX;!hl^69)I{a+fk} zyvjXUeMKZz@AY9lT#CHseSw{53tA#h!){tD4+r1 zEI*8f=I1-h-E;iIiVJ&bsuf?T_yqMdha=W_19^NFgZk*I*B|Kxkmh2mhf+HZ$BO!p zjMALSQ97tdkCl3iJeE<4wC9Eh*fTUuz=1O^np@k8Q*e0CArbgnNkaCe^EIY-+`xkp>=_Uj z+x=xVWoHvIkC-?C{36op&e=EO?D0*yv55$t|3azP<;0}@-`Ho-h_l@5_ckrPu`)Ah z9?Nt7aTu}9FwCTmRO-HE6J19fM!#^+ji=({(#j4@@*l7QNnAri?yj{>hEZTZK%VvD zj0szM2?_!L^3VhrOMONUQynwrAfj_$gBMq9x<{_7~4$3bp2wAjn z;g-41Db@mOQAd9`yJ_#V?;|iFyFT(*YNlzDY0*);dk2jLY7Imj*oAUY^@7-32LO3$$ZlCCwDAr-XqLe z8h2FRh@uv-l?~JRPsl-wz5fi>$c^Mhphgy_qzIfc=CLa^VE7{?7D`wqD#*)c5@mlN zu$5v0F?g^^66Md(RMi*zFeh|oI0Z-M_6A22o^!TMcT?)k`V_fhL z6D*xNXXalw9drIaDa$bRnxL5vpG(|(fB5}Uc_~^@jqbvB`Y!%Ydb-m9;HJkJjZS>< z#1wxjm&V6>isNa_e@J^!4p6_+G}_&?rVc`9-OiP!sP(7t9n>SC>nPt|y)cH*JBM6H z7{dP+GyPK~1p1w2YmA8I&s1GA5B!RhlUE6RIcP75X~gYB^LMkB+*gXZ-yYBQXKC^=~*=w}e82bt;z{H>jO^JX$9Y5ZcyPCT0&G3<1=6Uj)xz%wP z=C3gZDA@5Ivi#~q10$D~Xl-LRy&;j~M~_~?tj=_Tc|T{b=bQJRj_U2rD~qx(wnJRj z^-}V2#GXfK`I@gEFL~V*<$o&xFiRii zd)ntFAild|3~fvj;=3Gvx&~s`W>dFlKCy?4k(-_B)*w=@ z@J_p?`>31)-6A|-g20POh`XylmVm4mI~moWq?(VDCr6#kf#lTm{pK{B=z;5>nSVvA zdb0>uLl~=7Hd?>$zVhZFyY#HitQ~l7DP+yvl8Z+5?4K*g9CR{$El`eZoe`*9Bj zYV-isHEe;NFO|jsIMJKaUXXTasF`m6G_B1ui%q2@+l{|X%sOQNkYR!9P3S2Oq^x3kv z)At#Z3E>Jw3%1=nuYsIb-*+)8a8U_fG>tV&)A35`WXF}kGd#ro18G&XAtbYq$JT0j zbQGY?gNdIaO*{X{k5l|pl_!m_SIqgCox8JJFmb5Y^n)dlsRP|#zFZ)OV^~WrsvP5J zRvYi-i0d~C4s`Z0P}u}8>39A9yqf-GqpP%5XD=A8#FU#*wCmn=oUx3mzJo?bfUW@g%VGA-7YeSP@`3j+@7x&P?sP&_VCr|dp5f7o3LupN_vwLVljZ!Vw~ zE#$hjOw5kc{~Ws~4Z`GF#c3PR1h3UGr}kJr$`dcf<RRrVAA+{T6H4NoLdPx$ZfU2*F^_MGHDY;T?75)1&xu46MXZ=Wq`yl%_xtzL$lYXQUJqZk<%_>OIcgN-3@zF2 zyoCD$lM5TlWXET8J3Pw`As9c?Tz92wSI-u6LTj43MsIm}W&?%reh%t^b~Ys%?w==n zi=LAKDF@)7aYM`|&YyGeeN5Ts#TRHoeH3yH?8tQCS1jlW_h6cO)C7HR%|3iKqJ;k! zL??{^Ay;2tOWNQ?HuX&h;v8(R*|7bA0M=OIN!f#OUe5BJkOgTC%2L_~YzJi;ckftb zt&yCp>~9)$vsWYJ`_LE=ut8LO6C9M3l=N={MR&dfMo5Suae-%J)}JanK8F{moOa$u zq3iDr-8y~SSG1ha=3cr{_nz7f?ZSHh{o>y94|iW%^2ecf#TvJbEO)|TGhUF-|5f}o zue36?UBz-7Aa|szphnH_nJ`V_AMYcSzAC+|AalsEGn) zGe>+YrJ<_85@zKst6eW`Faqi5M#?NR?*Us~YJdF-QhdAo+}vw1f`e}3;kRP9t*tQS zoy)7-co?OR%bXFt;li8mEK`)SEYZTr-@Os`ySD2qE&s9*fRpm-BBj{xRaJ8p551mV zQ;z((Tg;>R$+nCfvg^h8mGjhP1lfL6gxF6#*`;;5h*A?%Q0Xuzx-;l_d&>;f;lqpX zNA6i6ggcTS+PRsT6S`04fD`<6--{Oya^Q;&`4a12#8x18!Zk+n)1Ln*Dyp4B3t9N* zZSEz%nCZiqXm7sT`R1r6onAibTtD7TB~zQdBx2ek z7}eRRrVpN$dfGoLy-a1^I8v-P6=L)p(g4vNW}DrcIKK?J4tDcTeo8M+XAH3}bB5$G z-9e#De1E8wEdP;Py0jHA+vT?%KO06l$C5daWK2aT&G`#bVu-iJQn6`jCWkE)JY8E` zH5NsWo3w!;n#1!K!=HweNo;UDmFMR-jvDI1$+-BvRi7IP>+kqA{af<=KJD_@Mte1A z`6vrTH~Nvj-@q)5imd9X3bVFww3kx+23G{;cr^9) zHcPHN3+H)>7)%jnI;lP5OQKtQ7s9(q!nYunh%7qAsVJ;{m>$&F?1d^cx4p;wVG12X zsmGXp7-&Wa1M-LwoiHa0aIPq2^oB6){`!L(*DW%&gktG4u3;x2oKv7!Hg^_FIA(}I z($7ufyGy$6CK)78JMrwC0bhA{`|s#NzLlJWzF1FGXDE-vx=mF zGAn!&W1N?gb_KzX!9w=p=t#V`gB7Gh$y+_4^W46?@PW02J;zM!^vO|MJD%YM(|nOU zA1lCR28S6ZZ{Lh0kj;SPFK^6@70Y_pUdqgVb`P2#Etjr}>@`7>$8UdBYzG#*-5IT+uVc@guc`yoP5Og0(swjoSKf$k3t147AE;wqw7;>3vMhjT{^r3Oo-~KY)KU zzQ@toN=i!ab64*QV);jMO@@w5FANhwnPLy5E8Z6#8dBJq&iWcXCkBkCpSzBM^Ho7X z+YD0$7iQnvgz5YI`Y^M=8T)0$-ZJ4HBrbv4@J?X?v)Jv-^OZHsDxw%G?WK7vKsfFG z@WF$N@;`T{pICWY@5F0NSbR8KL917HpbC$AeMUn)jd#gPP9ijcY4%VJ#hvBB*tsc+ zM`;`VesD*PAP2;8y}l?W_}+T8Bvh!*kw_cJdb(N0!rZ|p0NIVE*=Df z7Dm9RbSvb=_yN{O=0aS?E?!hzEO9T{as<-%K&+y|kBPv0|G?o1zkdFF^J*?e43D|i zd)g+AAHVEQ^L{Rr_xc6Js8a`$KHfX!>guY+CZpGWJxzAcDL6B^58gKpXI5TK{XT%a*__e^aY57G!$vk5T zm`8S9ulH9KJF!oE{ja|<_cOLYEw~X770x;@Jmz z%CVPN0;n>&@4~AP(UzrT?IZTyX0&Ws#@?dfD~elUY~ztU6VH#;X9)4@u3+l337KOC z!|oOH=dUhJd84)eia*bfh|R2`T;pk*YHI)buK|?6&1^&n=%YMfK)|H4nK?OK`NaGY z=kLnzuDZs{2lgSZfceEArwuXPk7L`N8lc@>cpdO>ifI)TUoXi;Mm_H|Ud;_$IPw7l z`Jy@RjSrAIQ_@!M#`w&E06d}S`{};x)_sLdYrRETC5+KbF2DY1e}AjxR45{Wh3ay% zQdU#V43uy>L)cpvpNOcs`}57;UySgYCQKGoVb-Vpr`{z|U)s|&e zBE31Jee6CNu{1FH;lurxx%v;h(DUiK$2|P>Z?Auja8 z(Jht=Z_M*PS|-XSz#fbX1vf`jr9;uJJa zg|CY$iDKVg0?yXD{PttDwCdlG+-=*dv$s1L_UZa7R+yN-sQCTo&%g)5hV;Sd-1l%&4q%Ox<^_W=do~V0ggDOaqVTykdT! z=kvllXXLP{Vd^EJnX`Qiy&VVfMlxn3lXgOqxM?yMkomZ-uMa`+O2}_De$lu$w)8WN z=MU|7!Kuzg6LolJD^f`{jhsw69z zUC4nD4hyk>zba1+h|edXx)U4UhP5bnJ9si4!-a^-rgLC#!AWakAxCjam&cf<_NYc2 zZ9=5$3^aMvbv>KG70Kbybm~|O>Claj|8yR4 zHpd=Ca=$b#z-^*6mwqu}aQ!Yz+gBGSw(*>toYZdo2wZh9F5qhVd`g zNXCE*Yf)5G)M) zAw|h15@3Zt6Zi259fq;VdnCD{i(+6P|w~!oMECqK=%LoIkqB!JyHs$@6zCALwDK zo5ilqU{(d_>Jv^ENCj@$6C~!e@+&~+bIW?7Y2H3aXpJ)>AS}4jcn}2j$Yi#_bScF|N z^{X|r4JH&!c7Kw>qsWG&_LxexPufub`Pn)@n+sJ8!t}xaN|=sR65U`m?yeyn^bwi} zMq?g)c`2iGUR6Ot+dR{|*#gJ3a?P4L$+u72yUloOx+7)wVTfBjP#+&T@!eO@AuZeQ z;4r!t?fWIO;a2J0_QS} zedb)I2~5ZTzQV%rjY7hO&gXza|NaffLqaN8v*cwD<9zo{E<=5OsBltg+TSpgf951H zVl=SNhQY|(K;_3~uP*xYB~>El?3Wgs4@ez);|KwV`RJd`K!0YrITCw6j6E_$AQGGktNm#|pk3Hbmczwi$G<+eVDK+lR zs+8O9rpRnJ8$ag2ypQRhW3_k3Tn`E|*@J_sqv@wn2J6=4{r>f3Xg8CRyctC{8` zUd$-HsZ7u|ctYYQboC`u1Dxm7r_8vP{r-OcsTNTNp_Yk`>~v=b;^y_r0}mXoXp+h= z&53)!g6``t4UBi-$oAkzZSYHb6bpj<5Kw}?ljrB*3iPf@Kg0IM;KcsM>!8kpqHkTl zcCA_Dn-$Yz!E(|HXzduegAe)sjo*GpP3r6GXY-x~({}}W=JcVd*$pnJN?7bh=4ITi zDs{Yj#5Xpx())0S?}dkw3kMA!-f@P-gz8dN=?4h-?=uBF^;Ykwyi<{(ehVk>lAz1Nr>p@CVNq-^E8~!O>9a39a}(*pY4c zYNLs&YvIwf<{#9$Yns-cUBE%NtQc#^k)-u<%kRh3Q)aAzk#sXIz^vW6C;UPumUatE zr*lkja7xnYp^iLJBO%t<mVaPi+wqmR z@B4+g6$XGcxq35LQBt@F1yKE;V?C&D==^ufhoSqtTCDqh%Je-YOI|D;;$3T#|0L(u zIxhj#IF)29>8c~iM=$(=Ue@WSg=OZt5e z&{S8Kr1AYSvMeSsc;r}`)l=iYu5aAN#A)B%*c<=j=^m!kz5l^2er*>n>qRh@uBRx~ z?`#hG5lHDyPchc}CRt#wPf0|BI#-78nVJ6( zDG7+Vn4_BXB9vogV!1{nFg;~P{QEO5O>zH<*-?@iq}l7>y9<^qiQ76X!kLw12LuDj zU|-?Wj*rfk?QL@wvtNvYH3R*(7I}V17mc93VolBj;&n)Wtp%V6I$N$aT)y0O`XvL@ z9NGS>dOAFAE#Gi{VZUindM2kLU#=Y1r?=LQPj(qz$@|~j6F_kTl|Rc!PyN2!&ST+? zyTT{1s{Y#Wi6N*BpKq1d2}m?>b+9{{l)!#|1;YKei}{E$2HCvl`#N zk*vslob5cg&+!ZvR;E9$YhL=6=rPg@D|kJ!jtmkeS4g?6yTpL&@#%o6t_tR`dnfmu z&=AQ8eBmL87(?fe4`y_4m-F?{%Hvz3+ArS9jcnxt?hH&K0ng2JxdfE}Lu*1y1IbrTKbHq)GSsXxoC^)f5h+?>{| z6}5En!%Y!H7Z?tc5O;pP@tpnO5Xc_Zq&p07B-vwL>~_8VJ_f*!^Xok4Ui*WTsUttl zy||)ce-$waGYvPpn^TbCxN0op?scOwcr_~$$!eQci4q%2R#kF>#g868-pE5`Xhr(+ z4S)!`oczAp8frJCUW+o(8m-+&mKa^zK%5<%;8@XB)p&IZB|iFj%;?dLLQiYD+ukGf z+qj-mQsq(i@BeMw)HX$(-S}tiD7eN_GVN zxB;PZ@8-Y9A+!h%%}CD!PxB$9xiH+JTy!*(+=@GhA4u*__b3ec-x%Qbe;3duAehtW z%(8Y*jC!9vMSJ4Jelt>E9h<5fg}Fl)md>>ly+w=C0vYEo{r=#+?(6ICUl|@XR=jt7 zu&U}(Bd^=|^7xA9<{1m{Spng|8~+vmwp`T0x2U1$b$9Xn`D%CmJ_BQK&ah5KYGxL;8% zS*H4V{{HG29lAsg*OfdpY}lbc?GAO=TwNJg|DWC4XY#Kt_P!m_qPgRp=90J9*PRM5 zsi;rQs2|vM*q6=UCKqHJ-Fe{YwQsII2= zD2l1&1^S+o_xruBIPv1ed_?ZI{X5=UjW+%rIGLUx@0fcgHpP%FHOp^aH1vJp4Qb=p zK{T&#RDLX+m220s&xGYKUf<2ZD>d(ALbb2Hd{|~u4BKvMMpkUVgl9VDN_KX3!nf*b zm(ir#vHc2|#737x+dJv*Ri$DTYq7*oh22dldd&nl1hr4V`-l#6m3QgUBWr4&%k4*< zFW-22Z2qu6n+F`LEGn{lOfA~4@yVSTm*klh9E*Jaol~`-JHfpuW~@%m1GdmjKPXJ? zG%G0LKZ?Q9qdOB0oO_D=iu6@G+C3>^-xY?@236E@MmnBGw@|poJ4}yPsEEBx!LS!l zUv5ZC3sP?g(fdvO>>HZZ+~{1knwprnS*jcnA{Y16`W-oEpR13mi5j)u+G)MU7!3Eg zeT>^$TZ971NK44s;u+FkZE1PClVM50^!I^pqqjPhxVY3LT%gE$k(L(4R_kY)cal&9 zN?>lU1f0;F65^5%YangE1gwYP}d{KE83}64sD8R)?w%@1zrv_8B@${2^lYHAP+htwX+r+nk|e z#%!DE-?B2Zpdh>;FK<9Bu(90!UiY2F2{WY2n~sXn=VvNh>sB)U_S`qFdKggHbQ`|q zcvM!~10S{H9v;bu21!eM1lCvP9+f+;hZ88%ddZeg57zrqS2}t06W9ZN@7~IY!wPQG zHE-)o9~`vf);43~K?;l+JYF4tT%g9IT+Ng5^jvpCL0Eu0+7hRtfs=Dc&bk(Kkj3&w zQ0pJ_%V#jD^k|eXI&!2_ZS+d%1F9D`lvGtYSGa8Gl!i-X&B~R(#ilkF<3wf-hRSdv z%99O>Slx9OpNRidw&+T%eL`?C3S;sYxZ5MYr7|=Pllf43cqVSw z_GwBg;uC_C;WT5&kf%{aGq&Kx_|3h$v~F#tz^@tI(SR`Sq8XNYw30JgLXZm;zUF?%8Zm?YM8>#__7E4=xsrThD=YB@O8O_nnh3^+C+=Z_8CT zpvAgF?QE|%B-35OXZa{iz|L#Xa9jSWsn4dH%FtiCHumoQW0y$9b_Vp=V)EoCm7hKB zwWG3Z1XemTVj^w5=NjjwzkaQ{Tsc$C#UZ%Kc*#bY_ZJlD?wRBZjugsv=0q9pKEha< zQaXN%N5q=;nj%|dJGrd0Uq-3B?x1$86johxp1IV3qw_Bee!J$FUCADMdw+JQY>w5< z{rK^3(YJ4BuWA3-wdu%fwejP<+_(O9=lMt1s)!@eGIrd&!Bh1g-pZD~oqf~7-^4Cq zp691>r}s}`g)QEE;L#^>*MSD#7U?(BP*vajrYk3CrX8KkXV(Ea(okcaBy7O$-Oc%X9FYuGJ(B&hr(&c zi^(`B_ZBJKAc~m?efs&i-Zgb~2mE29z0!F;YRs6oAM#$c7F?jctQxp1EJ zlIV^rou=x%_gL{kdgX_2tm>XCwR#C&FSUun9@MJ9vbAvMEgIFwU!zUm>R55+4S(?; z*5~ES4Otegk$w-Ro@`9rTjSMU-*#qdA4kkq->?eXt4UT^GuFvlx$#8#JmXKNo>p~y zjuQTEIabFEd-Rqa_XotN%8pfvujr?w^w&sb_Jz9I+SRm3*&+rN$DlWv*YFF>%%A+4 zPw_T%0Z=D`QWDM$g`NL}Ssqu%yW1qR$i_F8C^l5Pv`M$IW2UeoJmJVcS0Zkn|DP*S zyY27p24aof1p$Fwym}SS{>)h`V{&|agrNtCr`0@oALwe951>ocRkYB4-gH`toyUfR zKxcBAf3~qm`!vpcP>7?-w+6+oC|X^EuR6nQ;`#nG+IxQO=})63ewhf=xAkCgy&Mp1 z90GnbekXc#@PC!{p~FOv8~#o8ed|kX@;>yj$4pv{(avxO=)p%eEK$C9l3zN(t$4Pb z^3YzZ`O-%Ye71S(h_jY_Ku$^(OH6L8%7@my^Twk`AFZR^_K^Il5cFY>t&81pg9Z>s zDq&ssH67(qW4rH&z@lyb1<{3khMfQr6WS0)tjT-I-|t%g<$@=zX8DP*7r*n0TkoPj ztVUX&gMmvJXOK7v6W-dnc>TI{FA?~j-hZz(WXLR{CZDl74FcQkw)Ccz(uLdRe@_3% z|JyClafQyAj;x|SOm*6rN_lku{%%|0DF2-@y_z2>JQW4s*%y+ip zU;U|XH;;Y~Jg+OJC2Nz8Ye7nB#~9u{s;N9UwF&Zk36o42p8_V4k2rUaaAtnDQdA8q zj$5NhrG1!5O&HG2)(9?^YCIlo0SuvbfZsG?Ox|1**LEO{6i6`tVLh5$!IY^}oxj1- zKTqoZ0v~AGUVOS2D1}CfcNpkO!%_a$n;aNzJJIHzQh3o!*1J$9x4okxk>TGY@NZmx zAg_5pe%u@g&=YlFX&!Ge2G^a#HKX7KHhR#{QCz(ZChVi?%H)GlAmdsfvP$% zVo|W3Yu9dSmvvFj%1#;x2gofN{K{FZw1`@gY2%R|DShJ?pU!C{#SZHOdVR(~DWiL#Gp z!h+~VOR#xN?~f4Y?vT^m8rktVo(zkbfBMV>X`NVG+Kj3?9MwWT?S$`>C)34%E7sFK za?hM{tCNhV<8EBN`gOO;tDfzyEL^&@b<6hc>ARhr42>4qUwxh7_Mrap)RfcdwLgEV zVd5b0DS;a*?D^+KhaD$0{AK%mL+LKBQ{n{W9>0Tb>&P0D>B>%$~AJw07*VmAooAvEkx(1B{bt!)TvPWSy_gFSqbPeB1j z<2C#;Z@JQB>Sp-PpK?UjIEP;1I@#~yj-5N3lQ!H!e&{+2Pz$F{o0djK>=$0@!=#%2`Ilift41K+YHgs?rVK|silj-`IjfAe;Q zlRh~Z1X#50&%OXZ5TIXwIyl)8%GBd6a^Qlrg*jr3lBP$yG09E$1y}3Bq(a-5T-?7n z(ITk?GC5Lu)6@px!kJ0wD8VErpQHXVhPB)%bjFRym)hVzkMo9!e?|5=J`AVa5jcp( zJ&ww}D75{{3Na^Ov+r0&-g?4~^Q?}V^bQ;!Yi-YSmrxb-SC5$}HSnh#>w*CBKdC!? zN~#*g#`8mmthDh7+t~{k|6@T_{m+}oDUQoVoSjm(ew>C&*73VHqH5$a77pw4fBtuD zt^kur^-28ORd`b(6uO>>86jI?Q^A}`#TnrGwxjB}9QTeBz;j{fxh)=Y$t>|TsmO-B z;1o|xN$IqG$BrbfTq39!*L<~|{D_f3er9&I(I4**#BukR@}9OPHe%pX=&ULDX#!5(Rm z8MFS^K0fd%!KyPb^m(yqwxUnnR)rNSS4w)#_|so7oK_h=amdsi)wi{4MUU0|O*Rcq z&g4lS#y7pKX6|M;$q;8mN}tU|$BbGu)U~xw4b01U{dyLAZp89DnP+6W@M8;ryclwy zR$W(Tc8Xz0633qj{DKIEaheZo3QnbP?itgy2|(?~*ga!O6t;Djju5vyU;S#{iaVP$ z$Mx!xSWw{Ne4$_-c{SgGRjXF6+>`-d;F+UJ=+Kb+gVx?wBv#YMfM2-41gk*DnQED}~XqEN;%AURSc$;zh#u1C85+ES$yl)niU>QTOu( zwO91Z;fRWC8jfTI_{9BLUaLr}>rR%=oe5(Lp0^gx6nE?Z*BG_WMr1cIG~8~me7P~( zId+`BeA)W+xpUW*<>YQE%gf(ZR#3Pjr=%2GO3RMFSo`C>td+2`U^&n;Jcq>7v_L*fzvVst(%cdlIxXrIJ-BwXlo zjxN={HQBLt6s|unoF7%2Uut5I$UB!-+?A@#C@x}C%Q4u64QP|j?!{lXLdhcHR^3Lb zctrh%`%d*$8z1ejS4Hyf?A%hP&)d*x#M!P4oY9n}d5XtgK5*Ttbp?H$5->cq)Y7hlpKb@e{D@-nNQ@y*?z z9eMq_o|XNOw^Kxyymur_x!E|rI7poi74J4izy+&kU1B@gti~;x2V8tj1d}>WpFTa2 z@mza&KZ_F?U+foRc!{=tJIfuT*pg|aCiQLR99ULNV}2-xCYF<78>p!GjuzjYOVw^g zjNTAIAZ*s*;WwB&@fQ8Q4nfE0ti9dxU4{Tfe;i2gdGT;9q9((VhrMtKXdl%U@a}V z|KUsd9(5lN;@%$&?37Y&5MVjfwZZsK;NB%=XUp{x%oYBDMzRqIU-~^ldBTI)E;+tu z`{C#wj%Q&yyRKIb8dTt)@^!uI6S^ zJbkjlz_hi;6I^`D$D9{=%8VKHN}{hv5IB=~b>(e^L`b`~EMDhs-}I+LW$`o23X1`{ zwVE-@e%i3VDV1;MHCg_$5M`O$<}EC@KFg{rD+AS5+R8hO0Bi~zzIC^%a|;)*b+wFq z(Vfd%_3j;?U(##etT}JykwJixV62Hjt&ffcev_K^6ogsek%E3RdJfutX1TPmcM| zaF-To?UveA4W&A5T?3tdcm0>`a^e5~FPsL%4H$d`{u+(5!dPzfu%~*H5$^7;3;wq-f$%!+nJ(> zpYo=R0pe$xWESrhC#pOp(}j)hH$tkUj`Opr&>@eH7&w7nDZ!p+@hF(>vfJj#?*mH& zCS%sDS*pxfH#@fLDkT+5nB*%z(_qQrb>G&ixG6<~gCrs4hU7){EYRM>WREh|J$C9; zryUws)~b&jHFfIx%_y^7CsW(6Wkyta$=CPIyS<*%*aE>zDblUvjXjQdc`du^=O-WR zw}=lv5O0_lZ}yDn+qH}4^1>XP^YxSUq#DrB*1rg6cm)L&-gDbZQs=*njD)0bzp}ut z#x>Rio$m4Y`N8Buv4e-wrPgAFTm(p$FK>co|4i4&FfPyfkoD!aaEssoJxV3#>&mT? z#G;pIJzHD=#(Vd!y(aq$huskXioR~BBrVPi5M+Epi&qB4AL+7gN%U&tj)wG%UKo0M z8n{hVQ|lGy(&pTL%go8YPiKAjuvKvU^4TEz?z-rG?!X1Ra`R^Dtd?U6$A#tf%K;0E z`6DCPhuEO&%C~-4(j%>STe}b-5;z;z8uNmUlNP14NCVTgh?EX>G`4F-Tdabrbm`xI z4i7{XnfI<=20H~z-uV>T`hru@UG^NlR$EPXV5{HWfXnW*k55VT&TlC;kx%CGXy4)S z)FGUbA}Mj=?x&m2H}kIZ35ap6kVh#6etzDaF%#1N30D>xcOy3@!JNfm`an!pgZBTo z_Kf9hbt}fqrc}hfC#KWytYNWjxYBfoH*B*ox2=Qv`R4QIztckHv6UZ> zL!@`Ck#iin6W2ASQ$3BXv7d@S23ke7Hd0<0@nP?{31NlW!AFr&7SEEqYLCE#D~_%E z+rPXxki^TQJ9o-8RK_l>n)$N_YsaQJ|9#ZTipWgK=Ek6qH=Ay+mJH08r@UOY{aUU< zrX7NZSSV_y*1wJYQki^pV_QI5=dlr77>CJ9DU7y-`Ti3GNwTTej7}m1h?n#!yQ$(P zVfUXAn#k+gyqh$8+Fz5)_0tCReQA9+Yw|e;5`*Ec`x|(5VY{}>sR7f>Ts6($G}~=m z$B0$%KfMg@t`Mg>{;dn3syCK$uH5?}jzBfFD-xk}Sx2QpdBegI|9kmzoos|iUcvU} z>!C;cQqw4&6M^*P9sXaGEOV$n6&~G2eNPoxkA9raO~uLmUw--aZMP?Pa^mbJDwz`C zMhBdtEB=H3yjqxLgTljYTHHGc3<&PDacJEnNu5y;c+=T#Bq$Py24Y{yt6c?) z>Pzn2V(_lbedyoHQpU0aEQTk@q?0IwJ9LPHLeN8Oi+BF|ItTyh zHOz*-r&bcaT!S~|Ebg_38>%e&Y&rK5P@Blkjg5G3_3xI;%3|ZY49(C?`Vop^0pC>% zS{N76M!GSIyyjm;pD=lhz;}TES`yY9r=A=})Uc&x@Gl-rn;z2A`{ktb+v$?HZ`iqG zM`hF2s&>!%@`6mwK0Iz@NqFB?UL4Uk5P(a%Wzq2crBUcM9zG)Pr3A-&kE`lfua-sn zq(C`$9x3ZFbj}d(q`$q#&OZ_j>lnj!(3LB??F|@e9Qu~(Wz|vk_vusZq(|=|R4e!_ zsDDS3S%4WN5lRnVTkx(^DAz9A&XNn?sQ$s7bZtB@b zK%`kQWO??|rN8W09~~T{M}stm_Lrc5O7HU-fy=JPzgg8X`3{u<1QBxJ{gsuC+KC{_ zRtbR}Li(YovS`PNJd694mT@*Q3T)o4pu?%4F!s+K|78BmUnKYoMb=b|&@VgvUf@7D zSKu|)4H*#093aD|xztV&Qcu&?zg6Hg2FnmLTsqfVH{YM* ztE1H6m9aqY+KgjvQ`_8PU)~x{k$4XO3A)Z&FRFj=4^XK4e>9y5SdQ)X_M4+*Oi_{u zsYK?fL8y?KJcjg0h>$rd4U&)~US$di(VP&HN+Lo+g;bI`gi0j!{jT=^+sEF=eqTd9 z-S;)Db*^&=s7YCFs|1w7)dXW#^t+5l{kgB>b4R&S)@LW3QwmF4m4@3nSJUgUogc?4;~RD* zB_(@E7f;dcf*_wn+xxNCl&-lh`#eWH@1~{I&^IpSMK>LtIbbkfdxqwo$a}{j?znap zc7j4t3J+tbuV`Rs>pu39jiVY>Z?T*F?>_~cwiK{Yo9A`iH^6y2rqh1-=;5}8%ASMv zx!;`m^FLSMza3qeFbmE0tfkAB8+E^JIU~-I((DeitS5m5b41W#Jtn3N%B|x>eYo-C z{zYrnd^d_(ksL7A+Wt zf{V)Qe}*Eq8rIrL(4~3|7|>4m7~ze<=>tc+zeFqj6~$dvo8y4B=K&tJ6Q3TLXw+!~ z0R|{q9M?Jz@@cgaqzoFB##1!|v_#8Ez;SO{JF70RmBXgB1ZVJJ!^~n7T8G+R8g6L# zIZ=Q*QsJc0`OqY@TkqCK6sDwn?mEBDQt1J(6d8>MNw8`tiZOo>+H&2)Xq+$9xOCk8 z$KN+UV)SzIpX!zy5B|f!I2+`p5+cr1>whVpfE;SRC(XCLG$WKlO*E_R{-UuA@J_C zJCEU7YDZ{GYDjRf-$Ik(qd83G2r`+mP%ml>^z@&$GL!$E1g?o6x3ADQ0B4~@yo1(` zWNV&)xF@4A^Oy(^%98rp^~r7<#~Eh~-KQir;styU?+mO`HN2w|If~Qp5Vc4crcbr! z)<<98`NC|&bQTvhSwd-D|8Zw!++IIEz_=Au^EFpDe?9t#a=)PK_H-Ei!ZCO~z zmf8s^{PL6AG$@GZGqZtjkDGaJmQ8}h4U{M3Z|z%Y$QTivCNH7#6p{#>$mF_*q{>JT z+jF>9fXgY=&FT5_O}L}CpI{F0-kq?)$hdv|OG#;|!-S}Uw=*w1vo4u3dz(pzjvQ!D z1e70AcX%N6Pv2z8@v`FLKjsDPhiqDo(0FMo+Hc!t#+l2(kv(QSjKI#k zo4?6&%i+1lU?Sr?F0k#V{KN%TZ_x7*Z+0$agX(T}@3r{&{^xq#hjVd$%a}#NB+YTv z^9xtDu0;-G*3)`XyVccxeRlcvU0VK{F&$c)~sLqR+c8= z_@szQDcJs#)&x(U??cCF0%lHr&}jG!RyO@!#U3>LQCr*CadM^N6Ll`g9n;L}{=<>%`F7>j3O4+N z5i7uQ8+YLO~gI%GO3BB5K9gf&S->5AJOOFzlZ94z~e5KH#vp*C3%YO%P;?P_#nWY*iU)a*&-qeoXAKXIbzCh(kt@o;yx`5b5Gx7w6=-B}QmmjzPaDp9YI zuf)<54WiK4c>XdL{ty&3!gyGapJXIJHmbgbj~}1vEP<@o;`pQz2e$Ydo9=?@55|11*FmdT(Sqhphi~p6Or5L3|6}B~lG^XcR@6#ceu6syB2T*s?(q zFx^HuQ4%2AMvgcjwsfHxa=b$lze=d@ReXE%)!K6V;hK(1OVLmr)4klUF5jKAgp)f0 zAaUb773V!R>ee z;z+M#;FX&EY$Al2m>cQoD=I1~!fc1TqH^Q1ac%6%j-Rj15PXombb^hIF3rTcdGRAf z^vC?UA3=TR+^7r5C*r=)C`2bacV0x9LtBD!H)3lTEyD z&h7QDoL+4&FF2bDS26Q?c=80@{fct3AST>TW3>&0a4hUYPHg)%Zwt2c6-Snz@cVGWvn@v5u1pvlmwffb)XcuKy87{V>#wcBqmr1e zZe|`E$42DRqY5E=2GGyyxEIr@)kibQN?{K8hEa=_{P~_Ctjx90ZTYeLl?c#>lJo6M~9`9DFMkAB_2tl**otur_U_yFZSSsKTk?Q{ z+ZNRakYKmRu1_T`#f!#U)g;(v;X=oKnCV%ajJpp{6ZZG_O!xUO#x>; z1{|Y?_j^!naN@`jQ{JVIPM+aVampZ&n=FwW9(r-ZKw4j#(johD&<}LO0zF}gSx=Uh z+0N{WS4j_2=dU5?$kNK{R!keMDHA7F5D~mB;N9}lbk9^n;CB5nV-^zF*bTjVMM}Q8 zKiJf*)N*gta__(W8^QL0&F+fahl>`Yb2FBMjnmerl~FES=DeUwcxiX0ZQQ3%D_mBr zXaT=;bp`rfn2GxfcGra}z?-t-WXDqJL1s*1VzCN#_`aJv#K?=-ff^fTvjR^^qIDKCCfP3eswS9>)7-YMR1Nno@wj#QM+k+L#-muG}7N% zUtd&BPjITmF%|)^zg46!US?4l;qVM=4=*=QVi+VRf(q#FMbemv#naJAcSdrRM`JY5 z%ok*!I$US;=HEnwO_{c>bWej;7`L4jbn^MGXX69X$))GIR)AUIxFmfdzS*y47#@0o z+4s(SV(C`j{G0GdSn$!eYq#w-f{RSdU#Qnk+tk*C-X*ggaZrW2uZ)>>p18hm;5DAmKEnkxFzQ&@8-dP+B6plat+|d0$cO`#3wgk4y z@*0vBz4}5e>7|QYTt4Oz9+jsQ27*gg#x7dkRsPO4m2ci?#5uwIb!SMw1+{zoS-l8T zeR2={Y18MNPc^EAb2|bsx&$?^91ntGWH04eOzTXw(7ki#vzpi`0Xz!t@fPM1w`FJH zT)npD{S;iON~%75sDHoSv2R^I_uesa*mAPI+%vu>ahn!Io=5uc>)o+6BYqjeilR^T zQk#S#2E{ij_0D1tbiZ6<#9xN1(;1-LU^bWGu@}CtedwM|kHm5(ME8 z`Gx=lSOckv$3eFqh%Z-s=5=y~@t_%vYtHe7ocnjK>aed4fufc2lg>iEF&dx8x@uKu zkdH@@iX2rKGm-0iRy-P%45o>F$2d8HU#??#?HH$#M7-u4_S`fx1L;@N<0AA3u~@uK zD|quAh%(FL=E33IHV1yCBMx_;bz$tmax3r%hSVfS>I?cQfmoazcu5wgr%Y;df@<2s z`X1^_z9866g z$~8}@UA6D4rK{ZBl(FV{RD9HNz|cX1oRH<#{m0%e z4^ysQ=)M9P5aK`{pA=*bbMZEP+^qVq z%#gpKbyvpM?&Bw|&EV%M=szv>J8A|aqsu}8(iBwZ{^j-SQ_Qa_StNx=&zdj5h=Gdq zaedUNB({W%@Iau4=t}$6nn7z}SK)g5;>Emhe!_Zc^tnH$pCjPIYc+DF*HIznPnxmx z6Xx7a4aFI^jtpLoeSYTX>KpQOs#=*=7pDcuLMs!#jm*U0^xu;cVmzGdM4t>kjzdFa zO3JJ%=^Kth$m!m)la=x^Gc7x7Xxz!q%}pA+@;|161rHQ|{?Y2*{Ytx5t*-9uEF8?E zV`F278`pW?>X_Rm8MmPa+U>)%8I{?A*EUQ4%uBybUPcpVM=kIA-zpnwb57kK}1 zoDXwJAb+*At5+L+>$;0BPzV6S?l~9XIQdUp>KuYITzKCs+|+g**boIf`)UQBOI~xg zq(uAwY#xcT&bohJg)5BMoQ^aekLzEgk6f%JJUv8iHt82Yz35D3Lv0s!6jlHyyc<@C zdPt4E_!p|)5B~(uojk3WxVTji!!~5s)?O;x{zgQ?^yZRj0{~mRX8N4Pxr(Sa`p;`Osl4nRxPUmEwn5S_Oe{cr%H9% zO)aTnAfKa41?f2MOS{*x0;PO}AXduzaJ*i4(_q+~+YtIrHl=Ll#-9?^nr&=LK*t2xkkvT_&KEyrR9Zxp@En^YJeU zZ6k&8Dqu}<7dIJqy2f$)d%pV9f&5gqfhgVpN`tJyKwN?6n&-7XMRC#8$YJlHJ9523 z#9a#ffX!>lJk?+&`h#SvO9VqpxCiuq1&CCrg*gE!YfrCWvefLPQ@h1&Z?IvXKFb;c zG#5Q@fCj5gMU!o#yX}muah;ZNT;|WZxx7(W)Exr&)VM6 zv&9humn-Aqi&eL9+;rK#@$CiqSWa|@!BMIb4pAg_ty;+dR3u%zD7Rq20_?x!Dei
+
+
+ +
+
+ @if (_entityNameElement == "input") + { + + } + else + { + + } + +
+
+
+
+ +
+
+ @if (_entityIdElement == "input") + { + + } + else + { + + } + +
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+

+ + @SharedLocalizer["Cancel"] +
+ + +@code { + private ElementReference form; + private bool validated = false; + + private string _entityName = "-"; + private List _entityNames = new List(); + private string _entityNameElement = "select"; + private string _entityNameTitle = ""; + private string _entityId = "-"; + private List _entityIds = new List(); + private string _entityIdElement = "select"; + private string _entityIdTitle = ""; + private string _settingName = ""; + private string _settingValue = ""; + private string _isPrivate = "True"; + + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + + protected override async Task OnInitializedAsync() + { + try + { + _entityNameTitle = Localizer["Input"]; + _entityIdTitle = Localizer["Input"]; + + // default entity names + _entityNames.Add(EntityNames.Host); + _entityNames.Add(EntityNames.Job); + _entityNames.Add(EntityNames.ModuleDefinition); + _entityNames.Add(EntityNames.Theme); + _entityNames.Add(EntityNames.Tenant); + _entityNames.Add(EntityNames.Site); + _entityNames.Add(EntityNames.Role); + _entityNames.Add(EntityNames.Page); + _entityNames.Add(EntityNames.Module); + _entityNames.Add(EntityNames.Folder); + _entityNames.Add(EntityNames.User); + _entityNames.Add(EntityNames.Visitor); + + // custom entity names + var entityNames = await SettingService.GetEntityNamesAsync(); + foreach (var entityName in entityNames) + { + if (!_entityNames.Contains(entityName)) + { + _entityNames.Add(entityName); + } + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Setting {Error}", ex.Message); + AddModuleMessage(Localizer["Error.LoadSetting"], MessageType.Error); + } + } + + private void EntityNameClicked() + { + if (_entityNameElement == "select") + { + _entityName = ""; + _entityNameElement = "input"; + _entityNameTitle = Localizer["Select"]; + _entityId = ""; + _entityIdElement = "input"; + _entityIdTitle = Localizer["Select"]; + } + else + { + _entityName = "-"; + _entityNameElement = "select"; + _entityNameTitle = Localizer["Input"]; + } + } + + private void EntityIdClicked() + { + if (_entityIdElement == "select") + { + _entityId = ""; + _entityIdElement = "input"; + _entityIdTitle = Localizer["Select"]; + } + else + { + _entityId = "-"; + _entityIdElement = "select"; + _entityIdTitle = Localizer["Input"]; + } + } + + private async void EntityNameChanged(ChangeEventArgs e) + { + try + { + _entityName = e.Value.ToString(); + _entityId = "-"; + _entityIdElement = "select"; + _entityIdTitle = Localizer["Input"]; + if (_entityName != "-") + { + _entityIds = await SettingService.GetEntityIdsAsync(_entityName); + } + else + { + _entityIds = new List(); + } + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On EntityNameChanged"); + } + } + + private async Task SaveSetting() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + var setting = new Setting(); + setting.EntityName = _entityName; + setting.EntityId = int.Parse(_entityId); + setting.SettingName = _settingName; + setting.SettingValue = _settingValue; + setting.IsPrivate = (bool.Parse(_isPrivate)); + + try + { + setting = await SettingService.AddSettingAsync(setting); + await logger.LogInformation("Setting Saved {Setting}", setting); + NavigationManager.NavigateTo(PageState.ReturnUrl); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving Setting {Setting} {Error}", setting, ex.Message); + AddModuleMessage(Localizer["Error.SaveSetting"], MessageType.Error); + } + } + else + { + AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); + } + } +} diff --git a/Oqtane.Client/Modules/Admin/Settings/Edit.razor b/Oqtane.Client/Modules/Admin/Settings/Edit.razor new file mode 100644 index 00000000..682355d6 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Settings/Edit.razor @@ -0,0 +1,122 @@ +@namespace Oqtane.Modules.Admin.Settings +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISettingService SettingService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+

+ + @SharedLocalizer["Cancel"] +

+ +
+
+ +@code { + private ElementReference form; + private bool validated = false; + + private int _settingId; + private string _entityName; + private string _entityId; + private string _settingName; + private string _settingValue; + private string _isPrivate; + private string _createdby; + private DateTime _createdon; + private string _modifiedby; + private DateTime _modifiedon; + + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + + protected override async Task OnInitializedAsync() + { + _settingId = int.Parse(PageState.QueryString["id"]); + _entityName = PageState.QueryString["entity"]; + + try + { + var setting = await SettingService.GetSettingAsync(_entityName, _settingId); + if (setting != null) + { + _entityId = setting.EntityId.ToString(); + _settingName = setting.SettingName; + _settingValue = setting.SettingValue; + _isPrivate = setting.IsPrivate.ToString(); + _createdby = setting.CreatedBy; + _createdon = setting.CreatedOn; + _modifiedby = setting.ModifiedBy; + _modifiedon = setting.ModifiedOn; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Setting {SettingId} {Error}", _settingId, ex.Message); + AddModuleMessage(Localizer["Error.LoadSetting"], MessageType.Error); + } + } + + private async Task SaveSetting() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + var setting = await SettingService.GetSettingAsync(_entityName, _settingId); + setting.SettingValue = _settingValue; + setting.IsPrivate = (_isPrivate != null && Boolean.Parse(_isPrivate)); + + try + { + setting = await SettingService.UpdateSettingAsync(setting); + await logger.LogInformation("Setting Saved {Setting}", setting); + NavigationManager.NavigateTo(PageState.ReturnUrl); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving Setting {Setting} {Error}", setting, ex.Message); + AddModuleMessage(Localizer["Error.SaveSetting"], MessageType.Error); + } + } + else + { + AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); + } + } +} diff --git a/Oqtane.Client/Modules/Admin/Settings/Index.razor b/Oqtane.Client/Modules/Admin/Settings/Index.razor new file mode 100644 index 00000000..001c95c1 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Settings/Index.razor @@ -0,0 +1,145 @@ +@namespace Oqtane.Modules.Admin.Settings +@inherits ModuleBase +@inject ISettingService SettingService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ + +
+   +   + @Localizer["Name"] + @Localizer["Value"] +
+ + + + @context.SettingName + @context.SettingValue + +
+ +@code { + private string _entityName = "-"; + private List _entityNames = new List(); + private string _entityId = "-"; + private List _entityIds = new List(); + private List _settings = new List(); + + public override string UrlParametersTemplate => "/{entityname}/{entityid}"; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + + protected override async Task OnParametersSetAsync() + { + _entityNames = await SettingService.GetEntityNamesAsync(); + + if (UrlParameters.ContainsKey("entityname")) + { + _entityName = UrlParameters["entityname"]; + await GetEntityIds(); + } + if (UrlParameters.ContainsKey("entityid")) + { + _entityId = UrlParameters["entityid"]; + await GetSettings(); + } + } + + private async Task GetEntityIds() + { + if (_entityName != "-") + { + _entityIds = await SettingService.GetEntityIdsAsync(_entityName); + } + else + { + _entityIds = new List(); + } + } + + private async Task GetSettings() + { + if (_entityName != "-" && _entityId != "-") + { + _settings = await SettingService.GetSettingsAsync(_entityName, int.Parse(_entityId), ""); + _settings = _settings.OrderBy(item => item.SettingName).ToList(); + } + else + { + _settings = new List(); + } + } + + private async void EntityNameChanged(ChangeEventArgs e) + { + try + { + _entityName = e.Value.ToString(); + _entityId = "-"; + await GetEntityIds(); + await GetSettings(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On EntityNameChanged"); + } + } + + private async void EntityIdChanged(ChangeEventArgs e) + { + try + { + _entityId = e.Value.ToString(); + await GetSettings(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error On EntityIdChanged"); + } + } + + private async Task DeleteSetting(Setting setting) + { + try + { + await SettingService.DeleteSettingAsync(setting.EntityName, setting.EntityId, setting.SettingName); + await logger.LogInformation("Setting Deleted {Setting}", setting); + await GetSettings(); + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Deleting Setting {Setting} {Error}", setting, ex.Message); + AddModuleMessage(Localizer["Error.DeleteSetting"], MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Resources/Modules/Admin/Settings/Add.resx b/Oqtane.Client/Resources/Modules/Admin/Settings/Add.resx new file mode 100644 index 00000000..183c6f82 --- /dev/null +++ b/Oqtane.Client/Resources/Modules/Admin/Settings/Add.resx @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Name: + + + Setting Name + + + Select an existing Id or input a new Id. For Entities which are global such as master data, use the Id value '-1'. + + + Select an existing Entity or input a custom Entity. Custom Entities with a prefix of 'Master:' will be stored in the master database. + + + Id: + + + Entity: + + + Error Saving Setting + + + Please Provide All Required Information + + + Value: + + + Setting Value + + + Private? + + + Indicates if this setting is private ie. if it should only be maintained on the server and not sent to the client + + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Settings/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Settings/Edit.resx new file mode 100644 index 00000000..9309ff6a --- /dev/null +++ b/Oqtane.Client/Resources/Modules/Admin/Settings/Edit.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Name: + + + Setting Name + + + Entity Id + + + Entity Name + + + Id: + + + Entity: + + + Error Loading Setting + + + Error Saving Setting + + + Please Provide All Required Information + + + Value: + + + Setting Value + + + Private? + + + Indicates if this setting is private ie. if it should only be maintained on the server and not sent to the client + + \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/Admin/Settings/Index.resx b/Oqtane.Client/Resources/Modules/Admin/Settings/Index.resx new file mode 100644 index 00000000..ed7c7cc7 --- /dev/null +++ b/Oqtane.Client/Resources/Modules/Admin/Settings/Index.resx @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Are You Sure You Wish To Delete The {0} Setting? + + + Error Deleting Setting + + + Add Setting + + + Delete Setting + + + Delete + + + Edit + + + Select Entity + + + Select Id + + + Name + + + Value + + \ No newline at end of file diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index 4203f9c0..6694e2b6 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -240,6 +240,19 @@ namespace Oqtane.Services /// Task DeleteSettingAsync(string entityName, int settingId); + /// + /// Gets list of unique entity names + /// + /// + Task> GetEntityNamesAsync(); + + /// + /// Gets a list of unique entity IDs for the given entity name + /// + /// + /// + Task> GetEntityIdsAsync(string entityName); + /// /// Gets the value of the given settingName (key) from the given key-value dictionary /// @@ -494,6 +507,15 @@ namespace Oqtane.Services await DeleteAsync($"{Apiurl}/{settingId}/{entityName}"); } + public async Task> GetEntityNamesAsync() + { + return await GetJsonAsync>($"{Apiurl}/entitynames"); + } + + public async Task> GetEntityIdsAsync(string entityName) + { + return await GetJsonAsync>($"{Apiurl}/entityids?entityname={entityName}"); + } public string GetSetting(Dictionary settings, string settingName, string defaultValue) { diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index 1c42ab7d..17c5c673 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -248,6 +248,22 @@ namespace Oqtane.Controllers } } + // GET: api//entitynames + [HttpGet("entitynames")] + [Authorize(Roles = RoleNames.Host)] + public IEnumerable GetEntityNames() + { + return _settings.GetEntityNames(); + } + + // GET: api//entityids?entityname=x + [HttpGet("entityids")] + [Authorize(Roles = RoleNames.Host)] + public IEnumerable GetEntityIds(string entityName) + { + return _settings.GetEntityIds(entityName); + } + // DELETE api//clear [HttpDelete("clear")] [Authorize(Roles = RoleNames.Admin)] @@ -297,6 +313,7 @@ namespace Oqtane.Controllers } break; case EntityNames.Site: + case EntityNames.Role: if (permissionName == PermissionNames.Edit) { authorized = User.IsInRole(RoleNames.Admin); @@ -326,8 +343,14 @@ namespace Oqtane.Controllers authorized = true; if (permissionName == PermissionNames.Edit) { - authorized = _userPermissions.IsAuthorized(User, _alias.SiteId, entityName, entityId, permissionName) || - _userPermissions.IsAuthorized(User, _alias.SiteId, entityName, -1, PermissionNames.Write, RoleNames.Admin); + if (entityId == -1) + { + authorized = User.IsInRole(entityName.ToLower().StartsWith("master:") ? RoleNames.Host : RoleNames.Admin); + } + else + { + authorized = _userPermissions.IsAuthorized(User, _alias.SiteId, entityName, entityId, permissionName); + } } break; } @@ -347,6 +370,7 @@ namespace Oqtane.Controllers filter = !User.IsInRole(RoleNames.Host); break; case EntityNames.Site: + case EntityNames.Role: filter = !User.IsInRole(RoleNames.Admin); break; case EntityNames.Page: @@ -365,7 +389,7 @@ namespace Oqtane.Controllers } break; default: // custom entity - filter = !User.IsInRole(RoleNames.Admin) && !_userPermissions.IsAuthorized(User, _alias.SiteId, entityName, entityId, PermissionNames.Edit); + filter = !User.IsInRole(entityName.ToLower().StartsWith("master:") ? RoleNames.Host : RoleNames.Admin) && !_userPermissions.IsAuthorized(User, _alias.SiteId, entityName, entityId, PermissionNames.Edit); break; } return filter; diff --git a/Oqtane.Server/Repository/SettingRepository.cs b/Oqtane.Server/Repository/SettingRepository.cs index 13c48819..7305e3bc 100644 --- a/Oqtane.Server/Repository/SettingRepository.cs +++ b/Oqtane.Server/Repository/SettingRepository.cs @@ -19,6 +19,8 @@ namespace Oqtane.Repository Setting GetSetting(string entityName, int entityId, string settingName); void DeleteSetting(string entityName, int settingId); void DeleteSettings(string entityName, int entityId); + IEnumerable GetEntityNames(); + IEnumerable GetEntityIds(string entityName); string GetSettingValue(IEnumerable settings, string settingName, string defaultValue); string GetSettingValue(string entityName, int entityId, string settingName, string defaultValue); } @@ -190,6 +192,18 @@ namespace Oqtane.Repository ManageCache(entityName); } + public IEnumerable GetEntityNames() + { + using var db = _tenantContextFactory.CreateDbContext(); + return db.Setting.Select(item => item.EntityName).Distinct().OrderBy(item => item).ToList(); + } + public IEnumerable GetEntityIds(string entityName) + { + using var db = _tenantContextFactory.CreateDbContext(); + return db.Setting.Where(item => item.EntityName == entityName) + .Select(item => item.EntityId).Distinct().OrderBy(item => item).ToList(); + } + public string GetSettingValue(IEnumerable settings, string settingName, string defaultValue) { var setting = settings.FirstOrDefault(item => item.SettingName == settingName); @@ -218,7 +232,9 @@ namespace Oqtane.Repository private bool IsMaster(string EntityName) { - return (EntityName == EntityNames.ModuleDefinition || EntityName == EntityNames.Host); + return EntityName == EntityNames.Host || EntityName == EntityNames.Job || + EntityName == EntityNames.ModuleDefinition || EntityName == EntityNames.Theme || + EntityName.ToLower().StartsWith("master:"); } private void ManageCache(string EntityName) From dcc2e59e468446a92c08b154dedf5653f9c994a5 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Fri, 5 Sep 2025 17:38:02 -0400 Subject: [PATCH 62/68] improve validation --- Oqtane.Client/Modules/Admin/Settings/Add.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Settings/Add.razor b/Oqtane.Client/Modules/Admin/Settings/Add.razor index db7c0c58..164ab0af 100644 --- a/Oqtane.Client/Modules/Admin/Settings/Add.razor +++ b/Oqtane.Client/Modules/Admin/Settings/Add.razor @@ -197,11 +197,11 @@ { validated = true; var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) + if (await interop.FormValid(form) && _entityName != "-" && int.TryParse(_entityId, out int entityId)) { var setting = new Setting(); setting.EntityName = _entityName; - setting.EntityId = int.Parse(_entityId); + setting.EntityId = entityId; setting.SettingName = _settingName; setting.SettingValue = _settingValue; setting.IsPrivate = (bool.Parse(_isPrivate)); From dfca6640da9e170c06ae23c90c8ab9620d557192 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Mon, 8 Sep 2025 12:13:17 -0400 Subject: [PATCH 63/68] add setting import --- .../Admin/Settings/ImportSettings.razor | 56 +++++++ .../Modules/Admin/Settings/Index.razor | 7 +- .../Admin/Settings/ImportSettings.resx | 141 ++++++++++++++++++ .../Modules/Admin/Settings/Index.resx | 3 + Oqtane.Client/Services/SettingService.cs | 12 ++ .../Controllers/SettingController.cs | 66 ++++++++ .../SiteTemplates/AdminSiteTemplate.cs | 28 ++++ .../Infrastructure/UpgradeManager.cs | 40 +++++ Oqtane.Server/Repository/SettingRepository.cs | 6 + 9 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Settings/ImportSettings.razor create mode 100644 Oqtane.Client/Resources/Modules/Admin/Settings/ImportSettings.resx diff --git a/Oqtane.Client/Modules/Admin/Settings/ImportSettings.razor b/Oqtane.Client/Modules/Admin/Settings/ImportSettings.razor new file mode 100644 index 00000000..0c9f2620 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Settings/ImportSettings.razor @@ -0,0 +1,56 @@ +@namespace Oqtane.Modules.Admin.Settings +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISettingService SettingService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +
+
+ +
+ +
+
+
+
+  +@SharedLocalizer["Cancel"] + +@code { + private string _settings = "Entity,Id,Name,Value,Private\n"; + + public override string Title => "Import Settings"; + + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; + + private async Task Import() + { + try + { + if (!string.IsNullOrEmpty(_settings)) + { + ShowProgressIndicator(); + var success = await SettingService.ImportSettingsAsync(_settings); + if (success) + { + AddModuleMessage(Localizer["Message.Import.Success"], MessageType.Success); + } + else + { + AddModuleMessage(Localizer["Message.Import.Failure"], MessageType.Error); + } + HideProgressIndicator(); + } + else + { + AddModuleMessage(Localizer["Message.Import.Validation"], MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Importing Settings {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Import"], MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Modules/Admin/Settings/Index.razor b/Oqtane.Client/Modules/Admin/Settings/Index.razor index 001c95c1..98db23ce 100644 --- a/Oqtane.Client/Modules/Admin/Settings/Index.razor +++ b/Oqtane.Client/Modules/Admin/Settings/Index.razor @@ -6,10 +6,11 @@
-
+
+
-
+
-
+
diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 95ecbd52..cb9dd0c4 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -124,15 +124,19 @@ @if (!string.IsNullOrEmpty(p.Autocomplete)) { @@ -140,15 +144,19 @@ else { @@ -404,6 +412,14 @@ _togglepassword = SharedLocalizer["ShowPassword"]; _allowtwofactor = (SettingService.GetSetting(PageState.Site.Settings, "LoginOptions:TwoFactor", "false") == "true"); _profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); + foreach (var profile in _profiles) + { + if (profile.Options.ToLower().StartsWith("entityname:")) + { + var options = await SettingService.GetSettingsAsync(profile.Options.Substring(11), -1); + profile.Options = string.Join(",", options.Select(kvp => $"{kvp.Key}:{kvp.Value}")); + } + } _timezones = TimeZoneService.GetTimeZones(); if (PageState.User != null) diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index e5581222..99f5694c 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -86,15 +86,19 @@ @if (!string.IsNullOrEmpty(p.Options)) { @@ -145,6 +149,14 @@ { _timezones = TimeZoneService.GetTimeZones(); _profiles = await ProfileService.GetProfilesAsync(ModuleState.SiteId); + foreach (var profile in _profiles) + { + if (profile.Options.ToLower().StartsWith("entityname:")) + { + var options = await SettingService.GetSettingsAsync(profile.Options.Substring(11), -1); + profile.Options = string.Join(",", options.Select(kvp => $"{kvp.Key}:{kvp.Value}")); + } + } _settings = new Dictionary(); _timezoneid = PageState.Site.TimeZoneId; _initialized = true; diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index 35e43bb9..9bf7ea28 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -119,15 +119,19 @@ @if (!string.IsNullOrEmpty(p.Options)) { @@ -204,6 +208,14 @@ _passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId); _togglepassword = SharedLocalizer["ShowPassword"]; _profiles = await ProfileService.GetProfilesAsync(PageState.Site.SiteId); + foreach (var profile in _profiles) + { + if (profile.Options.ToLower().StartsWith("entityname:")) + { + var options = await SettingService.GetSettingsAsync(profile.Options.Substring(11), -1); + profile.Options = string.Join(",", options.Select(kvp => $"{kvp.Key}:{kvp.Value}")); + } + } _timezones = TimeZoneService.GetTimeZones(); if (PageState.QueryString.ContainsKey("id") && int.TryParse(PageState.QueryString["id"], out int UserId)) diff --git a/Oqtane.Client/Resources/Modules/Admin/Profiles/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Profiles/Edit.resx index 79a2f0f4..d67a4f7a 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Profiles/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Profiles/Edit.resx @@ -157,7 +157,7 @@ The default value for this profile item - A comma delimited list of options the user can select from + A comma delimited list of options. Options can contain a key and value if they are seperated by a colon (ie. key:value). You can also dynamically load your options from custom Settings (ie. 'EntityName:Countries'). Should a user be required to provide a value for this profile item? From d5c68444c32b5a364c376d7454e72985359a5b38 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 9 Sep 2025 13:30:53 -0400 Subject: [PATCH 66/68] use standard port #'s --- Oqtane.Application/Server/Properties/launchSettings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Oqtane.Application/Server/Properties/launchSettings.json b/Oqtane.Application/Server/Properties/launchSettings.json index 80a48970..dc8793f7 100644 --- a/Oqtane.Application/Server/Properties/launchSettings.json +++ b/Oqtane.Application/Server/Properties/launchSettings.json @@ -6,7 +6,7 @@ "dotnetRunMessages": true, "launchBrowser": true, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5084", + "applicationUrl": "http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -16,7 +16,7 @@ "dotnetRunMessages": true, "launchBrowser": true, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7035;http://localhost:5084", + "applicationUrl": "https://localhost:5001;http://localhost:5000", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } From 22e2a4da1efe0b3f9a690374784b0c3b4c3f2f15 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Tue, 9 Sep 2025 14:24:53 -0400 Subject: [PATCH 67/68] ensure Radzen.Blazor static assets are included in publish output --- Oqtane.Package/release.cmd | 2 +- Oqtane.Server/wwwroot/_content/Placeholder.txt | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Oqtane.Package/release.cmd b/Oqtane.Package/release.cmd index 8b914c90..2c725f40 100644 --- a/Oqtane.Package/release.cmd +++ b/Oqtane.Package/release.cmd @@ -20,7 +20,7 @@ rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish\runtimes\iossimulator-ar rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish\runtimes\iossimulator-x64" rmdir /Q/S "..\Oqtane.Server\bin\Release\net9.0\publish\runtimes\iossimulator-x86" setlocal ENABLEDELAYEDEXPANSION -set retain=Placeholder.txt +set retain=Radzen.Blazor for /D %%i in ("..\Oqtane.Server\bin\Release\net9.0\publish\wwwroot\_content\*") do ( set /A found=0 for %%j in (%retain%) do ( diff --git a/Oqtane.Server/wwwroot/_content/Placeholder.txt b/Oqtane.Server/wwwroot/_content/Placeholder.txt index 5a324d79..41905c9b 100644 --- a/Oqtane.Server/wwwroot/_content/Placeholder.txt +++ b/Oqtane.Server/wwwroot/_content/Placeholder.txt @@ -6,6 +6,3 @@ ie. /Radzen.Blazor /css /fonts - /syncfusion.blazor - /scripts - /styles From 701d8c9a5756892feaa930297a6399aaa0a9b935 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Tue, 9 Sep 2025 16:23:07 -0400 Subject: [PATCH 68/68] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e681e987..4e68f190 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Oqtane is being developed based on some fundamental principles which are outline # Latest Release -[6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) was released on August 17, 2025 and is a maintenance release including 46 pull requests by 3 different contributors, pushing the total number of project commits all-time to almost 6900. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. +[6.2.0](https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0) was released on September 9, 2025 and is a major release including 57 pull requests by 4 different contributors, pushing the total number of project commits all-time over 7000. The Oqtane framework continues to evolve at a rapid pace to meet the needs of .NET developers. # Try It Now! @@ -26,7 +26,7 @@ A free ASP.NET hosting account. No hidden fees. No credit card required. **Installing using source code from the Dev/Master branch:** -- Install **[.NET 9.0.7 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)**. +- Install **[.NET 9.0.8 SDK](https://dotnet.microsoft.com/download/dotnet/9.0)**. - Install the latest edition (v17.12 or higher) of [Visual Studio 2022](https://visualstudio.microsoft.com/downloads) with the **ASP.NET and web development** workload enabled. Oqtane works with ALL editions of Visual Studio from Community to Enterprise. If you wish to use LocalDB for development ( not a requirement as Oqtane supports SQLite, mySQL, and PostgreSQL ) you must also install the **Data storage and processing**. @@ -92,6 +92,11 @@ Connect with other developers, get support, and share ideas by joining the Oqtan # Roadmap This project is open source, and therefore is a work in progress... +[6.2.0](https://github.com/oqtane/oqtane.framework/releases/tag/v6.2.0) (Sep 9, 2025) +- [x] Oqtane Application Template +- [x] Radzen Text Editor +- [x] Setting Management + [6.1.5](https://github.com/oqtane/oqtane.framework/releases/tag/v6.1.5) (Aug 17, 2025) - [x] Stabilization improvements - [x] Database provider improvements

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 Date: Fri, 5 Sep 2025 17:20:31 -0400 Subject: [PATCH 61/68] added a Setting Management UI --- .../Modules/Admin/Settings/Add.razor | 226 ++++++++++++++++++ .../Modules/Admin/Settings/Edit.razor | 122 ++++++++++ .../Modules/Admin/Settings/Index.razor | 145 +++++++++++ .../Resources/Modules/Admin/Settings/Add.resx | 156 ++++++++++++ .../Modules/Admin/Settings/Edit.resx | 159 ++++++++++++ .../Modules/Admin/Settings/Index.resx | 150 ++++++++++++ Oqtane.Client/Services/SettingService.cs | 22 ++ .../Controllers/SettingController.cs | 30 ++- Oqtane.Server/Repository/SettingRepository.cs | 18 +- 9 files changed, 1024 insertions(+), 4 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Settings/Add.razor create mode 100644 Oqtane.Client/Modules/Admin/Settings/Edit.razor create mode 100644 Oqtane.Client/Modules/Admin/Settings/Index.razor create mode 100644 Oqtane.Client/Resources/Modules/Admin/Settings/Add.resx create mode 100644 Oqtane.Client/Resources/Modules/Admin/Settings/Edit.resx create mode 100644 Oqtane.Client/Resources/Modules/Admin/Settings/Index.resx diff --git a/Oqtane.Client/Modules/Admin/Settings/Add.razor b/Oqtane.Client/Modules/Admin/Settings/Add.razor new file mode 100644 index 00000000..db7c0c58 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Settings/Add.razor @@ -0,0 +1,226 @@ +@namespace Oqtane.Modules.Admin.Settings +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject ISettingService SettingService +@inject IStringLocalizer Localizer +@inject IStringLocalizer SharedLocalizer + +