diff --git a/.gitignore b/.gitignore
index 1bc915c..d7e0959 100644
--- a/.gitignore
+++ b/.gitignore
@@ -154,3 +154,6 @@ $RECYCLE.BIN/
# Mac desktop service store files
.DS_Store
+/.vs
+/src/RemoteLab/.vs
+/src/RemoteLab/RemoteLab/Properties/PublishProfiles/Project Release Folder.pubxml
diff --git a/readme.md b/readme.md
index 20694f3..cd2f032 100644
--- a/readme.md
+++ b/readme.md
@@ -2,16 +2,15 @@
## Welcome
-+ If you're here to download the latest binary version of RemoteLab to set it up within your organization, visit this project's GitHub Page [http://mafudge.github.io/remotelab/](http://mafudge.github.io/remotelab/).
+ If you'd like to contribute to the source code, then read on...
## Prerequisites
In order to contribute to the source code of Remote Lab, you'll need
-+ Visual Studio 2013
-+ .Net Framework 4.5
++ Visual Studio 2017
++ .Net Framework 4.7.2
+ SQL Server LocalDb
-A Standard installation of VS 2013 should include these components.
+A Standard installation of VS 2017 should include these components.
diff --git a/src/RemoteLab/RemoteLab.DirectoryServices/App.config b/src/RemoteLab/RemoteLab.DirectoryServices/App.config
new file mode 100644
index 0000000..3b94bb5
--- /dev/null
+++ b/src/RemoteLab/RemoteLab.DirectoryServices/App.config
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab.DirectoryServices/RemoteLab.DirectoryServices.csproj b/src/RemoteLab/RemoteLab.DirectoryServices/RemoteLab.DirectoryServices.csproj
index 8a32013..4399c4c 100644
--- a/src/RemoteLab/RemoteLab.DirectoryServices/RemoteLab.DirectoryServices.csproj
+++ b/src/RemoteLab/RemoteLab.DirectoryServices/RemoteLab.DirectoryServices.csproj
@@ -1,5 +1,6 @@
+
Debug
@@ -11,6 +12,8 @@
RemoteLab.DirectoryServices
v4.5
512
+
+
true
@@ -39,7 +42,14 @@
MinimumRecommendedRules.ruleset
+
+ ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.dll
+
+
+ ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.SqlServer.dll
+
+
@@ -54,7 +64,19 @@
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ H4sIAAAAAAAEANVazW7jNhC+F+g7CDq1RdayEwS7DexdpE6yMDZOgji77S1gJNohSpGqSLl2iz5ZD32kvkKH+hf1Y8lRku0tFslvhsOZ4Qy//Pv3P+MPG5caa+wLwtnEHA2GpoGZzR3CVhMzkMs378wP77/9ZnzuuBvjSzLvSM2DlUxMzEcpvRPLEvYjdpEYuMT2ueBLObC5ayGHW4fD4Y/WaGRhgDAByzDGtwGTxMXhD/g55czGngwQnXMHUxF/h5FFiGpcIRcLD9l4Yt5il0t8iR4G0VzTOKUEgR4LTJemgRjjEknQ8uSzwAvpc7ZaePAB0buth2HeElGBY+1PsultNzI8VBuxsoUJlB0Iyd2OgKOj2DKWvnwv+5qp5cB252BjuVW7Du03Mafc9QKJfdPQhZ1Mqa8mls07SBYdGOnQQeoIh4Ph4O3Ru7eDo9HweHhgTAMqAx9PGA6kj+iBcRM8UGJ/wts7/itmExZQmtcRtISxwgf4dONzD/tye4uXmubql2lYRQRLh0gBKldH+wTPABc3jTnaXGK2ko8T8xh8+oJssJN8iD3lMyMQELBG+gH8vII9oAeK03GrUTh4YU+Cm+XcYhC0xk4i5wxJfEcqzKWtu+Qr5WwdFyEhwT/IklQJ3GWhK7Qmq9DvNNgbzqkJfkbDQfFIvCisUye8j2Zc+Ny95TR3tOHA/YIHvq0szatG75C/wrKozdjKoqQxdiLBHeJGLXjVmFEK7Bcv2coXjpVTW5I1PiM+tiX3typ0Pvo88BoUGQ37CB5N8KnjEvYyks9dROgVl2S5vSRCPru8W8e7s70b7qeiZkweHXY+qinFiAXejM0JgxATT0OLwiQ0uzr0BiscHh8/h+flFLhBQvzOfefllfgZU7jT8RwLgVZN0Qd/Pof8GSOqTiJ/hLntSxgLPVhhr3x7vsZMdkq44YpXzbgzp3uunTm7Iie3+QUcCP6IGfbhrnVukIS7jSkMHJpvZ65RFvqfF0Fd09Rrln6vdo+eyYVErtexMquLzVMhuE1CD9SsGpVjRVXOmWM01maRKfJVHVgEIpJ4EIMgfmL+UNpfHWhS0uVAo0KtCDgcDEb6XnO7KiciaEglIhBnhesBkooawJuqxAQuHucmEZ+avgUFvMBSsyHcnJnZS4Yp2aEIojZbBRAZYcfiMB1UrY5zr7Y8Z7DyLuLCPDensnLXc+guZ0lVLtjLaguTuEcOJraYnqaLm6sIitQjsrcJK3qcSB4xrJpXjPEceR7Efe5VI/5iLKInjembRfdu340wLFtUNP2ptqkkuDmgptBGlb0cfEF8ISFHoAekUsLUcUvTSv5f41mJON3FyweWuFyyQv2txZr+AqGjZIa8gL254LPhNnGF05SXhm9LiCK/8cKYchq4bPcbRBNidvfl0bKv7ZGyFj+PlH1tjxQ3/XmY+FMHjMIbQAGqMFJGHFvauenuYZX8QwtX3eFauWMU+k9yxaok1sINq5fVGTYrG/JGrWvnm5Dq++k8cv2svSXlG+gGUflp7WWVWua8hNJgh/DKtcaFAMt9b49WbpALyaQ02iUNaM1yMRtog3vhZj1wDXY2oT2+3t7mofWx9qjVTWseu3rGV5OW4jLsSXkpqti6J6aadbW21hyi3PA2rc61n4WIzT6/xqXa/4XfX/5O+7g8UPrx5T24WCVXF3txJ9Cinotntq3ZVJVfc3aFar9slY6ndF9/VMpAqRJd9Yubmpb67euXjSpC+e6QsJGfCfUWkL4DtLaB3iqV/aTUMelTUi9NOyetQxrH3cpuMrjUvkRTTAMMsCaOal0WWyGxO1ATBovf6JSSsLlNJswRI0ssZPTyZx4OR4cao/z1sLuWEA5tSfF+FSQrWyPffkR+6cnric+HLXD3oUwdJLHU3sna4BQo1L1BKijVKqzWL4/3+vNjZrXS49WMOXgzMf8Ml58Ys1/uCwgHxrUPsXJiDI2/Otm8G736qiRnX766i8OslBNye938ZSdl2ZegGoayL/gyIUlUfu6JjtwHq4aMrNxwyIH1xzX2JqOaSkzgv3PR5vte6cE2ij+ZDXxxSi70np2kW0czlli4V7wl9+bQ+sJ+riysMWAtL9K+GbCsFepETlUyGnsyZxAK2FeeiigU5EL6UJKX2sIbnzCbeIjm9S73Ke2vX2XKFFQfOcMeZip69B22ldjYoKXoWtTvMkRHRrBMnLSj+xrZvqh7AXd94HDckZvW8l6VZGAtF1gFXc2FVdKE9SxhFXDCLL4og5jffvbq3oYsrOQZn4cjLHe24Jm5f4aG4BBklUGojp3BTZv3yXTOjC15EiGaRskULS3OsUSQC9GpD+UcsiUM21AihP+V8AXRICz3HrAzY9eBBDPAlrH7QAv/WaJCrEl+SIQWdR5fe+E/dPaxBVCTqHR+zX4KCHVSvS8q0nkNhIrd+EJXZynVxb7apkhXnLUEis2Xppw77HoUwMQ1W6A13kc3uMQv8QrZ2+SBoh5k90EUzT4+I2jlI1fEGNl6+Ak+7Lib9/8BGqRIUxMwAAA=
+
+
+ dbo
+
+
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.Designer.cs b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.Designer.cs
new file mode 100644
index 0000000..379f3ce
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.Designer.cs
@@ -0,0 +1,29 @@
+//
+namespace RemoteLab.Migrations
+{
+ using System.CodeDom.Compiler;
+ using System.Data.Entity.Migrations;
+ using System.Data.Entity.Migrations.Infrastructure;
+ using System.Resources;
+
+ [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")]
+ public sealed partial class PoolSortOrder : IMigrationMetadata
+ {
+ private readonly ResourceManager Resources = new ResourceManager(typeof(PoolSortOrder));
+
+ string IMigrationMetadata.Id
+ {
+ get { return "202003241448422_PoolSortOrder"; }
+ }
+
+ string IMigrationMetadata.Source
+ {
+ get { return null; }
+ }
+
+ string IMigrationMetadata.Target
+ {
+ get { return Resources.GetString("Target"); }
+ }
+ }
+}
diff --git a/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.cs b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.cs
new file mode 100644
index 0000000..043fd27
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.cs
@@ -0,0 +1,46 @@
+namespace RemoteLab.Migrations
+{
+ using System;
+ using System.Data.Entity.Migrations;
+
+ public partial class PoolSortOrder : DbMigration
+ {
+ public override void Up()
+ {
+ AddColumn("dbo.Pools", "SortOrder", c => c.Byte(nullable: true));
+ Sql(@"ALTER view [dbo].[PoolSummary]
+ as
+ select p.PoolName, p.ActiveDirectoryUserGroup, p.ActiveDirectoryAdminGroup,
+ p.EmailNotifyList, p.RdpTcpPort, p.CleanupInMinutes,
+ p.RemoteAdminUser, p.RemoteAdminPassword, p.WelcomeMessage,
+ count(c.ComputerName) as PoolCount,
+ count(c.UserName) as PoolInUse,
+ count(c.ComputerName) - count(c.UserName) as PoolAvailable, p.SortOrder
+
+ from Pools p left
+ join Computers c on c.Pool_PoolName = p.PoolName
+
+ group by p.PoolName, p.ActiveDirectoryUserGroup, p.ActiveDirectoryAdminGroup,
+ p.EmailNotifyList, p.RdpTcpPort, p.CleanupInMinutes,
+ p.RemoteAdminUser, p.RemoteAdminPassword, p.WelcomeMessage, p.SortOrder
+ order by SortOrder offset 0 rows");
+ }
+
+ public override void Down()
+ {
+ DropColumn("dbo.Pools", "SortOrder");
+ Sql(@"ALTER view [dbo].[PoolSummary]
+ as
+ select p.PoolName, p.ActiveDirectoryUserGroup, p.ActiveDirectoryAdminGroup,
+ p.EmailNotifyList, p.RdpTcpPort, p.CleanupInMinutes,
+ p.RemoteAdminUser, p.RemoteAdminPassword, p.WelcomeMessage,
+ count(c.ComputerName) as PoolCount,
+ count(c.UserName) as PoolInUse,
+ count(c.ComputerName) - count(c.UserName) as PoolAvailable
+ from Pools p left join Computers c on c.Pool_PoolName=p.PoolName
+ group by p.PoolName, p.ActiveDirectoryUserGroup, p.ActiveDirectoryAdminGroup,
+ p.EmailNotifyList, p.RdpTcpPort, p.CleanupInMinutes,
+ p.RemoteAdminUser, p.RemoteAdminPassword, p.WelcomeMessage");
+ }
+ }
+}
diff --git a/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.resx b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.resx
new file mode 100644
index 0000000..4a5ad73
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Migrations/202003241448422_PoolSortOrder.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ H4sIAAAAAAAEANVa227jNhB9L9B/EPTUFlnLSRp0N7B3kTrJwmhuiLPbvgWMRDtEKVIVKddu0S/rQz+pv9ChrhR1seQ4yfbN4uXMcDgznIv//fuf0YeVT60lDgXhbGzvD4a2hZnLPcIWYzuS8zdv7Q/vv/5qdOb5K+tztu5QrYOdTIztRymDY8cR7iP2kRj4xA254HM5cLnvII87B8PhO2d/38EAYQOWZY1uIyaJj+MP+Jxw5uJARohecg9TkY7DzCxGta6Qj0WAXDy2b7HPJb5AD4NkrW2dUIKAjxmmc9tCjHGJJHB5/EngmQw5W8wCGED0bh1gWDdHVOCU++NiedeDDA/UQZxiYwblRkJyvyfg/mEqGcfcvpV87VxyILszkLFcq1PH8hvbE+4HkcShbZnEjic0VAur4h1km/asfGovV4SDwXDww+Hbt4P9d98fvduzJhGVUYjHDEcyRHTPuokeKHF/wus7/itmYxZRqvMIXMJcaQCGbkIe4FCub/Hc4Fx92ZZTRnBMiBygdndyTtAMUHHbukSrC8wW8nFsH4FOn5MV9rKBVFM+MQIGAXtkGMHnFZwBPVCczzutxEELd0S4nc4tBkJL7GV0TpHEd6RGXMa+C75QytZzExIS9IPMSR3BTRK6QkuyiPXOgL3hnNqgZzSeFI8kSMw6V8L7ZMV5yP1bTrWrjSfuZzwKXSVpXjd7h8IFlmVuRk5hJa22kxDuYTdqw6vajGJgO3spdr6wrZy4kizxKQmxK3m4VqbzMeRR0MLI/nAXxmMQPvF8wl6G8pmPCL3ikszXF0TIZ6d36wV3bnDDw5zUlMnDg95XNaEYsSiYskvCwMTE09ASM4nFri69RQoHR0fPoXkaAzdIiN956L08Ez9jCm86vsRCoEWb9cHP56A/ZUTFSeSP2Ld9jm1hB1JoJzoDVbwOveLSf1zLTax39tpnS8xkL7cd73hVvz31+nvsqbfJ/rTDz+Ba8UfMcAgvtneDJLyQTGHgWHwbPZaS0P88lOrr7F4zgHy11/hUziTyg57xXZNtngjBXRJroCHVJKgrs3LGPKs1wktEoceGIBGwSBKADQL5sf1d5XxNoFlgqIEm4V4ZcDgY7Jtn1U5VdUSQ1kpEwM5Kjww4FTWBV3WOCVQ89U0ivTXzCAp4hqUhQ3h/C7FXBFORQxlEHbYOIBHChs2xO6jbnfpeY7smsOop0vBeW1Mb/5s+dJOy5CyX5OV0hcnUQ4NJJWa66fLhaowi14iiwuEkJY6sFOI01EJGlygIwO612kg6Ys2Swsjkzax/zcBPMBxX1JQOcm5zSvByQGRizCp5efichEKCj0APSLmEiedXllX0v0GzMnKmilcvLFO5bIf6bdiaWccwUQpBnsPZfNDZ+Ji4RmmqW+MKFaIobH0wJpxGPttcyWhDLN4+Ha0Y7Y5UFAp0pGK0O1JaOtBh0qEeGKVKQgmqNFNFHDnGvZnq4VT0wzBXU+E6qWNi+k9SxTon1kEN67c1CbYIG3ShNhUF2pCas3IduXnV1pT0NLyFlL6sO61K4q1TqEz2MC8twS4ZmDbeHa2aZpecSWW2jxswUu6yNzAmt8ItMukG7GJBd3wzSdahzbnuqPWpr45dv6I7BS3P1WG14S/GxaUh3ZN8XBL99XdyDfsa781Qrmry3LZbS2VL1l8Mv8YDvfvgYXdvQZ4T6kD54MtrcDnirg8c06yiQ2yYruwa/6mMoeHuSplDVSo9b+m++aqUgHIm+vKXJkgd+dtWL1tZhFTAI3FRYCpUXSGvKXSWgZl2VfWkkn2ZS3ItzbMwI9sapZnP5vZ0JRVKltgWCGBJPJUGzdZCYn+gFgxmv9EJJXGinC24RIzMsZBJFdE+GO4fGD3uL6ff7Ajh0Y5N5y+i7cuWKHQfUVgpnz2xFNkBd5smrocklkbNrQtOqam7NUhNk7cOq3MV894sZRZSqxTCpszDq7H9Z7z92Jr+cl9C2LPioOnYGlp/9ZJ5v4bvq7Zdd6Wrm7qqtXTibmM/fdnYRN0VoYae6a7gqy1Sovzzjhqk22A1tEdrDxx35XbX/dwZjfrmZgb/jY9W3+60YdmF8a36k5Kw9eZL7NmifPE+YXyCjZ3AnvdRaQ2+4nO7dWNvV9jP5c6NtlzHF3nXbbkip+rVMatts2zZzgNTwKHSVEQhshcyhNi+kl/ehIS5JEBU57ua8HR/x5Uoc1Bz5hQHmCnrMU/YlWJrppejG1a/SRA925TVbk63HmRrCzJJg0BdHzhcd6Kmjc242g5lY4OyDrq+QVfbu2xuXdYBZ+3OF21r6scvWgFdOpi1zc/naVxWU2TQTO1/3mAcgiwKCJX6M3iydZ3M10zZnGcWYnCULTHc4iWWCHwhOgkhLkSuhGkXYo34rxKfEY3iuPEBe1N2HUkQAxwZ+w+09HcXZWJt9OPubJnn0XUQ/1d1F0cANoly59fsx4hQL+f7vMadN0Ao200fdHWXUj3si3WOdMVZR6BUfLnLucN+QAFMXLMZWuJteINH/AIvkLvOKh3NIJsvoiz20SlBixD5IsUo9sMn6LDnr97/B1bI/hruMAAA
+
+
+ dbo
+
+
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Migrations/Configuration.cs b/src/RemoteLab/RemoteLab/Migrations/Configuration.cs
index 4f1c732..75870f4 100644
--- a/src/RemoteLab/RemoteLab/Migrations/Configuration.cs
+++ b/src/RemoteLab/RemoteLab/Migrations/Configuration.cs
@@ -35,6 +35,8 @@ private void DataCleanup(RemoteLabContext context)
private void DataInit( RemoteLabContext context )
{
+ return;
+
PasswordUtility Pass = new PasswordUtility(Properties.Settings.Default.EncryptionKeyForPasswords);
var stringVector = Pass.NewInitializationVector();
var prodPool = context.Pools.Add(new Pool()
@@ -173,7 +175,7 @@ private void DataInit( RemoteLabContext context )
protected override void Seed(RemoteLabContext context)
{
-
+ return;
#if (DEBUG)
DataCleanup(context);
DataInit(context);
diff --git a/src/RemoteLab/RemoteLab/Models/Computer.cs b/src/RemoteLab/RemoteLab/Models/Computer.cs
index 3f71f6d..9adfb1a 100644
--- a/src/RemoteLab/RemoteLab/Models/Computer.cs
+++ b/src/RemoteLab/RemoteLab/Models/Computer.cs
@@ -25,5 +25,8 @@ public class Computer
public DateTime? Logon { get; set; }
public Pool Pool { get; set; }
+
+ [Display(Name = "Record Last Modified", ShortName = "LastMod")]
+ public DateTime LastModified { get; set; }
}
}
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Models/Pool.cs b/src/RemoteLab/RemoteLab/Models/Pool.cs
index a1f3bdb..6ae2271 100644
--- a/src/RemoteLab/RemoteLab/Models/Pool.cs
+++ b/src/RemoteLab/RemoteLab/Models/Pool.cs
@@ -59,5 +59,8 @@ public class Pool
[MaxLength(255)]
public string InitializationVector {get; set;}
+
+ [Display( Name = "Sort Order", ShortName = "Sort")]
+ public Byte SortOrder {get; set;}
}
}
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Models/PoolSummary.cs b/src/RemoteLab/RemoteLab/Models/PoolSummary.cs
index a64a3b3..a2a0be9 100644
--- a/src/RemoteLab/RemoteLab/Models/PoolSummary.cs
+++ b/src/RemoteLab/RemoteLab/Models/PoolSummary.cs
@@ -59,6 +59,8 @@ public class PoolSummary : IDbAsyncEnumerable
[Display(Name = "Avaliable", ShortName = "Available")]
public int PoolAvailable { get; set; }
+ [Display(Name = "Sort Order", ShortName = "Sort")]
+ public Byte SortOrder { get; set; }
public IDbAsyncEnumerator GetAsyncEnumerator()
{
diff --git a/src/RemoteLab/RemoteLab/Properties/Resources.Designer.cs b/src/RemoteLab/RemoteLab/Properties/Resources.Designer.cs
index d2f85bd..e733b43 100644
--- a/src/RemoteLab/RemoteLab/Properties/Resources.Designer.cs
+++ b/src/RemoteLab/RemoteLab/Properties/Resources.Designer.cs
@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
-// Runtime Version:4.0.30319.18444
+// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -19,7 +19,7 @@ namespace RemoteLab.Properties {
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class Resources {
diff --git a/src/RemoteLab/RemoteLab/Properties/Settings.Designer.cs b/src/RemoteLab/RemoteLab/Properties/Settings.Designer.cs
index a36378e..35ae1c5 100644
--- a/src/RemoteLab/RemoteLab/Properties/Settings.Designer.cs
+++ b/src/RemoteLab/RemoteLab/Properties/Settings.Designer.cs
@@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
//
// This code was generated by a tool.
-// Runtime Version:4.0.30319.18444
+// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
@@ -12,7 +12,7 @@ namespace RemoteLab.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")]
public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@@ -34,158 +34,222 @@ public string Database {
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("IST-Users-ITServices")]
- public string AdministratorADGroup {
+ [global::System.Configuration.DefaultSettingValueAttribute("Password")]
+ public string LoginFormPasswordLabel {
get {
- return ((string)(this["AdministratorADGroup"]));
+ return ((string)(this["LoginFormPasswordLabel"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("ad.syr.edu")]
- public string ActiveDirectoryDNSDomain {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://www.youtube.com/embed/fyM2OHUS6O4?autoplay=1")]
+ public string RemoteLabIntroVideoLink {
get {
- return ((string)(this["ActiveDirectoryDNSDomain"]));
+ return ((string)(this["RemoteLabIntroVideoLink"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("smtp-host.syr.edu")]
- public string SmtpServer {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://answers.syr.edu/display/ischool/iSchool+Remote+Lab")]
+ public string OfficialDocumentationLink {
get {
- return ((string)(this["SmtpServer"]));
+ return ((string)(this["OfficialDocumentationLink"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("remotelabadmin@syr.edu")]
- public string SmtpMessageFromAddress {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://www.microsoft.com/en-us/p/microsoft-remote-desktop/9wzdncrfj3ps")]
+ public string WindowsClientDownload {
get {
- return ((string)(this["SmtpMessageFromAddress"]));
+ return ((string)(this["WindowsClientDownload"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("AD")]
- public string ActiveDirectoryDomain {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12")]
+ public string MacClientDownload {
get {
- return ((string)(this["ActiveDirectoryDomain"]));
+ return ((string)(this["MacClientDownload"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("NetID")]
- public string LoginFormUsernameLabel {
+ [global::System.Configuration.DefaultSettingValueAttribute("\r\n on error resume next\r\n dim connstr, remotepowershelluser, po" +
+ "olName\r\n connstr = \"{0}\"\r\n remotepowershelluser = \"{1}\"\r\n " +
+ " poolName = \"{2}\"\r\n ")]
+ public string RemoteLabSettingsFileContent {
get {
- return ((string)(this["LoginFormUsernameLabel"]));
+ return ((string)(this["RemoteLabSettingsFileContent"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("Password")]
- public string LoginFormPasswordLabel {
+ [global::System.Configuration.DefaultSettingValueAttribute("50")]
+ public int DashboardMaxEvents {
get {
- return ((string)(this["LoginFormPasswordLabel"]));
+ return ((int)(this["DashboardMaxEvents"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("https://www.youtube.com/embed/fyM2OHUS6O4?autoplay=1")]
- public string RemoteLabIntroVideoLink {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://play.google.com/store/apps/details?id=com.microsoft.rdc.android&hl=en_US")]
+ public string AndroidClientDownload {
get {
- return ((string)(this["RemoteLabIntroVideoLink"]));
+ return ((string)(this["AndroidClientDownload"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("https://answers.syr.edu/display/ischool/iSchool+Remote+Lab")]
- public string OfficialDocumentationLink {
+ [global::System.Configuration.DefaultSettingValueAttribute("https://apps.apple.com/us/app/microsoft-remote-desktop/id714464092")]
+ public string IosClientDownload {
get {
- return ((string)(this["OfficialDocumentationLink"]));
+ return ((string)(this["IosClientDownload"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("http://support.microsoft.com/kb/2592687")]
- public string WindowsClientDownload {
+ [global::System.Configuration.DefaultSettingValueAttribute("maine.edu")]
+ public string UserPrincipleDomain {
get {
- return ((string)(this["WindowsClientDownload"]));
+ return ((string)(this["UserPrincipleDomain"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12")]
- public string MacClientDownload {
+ [global::System.Configuration.DefaultSettingValueAttribute("SCCM-UMS-LAB-ADMINS")]
+ public string AdministratorADGroup {
get {
- return ((string)(this["MacClientDownload"]));
+ return ((string)(this["AdministratorADGroup"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("240, 148, 233, 7, 112, 207, 116, 14, 177, 66, 198, 200, 41, 180, 156, 143, 151, 2" +
- "26, 75, 247, 115, 68, 85, 107, 143, 156, 5, 226, 191, 225, 247, 162")]
- public string EncryptionKeyForPasswords {
+ [global::System.Configuration.DefaultSettingValueAttribute("uad.maine.edu")]
+ public string ActiveDirectoryDNSDomain {
get {
- return ((string)(this["EncryptionKeyForPasswords"]));
+ return ((string)(this["ActiveDirectoryDNSDomain"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("\r\n screen mode id:i:2\r\n desktopwidth:i: {0}\r\n desktoph" +
- "eight:i: {1}\r\n session bpp:i:32\r\n winposstr:s:0,1,614,156,1654" +
- ",963\r\n full address:s: {2}\r\n username:s: {3}\r\n compre" +
- "ssion:i:1\r\n keyboardhook:i:2\r\n audiomode:i:0\r\n redire" +
- "ctprinters:i:1\r\n redirectcomports:i:0\r\n redirectsmartcards:i:0" +
- "\r\n redirectclipboard:i:1\r\n redirectposdevices:i:0\r\n r" +
- "edirectdrives:i:1\r\n drivestoredirect: s()\r\n displayconnectionb" +
- "ar:i:1\r\n pinconnectionbar:i:1\r\n autoreconnection enabled:i:1\r\n" +
- " authentication level:i:0\r\n prompt for credentials:i:0\r\n " +
- " negotiate security layer:i:1\r\n remoteapplicationmode:i:0\r\n " +
- " alternate shell:s:\r\n shell working directory:s:\r\n disable wal" +
- "lpaper:i:1\r\n disable full window drag:i:0\r\n allow desktop comp" +
- "osition:i:1\r\n allow font smoothing:i:1\r\n disable menu anims:i:" +
- "1\r\n disable themes:i:0\r\n disable cursor setting:i:0\r\n " +
- " bitmapcachepersistenable:i:1\r\n gatewayhostname:s:\r\n gatewayus" +
- "agemethod:i:0\r\n gatewaycredentialssource:i:4\r\n gatewayprofileu" +
- "sagemethod:i:0\r\n promptcredentialonce:i:1\r\n use multimon:i:0\r\n" +
- " audiocapturemode:i:0\r\n videoplaybackmode:i:1\r\n conne" +
- "ction type:i:6\r\n redirectdirectx:i:1\r\n use redirection server " +
- "name:i:0\r\n devicestoredirect:s:*\r\n smart sizing:i:1\r\n ")]
- public string RdpFileSettings {
+ [global::System.Configuration.DefaultSettingValueAttribute("smarthost.maine.edu")]
+ public string SmtpServer {
get {
- return ((string)(this["RdpFileSettings"]));
+ return ((string)(this["SmtpServer"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("\r\n on error resume next\r\n dim connstr, remotepowershelluser, po" +
- "olName\r\n connstr = \"{0}\"\r\n remotepowershelluser = \"{1}\"\r\n " +
- " poolName = \"{2}\"\r\n ")]
- public string RemoteLabSettingsFileContent {
+ [global::System.Configuration.DefaultSettingValueAttribute("remotelab@maine.edu")]
+ public string SmtpMessageFromAddress {
get {
- return ((string)(this["RemoteLabSettingsFileContent"]));
+ return ((string)(this["SmtpMessageFromAddress"]));
}
}
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Configuration.DefaultSettingValueAttribute("50")]
- public int DashboardMaxEvents {
+ [global::System.Configuration.DefaultSettingValueAttribute("uad")]
+ public string ActiveDirectoryDomain {
get {
- return ((int)(this["DashboardMaxEvents"]));
+ return ((string)(this["ActiveDirectoryDomain"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("User Name")]
+ public string LoginFormUsernameLabel {
+ get {
+ return ((string)(this["LoginFormUsernameLabel"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("39, 171, 235, 213, 64, 123, 65, 159, 99, 178, 89, 60, 120, 219, 155, 60, 229, 111" +
+ ", 32, 230, 167, 160, 224, 121, 35, 163, 22, 124, 141, 219, 216, 56")]
+ public string EncryptionKeyForPasswords {
+ get {
+ return ((string)(this["EncryptionKeyForPasswords"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute(@"screen mode id:i:2
+desktopwidth:i:{0}
+desktopheight:i:{1}
+session bpp:i:32
+winposstr:s:0,1,614,156,1654,963
+full address:s:{2}
+username:s:{3}
+compression:i:1
+keyboardhook:i:2
+audiomode:i:0
+redirectprinters:i:1
+redirectcomports:i:0
+redirectsmartcards:i:0
+redirectclipboard:i:1
+redirectposdevices:i:0
+redirectdrives:i:1
+drivestoredirect:s()
+displayconnectionbar:i:1
+pinconnectionbar:i:1
+autoreconnection enabled:i:1
+authentication level:i:0
+prompt for credentials:i:0
+negotiate security layer:i:1
+remoteapplicationmode:i:0
+alternate shell:s:
+shell working directory:s:
+disable wallpaper:i:1
+disable full window drag:i:0
+allow desktop composition:i:1
+allow font smoothing:i:1
+disable menu anims:i:1
+disable themes:i:0
+disable cursor setting:i:0
+bitmapcachepersistenable:i:1
+gatewayhostname:s:
+gatewayusagemethod:i:0
+gatewaycredentialssource:i:4
+gatewayprofileusagemethod:i:0
+promptcredentialonce:i:1
+use multimon:i:0
+audiocapturemode:i:0
+videoplaybackmode:i:1
+connection type:i:6
+redirectdirectx:i:1
+use redirection server name:i:0
+devicestoredirect:s:*
+smart sizing:i:1
+ ")]
+ public string RdpFileSettings {
+ get {
+ return ((string)(this["RdpFileSettings"]));
+ }
+ }
+
+ [global::System.Configuration.ApplicationScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool PerformReboots {
+ get {
+ return ((bool)(this["PerformReboots"]));
}
}
}
diff --git a/src/RemoteLab/RemoteLab/Properties/Settings.settings b/src/RemoteLab/RemoteLab/Properties/Settings.settings
index 07f303a..f1dd06b 100644
--- a/src/RemoteLab/RemoteLab/Properties/Settings.settings
+++ b/src/RemoteLab/RemoteLab/Properties/Settings.settings
@@ -6,24 +6,6 @@
-
- IST-Users-ITServices
-
-
- ad.syr.edu
-
-
- smtp-host.syr.edu
-
-
- remotelabadmin@syr.edu
-
-
- AD
-
-
- NetID
-
Password
@@ -34,65 +16,11 @@
https://answers.syr.edu/display/ischool/iSchool+Remote+Lab
- http://support.microsoft.com/kb/2592687
+ https://www.microsoft.com/en-us/p/microsoft-remote-desktop/9wzdncrfj3ps
https://itunes.apple.com/us/app/microsoft-remote-desktop/id715768417?mt=12
-
- 240, 148, 233, 7, 112, 207, 116, 14, 177, 66, 198, 200, 41, 180, 156, 143, 151, 226, 75, 247, 115, 68, 85, 107, 143, 156, 5, 226, 191, 225, 247, 162
-
-
-
- screen mode id:i:2
- desktopwidth:i: {0}
- desktopheight:i: {1}
- session bpp:i:32
- winposstr:s:0,1,614,156,1654,963
- full address:s: {2}
- username:s: {3}
- compression:i:1
- keyboardhook:i:2
- audiomode:i:0
- redirectprinters:i:1
- redirectcomports:i:0
- redirectsmartcards:i:0
- redirectclipboard:i:1
- redirectposdevices:i:0
- redirectdrives:i:1
- drivestoredirect: s()
- displayconnectionbar:i:1
- pinconnectionbar:i:1
- autoreconnection enabled:i:1
- authentication level:i:0
- prompt for credentials:i:0
- negotiate security layer:i:1
- remoteapplicationmode:i:0
- alternate shell:s:
- shell working directory:s:
- disable wallpaper:i:1
- disable full window drag:i:0
- allow desktop composition:i:1
- allow font smoothing:i:1
- disable menu anims:i:1
- disable themes:i:0
- disable cursor setting:i:0
- bitmapcachepersistenable:i:1
- gatewayhostname:s:
- gatewayusagemethod:i:0
- gatewaycredentialssource:i:4
- gatewayprofileusagemethod:i:0
- promptcredentialonce:i:1
- use multimon:i:0
- audiocapturemode:i:0
- videoplaybackmode:i:1
- connection type:i:6
- redirectdirectx:i:1
- use redirection server name:i:0
- devicestoredirect:s:*
- smart sizing:i:1
-
-
on error resume next
@@ -105,5 +33,88 @@
50
+
+ https://play.google.com/store/apps/details?id=com.microsoft.rdc.android&hl=en_US
+
+
+ https://apps.apple.com/us/app/microsoft-remote-desktop/id714464092
+
+
+ maine.edu
+
+
+ SCCM-UMS-LAB-ADMINS
+
+
+ uad.maine.edu
+
+
+ smarthost.maine.edu
+
+
+ remotelab@maine.edu
+
+
+ uad
+
+
+ User Name
+
+
+ 39, 171, 235, 213, 64, 123, 65, 159, 99, 178, 89, 60, 120, 219, 155, 60, 229, 111, 32, 230, 167, 160, 224, 121, 35, 163, 22, 124, 141, 219, 216, 56
+
+
+ screen mode id:i:2
+desktopwidth:i:{0}
+desktopheight:i:{1}
+session bpp:i:32
+winposstr:s:0,1,614,156,1654,963
+full address:s:{2}
+username:s:{3}
+compression:i:1
+keyboardhook:i:2
+audiomode:i:0
+redirectprinters:i:1
+redirectcomports:i:0
+redirectsmartcards:i:0
+redirectclipboard:i:1
+redirectposdevices:i:0
+redirectdrives:i:1
+drivestoredirect:s()
+displayconnectionbar:i:1
+pinconnectionbar:i:1
+autoreconnection enabled:i:1
+authentication level:i:0
+prompt for credentials:i:0
+negotiate security layer:i:1
+remoteapplicationmode:i:0
+alternate shell:s:
+shell working directory:s:
+disable wallpaper:i:1
+disable full window drag:i:0
+allow desktop composition:i:1
+allow font smoothing:i:1
+disable menu anims:i:1
+disable themes:i:0
+disable cursor setting:i:0
+bitmapcachepersistenable:i:1
+gatewayhostname:s:
+gatewayusagemethod:i:0
+gatewaycredentialssource:i:4
+gatewayprofileusagemethod:i:0
+promptcredentialonce:i:1
+use multimon:i:0
+audiocapturemode:i:0
+videoplaybackmode:i:1
+connection type:i:6
+redirectdirectx:i:1
+use redirection server name:i:0
+devicestoredirect:s:*
+smart sizing:i:1
+
+
+
+ False
+
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/RemoteLab.csproj b/src/RemoteLab/RemoteLab/RemoteLab.csproj
index f5d4a8e..051e4f9 100644
--- a/src/RemoteLab/RemoteLab/RemoteLab.csproj
+++ b/src/RemoteLab/RemoteLab/RemoteLab.csproj
@@ -1,5 +1,6 @@
+
Debug
@@ -13,13 +14,18 @@
Properties
RemoteLab
RemoteLab
- v4.5
+ v4.7.2
false
true
+
+
+
+
+
true
@@ -49,53 +55,43 @@
..\packages\elmah.corelibrary.1.2.2\lib\Elmah.dll
-
- ..\packages\Elmah.MVC.2.1.1\lib\net40\Elmah.Mvc.dll
+
+ ..\packages\Elmah.Mvc.2.1.2\lib\net40\Elmah.Mvc.dll
- False
- ..\packages\EntityFramework.6.1.0\lib\net45\EntityFramework.dll
+ ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.dll
- False
- ..\packages\EntityFramework.6.1.0\lib\net45\EntityFramework.SqlServer.dll
+ ..\packages\EntityFramework.6.4.0\lib\net45\EntityFramework.SqlServer.dll
- False
- ..\packages\Microsoft.AspNet.Identity.Core.2.0.1\lib\net45\Microsoft.AspNet.Identity.Core.dll
+ ..\packages\Microsoft.AspNet.Identity.Core.2.2.3\lib\net45\Microsoft.AspNet.Identity.Core.dll
- False
- ..\packages\Microsoft.AspNet.Identity.Owin.2.0.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll
+ ..\packages\Microsoft.AspNet.Identity.Owin.2.2.3\lib\net45\Microsoft.AspNet.Identity.Owin.dll
-
- False
- ..\packages\Microsoft.Owin.2.1.0\lib\net45\Microsoft.Owin.dll
+
+ ..\packages\Microsoft.Owin.4.1.0\lib\net45\Microsoft.Owin.dll
-
- False
- ..\packages\Microsoft.Owin.Host.SystemWeb.2.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll
+
+ ..\packages\Microsoft.Owin.Host.SystemWeb.4.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll
-
- False
- ..\packages\Microsoft.Owin.Security.2.1.0\lib\net45\Microsoft.Owin.Security.dll
+
+ ..\packages\Microsoft.Owin.Security.4.1.0\lib\net45\Microsoft.Owin.Security.dll
-
- False
- ..\packages\Microsoft.Owin.Security.Cookies.2.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll
+
+ ..\packages\Microsoft.Owin.Security.Cookies.4.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll
-
- False
- ..\packages\Microsoft.Owin.Security.OAuth.2.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll
+
+ ..\packages\Microsoft.Owin.Security.OAuth.4.1.0\lib\net45\Microsoft.Owin.Security.OAuth.dll
False
..\packages\CommonServiceLocator.1.3\lib\portable-net4+sl5+netcore45+wpa81+wp8\Microsoft.Practices.ServiceLocation.dll
-
- False
- ..\packages\Newtonsoft.Json.6.0.3\lib\net45\Newtonsoft.Json.dll
+
+ ..\packages\Newtonsoft.Json.10.0.1\lib\net45\Newtonsoft.Json.dll
..\packages\structuremap.3.0.3.116\lib\net40\StructureMap.dll
@@ -109,60 +105,49 @@
+
-
- False
- ..\packages\Microsoft.AspNet.WebApi.Client.5.1.2\lib\net45\System.Net.Http.Formatting.dll
+
+ ..\packages\Microsoft.AspNet.WebApi.Client.5.2.7\lib\net45\System.Net.Http.Formatting.dll
-
-
+
- False
- ..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.Helpers.dll
+ ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll
-
- False
- ..\packages\Microsoft.AspNet.WebApi.Core.5.1.2\lib\net45\System.Web.Http.dll
+
+ ..\packages\Microsoft.AspNet.WebApi.Core.5.2.7\lib\net45\System.Web.Http.dll
-
- False
- ..\packages\Microsoft.AspNet.WebApi.WebHost.5.1.2\lib\net45\System.Web.Http.WebHost.dll
+
+ ..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.7\lib\net45\System.Web.Http.WebHost.dll
-
- False
- ..\packages\Microsoft.AspNet.Mvc.5.1.2\lib\net45\System.Web.Mvc.dll
+
+ ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
False
..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll
+
+
- False
- ..\packages\Microsoft.AspNet.Razor.3.1.2\lib\net45\System.Web.Razor.dll
+ ..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll
+
- False
- ..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.dll
+ ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll
- False
- ..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Deployment.dll
+ ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll
- False
- ..\packages\Microsoft.AspNet.WebPages.3.1.2\lib\net45\System.Web.WebPages.Razor.dll
+ ..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll
-
-
-
-
-
@@ -175,9 +160,9 @@
+
- False
- ..\packages\WebActivatorEx.2.0.5\lib\net40\WebActivatorEx.dll
+ ..\packages\WebActivatorEx.2.2.0\lib\net40\WebActivatorEx.dll
False
@@ -228,6 +213,14 @@
201405212004414_PoolChanges.cs
+
+
+ 202003240114562_ComputersLastModified.cs
+
+
+
+ 202003241448422_PoolSortOrder.cs
+
@@ -292,33 +285,35 @@
-
-
-
-
+
+
+
+
+
+
PublicSettingsSingleFileGenerator
Settings.Designer.cs
-
-
-
-
-
+
+
+
+
+
@@ -327,6 +322,7 @@
+
@@ -342,71 +338,42 @@
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
-
-
-
@@ -415,77 +382,70 @@
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -528,21 +488,14 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
Web.config
@@ -551,7 +504,9 @@
-
+
+ Designer
+
@@ -569,6 +524,12 @@
201405212004414_PoolChanges.cs
+
+ 202003240114562_ComputersLastModified.cs
+
+
+ 202003241448422_PoolSortOrder.cs
+
PublicResXFileCodeGenerator
Resources.Designer.cs
@@ -621,6 +582,14 @@
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
/,
+ 'prolog': /<\?[\s\S]+?\?>/,
+ 'doctype': {
+ pattern: /"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,
+ greedy: true
+ },
+ 'cdata': //i,
+ 'tag': {
+ pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,
+ greedy: true,
+ inside: {
+ 'tag': {
+ pattern: /^<\/?[^\s>\/]+/i,
+ inside: {
+ 'punctuation': /^<\/?/,
+ 'namespace': /^[^\s>\/:]+:/
+ }
+ },
+ 'attr-value': {
+ pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,
+ inside: {
+ 'punctuation': [
+ /^=/,
+ {
+ pattern: /^(\s*)["']|["']$/,
+ lookbehind: true
+ }
+ ]
+ }
+ },
+ 'punctuation': /\/?>/,
+ 'attr-name': {
+ pattern: /[^\s>\/]+/,
+ inside: { 'namespace': /^[^\s>\/:]+:/ }
+ }
+ }
+ },
+ 'entity': /?[\da-z]{1,8};/i
+ };
+ Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] = Prism.languages.markup['entity'];
+ Prism.hooks.add('wrap', function (env) {
+ if (env.type === 'entity') {
+ env.attributes['title'] = env.content.replace(/&/, '&');
+ }
+ });
+ Object.defineProperty(Prism.languages.markup.tag, 'addInlined', {
+ value: function addInlined(tagName, lang) {
+ var includedCdataInside = {};
+ includedCdataInside['language-' + lang] = {
+ pattern: /(^$)/i,
+ lookbehind: true,
+ inside: Prism.languages[lang]
+ };
+ includedCdataInside['cdata'] = /^$/i;
+ var inside = {
+ 'included-cdata': {
+ pattern: //i,
+ inside: includedCdataInside
+ }
+ };
+ inside['language-' + lang] = {
+ pattern: /[\s\S]+/,
+ inside: Prism.languages[lang]
+ };
+ var def = {};
+ def[tagName] = {
+ pattern: RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g, tagName), 'i'),
+ lookbehind: true,
+ greedy: true,
+ inside: inside
+ };
+ Prism.languages.insertBefore('markup', 'cdata', def);
+ }
+ });
+ Prism.languages.xml = Prism.languages.extend('markup', {});
+ Prism.languages.html = Prism.languages.markup;
+ Prism.languages.mathml = Prism.languages.markup;
+ Prism.languages.svg = Prism.languages.markup;
+ },
+ {}
+ ],
+ 11: [
+ function (require, module, exports) {
+ (function (Prism) {
+ Prism.languages.php = Prism.languages.extend('clike', {
+ 'keyword': /\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,
+ 'boolean': {
+ pattern: /\b(?:false|true)\b/i,
+ alias: 'constant'
+ },
+ 'constant': [
+ /\b[A-Z_][A-Z0-9_]*\b/,
+ /\b(?:null)\b/i
+ ],
+ 'comment': {
+ pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
+ lookbehind: true
+ }
+ });
+ Prism.languages.insertBefore('php', 'string', {
+ 'shell-comment': {
+ pattern: /(^|[^\\])#.*/,
+ lookbehind: true,
+ alias: 'comment'
+ }
+ });
+ Prism.languages.insertBefore('php', 'comment', {
+ 'delimiter': {
+ pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i,
+ alias: 'important'
+ }
+ });
+ Prism.languages.insertBefore('php', 'keyword', {
+ 'variable': /\$+(?:\w+\b|(?={))/i,
+ 'package': {
+ pattern: /(\\|namespace\s+|use\s+)[\w\\]+/,
+ lookbehind: true,
+ inside: { punctuation: /\\/ }
+ }
+ });
+ Prism.languages.insertBefore('php', 'operator', {
+ 'property': {
+ pattern: /(->)[\w]+/,
+ lookbehind: true
+ }
+ });
+ var string_interpolation = {
+ pattern: /{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,
+ lookbehind: true,
+ inside: Prism.languages.php
+ };
+ Prism.languages.insertBefore('php', 'string', {
+ 'nowdoc-string': {
+ pattern: /<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,
+ greedy: true,
+ alias: 'string',
+ inside: {
+ 'delimiter': {
+ pattern: /^<<<'[^']+'|[a-z_]\w*;$/i,
+ alias: 'symbol',
+ inside: { 'punctuation': /^<<<'?|[';]$/ }
+ }
+ }
+ },
+ 'heredoc-string': {
+ pattern: /<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,
+ greedy: true,
+ alias: 'string',
+ inside: {
+ 'delimiter': {
+ pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,
+ alias: 'symbol',
+ inside: { 'punctuation': /^<<<"?|[";]$/ }
+ },
+ 'interpolation': string_interpolation
+ }
+ },
+ 'single-quoted-string': {
+ pattern: /'(?:\\[\s\S]|[^\\'])*'/,
+ greedy: true,
+ alias: 'string'
+ },
+ 'double-quoted-string': {
+ pattern: /"(?:\\[\s\S]|[^\\"])*"/,
+ greedy: true,
+ alias: 'string',
+ inside: { 'interpolation': string_interpolation }
+ }
+ });
+ delete Prism.languages.php['string'];
+ Prism.hooks.add('before-tokenize', function (env) {
+ if (!/<\?/.test(env.code)) {
+ return;
+ }
+ var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/ig;
+ Prism.languages['markup-templating'].buildPlaceholders(env, 'php', phpPattern);
+ });
+ Prism.hooks.add('after-tokenize', function (env) {
+ Prism.languages['markup-templating'].tokenizePlaceholders(env, 'php');
+ });
+ }(Prism));
+ },
+ {}
+ ],
+ 12: [
+ function (require, module, exports) {
+ Prism.languages.python = {
+ 'comment': {
+ pattern: /(^|[^\\])#.*/,
+ lookbehind: true
+ },
+ 'string-interpolation': {
+ pattern: /(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,
+ greedy: true,
+ inside: {
+ 'interpolation': {
+ pattern: /((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,
+ lookbehind: true,
+ inside: {
+ 'format-spec': {
+ pattern: /(:)[^:(){}]+(?=}$)/,
+ lookbehind: true
+ },
+ 'conversion-option': {
+ pattern: /![sra](?=[:}]$)/,
+ alias: 'punctuation'
+ },
+ rest: null
+ }
+ },
+ 'string': /[\s\S]+/
+ }
+ },
+ 'triple-quoted-string': {
+ pattern: /(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,
+ greedy: true,
+ alias: 'string'
+ },
+ 'string': {
+ pattern: /(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,
+ greedy: true
+ },
+ 'function': {
+ pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
+ lookbehind: true
+ },
+ 'class-name': {
+ pattern: /(\bclass\s+)\w+/i,
+ lookbehind: true
+ },
+ 'decorator': {
+ pattern: /(^\s*)@\w+(?:\.\w+)*/im,
+ lookbehind: true,
+ alias: [
+ 'annotation',
+ 'punctuation'
+ ],
+ inside: { 'punctuation': /\./ }
+ },
+ 'keyword': /\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,
+ 'builtin': /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
+ 'boolean': /\b(?:True|False|None)\b/,
+ 'number': /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,
+ 'operator': /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
+ 'punctuation': /[{}[\];(),.:]/
+ };
+ Prism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python;
+ Prism.languages.py = Prism.languages.python;
+ },
+ {}
+ ],
+ 13: [
+ function (require, module, exports) {
+ (function (Prism) {
+ Prism.languages.ruby = Prism.languages.extend('clike', {
+ 'comment': [
+ /#.*/,
+ {
+ pattern: /^=begin\s[\s\S]*?^=end/m,
+ greedy: true
+ }
+ ],
+ 'class-name': {
+ pattern: /(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,
+ lookbehind: true,
+ inside: { 'punctuation': /[.\\]/ }
+ },
+ 'keyword': /\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/
+ });
+ var interpolation = {
+ pattern: /#\{[^}]+\}/,
+ inside: {
+ 'delimiter': {
+ pattern: /^#\{|\}$/,
+ alias: 'tag'
+ },
+ rest: Prism.languages.ruby
+ }
+ };
+ delete Prism.languages.ruby.function;
+ Prism.languages.insertBefore('ruby', 'keyword', {
+ 'regex': [
+ {
+ pattern: /%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,
+ lookbehind: true,
+ greedy: true
+ }
+ ],
+ 'variable': /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
+ 'symbol': {
+ pattern: /(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,
+ lookbehind: true
+ },
+ 'method-definition': {
+ pattern: /(\bdef\s+)[\w.]+/,
+ lookbehind: true,
+ inside: {
+ 'function': /\w+$/,
+ rest: Prism.languages.ruby
+ }
+ }
+ });
+ Prism.languages.insertBefore('ruby', 'number', {
+ 'builtin': /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,
+ 'constant': /\b[A-Z]\w*(?:[?!]|\b)/
+ });
+ Prism.languages.ruby.string = [
+ {
+ pattern: /%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ },
+ {
+ pattern: /("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
+ greedy: true,
+ inside: { 'interpolation': interpolation }
+ }
+ ];
+ Prism.languages.rb = Prism.languages.ruby;
+ }(Prism));
+ },
+ {}
+ ],
+ 14: [
+ function (require, module, exports) {
+ var Prism = require('prismjs/components/prism-core');
+ require('prismjs/components/prism-clike');
+ require('prismjs/components/prism-markup-templating');
+ require('prismjs/components/prism-c');
+ require('prismjs/components/prism-cpp');
+ require('prismjs/components/prism-csharp');
+ require('prismjs/components/prism-css');
+ require('prismjs/components/prism-java');
+ require('prismjs/components/prism-javascript');
+ require('prismjs/components/prism-markup');
+ require('prismjs/components/prism-php');
+ require('prismjs/components/prism-python');
+ require('prismjs/components/prism-ruby');
+ module.exports = { boltExport: Prism };
+ },
+ {
+ 'prismjs/components/prism-c': 1,
+ 'prismjs/components/prism-clike': 2,
+ 'prismjs/components/prism-core': 3,
+ 'prismjs/components/prism-cpp': 4,
+ 'prismjs/components/prism-csharp': 5,
+ 'prismjs/components/prism-css': 6,
+ 'prismjs/components/prism-java': 7,
+ 'prismjs/components/prism-javascript': 8,
+ 'prismjs/components/prism-markup': 10,
+ 'prismjs/components/prism-markup-templating': 9,
+ 'prismjs/components/prism-php': 11,
+ 'prismjs/components/prism-python': 12,
+ 'prismjs/components/prism-ruby': 13
+ }
+ ]
+ }, {}, [14])(14);
+ }));
+ var prism = window.Prism;
+ window.Prism = oldprism;
+ return prism;
+ }(undefined, exports$1, module, undefined));
+ var Prism$1 = module.exports.boltExport;
+
+ var getLanguages = function (editor) {
+ return editor.getParam('codesample_languages');
+ };
+ var useGlobalPrismJS = function (editor) {
+ return editor.getParam('codesample_global_prismjs', false, 'boolean');
+ };
+ var Settings = {
+ getLanguages: getLanguages,
+ useGlobalPrismJS: useGlobalPrismJS
+ };
+
+ var get = function (editor) {
+ return Global.Prism && Settings.useGlobalPrismJS(editor) ? Global.Prism : Prism$1;
+ };
+ var Prism$2 = { get: get };
+
+ var getSelectedCodeSample = function (editor) {
+ var node = editor.selection ? editor.selection.getNode() : null;
+ if (Utils.isCodeSample(node)) {
+ return Option.some(node);
+ }
+ return Option.none();
+ };
+ var insertCodeSample = function (editor, language, code) {
+ editor.undoManager.transact(function () {
+ var node = getSelectedCodeSample(editor);
+ code = global$1.DOM.encode(code);
+ return node.fold(function () {
+ editor.insertContent('' + code + ' ');
+ editor.selection.select(editor.$('#__new').removeAttr('id')[0]);
+ }, function (n) {
+ editor.dom.setAttrib(n, 'class', 'language-' + language);
+ n.innerHTML = code;
+ Prism$2.get(editor).highlightElement(n);
+ editor.selection.select(n);
+ });
+ });
+ };
+ var getCurrentCode = function (editor) {
+ var node = getSelectedCodeSample(editor);
+ return node.fold(function () {
+ return '';
+ }, function (n) {
+ return n.textContent;
+ });
+ };
+ var CodeSample = {
+ getSelectedCodeSample: getSelectedCodeSample,
+ insertCodeSample: insertCodeSample,
+ getCurrentCode: getCurrentCode
+ };
+
+ var getLanguages$1 = function (editor) {
+ var defaultLanguages = [
+ {
+ text: 'HTML/XML',
+ value: 'markup'
+ },
+ {
+ text: 'JavaScript',
+ value: 'javascript'
+ },
+ {
+ text: 'CSS',
+ value: 'css'
+ },
+ {
+ text: 'PHP',
+ value: 'php'
+ },
+ {
+ text: 'Ruby',
+ value: 'ruby'
+ },
+ {
+ text: 'Python',
+ value: 'python'
+ },
+ {
+ text: 'Java',
+ value: 'java'
+ },
+ {
+ text: 'C',
+ value: 'c'
+ },
+ {
+ text: 'C#',
+ value: 'csharp'
+ },
+ {
+ text: 'C++',
+ value: 'cpp'
+ }
+ ];
+ var customLanguages = Settings.getLanguages(editor);
+ return customLanguages ? customLanguages : defaultLanguages;
+ };
+ var getCurrentLanguage = function (editor, fallback) {
+ var node = CodeSample.getSelectedCodeSample(editor);
+ return node.fold(function () {
+ return fallback;
+ }, function (n) {
+ var matches = n.className.match(/language-(\w+)/);
+ return matches ? matches[1] : fallback;
+ });
+ };
+ var Languages = {
+ getLanguages: getLanguages$1,
+ getCurrentLanguage: getCurrentLanguage
+ };
+
+ var typeOf = function (x) {
+ if (x === null) {
+ return 'null';
+ }
+ var t = typeof x;
+ if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
+ return 'array';
+ }
+ if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
+ return 'string';
+ }
+ return t;
+ };
+ var isType = function (type) {
+ return function (value) {
+ return typeOf(value) === type;
+ };
+ };
+ var isFunction = isType('function');
+
+ var nativeSlice = Array.prototype.slice;
+ var head = function (xs) {
+ return xs.length === 0 ? Option.none() : Option.some(xs[0]);
+ };
+ var from$1 = isFunction(Array.from) ? Array.from : function (x) {
+ return nativeSlice.call(x);
+ };
+
+ var open = function (editor) {
+ var languages = Languages.getLanguages(editor);
+ var defaultLanguage = head(languages).fold(function () {
+ return '';
+ }, function (l) {
+ return l.value;
+ });
+ var currentLanguage = Languages.getCurrentLanguage(editor, defaultLanguage);
+ var currentCode = CodeSample.getCurrentCode(editor);
+ editor.windowManager.open({
+ title: 'Insert/Edit Code Sample',
+ size: 'large',
+ body: {
+ type: 'panel',
+ items: [
+ {
+ type: 'selectbox',
+ name: 'language',
+ label: 'Language',
+ items: languages
+ },
+ {
+ type: 'textarea',
+ name: 'code',
+ label: 'Code view'
+ }
+ ]
+ },
+ buttons: [
+ {
+ type: 'cancel',
+ name: 'cancel',
+ text: 'Cancel'
+ },
+ {
+ type: 'submit',
+ name: 'save',
+ text: 'Save',
+ primary: true
+ }
+ ],
+ initialData: {
+ language: currentLanguage,
+ code: currentCode
+ },
+ onSubmit: function (api) {
+ var data = api.getData();
+ CodeSample.insertCodeSample(editor, data.language, data.code);
+ api.close();
+ }
+ });
+ };
+ var Dialog = { open: open };
+
+ var register = function (editor) {
+ editor.addCommand('codesample', function () {
+ var node = editor.selection.getNode();
+ if (editor.selection.isCollapsed() || Utils.isCodeSample(node)) {
+ Dialog.open(editor);
+ } else {
+ editor.formatter.toggle('code');
+ }
+ });
+ };
+ var Commands = { register: register };
+
+ var setup = function (editor) {
+ var $ = editor.$;
+ editor.on('PreProcess', function (e) {
+ $('pre[contenteditable=false]', e.node).filter(Utils.trimArg(Utils.isCodeSample)).each(function (idx, elm) {
+ var $elm = $(elm), code = elm.textContent;
+ $elm.attr('class', $.trim($elm.attr('class')));
+ $elm.removeAttr('contentEditable');
+ $elm.empty().append($('
').each(function () {
+ this.textContent = code;
+ }));
+ });
+ });
+ editor.on('SetContent', function () {
+ var unprocessedCodeSamples = $('pre').filter(Utils.trimArg(Utils.isCodeSample)).filter(function (idx, elm) {
+ return elm.contentEditable !== 'false';
+ });
+ if (unprocessedCodeSamples.length) {
+ editor.undoManager.transact(function () {
+ unprocessedCodeSamples.each(function (idx, elm) {
+ $(elm).find('br').each(function (idx, elm) {
+ elm.parentNode.replaceChild(editor.getDoc().createTextNode('\n'), elm);
+ });
+ elm.contentEditable = 'false';
+ elm.innerHTML = editor.dom.encode(elm.textContent);
+ Prism$2.get(editor).highlightElement(elm);
+ elm.className = $.trim(elm.className);
+ });
+ });
+ }
+ });
+ };
+ var FilterContent = { setup: setup };
+
+ var isCodeSampleSelection = function (editor) {
+ var node = editor.selection.getStart();
+ return editor.dom.is(node, 'pre[class*="language-"]');
+ };
+ var register$1 = function (editor) {
+ editor.ui.registry.addToggleButton('codesample', {
+ icon: 'code-sample',
+ tooltip: 'Insert/edit code sample',
+ onAction: function () {
+ return Dialog.open(editor);
+ },
+ onSetup: function (api) {
+ var nodeChangeHandler = function () {
+ api.setActive(isCodeSampleSelection(editor));
+ };
+ editor.on('NodeChange', nodeChangeHandler);
+ return function () {
+ return editor.off('NodeChange', nodeChangeHandler);
+ };
+ }
+ });
+ editor.ui.registry.addMenuItem('codesample', {
+ text: 'Code sample...',
+ icon: 'code-sample',
+ onAction: function () {
+ return Dialog.open(editor);
+ }
+ });
+ };
+ var Buttons = { register: register$1 };
+
+ function Plugin () {
+ global.add('codesample', function (editor) {
+ FilterContent.setup(editor);
+ Buttons.register(editor);
+ Commands.register(editor);
+ editor.on('dblclick', function (ev) {
+ if (Utils.isCodeSample(ev.target)) {
+ Dialog.open(editor);
+ }
+ });
+ });
+ }
+
+ Plugin();
+
+}(window));
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/codesample/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/codesample/plugin.min.js
new file mode 100644
index 0000000..a29767f
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/codesample/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.2.1 (2020-03-25)
+ */
+!function(e){"use strict";function n(){}function i(e){return function(){return e}}function t(){return l}var r,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=i(!1),o=i(!0),l=(r={fold:function(e,n){return e()},is:s,isSome:s,isNone:o,getOr:p,getOrThunk:c,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:p,orThunk:c,map:t,each:n,bind:t,exists:s,forall:o,filter:t,equals:u,equals_:u,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(r),r);function u(e){return e.isNone()}function c(e){return e()}function p(e){return e}var d=function(t){function e(){return a}function n(e){return e(t)}var r=i(t),a={fold:function(e,n){return n(t)},is:function(e){return t===e},isSome:o,isNone:s,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return d(e(t))},each:function(e){e(t)},bind:n,exists:n,forall:n,filter:function(e){return e(t)?a:l},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(e){return e.is(t)},equals_:function(e,n){return e.fold(s,function(e){return n(t,e)})}};return a},g={some:d,none:t,from:function(e){return null===e||e===undefined?l:d(e)}},m=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils");var f={isCodeSample:function q(e){return e&&"PRE"===e.nodeName&&-1!==e.className.indexOf("language-")},trimArg:function I(t){return function(e,n){return t(n)}}},h="undefined"!=typeof e.window?e.window:Function("return this;")(),b={},y={exports:b},w={};!function(n,t,r,p){var e=window.Prism;window.Prism={manual:!0},function(e){if("object"==typeof t&&void 0!==r)r.exports=e();else if("function"==typeof n&&n.amd)n([],e);else{("undefined"!=typeof window?window:void 0!==w?w:"undefined"!=typeof self?self:this).EphoxContactWrapper=e()}}(function(){return function c(i,s,o){function l(n,e){if(!s[n]){if(!i[n]){var t="function"==typeof p&&p;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var a=s[n]={exports:{}};i[n][0].call(a.exports,function(e){return l(i[n][1][e]||e)},a,a.exports,c,i,s,o)}return s[n].exports}for(var u="function"==typeof p&&p,e=0;e >=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,E={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,E.util.encode(e.content),e.alias):Array.isArray(e)?e.map(E.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(g&&b!=n.length-1){if(c.lastIndex=y,!(F=c.exec(e)))break;for(var v=F.index+(d&&F[1]?F[1].length:0),k=F.index+F[0].length,x=b,_=y,A=n.length;x"+t.content+""+t.tag+">"},!u.document)return u.addEventListener&&(E.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,r=n.code,a=n.immediateClose;u.postMessage(E.highlight(r,E.languages[t],t)),a&&u.close()},!1)),E;var e=E.util.currentScript();if(e&&(E.filename=e.src,e.hasAttribute("data-manual")&&(E.manual=!0)),!E.manual){var t=function(){E.manual||E.highlightAll()},r=document.readyState;"loading"===r||"interactive"===r&&e&&e.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)}return E}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==w?w:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var r,a,i;r=Prism,a=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,r.languages.java=r.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:a,"function":[r.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),r.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),r.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:a,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(r,a,e,i){if(r.language===a){var s=r.tokenStack=[];r.code=r.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==r.code.indexOf(n=b(a,t));)++t;return s[t]=e,n}),r.grammar=y.languages.markup}}},tokenizePlaceholders:{value:function(d,g){if(d.language===g&&d.tokenStack){d.grammar=y.languages[g];var m=0,f=Object.keys(d.tokenStack);!function h(e){for(var n=0;n=f.length);n++){var t=e[n];if("string"==typeof t||t.content&&"string"==typeof t.content){var r=f[m],a=d.tokenStack[r],i="string"==typeof t?t:t.content,s=b(g,r),o=i.indexOf(s);if(-1/,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:t}};r["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var a={};a[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",a)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){if(/<\?/.test(e.code)){n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var r=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:r}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var a=window.Prism;window.Prism=e}(undefined,b,y,undefined);function v(e){var n=e.selection?e.selection.getNode():null;return f.isCodeSample(n)?g.some(n):g.none()}var k,x=y.exports.boltExport,_=function(e){return e.getParam("codesample_languages")},A=function(e){return e.getParam("codesample_global_prismjs",!1,"boolean")},F=function(e){return h.Prism&&A(e)?h.Prism:x},P=v,S=function(n,t,r){n.undoManager.transact(function(){var e=v(n);return r=m.DOM.encode(r),e.fold(function(){n.insertContent(''+r+" "),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=r,F(n).highlightElement(e),n.selection.select(e)})})},j=function(e){return v(e).fold(function(){return""},function(e){return e.textContent})},$=function(e){var n=_(e);return n||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}]},C=function(e,t){return P(e).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})},E=(k="function",function(e){return function(e){if(null===e)return"null";var n=typeof e;return"object"==n&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":n}(e)===k}),O=Array.prototype.slice,z=(E(Array.from)&&Array.from,function(t){var e=$(t),n=function(e){return 0===e.length?g.none():g.some(e[0])}(e).fold(function(){return""},function(e){return e.value}),r=C(t,n),a=j(t);t.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:e},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:a},onSubmit:function(e){var n=e.getData();S(t,n.language,n.code),e.close()}})}),N=function(n){n.addCommand("codesample",function(){var e=n.selection.getNode();n.selection.isCollapsed()||f.isCodeSample(e)?z(n):n.formatter.toggle("code")})},T=function(t){var a=t.$;t.on("PreProcess",function(e){a("pre[contenteditable=false]",e.node).filter(f.trimArg(f.isCodeSample)).each(function(e,n){var t=a(n),r=n.textContent;t.attr("class",a.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(a("
").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=a("pre").filter(f.trimArg(f.isCodeSample)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){a(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),F(t).highlightElement(n),n.className=a.trim(n.className)})})})},B=function(t){t.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return z(t)},onSetup:function(e){function n(){e.setActive(function(e){var n=e.selection.getStart();return e.dom.is(n,'pre[class*="language-"]')}(t))}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}),t.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return z(t)}})};!function M(){a.add("codesample",function(n){T(n),B(n),N(n),n.on("dblclick",function(e){f.isCodeSample(e.target)&&z(n)})})}()}(window);
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.js
new file mode 100644
index 0000000..4ef91dd
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.js
@@ -0,0 +1,22 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.2.1 (2020-03-25)
+ */
+(function (domGlobals) {
+ 'use strict';
+
+ var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
+
+ function Plugin () {
+ global.add('colorpicker', function () {
+ domGlobals.console.warn('Color picker plugin is now built in to the core editor, please remove it from your editor configuration');
+ });
+ }
+
+ Plugin();
+
+}(window));
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.min.js
new file mode 100644
index 0000000..b0d2b5e
--- /dev/null
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/colorpicker/plugin.min.js
@@ -0,0 +1,9 @@
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.2.1 (2020-03-25)
+ */
+!function(o){"use strict";var i=tinymce.util.Tools.resolve("tinymce.PluginManager");!function n(){i.add("colorpicker",function(){o.console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}()}(window);
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/css/dialog.css b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/css/dialog.css
deleted file mode 100644
index aa2a518..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/css/dialog.css
+++ /dev/null
@@ -1,118 +0,0 @@
-/* Generic */
-body {
-font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
-scrollbar-3dlight-color:#F0F0EE;
-scrollbar-arrow-color:#676662;
-scrollbar-base-color:#F0F0EE;
-scrollbar-darkshadow-color:#DDDDDD;
-scrollbar-face-color:#E0E0DD;
-scrollbar-highlight-color:#F0F0EE;
-scrollbar-shadow-color:#F0F0EE;
-scrollbar-track-color:#F5F5F5;
-background:#F0F0EE;
-padding:0;
-margin:8px 8px 0 8px;
-}
-
-html {background:#F0F0EE;}
-td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
-textarea {resize:none;outline:none;}
-a:link, a:visited {color:black;}
-a:hover {color:#2B6FB6;}
-.nowrap {white-space: nowrap}
-
-/* Forms */
-fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
-legend {color:#2B6FB6; font-weight:bold;}
-label.msg {display:none;}
-label.invalid {color:#EE0000; display:inline;}
-input.invalid {border:1px solid #EE0000;}
-input {background:#FFF; border:1px solid #CCC;}
-input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
-input, select, textarea {border:1px solid #808080;}
-input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
-input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
-.input_noborder {border:0;}
-
-/* Buttons */
-#insert, #cancel, input.button, .updateButton {
-border:0; margin:0; padding:0;
-font-weight:bold;
-width:94px; height:26px;
-background:url(../img/buttons.png) 0 -26px;
-cursor:pointer;
-padding-bottom:2px;
-float:left;
-}
-
-#insert {background:url(../img/buttons.png) 0 -52px}
-#cancel {background:url(../img/buttons.png) 0 0; float:right}
-
-/* Browse */
-a.pickcolor, a.browse {text-decoration:none}
-a.browse span {display:block; width:20px; height:18px; background:url(../img/icons.gif) -20px 0 no-repeat; border:1px solid #FFF; margin-left:1px;}
-.mceOldBoxModel a.browse span {width:22px; height:20px;}
-a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
-a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
-a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
-a.pickcolor span {display:block; width:20px; height:16px; background:url(../img/icons.gif) 0 0; margin-left:2px;}
-.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
-a.pickcolor:hover span {background-color:#B2BBD0;}
-a.pickcolor:hover span.disabled {}
-
-/* Charmap */
-table.charmap {border:1px solid #AAA; text-align:center}
-td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
-#charmap a {display:block; color:#000; text-decoration:none; border:0}
-#charmap a:hover {background:#CCC;color:#2B6FB6}
-#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
-#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
-
-/* Source */
-.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
-.mceActionPanel {margin-top:5px;}
-
-/* Tabs classes */
-.tabs {width:100%; height:18px; line-height:normal; background:url(../img/tabs.gif) repeat-x 0 -72px;}
-.tabs ul {margin:0; padding:0; list-style:none;}
-.tabs li {float:left; background:url(../img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
-.tabs li.current {background:url(../img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
-.tabs span {float:left; display:block; background:url(../img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
-.tabs .current span {background:url(../img/tabs.gif) no-repeat right -54px;}
-.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
-.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
-
-/* Panels */
-.panel_wrapper div.panel {display:none;}
-.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
-.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
-
-/* Columns */
-.column {float:left;}
-.properties {width:100%;}
-.properties .column1 {}
-.properties .column2 {text-align:left;}
-
-/* Titles */
-h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
-h3 {font-size:14px;}
-.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
-
-/* Dialog specific */
-#link .panel_wrapper, #link div.current {height:125px;}
-#image .panel_wrapper, #image div.current {height:200px;}
-#plugintable thead {font-weight:bold; background:#DDD;}
-#plugintable, #about #plugintable td {border:1px solid #919B9C;}
-#plugintable {width:96%; margin-top:10px;}
-#pluginscontainer {height:290px; overflow:auto;}
-#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}
-#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}
-#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap}
-#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
-#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
-#colorpicker #light div {overflow:hidden;}
-#colorpicker .panel_wrapper div.current {height:175px;}
-#colorpicker #namedcolors {width:150px;}
-#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
-#colorpicker #colornamecontainer {margin-top:5px;}
-#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/buttons.png b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/buttons.png
deleted file mode 100644
index 1e53560..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/buttons.png and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/icons.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/icons.gif
deleted file mode 100644
index ca22249..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/icons.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/items.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/items.gif
deleted file mode 100644
index d2f9367..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/items.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_arrow.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_arrow.gif
deleted file mode 100644
index 85e31df..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_arrow.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_check.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_check.gif
deleted file mode 100644
index adfdddc..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/menu_check.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/progress.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/progress.gif
deleted file mode 100644
index 5bb90fd..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/progress.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/tabs.gif b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/tabs.gif
deleted file mode 100644
index 06812cb..0000000
Binary files a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/img/tabs.gif and /dev/null differ
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.js
deleted file mode 100644
index 97f985b..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.js
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
- * plugin.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-/*global tinymce:true, console:true */
-/*eslint no-console:0, new-cap:0 */
-
-/**
- * This plugin adds missing events form the 4.x API back. Not every event is
- * properly supported but most things should work.
- *
- * Unsupported things:
- * - No editor.onEvent
- * - Can't cancel execCommands with beforeExecCommand
- */
-(function(tinymce) {
- var reported;
-
- function noop() {}
-
- function log(apiCall) {
- if (!reported && window && window.console) {
- reported = true;
- console.log("Deprecated TinyMCE API call: " + apiCall);
- }
- }
-
- function Dispatcher(target, newEventName, argsMap, defaultScope) {
- target = target || this;
-
- if (!newEventName) {
- this.add = this.addToTop = this.remove = this.dispatch = noop;
- return;
- }
-
- this.add = function(callback, scope, prepend) {
- log('.on' + newEventName + ".add(..)");
-
- // Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2)
- function patchedEventCallback(e) {
- var callbackArgs = [];
-
- if (typeof argsMap == "string") {
- argsMap = argsMap.split(" ");
- }
-
- if (argsMap && typeof argsMap != "function") {
- for (var i = 0; i < argsMap.length; i++) {
- callbackArgs.push(e[argsMap[i]]);
- }
- }
-
- if (typeof argsMap == "function") {
- callbackArgs = argsMap(newEventName, e, target);
- if (!callbackArgs) {
- return;
- }
- }
-
- if (!argsMap) {
- callbackArgs = [e];
- }
-
- callbackArgs.unshift(defaultScope || target);
-
- if (callback.apply(scope || defaultScope || target, callbackArgs) === false) {
- e.stopImmediatePropagation();
- }
- }
-
- target.on(newEventName, patchedEventCallback, prepend);
-
- return patchedEventCallback;
- };
-
- this.addToTop = function(callback, scope) {
- this.add(callback, scope, true);
- };
-
- this.remove = function(callback) {
- return target.off(newEventName, callback);
- };
-
- this.dispatch = function() {
- target.fire(newEventName);
-
- return true;
- };
- }
-
- tinymce.util.Dispatcher = Dispatcher;
- tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload");
- tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor");
- tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor");
-
- tinymce.util.Cookie = {
- get: noop, getHash: noop, remove: noop, set: noop, setHash: noop
- };
-
- function patchEditor(editor) {
- function patchEditorEvents(oldEventNames, argsMap) {
- tinymce.each(oldEventNames.split(" "), function(oldName) {
- editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap);
- });
- }
-
- function convertUndoEventArgs(type, event, target) {
- return [
- event.level,
- target
- ];
- }
-
- function filterSelectionEvents(needsSelection) {
- return function(type, e) {
- if ((!e.selection && !needsSelection) || e.selection == needsSelection) {
- return [e];
- }
- };
- }
-
- if (editor.controlManager) {
- return;
- }
-
- function cmNoop() {
- var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' +
- 'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' +
- 'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' +
- 'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update';
-
- log('editor.controlManager.*');
-
- function _noop() {
- return cmNoop();
- }
-
- tinymce.each(methods.split(' '), function(method) {
- obj[method] = _noop;
- });
-
- return obj;
- }
-
- editor.controlManager = {
- buttons: {},
-
- setDisabled: function(name, state) {
- log("controlManager.setDisabled(..)");
-
- if (this.buttons[name]) {
- this.buttons[name].disabled(state);
- }
- },
-
- setActive: function(name, state) {
- log("controlManager.setActive(..)");
-
- if (this.buttons[name]) {
- this.buttons[name].active(state);
- }
- },
-
- onAdd: new Dispatcher(),
- onPostRender: new Dispatcher(),
-
- add: function(obj) { return obj; },
- createButton: cmNoop,
- createColorSplitButton: cmNoop,
- createControl: cmNoop,
- createDropMenu: cmNoop,
- createListBox: cmNoop,
- createMenuButton: cmNoop,
- createSeparator: cmNoop,
- createSplitButton: cmNoop,
- createToolbar: cmNoop,
- createToolbarGroup: cmNoop,
- destroy: noop,
- get: noop,
- setControlType: cmNoop
- };
-
- patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor");
- patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset");
- patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); // args.terminate not supported
- patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change");
- patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false));
- patchEditorEvents("SetProgressState", "state time");
- patchEditorEvents("VisualAid", "element hasVisual");
- patchEditorEvents("Undo Redo", convertUndoEventArgs);
-
- patchEditorEvents("NodeChange", function(type, e) {
- return [
- editor.controlManager,
- e.element,
- editor.selection.isCollapsed(),
- e
- ];
- });
-
- var originalAddButton = editor.addButton;
- editor.addButton = function(name, settings) {
- var originalOnPostRender;
-
- function patchedPostRender() {
- editor.controlManager.buttons[name] = this;
-
- if (originalOnPostRender) {
- return originalOnPostRender.call(this);
- }
- }
-
- for (var key in settings) {
- if (key.toLowerCase() === "onpostrender") {
- originalOnPostRender = settings[key];
- settings.onPostRender = patchedPostRender;
- }
- }
-
- if (!originalOnPostRender) {
- settings.onPostRender = patchedPostRender;
- }
-
- if (settings.title) {
- settings.title = tinymce.i18n.translate((editor.settings.language || "en") + "." + settings.title);
- }
-
- return originalAddButton.call(this, name, settings);
- };
-
- editor.on('init', function() {
- var undoManager = editor.undoManager, selection = editor.selection;
-
- undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager);
- undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager);
- undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager);
- undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager);
-
- selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection);
- selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection);
- selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection);
- selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection);
- });
-
- editor.on('BeforeRenderUI', function() {
- var windowManager = editor.windowManager;
-
- windowManager.onOpen = new Dispatcher();
- windowManager.onClose = new Dispatcher();
- windowManager.createInstance = function(className, a, b, c, d, e) {
- log("windowManager.createInstance(..)");
-
- var constr = tinymce.resolve(className);
- return new constr(a, b, c, d, e);
- };
- });
- }
-
- tinymce.on('SetupEditor', patchEditor);
- tinymce.PluginManager.add("compat3x", patchEditor);
-
- tinymce.addI18n = function(prefix, o) {
- var I18n = tinymce.util.I18n, each = tinymce.each;
-
- if (typeof(prefix) == "string" && prefix.indexOf('.') === -1) {
- I18n.add(prefix, o);
- return;
- }
-
- if (!tinymce.is(prefix, 'string')) {
- each(prefix, function(o, lc) {
- each(o, function(o, g) {
- each(o, function(o, k) {
- if (g === 'common') {
- I18n.data[lc + '.' + k] = o;
- } else {
- I18n.data[lc + '.' + g + '.' + k] = o;
- }
- });
- });
- });
- } else {
- each(o, function(o, k) {
- I18n.data[prefix + '.' + k] = o;
- });
- }
- };
-})(tinymce);
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.min.js
deleted file mode 100644
index b77c7cb..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/plugin.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){function t(){}function n(e){!i&&window&&window.console&&(i=!0,console.log("Deprecated TinyMCE API call: "+e))}function o(e,o,r,i){return e=e||this,o?(this.add=function(t,a,d){function s(n){var d=[];if("string"==typeof r&&(r=r.split(" ")),r&&"function"!=typeof r)for(var s=0;s.on"+o+".add(..)"),e.on(o,s,d),s},this.addToTop=function(e,t){this.add(e,t,!0)},this.remove=function(t){return e.off(o,t)},void(this.dispatch=function(){return e.fire(o),!0})):void(this.add=this.addToTop=this.remove=this.dispatch=t)}function r(r){function i(t,n){e.each(t.split(" "),function(e){r["on"+e]=new o(r,e,n)})}function a(e,t,n){return[t.level,n]}function d(e){return function(t,n){return!n.selection&&!e||n.selection==e?[n]:void 0}}function s(){function t(){return s()}var o={},r="add addMenu addSeparator collapse createMenu destroy displayColor expand focus getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex setActive setAriaProperty setColor setDisabled setSelected setState showMenu update";return n("editor.controlManager.*"),e.each(r.split(" "),function(e){o[e]=t}),o}if(!r.controlManager){r.controlManager={buttons:{},setDisabled:function(e,t){n("controlManager.setDisabled(..)"),this.buttons[e]&&this.buttons[e].disabled(t)},setActive:function(e,t){n("controlManager.setActive(..)"),this.buttons[e]&&this.buttons[e].active(t)},onAdd:new o,onPostRender:new o,add:function(e){return e},createButton:s,createColorSplitButton:s,createControl:s,createDropMenu:s,createListBox:s,createMenuButton:s,createSeparator:s,createSplitButton:s,createToolbar:s,createToolbarGroup:s,destroy:t,get:t,setControlType:s},i("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate","editor"),i("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"),i("BeforeExecCommand ExecCommand","command ui value args"),i("PreProcess PostProcess LoadContent SaveContent Change"),i("BeforeSetContent BeforeGetContent SetContent GetContent",d(!1)),i("SetProgressState","state time"),i("VisualAid","element hasVisual"),i("Undo Redo",a),i("NodeChange",function(e,t){return[r.controlManager,t.element,r.selection.isCollapsed(),t]});var c=r.addButton;r.addButton=function(t,n){function o(){return r.controlManager.buttons[t]=this,i?i.call(this):void 0}var i;for(var a in n)"onpostrender"===a.toLowerCase()&&(i=n[a],n.onPostRender=o);return i||(n.onPostRender=o),n.title&&(n.title=e.i18n.translate((r.settings.language||"en")+"."+n.title)),c.call(this,t,n)},r.on("init",function(){var e=r.undoManager,t=r.selection;e.onUndo=new o(r,"Undo",a,null,e),e.onRedo=new o(r,"Redo",a,null,e),e.onBeforeAdd=new o(r,"BeforeAddUndo",null,e),e.onAdd=new o(r,"AddUndo",null,e),t.onBeforeGetContent=new o(r,"BeforeGetContent",d(!0),t),t.onGetContent=new o(r,"GetContent",d(!0),t),t.onBeforeSetContent=new o(r,"BeforeSetContent",d(!0),t),t.onSetContent=new o(r,"SetContent",d(!0),t)}),r.on("BeforeRenderUI",function(){var t=r.windowManager;t.onOpen=new o,t.onClose=new o,t.createInstance=function(t,o,r,i,a,d){n("windowManager.createInstance(..)");var s=e.resolve(t);return new s(o,r,i,a,d)}})}}var i;e.util.Dispatcher=o,e.onBeforeUnload=new o(e,"BeforeUnload"),e.onAddEditor=new o(e,"AddEditor","editor"),e.onRemoveEditor=new o(e,"RemoveEditor","editor"),e.util.Cookie={get:t,getHash:t,remove:t,set:t,setHash:t},e.on("SetupEditor",r),e.PluginManager.add("compat3x",r),e.addI18n=function(t,n){var o=e.util.I18n,r=e.each;return"string"==typeof t&&-1===t.indexOf(".")?void o.add(t,n):void(e.is(t,"string")?r(n,function(e,n){o.data[t+"."+n]=e}):r(t,function(e,t){r(e,function(e,n){r(e,function(e,r){"common"===n?o.data[t+"."+r]=e:o.data[t+"."+n+"."+r]=e})})}))}}(tinymce);
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/tiny_mce_popup.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/tiny_mce_popup.js
deleted file mode 100644
index 9150f86..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/tiny_mce_popup.js
+++ /dev/null
@@ -1,539 +0,0 @@
-/**
- * Popup.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-var tinymce, tinyMCE;
-
-/**
- * TinyMCE popup/dialog helper class. This gives you easy access to the
- * parent editor instance and a bunch of other things. It's higly recommended
- * that you load this script into your dialogs.
- *
- * @static
- * @class tinyMCEPopup
- */
-var tinyMCEPopup = {
- /**
- * Initializes the popup this will be called automatically.
- *
- * @method init
- */
- init: function() {
- var self = this, parentWin, settings, uiWindow;
-
- // Find window & API
- parentWin = self.getWin();
- tinymce = tinyMCE = parentWin.tinymce;
- self.editor = tinymce.EditorManager.activeEditor;
- self.params = self.editor.windowManager.getParams();
-
- uiWindow = self.editor.windowManager.windows[self.editor.windowManager.windows.length - 1];
- self.features = uiWindow.features;
- self.uiWindow = uiWindow;
-
- settings = self.editor.settings;
-
- // Setup popup CSS path(s)
- if (settings.popup_css !== false) {
- if (settings.popup_css) {
- settings.popup_css = self.editor.documentBaseURI.toAbsolute(settings.popup_css);
- } else {
- settings.popup_css = self.editor.baseURI.toAbsolute("plugins/compat3x/css/dialog.css");
- }
- }
-
- if (settings.popup_css_add) {
- settings.popup_css += ',' + self.editor.documentBaseURI.toAbsolute(settings.popup_css_add);
- }
-
- // Setup local DOM
- self.dom = self.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document, {
- ownEvents: true,
- proxy: tinyMCEPopup._eventProxy
- });
-
- self.dom.bind(window, 'ready', self._onDOMLoaded, self);
-
- // Enables you to skip loading the default css
- if (self.features.popup_css !== false) {
- self.dom.loadCSS(self.features.popup_css || self.editor.settings.popup_css);
- }
-
- // Setup on init listeners
- self.listeners = [];
-
- /**
- * Fires when the popup is initialized.
- *
- * @event onInit
- * @param {tinymce.Editor} editor Editor instance.
- * @example
- * // Alerts the selected contents when the dialog is loaded
- * tinyMCEPopup.onInit.add(function(ed) {
- * alert(ed.selection.getContent());
- * });
- *
- * // Executes the init method on page load in some object using the SomeObject scope
- * tinyMCEPopup.onInit.add(SomeObject.init, SomeObject);
- */
- self.onInit = {
- add: function(func, scope) {
- self.listeners.push({func : func, scope : scope});
- }
- };
-
- self.isWindow = !self.getWindowArg('mce_inline');
- self.id = self.getWindowArg('mce_window_id');
- },
-
- /**
- * Returns the reference to the parent window that opened the dialog.
- *
- * @method getWin
- * @return {Window} Reference to the parent window that opened the dialog.
- */
- getWin: function() {
- // Added frameElement check to fix bug: #2817583
- return (!window.frameElement && window.dialogArguments) || opener || parent || top;
- },
-
- /**
- * Returns a window argument/parameter by name.
- *
- * @method getWindowArg
- * @param {String} name Name of the window argument to retrive.
- * @param {String} defaultValue Optional default value to return.
- * @return {String} Argument value or default value if it wasn't found.
- */
- getWindowArg : function(name, defaultValue) {
- var value = this.params[name];
-
- return tinymce.is(value) ? value : defaultValue;
- },
-
- /**
- * Returns a editor parameter/config option value.
- *
- * @method getParam
- * @param {String} name Name of the editor config option to retrive.
- * @param {String} defaultValue Optional default value to return.
- * @return {String} Parameter value or default value if it wasn't found.
- */
- getParam : function(name, defaultValue) {
- return this.editor.getParam(name, defaultValue);
- },
-
- /**
- * Returns a language item by key.
- *
- * @method getLang
- * @param {String} name Language item like mydialog.something.
- * @param {String} defaultValue Optional default value to return.
- * @return {String} Language value for the item like "my string" or the default value if it wasn't found.
- */
- getLang : function(name, defaultValue) {
- return this.editor.getLang(name, defaultValue);
- },
-
- /**
- * Executed a command on editor that opened the dialog/popup.
- *
- * @method execCommand
- * @param {String} cmd Command to execute.
- * @param {Boolean} ui Optional boolean value if the UI for the command should be presented or not.
- * @param {Object} val Optional value to pass with the comman like an URL.
- * @param {Object} a Optional arguments object.
- */
- execCommand : function(cmd, ui, val, args) {
- args = args || {};
- args.skip_focus = 1;
-
- this.restoreSelection();
- return this.editor.execCommand(cmd, ui, val, args);
- },
-
- /**
- * Resizes the dialog to the inner size of the window. This is needed since various browsers
- * have different border sizes on windows.
- *
- * @method resizeToInnerSize
- */
- resizeToInnerSize : function() {
- /*var self = this;
-
- // Detach it to workaround a Chrome specific bug
- // https://sourceforge.net/tracker/?func=detail&atid=635682&aid=2926339&group_id=103281
- setTimeout(function() {
- var vp = self.dom.getViewPort(window);
-
- self.editor.windowManager.resizeBy(
- self.getWindowArg('mce_width') - vp.w,
- self.getWindowArg('mce_height') - vp.h,
- self.id || window
- );
- }, 10);*/
- },
-
- /**
- * Will executed the specified string when the page has been loaded. This function
- * was added for compatibility with the 2.x branch.
- *
- * @method executeOnLoad
- * @param {String} evil String to evalutate on init.
- */
- executeOnLoad : function(evil) {
- this.onInit.add(function() {
- eval(evil);
- });
- },
-
- /**
- * Stores the current editor selection for later restoration. This can be useful since some browsers
- * looses it's selection if a control element is selected/focused inside the dialogs.
- *
- * @method storeSelection
- */
- storeSelection : function() {
- this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark(1);
- },
-
- /**
- * Restores any stored selection. This can be useful since some browsers
- * looses it's selection if a control element is selected/focused inside the dialogs.
- *
- * @method restoreSelection
- */
- restoreSelection : function() {
- var self = tinyMCEPopup;
-
- if (!self.isWindow && tinymce.isIE) {
- self.editor.selection.moveToBookmark(self.editor.windowManager.bookmark);
- }
- },
-
- /**
- * Loads a specific dialog language pack. If you pass in plugin_url as a argument
- * when you open the window it will load the /langs/_dlg.js lang pack file.
- *
- * @method requireLangPack
- */
- requireLangPack : function() {
- var self = this, url = self.getWindowArg('plugin_url') || self.getWindowArg('theme_url'), settings = self.editor.settings, lang;
-
- if (settings.language !== false) {
- lang = settings.language || "en";
- }
-
- if (url && lang && self.features.translate_i18n !== false && settings.language_load !== false) {
- url += '/langs/' + lang + '_dlg.js';
-
- if (!tinymce.ScriptLoader.isDone(url)) {
- document.write('');
- tinymce.ScriptLoader.markDone(url);
- }
- }
- },
-
- /**
- * Executes a color picker on the specified element id. When the user
- * then selects a color it will be set as the value of the specified element.
- *
- * @method pickColor
- * @param {DOMEvent} e DOM event object.
- * @param {string} element_id Element id to be filled with the color value from the picker.
- */
- pickColor : function(e, element_id) {
- this.execCommand('mceColorPicker', true, {
- color : document.getElementById(element_id).value,
- func : function(c) {
- document.getElementById(element_id).value = c;
-
- try {
- document.getElementById(element_id).onchange();
- } catch (ex) {
- // Try fire event, ignore errors
- }
- }
- });
- },
-
- /**
- * Opens a filebrowser/imagebrowser this will set the output value from
- * the browser as a value on the specified element.
- *
- * @method openBrowser
- * @param {string} element_id Id of the element to set value in.
- * @param {string} type Type of browser to open image/file/flash.
- * @param {string} option Option name to get the file_broswer_callback function name from.
- */
- openBrowser : function(element_id, type) {
- tinyMCEPopup.restoreSelection();
- this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);
- },
-
- /**
- * Creates a confirm dialog. Please don't use the blocking behavior of this
- * native version use the callback method instead then it can be extended.
- *
- * @method confirm
- * @param {String} t Title for the new confirm dialog.
- * @param {function} cb Callback function to be executed after the user has selected ok or cancel.
- * @param {Object} s Optional scope to execute the callback in.
- */
- confirm : function(t, cb, s) {
- this.editor.windowManager.confirm(t, cb, s, window);
- },
-
- /**
- * Creates a alert dialog. Please don't use the blocking behavior of this
- * native version use the callback method instead then it can be extended.
- *
- * @method alert
- * @param {String} tx Title for the new alert dialog.
- * @param {function} cb Callback function to be executed after the user has selected ok.
- * @param {Object} s Optional scope to execute the callback in.
- */
- alert : function(tx, cb, s) {
- this.editor.windowManager.alert(tx, cb, s, window);
- },
-
- /**
- * Closes the current window.
- *
- * @method close
- */
- close : function() {
- var t = this;
-
- // To avoid domain relaxing issue in Opera
- function close() {
- t.editor.windowManager.close(window);
- tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup
- }
-
- if (tinymce.isOpera) {
- t.getWin().setTimeout(close, 0);
- } else {
- close();
- }
- },
-
- // Internal functions
-
- _restoreSelection : function() {
- var e = window.event.srcElement;
-
- if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) {
- tinyMCEPopup.restoreSelection();
- }
- },
-
-/* _restoreSelection : function() {
- var e = window.event.srcElement;
-
- // If user focus a non text input or textarea
- if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')
- tinyMCEPopup.restoreSelection();
- },*/
-
- _onDOMLoaded : function() {
- var t = tinyMCEPopup, ti = document.title, h, nv;
-
- // Translate page
- if (t.features.translate_i18n !== false) {
- var map = {
- "update": "Ok",
- "insert": "Ok",
- "cancel": "Cancel",
- "not_set": "--",
- "class_name": "Class name",
- "browse": "Browse"
- };
-
- var langCode = tinymce.settings.language || 'en';
- for (var key in map) {
- tinymce.i18n.data[langCode + "." + key] = tinymce.i18n.translate(map[key]);
- }
-
- h = document.body.innerHTML;
-
- // Replace a=x with a="x" in IE
- if (tinymce.isIE) {
- h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"');
- }
-
- document.dir = t.editor.getParam('directionality','');
-
- if ((nv = t.editor.translate(h)) && nv != h) {
- document.body.innerHTML = nv;
- }
-
- if ((nv = t.editor.translate(ti)) && nv != ti) {
- document.title = ti = nv;
- }
- }
-
- if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) {
- t.dom.addClass(document.body, 'forceColors');
- }
-
- document.body.style.display = '';
-
- // Restore selection in IE when focus is placed on a non textarea or input element of the type text
- if (tinymce.Env.ie) {
- if (tinymce.Env.ie < 11) {
- document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);
-
- // Add base target element for it since it would fail with modal dialogs
- t.dom.add(t.dom.select('head')[0], 'base', {target: '_self'});
- } else {
- document.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false);
- }
- }
-
- t.restoreSelection();
- t.resizeToInnerSize();
-
- // Set inline title
- if (!t.isWindow) {
- t.editor.windowManager.setTitle(window, ti);
- } else {
- window.focus();
- }
-
- if (!tinymce.isIE && !t.isWindow) {
- t.dom.bind(document, 'focus', function() {
- t.editor.windowManager.focus(t.id);
- });
- }
-
- // Patch for accessibility
- tinymce.each(t.dom.select('select'), function(e) {
- e.onkeydown = tinyMCEPopup._accessHandler;
- });
-
- // Call onInit
- // Init must be called before focus so the selection won't get lost by the focus call
- tinymce.each(t.listeners, function(o) {
- o.func.call(o.scope, t.editor);
- });
-
- // Move focus to window
- if (t.getWindowArg('mce_auto_focus', true)) {
- window.focus();
-
- // Focus element with mceFocus class
- tinymce.each(document.forms, function(f) {
- tinymce.each(f.elements, function(e) {
- if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {
- e.focus();
- return false; // Break loop
- }
- });
- });
- }
-
- document.onkeyup = tinyMCEPopup._closeWinKeyHandler;
-
- if ('textContent' in document) {
- t.uiWindow.getEl('head').firstChild.textContent = document.title;
- } else {
- t.uiWindow.getEl('head').firstChild.innerText = document.title;
- }
- },
-
- _accessHandler : function(e) {
- e = e || window.event;
-
- if (e.keyCode == 13 || e.keyCode == 32) {
- var elm = e.target || e.srcElement;
-
- if (elm.onchange) {
- elm.onchange();
- }
-
- return tinymce.dom.Event.cancel(e);
- }
- },
-
- _closeWinKeyHandler : function(e) {
- e = e || window.event;
-
- if (e.keyCode == 27) {
- tinyMCEPopup.close();
- }
- },
-
- _eventProxy: function(id) {
- return function(evt) {
- tinyMCEPopup.dom.events.callNativeHandler(id, evt);
- };
- }
-};
-
-tinyMCEPopup.init();
-
-tinymce.util.Dispatcher = function(scope) {
- this.scope = scope || this;
- this.listeners = [];
-
- this.add = function(callback, scope) {
- this.listeners.push({cb : callback, scope : scope || this.scope});
-
- return callback;
- };
-
- this.addToTop = function(callback, scope) {
- var self = this, listener = {cb : callback, scope : scope || self.scope};
-
- // Create new listeners if addToTop is executed in a dispatch loop
- if (self.inDispatch) {
- self.listeners = [listener].concat(self.listeners);
- } else {
- self.listeners.unshift(listener);
- }
-
- return callback;
- };
-
- this.remove = function(callback) {
- var listeners = this.listeners, output = null;
-
- tinymce.each(listeners, function(listener, i) {
- if (callback == listener.cb) {
- output = listener;
- listeners.splice(i, 1);
- return false;
- }
- });
-
- return output;
- };
-
- this.dispatch = function() {
- var self = this, returnValue, args = arguments, i, listeners = self.listeners, listener;
-
- self.inDispatch = true;
-
- // Needs to be a real loop since the listener count might change while looping
- // And this is also more efficient
- for (i = 0; i < listeners.length; i++) {
- listener = listeners[i];
- returnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]);
-
- if (returnValue === false) {
- break;
- }
- }
-
- self.inDispatch = false;
-
- return returnValue;
- };
-};
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/utils/editable_selects.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/utils/editable_selects.js
deleted file mode 100644
index 8d30787..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/compat3x/utils/editable_selects.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * editable_selects.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-var TinyMCE_EditableSelects = {
- editSelectElm : null,
-
- init : function() {
- var nl = document.getElementsByTagName("select"), i, d = document, o;
-
- for (i=0; i';
- h += ' ' + tinyMCEPopup.getLang('browse') + '
';
-
- return h;
-}
-
-function updateColor(img_id, form_element_id) {
- document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;
-}
-
-function setBrowserDisabled(id, state) {
- var img = document.getElementById(id);
- var lnk = document.getElementById(id + "_link");
-
- if (lnk) {
- if (state) {
- lnk.setAttribute("realhref", lnk.getAttribute("href"));
- lnk.removeAttribute("href");
- tinyMCEPopup.dom.addClass(img, 'disabled');
- } else {
- if (lnk.getAttribute("realhref"))
- lnk.setAttribute("href", lnk.getAttribute("realhref"));
-
- tinyMCEPopup.dom.removeClass(img, 'disabled');
- }
- }
-}
-
-function getBrowserHTML(id, target_form_element, type, prefix) {
- var option = prefix + "_" + type + "_browser_callback", cb, html;
-
- cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback"));
-
- if (!cb)
- return "";
-
- html = "";
- html += '';
- html += ' ';
-
- return html;
-}
-
-function openBrowser(img_id, target_form_element, type, option) {
- var img = document.getElementById(img_id);
-
- if (img.className != "mceButtonDisabled")
- tinyMCEPopup.openBrowser(target_form_element, type, option);
-}
-
-function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {
- if (!form_obj || !form_obj.elements[field_name])
- return;
-
- if (!value)
- value = "";
-
- var sel = form_obj.elements[field_name];
-
- var found = false;
- for (var i=0; i parseInt(v))
- st = this.mark(f, n);
- }
- }
-
- return st;
- },
-
- hasClass : function(n, c, d) {
- return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);
- },
-
- getNum : function(n, c) {
- c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];
- c = c.replace(/[^0-9]/g, '');
-
- return c;
- },
-
- addClass : function(n, c, b) {
- var o = this.removeClass(n, c);
- n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;
- },
-
- removeClass : function(n, c) {
- c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');
- return n.className = c != ' ' ? c : '';
- },
-
- tags : function(f, s) {
- return f.getElementsByTagName(s);
- },
-
- mark : function(f, n) {
- var s = this.settings;
-
- this.addClass(n, s.invalid_cls);
- n.setAttribute('aria-invalid', 'true');
- this.markLabels(f, n, s.invalid_cls);
-
- return false;
- },
-
- markLabels : function(f, n, ic) {
- var nl, i;
-
- nl = this.tags(f, "label");
- for (i=0; i 1) {
+ domGlobals.console.error('HTML does not have a single root node', html);
+ throw new Error('HTML must have a single root node');
+ }
+ return fromDom(div.childNodes[0]);
+ };
+ var fromTag = function (tag, scope) {
+ var doc = scope || domGlobals.document;
+ var node = doc.createElement(tag);
+ return fromDom(node);
+ };
+ var fromText = function (text, scope) {
+ var doc = scope || domGlobals.document;
+ var node = doc.createTextNode(text);
+ return fromDom(node);
+ };
+ var fromDom = function (node) {
+ if (node === null || node === undefined) {
+ throw new Error('Node cannot be null or undefined');
+ }
+ return { dom: constant(node) };
+ };
+ var fromPoint = function (docElm, x, y) {
+ var doc = docElm.dom();
+ return Option.from(doc.elementFromPoint(x, y)).map(fromDom);
+ };
+ var Element = {
+ fromHtml: fromHtml,
+ fromTag: fromTag,
+ fromText: fromText,
+ fromDom: fromDom,
+ fromPoint: fromPoint
+ };
+
+ var typeOf = function (x) {
+ if (x === null) {
+ return 'null';
+ }
+ var t = typeof x;
+ if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
+ return 'array';
+ }
+ if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
+ return 'string';
+ }
+ return t;
+ };
+ var isType = function (type) {
+ return function (value) {
+ return typeOf(value) === type;
+ };
+ };
+ var isFunction = isType('function');
+
+ var nativeSlice = Array.prototype.slice;
+ var from$1 = isFunction(Array.from) ? Array.from : function (x) {
+ return nativeSlice.call(x);
+ };
+
+ var isSupported = function (dom) {
+ return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
+ };
+
+ var ATTRIBUTE = domGlobals.Node.ATTRIBUTE_NODE;
+ var CDATA_SECTION = domGlobals.Node.CDATA_SECTION_NODE;
+ var COMMENT = domGlobals.Node.COMMENT_NODE;
+ var DOCUMENT = domGlobals.Node.DOCUMENT_NODE;
+ var DOCUMENT_TYPE = domGlobals.Node.DOCUMENT_TYPE_NODE;
+ var DOCUMENT_FRAGMENT = domGlobals.Node.DOCUMENT_FRAGMENT_NODE;
+ var ELEMENT = domGlobals.Node.ELEMENT_NODE;
+ var TEXT = domGlobals.Node.TEXT_NODE;
+ var PROCESSING_INSTRUCTION = domGlobals.Node.PROCESSING_INSTRUCTION_NODE;
+ var ENTITY_REFERENCE = domGlobals.Node.ENTITY_REFERENCE_NODE;
+ var ENTITY = domGlobals.Node.ENTITY_NODE;
+ var NOTATION = domGlobals.Node.NOTATION_NODE;
+
+ var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
+
+ var type = function (element) {
+ return element.dom().nodeType;
+ };
+ var isType$1 = function (t) {
+ return function (element) {
+ return type(element) === t;
+ };
+ };
+ var isText = isType$1(TEXT);
+
+ var inBody = function (element) {
+ var dom = isText(element) ? element.dom().parentNode : element.dom();
+ return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);
+ };
+
+ var get = function (element, property) {
+ var dom = element.dom();
+ var styles = domGlobals.window.getComputedStyle(dom);
+ var r = styles.getPropertyValue(property);
+ var v = r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
+ return v === null ? undefined : v;
+ };
+ var getUnsafeProperty = function (dom, property) {
+ return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
+ };
+
+ var getDirection = function (element) {
+ return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
+ };
+
+ var getNodeChangeHandler = function (editor, dir) {
+ return function (api) {
+ var nodeChangeHandler = function (e) {
+ var element = Element.fromDom(e.element);
+ api.setActive(getDirection(element) === dir);
+ };
+ editor.on('NodeChange', nodeChangeHandler);
+ return function () {
+ return editor.off('NodeChange', nodeChangeHandler);
+ };
+ };
+ };
+ var register$1 = function (editor) {
+ editor.ui.registry.addToggleButton('ltr', {
+ tooltip: 'Left to right',
+ icon: 'ltr',
+ onAction: function () {
+ return editor.execCommand('mceDirectionLTR');
+ },
+ onSetup: getNodeChangeHandler(editor, 'ltr')
+ });
+ editor.ui.registry.addToggleButton('rtl', {
+ tooltip: 'Right to left',
+ icon: 'rtl',
+ onAction: function () {
+ return editor.execCommand('mceDirectionRTL');
+ },
+ onSetup: getNodeChangeHandler(editor, 'rtl')
+ });
+ };
+ var Buttons = { register: register$1 };
+
+ function Plugin () {
+ global.add('directionality', function (editor) {
+ Commands.register(editor);
+ Buttons.register(editor);
+ });
+ }
+
+ Plugin();
-/*global tinymce:true */
-
-tinymce.PluginManager.add('directionality', function(editor) {
- function setDir(dir) {
- var dom = editor.dom, curDir, blocks = editor.selection.getSelectedBlocks();
-
- if (blocks.length) {
- curDir = dom.getAttrib(blocks[0], "dir");
-
- tinymce.each(blocks, function(block) {
- // Add dir to block if the parent block doesn't already have that dir
- if (!dom.getParent(block.parentNode, "*[dir='" + dir + "']", dom.getRoot())) {
- if (curDir != dir) {
- dom.setAttrib(block, "dir", dir);
- } else {
- dom.setAttrib(block, "dir", null);
- }
- }
- });
-
- editor.nodeChanged();
- }
- }
-
- function generateSelector(dir) {
- var selector = [];
-
- tinymce.each('h1 h2 h3 h4 h5 h6 div p'.split(' '), function(name) {
- selector.push(name + '[dir=' + dir + ']');
- });
-
- return selector.join(',');
- }
-
- editor.addCommand('mceDirectionLTR', function() {
- setDir("ltr");
- });
-
- editor.addCommand('mceDirectionRTL', function() {
- setDir("rtl");
- });
-
- editor.addButton('ltr', {
- title: 'Left to right',
- cmd: 'mceDirectionLTR',
- stateSelector: generateSelector('ltr')
- });
-
- editor.addButton('rtl', {
- title: 'Right to left',
- cmd: 'mceDirectionRTL',
- stateSelector: generateSelector('rtl')
- });
-});
\ No newline at end of file
+}(window));
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/directionality/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/directionality/plugin.min.js
index 2994eb6..08f0a6a 100644
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/directionality/plugin.min.js
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/directionality/plugin.min.js
@@ -1 +1,9 @@
-tinymce.PluginManager.add("directionality",function(t){function e(e){var i,n=t.dom,r=t.selection.getSelectedBlocks();r.length&&(i=n.getAttrib(r[0],"dir"),tinymce.each(r,function(t){n.getParent(t.parentNode,"*[dir='"+e+"']",n.getRoot())||(i!=e?n.setAttrib(t,"dir",e):n.setAttrib(t,"dir",null))}),t.nodeChanged())}function i(t){var e=[];return tinymce.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(i){e.push(i+"[dir="+t+"]")}),e.join(",")}t.addCommand("mceDirectionLTR",function(){e("ltr")}),t.addCommand("mceDirectionRTL",function(){e("rtl")}),t.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:i("ltr")}),t.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:i("rtl")})});
\ No newline at end of file
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.2.1 (2020-03-25)
+ */
+!function(i){"use strict";function n(){}function u(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=tinymce.util.Tools.resolve("tinymce.util.Tools"),o=function(n,t){var e,r=n.dom,o=n.selection.getSelectedBlocks();o.length&&(e=r.getAttrib(o[0],"dir"),c.each(o,function(n){r.getParent(n.parentNode,'*[dir="'+t+'"]',r.getRoot())||r.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},d=function(n){n.addCommand("mceDirectionLTR",function(){o(n,"ltr")}),n.addCommand("mceDirectionRTL",function(){o(n,"rtl")})},f=u(!1),l=u(!0),a=(e={fold:function(n,t){return n()},is:f,isSome:f,isNone:l,getOr:s,getOrThunk:N,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:s,orThunk:N,map:t,each:n,bind:t,exists:f,forall:l,filter:t,equals:m,equals_:m,toArray:function(){return[]},toString:u("none()")},Object.freeze&&Object.freeze(e),e);function m(n){return n.isNone()}function N(n){return n()}function s(n){return n}function g(n,t){var e=n.dom(),r=i.window.getComputedStyle(e).getPropertyValue(t),o=""!==r||function(n){var t=A(n)?n.dom().parentNode:n.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}(n)?r:w(e,t);return null===o?undefined:o}function T(t,r){return function(e){function n(n){var t=p.fromDom(n.element);e.setActive(function(n){return"rtl"===g(n,"direction")?"rtl":"ltr"}(t)===r)}return t.on("NodeChange",n),function(){return t.off("NodeChange",n)}}}var E,O,y=function(e){function n(){return o}function t(n){return n(e)}var r=u(e),o={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:l,isNone:f,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:n,orThunk:n,map:function(n){return y(n(e))},each:function(n){n(e)},bind:t,exists:t,forall:t,filter:function(n){return n(e)?o:a},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return o},D=function(n){return null===n||n===undefined?a:y(n)},h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:u(n)}},p={fromHtml:function(n,t){var e=(t||i.document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1= max;
+ };
+ });
+ for (var i = 0; i < list.length; i++) {
+ if (pattern.length === 0 || emojiMatches(list[i], lowerCasePattern)) {
+ matches.push({
+ value: list[i].char,
+ text: list[i].title,
+ icon: list[i].char
+ });
+ if (reachedLimit(matches.length)) {
+ break;
+ }
+ }
+ }
+ return matches;
+ };
+
+ var init = function (editor, database) {
+ editor.ui.registry.addAutocompleter('emoticons', {
+ ch: ':',
+ columns: 'auto',
+ minChars: 2,
+ fetch: function (pattern, maxResults) {
+ return database.waitForLoad().then(function () {
+ var candidates = database.listAll();
+ return emojisFrom(candidates, pattern, Option.some(maxResults));
+ });
+ },
+ onAction: function (autocompleteApi, rng, value) {
+ editor.selection.setRng(rng);
+ editor.insertContent(value);
+ autocompleteApi.hide();
+ }
+ });
+ };
+
+ var Cell = function (initial) {
+ var value = initial;
+ var get = function () {
+ return value;
+ };
+ var set = function (v) {
+ value = v;
+ };
+ var clone = function () {
+ return Cell(get());
+ };
+ return {
+ get: get,
+ set: set,
+ clone: clone
+ };
+ };
+
+ var last = function (fn, rate) {
+ var timer = null;
+ var cancel = function () {
+ if (timer !== null) {
+ domGlobals.clearTimeout(timer);
+ timer = null;
+ }
+ };
+ var throttle = function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ if (timer !== null) {
+ domGlobals.clearTimeout(timer);
+ }
+ timer = domGlobals.setTimeout(function () {
+ fn.apply(null, args);
+ timer = null;
+ }, rate);
+ };
+ return {
+ cancel: cancel,
+ throttle: throttle
+ };
+ };
+
+ var insertEmoticon = function (editor, ch) {
+ editor.insertContent(ch);
+ };
+
+ var __assign = function () {
+ __assign = Object.assign || function __assign(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s)
+ if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+ };
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var shallow = function (old, nu) {
+ return nu;
+ };
+ var baseMerge = function (merger) {
+ return function () {
+ var objects = new Array(arguments.length);
+ for (var i = 0; i < objects.length; i++) {
+ objects[i] = arguments[i];
+ }
+ if (objects.length === 0) {
+ throw new Error('Can\'t merge zero objects');
+ }
+ var ret = {};
+ for (var j = 0; j < objects.length; j++) {
+ var curObject = objects[j];
+ for (var key in curObject) {
+ if (hasOwnProperty.call(curObject, key)) {
+ ret[key] = merger(ret[key], curObject[key]);
+ }
+ }
+ }
+ return ret;
+ };
+ };
+ var merge = baseMerge(shallow);
+
+ var keys = Object.keys;
+ var hasOwnProperty$1 = Object.hasOwnProperty;
+ var each = function (obj, f) {
+ var props = keys(obj);
+ for (var k = 0, len = props.length; k < len; k++) {
+ var i = props[k];
+ var x = obj[i];
+ f(x, i);
+ }
+ };
+ var map$1 = function (obj, f) {
+ return tupleMap(obj, function (x, i) {
+ return {
+ k: i,
+ v: f(x, i)
+ };
+ });
+ };
+ var tupleMap = function (obj, f) {
+ var r = {};
+ each(obj, function (x, i) {
+ var tuple = f(x, i);
+ r[tuple.k] = tuple.v;
+ });
+ return r;
+ };
+ var has = function (obj, key) {
+ return hasOwnProperty$1.call(obj, key);
+ };
+
+ var global$1 = tinymce.util.Tools.resolve('tinymce.Resource');
+
+ var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');
+
+ var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise');
+
+ var DEFAULT_ID = 'tinymce.plugins.emoticons';
+ var getEmoticonDatabaseUrl = function (editor, pluginUrl) {
+ return editor.getParam('emoticons_database_url', pluginUrl + '/js/emojis' + editor.suffix + '.js');
+ };
+ var getEmoticonDatabaseId = function (editor) {
+ return editor.getParam('emoticons_database_id', DEFAULT_ID, 'string');
+ };
+ var getAppendedEmoticons = function (editor) {
+ return editor.getParam('emoticons_append', {}, 'object');
+ };
+ var Settings = {
+ getEmoticonDatabaseUrl: getEmoticonDatabaseUrl,
+ getEmoticonDatabaseId: getEmoticonDatabaseId,
+ getAppendedEmoticons: getAppendedEmoticons
+ };
+
+ var ALL_CATEGORY = 'All';
+ var categoryNameMap = {
+ symbols: 'Symbols',
+ people: 'People',
+ animals_and_nature: 'Animals and Nature',
+ food_and_drink: 'Food and Drink',
+ activity: 'Activity',
+ travel_and_places: 'Travel and Places',
+ objects: 'Objects',
+ flags: 'Flags',
+ user: 'User Defined'
+ };
+ var translateCategory = function (categories, name) {
+ return has(categories, name) ? categories[name] : name;
+ };
+ var getUserDefinedEmoticons = function (editor) {
+ var userDefinedEmoticons = Settings.getAppendedEmoticons(editor);
+ return map$1(userDefinedEmoticons, function (value) {
+ return __assign({
+ keywords: [],
+ category: 'user'
+ }, value);
+ });
+ };
+ var initDatabase = function (editor, databaseUrl, databaseId) {
+ var categories = Cell(Option.none());
+ var all = Cell(Option.none());
+ var processEmojis = function (emojis) {
+ var cats = {};
+ var everything = [];
+ each(emojis, function (lib, title) {
+ var entry = {
+ title: title,
+ keywords: lib.keywords,
+ char: lib.char,
+ category: translateCategory(categoryNameMap, lib.category)
+ };
+ var current = cats[entry.category] !== undefined ? cats[entry.category] : [];
+ cats[entry.category] = current.concat([entry]);
+ everything.push(entry);
+ });
+ categories.set(Option.some(cats));
+ all.set(Option.some(everything));
+ };
+ editor.on('init', function () {
+ global$1.load(databaseId, databaseUrl).then(function (emojis) {
+ var userEmojis = getUserDefinedEmoticons(editor);
+ processEmojis(merge(emojis, userEmojis));
+ }, function (err) {
+ domGlobals.console.log('Failed to load emoticons: ' + err);
+ categories.set(Option.some({}));
+ all.set(Option.some([]));
+ });
+ });
+ var listCategory = function (category) {
+ if (category === ALL_CATEGORY) {
+ return listAll();
+ }
+ return categories.get().bind(function (cats) {
+ return Option.from(cats[category]);
+ }).getOr([]);
+ };
+ var listAll = function () {
+ return all.get().getOr([]);
+ };
+ var listCategories = function () {
+ return [ALL_CATEGORY].concat(keys(categories.get().getOr({})));
+ };
+ var waitForLoad = function () {
+ if (hasLoaded()) {
+ return global$3.resolve(true);
+ } else {
+ return new global$3(function (resolve, reject) {
+ var numRetries = 15;
+ var interval = global$2.setInterval(function () {
+ if (hasLoaded()) {
+ global$2.clearInterval(interval);
+ resolve(true);
+ } else {
+ numRetries--;
+ if (numRetries < 0) {
+ domGlobals.console.log('Could not load emojis from url: ' + databaseUrl);
+ global$2.clearInterval(interval);
+ reject(false);
+ }
+ }
+ }, 100);
+ });
+ }
+ };
+ var hasLoaded = function () {
+ return categories.get().isSome() && all.get().isSome();
+ };
+ return {
+ listCategories: listCategories,
+ hasLoaded: hasLoaded,
+ waitForLoad: waitForLoad,
+ listAll: listAll,
+ listCategory: listCategory
+ };
+ };
+
+ var patternName = 'pattern';
+ var open = function (editor, database) {
+ var initialState = {
+ pattern: '',
+ results: emojisFrom(database.listAll(), '', Option.some(300))
+ };
+ var currentTab = Cell(ALL_CATEGORY);
+ var scan = function (dialogApi) {
+ var dialogData = dialogApi.getData();
+ var category = currentTab.get();
+ var candidates = database.listCategory(category);
+ var results = emojisFrom(candidates, dialogData[patternName], category === ALL_CATEGORY ? Option.some(300) : Option.none());
+ dialogApi.setData({ results: results });
+ };
+ var updateFilter = last(function (dialogApi) {
+ scan(dialogApi);
+ }, 200);
+ var searchField = {
+ label: 'Search',
+ type: 'input',
+ name: patternName
+ };
+ var resultsField = {
+ type: 'collection',
+ name: 'results'
+ };
+ var getInitialState = function () {
+ var body = {
+ type: 'tabpanel',
+ tabs: map(database.listCategories(), function (cat) {
+ return {
+ title: cat,
+ name: cat,
+ items: [
+ searchField,
+ resultsField
+ ]
+ };
+ })
+ };
+ return {
+ title: 'Emoticons',
+ size: 'normal',
+ body: body,
+ initialData: initialState,
+ onTabChange: function (dialogApi, details) {
+ currentTab.set(details.newTabName);
+ updateFilter.throttle(dialogApi);
+ },
+ onChange: updateFilter.throttle,
+ onAction: function (dialogApi, actionData) {
+ if (actionData.name === 'results') {
+ insertEmoticon(editor, actionData.value);
+ dialogApi.close();
+ }
+ },
+ buttons: [{
+ type: 'cancel',
+ text: 'Close',
+ primary: true
+ }]
+ };
+ };
+ var dialogApi = editor.windowManager.open(getInitialState());
+ dialogApi.focus(patternName);
+ if (!database.hasLoaded()) {
+ dialogApi.block('Loading emoticons...');
+ database.waitForLoad().then(function () {
+ dialogApi.redial(getInitialState());
+ updateFilter.throttle(dialogApi);
+ dialogApi.focus(patternName);
+ dialogApi.unblock();
+ }).catch(function (err) {
+ dialogApi.redial({
+ title: 'Emoticons',
+ body: {
+ type: 'panel',
+ items: [{
+ type: 'alertbanner',
+ level: 'error',
+ icon: 'warning',
+ text: 'Could not load emoticons
'
+ }]
+ },
+ buttons: [{
+ type: 'cancel',
+ text: 'Close',
+ primary: true
+ }],
+ initialData: {
+ pattern: '',
+ results: []
+ }
+ });
+ dialogApi.focus(patternName);
+ dialogApi.unblock();
+ });
+ }
+ };
+ var Dialog = { open: open };
+
+ var register = function (editor, database) {
+ var onAction = function () {
+ return Dialog.open(editor, database);
+ };
+ editor.ui.registry.addButton('emoticons', {
+ tooltip: 'Emoticons',
+ icon: 'emoji',
+ onAction: onAction
+ });
+ editor.ui.registry.addMenuItem('emoticons', {
+ text: 'Emoticons...',
+ icon: 'emoji',
+ onAction: onAction
+ });
+ };
+ var Buttons = { register: register };
+
+ function Plugin () {
+ global.add('emoticons', function (editor, pluginUrl) {
+ var databaseUrl = Settings.getEmoticonDatabaseUrl(editor, pluginUrl);
+ var databaseId = Settings.getEmoticonDatabaseId(editor);
+ var database = initDatabase(editor, databaseUrl, databaseId);
+ Buttons.register(editor, database);
+ init(editor, database);
+ });
+ }
+
+ Plugin();
-/*global tinymce:true */
-
-tinymce.PluginManager.add('emoticons', function(editor, url) {
- var emoticons = [
- ["cool", "cry", "embarassed", "foot-in-mouth"],
- ["frown", "innocent", "kiss", "laughing"],
- ["money-mouth", "sealed", "smile", "surprised"],
- ["tongue-out", "undecided", "wink", "yell"]
- ];
-
- function getHtml() {
- var emoticonsHtml;
-
- emoticonsHtml = '';
-
- tinymce.each(emoticons, function(row) {
- emoticonsHtml += '';
-
- tinymce.each(row, function(icon) {
- var emoticonUrl = url + '/img/smiley-' + icon + '.gif';
-
- emoticonsHtml += ' ';
- });
-
- emoticonsHtml += ' ';
- });
-
- emoticonsHtml += '
';
-
- return emoticonsHtml;
- }
-
- editor.addButton('emoticons', {
- type: 'panelbutton',
- panel: {
- role: 'application',
- autohide: true,
- html: getHtml,
- onclick: function(e) {
- var linkElm = editor.dom.getParent(e.target, 'a');
-
- if (linkElm) {
- editor.insertContent(
- ' '
- );
-
- this.hide();
- }
- }
- },
- tooltip: 'Emoticons'
- });
-});
+}(window));
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/emoticons/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/emoticons/plugin.min.js
index 737083f..5b94cac 100644
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/emoticons/plugin.min.js
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/emoticons/plugin.min.js
@@ -1 +1,9 @@
-tinymce.PluginManager.add("emoticons",function(t,e){function a(){var t;return t='',tinymce.each(i,function(a){t+="",tinymce.each(a,function(a){var i=e+"/img/smiley-"+a+".gif";t+=' '}),t+=" "}),t+="
"}var i=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];t.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:a,onclick:function(e){var a=t.dom.getParent(e.target,"a");a&&(t.insertContent(' '),this.hide())}},tooltip:"Emoticons"})});
\ No newline at end of file
+/**
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
+ *
+ * Version: 5.2.1 (2020-03-25)
+ */
+!function(l){"use strict";function n(){}function i(n){return function(){return n}}function t(){return a}var e,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=i(!1),u=i(!0),a=(e={fold:function(n,t){return n()},is:c,isSome:c,isNone:u,getOr:f,getOrThunk:s,getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:f,orThunk:s,map:t,each:n,bind:t,exists:c,forall:u,filter:t,equals:o,equals_:o,toArray:function(){return[]},toString:i("none()")},Object.freeze&&Object.freeze(e),e);function o(n){return n.isNone()}function s(n){return n()}function f(n){return n}function m(n,t){return-1!==n.indexOf(t)}function g(n,t){return m(n.title.toLowerCase(),t)||function(n,t){for(var e=0,r=n.length;eCould not load emoticons
"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),a.focus(U),a.unblock()}))},B=function(n,t){function e(){return R(n,t)}n.ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:e}),n.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:e})};!function G(){r.add("emoticons",function(n,t){var e=F(n,t),r=q(n),o=h(n,e,r);B(n,o),function(r,o){r.ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return o.waitForLoad().then(function(){var n=o.listAll();return d(n,t,A.some(e))})},onAction:function(n,t,e){r.selection.setRng(t),r.insertContent(e),n.hide()}})}(n,o)})}()}(window);
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/dialog.html b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/dialog.html
deleted file mode 100644
index 565f06f..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/dialog.html
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- Custom dialog
- Input some text:
- Close window
-
-
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.js
deleted file mode 100644
index b3497cc..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * plugin.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-/*jshint unused:false */
-/*global tinymce:true */
-
-/**
- * Example plugin that adds a toolbar button and menu item.
- */
-tinymce.PluginManager.add('example', function(editor, url) {
- // Add a button that opens a window
- editor.addButton('example', {
- text: 'My button',
- icon: false,
- onclick: function() {
- // Open window
- editor.windowManager.open({
- title: 'Example plugin',
- body: [
- {type: 'textbox', name: 'title', label: 'Title'}
- ],
- onsubmit: function(e) {
- // Insert content when the window form is submitted
- editor.insertContent('Title: ' + e.data.title);
- }
- });
- }
- });
-
- // Adds a menu item to the tools menu
- editor.addMenuItem('example', {
- text: 'Example plugin',
- context: 'tools',
- onclick: function() {
- // Open window with a specific url
- editor.windowManager.open({
- title: 'TinyMCE site',
- url: url + '/dialog.html',
- width: 600,
- height: 400,
- buttons: [
- {
- text: 'Insert',
- onclick: function() {
- // Top most window object
- var win = editor.windowManager.getWindows()[0];
-
- // Insert the contents of the dialog.html textarea into the editor
- editor.insertContent(win.getContentWindow().document.getElementById('content').value);
-
- // Close the window
- win.close();
- }
- },
-
- {text: 'Close', onclick: 'close'}
- ]
- });
- }
- });
-});
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.min.js
deleted file mode 100644
index 00a262e..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example/plugin.min.js
+++ /dev/null
@@ -1 +0,0 @@
-tinymce.PluginManager.add("example",function(t,e){t.addButton("example",{text:"My button",icon:!1,onclick:function(){t.windowManager.open({title:"Example plugin",body:[{type:"textbox",name:"title",label:"Title"}],onsubmit:function(e){t.insertContent("Title: "+e.data.title)}})}}),t.addMenuItem("example",{text:"Example plugin",context:"tools",onclick:function(){t.windowManager.open({title:"TinyMCE site",url:e+"/dialog.html",width:600,height:400,buttons:[{text:"Insert",onclick:function(){var e=t.windowManager.getWindows()[0];t.insertContent(e.getContentWindow().document.getElementById("content").value),e.close()}},{text:"Close",onclick:"close"}]})}})});
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.js
deleted file mode 100644
index 0e08a84..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * plugin.js
- *
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
- */
-
-/*jshint unused:false */
-/*global tinymce:true */
-
-/**
- * Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list,
- * with the list loaded in order. plugins in this list will be initialised when this plugin is initialized. (before the
- * init method is called). plugins in a depends list should typically be specified using the short name). If necessary
- * this can be done with an object which has the url to the plugin and the shortname.
- */
-tinymce.PluginManager.add('example_dependency', function() {
- // Example logic here
-}, ['example']);
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.min.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.min.js
deleted file mode 100644
index e61bf47..0000000
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/example_dependency/plugin.min.js
+++ /dev/null
@@ -1 +0,0 @@
-tinymce.PluginManager.add("example_dependency",function(){},["example"]);
\ No newline at end of file
diff --git a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/fullpage/plugin.js b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/fullpage/plugin.js
index 4b071d4..5f6463b 100644
--- a/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/fullpage/plugin.js
+++ b/src/RemoteLab/RemoteLab/Scripts/tinymce/plugins/fullpage/plugin.js
@@ -1,485 +1,568 @@
/**
- * plugin.js
+ * Copyright (c) Tiny Technologies, Inc. All rights reserved.
+ * Licensed under the LGPL or a commercial license.
+ * For LGPL see License.txt in the project root for license information.
+ * For commercial licenses see https://www.tiny.cloud/
*
- * Copyright, Moxiecode Systems AB
- * Released under LGPL License.
- *
- * License: http://www.tinymce.com/license
- * Contributing: http://www.tinymce.com/contributing
+ * Version: 5.2.1 (2020-03-25)
*/
-
-/*global tinymce:true */
-
-tinymce.PluginManager.add('fullpage', function(editor) {
- var each = tinymce.each, Node = tinymce.html.Node;
- var head, foot;
-
- function showDialog() {
- var data = htmlToData();
-
- editor.windowManager.open({
- title: 'Document properties',
- data: data,
- defaults: {type: 'textbox', size: 40},
- body: [
- {name: 'title', label: 'Title'},
- {name: 'keywords', label: 'Keywords'},
- {name: 'description', label: 'Description'},
- {name: 'robots', label: 'Robots'},
- {name: 'author', label: 'Author'},
- {name: 'docencoding', label: 'Encoding'}
- ],
- onSubmit: function(e) {
- dataToHtml(tinymce.extend(data, e.data));
- }
- });
- }
-
- function htmlToData() {
- var headerFragment = parseHeader(), data = {}, elm, matches;
-
- function getAttr(elm, name) {
- var value = elm.attr(name);
-
- return value || '';
- }
-
- // Default some values
- data.fontface = editor.getParam("fullpage_default_fontface", "");
- data.fontsize = editor.getParam("fullpage_default_fontsize", "");
-
- // Parse XML PI
- elm = headerFragment.firstChild;
- if (elm.type == 7) {
- data.xml_pi = true;
- matches = /encoding="([^"]+)"/.exec(elm.value);
- if (matches) {
- data.docencoding = matches[1];
- }
- }
-
- // Parse doctype
- elm = headerFragment.getAll('#doctype')[0];
- if (elm) {
- data.doctype = '";
- }
-
- // Parse title element
- elm = headerFragment.getAll('title')[0];
- if (elm && elm.firstChild) {
- data.title = elm.firstChild.value;
- }
-
- // Parse meta elements
- each(headerFragment.getAll('meta'), function(meta) {
- var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches;
-
- if (name) {
- data[name.toLowerCase()] = meta.attr('content');
- } else if (httpEquiv == "Content-Type") {
- matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content'));
-
- if (matches) {
- data.docencoding = matches[1];
- }
- }
- });
-
- // Parse html attribs
- elm = headerFragment.getAll('html')[0];
- if (elm) {
- data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang');
- }
-
- // Parse stylesheets
- data.stylesheets = [];
- tinymce.each(headerFragment.getAll('link'), function(link) {
- if (link.attr('rel') == 'stylesheet') {
- data.stylesheets.push(link.attr('href'));
- }
- });
-
- // Parse body parts
- elm = headerFragment.getAll('body')[0];
- if (elm) {
- data.langdir = getAttr(elm, 'dir');
- data.style = getAttr(elm, 'style');
- data.visited_color = getAttr(elm, 'vlink');
- data.link_color = getAttr(elm, 'link');
- data.active_color = getAttr(elm, 'alink');
- }
-
- return data;
- }
-
- function dataToHtml(data) {
- var headerFragment, headElement, html, elm, value, dom = editor.dom;
-
- function setAttr(elm, name, value) {
- elm.attr(name, value ? value : undefined);
- }
-
- function addHeadNode(node) {
- if (headElement.firstChild) {
- headElement.insert(node, headElement.firstChild);
- } else {
- headElement.append(node);
- }
- }
-
- headerFragment = parseHeader();
- headElement = headerFragment.getAll('head')[0];
- if (!headElement) {
- elm = headerFragment.getAll('html')[0];
- headElement = new Node('head', 1);
-
- if (elm.firstChild) {
- elm.insert(headElement, elm.firstChild, true);
- } else {
- elm.append(headElement);
- }
- }
-
- // Add/update/remove XML-PI
- elm = headerFragment.firstChild;
- if (data.xml_pi) {
- value = 'version="1.0"';
-
- if (data.docencoding) {
- value += ' encoding="' + data.docencoding + '"';
- }
-
- if (elm.type != 7) {
- elm = new Node('xml', 7);
- headerFragment.insert(elm, headerFragment.firstChild, true);
- }
-
- elm.value = value;
- } else if (elm && elm.type == 7) {
- elm.remove();
- }
-
- // Add/update/remove doctype
- elm = headerFragment.getAll('#doctype')[0];
- if (data.doctype) {
- if (!elm) {
- elm = new Node('#doctype', 10);
-
- if (data.xml_pi) {
- headerFragment.insert(elm, headerFragment.firstChild);
- } else {
- addHeadNode(elm);
- }
- }
-
- elm.value = data.doctype.substring(9, data.doctype.length - 1);
- } else if (elm) {
- elm.remove();
- }
-
- // Add meta encoding
- elm = null;
- each(headerFragment.getAll('meta'), function(meta) {
- if (meta.attr('http-equiv') == 'Content-Type') {
- elm = meta;
- }
- });
-
- if (data.docencoding) {
- if (!elm) {
- elm = new Node('meta', 1);
- elm.attr('http-equiv', 'Content-Type');
- elm.shortEnded = true;
- addHeadNode(elm);
- }
-
- elm.attr('content', 'text/html; charset=' + data.docencoding);
- } else {
- elm.remove();
- }
-
- // Add/update/remove title
- elm = headerFragment.getAll('title')[0];
- if (data.title) {
- if (!elm) {
- elm = new Node('title', 1);
- addHeadNode(elm);
- } else {
- elm.empty();
- }
-
- elm.append(new Node('#text', 3)).value = data.title;
- } else if (elm) {
- elm.remove();
- }
-
- // Add/update/remove meta
- each('keywords,description,author,copyright,robots'.split(','), function(name) {
- var nodes = headerFragment.getAll('meta'), i, meta, value = data[name];
-
- for (i = 0; i < nodes.length; i++) {
- meta = nodes[i];
-
- if (meta.attr('name') == name) {
- if (value) {
- meta.attr('content', value);
- } else {
- meta.remove();
- }
-
- return;
- }
- }
-
- if (value) {
- elm = new Node('meta', 1);
- elm.attr('name', name);
- elm.attr('content', value);
- elm.shortEnded = true;
-
- addHeadNode(elm);
- }
- });
-
- var currentStyleSheetsMap = {};
- tinymce.each(headerFragment.getAll('link'), function(stylesheet) {
- if (stylesheet.attr('rel') == 'stylesheet') {
- currentStyleSheetsMap[stylesheet.attr('href')] = stylesheet;
- }
- });
-
- // Add new
- tinymce.each(data.stylesheets, function(stylesheet) {
- if (!currentStyleSheetsMap[stylesheet]) {
- elm = new Node('link', 1);
- elm.attr({
- rel: 'stylesheet',
- text: 'text/css',
- href: stylesheet
- });
- elm.shortEnded = true;
- addHeadNode(elm);
- }
-
- delete currentStyleSheetsMap[stylesheet];
- });
-
- // Delete old
- tinymce.each(currentStyleSheetsMap, function(stylesheet) {
- stylesheet.remove();
- });
-
- // Update body attributes
- elm = headerFragment.getAll('body')[0];
- if (elm) {
- setAttr(elm, 'dir', data.langdir);
- setAttr(elm, 'style', data.style);
- setAttr(elm, 'vlink', data.visited_color);
- setAttr(elm, 'link', data.link_color);
- setAttr(elm, 'alink', data.active_color);
-
- // Update iframe body as well
- dom.setAttribs(editor.getBody(), {
- style : data.style,
- dir : data.dir,
- vLink : data.visited_color,
- link : data.link_color,
- aLink : data.active_color
- });
- }
-
- // Set html attributes
- elm = headerFragment.getAll('html')[0];
- if (elm) {
- setAttr(elm, 'lang', data.langcode);
- setAttr(elm, 'xml:lang', data.langcode);
- }
-
- // No need for a head element
- if (!headElement.firstChild) {
- headElement.remove();
- }
-
- // Serialize header fragment and crop away body part
- html = new tinymce.html.Serializer({
- validate: false,
- indent: true,
- apply_source_formatting : true,
- indent_before: 'head,html,body,meta,title,script,link,style',
- indent_after: 'head,html,body,meta,title,script,link,style'
- }).serialize(headerFragment);
-
- head = html.substring(0, html.indexOf('', startPos);
- head = low(content.substring(0, startPos + 1));
-
- endPos = content.indexOf('